diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..59a32306 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,169 @@ +version: 2.1 + +orbs: + ruby: circleci/ruby@2.1.1 + node: circleci/node@5.2.0 + docker: circleci/docker@2.5.0 + kubernetes: circleci/kubernetes@1.3.1 + browser-tools: circleci/browser-tools@1.4.8 + +workflows: + version: 2 + test_build_deploy: + jobs: + - test + - build: + requires: + - test + filters: + branches: + only: main + - deploy: + requires: + - test + - build + filters: + branches: + only: main + +jobs: + test: + docker: + - image: cimg/ruby:3.2.3-browsers + - image: cimg/postgres:13.7 + environment: + POSTGRES_USER: cpcwood-circleci + POSTGRES_PASSWORD: "test" + POSTGRES_DB: home_server_test + environment: + BUNDLE_JOBS: "3" + BUNDLE_RETRY: "3" + PGHOST: 127.0.0.1 + PGUSER: cpcwood-circleci + PGPASSWORD: "test" + DB_NAME_TEST: home_server_test + RAILS_ENV: test + steps: + - checkout + - browser-tools/install-browser-tools + - ruby/install-deps: + include-branch-in-cache-key: false + - node/install-packages: + pkg-manager: yarn + include-branch-in-cache-key: false + - run: + name: 'Wait for DB' + command: dockerize -wait tcp://localhost:5432 -timeout 1m + - run: + name: 'Database setup' + command: bundle exec rails db:schema:load --trace + - ruby/rspec-test + - run: + name: 'Rubocop linter' + command: bundle exec rubocop -a + - run: + name: 'JavaScript testing' + command: yarn test + - run: + name: 'JavaScript linting' + command: yarn lint + - run: + name: 'Automerge PR' + command: | + if [ -z "$CIRCLE_PULL_REQUEST" ]; then + echo 'Not in pull request, skipping automerge' + exit 0 + fi + if ./scripts/circle-ci/circle-ci-auto-merge ; then + echo 'Merge successful' + else + echo 'Merge failed' + exit 1 + fi + build: + docker: + - image: docker + steps: + - checkout + - setup_remote_docker: + version: 20.10.6 + - run: + name: 'Docker Login' + command: | + echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin >/dev/null 2>&1 + - run: + name: 'Pull previous images for cache' + command: | + docker pull "$DOCKER_USERNAME/home-server-base" || true + docker pull "$DOCKER_USERNAME/home-server-app" || true + docker pull "$DOCKER_USERNAME/home-server-worker-dependencies" || true + docker pull "$DOCKER_USERNAME/home-server-worker" || true + - run: + name: 'Build home-server-base image' + command: | + docker build \ + --cache-from "$DOCKER_USERNAME/home-server-base" \ + -t "$DOCKER_USERNAME/home-server-base:$(echo $CIRCLE_SHA1 | head -c8)" \ + -t $DOCKER_USERNAME/home-server-base:latest \ + --build-arg grecaptcha_site_key=$GRECAPTCHA_SITE_KEY \ + --build-arg MAX_MIND_LICENSE=$MAX_MIND_LICENSE \ + -f ./.docker/dockerfiles/base.Dockerfile \ + . + - run: + name: 'Build home-server-app image' + command: | + docker build \ + --cache-from "$DOCKER_USERNAME/home-server-app" \ + -t "$DOCKER_USERNAME/home-server-app:$(echo $CIRCLE_SHA1 | head -c8)" \ + -t $DOCKER_USERNAME/home-server-app:latest \ + -f ./.docker/dockerfiles/Dockerfile \ + . + - run: + name: 'Build home-server-worker-dependencies image' + command: | + docker build \ + --cache-from "$DOCKER_USERNAME/home-server-worker-dependencies" \ + -t "$DOCKER_USERNAME/home-server-worker-dependencies:$(echo $CIRCLE_SHA1 | head -c8)" \ + -t $DOCKER_USERNAME/home-server-worker-dependencies:latest \ + -f ./.docker/dockerfiles/worker-dependencies.Dockerfile \ + . + - run: + name: 'Build home-server-worker image' + command: | + docker build \ + --cache-from "$DOCKER_USERNAME/home-server-worker" \ + -t "$DOCKER_USERNAME/home-server-worker:$(echo $CIRCLE_SHA1 | head -c8)" \ + -t $DOCKER_USERNAME/home-server-worker:latest \ + -f ./.docker/dockerfiles/worker.Dockerfile \ + . + - run: + name: 'Publish images' + command: | + docker push --all-tags "$DOCKER_USERNAME/home-server-base" + docker push --all-tags "$DOCKER_USERNAME/home-server-app" + docker push --all-tags "$DOCKER_USERNAME/home-server-worker-dependencies" + docker push --all-tags "$DOCKER_USERNAME/home-server-worker" + deploy: + docker: + - image: cimg/base:stable + steps: + - checkout + - kubernetes/install-kubectl + - run: + name: 'Update config files in ./kube with current container version' + command: find ./.kube/ -type f | xargs sed -i "s/CONTAINER_VERSION/$(echo $CIRCLE_SHA1 | head -c8)/g" + - run: + name: 'Creating cluster certificate from ENV' + command: echo "$KUBERNETES_CLUSTER_CERTIFICATE" | base64 --decode > cert.crt + - run: + name: 'Apply Kubernetes config to server' + command: | + kubectl --kubeconfig=/dev/null \ + --certificate-authority=cert.crt \ + --server=$KUBERNETES_SERVER \ + --token=$KUBERNETES_SERVICE_ACC_TOKEN \ + apply -Rf ./.kube/app/ + - run: + name: 'Remove cluster certificate artifact' + command: rm -f cert.crt + when: always diff --git a/.docker/config/chrome.json b/.docker/config/chrome.json new file mode 100755 index 00000000..544f21c3 --- /dev/null +++ b/.docker/config/chrome.json @@ -0,0 +1,800 @@ +{ + "defaultAction": "SCMP_ACT_ERRNO", + "defaultErrnoRet": 1, + "archMap": [ + { + "architecture": "SCMP_ARCH_X86_64", + "subArchitectures": [ + "SCMP_ARCH_X86", + "SCMP_ARCH_X32" + ] + }, + { + "architecture": "SCMP_ARCH_AARCH64", + "subArchitectures": [ + "SCMP_ARCH_ARM" + ] + }, + { + "architecture": "SCMP_ARCH_MIPS64", + "subArchitectures": [ + "SCMP_ARCH_MIPS", + "SCMP_ARCH_MIPS64N32" + ] + }, + { + "architecture": "SCMP_ARCH_MIPS64N32", + "subArchitectures": [ + "SCMP_ARCH_MIPS", + "SCMP_ARCH_MIPS64" + ] + }, + { + "architecture": "SCMP_ARCH_MIPSEL64", + "subArchitectures": [ + "SCMP_ARCH_MIPSEL", + "SCMP_ARCH_MIPSEL64N32" + ] + }, + { + "architecture": "SCMP_ARCH_MIPSEL64N32", + "subArchitectures": [ + "SCMP_ARCH_MIPSEL", + "SCMP_ARCH_MIPSEL64" + ] + }, + { + "architecture": "SCMP_ARCH_S390X", + "subArchitectures": [ + "SCMP_ARCH_S390" + ] + }, + { + "architecture": "SCMP_ARCH_RISCV64", + "subArchitectures": null + } + ], + "syscalls": [ + { + "names": [ + "accept", + "accept4", + "access", + "adjtimex", + "alarm", + "bind", + "brk", + "capget", + "capset", + "chdir", + "chmod", + "chown", + "chown32", + "clock_adjtime", + "clock_adjtime64", + "clock_getres", + "clock_getres_time64", + "clock_gettime", + "clock_gettime64", + "clock_nanosleep", + "clock_nanosleep_time64", + "close", + "close_range", + "connect", + "copy_file_range", + "creat", + "dup", + "dup2", + "dup3", + "epoll_create", + "epoll_create1", + "epoll_ctl", + "epoll_ctl_old", + "epoll_pwait", + "epoll_pwait2", + "epoll_wait", + "epoll_wait_old", + "eventfd", + "eventfd2", + "execve", + "execveat", + "exit", + "exit_group", + "faccessat", + "faccessat2", + "fadvise64", + "fadvise64_64", + "fallocate", + "fanotify_mark", + "fchdir", + "fchmod", + "fchmodat", + "fchown", + "fchown32", + "fchownat", + "fcntl", + "fcntl64", + "fdatasync", + "fgetxattr", + "flistxattr", + "flock", + "fork", + "fremovexattr", + "fsetxattr", + "fstat", + "fstat64", + "fstatat64", + "fstatfs", + "fstatfs64", + "fsync", + "ftruncate", + "ftruncate64", + "futex", + "futex_time64", + "futex_waitv", + "futimesat", + "getcpu", + "getcwd", + "getdents", + "getdents64", + "getegid", + "getegid32", + "geteuid", + "geteuid32", + "getgid", + "getgid32", + "getgroups", + "getgroups32", + "getitimer", + "getpeername", + "getpgid", + "getpgrp", + "getpid", + "getppid", + "getpriority", + "getrandom", + "getresgid", + "getresgid32", + "getresuid", + "getresuid32", + "getrlimit", + "get_robust_list", + "getrusage", + "getsid", + "getsockname", + "getsockopt", + "get_thread_area", + "gettid", + "gettimeofday", + "getuid", + "getuid32", + "getxattr", + "inotify_add_watch", + "inotify_init", + "inotify_init1", + "inotify_rm_watch", + "io_cancel", + "ioctl", + "io_destroy", + "io_getevents", + "io_pgetevents", + "io_pgetevents_time64", + "ioprio_get", + "ioprio_set", + "io_setup", + "io_submit", + "io_uring_enter", + "io_uring_register", + "io_uring_setup", + "ipc", + "kill", + "landlock_add_rule", + "landlock_create_ruleset", + "landlock_restrict_self", + "lchown", + "lchown32", + "lgetxattr", + "link", + "linkat", + "listen", + "listxattr", + "llistxattr", + "_llseek", + "lremovexattr", + "lseek", + "lsetxattr", + "lstat", + "lstat64", + "madvise", + "membarrier", + "memfd_create", + "memfd_secret", + "mincore", + "mkdir", + "mkdirat", + "mknod", + "mknodat", + "mlock", + "mlock2", + "mlockall", + "mmap", + "mmap2", + "mprotect", + "mq_getsetattr", + "mq_notify", + "mq_open", + "mq_timedreceive", + "mq_timedreceive_time64", + "mq_timedsend", + "mq_timedsend_time64", + "mq_unlink", + "mremap", + "msgctl", + "msgget", + "msgrcv", + "msgsnd", + "msync", + "munlock", + "munlockall", + "munmap", + "nanosleep", + "newfstatat", + "_newselect", + "open", + "openat", + "openat2", + "pause", + "pidfd_open", + "pidfd_send_signal", + "pipe", + "pipe2", + "pkey_alloc", + "pkey_free", + "pkey_mprotect", + "poll", + "ppoll", + "ppoll_time64", + "prctl", + "pread64", + "preadv", + "preadv2", + "prlimit64", + "process_mrelease", + "pselect6", + "pselect6_time64", + "pwrite64", + "pwritev", + "pwritev2", + "read", + "readahead", + "readlink", + "readlinkat", + "readv", + "recv", + "recvfrom", + "recvmmsg", + "recvmmsg_time64", + "recvmsg", + "remap_file_pages", + "removexattr", + "rename", + "renameat", + "renameat2", + "restart_syscall", + "rmdir", + "rseq", + "rt_sigaction", + "rt_sigpending", + "rt_sigprocmask", + "rt_sigqueueinfo", + "rt_sigreturn", + "rt_sigsuspend", + "rt_sigtimedwait", + "rt_sigtimedwait_time64", + "rt_tgsigqueueinfo", + "sched_getaffinity", + "sched_getattr", + "sched_getparam", + "sched_get_priority_max", + "sched_get_priority_min", + "sched_getscheduler", + "sched_rr_get_interval", + "sched_rr_get_interval_time64", + "sched_setaffinity", + "sched_setattr", + "sched_setparam", + "sched_setscheduler", + "sched_yield", + "seccomp", + "select", + "semctl", + "semget", + "semop", + "semtimedop", + "semtimedop_time64", + "send", + "sendfile", + "sendfile64", + "sendmmsg", + "sendmsg", + "sendto", + "setfsgid", + "setfsgid32", + "setfsuid", + "setfsuid32", + "setgid", + "setgid32", + "setgroups", + "setgroups32", + "setitimer", + "setpgid", + "setpriority", + "setregid", + "setregid32", + "setresgid", + "setresgid32", + "setresuid", + "setresuid32", + "setreuid", + "setreuid32", + "setrlimit", + "set_robust_list", + "setsid", + "setsockopt", + "set_thread_area", + "set_tid_address", + "setuid", + "setuid32", + "setxattr", + "shmat", + "shmctl", + "shmdt", + "shmget", + "shutdown", + "sigaltstack", + "signalfd", + "signalfd4", + "sigprocmask", + "sigreturn", + "socket", + "socketcall", + "socketpair", + "splice", + "stat", + "stat64", + "statfs", + "statfs64", + "statx", + "symlink", + "symlinkat", + "sync", + "sync_file_range", + "syncfs", + "sysinfo", + "tee", + "tgkill", + "time", + "timer_create", + "timer_delete", + "timer_getoverrun", + "timer_gettime", + "timer_gettime64", + "timer_settime", + "timer_settime64", + "timerfd_create", + "timerfd_gettime", + "timerfd_gettime64", + "timerfd_settime", + "timerfd_settime64", + "times", + "tkill", + "truncate", + "truncate64", + "ugetrlimit", + "umask", + "uname", + "unlink", + "unlinkat", + "utime", + "utimensat", + "utimensat_time64", + "utimes", + "vfork", + "vmsplice", + "wait4", + "waitid", + "waitpid", + "write", + "writev", + "clone", + "unshare", + "arch_prctl", + "chroot", + "ptrace" + ], + "action": "SCMP_ACT_ALLOW" + }, + { + "names": [ + "process_vm_readv", + "process_vm_writev", + "ptrace" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "minKernel": "4.8" + } + }, + { + "names": [ + "personality" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 0, + "value": 0, + "op": "SCMP_CMP_EQ" + } + ] + }, + { + "names": [ + "personality" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 0, + "value": 8, + "op": "SCMP_CMP_EQ" + } + ] + }, + { + "names": [ + "personality" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 0, + "value": 131072, + "op": "SCMP_CMP_EQ" + } + ] + }, + { + "names": [ + "personality" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 0, + "value": 131080, + "op": "SCMP_CMP_EQ" + } + ] + }, + { + "names": [ + "personality" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 0, + "value": 4294967295, + "op": "SCMP_CMP_EQ" + } + ] + }, + { + "names": [ + "sync_file_range2", + "swapcontext" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "arches": [ + "ppc64le" + ] + } + }, + { + "names": [ + "arm_fadvise64_64", + "arm_sync_file_range", + "sync_file_range2", + "breakpoint", + "cacheflush", + "set_tls" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "arches": [ + "arm", + "arm64" + ] + } + }, + { + "names": [ + "arch_prctl" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "arches": [ + "amd64", + "x32" + ] + } + }, + { + "names": [ + "modify_ldt" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "arches": [ + "amd64", + "x32", + "x86" + ] + } + }, + { + "names": [ + "s390_pci_mmio_read", + "s390_pci_mmio_write", + "s390_runtime_instr" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "arches": [ + "s390", + "s390x" + ] + } + }, + { + "names": [ + "riscv_flush_icache" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "arches": [ + "riscv64" + ] + } + }, + { + "names": [ + "open_by_handle_at" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "caps": [ + "CAP_DAC_READ_SEARCH" + ] + } + }, + { + "names": [ + "bpf", + "clone", + "clone3", + "fanotify_init", + "fsconfig", + "fsmount", + "fsopen", + "fspick", + "lookup_dcookie", + "mount", + "mount_setattr", + "move_mount", + "name_to_handle_at", + "open_tree", + "perf_event_open", + "quotactl", + "quotactl_fd", + "setdomainname", + "sethostname", + "setns", + "syslog", + "umount", + "umount2", + "unshare" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "caps": [ + "CAP_SYS_ADMIN" + ] + } + }, + { + "names": [ + "clone" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 0, + "value": 2114060288, + "op": "SCMP_CMP_MASKED_EQ" + } + ], + "excludes": { + "caps": [ + "CAP_SYS_ADMIN" + ], + "arches": [ + "s390", + "s390x" + ] + } + }, + { + "names": [ + "clone" + ], + "action": "SCMP_ACT_ALLOW", + "args": [ + { + "index": 1, + "value": 2114060288, + "op": "SCMP_CMP_MASKED_EQ" + } + ], + "comment": "s390 parameter ordering for clone is different", + "includes": { + "arches": [ + "s390", + "s390x" + ] + }, + "excludes": { + "caps": [ + "CAP_SYS_ADMIN" + ] + } + }, + { + "names": [ + "clone3" + ], + "action": "SCMP_ACT_ERRNO", + "errnoRet": 38, + "excludes": { + "caps": [ + "CAP_SYS_ADMIN" + ] + } + }, + { + "names": [ + "reboot" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "caps": [ + "CAP_SYS_BOOT" + ] + } + }, + { + "names": [ + "chroot" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "caps": [ + "CAP_SYS_CHROOT" + ] + } + }, + { + "names": [ + "delete_module", + "init_module", + "finit_module" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "caps": [ + "CAP_SYS_MODULE" + ] + } + }, + { + "names": [ + "acct" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "caps": [ + "CAP_SYS_PACCT" + ] + } + }, + { + "names": [ + "kcmp", + "pidfd_getfd", + "process_madvise", + "process_vm_readv", + "process_vm_writev", + "ptrace" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "caps": [ + "CAP_SYS_PTRACE" + ] + } + }, + { + "names": [ + "iopl", + "ioperm" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "caps": [ + "CAP_SYS_RAWIO" + ] + } + }, + { + "names": [ + "settimeofday", + "stime", + "clock_settime", + "clock_settime64" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "caps": [ + "CAP_SYS_TIME" + ] + } + }, + { + "names": [ + "vhangup" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "caps": [ + "CAP_SYS_TTY_CONFIG" + ] + } + }, + { + "names": [ + "get_mempolicy", + "mbind", + "set_mempolicy" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "caps": [ + "CAP_SYS_NICE" + ] + } + }, + { + "names": [ + "syslog" + ], + "action": "SCMP_ACT_ALLOW", + "includes": { + "caps": [ + "CAP_SYSLOG" + ] + } + } + ] +} \ No newline at end of file diff --git a/.docker/docker-compose/dev.yml b/.docker/docker-compose/dev.yml new file mode 100644 index 00000000..85bd01cd --- /dev/null +++ b/.docker/docker-compose/dev.yml @@ -0,0 +1,127 @@ +services: + app: + tty: true + stdin_open: true + image: cpcwood/home-server-app-dev + container_name: home-server-app-dev + build: + context: ../.. + dockerfile: .docker/dockerfiles/dev.Dockerfile + args: + BUNDLE_PATH: /gems + MAX_MIND_LICENSE: "${MAX_MIND_LICENSE:-''}" + environment: + REDIS_HOST: redis + DB_HOST: postgres + DB_USERNAME: cpcwood + CHROMEDRIVER: /usr/bin/chromedriver + WEBPACKER_DEV_SERVER_HOST: "${DEV_SERVER_HOST:-0.0.0.0}" + env_file: + - ../../config/env/.env + volumes: + - ../..:/opt/app/ + - data-home-server-dev-app-gems:/gems + - ~/.bash_history:/root/.bash_history + user: "${FIXUID:-1000}:${FIXGID:-1000}" + depends_on: + - postgres + - redis + - mailcatcher + command: './.docker/scripts/startup-app-dev' + ports: + - 5000:5000 + + client: + tty: true + stdin_open: true + image: cpcwood/home-server-client-dev + container_name: home-server-client-dev + build: + context: ../.. + dockerfile: .docker/dockerfiles/dev.Dockerfile + args: + BUNDLE_PATH: /gems + MAX_MIND_LICENSE: "${MAX_MIND_LICENSE:-''}" + environment: + WEBPACKER_DEV_SERVER_PUBLIC: "${DEV_SERVER_HOST:-0.0.0.0}:3035" + command: .docker/scripts/startup-client-dev + entrypoint: .docker/scripts/entrypoint-dev + env_file: + - ../../config/env/.env + depends_on: + - app + ports: + - 3035:3035 + user: "${FIXUID:-1000}:${FIXGID:-1000}" + volumes: + - ../..:/opt/app/ + - data-home-server-dev-client-gems:/gems + + worker: + tty: true + stdin_open: true + image: cpcwood/home-server-worker-dev + container_name: home-server-worker-dev + build: + context: ../../ + dockerfile: .docker/dockerfiles/dev.Dockerfile + args: + BUNDLE_PATH: /gems + MAX_MIND_LICENSE: "${MAX_MIND_LICENSE:-''}" + environment: + REDIS_HOST: redis + DB_HOST: postgres + DB_USERNAME: cpcwood + env_file: + - ../../config/env/.env + volumes: + - ../..:/opt/app/ + - data-home-server-dev-worker-gems:/gems + user: "${FIXUID:-1000}:${FIXGID:-1000}" + depends_on: + - postgres + - redis + - app + command: './.docker/scripts/startup-worker-dev' + security_opt: + - seccomp:../config/chrome.json + + mailcatcher: + image: sj26/mailcatcher + ports: + - 1025:1025 + - 1080:1080 + + postgres: + image: postgres:13 + environment: + POSTGRES_USER: cpcwood + POSTGRES_PASSWORD: password + PGDATA: /var/lib/postgresql/data/pgdata + ports: + - 5432:5432 + volumes: + - data-home-server-dev-postgres:/var/lib/postgresql/data + healthcheck: + test: pg_isready -U cpcwood -h 127.0.0.1 + interval: 5s + + redis: + image: redis:6-alpine + command: redis-server + volumes: + - data-home-server-dev-redis:/data + ports: + - 6379:6379 + healthcheck: + test: redis-cli ping + interval: 1s + timeout: 3s + retries: 30 + +volumes: + data-home-server-dev-postgres: + data-home-server-dev-redis: + data-home-server-dev-app-gems: + data-home-server-dev-client-gems: + data-home-server-dev-worker-gems: diff --git a/.docker/dockerfiles/Dockerfile b/.docker/dockerfiles/Dockerfile new file mode 100644 index 00000000..454ea652 --- /dev/null +++ b/.docker/dockerfiles/Dockerfile @@ -0,0 +1,41 @@ +# home-server-app +# ================ +# requires cpcwood/home-server-base to have been created + +# Create App +# ================ +FROM ruby:3.2.3-alpine3.18 + +ENV RAILS_ENV=production \ + NODE_ENV=production \ + APP_HOME=/opt/app + +ENV BUNDLE_PATH=$APP_HOME/vendor/bundle \ + GEM_PATH=$APP_HOME/vendor/bundle \ + GEM_HOME=$APP_HOME/vendor/bundle \ + BUNDLE_APP_CONFIG=$APP_HOME/vendor/bundle \ + PATH=$APP_HOME/vendor/bundle/bin:$APP_HOME/vendor/bundle:$APP_HOME/node_modules/.bin:$PATH + +RUN apk add --no-cache \ + bash \ + tzdata \ + imagemagick \ + postgresql-client \ + openssl1.1-compat \ + shared-mime-info && \ + cp /usr/share/zoneinfo/Europe/London /etc/localtime && \ + echo "Europe/London" > /etc/timezone + +RUN mkdir -p $APP_HOME +WORKDIR $APP_HOME + +RUN addgroup -S docker && \ + adduser -S -G docker docker + +USER docker + +COPY --chown=docker:docker --from=cpcwood/home-server-base $APP_HOME $APP_HOME +COPY --chown=docker:docker --from=cpcwood/home-server-base /var/opt/maxmind/GeoLite2-City.mmdb /var/opt/maxmind/GeoLite2-City.mmdb + +EXPOSE 5000 +CMD ["./.docker/scripts/startup-app"] diff --git a/.docker/dockerfiles/base.Dockerfile b/.docker/dockerfiles/base.Dockerfile new file mode 100644 index 00000000..fa9dc350 --- /dev/null +++ b/.docker/dockerfiles/base.Dockerfile @@ -0,0 +1,75 @@ +# home-server-base-image +# ================ +# build args => +# grecaptcha_site_key + +# Compile Assets +# ================ + +FROM ruby:3.2.3-alpine3.18 + +ENV RAILS_ENV=production \ + NODE_ENV=production \ + PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + APP_HOME=/opt/app + +ENV BUNDLE_PATH=$APP_HOME/vendor/bundle \ + GEM_PATH=$APP_HOME/vendor/bundle \ + GEM_HOME=$APP_HOME/vendor/bundle \ + BUNDLE_APP_CONFIG=$APP_HOME/vendor/bundle \ + NODE_OPTIONS="--openssl-legacy-provider" + +RUN apk add --update --no-cache \ + build-base \ + postgresql-dev \ + nodejs \ + yarn \ + git \ + curl \ + gzip \ + tar \ + shared-mime-info \ + xz \ + openssl1.1-compat + +RUN mkdir -p $APP_HOME $APP_HOME/vendor/bundle $APP_HOME/tmp +WORKDIR $APP_HOME + +COPY Gemfile* $APP_HOME/ +RUN bundle config set without development:test:assets && \ + bundle config set bin $GEM_PATH/bin && \ + bundle config set deployment true && \ + bundle install + +COPY package.json yarn.lock $APP_HOME/ +RUN yarn install --production=true && \ + rm -rf /usr/local/share/.cache/yarn + +ARG MAX_MIND_LICENSE +RUN curl "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=$MAX_MIND_LICENSE&suffix=tar.gz" -o ./GeoLite2-City.tar.gz && \ + gzip -d GeoLite2-City.tar.gz && \ + tar -xvf GeoLite2-City.tar && \ + mkdir -p /var/opt/maxmind/ && \ + mv GeoLite2-City_*/GeoLite2-City.mmdb /var/opt/maxmind/GeoLite2-City.mmdb + +RUN addgroup -S docker && \ + adduser -S -G docker docker + +COPY --chown=docker:docker . $APP_HOME + +ARG grecaptcha_site_key +ENV GRECAPTCHA_SITE_KEY=$grecaptcha_site_key \ + SECRET_KEY_BASE=1234567890 + +RUN bundle exec rails assets:precompile && \ + rm -rf $APP_HOME/node_modules && \ + rm -rf $APP_HOME/app/frontend/packs && \ + rm -rf $APP_HOME/log/* && \ + rm -rf $APP_HOME/spec && \ + rm -rf $APP_HOME/storage/* && \ + rm -rf $APP_HOME/tmp/* && \ + rm -rf $APP_HOME/vendor/bundle/ruby/3.2.0/cache/ && \ + find $APP_HOME/vendor/bundle/ruby/3.2.0/gems/ -name "*.c" -delete && \ + find $APP_HOME/vendor/bundle/ruby/3.2.0/gems/ -name "*.o" -delete + +USER docker diff --git a/.docker/dockerfiles/dev.Dockerfile b/.docker/dockerfiles/dev.Dockerfile new file mode 100644 index 00000000..154c299f --- /dev/null +++ b/.docker/dockerfiles/dev.Dockerfile @@ -0,0 +1,71 @@ +# home-server-dev-image +# ================ + +FROM ruby:3.2.3-alpine3.18 + +ENV RAILS_ENV=development \ + NODE_ENV=development \ + PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser \ + APP_HOME=/opt/app \ + PORT=5000 \ + NODE_OPTIONS="--openssl-legacy-provider" + +RUN apk add \ + build-base \ + postgresql-dev postgresql-client \ + imagemagick \ + nodejs \ + yarn \ + curl \ + git \ + gzip \ + tar \ + libffi-dev zlib-dev libxml2-dev libxslt-dev readline-dev xz \ + rust cargo python3 python3-dev py3-pip \ + chromium-chromedriver chromium libnotify-dev \ + shared-mime-info \ + bash \ + openssl1.1-compat \ + tzdata && \ + cp /usr/share/zoneinfo/Europe/London /etc/localtime && \ + echo "Europe/London" > /etc/timezone + +# Ensure gems are owned by docker user +ARG BUNDLE_PATH=/gems +ENV BUNDLE_PATH=$BUNDLE_PATH \ + BUNDLE_APP_CONFIG=$BUNDLE_PATH + +ENV PATH=$BUNDLE_PATH/bin:$APP_HOME/node_modules/.bin:$PATH + +ARG MAX_MIND_LICENSE +RUN curl "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=$MAX_MIND_LICENSE&suffix=tar.gz" -o ./GeoLite2-City.tar.gz && \ + gzip -d GeoLite2-City.tar.gz && \ + tar -xvf GeoLite2-City.tar && \ + mkdir -p /var/opt/maxmind/ && \ + mv GeoLite2-City_*/GeoLite2-City.mmdb /var/opt/maxmind/GeoLite2-City.mmdb + +# Create docker user with variable ID for dev +RUN mkdir -p $APP_HOME /gems && \ + addgroup --gid 1000 --system docker && \ + adduser --uid 1000 --system -G docker -D docker && \ + chown -R docker:docker $APP_HOME /gems + +RUN USER=docker && \ + GROUP=docker && \ + curl -SsL https://github.com/boxboat/fixuid/releases/download/v0.5.1/fixuid-0.5.1-linux-amd64.tar.gz | tar -C /usr/local/bin -xzf - && \ + chown root:root /usr/local/bin/fixuid && \ + chmod 4755 /usr/local/bin/fixuid && \ + mkdir -p /etc/fixuid && \ + printf "user: $USER\ngroup: $GROUP\npaths:\n- /\n- /gems" > /etc/fixuid/config.yml + +USER docker:docker + +ENV PATH="$PATH:$HOME/bin" + +RUN pip3 install -U selenium + +WORKDIR $APP_HOME + +EXPOSE $PORT +ENTRYPOINT ["./.docker/scripts/entrypoint-dev"] diff --git a/.docker/dockerfiles/worker-dependencies.Dockerfile b/.docker/dockerfiles/worker-dependencies.Dockerfile new file mode 100644 index 00000000..3901316e --- /dev/null +++ b/.docker/dockerfiles/worker-dependencies.Dockerfile @@ -0,0 +1,35 @@ +# home-server-worker-dependencies +# ================ + +# Create Server NodeJS Assets +# ================ +FROM alpine:3.18 as server-nodejs-assets + +ENV RAILS_ENV=production \ + NODE_ENV=production \ + PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + APP_HOME=/opt/app \ + NODE_OPTIONS="--openssl-legacy-provider" + +RUN apk add --no-cache \ + nodejs \ + yarn \ + git \ + openssl1.1-compat + +RUN mkdir -p $APP_HOME +WORKDIR $APP_HOME + +COPY package.json yarn.lock ./ + +RUN addgroup -S docker && \ + adduser -S -G docker docker && \ + chown -R docker:docker $APP_HOME + +USER docker + +RUN PACKAGE_NAME='carbon-now-cli' && \ + LINE_NUMBER="$(cat yarn.lock | grep -n "$PACKAGE_NAME@.*:" | cut -f1 -d:)" && \ + VERSION="$(cat yarn.lock | sed -n $((LINE_NUMBER + 1))p | sed 's/.*version \"\(.*\)\"/\1/')" && \ + yarn add ${PACKAGE_NAME}@${VERSION} && \ + ls | grep -v node_modules | xargs rm -rf diff --git a/.docker/dockerfiles/worker.Dockerfile b/.docker/dockerfiles/worker.Dockerfile new file mode 100644 index 00000000..003d5286 --- /dev/null +++ b/.docker/dockerfiles/worker.Dockerfile @@ -0,0 +1,45 @@ +# home-server-worker +# ================ +# requires cpcwood/home-server-base to have been created + +# Create Worker App +# ================ +FROM ruby:3.2.3-alpine3.18 + +ENV RAILS_ENV=production \ + NODE_ENV=production \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser \ + APP_HOME=/opt/app + +ENV BUNDLE_PATH=$APP_HOME/vendor/bundle \ + GEM_PATH=$APP_HOME/vendor/bundle \ + GEM_HOME=$APP_HOME/vendor/bundle \ + BUNDLE_APP_CONFIG=$APP_HOME/vendor/bundle \ + PATH=$APP_HOME/vendor/bundle/bin:$APP_HOME/vendor/bundle:$APP_HOME/node_modules/.bin:$PATH \ + NODE_OPTIONS="--openssl-legacy-provider" + +RUN apk add --no-cache \ + bash \ + tzdata \ + postgresql-client \ + nodejs \ + imagemagick \ + chromium \ + openssl1.1-compat \ + shared-mime-info && \ + cp /usr/share/zoneinfo/Europe/London /etc/localtime && \ + echo "Europe/London" > /etc/timezone + +RUN mkdir -p $APP_HOME +WORKDIR $APP_HOME + +RUN addgroup -S docker && \ + adduser -S -G docker docker + +USER docker + +COPY --chown=docker:docker --from=cpcwood/home-server-base $APP_HOME $APP_HOME +COPY --chown=docker:docker --from=cpcwood/home-server-base /var/opt/maxmind/GeoLite2-City.mmdb /var/opt/maxmind/GeoLite2-City.mmdb +COPY --chown=docker:docker --from=cpcwood/home-server-worker-dependencies $APP_HOME/node_modules $APP_HOME/node_modules + +CMD ["./.docker/scripts/startup-worker"] diff --git a/.docker/scripts/entrypoint-dev b/.docker/scripts/entrypoint-dev new file mode 100755 index 00000000..43d0b19f --- /dev/null +++ b/.docker/scripts/entrypoint-dev @@ -0,0 +1,3 @@ +#!/bin/bash +fixuid 2>/dev/null +"$@" diff --git a/.docker/scripts/startup-app b/.docker/scripts/startup-app new file mode 100755 index 00000000..7bc4ea25 --- /dev/null +++ b/.docker/scripts/startup-app @@ -0,0 +1,19 @@ +#!/bin/bash + +until pg_isready -U "$DB_USERNAME" -h "$DB_HOST" ; do + echo 'waiting for database...' + sleep 1 +done + +if bundle exec rails db:exists ; then + bundle exec rails db:migrate +else + bundle exec rails db:create + bundle exec rails db:migrate + bundle exec rails db:seed +fi + +bundle exec rails sitemap:refresh:no_ping +bundle exec rails whenever --update-crontab + +bundle exec rails server -b 0.0.0.0 -p 5000 \ No newline at end of file diff --git a/.docker/scripts/startup-app-dev b/.docker/scripts/startup-app-dev new file mode 100755 index 00000000..15764b50 --- /dev/null +++ b/.docker/scripts/startup-app-dev @@ -0,0 +1,21 @@ +#!/bin/bash + +while ! pg_isready -U "$DB_USERNAME" -h "$DB_HOST" ; do + sleep 1 +done + +if ! bundle check >/dev/null ; then + bundle install +fi + +kill -INT "$(cat ./tmp/pids/server.pid 2>/dev/null)" >/dev/null 2>&1 +rm -f ./tmp/pids/server.pid >/dev/null 2>&1 +bundle exec rails tmp + +if bundle exec rails db:exists ; then + bundle exec rails db:migrate +else + bundle exec rails db:setup +fi + +bundle exec rails server -b 0.0.0.0 -p 5000 diff --git a/.docker/scripts/startup-client-dev b/.docker/scripts/startup-client-dev new file mode 100755 index 00000000..b71db1dc --- /dev/null +++ b/.docker/scripts/startup-client-dev @@ -0,0 +1,8 @@ +#!/bin/bash + +if ! bundle check >/dev/null ; then + bundle install +fi + +echo 'starting client build server' +./bin/webpacker-dev-server diff --git a/.docker/scripts/startup-worker b/.docker/scripts/startup-worker new file mode 100755 index 00000000..b7c26530 --- /dev/null +++ b/.docker/scripts/startup-worker @@ -0,0 +1,3 @@ +#!/bin/bash + +bundle exec sidekiq -C config/sidekiq.yml \ No newline at end of file diff --git a/.docker/scripts/startup-worker-dev b/.docker/scripts/startup-worker-dev new file mode 100755 index 00000000..2e63253e --- /dev/null +++ b/.docker/scripts/startup-worker-dev @@ -0,0 +1,12 @@ +#!/bin/bash + +until curl --output /dev/null --silent --head http://app:5000 ; do + echo 'waiting for app...' + sleep 2.5 +done + +if ! bundle check >/dev/null ; then + bundle install +fi + +bundle exec sidekiq -C config/sidekiq.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..14a1c3e2 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,56 @@ +# OS X +.DS_Store +.AppleDouble +.LSOverride +Icon +._* +.Spotlight-V100 +.Trashes +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + + +# Rails +coverage/ +log/ +node_modules/ +public/packs/ +public/packs-test/ +public/system +spec/ +storage/ +tmp/ +.bundle +.ruby-version +*.key +*.log +*.state +*.pid +*.env + +# terraform +infrastructure/* + +# others +.kube/ +.git +.gitignore +.keep +.vscode +.byebug_history +.erb-lint.yml +.eslintignore +.eslintrc +.rspec +.rubocop.yml +.stylelintignore +.stylelint.json +.travis.yml +Profile.dev +tasks.txt +yarn-error.log +logfile + diff --git a/.erb-lint.yml b/.erb-lint.yml new file mode 100644 index 00000000..97d1834d --- /dev/null +++ b/.erb-lint.yml @@ -0,0 +1,20 @@ +glob: "**/*.html.erb" +linters: + ErbSafety: + enabled: false + Rubocop: + enabled: false + FinalNewline: + enabled: true + RightTrim: + enabled: false + SpaceAroundErbTag: + enabled: true + NoJavascriptTagHelper: + enabled: true + correction_style: 'plain' + SelfClosingTag: + enabled: true + enforced_style: 'never' + AllowedScriptType: + enabled: false \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100755 index 00000000..20f32cc6 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,22 @@ +/.vscode +/app/javascript/packs/styles +/bin +/config +/coverage +/db +/lib +/log +/node_modules +/public +/shared +/storage +/tmp +/vendor + + + + + + + + diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..66888789 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,17 @@ +{ + "env": { + "browser": true, + "es2020": true, + "node": true + }, + "extends": [ + "standard" + ], + "parser": "@babel/eslint-parser", + "parserOptions": { + "ecmaVersion": 11, + "sourceType": "module" + }, + "rules": { + } +} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 00000000..8d97c8df --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,20 @@ +name: CI + +on: + pull_request: + types: [opened,reopened] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: 'Trigger CircleCI PR Build' + env: + CIRCLECI_API_TOKEN: ${{ secrets.CIRCLECI_API_TOKEN }} + run: | + curl -X POST \ + -H "Circle-Token: $CIRCLECI_API_TOKEN" \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -d "{\"branch\":\"$GITHUB_HEAD_REF\"}" \ + "https://circleci.com/api/v2/project/gh/$GITHUB_REPOSITORY/pipeline" \ No newline at end of file diff --git a/.gitignore b/.gitignore index d1a22832..09326dff 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,6 @@ # or operating system, you probably want to add a global ignore instead: # git config --global core.excludesfile '~/.gitignore_global' -# Ignore bundler config. -/.bundle - # Ignore the default SQLite database. /db/*.sqlite3 /db/*.sqlite3-journal @@ -17,6 +14,7 @@ /tmp/* !/log/.keep !/tmp/.keep +dump.rdb # Ignore uploaded files in development. /storage/* @@ -31,14 +29,63 @@ /public/packs /public/packs-test /node_modules +/vendor/bundle /yarn-error.log yarn-debug.log* .yarn-integrity +# Coverage files +/coverage + # Puma shared files -shared/log/** -!shared/log/.gitkeep -shared/pid/** -!shared/pid/.gitkeep -shared/sockets/** -!shared/sockets/.gitkeep \ No newline at end of file +/shared/log/** +/shared/pids/** +/shared/sockets/** + +# Keep empty directories +!*.keep + +*.key +*.env +*.crt + +!test-defaults.env + +logfile + + +# Local .terraform directories +**/.terraform/* +.terraform* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc diff --git a/.kube/app/home-server-app.yaml b/.kube/app/home-server-app.yaml new file mode 100644 index 00000000..52a25ca9 --- /dev/null +++ b/.kube/app/home-server-app.yaml @@ -0,0 +1,71 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: home-server-app-deployment + labels: + cpcwood.com/name: home-server-app + cpcwood.com/version: "1.0.0" + cpcwood.com/component: application-server + cpcwood.com/part-of: home-server + cpcwood.com/managed-by: cpcwood +spec: + replicas: 1 + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 0 + maxSurge: 2 + selector: + matchLabels: + app: home-server-app + template: + metadata: + labels: + app: home-server-app + spec: + containers: + - name: home-server-app + image: cpcwood/home-server-app:CONTAINER_VERSION + ports: + - containerPort: 5000 + envFrom: + - configMapRef: + name: home-server-app-config + livenessProbe: + httpGet: + path: / + port: 5000 + initialDelaySeconds: 30 + periodSeconds: 15 + timeoutSeconds: 3 + failureThreshold: 2 + readinessProbe: + httpGet: + path: / + port: 5000 + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 3 + successThreshold: 2 + failureThreshold: 12 + lifecycle: + preStop: + exec: + command: ["sh", "-c", "sleep 5"] + +--- +apiVersion: v1 +kind: Service +metadata: + name: home-server-app-service +spec: + selector: + app: home-server-app + ports: + - name: http-proxy + protocol: TCP + port: 5000 + targetPort: 5000 + +--- \ No newline at end of file diff --git a/.kube/app/home-server-db.yaml b/.kube/app/home-server-db.yaml new file mode 100644 index 00000000..8b1c3c0d --- /dev/null +++ b/.kube/app/home-server-db.yaml @@ -0,0 +1,56 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: home-server-db-deployment + labels: + cpcwood.com/name: postgres + cpcwood.com/instance: postgres-13 + cpcwood.com/version: '13' + cpcwood.com/component: database + cpcwood.com/part-of: home-server + cpcwood.com/managed-by: cpcwood +spec: + replicas: 1 + selector: + matchLabels: + app: home-server-db + template: + metadata: + labels: + app: home-server-db + spec: + containers: + - name: home-server-db + image: postgres:13-alpine + ports: + - containerPort: 5432 + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: home-server-db-storage + env: + - name: PGDATA + value: /var/lib/postgresql/data/pgdata + envFrom: + - configMapRef: + name: home-server-db-config + volumes: + - name: home-server-db-storage + persistentVolumeClaim: + claimName: home-server-db-volume-claim + +--- +apiVersion: v1 +kind: Service +metadata: + name: home-server-db-service +spec: + selector: + app: home-server-db + ports: + - name: psql + protocol: TCP + port: 5432 + targetPort: 5432 + +--- \ No newline at end of file diff --git a/.kube/app/home-server-redis.yaml b/.kube/app/home-server-redis.yaml new file mode 100644 index 00000000..089cb18a --- /dev/null +++ b/.kube/app/home-server-redis.yaml @@ -0,0 +1,52 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: home-server-redis-deployment + labels: + cpcwood.com/name: redis + cpcwood.com/instance: redis-latest + cpcwood.com/version: 'latest' + cpcwood.com/component: key-value-store + cpcwood.com/part-of: home-server + cpcwood.com/managed-by: cpcwood +spec: + replicas: 1 + selector: + matchLabels: + app: home-server-redis + template: + metadata: + labels: + app: home-server-redis + spec: + containers: + - name: home-server-redis + image: redis:6-alpine + command: + - redis-server + ports: + - containerPort: 6379 + volumeMounts: + - mountPath: /data + name: home-server-redis-storage + volumes: + - name: home-server-redis-storage + persistentVolumeClaim: + claimName: home-server-redis-volume-claim + +--- +apiVersion: v1 +kind: Service +metadata: + name: home-server-redis-service +spec: + selector: + app: home-server-redis + ports: + - name: redis + protocol: TCP + port: 6379 + targetPort: 6379 + +--- diff --git a/.kube/app/home-server-sidekiq.yaml b/.kube/app/home-server-sidekiq.yaml new file mode 100644 index 00000000..b9a6d25a --- /dev/null +++ b/.kube/app/home-server-sidekiq.yaml @@ -0,0 +1,54 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: home-server-worker-deployment + labels: + cpcwood.com/name: home-server-worker + cpcwood.com/instance: home-server-worker + cpcwood.com/version: '1.0.0' + cpcwood.com/component: background-worker + cpcwood.com/part-of: home-server + cpcwood.com/managed-by: cpcwood +spec: + replicas: 1 + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 25% + maxSurge: 2 + selector: + matchLabels: + app: home-server-worker + template: + metadata: + labels: + app: home-server-worker + spec: + containers: + - name: home-server-worker + image: cpcwood/home-server-worker:CONTAINER_VERSION + envFrom: + - configMapRef: + name: home-server-app-config + livenessProbe: + httpGet: + path: / + port: 7433 + initialDelaySeconds: 20 + periodSeconds: 60 + timeoutSeconds: 5 + readinessProbe: + httpGet: + path: / + port: 7433 + initialDelaySeconds: 20 + periodSeconds: 60 + timeoutSeconds: 5 + lifecycle: + preStop: + exec: + command: ["./scripts/kube/sidekiq_quiet"] + terminationGracePeriodSeconds: 60 + +--- \ No newline at end of file diff --git a/.kube/app/home-server-storage.yaml b/.kube/app/home-server-storage.yaml new file mode 100644 index 00000000..a7c4ac00 --- /dev/null +++ b/.kube/app/home-server-storage.yaml @@ -0,0 +1,33 @@ +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: home-server-db-volume-claim +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi + storageClassName: local-storage + selector: + matchLabels: + type: db + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: home-server-redis-volume-claim +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageClassName: local-storage + selector: + matchLabels: + type: redis + +--- \ No newline at end of file diff --git a/.kube/config-templates/cicd-role-binding.yml b/.kube/config-templates/cicd-role-binding.yml new file mode 100644 index 00000000..2df3003b --- /dev/null +++ b/.kube/config-templates/cicd-role-binding.yml @@ -0,0 +1,13 @@ +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: cicd + namespace: default +subjects: + - kind: ServiceAccount + name: cicd + namespace: default +roleRef: + kind: Role + name: cicd + apiGroup: rbac.authorization.k8s.io \ No newline at end of file diff --git a/.kube/config-templates/cicd-role.yml b/.kube/config-templates/cicd-role.yml new file mode 100644 index 00000000..c51db80e --- /dev/null +++ b/.kube/config-templates/cicd-role.yml @@ -0,0 +1,9 @@ +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: cicd + namespace: default +rules: + - apiGroups: ["", "apps", "batch", "extensions"] + resources: ["deployments", "services", "replicasets", "pods", "jobs", "cronjobs"] + verbs: ["*"] \ No newline at end of file diff --git a/.kube/config-templates/cicd-service-account.yml b/.kube/config-templates/cicd-service-account.yml new file mode 100644 index 00000000..c851ebc3 --- /dev/null +++ b/.kube/config-templates/cicd-service-account.yml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: cicd + namespace: default \ No newline at end of file diff --git a/.kube/config-templates/home-server-app.config.yaml b/.kube/config-templates/home-server-app.config.yaml new file mode 100644 index 00000000..4a4fa55f --- /dev/null +++ b/.kube/config-templates/home-server-app.config.yaml @@ -0,0 +1,43 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: home-server-app-config +data: + ADMIN_EMAIL: + ADMIN_MOBILE_NUMBER: + ADMIN_PASSWORD: + ADMIN_USERNAME: + AWS_ACCESS_KEY_ID: + AWS_BUCKET: + AWS_REGION: + AWS_SECRET_ACCESS_KEY: + DB_HOST: home-server-db-service.default + DB_PASSWORD: + DB_USERNAME: + DBNAME_PRODUCTION: home_server_production + EMAIL_ASSET_HOST: + EMAIL_COMPANY_NAME: + EMAIL_DEFAULT_ADDRESS: + EMAIL_DEFAULT_NAME: + EMAIL_HELO_DOMAIN: + EMAIL_NO_REPLY_ADDRESS: + EMAIL_SMTP_PASSWORD: + EMAIL_SMTP_SERVER_ADDRESS: + EMAIL_SMTP_SERVER_PORT: + EMAIL_SMTP_USERNAME: + GRECAPTCHA_SITE_KEY: + GRECAPTCHA_SITE_SECRET: + PUMA_MAX_THREADS: "16" + PUMA_STARTING_THREADS: "1" + PUMA_WEB_CONCURRENCY: "1" + REDIS_HOST: home-server-redis-service.default + SECRET_KEY_BASE: + SENTRY_DSN: + SITE_HOST: + TWILIO_ACCOUNT_SID: + TWILIO_AUTH_TOKEN: + TWILIO_VERIFY_SERVICE_SID: + + +--- diff --git a/.kube/config-templates/home-server-db.config.yaml b/.kube/config-templates/home-server-db.config.yaml new file mode 100644 index 00000000..ceb1fb5e --- /dev/null +++ b/.kube/config-templates/home-server-db.config.yaml @@ -0,0 +1,10 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: home-server-db-config +data: + POSTGRES_USER: + POSTGRES_PASSWORD: + +--- \ No newline at end of file diff --git a/.kube/config-templates/home-server-persistent-volumes.yaml b/.kube/config-templates/home-server-persistent-volumes.yaml new file mode 100644 index 00000000..5da83939 --- /dev/null +++ b/.kube/config-templates/home-server-persistent-volumes.yaml @@ -0,0 +1,51 @@ +--- +apiVersion: v1 +kind: PersistentVolume +metadata: + name: home-server-db-volume + labels: + type: db +spec: + capacity: + storage: 2Gi + persistentVolumeReclaimPolicy: Retain + accessModes: + - ReadWriteOnce + storageClassName: local-storage + local: + path: /mnt/home-server-pg-data # path to local data storage + nodeAffinity: + required: + nodeSelectorTerms: + - matchExpressions: + - key: node-name + operator: In + values: + - + +--- +apiVersion: v1 +kind: PersistentVolume +metadata: + name: home-server-redis-volume + labels: + type: redis +spec: + capacity: + storage: 1Gi + persistentVolumeReclaimPolicy: Retain + accessModes: + - ReadWriteOnce + storageClassName: local-storage + local: + path: /mnt/home-server-redis-data # path to local data storage + nodeAffinity: + required: + nodeSelectorTerms: + - matchExpressions: + - key: node-name + operator: In + values: + - + +--- \ No newline at end of file diff --git a/.kube/ingress-templates/example.com.ingress.yaml b/.kube/ingress-templates/example.com.ingress.yaml new file mode 100644 index 00000000..5ca77c69 --- /dev/null +++ b/.kube/ingress-templates/example.com.ingress.yaml @@ -0,0 +1,39 @@ + +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: home-server-app-ingress + annotations: + kubernetes.io/ingress.class: traefik + cert-manager.io/cluster-issuer: letsencrypt-prod + traefik.ingress.kubernetes.io/frontend-entry-points: http, https + traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd +spec: + tls: + - hosts: + - example.com + secretName: example.com-tls + rules: + - host: example.com + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: home-server-app-service + port: + number: 5000 + +--- +apiVersion: traefik.containo.us/v1alpha1 +kind: Middleware +metadata: + name: redirect-https +spec: + redirectScheme: + scheme: https + permanent: true + +--- diff --git a/.kube/ingress-templates/letsencrypt-issuer-production.yaml b/.kube/ingress-templates/letsencrypt-issuer-production.yaml new file mode 100644 index 00000000..560330ef --- /dev/null +++ b/.kube/ingress-templates/letsencrypt-issuer-production.yaml @@ -0,0 +1,19 @@ +# https://cert-manager.io/docs/installation/kubernetes/ +# kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.7.1/cert-manager.yaml +--- +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: letsencrypt-prod +spec: + acme: + server: https://acme-v02.api.letsencrypt.org/directory + email: admin@example.com + privateKeySecretRef: + name: letsencrypt-prod + solvers: + - http01: + ingress: + class: traefik + +--- \ No newline at end of file diff --git a/.node-version b/.node-version new file mode 100644 index 00000000..47266f80 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +14.15.4 \ No newline at end of file diff --git a/.rspec b/.rspec new file mode 100644 index 00000000..c99d2e73 --- /dev/null +++ b/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 00000000..bfe10a31 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,81 @@ +require: + - rubocop-rails + - rubocop-performance + +AllCops: + TargetRubyVersion: 2.7.3 + Exclude: + - 'bin/**/*' + - 'config/**/*' + - 'coverage/**/*' + - 'db/**/*' + - 'log/**/*' + - 'node_modules/**/*' + - 'shared/**/*' + - 'storage/**/*' + - 'vendor/**/*' + - '*.js.erb' + NewCops: enable + SuggestExtensions: false + +Bundler/OrderedGems: + Enabled: false + +Gemspec/OrderedDependencies: + Enabled: false + +Layout/LineLength: + Max: 200 +Layout/EmptyLineAfterGuardClause: + Enabled: false +Layout/SpaceBeforeBlockBraces: + Enabled: false +Layout/SpaceInsideHashLiteralBraces: + EnforcedStyle: compact +Layout/TrailingEmptyLines: + Enabled: false +Layout/EmptyLinesAroundAttributeAccessor: + Enabled: false +Layout/SpaceAroundMethodCallOperator: + Enabled: false +Layout/MultilineMethodCallBraceLayout: + EnforcedStyle: same_line + +Style/SymbolArray: + Enabled: false +Style/TernaryParentheses: + EnforcedStyle: require_parentheses_when_complex +Style/FrozenStringLiteralComment: + Enabled: false +Style/Documentation: + Enabled: false +Style/NumericPredicate: + Enabled: false +Style/ZeroLengthPredicate: + Enabled: false +Style/NumericLiteralPrefix: + Enabled: false +Style/OptionalBooleanParameter: + Enabled: false + +Metrics/BlockLength: + Enabled: false +Metrics/MethodLength: + Enabled: false +Metrics/AbcSize: + Enabled: false +Metrics/ClassLength: + Max: 200 + +Rails/SkipsModelValidations: + Enabled: false +Rails/OutputSafety: + Enabled: false +Rails/DynamicFindBy: + Enabled: false + +Performance/Caller: + Enabled: false + +Rails/I18nLocaleTexts: + Enabled: false \ No newline at end of file diff --git a/.ruby-version b/.ruby-version index d7edb568..b347b11e 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -ruby-2.6.5 +3.2.3 diff --git a/.stylelintignore b/.stylelintignore new file mode 100755 index 00000000..5a384084 --- /dev/null +++ b/.stylelintignore @@ -0,0 +1,13 @@ +/.vscode +/bin +/config +/coverage +/db +/lib +/log +/node_modules +/public +/shared +/storage +/tmp +/vendor \ No newline at end of file diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100755 index 00000000..6751b94b --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,11 @@ +{ + "extends": "stylelint-config-sass-guidelines", + "plugins": [ + "stylelint-scss" + ], + "basedir": "app/javascript/packs/styles", + "rules": { + "selector-max-id": 1, + "max-nesting-depth": 2 + } +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..85667e4d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "git.ignoreLimitWarning": true, + "cSpell.words": [ + "Pikaday", + "grecaptcha", + "lightbox" + ] +} \ No newline at end of file diff --git a/Gemfile b/Gemfile index 11c43fb6..0e30f792 100644 --- a/Gemfile +++ b/Gemfile @@ -1,54 +1,112 @@ source 'https://rubygems.org' -git_source(:github) { |repo| "https://github.com/#{repo}.git" } -ruby '2.6.5' +ruby '3.2.3' -# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 6.0.2', '>= 6.0.2.2' -# Use sqlite3 as the database for Active Record -gem 'sqlite3', '~> 1.4' +# Rails +gem 'rails', '~> 7.1' +# Ensure assets pipeline from v6 still works +gem 'sprockets-rails', '~> 3.4' +# Turbo rails +gem 'turbo-rails', '~> 1.1' +# Use postgresql as the database for Active Record +gem 'pg', '~> 1.4', '< 2.0' # Use Puma as the app server -gem 'puma', '~> 4.1' -# Use SCSS for stylesheets -gem 'sass-rails', '>= 6' -# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker -gem 'webpacker', '~> 4.0' -# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks -gem 'turbolinks', '~> 5' -# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder -gem 'jbuilder', '~> 2.7' -# Use Redis adapter to run Action Cable in production -# gem 'redis', '~> 4.0' +gem 'puma', '~> 6' +# Transpile app-like JavaScript. Read more: https://github.com/shakacode/shakapacker +gem 'shakapacker', '6.6.0' # Use Active Model has_secure_password -# gem 'bcrypt', '~> 3.1.7' +gem 'bcrypt', '~> 3.1' +# Throttle excessive requests +gem 'rack-attack', '~> 6.7' +# Send HTTP Requests +gem 'faraday', '~> 2.9', require: false +# Verify 2FA using twilio +gem 'twilio-ruby', '~> 5.72', require: false +# Action Mailer and Action Job Backend - Sidekiq (Requires redis and start upon server launch) +gem 'sidekiq', '~> 7.0' +# Transform uploaded images +gem 'image_processing', '~> 1.12' +# Process markdown +gem 'redcarpet', '~> 3.6' +# Markdown syntax highlighing +gem 'rouge', '~> 4.2' +# Validate urls in model +gem 'validate_url', '~> 1.0' +# Validate dates in model +gem 'date_validator', '~> 0.12' +# Timezone +gem 'tzinfo-data', '~> 1.2024' +# JSON API serializer +gem 'jsonapi-serializer', '~> 2.2' +# mime types +gem 'mimemagic', '~> 0.4' +# Tasks +gem 'rake', '~> 13.0' +# Pageviews +gem 'ahoy_matey', '~> 4.1' +gem 'geocoder', '~> 1.8' +gem 'maxminddb', '~> 0.1' -# Use Active Storage variant -# gem 'image_processing', '~> 1.2' - -# Reduces boot times through caching; required in config/boot.rb -gem 'bootsnap', '>= 1.4.2', require: false +group :production do + # AWS S3 for production storage + gem 'aws-sdk-s3', '~> 1.146', require: false + # Ensure sidekiq stays alive in k8s + gem 'sidekiq_alive', '~> 2.4' + # Dynamically generate sitemaps + gem 'sitemap_generator', '~> 6.3' + # Manage cron + gem 'whenever', '~> 1.0', require: false + # Error Reporting + gem 'sentry-ruby', '~> 5.17' + gem 'sentry-rails', '~> 5.17' +end group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console - gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] + gem 'byebug', '~> 11.1', platforms: [:mri, :mingw, :x64_mingw] + # Code policing with rubocop + gem 'rubocop-rails', '~> 2.16', require: false + gem 'rubocop-performance', '~> 1.15', require: false + # Some real nice printing + gem 'amazing_print', '~> 1.4' + # Manage models in spec + gem 'factory_bot_rails', '~> 6.2' + # Listen - required for rails dev environment + gem 'listen', '~> 3.0', '< 3.2' end group :development do # Access an interactive console on exception pages or by calling 'console' anywhere in the code. - gem 'web-console', '>= 3.3.0' - gem 'listen', '>= 3.0.5', '< 3.2' - # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring - gem 'spring' - gem 'spring-watcher-listen', '~> 2.0.0' + gem 'web-console', '~> 4.2' + # Annotate models for quick reference + gem 'annotate', '~> 3.2' + # Static security testing + gem 'brakeman', '~> 5.3' + # Lint erb + gem 'erb_lint', '~> 0.0' end group :test do + # Testing backend with RSpec + gem 'rspec-rails', '~> 6.1', require: false + gem 'rails-controller-testing', '~> 1.0' # Adds support for Capybara system testing and selenium driver - gem 'capybara', '>= 2.15' - gem 'selenium-webdriver' + gem 'capybara', '~> 3.37', require: false # Easy installation and use of web drivers to run system tests with browsers - gem 'webdrivers' + gem 'webdrivers', '~> 5.3.1', require: false + # Coverage with simplecov + gem 'simplecov', '~> 0.16', require: false + gem 'simplecov-console', '~> 0.9', require: false + # Coverage badge with coveralls + gem 'coveralls', '~> 0.8', require: false + # Mock HTTP Requests + gem 'webmock', '~> 3.18', require: false + # Clean up the messy database during tests + gem 'database_cleaner-active_record', '~> 2.0', require: false + # Format tests for circleci + gem 'rspec_junit_formatter', '~> 0.5' + # Load spec env + gem 'dotenv', '~> 2.8' + # Screenshot failed feature specs + gem 'capybara-screenshot', '~> 1.0' end - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/Gemfile.lock b/Gemfile.lock index 3c574ea3..679ef5a2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,225 +1,507 @@ GEM remote: https://rubygems.org/ specs: - actioncable (6.0.2.2) - actionpack (= 6.0.2.2) + actioncable (7.1.3.4) + actionpack (= 7.1.3.4) + activesupport (= 7.1.3.4) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.0.2.2) - actionpack (= 6.0.2.2) - activejob (= 6.0.2.2) - activerecord (= 6.0.2.2) - activestorage (= 6.0.2.2) - activesupport (= 6.0.2.2) + zeitwerk (~> 2.6) + actionmailbox (7.1.3.4) + actionpack (= 7.1.3.4) + activejob (= 7.1.3.4) + activerecord (= 7.1.3.4) + activestorage (= 7.1.3.4) + activesupport (= 7.1.3.4) mail (>= 2.7.1) - actionmailer (6.0.2.2) - actionpack (= 6.0.2.2) - actionview (= 6.0.2.2) - activejob (= 6.0.2.2) + net-imap + net-pop + net-smtp + actionmailer (7.1.3.4) + actionpack (= 7.1.3.4) + actionview (= 7.1.3.4) + activejob (= 7.1.3.4) + activesupport (= 7.1.3.4) mail (~> 2.5, >= 2.5.4) - rails-dom-testing (~> 2.0) - actionpack (6.0.2.2) - actionview (= 6.0.2.2) - activesupport (= 6.0.2.2) - rack (~> 2.0, >= 2.0.8) + net-imap + net-pop + net-smtp + rails-dom-testing (~> 2.2) + actionpack (7.1.3.4) + actionview (= 7.1.3.4) + activesupport (= 7.1.3.4) + nokogiri (>= 1.8.5) + racc + rack (>= 2.2.4) + rack-session (>= 1.0.1) rack-test (>= 0.6.3) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.0.2.2) - actionpack (= 6.0.2.2) - activerecord (= 6.0.2.2) - activestorage (= 6.0.2.2) - activesupport (= 6.0.2.2) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + actiontext (7.1.3.4) + actionpack (= 7.1.3.4) + activerecord (= 7.1.3.4) + activestorage (= 7.1.3.4) + activesupport (= 7.1.3.4) + globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (6.0.2.2) - activesupport (= 6.0.2.2) + actionview (7.1.3.4) + activesupport (= 7.1.3.4) builder (~> 3.1) - erubi (~> 1.4) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (6.0.2.2) - activesupport (= 6.0.2.2) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + activejob (7.1.3.4) + activesupport (= 7.1.3.4) globalid (>= 0.3.6) - activemodel (6.0.2.2) - activesupport (= 6.0.2.2) - activerecord (6.0.2.2) - activemodel (= 6.0.2.2) - activesupport (= 6.0.2.2) - activestorage (6.0.2.2) - actionpack (= 6.0.2.2) - activejob (= 6.0.2.2) - activerecord (= 6.0.2.2) - marcel (~> 0.3.1) - activesupport (6.0.2.2) + activemodel (7.1.3.4) + activesupport (= 7.1.3.4) + activerecord (7.1.3.4) + activemodel (= 7.1.3.4) + activesupport (= 7.1.3.4) + timeout (>= 0.4.0) + activestorage (7.1.3.4) + actionpack (= 7.1.3.4) + activejob (= 7.1.3.4) + activerecord (= 7.1.3.4) + activesupport (= 7.1.3.4) + marcel (~> 1.0) + activesupport (7.1.3.4) + base64 + bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - zeitwerk (~> 2.2) - addressable (2.7.0) - public_suffix (>= 2.0.2, < 5.0) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + minitest (>= 5.1) + mutex_m + tzinfo (~> 2.0) + addressable (2.8.6) + public_suffix (>= 2.0.2, < 6.0) + ahoy_matey (4.2.1) + activesupport (>= 5.2) + device_detector + safely_block (>= 0.2.1) + amazing_print (1.6.0) + annotate (3.2.0) + activerecord (>= 3.2, < 8.0) + rake (>= 10.4, < 14.0) + ansi (1.5.0) + ast (2.4.2) + aws-eventstream (1.3.0) + aws-partitions (1.899.0) + aws-sdk-core (3.191.4) + aws-eventstream (~> 1, >= 1.3.0) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.8) + jmespath (~> 1, >= 1.6.1) + aws-sdk-kms (1.78.0) + aws-sdk-core (~> 3, >= 3.191.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.146.0) + aws-sdk-core (~> 3, >= 3.191.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.8) + aws-sigv4 (1.8.0) + aws-eventstream (~> 1, >= 1.0.2) + base64 (0.2.0) + bcrypt (3.1.20) + better_html (2.1.1) + actionview (>= 6.0) + activesupport (>= 6.0) + ast (~> 2.0) + erubi (~> 1.4) + parser (>= 2.4) + smart_properties + bigdecimal (3.1.8) bindex (0.8.1) - bootsnap (1.4.6) - msgpack (~> 1.0) + brakeman (5.4.1) builder (3.2.4) - byebug (11.1.1) - capybara (3.31.0) + byebug (11.1.3) + capybara (3.40.0) addressable + matrix mini_mime (>= 0.1.3) - nokogiri (~> 1.8) + nokogiri (~> 1.11) rack (>= 1.6.0) rack-test (>= 0.6.3) - regexp_parser (~> 1.5) + regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) - childprocess (3.0.0) - concurrent-ruby (1.1.6) + capybara-screenshot (1.0.26) + capybara (>= 1.0, < 4) + launchy + childprocess (5.0.0) + chronic (0.10.2) + concurrent-ruby (1.3.1) + connection_pool (2.4.1) + coveralls (0.8.23) + json (>= 1.8, < 3) + simplecov (~> 0.16.1) + term-ansicolor (~> 1.3) + thor (>= 0.19.4, < 2.0) + tins (~> 1.6) + crack (1.0.0) + bigdecimal + rexml crass (1.0.6) - erubi (1.9.0) - ffi (1.12.2) - globalid (0.4.2) - activesupport (>= 4.2.0) - i18n (1.8.2) - concurrent-ruby (~> 1.0) - jbuilder (2.10.0) + database_cleaner-active_record (2.1.0) + activerecord (>= 5.a) + database_cleaner-core (~> 2.0.0) + database_cleaner-core (2.0.1) + date (3.3.4) + date_validator (0.12.0) + activemodel (>= 3) + activesupport (>= 3) + device_detector (1.1.2) + diff-lcs (1.5.1) + docile (1.4.0) + dotenv (2.8.1) + drb (2.2.1) + erb_lint (0.5.0) + activesupport + better_html (>= 2.0.1) + parser (>= 2.7.1.4) + rainbow + rubocop + smart_properties + erubi (1.12.0) + factory_bot (6.4.6) activesupport (>= 5.0.0) - listen (3.1.5) + factory_bot_rails (6.4.3) + factory_bot (~> 6.4) + railties (>= 5.0.0) + faraday (2.9.0) + faraday-net_http (>= 2.0, < 3.2) + faraday-net_http (3.1.0) + net-http + ffi (1.16.3) + geocoder (1.8.2) + globalid (1.2.1) + activesupport (>= 6.1) + gserver (0.0.1) + hashdiff (1.1.0) + i18n (1.14.5) + concurrent-ruby (~> 1.0) + image_processing (1.12.2) + mini_magick (>= 4.9.5, < 5) + ruby-vips (>= 2.0.17, < 3) + io-console (0.7.2) + irb (1.12.0) + rdoc + reline (>= 0.4.2) + jmespath (1.6.2) + json (2.7.1) + jsonapi-serializer (2.2.0) + activesupport (>= 4.2) + jwt (2.8.1) + base64 + language_server-protocol (3.17.0.3) + launchy (3.0.0) + addressable (~> 2.8) + childprocess (~> 5.0) + listen (3.0.8) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - ruby_dep (~> 1.2) - loofah (2.4.0) + loofah (2.22.0) crass (~> 1.0.2) - nokogiri (>= 1.5.9) - mail (2.7.1) + nokogiri (>= 1.12.0) + mail (2.8.1) mini_mime (>= 0.1.1) - marcel (0.3.3) - mimemagic (~> 0.3.2) - method_source (1.0.0) - mimemagic (0.3.4) - mini_mime (1.0.2) - mini_portile2 (2.4.0) - minitest (5.14.0) - msgpack (1.3.3) - nio4r (2.5.2) - nokogiri (1.10.9) - mini_portile2 (~> 2.4.0) - public_suffix (4.0.3) - puma (4.3.3) + net-imap + net-pop + net-smtp + marcel (1.0.4) + matrix (0.4.2) + maxminddb (0.1.22) + mimemagic (0.4.3) + nokogiri (~> 1) + rake + mini_magick (4.12.0) + mini_mime (1.1.5) + minitest (5.23.1) + mutex_m (0.2.0) + net-http (0.4.1) + uri + net-imap (0.4.10) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.2) + timeout + net-smtp (0.4.0.1) + net-protocol + nio4r (2.7.1) + nokogiri (1.16.5-x86_64-linux) + racc (~> 1.4) + parallel (1.24.0) + parser (3.3.0.5) + ast (~> 2.4.1) + racc + pg (1.5.6) + psych (5.1.2) + stringio + public_suffix (5.0.4) + puma (6.4.2) nio4r (~> 2.0) - rack (2.2.2) - rack-proxy (0.6.5) + racc (1.8.0) + rack (3.0.11) + rack-attack (6.7.0) + rack (>= 1.0, < 4) + rack-proxy (0.7.7) rack - rack-test (1.1.0) - rack (>= 1.0, < 3) - rails (6.0.2.2) - actioncable (= 6.0.2.2) - actionmailbox (= 6.0.2.2) - actionmailer (= 6.0.2.2) - actionpack (= 6.0.2.2) - actiontext (= 6.0.2.2) - actionview (= 6.0.2.2) - activejob (= 6.0.2.2) - activemodel (= 6.0.2.2) - activerecord (= 6.0.2.2) - activestorage (= 6.0.2.2) - activesupport (= 6.0.2.2) - bundler (>= 1.3.0) - railties (= 6.0.2.2) - sprockets-rails (>= 2.0.0) - rails-dom-testing (2.0.3) - activesupport (>= 4.2.0) + rack-session (2.0.0) + rack (>= 3.0.0) + rack-test (2.1.0) + rack (>= 1.3) + rackup (2.1.0) + rack (>= 3) + webrick (~> 1.8) + rails (7.1.3.4) + actioncable (= 7.1.3.4) + actionmailbox (= 7.1.3.4) + actionmailer (= 7.1.3.4) + actionpack (= 7.1.3.4) + actiontext (= 7.1.3.4) + actionview (= 7.1.3.4) + activejob (= 7.1.3.4) + activemodel (= 7.1.3.4) + activerecord (= 7.1.3.4) + activestorage (= 7.1.3.4) + activesupport (= 7.1.3.4) + bundler (>= 1.15.0) + railties (= 7.1.3.4) + rails-controller-testing (1.0.5) + actionpack (>= 5.0.1.rc1) + actionview (>= 5.0.1.rc1) + activesupport (>= 5.0.1.rc1) + rails-dom-testing (2.2.0) + activesupport (>= 5.0.0) + minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.3.0) - loofah (~> 2.3) - railties (6.0.2.2) - actionpack (= 6.0.2.2) - activesupport (= 6.0.2.2) - method_source - rake (>= 0.8.7) - thor (>= 0.20.3, < 2.0) - rake (13.0.1) - rb-fsevent (0.10.3) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + railties (7.1.3.4) + actionpack (= 7.1.3.4) + activesupport (= 7.1.3.4) + irb + rackup (>= 1.0.0) + rake (>= 12.2) + thor (~> 1.0, >= 1.2.2) + zeitwerk (~> 2.6) + rainbow (3.1.1) + rake (13.1.0) + rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) - regexp_parser (1.7.0) - ruby_dep (1.5.0) - rubyzip (2.3.0) - sass-rails (6.0.0) - sassc-rails (~> 2.1, >= 2.1.1) - sassc (2.2.1) - ffi (~> 1.9) - sassc-rails (2.1.2) - railties (>= 4.0.0) - sassc (>= 2.0) - sprockets (> 3.0) - sprockets-rails - tilt - selenium-webdriver (3.142.7) - childprocess (>= 0.5, < 4.0) - rubyzip (>= 1.2.2) - spring (2.1.0) - spring-watcher-listen (2.0.1) - listen (>= 2.7, < 4.0) - spring (>= 1.2, < 3.0) - sprockets (4.0.0) + rdoc (6.6.3.1) + psych (>= 4.0.0) + redcarpet (3.6.0) + redis-client (0.21.1) + connection_pool + regexp_parser (2.9.0) + reline (0.4.3) + io-console (~> 0.5) + rexml (3.2.6) + rouge (4.2.1) + rspec-core (3.13.0) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-mocks (3.13.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-rails (6.1.2) + actionpack (>= 6.1) + activesupport (>= 6.1) + railties (>= 6.1) + rspec-core (~> 3.13) + rspec-expectations (~> 3.13) + rspec-mocks (~> 3.13) + rspec-support (~> 3.13) + rspec-support (3.13.1) + rspec_junit_formatter (0.6.0) + rspec-core (>= 2, < 4, != 2.12.0) + rubocop (1.62.1) + json (~> 2.3) + language_server-protocol (>= 3.17.0) + parallel (~> 1.10) + parser (>= 3.3.0.2) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml (>= 3.2.5, < 4.0) + rubocop-ast (>= 1.31.1, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 3.0) + rubocop-ast (1.31.2) + parser (>= 3.3.0.4) + rubocop-performance (1.20.2) + rubocop (>= 1.48.1, < 2.0) + rubocop-ast (>= 1.30.0, < 2.0) + rubocop-rails (2.24.0) + activesupport (>= 4.2.0) + rack (>= 1.1) + rubocop (>= 1.33.0, < 2.0) + rubocop-ast (>= 1.31.1, < 2.0) + ruby-progressbar (1.13.0) + ruby-vips (2.2.1) + ffi (~> 1.12) + rubyzip (2.3.2) + safely_block (0.4.0) + selenium-webdriver (4.10.0) + rexml (~> 3.2, >= 3.2.5) + rubyzip (>= 1.2.2, < 3.0) + websocket (~> 1.0) + semantic_range (3.0.0) + sentry-rails (5.17.1) + railties (>= 5.0) + sentry-ruby (~> 5.17.1) + sentry-ruby (5.17.1) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.0.2) + shakapacker (6.6.0) + activesupport (>= 5.2) + rack-proxy (>= 0.6.1) + railties (>= 5.2) + semantic_range (>= 2.3.0) + sidekiq (7.2.2) + concurrent-ruby (< 2) + connection_pool (>= 2.3.0) + rack (>= 2.2.4) + redis-client (>= 0.19.0) + sidekiq_alive (2.4.0) + gserver (~> 0.0.1) + sidekiq (>= 5, < 8) + simplecov (0.16.1) + docile (~> 1.1) + json (>= 1.8, < 3) + simplecov-html (~> 0.10.0) + simplecov-console (0.9.1) + ansi + simplecov + terminal-table + simplecov-html (0.10.2) + sitemap_generator (6.3.0) + builder (~> 3.0) + smart_properties (1.17.0) + sprockets (4.2.1) concurrent-ruby (~> 1.0) - rack (> 1, < 3) - sprockets-rails (3.2.1) - actionpack (>= 4.0) - activesupport (>= 4.0) + rack (>= 2.2.4, < 4) + sprockets-rails (3.4.2) + actionpack (>= 5.2) + activesupport (>= 5.2) sprockets (>= 3.0.0) - sqlite3 (1.4.2) - thor (1.0.1) - thread_safe (0.3.6) - tilt (2.0.10) - turbolinks (5.2.1) - turbolinks-source (~> 5.2) - turbolinks-source (5.2.0) - tzinfo (1.2.6) - thread_safe (~> 0.1) - web-console (4.0.1) + stringio (3.1.0) + sync (0.5.0) + term-ansicolor (1.7.2) + tins (~> 1.0) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + thor (1.3.1) + timeout (0.4.1) + tins (1.32.1) + sync + turbo-rails (1.5.0) + actionpack (>= 6.0.0) + activejob (>= 6.0.0) + railties (>= 6.0.0) + twilio-ruby (5.77.0) + faraday (>= 0.9, < 3.0) + jwt (>= 1.5, < 3.0) + nokogiri (>= 1.6, < 2.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + tzinfo-data (1.2024.1) + tzinfo (>= 1.0.0) + unicode-display_width (2.5.0) + uri (0.13.0) + validate_url (1.0.15) + activemodel (>= 3.0.0) + public_suffix + web-console (4.2.1) actionview (>= 6.0.0) activemodel (>= 6.0.0) bindex (>= 0.4.0) railties (>= 6.0.0) - webdrivers (4.2.0) + webdrivers (5.3.1) nokogiri (~> 1.6) rubyzip (>= 1.3.0) - selenium-webdriver (>= 3.0, < 4.0) - webpacker (4.2.2) - activesupport (>= 4.2) - rack-proxy (>= 0.6.1) - railties (>= 4.2) - websocket-driver (0.7.1) + selenium-webdriver (~> 4.0, < 4.11) + webmock (3.23.0) + addressable (>= 2.8.0) + crack (>= 0.3.2) + hashdiff (>= 0.4.0, < 2.0.0) + webrick (1.8.1) + websocket (1.2.10) + websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) - websocket-extensions (0.1.4) + websocket-extensions (0.1.5) + whenever (1.0.0) + chronic (>= 0.6.3) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.3.0) + zeitwerk (2.6.13) PLATFORMS - ruby + x86_64-linux + x86_64-linux-musl DEPENDENCIES - bootsnap (>= 1.4.2) - byebug - capybara (>= 2.15) - jbuilder (~> 2.7) - listen (>= 3.0.5, < 3.2) - puma (~> 4.1) - rails (~> 6.0.2, >= 6.0.2.2) - sass-rails (>= 6) - selenium-webdriver - spring - spring-watcher-listen (~> 2.0.0) - sqlite3 (~> 1.4) - turbolinks (~> 5) - tzinfo-data - web-console (>= 3.3.0) - webdrivers - webpacker (~> 4.0) + ahoy_matey (~> 4.1) + amazing_print (~> 1.4) + annotate (~> 3.2) + aws-sdk-s3 (~> 1.146) + bcrypt (~> 3.1) + brakeman (~> 5.3) + byebug (~> 11.1) + capybara (~> 3.37) + capybara-screenshot (~> 1.0) + coveralls (~> 0.8) + database_cleaner-active_record (~> 2.0) + date_validator (~> 0.12) + dotenv (~> 2.8) + erb_lint (~> 0.0) + factory_bot_rails (~> 6.2) + faraday (~> 2.9) + geocoder (~> 1.8) + image_processing (~> 1.12) + jsonapi-serializer (~> 2.2) + listen (~> 3.0, < 3.2) + maxminddb (~> 0.1) + mimemagic (~> 0.4) + pg (~> 1.4, < 2.0) + puma (~> 6) + rack-attack (~> 6.7) + rails (~> 7.1) + rails-controller-testing (~> 1.0) + rake (~> 13.0) + redcarpet (~> 3.6) + rouge (~> 4.2) + rspec-rails (~> 6.1) + rspec_junit_formatter (~> 0.5) + rubocop-performance (~> 1.15) + rubocop-rails (~> 2.16) + sentry-rails (~> 5.17) + sentry-ruby (~> 5.17) + shakapacker (= 6.6.0) + sidekiq (~> 7.0) + sidekiq_alive (~> 2.4) + simplecov (~> 0.16) + simplecov-console (~> 0.9) + sitemap_generator (~> 6.3) + sprockets-rails (~> 3.4) + turbo-rails (~> 1.1) + twilio-ruby (~> 5.72) + tzinfo-data (~> 1.2024) + validate_url (~> 1.0) + web-console (~> 4.2) + webdrivers (~> 5.3.1) + webmock (~> 3.18) + whenever (~> 1.0) RUBY VERSION - ruby 2.6.5p114 + ruby 3.2.3p157 BUNDLED WITH - 2.1.4 + 2.3.26 diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..5e5f6fb6 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Chris Wood + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Procfile.dev b/Procfile.dev new file mode 100644 index 00000000..d6109401 --- /dev/null +++ b/Procfile.dev @@ -0,0 +1,2 @@ +web: rails server -b 0.0.0.0 -p 5000 -e development +sidekiq: bundle exec sidekiq -C config/sidekiq.yml diff --git a/README.md b/README.md index 78b0f7f7..facb1b03 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,146 @@ # Home Server -### Overview +[![Coverage Status](https://img.shields.io/coveralls/github/cpcwood/home-server?style=flat-square&color=sucess)](https://coveralls.io/github/cpcwood/home-server?branch=main) [![CircleCI](https://img.shields.io/circleci/build/gh/cpcwood/home-server?style=flat-square&color=sucess)](https://app.circleci.com/pipelines/github/cpcwood/home-server) [![JavaScript Style Guide](https://img.shields.io/badge/JS_code_style-standard-informational.svg?style=flat-square)](https://standardjs.com) -My home server website built with rails and hosted locally on a RPi. +## Overview -### Purpose - -General CV style website and a place to prototype new rails features I find interesting. Other learning objectives are: -- Learning network setup and security (NAT tables, firewalls, etc) -- Nginx reverse proxy -- HTTPS Certificates -- Securing Rails -- CSS and HTML +General portfolio style website and a place to prototype new rails features I find interesting. ### Technology -- Ruby 2.6.5 -- Ruby on Rails 6.0 +- Ruby on Rails & PostgreSQL +- Stimulus +- Google reCaptcha +- Twilio SMS Verification +- Email client +- Docker +- Kubernetes + +### Design + +| Public sections | Admin sections | +|- |- | +| Homepage | Login, 2FA, Password Reset | +| About me | Edit sections | +| Projects | Add resources | +| Blog | Notifications | +| Code Snippets | Website analytics | +| Gallery | Contact messages | +| Contact | | + + + +## Setup + +### Prerequisites + +The application is designed to run in a containerized workflow to allow for good runtime consistency across environments. + +Make sure [docker](https://www.docker.com/) v20.10+ is installed, clone or download the git repository, then move to the project root directory. + +### Environment + +The application is set up to have three different environments: production, development, test. + +### Development + +#### Configuration + + +##### Application + +Since the application is designed to be containerized, its configuration is passed through environment variables. + +Development environment variables are loaded from ```config/env/.env``` by docker-compose. Create the ```config/env/.env``` file from the template of required variables in [```config/env/.env.template```](/config/env/.env.template). + +#### Install Dependencies + +Build the development container images, using ```./tasks build``` + +In order for commands to run inside the application containers scripts are used instead of calling the commands directly. Scripts are run from the [`tasks`](./tasks) file and the following scripts are current provided: +- ```./tasks start``` - start the application +- ```./tasks stop``` - stop the application +- ```./tasks build``` - build the application containers +- ```./tasks exec``` - run command in application container +- ```./tasks sh``` - enter shell in application container +- ```./tasks rspec``` - rspec test suite +- ```./tasks yarn``` - yarn +- ```./tasks rails``` - rails +- ```./tasks bundle``` - bundler +- ```./tasks rubocop``` - run ruby code linter + +Then container start up scripts will install the application dependencies automatically on the first run. Updates to dependencies, such as adding a new gem, should be performed manually. + +Notes: +- Arguments added to the scripts are passed through. +- To run other commands use the ```docker-compose run``` syntax. + +#### Setup Database + +The container image [startup script](./.docker/scripts/startup-worker-dev) will automatically create and seed the database on start. + +#### Start the Development Server + +To start the development server using docker-compose, run: ```./tasks up``` + +The server should now be running on ```http://0.0.0.0:5000``` + +### Production +#### Build the Application Containers + +The application requires four containers to run: +- application - runs puma application server +- worker - runs sidekiq worker container +- redis - job storage +- psql - database storage + +Production containers are expected to be built and pushed to a container repository through CI, see the [CircleCI config file](./.circleci/config.yml). The [`tasks`](./tasks) file also has commands which can be used to build the production containers. + +Note: Make sure to replace the ```cpcwood``` in the container tags with your container repository username and ensure mounted paths are correct for your machine. + +#### Deploy + +Deploy the application using your container orchestration software, such as [kubernetes](https://kubernetes.io/) + +Since the application is designed to be containerized, its configuration is passed through environment variables. Production environment variables should be injected into the container on creation by your container orchestrator. + +Sample kubernetes configuration files can be found in [```.kube/```](.kube/). + + +## Tests + +#### Server Tests + +RSpec and Capybara are used to run unit and feature tests on the application. + +To run test suite, run ```./tasks rspec``` in the command line. + +#### Frontend Tests + +Jest is used to test the client frontend JavaScript. + +To run the test suite run ```./tasks yarn test``` in the command line. + + +## Usage + +#### Adding Personal Details and Images + +Once the application is running, head to the homepage, click on the hamburger icon, and click on login. + +Login with your seeded admin credentials. + +Click on the site settings tab and add the values or upload: +- website name +- images for the homepage tiles +- images for the header -### Progress -Complete: -- Setting up RPi -- Set up puma -- Setting up nginx -- Setting up port fowarding +## Contributing -In progress: -- Database -- HTTPS (SSL Certificates Lets Encrpyt) -- CI -- Develop app -- Puma manager to auto restart app upon reboot +Any pull requests are welcome. If you have a question or find a bug, create a GitHub issue. -### How to install -- Ruby -- Bundler -- Run bundle -- NodeJS -- Yarn -- Run yarn -- Install nginx reverse proxy repo -- rails assets:precompile -- rails s +## LICENSE +This software is distributed under the MIT license. diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js index 59181933..ac907b36 100644 --- a/app/assets/config/manifest.js +++ b/app/assets/config/manifest.js @@ -1,2 +1 @@ //= link_tree ../images -//= link_directory ../stylesheets .css diff --git a/app/assets/images/default_images/default_cover_image.jpg b/app/assets/images/default_images/default_cover_image.jpg new file mode 100644 index 00000000..0bf8d09c Binary files /dev/null and b/app/assets/images/default_images/default_cover_image.jpg differ diff --git a/app/assets/images/default_images/default_header_image.jpg b/app/assets/images/default_images/default_header_image.jpg new file mode 100644 index 00000000..9036d779 Binary files /dev/null and b/app/assets/images/default_images/default_header_image.jpg differ diff --git a/app/assets/images/default_images/image_not_found.png b/app/assets/images/default_images/image_not_found.png new file mode 100644 index 00000000..da8012f2 Binary files /dev/null and b/app/assets/images/default_images/image_not_found.png differ diff --git a/app/assets/images/favicon.svg b/app/assets/images/favicon.svg new file mode 100644 index 00000000..f1c53872 --- /dev/null +++ b/app/assets/images/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/icons/drag-icon.svg b/app/assets/images/icons/drag-icon.svg new file mode 100644 index 00000000..930cb59d --- /dev/null +++ b/app/assets/images/icons/drag-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/icons/external-link.svg b/app/assets/images/icons/external-link.svg new file mode 100644 index 00000000..039903d3 --- /dev/null +++ b/app/assets/images/icons/external-link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/icons/github-icon.svg b/app/assets/images/icons/github-icon.svg new file mode 100644 index 00000000..e29a6070 --- /dev/null +++ b/app/assets/images/icons/github-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/icons/grid-icon.svg b/app/assets/images/icons/grid-icon.svg new file mode 100644 index 00000000..16b4892a --- /dev/null +++ b/app/assets/images/icons/grid-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/icons/linkedin-icon-black.svg b/app/assets/images/icons/linkedin-icon-black.svg new file mode 100644 index 00000000..f30f6a24 --- /dev/null +++ b/app/assets/images/icons/linkedin-icon-black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/icons/linkedin-icon.svg b/app/assets/images/icons/linkedin-icon.svg new file mode 100644 index 00000000..df06c0b8 --- /dev/null +++ b/app/assets/images/icons/linkedin-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/site-logo.jpg b/app/assets/images/site-logo.jpg new file mode 100644 index 00000000..69ae7837 Binary files /dev/null and b/app/assets/images/site-logo.jpg differ diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css deleted file mode 100644 index d05ea0f5..00000000 --- a/app/assets/stylesheets/application.css +++ /dev/null @@ -1,15 +0,0 @@ -/* - * This is a manifest file that'll be compiled into application.css, which will include all the files - * listed below. - * - * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's - * vendor/assets/stylesheets directory can be referenced here using a relative path. - * - * You're free to add application-wide styles to this file and they'll appear at the bottom of the - * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS - * files in this directory. Styles in this file should be added after the last require_* statement. - * It is generally better to create a new file per style scope. - * - *= require_tree . - *= require_self - */ diff --git a/app/assets/stylesheets/homepage.scss b/app/assets/stylesheets/homepage.scss deleted file mode 100644 index 5a265fe7..00000000 --- a/app/assets/stylesheets/homepage.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the homepage controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: https://sass-lang.com/ diff --git a/app/controllers/abouts_controller.rb b/app/controllers/abouts_controller.rb new file mode 100644 index 00000000..5a20b0c6 --- /dev/null +++ b/app/controllers/abouts_controller.rb @@ -0,0 +1,5 @@ +class AboutsController < ApplicationController + def show + @about = About.first + end +end \ No newline at end of file diff --git a/app/controllers/admin/abouts_controller.rb b/app/controllers/admin/abouts_controller.rb new file mode 100644 index 00000000..29a57bc7 --- /dev/null +++ b/app/controllers/admin/abouts_controller.rb @@ -0,0 +1,65 @@ +module Admin + class AboutsController < AdminBaseController + before_action :assign_abouts + + def edit + render layout: 'layouts/admin_dashboard' + end + + def update + @notices = [] + flash[:alert] = [] + + begin + update_about + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + if flash[:alert].any? + render(partial: 'admin/abouts/edit_form', + status: :unprocessable_entity, + locals: { + about: @about + }) + flash[:alert] = nil + else + redirect_to(edit_admin_about_path, notice: @notices) + end + end + + private + + def assign_abouts + @about = About.first + end + + def permitted_params + params.require(:about).permit( + :section_title, + :about_me, + :linkedin_link, + :github_link, + :name, + :location, + :contact_email, + profile_image_attributes: [:id, :image_file, :_destroy]) + end + + def update_about + if @about.update(permitted_params) + update_messages + else + flash[:alert].push(@about.errors.messages.to_a.flatten.last) + end + end + + def update_messages + @notices += @about.change_messages + return unless permitted_params[:profile_image_attributes] + @notices.push('Profile image removed') if permitted_params[:profile_image_attributes][:_destroy] == '1' + end + end +end \ No newline at end of file diff --git a/app/controllers/admin/admin_base_controller.rb b/app/controllers/admin/admin_base_controller.rb new file mode 100644 index 00000000..86d29e88 --- /dev/null +++ b/app/controllers/admin/admin_base_controller.rb @@ -0,0 +1,5 @@ +module Admin + class AdminBaseController < ApplicationController + before_action :check_admin_logged_in + end +end \ No newline at end of file diff --git a/app/controllers/admin/code_snippets_controller.rb b/app/controllers/admin/code_snippets_controller.rb new file mode 100644 index 00000000..4b009dbf --- /dev/null +++ b/app/controllers/admin/code_snippets_controller.rb @@ -0,0 +1,105 @@ +module Admin + class CodeSnippetsController < ApplicationController + def new + @code_snippet = CodeSnippet.new + render layout: 'layouts/admin_dashboard' + end + + def edit + @code_snippet = find_model + return redirect_to(code_snippets_path, alert: 'Code snippet not found') unless @code_snippet + render layout: 'layouts/admin_dashboard' + end + + def create + @notices = [] + flash.now[:alert] = [] + + begin + @code_snippet = @user.code_snippets.new + update_model(model: @code_snippet, success_message: 'Code snippet created') + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + if flash[:alert].any? + render(:new, + layout: 'layouts/admin_dashboard', + status: :unprocessable_entity) + flash.now[:alert] = nil + else + redirect_to(code_snippets_path, notice: @notices) + end + end + + def update + @notices = [] + flash.now[:alert] = [] + + begin + @code_snippet = find_model + return redirect_to(code_snippets_path, alert: 'Code snippet not found') unless @code_snippet + + update_model(model: @code_snippet, success_message: 'Code snippet updated') + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + if flash[:alert].any? + render(:edit, + layout: 'layouts/admin_dashboard', + status: :unprocessable_entity) + flash.now[:alert] = nil + else + redirect_to(code_snippet_path(@code_snippet), notice: @notices) + end + end + + def destroy + @notices = [] + flash[:alert] = [] + + begin + @code_snippet = find_model + return redirect_to(code_snippets_path, alert: 'Code snippet not found') unless @code_snippet + @code_snippet.destroy + @notices.push('Code snippet removed') + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + redirect_to(code_snippets_path, notice: @notices, alert: flash[:alert]) + end + + private + + def permitted_params + params + .require(:code_snippet) + .permit( + :title, + :overview, + :snippet, + :extension, + :text) + end + + def find_model + CodeSnippet.find_by(id: params[:id]) + end + + def update_model(model:, success_message:) + if model.update(permitted_params) + @notices.push(success_message) + else + flash[:alert].push(model.errors.messages.to_a.flatten.last) + end + end + end +end \ No newline at end of file diff --git a/app/controllers/admin/cover_images_controller.rb b/app/controllers/admin/cover_images_controller.rb new file mode 100644 index 00000000..77807cb9 --- /dev/null +++ b/app/controllers/admin/cover_images_controller.rb @@ -0,0 +1,30 @@ +module Admin + class CoverImagesController < ImagesController + def update + @notices = [] + @alerts = [] + begin + @image = CoverImage.find_by(id: params[:id]) + update_image + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + @alerts.push('Sorry, something went wrong!') + @alerts.push(e.message) + end + redirect_to(admin_images_path, notice: @notices, alert: @alerts) + end + + private + + def permitted_params + params.require(:cover_image).permit( + :x_loc, + :y_loc, + :image_file) + end + + def reset_params + params.require(:attachment).permit(:reset) + end + end +end \ No newline at end of file diff --git a/app/controllers/admin/gallery_images_controller.rb b/app/controllers/admin/gallery_images_controller.rb new file mode 100644 index 00000000..fdf1bdad --- /dev/null +++ b/app/controllers/admin/gallery_images_controller.rb @@ -0,0 +1,110 @@ +module Admin + class GalleryImagesController < AdminBaseController + def index + @gallery_images = GalleryImage.order(date_taken: :desc, id: :desc) + render layout: 'layouts/admin_dashboard' + end + + def new + @gallery_image = GalleryImage.new + render layout: 'layouts/admin_dashboard' + end + + def edit + @gallery_image = find_model + return redirect_to(admin_gallery_images_path, alert: 'Gallery image not found') unless @gallery_image + + render layout: 'layouts/admin_dashboard' + end + + def create + @notices = [] + flash[:alert] = [] + + begin + @gallery_image = @user.gallery_images.new + update_model(model: @gallery_image, success_message: 'Gallery image created') + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + if flash[:alert].any? + render(:new, + layout: 'layouts/admin_dashboard', + status: :unprocessable_entity) + flash[:alert] = nil + else + redirect_to(admin_gallery_images_path, notice: @notices) + end + end + + def update + @notices = [] + flash[:alert] = [] + + begin + @gallery_image = find_model + return redirect_to(admin_gallery_images_path, alert: 'Gallery image not found') unless @gallery_image + + update_model(model: @gallery_image, success_message: 'Gallery image updated') + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + if flash[:alert].any? + render(:edit, + layout: 'layouts/admin_dashboard', + status: :unprocessable_entity) + flash[:alert] = nil + else + redirect_to(admin_gallery_images_path, notice: @notices) + end + end + + def destroy + @notices = [] + flash[:alert] = [] + + begin + @gallery_image = find_model + return redirect_to(admin_gallery_images_path, alert: 'Gallery image not found') unless @gallery_image + + @gallery_image.destroy + @notices.push('Gallery image removed') + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + redirect_to(admin_gallery_images_path, notice: @notices, alert: flash[:alert]) + end + + private + + def permitted_params + params.require(:gallery_image).permit( + :image_file, + :title, + :date_taken, + :latitude, + :longitude) + end + + def update_model(model:, success_message:) + if model.update(permitted_params) + @notices.push(success_message) + else + flash[:alert].push(model.errors.messages.to_a.flatten.last) + end + end + + def find_model + GalleryImage.find_by(id: params[:id]) + end + end +end diff --git a/app/controllers/admin/header_images_controller.rb b/app/controllers/admin/header_images_controller.rb new file mode 100644 index 00000000..3070dc46 --- /dev/null +++ b/app/controllers/admin/header_images_controller.rb @@ -0,0 +1,30 @@ +module Admin + class HeaderImagesController < ImagesController + def update + @notices = [] + @alerts = [] + begin + @image = HeaderImage.find_by(id: params[:id]) + update_image + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + @alerts.push('Sorry, something went wrong!') + @alerts.push(e.message) + end + redirect_to(admin_images_path, notice: @notices, alert: @alerts) + end + + private + + def permitted_params + params.require(:header_image).permit( + :x_loc, + :y_loc, + :image_file) + end + + def reset_params + params.require(:attachment).permit(:reset) + end + end +end \ No newline at end of file diff --git a/app/controllers/admin/images_controller.rb b/app/controllers/admin/images_controller.rb new file mode 100644 index 00000000..79a78459 --- /dev/null +++ b/app/controllers/admin/images_controller.rb @@ -0,0 +1,30 @@ +module Admin + class ImagesController < AdminBaseController + def index + @images = [@site_settings.header_image] + @site_settings.cover_images + render layout: 'layouts/admin_dashboard' + end + + private + + def update_image + return @alerts.push('Image not found') unless @image + return if image_reset? + return if image_updated? + @alerts.push(@image.errors.messages.to_a.flatten.last) + end + + def image_reset? + return false unless reset_params[:reset] == '1' + @image.reset_to_default + @notices.push("#{@image.description.humanize} reset!") + true + end + + def image_updated? + return false unless @image.update(permitted_params) + @notices += @image.change_messages + true + end + end +end \ No newline at end of file diff --git a/app/controllers/admin/posts_controller.rb b/app/controllers/admin/posts_controller.rb new file mode 100644 index 00000000..2ea2982d --- /dev/null +++ b/app/controllers/admin/posts_controller.rb @@ -0,0 +1,131 @@ +module Admin + class PostsController < AdminBaseController + def new + @post = Post.new + render layout: 'layouts/admin_dashboard' + end + + def edit + @post = find_post + return redirect_to(posts_path, alert: 'Post not found') unless @post + render layout: 'layouts/admin_dashboard' + end + + def create + @notices = [] + flash[:alert] = [] + + begin + @post = @user.posts.new + update_post(post: @post, success_message: 'Blog post created') + update_post_sections(post: @post) + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + if flash[:alert].any? + render(:new, + layout: 'layouts/admin_dashboard', + status: :unprocessable_entity) + flash[:alert] = nil + else + redirect_to(post_path(@post), notice: @notices) + end + end + + def update + @notices = [] + flash[:alert] = [] + + begin + @post = find_post + return redirect_to(posts_path, alert: 'Post not found') unless @post + update_post(post: @post, success_message: 'Blog post updated') + update_post_sections(post: @post) + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + if flash[:alert].any? + render(:edit, + layout: 'layouts/admin_dashboard', + status: :unprocessable_entity) + flash[:alert] = nil + else + redirect_to(post_path(@post), notice: @notices) + end + end + + def destroy + @notices = [] + flash[:alert] = [] + + begin + @post = find_post + return redirect_to(posts_path, alert: 'Post not found') unless @post + @post.destroy + @notices.push('Blog post removed') + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + redirect_to(posts_path, notice: @notices, alert: flash[:alert]) + end + + private + + def post_params + params + .require(:post) + .permit( + :title, + :overview, + :date_published, + :visible) + end + + def post_section_params + permitted_params = params + .require(:post) + .permit( + post_sections_attributes: [ + :id, + :_destroy, + :text, + :order, + { post_section_image_attributes: [ + :id, + :_destroy, + :image_file, + :title + ] } + ]) + permitted_params[:post_sections_attributes].each_value do |post_section| + post_section.delete(:post_section_image_attributes) if post_section[:post_section_image_attributes]&.values&.all?(&:blank?) + end + permitted_params + end + + def find_post + Post.includes(post_sections: [:post_section_image]).find_by(id: params[:id]) + end + + def update_post(post:, success_message:) + if post.update(post_params) + @notices.push(success_message) + else + flash[:alert].push(post.errors.messages.to_a.flatten.last) + end + end + + def update_post_sections(post:) + post.update(post_section_params) + end + end +end diff --git a/app/controllers/admin/projects_controller.rb b/app/controllers/admin/projects_controller.rb new file mode 100644 index 00000000..e89c22fa --- /dev/null +++ b/app/controllers/admin/projects_controller.rb @@ -0,0 +1,160 @@ +module Admin + class ProjectsController < AdminBaseController + def new + @project = Project.new + render layout: 'layouts/admin_dashboard' + end + + def edit + @project = find_model + return redirect_to(projects_path, alert: 'Project not found') unless @project + render layout: 'layouts/admin_dashboard' + end + + def create + @notices = [] + flash[:alert] = [] + + begin + Project.transaction do + @project = Project.new(project_params) + + update_model(model: @project, success_message: 'Project created') + create_project_images(project: @project) + end + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + if flash[:alert].any? + render(:new, + layout: 'layouts/admin_dashboard', + status: :unprocessable_entity) + flash[:alert] = nil + else + redirect_to(projects_path, notice: @notices) + end + end + + def update + @notices = [] + flash[:alert] = [] + + begin + @project = find_model + return redirect_to(projects_path, alert: 'Project not found') unless @project + + Project.transaction do + if render_code_snippet + update_model(model: @project, success_message: 'Project updated') + create_project_images(project: @project) + end + end + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE:") + e.backtrace.each do |loc| + logger.error(loc) + end + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + if flash[:alert].any? + @project = Project.new(project_params) + render(:edit, + layout: 'layouts/admin_dashboard', + status: :unprocessable_entity) + flash[:alert] = nil + else + redirect_to(projects_path, notice: @notices) + end + end + + def destroy + @notices = [] + flash[:alert] = [] + + begin + @project = find_model + return redirect_to(projects_path, alert: 'Project not found') unless @project + + @project.destroy + @notices.push('Project removed') + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + redirect_to(projects_path, notice: @notices, alert: flash[:alert]) + end + + private + + def project_params + params + .require(:project) + .permit( + :title, + :overview, + :date, + :github_link, + :site_link, + project_images_attributes: [:id, :image_file, :_destroy, :title, :order]) + end + + def snippet_params + params + .require(:snippet) + .permit( + :snippet, + :extension) + end + + def new_project_images_params + params + .require(:new_project_images) + .permit( + image_files: []) + end + + def find_model + Project.find_by(id: params[:id]) + end + + def update_model(model:, success_message:) + if model.update(project_params) + @notices.push(success_message) + else + flash[:alert].push(model.errors.messages.to_a.flatten.last) + end + end + + def create_project_images(project:) + return unless params.dig(:new_project_images, :image_files) + + new_project_images_params[:image_files].compact_blank.each do |image_param| + next if ProjectImage.create(image_file: image_param, project: project) + flash[:alert].push('Image upload error') + raise(ActiveRecord::Rollback, 'Image upload error') + end + end + + def render_code_snippet + snippet = params.dig(:snippet, :snippet) + extension = params.dig(:snippet, :extension) + return true unless snippet && extension + return true unless snippet.length > 0 && extension.length > 0 + + if @project.render_code_snippet(**snippet_params.to_h.symbolize_keys) + @notices.push('Code snippet rendered') + true + else + flash[:alert].push('Code snippet invalid') + false + end + end + end +end \ No newline at end of file diff --git a/app/controllers/admin/site_settings_controller.rb b/app/controllers/admin/site_settings_controller.rb new file mode 100644 index 00000000..893f3266 --- /dev/null +++ b/app/controllers/admin/site_settings_controller.rb @@ -0,0 +1,47 @@ +module Admin + class SiteSettingsController < AdminBaseController + def index + render layout: 'layouts/admin_dashboard' + end + + def update + @notices = [] + flash[:alert] = [] + + begin + update_settings + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + flash[:alert].push(e.message) + end + + if flash[:alert].any? + render(partial: 'admin/site_settings/edit_form', + status: :unprocessable_entity, + locals: { site_settings: @site_settings }) + flash[:alert] = nil + else + redirect_to(admin_site_settings_path, notice: @notices) + end + end + + private + + def permitted_params + params.require(:site_setting).permit( + :name, + :header_text, + :subtitle_text, + :typed_header_enabled) + end + + def update_settings + if @site_settings.update(permitted_params) + @notices += @site_settings.change_messages + else + flash[:alert].push(@site_settings.errors.messages.to_a.flatten.last) + end + end + end +end \ No newline at end of file diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb new file mode 100644 index 00000000..47f0e455 --- /dev/null +++ b/app/controllers/admin/users_controller.rb @@ -0,0 +1,62 @@ +module Admin + class UsersController < AdminBaseController + def edit + render layout: 'layouts/admin_dashboard' + end + + def update + return redirect_to(edit_admin_user_path(@user), alert: 'Enter current password to update details') unless verify_current_password + @notices = [] + @alerts = [] + update_section(username_update_params, 'Username') + update_section(email_update_params, 'Email address') + update_section(password_update_params, 'Password') + update_section(mobile_number_update_params, 'Mobile number') + redirect_to(edit_admin_user_path(@user), notice: @notices, alert: @alerts) + end + + private + + def verify_current_password + current_password = current_password_params[:password] + @user.authenticate(current_password) + end + + def update_section(permitted_params, section_name) + update_message(@user.update(permitted_params), section_name) if update_required?(permitted_params) + end + + def update_required?(permitted_params) + permitted_params.values.any?(&:present?) + end + + def update_message(result, section_name) + if result + @notices.push("#{section_name} updated!") + else + @alerts.push(@user.errors.messages.to_a.flatten.last) + @user.reload + end + end + + def current_password_params + params.require(:current_password).permit(:password) + end + + def username_update_params + params.require(:username).permit(:username, :username_confirmation) + end + + def email_update_params + params.require(:email).permit(:email, :email_confirmation) + end + + def password_update_params + params.require(:password).permit(:password, :password_confirmation) + end + + def mobile_number_update_params + params.require(:mobile_number).permit(:mobile_number, :mobile_number_confirmation) + end + end +end \ No newline at end of file diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb new file mode 100644 index 00000000..32b1fd8b --- /dev/null +++ b/app/controllers/admins_controller.rb @@ -0,0 +1,21 @@ +class AdminsController < ApplicationController + before_action :check_admin_logged_in + + def general + render_dashboard + end + + def notifications + render_dashboard + end + + def analytics + render_dashboard + end + + private + + def render_dashboard + render layout: 'layouts/admin_dashboard' + end +end \ No newline at end of file diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 09705d12..9867b9e4 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,2 +1,24 @@ class ApplicationController < ActionController::Base + protect_from_forgery with: :exception + + include UserFilters + + before_action :assign_user, + :assign_site_setings + + after_action :track_action + + protected + + def track_action + ahoy.track('Ran action', request.path_parameters) + end + + private + + def assign_site_setings + @site_settings = SiteSetting.first + @header_image = @site_settings.header_image + @footer_links = About.first.footer_links + end end diff --git a/app/controllers/code_snippets_controller.rb b/app/controllers/code_snippets_controller.rb new file mode 100644 index 00000000..adbeebbd --- /dev/null +++ b/app/controllers/code_snippets_controller.rb @@ -0,0 +1,16 @@ +class CodeSnippetsController < ApplicationController + def index + @code_snippets = CodeSnippet.order(created_at: :desc) + end + + def show + @code_snippet = CodeSnippet.find_by(id: sanitize(params[:id])) + redirect_to(code_snippets_path, alert: 'Code snippet not found') unless @code_snippet + end + + private + + def sanitize(string) + ActiveRecord::Base.sanitize_sql(string) unless string.nil? + end +end \ No newline at end of file diff --git a/app/controllers/concerns/user_filters.rb b/app/controllers/concerns/user_filters.rb new file mode 100644 index 00000000..dbeb95bf --- /dev/null +++ b/app/controllers/concerns/user_filters.rb @@ -0,0 +1,13 @@ +module UserFilters + extend ActiveSupport::Concern + + private + + def check_admin_logged_in + redirect_to '/' unless @user + end + + def assign_user + @user = User.find_by(id: session[:user_id]) if session[:user_id] + end +end diff --git a/app/controllers/contact_messages_controller.rb b/app/controllers/contact_messages_controller.rb new file mode 100644 index 00000000..d3243102 --- /dev/null +++ b/app/controllers/contact_messages_controller.rb @@ -0,0 +1,57 @@ +class ContactMessagesController < ApplicationController + def new + @contact_message = ContactMessage.new + end + + def create + @notices = [] + flash.now[:alert] = [] + + begin + create_message! + rescue StandardError => e + logger.error("RESCUE: #{caller_locations.first}\nERROR: #{e}\nTRACE: #{e.backtrace.first}") + flash[:alert].push('Sorry, something went wrong!') + end + + if flash[:alert].any? + render(partial: 'contact_messages/new_form', + status: :unprocessable_entity, + locals: { + contact_message: @contact_message + }) + flash.now[:alert] = nil + else + redirect_to(contact_path, notice: @notices) + end + end + + private + + def permitted_params + params + .require(:contact_message) + .permit( + :from, + :email, + :subject, + :content) + end + + def create_message! + @contact_message = User.first.contact_messages.new(permitted_params) + return unless recaptcha_valid? + + if @contact_message.save + @notices.push('Message sent! You should receive a confirmation email shortly.') + else + flash[:alert].push(@contact_message.errors.messages.to_a.flatten.last) + end + end + + def recaptcha_valid? + return true if ReCaptchaService.recaptcha_valid?(params['g-recaptcha-response']) + flash[:alert].push('reCaptcha failed, please try again') + false + end +end diff --git a/app/controllers/gallery_images_controller.rb b/app/controllers/gallery_images_controller.rb new file mode 100644 index 00000000..0b089d02 --- /dev/null +++ b/app/controllers/gallery_images_controller.rb @@ -0,0 +1,18 @@ +class GalleryImagesController < ApplicationController + PAGE_SIZE = 12 + + def index + @gallery_images = GalleryImage.order(date_taken: :desc, id: :desc).includes(image_file_attachment: :blob).limit(PAGE_SIZE).offset(calc_offset) + respond_to do |format| + format.html + format.json { render json: GalleryImageSerializer.new(@gallery_images, {}).serializable_hash } + end + end + + private + + def calc_offset + page_number = params['page'].to_i + (page_number > 0) ? ((page_number - 1) * PAGE_SIZE) : 0 + end +end diff --git a/app/controllers/homepage_controller.rb b/app/controllers/homepage_controller.rb deleted file mode 100644 index 48d3f279..00000000 --- a/app/controllers/homepage_controller.rb +++ /dev/null @@ -1,3 +0,0 @@ -class HomepageController < ApplicationController - def index; end -end diff --git a/app/controllers/homepages_controller.rb b/app/controllers/homepages_controller.rb new file mode 100644 index 00000000..c25c3021 --- /dev/null +++ b/app/controllers/homepages_controller.rb @@ -0,0 +1,5 @@ +class HomepagesController < ApplicationController + def index + @cover_images = @site_settings.cover_images + end +end diff --git a/app/controllers/passwords_controller.rb b/app/controllers/passwords_controller.rb new file mode 100644 index 00000000..e8c4de97 --- /dev/null +++ b/app/controllers/passwords_controller.rb @@ -0,0 +1,41 @@ +class PasswordsController < ApplicationController + before_action :already_logged_in + + def forgotten_password; end + + def send_reset_link + return redirect_to(:forgotten_password, alert: 'reCaptcha failed, please try again') unless ReCaptchaService.recaptcha_valid?(sanitize(params['g-recaptcha-response'])) + PasswordResetJob.perform_later(email: sanitize(params[:email])) + redirect_to(:login, notice: 'If the submitted email is associated with an account, a password reset link will be sent') + end + + def reset_password + reset_token = sanitize(params[:reset_token]) || session[:reset_token] + @user = User.user_from_password_reset_token(reset_token) + return redirect_to(:login, alert: 'Password reset token expired') unless @user + session[:reset_token] = reset_token + end + + def update_password + @user = User.user_from_password_reset_token(session[:reset_token]) + return redirect_to(:login, alert: 'Password reset token expired') unless @user + return redirect_to(:reset_password, alert: @user.errors.messages.to_a.flatten.last) unless @user.update(password_params) + session[:reset_token] = nil + PasswordUpdatedJob.perform_later(user: @user) + redirect_to(:login, notice: 'Password updated') + end + + private + + def already_logged_in + redirect_to(:admin) if session[:user_id] + end + + def sanitize(string) + ActiveRecord::Base.sanitize_sql(string) unless string.nil? + end + + def password_params + params.permit(:password, :password_confirmation) + end +end \ No newline at end of file diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb new file mode 100644 index 00000000..74f54951 --- /dev/null +++ b/app/controllers/posts_controller.rb @@ -0,0 +1,20 @@ +class PostsController < ApplicationController + def index + @posts = if @user + Post.order(date_published: :desc) + else + Post.where(visible: true).order(date_published: :desc) + end + end + + def show + @post = Post.includes(post_sections: [:post_section_image]).find_by(id: sanitize(params[:id])) + redirect_to(posts_path, alert: 'Post not found') unless @post + end + + private + + def sanitize(string) + ActiveRecord::Base.sanitize_sql(string) unless string.nil? + end +end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb new file mode 100644 index 00000000..b90d447d --- /dev/null +++ b/app/controllers/projects_controller.rb @@ -0,0 +1,5 @@ +class ProjectsController < ApplicationController + def index + @projects = Project.all_with_images + end +end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb new file mode 100644 index 00000000..578d072f --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,62 @@ +class SessionsController < ApplicationController + before_action :already_logged_in + skip_before_action :already_logged_in, only: [:destroy] + + def login; end + + def new + return redirect_to(:login, alert: 'reCaptcha failed, please try again') unless ReCaptchaService.recaptcha_valid?(sanitize(params['g-recaptcha-response'])) + @user = User.find_by(email: sanitize(params[:user])) + @user ||= User.find_by(username: sanitize(params[:user])) + return redirect_to(:login, alert: 'User not found') unless @user&.authenticate(sanitize(params[:password])) + TwoFactorAuthService.start(session, @user) + return log_user_in if Rails.env.development? + redirect_to('/2fa') + end + + def send_2fa + return redirect_to(:login) unless TwoFactorAuthService.started?(session) + if TwoFactorAuthService.send_auth_code(session) + flash[:notice] = 'Please enter the 6 digit code sent to mobile number assoicated with this account' unless flash[:notice] + else + flash.now[:alert] = 'Sorry something went wrong' + end + render(:two_factor_auth) + end + + def verify_2fa + return redirect_to(:login) unless TwoFactorAuthService.started?(session) + auth_code = sanitize(params[:auth_code]) + return redirect_to('/2fa', alert: 'Verification code must be 6 digits long') unless TwoFactorAuthService.auth_code_format_valid?(auth_code) + return redirect_to('/2fa', alert: '2fa code incorrect, please try again') unless TwoFactorAuthService.auth_code_valid?(session: session, auth_code: auth_code) + log_user_in + end + + def reset_2fa + session[:auth_code_sent] = nil + redirect_to '/2fa', notice: 'Two factor authentication code resent' + end + + def destroy + reset_session + redirect_to root_path + end + + private + + def already_logged_in + redirect_to(:admin) if session[:user_id] + end + + def sanitize(string) + ActiveRecord::Base.sanitize_sql(string) unless string.nil? + end + + def log_user_in + @user = TwoFactorAuthService.get_user(session) + reset_session + session[:user_id] = @user.id + @user.record_ip(request) + redirect_to(:admin, notice: "#{@user.username} welcome back to your home-server!") + end +end \ No newline at end of file diff --git a/app/frontend/packs/application.js.erb b/app/frontend/packs/application.js.erb new file mode 100644 index 00000000..96d55ef7 --- /dev/null +++ b/app/frontend/packs/application.js.erb @@ -0,0 +1,22 @@ +import "@hotwired/turbo-rails" + +// StimulusJS +import { Application } from "@hotwired/stimulus" +import { definitionsFromContext } from "@hotwired/stimulus-webpack-helpers" +import headerScroll from "./listeners/headerScroll" + +const application = Application.start() +const context = require.context("./controllers", true, /\.js(?:.erb)?$/) +application.load(definitionsFromContext(context)) + +// Welcome Message +console.log(`Welcome to + _ _ ___ __ __ ___ ___ ___ _____ _____ ___ +| || |/ _ \\| \\/ | __|__/ __| __| _ \\ \\ / / __| _ \\ +| __ | (_) | |\\/| | _|___\\__ \\ _|| /\\ V /| _|| / +|_||_|\\___/|_| |_|___| |___/___|_|_\\ \\_/ |___|_|_\\ + +Created by Chris Wood - cpcwood.com +`) + +window.addEventListener('scroll', headerScroll, { passive: true }) diff --git a/app/frontend/packs/application.scss b/app/frontend/packs/application.scss new file mode 100644 index 00000000..b3e9440e --- /dev/null +++ b/app/frontend/packs/application.scss @@ -0,0 +1,94 @@ +/* +Sass Styles +┬ +|– application.scss +| +|– styles/ +| | +| |– base/ +| | |– _normalize.scss # Import vendor normalize.css +| | |– _fonts.scss # Import fonts +| | |– _typography.scss # Typography and header +| | |– _colors.scss # Theme colors +| | |– _mixins.scss # Sass mixins +| | |– _page.scss # General page structure +| | ┴ +| | +| |– components/ +| | |– _buttons.scss # Buttons +| | |– _messages.scss # Messages +| | |– _forms.scss # Forms +| | |– _navbar.scss # Navbar - top and side +| | |– _dashboard.scss # Dashboard +| | |– _typed_header.scss # Typed header +| | |– _toolbars.scss # Toolbars +| | |– _images.scss # Images +| | |– _markdown.scss # Markdown +| | |– _posts.scss # Posts +| | |– _cards.scss # Cards +| | |– _drag_list.scss # Draggable lists +| | |– _footer.scss # Footer +| | |– _custom_loaders.scss # Custom Loaders +| | ┴ +| | +| |– custom/ +| | |– about.scss # Custom styles for /about +| | |– gallery.scss # Custom styles for /gallery +| | |– contact.scss # Custom styles for /contact +| | |– code_snippets.scss # Custom styles for /code-snippets +| | |– overrides.scss # Overrides and dynamically added selectors +| | ┴ +| | +| |– vendor/ +| | |– hamburger.scss # Hamburger icon for navbar +| | |– normalize.css # Normalize.css https://github.com/necolas/normalize.css +| | |– loaders.scss # Animated loading icons +| | ┴ +| | +| |– themes/ +| | |– syntax_highlighting.scss # Code block syntax highlighting +| | ┴ +| | +┴ ┴ +*/ + +// Application Partials +@use 'styles/base/normalize'; +@use 'styles/base/fonts'; +@use 'styles/base/colors'; +@use 'styles/base/mixins'; +@use 'styles/base/typography'; +@use 'styles/base/page'; + +// Application Components +@use 'styles/components/buttons'; +@use 'styles/components/forms'; +@use 'styles/components/messages'; +@use 'styles/components/navbar'; +@use 'styles/components/dashboard'; +@use 'styles/components/image_tile'; +@use 'styles/components/typed_header'; +@use 'styles/components/toolbars'; +@use 'styles/components/images'; +@use 'styles/components/markdown'; +@use 'styles/components/posts'; +@use 'styles/components/cards'; +@use 'styles/components/drag_list'; +@use 'styles/components/footer'; +@use 'styles/components/custom_loaders'; + +// Custom page styles +@use 'styles/custom/about.scss'; +@use 'styles/custom/gallery.scss'; +@use 'styles/custom/contact.scss'; +@use 'styles/custom/code_snippets.scss'; + +// Site Wide Vendor +@use 'styles/vendor/loaders'; +@use 'node_modules/simplelightbox/src/simple-lightbox'; + +// Themes +@use './styles/themes/syntax_highlighting'; + +// Dynamic selectors +@use './styles/custom/overrides'; diff --git a/app/frontend/packs/controllers/blog_post_editor_controller.js b/app/frontend/packs/controllers/blog_post_editor_controller.js new file mode 100644 index 00000000..11f70396 --- /dev/null +++ b/app/frontend/packs/controllers/blog_post_editor_controller.js @@ -0,0 +1,99 @@ +import { Controller } from '@hotwired/stimulus' + +export default class extends Controller { + static values = { currentSectionsCount: Number } + + static targets = ['postSection'] + + applyOrderToItems () { + const currentPostSectionTargets = this.postSectionTargets.filter(postSection => !postSection.dataset.isDestroyed) + for (let i = 0; i < currentPostSectionTargets.length; i += 1) { + currentPostSectionTargets[i].querySelector('.item-order-position').value = i + } + } + + newPostSection (event) { + const postSectionContainer = event.target.closest('.blog-post-section') + const clonedContainer = postSectionContainer.cloneNode() + const clonedForm = postSectionContainer.querySelector('.form-fields').cloneNode(true) + + this._restorePostSectionElement(clonedContainer, clonedForm) + + const ruler = clonedForm.querySelector('.ruler') + ruler.classList.remove('hidden') + + // post_section + const textField = clonedForm.querySelector('.embedded-text-area.post') + textField.value = '' + textField.disabled = false + textField.name = `post[post_sections_attributes][${this.currentSectionsCountValue}][text]` + textField.id = `post_post_sections_attributes_${this.currentSectionsCountValue}_text` + + const orderField = clonedForm.querySelector('.item-order-position') + orderField.value = this.currentSectionsCountValue + orderField.name = `post[post_sections_attributes][${this.currentSectionsCountValue}][order]` + orderField.id = `post_post_sections_attributes_${this.currentSectionsCountValue}_order` + + const destroyField = clonedForm.querySelector('.destroy-post-section') + destroyField.value = 0 + destroyField.name = `post[post_sections_attributes][${this.currentSectionsCountValue}][_destroy]` + destroyField.id = `post_post_sections_attributes_${this.currentSectionsCountValue}_destroy` + + // post_section_image + const imageDestroyField = clonedForm.querySelector('.post-section-image-destroy-container') + const imageThumbnail = clonedForm.querySelector('.post-section-image-thumbnail-container') + if (imageDestroyField) { + imageDestroyField.remove() + } + if (imageThumbnail) { + imageThumbnail.remove() + } + + const imageFileField = clonedForm.querySelector('.post-section-image-file-field') + imageFileField.value = '' + imageFileField.name = `post[post_sections_attributes][${this.currentSectionsCountValue}][post_section_image_attributes][image_file]` + imageFileField.id = `post_post_sections_attributes_${this.currentSectionsCountValue}_post_section_image_attributes_image_file` + + const imageTitleField = clonedForm.querySelector('.post-section-image-title-field') + imageTitleField.value = '' + imageTitleField.name = `post[post_sections_attributes][${this.currentSectionsCountValue}][post_section_image_attributes][title]` + imageTitleField.id = `post_post_sections_attributes_${this.currentSectionsCountValue}_post_section_image_attributes_title` + + const imageFieldsContainer = clonedForm.querySelector('.post-section-images-fields-container') + const imagesContainer = clonedForm.querySelector('.post-section-images-container') + imagesContainer.innerHTML = '' + imagesContainer.appendChild(imageFieldsContainer) + + clonedContainer.appendChild(clonedForm) + postSectionContainer.after(clonedContainer) + this.applyOrderToItems() + this.currentSectionsCountValue += 1 + } + + destroyPostSection (event) { + const postSectionContainer = event.target.closest('.blog-post-section') + postSectionContainer.classList.add('destroy') + postSectionContainer.dataset.isDestroyed = true + postSectionContainer.querySelector('.destroy-post-section').value = 1 + + const textField = postSectionContainer.querySelector('.embedded-text-area.post') + textField.disabled = true + + this.applyOrderToItems() + } + + restorePostSection (event) { + const postSectionContainer = event.target.closest('.blog-post-section') + this._restorePostSectionElement(postSectionContainer) + + this.applyOrderToItems() + } + + _restorePostSectionElement (postSectionContainer, formFields = postSectionContainer) { + postSectionContainer.classList.remove('destroy') + postSectionContainer.removeAttribute('data-is-destroyed') + formFields.querySelector('.destroy-post-section').value = 0 + const textField = formFields.querySelector('.embedded-text-area.post') + textField.disabled = false + } +} diff --git a/app/frontend/packs/controllers/dashboard_sidebar_controller.js b/app/frontend/packs/controllers/dashboard_sidebar_controller.js new file mode 100644 index 00000000..c89bf24d --- /dev/null +++ b/app/frontend/packs/controllers/dashboard_sidebar_controller.js @@ -0,0 +1,29 @@ +import { Controller } from '@hotwired/stimulus' + +export default class extends Controller { + static targets = ['sidebar', 'sidebarToggle'] + + sidebarToggle () { + if (this.data.get('open') === 'false') { + this.openMenu() + } else { + this.closeMenu() + } + } + + openMenu () { + this.data.set('open', 'true') + this.sidebarToggleTarget.classList.add('open') + this.sidebarTarget.classList.add('open') + } + + closeMenu () { + this.data.set('open', 'false') + this.sidebarToggleTarget.classList.remove('open') + this.sidebarTarget.classList.remove('open') + } + + disconnect () { + this.closeMenu() + } +} diff --git a/app/frontend/packs/controllers/embedded_gallery_controller.js b/app/frontend/packs/controllers/embedded_gallery_controller.js new file mode 100644 index 00000000..f8f82ee0 --- /dev/null +++ b/app/frontend/packs/controllers/embedded_gallery_controller.js @@ -0,0 +1,138 @@ +import { Controller } from '@hotwired/stimulus' + +export default class extends Controller { + static targets = ['navButton', 'image', 'container'] + + connect () { + this.transitionDuration = 450 + this.fadeInNextImageTimeout = null + this.fadeInCompleteTimeout = null + this.applyBaseStylesToImages() + this.quickDisplayCurrentImage() + this.addNavButtons() + } + + next () { + const originalPosition = this.position + this.position += 1 + this.transitionToNextImage(originalPosition) + } + + prev () { + const originalPosition = this.position + this.position -= 1 + this.transitionToNextImage(originalPosition) + } + + teardown () { + this.position = 0 + if (this.fadeInNextImageTimeout) { + clearTimeout(this.fadeInNextImageTimeout) + this.fadeInNextImageTimeout = null + } + if (this.transitionCompleteTimeout) { + clearTimeout(this.transitionCompleteTimeout) + this.transitionCompleteTimeout = null + } + this.resetOtherImages() + this.quickDisplayCurrentImage() + this.hideNavButtons() + } + + disconnect () { + this.teardown() + } + + // private + + applyBaseStylesToImages () { + for (let i = 0; i < this.imageTargets.length; i += 1) { + const image = this.imageTargets[i] + image.style.transition = `opacity ${this.transitionDuration / 1000}s cubic-bezier(0.76, 0.24, 0.26, 0.99)` + image.style.opacity = '0' + image.style.display = 'block' + image.style.position = 'absolute' + } + } + + quickDisplayCurrentImage () { + const currentImage = this.imageTargets[this.position] + currentImage.style.transition = '' + currentImage.style.opacity = '1' + currentImage.style.zIndex = '1' + currentImage.style.transition = `opacity ${this.transitionDuration / 1000}s cubic-bezier(0.76, 0.24, 0.26, 0.99)` + } + + addNavButtons () { + if (this.imageTargets.length > 1) { + for (let i = 0; i < this.navButtonTargets.length; i += 1) { + const navButton = this.navButtonTargets[i] + navButton.style.display = 'flex' + } + } + } + + transitionToNextImage (originalPosition) { + if (!this.fadeInNextImageTimeout) { + if (!this.transitionCompleteTimeout) { + this.fadeOutOriginalImage(originalPosition) + } else { + this.resetOtherImages() + this.quickDisplayCurrentImage() + clearTimeout(this.transitionCompleteTimeout) + this.transitionCompleteTimeout = null + } + } + } + + fadeOutOriginalImage (originalPosition) { + const originalImage = this.imageTargets[originalPosition] + originalImage.style.opacity = '0' + originalImage.style.zIndex = null + this.fadeInNextImageTimeout = setTimeout(this.fadeInNextImage.bind(this), Math.floor(this.transitionDuration * 0.1)) + } + + fadeInNextImage () { + const nextImage = this.imageTargets[this.position] + nextImage.style.opacity = '1' + nextImage.style.zIndex = '1' + this.transitionCompleteTimeout = setTimeout(this.transitionComplete.bind(this), this.transitionDuration) + this.fadeInNextImageTimeout = null + } + + resetOtherImages () { + const currentImageId = this.position + for (let i = 0; i < this.imageTargets.length; i += 1) { + if (i !== currentImageId) { + const image = this.imageTargets[i] + image.style.transition = '' + image.style.opacity = '0' + image.style.zIndex = null + image.style.transition = `opacity ${this.transitionDuration / 1000}s cubic-bezier(0.76, 0.24, 0.26, 0.99)` + } + } + } + + transitionComplete () { + this.transitionCompleteTimeout = null + } + + hideNavButtons () { + for (let i = 0; i < this.navButtonTargets.length; i += 1) { + const navButton = this.navButtonTargets[i] + navButton.style.display = 'none' + } + } + + get position () { + let currentPosition = parseInt(this.data.get('position')) + if (currentPosition < -this.imageTargets.length || isNaN(currentPosition)) { + currentPosition = 0 + } + return (currentPosition + this.imageTargets.length) % this.imageTargets.length + } + + set position (newPosition) { + this.data.set('position', Math.abs((newPosition + this.imageTargets.length) % this.imageTargets.length)) + } +} diff --git a/app/frontend/packs/controllers/form_draggable_list_controller.js b/app/frontend/packs/controllers/form_draggable_list_controller.js new file mode 100644 index 00000000..dd86b4ef --- /dev/null +++ b/app/frontend/packs/controllers/form_draggable_list_controller.js @@ -0,0 +1,79 @@ +import { Controller } from '@hotwired/stimulus' + +export default class extends Controller { + static targets = ['dragItem'] + + dragStart (e) { + // save dragItem to state since dataTransfer not available in dragOver event and DOM manipulation temporary + this.dragItem = e.currentTarget + e.dataTransfer.effectAllowed = 'move' + this.dragItem.classList.add('dragging') + } + + dragOver (e) { + e.preventDefault() + const dropZone = e.currentTarget + if (dropZone !== this.dragItem && dropZone !== this.dragItem.nextElementSibling) { + dropZone.classList.add('drag-over') + } + e.dataTransfer.dropEffect = 'move' + } + + dragLeave (e) { + const dropZone = e.currentTarget + if (dropZone !== this.dragItem && dropZone !== this.dragItem.nextElementSibling) { + dropZone.classList.remove('drag-over') + } + } + + drop (e) { + e.stopPropagation() + const dropZone = e.currentTarget + if (dropZone !== this.dragItem && dropZone !== this.dragItem.nextElementSibling) { + const container = this.dragItem.parentNode + container.removeChild(this.dragItem) + container.insertBefore(this.dragItem, dropZone) + } + dropZone.classList.remove('drag-over') + this.dragItem.classList.remove('dragging') + this.dragItem = null + this.applyOrderToItems() + } + + moveUp (e) { + e.preventDefault() + const targetItemSelector = e.currentTarget.getAttribute('data-item-container-selector') + const targetItem = document.body.querySelector(targetItemSelector) + const listContainer = targetItem.parentElement + const sibling = targetItem.previousElementSibling + if (sibling) { + listContainer.removeChild(targetItem) + listContainer.insertBefore(targetItem, sibling) + } + this.applyOrderToItems() + } + + moveDown (e) { + e.preventDefault() + const targetItemSelector = e.currentTarget.getAttribute('data-item-container-selector') + const targetItem = document.body.querySelector(targetItemSelector) + const listContainer = targetItem.parentElement + const nextSibling = targetItem.nextElementSibling + if (nextSibling) { + listContainer.removeChild(targetItem) + const insertBeforeSibling = nextSibling.nextElementSibling + if (insertBeforeSibling) { + listContainer.insertBefore(targetItem, insertBeforeSibling) + } else { + listContainer.appendChild(targetItem) + } + } + this.applyOrderToItems() + } + + applyOrderToItems () { + for (let i = 0; i < this.dragItemTargets.length; i += 1) { + this.dragItemTargets[i].querySelector('.item-order-position').value = i + } + } +} diff --git a/app/frontend/packs/controllers/gallery_lightbox_controller.js b/app/frontend/packs/controllers/gallery_lightbox_controller.js new file mode 100644 index 00000000..168a65cc --- /dev/null +++ b/app/frontend/packs/controllers/gallery_lightbox_controller.js @@ -0,0 +1,28 @@ +import { Controller } from '@hotwired/stimulus' +import SimpleLightbox from 'simplelightbox' + +export default class extends Controller { + connect () { + this.lightbox = new SimpleLightbox(this.data.get('item-selector'), { + showCounter: false, + animationSpeed: 100, + htmlClass: false, + animationSlide: false, + history: false, + close: false, + fadeSpeed: 150, + captionClass: 'lightbox-caption' + }) + } + + reConnect () { + this.lightbox.destroy() + this.connect() + } + + disconnect () { + if (this.lightbox) { + this.lightbox.destroy() + } + } +} diff --git a/app/frontend/packs/controllers/gallery_scroll_load_controller.js b/app/frontend/packs/controllers/gallery_scroll_load_controller.js new file mode 100644 index 00000000..d39d379a --- /dev/null +++ b/app/frontend/packs/controllers/gallery_scroll_load_controller.js @@ -0,0 +1,126 @@ +import { Controller } from '@hotwired/stimulus' + +export default class extends Controller { + static values = { page: Number, apiUrl: String } + + isLoading = false + isRemainingPages = true + + connect () { + this.handleScrollBind = this.handleScroll.bind(this) + document.addEventListener('scroll', this.handleScrollBind, { capture: true, passive: true }) + } + + handleScroll () { + const isBottomVisible = (this.element.getBoundingClientRect().bottom <= window.innerHeight) + if (isBottomVisible && !this.isLoading && this.isRemainingPages && this.data.get('isGalleryRendered')) { + this.loadNextPage() + } + } + + async loadNextPage () { + this.isLoading = true + try { + this.injectLoadingIcon() + this.fetchController = new AbortController() + const response = await fetch(`${this.apiUrlValue}.json?page=${this.pageValue + 1}`, { signal: this.fetchController.signal }) + this.fetchController = null + this.pageValue = this.pageValue + 1 + const imagesData = await response.json() + const numberOfImages = imagesData.data.length + if (numberOfImages === 0) { + this.isRemainingPages = false + this.isLoading = false + this.removeLoadingIcon() + return + } + this.injectImages(imagesData) + } catch (error) { + console.error(error) + this.isLoading = false + this.fetchController = null + } + } + + injectImages (imagesData) { + this.imageLoadedCounter = 0 + this.imageLoadedTargetNumber = imagesData.data.length + this.newImageElements = [] + for (let i = 0; i < imagesData.data.length; i += 1) { + const imageData = imagesData.data[i].attributes + const imageElement = document.createElement('li') + imageElement.classList.add('gallery-image-container') + imageElement.classList.add('hidden') + imageElement.setAttribute('itemprop', 'image') + imageElement.setAttribute('itemscope', '') + imageElement.setAttribute('itemtype', 'https://schema.org/ImageObject') + imageElement.innerHTML = ` + + ${imageData.description} + + ` + this.newImageElements.push(imageElement) + this.element.insertAdjacentElement('beforeend', imageElement) + } + } + + imageLoaded () { + this.imageLoadedCounter += 1 + if (this.imageLoadedCounter === this.imageLoadedTargetNumber) { + this.displayGalleryItemTargets() + this.isLoading = false + } + } + + displayGalleryItemTargets () { + this.removeLoadingIcon() + this.element.dispatchEvent(new Event('renderGallery')) + this.element.dispatchEvent(new Event('reConnectLightbox')) + for (let i = 0; i < this.newImageElements.length; i++) { + this.newImageElements[i].classList.remove('hidden') + const imgTarget = this.newImageElements[i].querySelector('img') + imgTarget.style.transitionDelay = `${i * 0.1}s` + imgTarget.classList.add('fade-in') + } + } + + injectLoadingIcon () { + this.loadingIcon = document.createElement('div') + this.loadingIcon.classList.add('gallery-loading-icon-container') + this.loadingIcon.innerHTML = ` + + ` + this.element.insertAdjacentElement('afterend', this.loadingIcon) + } + + initializeScrollLoad () { + this.data.set('isGalleryRendered', true) + } + + removeLoadingIcon () { + if (this.loadingIcon) { + this.loadingIcon.remove() + } + } + + disconnect () { + document.removeEventListener('scroll', this.handleScrollBind, true) + if (this.fetchController) { + this.fetchController.abort() + } + this.removeLoadingIcon() + } +} diff --git a/app/frontend/packs/controllers/image_loader_controller.js b/app/frontend/packs/controllers/image_loader_controller.js new file mode 100644 index 00000000..c675c667 --- /dev/null +++ b/app/frontend/packs/controllers/image_loader_controller.js @@ -0,0 +1,55 @@ +import { Controller } from '@hotwired/stimulus' +// asd +export default class extends Controller { + static targets = ['fade', 'container'] + + connect () { + this.evaluateLoadProgress() + } + + imageLoaded () { + this.evaluateLoadProgress() + } + + evaluateLoadProgress () { + const allImagesLoaded = this.fadeTargets.every(target => { + const image = target.tagName === 'IMG' ? target : target.querySelector('img') + if (!image) { + return true + } + return image.complete && image.naturalHeight !== 0 + }) + if (allImagesLoaded) { + this.fadeInTargets() + } + } + + fadeInTargets () { + const fadeIn = () => { + window.requestAnimationFrame(() => { + for (let i = 0; i < this.fadeTargets.length; i++) { + const target = this.fadeTargets[i] + target.style.transitionDelay = `${i * 0.1}s` + target.classList.add('fade-in') + this.fadeInTimeout = null + } + }) + } + this.fadeInTimeout = setTimeout(fadeIn, 1) + } + + teardown () { + if (this.fadeInTimeout) { + clearTimeout(this.fadeInTimeout) + } + for (let i = 0; i < this.fadeTargets.length; i++) { + const target = this.fadeTargets[i] + target.classList.remove('fade-in') + target.style.transitionDelay = null + } + } + + disconnect () { + this.teardown() + } +} diff --git a/app/frontend/packs/controllers/justified_gallery_controller.js b/app/frontend/packs/controllers/justified_gallery_controller.js new file mode 100644 index 00000000..8349965b --- /dev/null +++ b/app/frontend/packs/controllers/justified_gallery_controller.js @@ -0,0 +1,79 @@ +import { Controller } from '@hotwired/stimulus' +import justifiedLayout from 'justified-layout' + +export default class extends Controller { + static targets = ['galleryItem'] + + connect () { + this.evaluateLoadProgress() + } + + evaluateLoadProgress () { + const allImagesLoaded = this.galleryItemTargets.every(img => img.complete && img.naturalHeight !== 0) + if (allImagesLoaded) { + this.displayGalleryItemTargets() + } + } + + displayGalleryItemTargets () { + const fadeIn = () => { + this.resizeObserver = new ResizeObserver(this.renderGallery.bind(this)) + this.resizeObserver.observe(this.element) + for (let i = 0; i < this.galleryItemTargets.length; i++) { + const target = this.galleryItemTargets[i] + target.style.transitionDelay = `${i * 0.1}s` + target.classList.add('fade-in') + } + this.element.dispatchEvent(new Event('galleryRendered')) + } + this.fadeInTimeout = setTimeout(fadeIn, 1) + } + + renderGallery () { + try { + const geometryInput = [] + for (let i = 0; i < this.galleryItemTargets.length; i++) { + geometryInput.push({ + width: this.galleryItemTargets[i].width, + height: this.galleryItemTargets[i].height + }) + } + const config = { + boxSpacing: { + horizontal: parseInt(this.data.get('margin')), + vertical: 0 + }, + containerWidth: this.element.clientWidth, + targetRowHeight: 295 + } + const geometry = justifiedLayout(geometryInput, config) + window.requestAnimationFrame(() => { + for (let i = 0; i < this.galleryItemTargets.length; i++) { + this.galleryItemTargets[i].width = geometry.boxes[i].width + this.galleryItemTargets[i].height = geometry.boxes[i].height + } + }) + } catch (error) { + console.log(error) + } + } + + imageLoaded () { + this.imagesLoadedCounter += 1 + this.evaluateLoadProgress() + } + + teardown () { + if (this.fadeInTimeout) { + clearTimeout(this.fadeInTimeout) + } + if (this.resizeObserver) { + this.resizeObserver.disconnect() + } + while (this.element.firstChild) { this.element.removeChild(this.element.firstChild) } + } + + disconnect () { + this.teardown() + } +} diff --git a/app/frontend/packs/controllers/nav_menu_controller.js b/app/frontend/packs/controllers/nav_menu_controller.js new file mode 100644 index 00000000..5b4d502d --- /dev/null +++ b/app/frontend/packs/controllers/nav_menu_controller.js @@ -0,0 +1,35 @@ +import { Controller } from '@hotwired/stimulus' + +export default class extends Controller { + static targets = ['navHamburger', 'navSidebar'] + + menuToggle () { + if (this.data.get('open') === 'false') { + this.openMenu() + } else { + this.closeMenu() + } + } + + openMenu () { + this.data.set('open', 'true') + this.navSidebarTarget.classList.add('sidebar-open') + this.navHamburgerTarget.classList.add('clicked') + this.navHamburgerTarget.classList.remove('reset-animation') + } + + closeMenu () { + this.data.set('open', 'false') + this.navSidebarTarget.classList.remove('sidebar-open') + this.navHamburgerTarget.classList.remove('clicked') + this.navHamburgerTarget.classList.add('reset-animation') + } + + disconnect () { + if (this.data.get('open') === 'true') { + this.data.set('open', 'false') + this.navSidebarTarget.classList.remove('sidebar-open') + this.navHamburgerTarget.classList.remove('clicked') + } + } +} diff --git a/app/frontend/packs/controllers/recaptcha_controller.js.erb b/app/frontend/packs/controllers/recaptcha_controller.js.erb new file mode 100644 index 00000000..2a6f177e --- /dev/null +++ b/app/frontend/packs/controllers/recaptcha_controller.js.erb @@ -0,0 +1,46 @@ +import { Controller } from '@hotwired/stimulus' + +export default class extends Controller { + static targets = ['container'] + + initialize () { + const siteKey = `<%= ENV['GRECAPTCHA_SITE_KEY'] %>`; + if (!window.grecaptcha) { + const reCaptchaScript = document.createElement('script') + window.reCaptchaOnload = () => { + window.grecaptcha.render(this.containerTarget, { + sitekey: siteKey, + theme: 'light', + size: 'normal' + }) + } + reCaptchaScript.src = 'https://www.google.com/recaptcha/api.js?onload=reCaptchaOnload&render=explicit' + reCaptchaScript.className = 'recaptcha-script' + document.head.appendChild(reCaptchaScript) + } else { + window.grecaptcha.render(this.containerTarget, { + sitekey: siteKey, + theme: 'light', + size: 'normal' + }) + } + } + + removeScript() { + const reCaptchaScript = document.head.querySelector('.recaptcha-script') + if (!!reCaptchaScript) { + document.head.removeChild(reCaptchaScript) + } + } + + teardown() { + this.removeScript() + if (this.containerTarget) { + this.containerTarget.innerHTML = '' + } + } + + disconnect() { + this.teardown() + } +} diff --git a/app/frontend/packs/controllers/slider_controller.js b/app/frontend/packs/controllers/slider_controller.js new file mode 100644 index 00000000..d583fb10 --- /dev/null +++ b/app/frontend/packs/controllers/slider_controller.js @@ -0,0 +1,9 @@ +import { Controller } from '@hotwired/stimulus' + +export default class extends Controller { + static targets = ['input', 'value'] + + update () { + this.valueTarget.innerHTML = this.inputTarget.value + } +} diff --git a/app/frontend/packs/controllers/touch_hover_tile_controller.js b/app/frontend/packs/controllers/touch_hover_tile_controller.js new file mode 100644 index 00000000..785d4017 --- /dev/null +++ b/app/frontend/packs/controllers/touch_hover_tile_controller.js @@ -0,0 +1,35 @@ +import { Controller } from '@hotwired/stimulus' + +export default class extends Controller { + static targets = ['coverTitle'] + + touchStart () { + this.touchTime = new Date(Date.now()) + } + + touchEnd (event) { + const diff = new Date(Date.now()) - this.touchTime + if (diff < 250) { + this.applyHoverToTarget(event) + } + } + + applyHoverToTarget (event) { + if (!this.coverTitleTarget.classList.contains('hover')) { + const otherHoverTiles = document.getElementsByClassName('hover') + for (let i = 0; i < otherHoverTiles.length; i += 1) { + otherHoverTiles[i].classList.remove('hover') + } + this.coverTitleTarget.classList.add('hover') + event.preventDefault() + } + } + + teardown () { + this.coverTitleTarget.classList.remove('hover') + } + + disconnect () { + this.teardown() + } +} diff --git a/app/frontend/packs/controllers/typed_header_controller.js b/app/frontend/packs/controllers/typed_header_controller.js new file mode 100644 index 00000000..45607b84 --- /dev/null +++ b/app/frontend/packs/controllers/typed_header_controller.js @@ -0,0 +1,64 @@ +import { Controller } from '@hotwired/stimulus' +import Typed from 'typed.js' +import Cookies from 'js-cookie' + +export default class extends Controller { + static targets = ['typedHeader', 'typedSubtitle', 'typedHeaderText', 'typedSubtitleText'] + + connect () { + const subtitleOptions = { + stringsElement: '#typed-strings-subtitle', + showCursor: false, + typeSpeed: 75, + startDelay: 600, + preStringTyped: () => { + this.typedSubtitleTarget.classList.add('typed-cursor') + this.typedHeaderTarget.classList.remove('typed-cursor') + }, + onComplete: () => { + setTimeout(() => { + this.typedSubtitleTarget.classList.remove('typed-cursor') + }, 1700) + } + } + + const headerOptions = { + stringsElement: '#typed-strings-header', + showCursor: false, + typeSpeed: 55, + startDelay: 1200, + preStringTyped: () => { + this.typedHeaderTarget.classList.add('typed-cursor') + }, + onComplete: () => { + this.typedSubtitle = new Typed('#typed-subtitle', subtitleOptions) + } + } + + const isHeaderTyped = Cookies.get('header-typed') + + if (!isHeaderTyped) { + this.typedHeader = new Typed('#typed-header', headerOptions) + } else { + this.setHeader() + } + + Cookies.set('header-typed', 'true', { expires: 0.02 }) + } + + disconnect () { + if (this.typedSubtitle) { + this.typedSubtitle.destroy() + this.typedSubtitleTarget.classList.remove('typed-cursor') + } + if (this.typedHeader) { + this.typedHeader.destroy() + this.typedHeaderTarget.classList.remove('typed-cursor') + } + } + + setHeader () { + this.typedHeaderTarget.textContent = this.typedHeaderTextTarget.textContent + this.typedSubtitleTarget.textContent = this.typedSubtitleTextTarget.textContent + } +} diff --git a/app/frontend/packs/listeners/headerScroll.js b/app/frontend/packs/listeners/headerScroll.js new file mode 100644 index 00000000..5dfb4967 --- /dev/null +++ b/app/frontend/packs/listeners/headerScroll.js @@ -0,0 +1,31 @@ +const headerScroll = () => { + const headerScrollContainer = document.getElementById('header-scroll') + const headerImage = document.getElementById('header-image') + const navImage = document.getElementById('nav-image') + + const baseImageHeight = parseInt(headerScrollContainer.getAttribute('data-header-scroll-image-height')) + const baseHeaderHeight = parseInt(headerScrollContainer.getAttribute('data-header-scroll-header-height')) + + const scrollTop = window.pageYOffset || document.documentElement.scrollTop + + let parallaxOffset + let headerBottomOffset + let navTopOffset + + if (scrollTop < (baseImageHeight - baseHeaderHeight)) { + parallaxOffset = scrollTop / 3.5 + headerBottomOffset = `${-parallaxOffset}px` + navTopOffset = `${-(scrollTop - parallaxOffset)}px` + } else { + parallaxOffset = (baseImageHeight - baseHeaderHeight) / 3.5 + headerBottomOffset = `${-parallaxOffset}px` + navTopOffset = `${-((baseImageHeight - baseHeaderHeight) - parallaxOffset)}px` + } + + window.requestAnimationFrame(() => { + headerImage.style.bottom = headerBottomOffset + navImage.style.top = navTopOffset + }) +} + +export default headerScroll diff --git a/app/frontend/packs/styles/base/_colors.scss b/app/frontend/packs/styles/base/_colors.scss new file mode 100644 index 00000000..8cf5d82b --- /dev/null +++ b/app/frontend/packs/styles/base/_colors.scss @@ -0,0 +1,37 @@ +// site +$dark: rgb(0, 0, 0); +$light: rgb(255, 255, 255); +$dark-dark: rgb(89, 89, 89); +$medium-dark: rgb(110, 110, 110); +$light-dark: rgb(150, 150, 150); +$medium-light: rgb(211, 211, 211); + +// font +$general-font: $dark; +$darker-font: rgb(17, 23, 50); +$heading-font: rgb(50, 55, 60); +$inverse-font: rgb(240, 240, 240); +$link-color: rgb(0, 69, 139); + +$alerts: rgb(255, 0, 0); +$notices: rgb(0, 90, 0); + +$background-color: $light; +$background-dark: rgb(8, 8, 8); + +$box-border-color: rgb(204, 204, 204); +$box-border-light: rgb(230, 230, 230); +$box-highlight: $box-border-light; + +$sidebar-background: rgb(34, 37, 42); +$sidebar-highlight: rgb(15, 16, 19); +$sidebar-text-unselected: rgb(151, 156, 172); +$sidebar-text: $medium-light; + +$form-separator: rgb(160, 160, 160); +$form-slider: $medium-light; +$form-slider-thumb: rgb(76, 175, 80); + +$nav-button-hover: rgb(94, 94, 94); + +$theme-color: rgb(75, 149, 152); diff --git a/app/frontend/packs/styles/base/_fonts.scss b/app/frontend/packs/styles/base/_fonts.scss new file mode 100644 index 00000000..0007e953 --- /dev/null +++ b/app/frontend/packs/styles/base/_fonts.scss @@ -0,0 +1,485 @@ +/* stylelint-disable */ +/* roboto-slab-100 - latin */ +@font-face { + font-family: 'Roboto Slab'; + font-style: normal; + font-weight: 100; + src: url('../fonts/roboto-slab-v12-latin-100.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/roboto-slab-v12-latin-100.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-slab-v12-latin-100.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-100.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-100.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-slab-v12-latin-100.svg#RobotoSlab') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-slab-200 - latin */ +@font-face { + font-family: 'Roboto Slab'; + font-style: normal; + font-weight: 200; + src: url('../fonts/roboto-slab-v12-latin-200.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/roboto-slab-v12-latin-200.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-slab-v12-latin-200.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-200.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-200.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-slab-v12-latin-200.svg#RobotoSlab') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-slab-300 - latin */ +@font-face { + font-family: 'Roboto Slab'; + font-style: normal; + font-weight: 300; + src: url('../fonts/roboto-slab-v12-latin-300.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/roboto-slab-v12-latin-300.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-slab-v12-latin-300.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-300.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-300.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-slab-v12-latin-300.svg#RobotoSlab') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-slab-regular - latin */ +@font-face { + font-family: 'Roboto Slab'; + font-style: normal; + font-weight: 400; + src: url('../fonts/roboto-slab-v12-latin-regular.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/roboto-slab-v12-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-slab-v12-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-regular.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-slab-v12-latin-regular.svg#RobotoSlab') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-slab-500 - latin */ +@font-face { + font-family: 'Roboto Slab'; + font-style: normal; + font-weight: 500; + src: url('../fonts/roboto-slab-v12-latin-500.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/roboto-slab-v12-latin-500.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-slab-v12-latin-500.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-500.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-500.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-slab-v12-latin-500.svg#RobotoSlab') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-slab-600 - latin */ +@font-face { + font-family: 'Roboto Slab'; + font-style: normal; + font-weight: 600; + src: url('../fonts/roboto-slab-v12-latin-600.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/roboto-slab-v12-latin-600.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-slab-v12-latin-600.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-600.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-600.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-slab-v12-latin-600.svg#RobotoSlab') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-slab-700 - latin */ +@font-face { + font-family: 'Roboto Slab'; + font-style: normal; + font-weight: 700; + src: url('../fonts/roboto-slab-v12-latin-700.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/roboto-slab-v12-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-slab-v12-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-700.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-slab-v12-latin-700.svg#RobotoSlab') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-slab-800 - latin */ +@font-face { + font-family: 'Roboto Slab'; + font-style: normal; + font-weight: 800; + src: url('../fonts/roboto-slab-v12-latin-800.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/roboto-slab-v12-latin-800.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-slab-v12-latin-800.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-800.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-800.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-slab-v12-latin-800.svg#RobotoSlab') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-slab-900 - latin */ +@font-face { + font-family: 'Roboto Slab'; + font-style: normal; + font-weight: 900; + src: url('../fonts/roboto-slab-v12-latin-900.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/roboto-slab-v12-latin-900.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-slab-v12-latin-900.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-900.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-slab-v12-latin-900.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-slab-v12-latin-900.svg#RobotoSlab') format('svg'); /* Legacy iOS */ + font-display: swap; +} + +/* roboto-100 - latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 100; + src: url('../fonts/roboto-v20-latin-100.eot'); /* IE9 Compat Modes */ + src: local('Roboto Thin'), local('Roboto-Thin'), + url('../fonts/roboto-v20-latin-100.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v20-latin-100.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v20-latin-100.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v20-latin-100.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v20-latin-100.svg#Roboto') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-100italic - latin */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 100; + src: url('../fonts/roboto-v20-latin-100italic.eot'); /* IE9 Compat Modes */ + src: local('Roboto Thin Italic'), local('Roboto-ThinItalic'), + url('../fonts/roboto-v20-latin-100italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v20-latin-100italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v20-latin-100italic.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v20-latin-100italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v20-latin-100italic.svg#Roboto') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-300 - latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: url('../fonts/roboto-v20-latin-300.eot'); /* IE9 Compat Modes */ + src: local('Roboto Light'), local('Roboto-Light'), + url('../fonts/roboto-v20-latin-300.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v20-latin-300.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v20-latin-300.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v20-latin-300.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v20-latin-300.svg#Roboto') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-300italic - latin */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 300; + src: url('../fonts/roboto-v20-latin-300italic.eot'); /* IE9 Compat Modes */ + src: local('Roboto Light Italic'), local('Roboto-LightItalic'), + url('../fonts/roboto-v20-latin-300italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v20-latin-300italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v20-latin-300italic.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v20-latin-300italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v20-latin-300italic.svg#Roboto') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-italic - latin */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 400; + src: url('../fonts/roboto-v20-latin-italic.eot'); /* IE9 Compat Modes */ + src: local('Roboto Italic'), local('Roboto-Italic'), + url('../fonts/roboto-v20-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v20-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v20-latin-italic.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v20-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v20-latin-italic.svg#Roboto') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-regular - latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: url('../fonts/roboto-v20-latin-regular.eot'); /* IE9 Compat Modes */ + src: local('Roboto'), local('Roboto-Regular'), + url('../fonts/roboto-v20-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v20-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v20-latin-regular.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v20-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v20-latin-regular.svg#Roboto') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-500 - latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: url('../fonts/roboto-v20-latin-500.eot'); /* IE9 Compat Modes */ + src: local('Roboto Medium'), local('Roboto-Medium'), + url('../fonts/roboto-v20-latin-500.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v20-latin-500.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v20-latin-500.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v20-latin-500.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v20-latin-500.svg#Roboto') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-700 - latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: url('../fonts/roboto-v20-latin-700.eot'); /* IE9 Compat Modes */ + src: local('Roboto Bold'), local('Roboto-Bold'), + url('../fonts/roboto-v20-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v20-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v20-latin-700.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v20-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v20-latin-700.svg#Roboto') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-500italic - latin */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 500; + src: url('../fonts/roboto-v20-latin-500italic.eot'); /* IE9 Compat Modes */ + src: local('Roboto Medium Italic'), local('Roboto-MediumItalic'), + url('../fonts/roboto-v20-latin-500italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v20-latin-500italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v20-latin-500italic.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v20-latin-500italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v20-latin-500italic.svg#Roboto') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-700italic - latin */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 700; + src: url('../fonts/roboto-v20-latin-700italic.eot'); /* IE9 Compat Modes */ + src: local('Roboto Bold Italic'), local('Roboto-BoldItalic'), + url('../fonts/roboto-v20-latin-700italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v20-latin-700italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v20-latin-700italic.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v20-latin-700italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v20-latin-700italic.svg#Roboto') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-900italic - latin */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 900; + src: url('../fonts/roboto-v20-latin-900italic.eot'); /* IE9 Compat Modes */ + src: local('Roboto Black Italic'), local('Roboto-BlackItalic'), + url('../fonts/roboto-v20-latin-900italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v20-latin-900italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v20-latin-900italic.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v20-latin-900italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v20-latin-900italic.svg#Roboto') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* roboto-900 - latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 900; + src: url('../fonts/roboto-v20-latin-900.eot'); /* IE9 Compat Modes */ + src: local('Roboto Black'), local('Roboto-Black'), + url('../fonts/roboto-v20-latin-900.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/roboto-v20-latin-900.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/roboto-v20-latin-900.woff') format('woff'), /* Modern Browsers */ + url('../fonts/roboto-v20-latin-900.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/roboto-v20-latin-900.svg#Roboto') format('svg'); /* Legacy iOS */ + font-display: swap; +} + +@font-face { + font-family: 'Inconsolata'; + font-style: normal; + font-weight: 400; + src: url('../fonts/inconsolata-v20-latin-regular.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/inconsolata-v20-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/inconsolata-v20-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/inconsolata-v20-latin-regular.woff') format('woff'), /* Modern Browsers */ + url('../fonts/inconsolata-v20-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/inconsolata-v20-latin-regular.svg#Inconsolata') format('svg'); /* Legacy iOS */ + font-display: swap; +} + + + +/* merriweather-sans-300 - latin */ +@font-face { + font-family: 'Merriweather Sans'; + font-style: normal; + font-weight: 300; + src: url('../fonts/merriweather-sans-v13-latin-300.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/merriweather-sans-v13-latin-300.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/merriweather-sans-v13-latin-300.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-300.woff') format('woff'), /* Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-300.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/merriweather-sans-v13-latin-300.svg#MerriweatherSans') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* merriweather-sans-regular - latin */ +@font-face { + font-family: 'Merriweather Sans'; + font-style: normal; + font-weight: 400; + src: url('../fonts/merriweather-sans-v13-latin-regular.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/merriweather-sans-v13-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/merriweather-sans-v13-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-regular.woff') format('woff'), /* Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/merriweather-sans-v13-latin-regular.svg#MerriweatherSans') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* merriweather-sans-500 - latin */ +@font-face { + font-family: 'Merriweather Sans'; + font-style: normal; + font-weight: 500; + src: url('../fonts/merriweather-sans-v13-latin-500.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/merriweather-sans-v13-latin-500.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/merriweather-sans-v13-latin-500.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-500.woff') format('woff'), /* Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-500.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/merriweather-sans-v13-latin-500.svg#MerriweatherSans') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* merriweather-sans-700 - latin */ +@font-face { + font-family: 'Merriweather Sans'; + font-style: normal; + font-weight: 700; + src: url('../fonts/merriweather-sans-v13-latin-700.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/merriweather-sans-v13-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/merriweather-sans-v13-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-700.woff') format('woff'), /* Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/merriweather-sans-v13-latin-700.svg#MerriweatherSans') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* merriweather-sans-600 - latin */ +@font-face { + font-family: 'Merriweather Sans'; + font-style: normal; + font-weight: 600; + src: url('../fonts/merriweather-sans-v13-latin-600.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/merriweather-sans-v13-latin-600.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/merriweather-sans-v13-latin-600.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-600.woff') format('woff'), /* Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-600.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/merriweather-sans-v13-latin-600.svg#MerriweatherSans') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* merriweather-sans-800 - latin */ +@font-face { + font-family: 'Merriweather Sans'; + font-style: normal; + font-weight: 800; + src: url('../fonts/merriweather-sans-v13-latin-800.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/merriweather-sans-v13-latin-800.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/merriweather-sans-v13-latin-800.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-800.woff') format('woff'), /* Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-800.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/merriweather-sans-v13-latin-800.svg#MerriweatherSans') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* merriweather-sans-300italic - latin */ +@font-face { + font-family: 'Merriweather Sans'; + font-style: italic; + font-weight: 300; + src: url('../fonts/merriweather-sans-v13-latin-300italic.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/merriweather-sans-v13-latin-300italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/merriweather-sans-v13-latin-300italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-300italic.woff') format('woff'), /* Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-300italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/merriweather-sans-v13-latin-300italic.svg#MerriweatherSans') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* merriweather-sans-italic - latin */ +@font-face { + font-family: 'Merriweather Sans'; + font-style: italic; + font-weight: 400; + src: url('../fonts/merriweather-sans-v13-latin-italic.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/merriweather-sans-v13-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/merriweather-sans-v13-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-italic.woff') format('woff'), /* Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/merriweather-sans-v13-latin-italic.svg#MerriweatherSans') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* merriweather-sans-500italic - latin */ +@font-face { + font-family: 'Merriweather Sans'; + font-style: italic; + font-weight: 500; + src: url('../fonts/merriweather-sans-v13-latin-500italic.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/merriweather-sans-v13-latin-500italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/merriweather-sans-v13-latin-500italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-500italic.woff') format('woff'), /* Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-500italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/merriweather-sans-v13-latin-500italic.svg#MerriweatherSans') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* merriweather-sans-600italic - latin */ +@font-face { + font-family: 'Merriweather Sans'; + font-style: italic; + font-weight: 600; + src: url('../fonts/merriweather-sans-v13-latin-600italic.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/merriweather-sans-v13-latin-600italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/merriweather-sans-v13-latin-600italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-600italic.woff') format('woff'), /* Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-600italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/merriweather-sans-v13-latin-600italic.svg#MerriweatherSans') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* merriweather-sans-700italic - latin */ +@font-face { + font-family: 'Merriweather Sans'; + font-style: italic; + font-weight: 700; + src: url('../fonts/merriweather-sans-v13-latin-700italic.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/merriweather-sans-v13-latin-700italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/merriweather-sans-v13-latin-700italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-700italic.woff') format('woff'), /* Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-700italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/merriweather-sans-v13-latin-700italic.svg#MerriweatherSans') format('svg'); /* Legacy iOS */ + font-display: swap; +} +/* merriweather-sans-800italic - latin */ +@font-face { + font-family: 'Merriweather Sans'; + font-style: italic; + font-weight: 800; + src: url('../fonts/merriweather-sans-v13-latin-800italic.eot'); /* IE9 Compat Modes */ + src: local(''), + url('../fonts/merriweather-sans-v13-latin-800italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/merriweather-sans-v13-latin-800italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-800italic.woff') format('woff'), /* Modern Browsers */ + url('../fonts/merriweather-sans-v13-latin-800italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('../fonts/merriweather-sans-v13-latin-800italic.svg#MerriweatherSans') format('svg'); /* Legacy iOS */ + font-display: swap; +} + +/* stylelint-enable */ + + diff --git a/app/frontend/packs/styles/base/_mixins.scss b/app/frontend/packs/styles/base/_mixins.scss new file mode 100644 index 00000000..60138086 --- /dev/null +++ b/app/frontend/packs/styles/base/_mixins.scss @@ -0,0 +1,29 @@ +@use './colors'; + +// Mobile => 766px +// Tablet 767px => 1199px +// Desktop 1100px => ~ + +$breakpoints: ( + 'mobile' : ( max-width: 766px ), + 'tablet' : ( min-width: 767px ), + 'desktop': ( min-width: 1100px ), + 'extra-wide': ( min-width: 2560px ) +); + +$reading-width: 767px; +$header-height: 60px; +$footer-height: 150px; +$footer-offset: 60px; + +@mixin respond-to($name) { + @if map-has-key($breakpoints, $name) { + @media #{inspect(map-get($breakpoints, $name))} { + @content; + } + } + @else { + @warn 'Unfortunately, no value could be retrieved from `#{$breakpoints}`. ' + + 'Please make sure it is defined in `$breakpoints` map.'; + } +} diff --git a/app/frontend/packs/styles/base/_normalize.scss b/app/frontend/packs/styles/base/_normalize.scss new file mode 100644 index 00000000..ca3412f6 --- /dev/null +++ b/app/frontend/packs/styles/base/_normalize.scss @@ -0,0 +1 @@ +@use '../vendor/normalize.css'; diff --git a/app/frontend/packs/styles/base/_page.scss b/app/frontend/packs/styles/base/_page.scss new file mode 100644 index 00000000..beab0ba8 --- /dev/null +++ b/app/frontend/packs/styles/base/_page.scss @@ -0,0 +1,167 @@ +// Modules +@use 'colors'; +@use 'mixins' as *; +@use 'typography'; + +// Styles +#background { + background-color: colors.$background-color; + bottom: 0; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: -10; +} + +.page-container { + box-sizing: border-box; + display: flex; + height: 100%; + justify-content: center; + left: 0; + min-height: 100vh; + position: relative; + top: 0; + width: 100%; +} + +.main-page-header { + margin-bottom: 10px; + position: relative; + width: 100%; + z-index: 2; +} + +.header-image { + background-color: colors.$dark; + box-shadow: 0 3px 6px 0 rgb(0, 0, 0, 0.35); + box-sizing: border-box; + height: 300px; + left: 0; + overflow: hidden; + position: absolute; + top: 0; + width: 100%; + z-index: 1; + + img { + bottom: 0; + height: 100%; + object-fit: none; + object-position: 50% 50%; + opacity: 0.6; + position: relative; + width: 100%; + z-index: inherit; + + @include respond-to(extra-wide) { + object-fit: cover; + } + } +} + +// nav .header-image { +// position: absolute; +// } + +.content-container { + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + justify-content: center; + min-height: calc(100vh - #{$header-height}); + padding-top: $header-height; + width: 100%; +} + +.content { + align-content: flex-start; + align-items: flex-start; + box-sizing: border-box; + display: flex; + flex: 1 1 100%; + flex-wrap: wrap; + justify-content: center; + max-width: 1280px; + min-height: calc(100vh - #{$header-height} - 10px - #{$footer-height} - #{$footer-offset}); + min-width: 200px; + overflow-wrap: break-word; + padding: 5px 15px 0; + width: 100%; +} + +.hidden { + display: none; +} + +.reading-pane { + font-size: 1.2em; + max-width: $reading-width; + position: relative; + width: 100%; +} + +.reading-pane-subtitle { + color: colors.$heading-font; + font-size: 0.85em; + line-height: 1em; + margin: 1.5em 0 2em; +} + +.form-pane { + font-size: 1.2em; + max-width: $reading-width; + position: relative; + width: 100%; +} + +.no-items { + margin: 10px 0; + width: 100%; +} + +.reading-footer { + margin-top: 40px; +} + +.fade-transition { + opacity: 0; + transition: opacity 0.7s cubic-bezier(0.76, 0.24, 0.26, 0.99); +} + +.ruler { + background-color: colors.$box-border-color; + border-style: none; + height: 1px; + margin-bottom: 30px; + margin-top: 30px; + width: 100%; +} + +.unstyled-list { + box-sizing: border-box; + list-style-type: none; + margin-block-end: 0; + margin-block-start: 0; + margin-inline-end: 0; + margin-inline-start: 0; + padding-inline-start: 0; +} + +.item-content { + align-content: flex-start; + align-items: flex-start; + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + justify-content: center; + overflow-wrap: break-word; + width: 100%; +} + +.flex-justified { + &.between { + justify-content: space-between; + } +} diff --git a/app/frontend/packs/styles/base/_typography.scss b/app/frontend/packs/styles/base/_typography.scss new file mode 100644 index 00000000..b262ad37 --- /dev/null +++ b/app/frontend/packs/styles/base/_typography.scss @@ -0,0 +1,139 @@ +@use 'mixins' as *; +@use 'colors'; + +$header-font: 'Roboto Slab', Fallback, sans-serif; +$general-font: 'Roboto', Fallback, sans-serif; +$code-font: 'Inconsolata', Fallback, sans-serif; +$reading-font: 'Merriweather Sans', 'Roboto', Fallback, sans-serif; + +html { + color: colors.$general-font; + font-family: $general-font; + font-size: 14px; + font-weight: 300; + letter-spacing: 0.04rem; + + @include respond-to(tablet) { + font-size: 15px; + } + @include respond-to(tablet) { + font-size: 16px; + } +} + +@mixin main-heading { + box-sizing: border-box; + color: colors.$inverse-font; + font-family: $header-font; + font-weight: 300; + margin: 0; + padding: 20px; + width: 100%; +} + +@mixin sub-header { + box-sizing: border-box; + color: colors.$heading-font; + font-family: $general-font; + font-weight: 500; + letter-spacing: 0.04rem; + line-height: initial; + padding: 0; +} + +header h1 { + @include main-heading; + font-size: 3.2em; + @include respond-to(tablet) { + font-size: 3.6em; + } + @include respond-to(desktop) { + font-size: 4.1em; + } +} + +.subtitle { + @include main-heading; + font-size: 1.8em; + line-height: initial; + padding-top: 10px; + @include respond-to(tablet) { + font-size: 2em; + padding-top: 15px; + } + @include respond-to(desktop) { + font-size: 2.3em; + } +} + +.reading-pane { + font-family: $reading-font; + letter-spacing: 0.01em; + line-height: 1.85em; + word-spacing: 0.1em; + + h1 { + @include sub-header; + font-size: 1.75em; + font-weight: 700; + margin-bottom: 0; + + @include respond-to(tablet) { + font-size: 2.25em; + } + } + + h2 { + @include sub-header; + font-size: 1.5em; + font-weight: 700; + margin: 2.5em 0 0; + + @include respond-to(tablet) { + font-size: 1.6em; + } + + + h3 { + margin-top: 1em; + } + } + + h3 { + @include sub-header; + font-size: 1.25em; + margin: 2em 0 0; + } + + h4 { + @include sub-header; + color: colors.$general-font; + font-size: 1em; + margin: 1.25em 0 0; + } + + h5 { + @include sub-header; + font-size: 1em; + margin: 0.5em 0 0.25em; + } +} + +b, +strong { + font-weight: 600; +} + +.small-font { + color: colors.$darker-font; + font-size: 0.85em; + font-weight: 300; +} + +sup { + top: -0.35em; +} + +code { + font-family: $code-font; + font-weight: 400; +} diff --git a/app/frontend/packs/styles/components/_buttons.scss b/app/frontend/packs/styles/components/_buttons.scss new file mode 100644 index 00000000..31369ba9 --- /dev/null +++ b/app/frontend/packs/styles/components/_buttons.scss @@ -0,0 +1,145 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + +@mixin highlight-button-outline { + &:active, + &:focus { + outline: none; + } +} + +.menu-button { + border: unset; + box-sizing: border-box; + cursor: pointer; + position: relative; + text-decoration: none; + user-select: none; + width: 100%; +} + +.standard-button { + background-image: linear-gradient(to bottom right, colors.$dark, colors.$medium-dark); + border: unset; + box-sizing: border-box; + color: colors.$light; + cursor: pointer; + font-family: typography.$general-font; + font-size: inherit; + font-weight: 300; + line-height: 1em; + padding: 15px 30px; + position: relative; + text-align: center; + text-decoration: none; + user-select: none; + vertical-align: middle; + white-space: nowrap; +} + +.input-submit { + align-items: center; + background-image: linear-gradient(to bottom right, colors.$dark, colors.$medium-dark); + border: unset; + box-sizing: border-box; + color: colors.$light; + cursor: pointer; + display: flex; + font-weight: 300; + height: 3em; + justify-content: center; + line-height: 1em; + min-width: 110px; + padding: 15px 25px; + position: relative; + user-select: none; +} + +.destroy-button { + margin-top: 10px; +} + +.return-button { + margin-top: 40px; +} + +.embedded-gallery-button { + @include highlight-button-outline; + align-items: center; + background: rgba(0, 0, 0, 0); + color: rgb(255, 255, 255); + cursor: pointer; + display: none; + font-size: 3rem; + height: 100%; + position: absolute; + top: 0; + user-select: none; + z-index: 2; + + .background { + bottom: 0; + left: 0; + opacity: 0; + position: absolute; + right: 0; + top: 0; + transition: opacity 0.2s ease-in-out; + } + + .nav-icon { + font-family: Arial; + opacity: 0.85; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.25); + transition: opacity 0.2s ease-in-out; + z-index: 3; + } + + &:active .nav-icon { + color: rgba(225, 225, 225); + } + + &.prev { + left: 0; + padding: 0 15px 0 11px; + + .background { + background: linear-gradient(to right, rgba(0, 0, 0, 0.125), rgba(0, 0, 0, 0.05) 50%, rgba(0, 0, 0, 0.02) 75%, rgba(0, 0, 0, 0.005) 90%, rgba(0, 0, 0, 0)); + } + } + + &.next { + padding: 0 11px 0 15px; + right: 0; + + .background { + background: linear-gradient(to left, rgba(0, 0, 0, 0.125), rgba(0, 0, 0, 0.05) 50%, rgba(0, 0, 0, 0.02) 75%, rgba(0, 0, 0, 0.005) 90%, rgba(0, 0, 0, 0)); + } + } + + &:hover { + .nav-icon { + opacity: 1; + } + + .background { + opacity: 1; + } + } +} + +.post-editor-toolbar-button { + margin-left: 30px; +} + +.section-title-link { + border: unset; + box-sizing: border-box; + color: inherit; + cursor: pointer; + position: relative; + text-decoration: none; + user-select: none; +} diff --git a/app/frontend/packs/styles/components/_cards.scss b/app/frontend/packs/styles/components/_cards.scss new file mode 100644 index 00000000..0c658fde --- /dev/null +++ b/app/frontend/packs/styles/components/_cards.scss @@ -0,0 +1,151 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + +.card-container { + box-sizing: border-box; + display: flex; + height: fit-content; + margin-bottom: 20px; + min-width: 200px; + padding: 7px; + position: relative; + width: 100%; + + @include respond-to(tablet) { + margin-bottom: 0; + max-width: 50%; + } + + @include respond-to(desktop) { + max-width: 33%; + } +} + +@mixin link-outline { + &:link, + &:visited { + color: colors.$dark; + text-decoration: none; + } + + &:focus, + &:active { + outline-offset: 2px; + } + + &:hover { + outline: none; + } +} + +.card-content { + @include link-outline; + cursor: pointer; + display: flex; + flex-direction: column; + height: auto; + position: relative; + user-select: none; + width: 100%; + + .headline { + font-size: 1.3em; + margin: 0; + padding: 10px 5px; + } +} + +.card-image { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.15); + box-sizing: border-box; + height: 200px; + overflow: hidden; + position: relative; + + img { + height: 100%; + object-fit: cover; + object-position: 0% 0%; + position: relative; + width: 100%; + } +} + +.card-overview { + color: colors.$darker-font; + flex: 1 0 auto; + font-size: 0.9em; + padding: 0 5px 10px; +} + +.embedded-gallery { + background-color: rgb(0, 0, 0); + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.15); + height: 400px; + overflow: hidden; + position: relative; + width: 100%; + + a { + height: 100%; + position: absolute; + width: 100%; + } + + img { + height: 100%; + object-fit: cover; + object-position: 0% 0%; + width: 100%; + } +} + +.wide-card-container { + color: colors.$general-font; + text-decoration: none; + + a { + @include link-outline; + } + + + .ruler { + margin-bottom: 50px; + margin-top: 10px; + } +} + +.wide-card-title-container { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 0.7em; + margin-top: 1em; + position: relative; + width: 100%; + + h1 { + flex: 1 1 100%; + margin: 0; + padding: 0; + } + + .links-container { + display: flex; + line-height: 1em; + } + + .logo-link { + img { + height: 2.2em; + width: 2.2em; + } + + + * { + margin-left: 5px; + } + } +} diff --git a/app/frontend/packs/styles/components/_custom_loaders.scss b/app/frontend/packs/styles/components/_custom_loaders.scss new file mode 100644 index 00000000..992f933b --- /dev/null +++ b/app/frontend/packs/styles/components/_custom_loaders.scss @@ -0,0 +1,94 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + +.gallery-loading-icon-container { + align-items: center; + display: flex; + height: fit-content; + justify-content: center; + margin-top: 40px; + position: relative; + width: 100%; +} + +.gallery-loading-icon { + animation: expand 0.3s forwards; + display: block; + height: 40px; + position: relative; + width: 50px; +} + +.gallery-loading-icon > .loading-element { + animation: gallery-loading-icon 0.65s linear infinite alternate; + background: #000; + border-radius: 2px; + box-sizing: border-box; + display: flex; + height: 46%; + padding: 4px; + position: absolute; + + &.large { + width: 60%; + } + + &.small { + width: 35%; + } + + > div { + background: colors.$background-color; + height: 100%; + position: relative; + width: 100%; + } +} + +.gallery-loading-icon div:nth-child(1) { + animation-delay: 0s; + left: 0; + top: 0; +} + +.gallery-loading-icon div:nth-child(2) { + animation-delay: -0.2s; + right: 0; + top: 0; +} + +.gallery-loading-icon div:nth-child(3) { + animation-delay: -0.6s; + bottom: 0; + left: 0; +} + +.gallery-loading-icon div:nth-child(4) { + animation-delay: -0.4s; + bottom: 0; + right: 0; +} +@keyframes gallery-loading-icon { + 0% { + opacity: 1; + } + + 10% { + opacity: 0.8; + } + + 100% { + opacity: 0.3; + } +} +@keyframes expand { + 0% { + transform: scale(0.8); + } + + 100% { + transform: scale(1); + } +} diff --git a/app/frontend/packs/styles/components/_dashboard.scss b/app/frontend/packs/styles/components/_dashboard.scss new file mode 100644 index 00000000..face9f49 --- /dev/null +++ b/app/frontend/packs/styles/components/_dashboard.scss @@ -0,0 +1,214 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + + +// Styles +.dashboard-container { + background-color: colors.$light; + border: 2px solid colors.$box-border-light; + box-sizing: border-box; + display: flex; + + min-height: 350px; + position: relative; + top: 10px; + width: 100%; + + h3 { + font-size: 1.5em; + font-weight: 500; + margin: 0; + padding: 25px 0; + } + + h4 { + font-size: 1.3em; + font-weight: 400; + } +} + +.dashboard-sidebar { + background-color: colors.$sidebar-background; + bottom: 0; + box-sizing: border-box; + display: flex; + flex-direction: column; + left: 0; + + max-width: 20px; + padding-bottom: 30px; + position: absolute; + top: 0; + width: 35%; + + @include respond-to(tablet) { + border-right: 2px solid colors.$box-border-light; + max-width: 300px; + min-width: 236px; + position: relative; + + .dashboard-sidebar-toggle { + display: none; + } + } + @include respond-to(desktop) { + max-width: 350px; + min-width: 240px; + } + + &.open { + display: flex; + max-width: 300px; + min-width: 150px; + z-index: 2; + + h2 { + display: block; + } + + .dashboard-button { + display: block; + } + } + + h2 { + border: unset; + box-sizing: border-box; + color: colors.$background-color; + + display: none; + font-size: 22px; + font-weight: 400; + margin: 0; + padding: 25px 10px; + position: relative; + width: 100%; + @include respond-to(tablet) { + display: block; + font-size: 30px; + padding: 25px 40px; + } + @include respond-to(desktop) { + display: block; + font-size: 34px; + padding: 25px 40px; + } + } +} + +.dashboard-button { + color: colors.$sidebar-text-unselected; + display: none; + font-size: 16px; + font-weight: 300; + padding: 10px; + transition: all 0.25s ease; + + @include respond-to(tablet) { + display: block; + font-size: 22px; + padding: 15px 40px; + } + @include respond-to(desktop) { + display: block; + font-size: 24px; + padding: 20px 40px; + } + + &:hover { + background-color: colors.$sidebar-highlight; + color: colors.$background-color; + } +} + +.dashboard-sidebar-toggle { + align-items: center; + bottom: 0; + box-sizing: border-box; + color: colors.$sidebar-text; + display: flex; + flex-direction: column; + justify-content: space-evenly; + position: absolute; + right: 0; + top: 0; + width: 20px; + + &:hover { + background-color: colors.$background-dark; + color: colors.$background-color; + cursor: pointer; + } + + div { + font-size: 16px; + font-weight: 400; + text-align: center; + } + + .tab-title { + box-sizing: border-box; + font-size: 14px; + font-weight: 300; + writing-mode: vertical-rl; + } + + .closed { + box-sizing: border-box; + } + + .open { + display: none; + } + + &.open { + background-color: colors.$sidebar-highlight; + border-left: 1px solid colors.$dark; + + .open { + display: block; + } + + .closed { + display: none; + } + } +} + +.dashboard-content { + align-content: flex-start; + align-items: center; + align-items: flex-start; + align-items: stretch; + bottom: 0; + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + margin: 0 5% 5%; + position: relative; + right: -20px; + top: 0; + width: calc(90% - 20px); + + @include respond-to(tablet) { + right: unset; + width: 90%; + } +} + +.dashboard-item-container { + box-sizing: border-box; + width: 100%; +} + +.dashboard-item-separator { + background-color: colors.$medium-dark; + border-radius: 20%; + height: 2px; + margin: 30px 0; + width: 100%; +} + + diff --git a/app/frontend/packs/styles/components/_drag_list.scss b/app/frontend/packs/styles/components/_drag_list.scss new file mode 100644 index 00000000..b7897af7 --- /dev/null +++ b/app/frontend/packs/styles/components/_drag_list.scss @@ -0,0 +1,103 @@ +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + +$drag-transition: 0.2s; + +.drag-list { + list-style-type: none; + margin-block-end: 0; + margin-block-start: 0; + margin-inline-end: 0; + margin-inline-start: 0; + padding-inline-start: 0; +} + +.draggable-item-container { + margin: 10px 0; + opacity: 1; + overflow: hidden; + position: relative; + transition: all $drag-transition ease; +} + +.drag-content { + border: colors.$medium-light solid 1px; + border-radius: 5px; + box-sizing: border-box; + cursor: pointer; + display: grid; + grid-template-areas: + 'drag image' + 'drag text'; + grid-template-columns: 22px 1fr; + grid-template-rows: 175px; + justify-content: stretch; + justify-items: stretch; + position: relative; + width: 100%; + + @include respond-to(tablet) { + grid-template-areas: 'drag image text'; + grid-template-columns: 35px fit-content(220px) auto; + } +} + +.drag-icon-container { + align-items: center; + box-sizing: border-box; + cursor: move; + display: flex; + flex-direction: column; + grid-area: drag; + justify-content: center; + margin: 5px 0 5px 5px; + user-select: none; + + > * { + color: colors.$light-dark; + } + + > * + * { + margin-top: 15px; + } + + button { + width: 100%; + } + + img { + width: 100%; + } +} + +.drag-image-container { + box-sizing: border-box; + grid-area: image; + margin: 5px; + overflow: hidden; + user-select: none; + + img { + display: block; + object-fit: cover; + width: 100%; + } +} + +.drag-text { + box-sizing: border-box; + display: flex; + flex-direction: column; + grid-area: text; + margin: 5px; + overflow: scroll; +} + +.dragging { + opacity: 0.5; +} + +.drag-over { + padding-top: 185px; +} diff --git a/app/frontend/packs/styles/components/_footer.scss b/app/frontend/packs/styles/components/_footer.scss new file mode 100644 index 00000000..ddb96bea --- /dev/null +++ b/app/frontend/packs/styles/components/_footer.scss @@ -0,0 +1,69 @@ +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + +footer { + align-content: center; + align-items: center; + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + height: $footer-height; + justify-content: center; + margin-top: $footer-offset; + position: relative; + width: 100%; +} + +.footer-links { + align-items: center; + display: flex; + justify-content: center; + position: relative; + width: 100%; + + a { + box-sizing: border-box; + height: 40px; + margin: 0 20px; + padding: 4px; + position: relative; + width: 40px; + + img { + display: block; + height: 100%; + position: relative; + width: 100%; + } + } + + a:link, + a:visited { + color: inherit; + text-decoration: none; + } + + .linkedin-link { + padding: 7px; + } +} + +.footer-text { + color: colors.$dark-dark; + font-size: 0.7em; + margin-top: 40px; + text-align: center; + width: 100%; + + a:link, + a:visited { + color: inherit; + text-decoration: none; + } + + a:hover { + color: colors.$darker-font; + text-decoration: underline; + } +} diff --git a/app/frontend/packs/styles/components/_forms.scss b/app/frontend/packs/styles/components/_forms.scss new file mode 100644 index 00000000..a3e40566 --- /dev/null +++ b/app/frontend/packs/styles/components/_forms.scss @@ -0,0 +1,465 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + +// Containers +.centered-container { + box-sizing: border-box; + display: flex; + justify-content: center; + margin: 0; + top: 50px; + width: 100%; +} + +.floating-form-container { + background-color: colors.$light; + border-radius: 10px; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.5), 0 6px 20px 0 rgba(0, 0, 0, 0.1); + box-sizing: border-box; + padding: 20px; + width: 350px; + + @include respond-to(tablet) { + padding: 30px; + width: 400px; + } + @include respond-to(desktop) { + padding: 30px; + width: 400px; + } + + .submit-right { + margin: 0; + } +} + + +// Forms +.floating-form { + color: colors.$dark; +} + + +// Input types +.input-label { + color: colors.$dark; + font-weight: 400; +} + +.input-box { + border: unset; + border-radius: 5px; + box-sizing: border-box; + height: 35px; + margin: 10px 0 0; + padding: 0 5px; + width: 100%; + + @include respond-to(tablet) { + height: 35px; + margin: 15px 0 0; + } + @include respond-to(desktop) { + height: 35px; + margin: 15px 0 0; + } + + &:focus { + outline: none; + } +} + +.input-check-box { + box-sizing: border-box; + margin: 0 0 0 5px; + position: relative; + + @include respond-to(tablet) { + margin: 0; + } + @include respond-to(desktop) { + margin: 0; + } +} + +.input-seperator { + background-color: colors.$form-separator; + border-radius: 1px; + box-sizing: border-box; + height: 2px; + margin: 10px 0; + width: 100%; + + @include respond-to(tablet) { + margin: 10px 0 30px; + } + @include respond-to(desktop) { + margin: 10px 0 30px; + } +} + +.recaptcha { + box-sizing: border-box; + display: flex; + flex-direction: row-reverse; + margin: 20px 0 0; + width: 100%; + + @include respond-to(tablet) { + margin: 30px 0 0; + } +} + +.form-entry-container { + align-items: center; + box-sizing: border-box; + display: flex; + margin: 20px 0 0; + position: relative; + width: 100%; + + @include respond-to(tablet) { + margin: 30px 0 0; + } +} + +// Option links +.options { + box-sizing: border-box; + overflow: hidden; + padding: 5px 5px 0; + width: 100%; + + &.login { + margin-top: 0; + + @include respond-to(tablet) { + margin-top: -10px; + } + } + + &.two-fa { + padding-top: 15px; + } + + .option { + background: rgba(0, 0, 0, 0); + border: unset; + color: colors.$dark; + font-weight: 300; + text-decoration: none; + + &:hover { + cursor: pointer; + } + + &.left { + float: left; + } + + &.right { + float: right; + } + } +} + +// Embedded Forms + +.embedded-entry { + margin-top: 10px; + width: 100%; +} + +.embedded-form-entry-container { + align-content: flex-start; + box-sizing: border-box; + display: flex; + flex-direction: column; + height: max-content; + justify-content: flex-start; + margin: 20px 0; + overflow: hidden; + position: relative; + width: 100%; + + @include respond-to(tablet) { + align-items: center; + flex-direction: row; + justify-content: space-between; + margin: 20px 0; + } + + &.label { + margin-bottom: 0; + + + .embedded-form-entry-container { + margin-top: 0; + } + } + + &.right { + flex-direction: row-reverse; + } +} + +.embedded-label { + box-sizing: border-box; + font-weight: 500; + height: inherit; + margin-bottom: 10px; + padding: 0; + position: relative; + width: 100%; + + @include respond-to(tablet) { + font-weight: 500; + margin: 0; + padding: 0 2% 0 0; + width: 33%; + } + + @include respond-to(desktop) { + font-weight: 500; + margin: 0; + padding: 0 2% 0 0; + width: 33%; + } +} + +.embedded-label-full-width { + box-sizing: border-box; + font-weight: 500; + margin-bottom: 10px; + padding: 0; + position: relative; + width: 100%; +} + +.inline-label { + box-sizing: border-box; + font-weight: 500; + padding-right: 10px; + width: max-content; +} + +.embedded-input-box { + border: colors.$box-border-color 1px solid; + border-radius: 0; + box-sizing: border-box; + margin: 0; + max-width: 450px; + padding: 3px; + position: relative; + width: 100%; + + @include respond-to(tablet) { + padding: 3px 10px; + width: 65%; + } + @include respond-to(desktop) { + padding: 3px 10px; + width: 65%; + } + + &:focus { + border: 1px solid colors.$theme-color; + box-shadow: inset 0 0 2px colors.$theme-color; + } + + &.full-width { + width: 100%; + } +} + +.embedded-text-area { + border: 1px solid colors.$box-border-color; + border-radius: 0; + margin: 0; + max-width: 100%; + min-height: 500px; + min-width: 100%; + padding: 3px; + + @include respond-to(tablet) { + padding: 10px 15px; + } + + &:focus { + border: 1px solid colors.$theme-color; + box-shadow: inset 0 0 2px colors.$theme-color; + } + + &.post { + min-height: 250px; + } +} + +.embedded-no-border { + border-radius: 0; + box-sizing: border-box; + margin: 0; + max-width: 450px; + padding: 3px 0; + position: relative; + width: 100%; + + @include respond-to(tablet) { + width: 65%; + } + @include respond-to(desktop) { + width: 65%; + } +} + +.embedded-current-value { + border-radius: 0; + box-sizing: border-box; + font-weight: 500; + margin: 0; + max-width: 450px; + padding: 3px 0; + position: relative; + width: 100%; + + @include respond-to(tablet) { + padding: 3px 5px; + width: 65%; + } + @include respond-to(desktop) { + padding: 3px 5px; + width: 65%; + } +} + +.embedded-full-width { + box-sizing: border-box; + height: auto; + position: relative; + width: 100%; +} + +.form-submit-container { + box-sizing: border-box; + display: flex; + flex: 0 1 auto; + flex-direction: row-reverse; + max-width: 300px; + position: relative; + width: fit-content; +} + +.input-submit:active, + +.input-submit:focus { + .loader-container { + display: flex; + } + + .button-text { + visibility: hidden; + } +} + +.embedded-input-seperator { + margin: 20px 0; + @include respond-to(tablet) { + margin: 30px 0; + } + @include respond-to(desktop) { + margin: 30px 0; + } +} + +.embedded-cover-image { + max-height: 300px; + object-fit: contain; +} + +.slider { + appearance: none; + background: colors.$form-slider; + border-radius: 6px; + box-sizing: border-box; + flex: 1 1 auto; + height: 12px; + opacity: 0.7; + outline: none; + padding: 0; + position: relative; + transition: 0.1s; + transition: opacity 0.1s; + + @include respond-to(tablet) { + max-width: 65%; + } + @include respond-to(desktop) { + max-width: 65%; + } + + &::-webkit-slider-thumb { + appearance: none; + appearance: none; + background: colors.$form-slider-thumb; + border-radius: 50%; + cursor: pointer; + height: 20px; + width: 20px; + } + + &::-moz-range-thumb { + background: colors.$form-slider-thumb; + border-radius: 50%; + cursor: pointer; + height: 20px; + width: 20px; + } +} + +.slider-value { + box-sizing: border-box; + font-weight: 300; + padding: 0 5px; + position: relative; +} + +.section-form { + padding: 20px; +} + +.submit-right { + display: flex; + flex-direction: row-reverse; + float: right; + width: fit-content; + width: 100%; +} + +.embedded-form-button-container { + box-sizing: border-box; + display: flex; + flex-direction: row-reverse; + float: right; + justify-content: space-between; + padding: 0 20px; + width: 100%; + + @include respond-to(tablet) { + flex-direction: row; + float: left; + justify-content: initial; + margin: 0 20px; + padding: 0; + width: max-content; + } + + input, + a { + margin: 0; + + @include respond-to(tablet) { + margin: 0 10px 0 0; + } + } +} diff --git a/app/frontend/packs/styles/components/_image_tile.scss b/app/frontend/packs/styles/components/_image_tile.scss new file mode 100644 index 00000000..63d3e314 --- /dev/null +++ b/app/frontend/packs/styles/components/_image_tile.scss @@ -0,0 +1,102 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + +.image-tile-container { + align-content: flex-start; + align-items: stretch; + display: flex; + flex-wrap: wrap; + position: relative; + width: 100%; +} + +// Styles +.flex-image-tile { + border: 5px solid rgba(255, 255, 255, 0); + box-sizing: border-box; + flex-grow: 1; + height: 300px; + min-width: 100%; + position: relative; + + @include respond-to(tablet) { + height: 350px; + max-width: 50%; + min-width: 50%; + } + @include respond-to(desktop) { + height: 350px; + max-width: 50%; + min-width: 50%; + } +} + +@keyframes display-item { + from {visibility: hidden;} + to {visibility: visible;} +} + +.cover-image { + height: 100%; + object-fit: cover; + object-position: 50% 50%; + opacity: 0; + position: relative; + transition: opacity 0.7s cubic-bezier(0.76, 0.24, 0.26, 0.99), + box-shadow 0.7s cubic-bezier(0.76, 0.24, 0.26, 0.99), + z-index 0.7s step-end; + width: 100%; + z-index: 2; + + &.middle-left { + object-position: 0% 50%; + } + + &.top-left { + object-position: 0% 0%; + } + + &.fade-in { + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.22); + } + + &.fade-in + a .cover-title { + animation: display-item 0.7s step-end; + animation-fill-mode: forwards; + } +} + + +.cover-title { + align-items: center; + background: rgba(0, 0, 0, 0.6); + box-sizing: border-box; + display: flex; + height: 100%; + justify-content: center; + left: 0; + opacity: 0; + padding: 20px; + position: absolute; + top: 0; + transition: opacity 0.2s ease-in-out 0s; + visibility: hidden; + width: 100%; + z-index: 1; + + span { + color: colors.$light; + font-family: typography.$general-font; + font-size: 45px; + font-weight: 400; + letter-spacing: 0.06em; + margin: 0; + text-align: center; + } + + &.hover { + opacity: 1; + } +} diff --git a/app/frontend/packs/styles/components/_images.scss b/app/frontend/packs/styles/components/_images.scss new file mode 100644 index 00000000..0b1f0eee --- /dev/null +++ b/app/frontend/packs/styles/components/_images.scss @@ -0,0 +1,33 @@ +@use '../base/mixins' as *; + +.profile-image { + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.15); + height: 100%; + position: relative; + width: 50%; + + &.about { + float: right; + } + + &.admin { + max-width: 300px; + width: 100%; + } +} + +.logo-link { + position: relative; + + + img { + height: 40px; + width: 40px; + } +} + +.project-image.admin { + height: 250px; + object-fit: contain; + width: 300px; +} diff --git a/app/frontend/packs/styles/components/_markdown.scss b/app/frontend/packs/styles/components/_markdown.scss new file mode 100644 index 00000000..408baa07 --- /dev/null +++ b/app/frontend/packs/styles/components/_markdown.scss @@ -0,0 +1,51 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + +.markdown { + margin-bottom: 2em; + + a, + a:visited, + a:link { + color: colors.$link-color; + text-decoration: underline; + } + + ul { + margin-bottom: 1.75em; + margin-top: 0; + padding-inline-start: 25px; + + @include respond-to(tablet) { + padding-inline-start: 50px; + } + } + + li { + margin-bottom: 0.5em; + margin-top: 0; + + code { + background: #f3f3f3; + border-radius: 0.2em; + padding: 0.25em 0.4em; + } + } + + p { + margin: 1.4em 0 0.7em; + + code { + background: #f3f3f3; + border-radius: 0.2em; + padding: 0.25em 0.4em; + } + } + + ol { + margin-block-end: 1.5em; + padding-inline-start: 50px; + } +} diff --git a/app/frontend/packs/styles/components/_messages.scss b/app/frontend/packs/styles/components/_messages.scss new file mode 100644 index 00000000..13aeaed2 --- /dev/null +++ b/app/frontend/packs/styles/components/_messages.scss @@ -0,0 +1,31 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + + +// Notice and Alerts +.system-messages { + box-sizing: border-box; + width: 100%; + word-wrap: break-word; +} + +.notice, +.alert { + box-sizing: border-box; + width: 100%; + + + .no-messages { + display: none; + } +} + +.alert { + color: colors.$alerts; +} + +.notice { + color: colors.$notices; +} + diff --git a/app/frontend/packs/styles/components/_navbar.scss b/app/frontend/packs/styles/components/_navbar.scss new file mode 100644 index 00000000..bc48694f --- /dev/null +++ b/app/frontend/packs/styles/components/_navbar.scss @@ -0,0 +1,203 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; +@use 'sass:math'; + +// Variables +$sidebar-transition: 0.3s; +$btn-hover-animation: 0.2s; + +// Vendor +@use '../vendor/hamburger' with( + $container-position: relative, + $container-height: 55px, + $container-width: 55px, + $container-z-index: 7, + $container-color: none, + $hamburger-padding: 6px 6px, + $bar-height: 5px, + $bar-color-normal: colors.$inverse-font, + $bar-color-clicked: colors.$general-font, + $animation-duration: $sidebar-transition, + $length-scale: 0.96, +); + + +// Top Navbar Styles +.navbar { + align-items: center; + display: flex; + height: $header-height; + justify-content: space-between; + min-width: 200px; + overflow: hidden; + position: fixed; + top: 0; + width: 100%; + z-index: 3; +} + +.nav-title-container { + font-family: typography.$header-font; + font-size: 25px; + font-weight: 300; + letter-spacing: 0.06em; + margin: 0 20px; + z-index: 3; + + @include respond-to(tablet) { + font-size: 28px; + } + @include respond-to(desktop) { + font-size: 32px; + } + + a, + a:link, + a:visited, + a:focus, + a:hover, + a:active { + color: colors.$inverse-font; + text-decoration: none; + } + + a:hover { + cursor: pointer; + } +} + +.username { + margin-left: auto; + z-index: 3; + + a, + a:link, + a:visited, + a:focus, + a:hover, + a:active { + color: colors.$inverse-font; + font-family: typography.$header-font; + font-size: 22px; + font-weight: 300; + text-decoration: none; + } +} + +// Side Nav-ar Styles + +.nav-menu { + align-items: flex-end; + box-sizing: border-box; + display: flex; + flex-direction: column; + padding: 5px 10px; +} + +.nav-sidebar { + background-color: colors.$light; + bottom: 0; + box-sizing: border-box; + display: flex; + flex-direction: column; + justify-content: space-between; + overflow-y: scroll; + padding-top: $header-height; + position: fixed; + right: 0; + top: 0; + transition: width $sidebar-transition ease 0s, height 0s ease $sidebar-transition; + width: 0; + z-index: 5; + + .upper, + .lower { + align-self: flex-start; + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + width: 100%; + } +} + +.nav-item { + border: unset; + box-sizing: border-box; + color: colors.$dark; + cursor: pointer; + font-size: 16px; + font-weight: 450; + height: 0; + overflow: hidden; + padding: 15px 0; + position: relative; + text-align: center; + text-decoration: none; + transition: visibility math.div($sidebar-transition, 2) step-end, + height $sidebar-transition step-end; + user-select: none; + vertical-align: middle; + visibility: hidden; + white-space: nowrap; + width: 100%; + + @include respond-to(tablet) { + font-size: 18px; + } + @include respond-to(desktop) { + font-size: 20px; + } +} + +.logout-form { + width: 100%; +} + +.nav-screen-cover { + background-color: colors.$dark; + bottom: 0; + left: 0; + opacity: 0; + position: fixed; + right: 0; + top: 0; + transition: opacity $sidebar-transition ease, visibility $sidebar-transition step-end; + visibility: hidden; +} + +.nav-sidebar.sidebar-open { + transition: width $sidebar-transition ease 0s; + width: 180px; + @include respond-to(tablet) { + width: 210px; + } + @include respond-to(desktop) { + width: 250px; + } + + .nav-item { + background-color: colors.$light; + color: colors.$darker-font; + height: calc(1em + 30px); + line-height: 1em; + padding: 15px 0; + transition: color $btn-hover-animation ease, + background-color $btn-hover-animation ease; + visibility: visible; + + &:hover { + background-color: colors.$nav-button-hover; + color: colors.$light; + } + } + + +.nav-screen-cover { + opacity: 0.5; + transition: opacity $sidebar-transition ease 0s; + visibility: visible; + z-index: 4; + } +} diff --git a/app/frontend/packs/styles/components/_posts.scss b/app/frontend/packs/styles/components/_posts.scss new file mode 100644 index 00000000..544dc675 --- /dev/null +++ b/app/frontend/packs/styles/components/_posts.scss @@ -0,0 +1,112 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography' as *; + +.post-overview { + box-sizing: border-box; + position: relative; + width: 100%; +} + +.post-overview-container { + box-sizing: border-box; + color: colors.$darker-font; + display: flex; + flex-direction: column; + height: max-content; + padding: 10px; + position: relative; + text-align: left; + text-decoration: none; + width: 100%; + + &:link, + &:visited { + color: colors.$dark; + text-decoration: none; + width: 100%; + } + + &:focus, + &:active { + outline: thin dotted; + } + + &:hover { + outline: none; + } + + .post-overview-title { + font-size: 1.5em; + margin: 10px 0; + padding: 0; + @include respond-to(tablet) { + font-size: 1.65em; + } + @include respond-to(desktop) { + font-size: 1.8em; + } + } + + .post-container .markdown { + margin-top: 2em; + } + + .post-overview-overview { + margin-top: 0.7em; + } + + .post-date { + color: colors.$heading-font; + font-size: 0.9em; + } +} + + +.blog-post-section { + &.destroy { + .text-area-container.visible-on-edit .embedded-text-area { + max-height: 4em; + min-height: unset; + opacity: 0.3; + text-decoration: line-through; + } + + .post-editior-toolbar .visible-on-edit { + display: none; + } + + .post-editior-toolbar .visible-on-destroy { + display: unset; + } + + .post-section-images-container { + display: none; + } + } + + .visible-on-destroy { + display: none; + } +} + +.post-section-image-lightbox { + display: flex; + height: fit-content; + width: 100%; + + .post-section-image-thumbnail { + position: relative; + width: 100%; + } +} + +.post-section-image-caption { + font-size: 0.8em; + font-weight: 500; + overflow-wrap: normal; + padding-bottom: 2em; + padding-top: 0.25em; + width: 100%; +} diff --git a/app/frontend/packs/styles/components/_toolbars.scss b/app/frontend/packs/styles/components/_toolbars.scss new file mode 100644 index 00000000..24f5dbcc --- /dev/null +++ b/app/frontend/packs/styles/components/_toolbars.scss @@ -0,0 +1,20 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + +.toolbar-container { + display: flex; + flex-direction: column; + font-family: typography.$general-font; + justify-content: center; + justify-content: space-evenly; + margin-bottom: 20px; + margin-top: 20px; + position: relative; + width: 100%; + + @include respond-to(tablet) { + flex-direction: row; + } +} diff --git a/app/frontend/packs/styles/components/_typed_header.scss b/app/frontend/packs/styles/components/_typed_header.scss new file mode 100644 index 00000000..60f8a8de --- /dev/null +++ b/app/frontend/packs/styles/components/_typed_header.scss @@ -0,0 +1,12 @@ +.typed-cursor::after { + animation: blink 0.6s infinite; + content: '|'; + display: inline; + padding-left: 3px; +} + +@keyframes blink { + 0% { opacity: 1; } + 50% { opacity: 0; } + 100% { opacity: 1; } +} diff --git a/app/frontend/packs/styles/custom/about.scss b/app/frontend/packs/styles/custom/about.scss new file mode 100644 index 00000000..41065521 --- /dev/null +++ b/app/frontend/packs/styles/custom/about.scss @@ -0,0 +1,45 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + +.profile-image-container { + display: flex; + flex-wrap: wrap; + justify-content: center; + position: relative; + width: 100%; + + @include respond-to(tablet) { + flex-direction: column; + float: right; + margin-bottom: 20px; + margin-left: 20px; + width: 300px; + } + + .profile-image { + margin-bottom: 0.5em; + margin-top: 1.4em; + max-width: 300px; + width: 100%; + + @include respond-to(tablet) { + width: 100%; + } + } +} + +.about-about-me-container { + @include respond-to(mobile) { + display: flex; + justify-content: center; + } + + .markdown { + @include respond-to(mobile) { + max-width: 50ch; + text-align: justify; + } + } +} diff --git a/app/frontend/packs/styles/custom/code_snippets.scss b/app/frontend/packs/styles/custom/code_snippets.scss new file mode 100644 index 00000000..d1c4ad4b --- /dev/null +++ b/app/frontend/packs/styles/custom/code_snippets.scss @@ -0,0 +1,24 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + +.code-snippet { + box-sizing: border-box; + display: flex; + justify-content: center; + position: relative; + width: 100%; + + .markdown { + font-size: 1.2em; + margin: 0; + width: 100%; + + @include respond-to(tablet) { + max-width: 90%; + min-width: $reading-width; + width: max-content; + } + } +} diff --git a/app/frontend/packs/styles/custom/contact.scss b/app/frontend/packs/styles/custom/contact.scss new file mode 100644 index 00000000..0e982042 --- /dev/null +++ b/app/frontend/packs/styles/custom/contact.scss @@ -0,0 +1,76 @@ +// Modules +@use '../base/colors'; +@use '../base/mixins' as *; +@use '../base/typography'; + +.item-content.contact-messages-container { + align-content: center; + align-items: center; + flex-direction: column; +} + +.contact-details-container { + margin-top: 10px; + position: relative; + width: 100%; + @include respond-to(tablet) { + width: unset; + } + + .about-contact-container { + margin: 0; + } +} + +.contact-form-container { + flex: 0 1 600px; + width: 100%; + + @include respond-to(tablet) { + width: 450px; + } +} + +.embedded-text-area.contact { + min-height: 200px; + min-width: initial; +} + +.embedded-form-entry-container.contact { + margin: 0; + + @include respond-to(tablet) { + margin: 20px 0; + } +} + +.contact-details-container .about-contact-details-container { + box-sizing: border-box; + padding-left: 10px; + + @include respond-to(tablet) { + padding-left: 5px; + } + + .name { + font-size: 1.6em; + } + + .location { + font-size: 1.2em; + } +} + +.contact-form-container .embedded-label { + width: 26%; +} + +#contact-messages-new-form { + padding: 0; + + .embedded-input-box { + @include respond-to(tablet) { + width: 75%; + } + } +} diff --git a/app/frontend/packs/styles/custom/gallery.scss b/app/frontend/packs/styles/custom/gallery.scss new file mode 100644 index 00000000..d15bf5be --- /dev/null +++ b/app/frontend/packs/styles/custom/gallery.scss @@ -0,0 +1,51 @@ +.gallery { + position: relative; + width: 100%; +} + +.gallery-container { + display: flex; + flex-wrap: wrap; + justify-content: center; + + list-style-type: none; + margin-block-end: 0; + margin-block-start: 0; + margin-inline-end: 0; + margin-inline-start: 0; + padding-inline-start: 0; + position: relative; + width: 100%; +} + +.gallery-image-container { + box-sizing: border-box; + display: flex; + height: fit-content; + margin: 2px; + // overflow: hidden; + position: relative; + width: fit-content; + + a { + box-sizing: border-box; + display: flex; + height: fit-content; + position: relative; + width: fit-content; + } + + &.hidden { + margin: 0; + } +} + +.gallery-image-thumbnail { + object-fit: cover; + opacity: 0; + transition: opacity 0.7s cubic-bezier(0.76, 0.24, 0.26, 0.99), box-shadow 0.7s cubic-bezier(0.76, 0.24, 0.26, 0.99); + + &.fade-in { + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.22); + } +} diff --git a/app/frontend/packs/styles/custom/overrides.scss b/app/frontend/packs/styles/custom/overrides.scss new file mode 100644 index 00000000..044e617c --- /dev/null +++ b/app/frontend/packs/styles/custom/overrides.scss @@ -0,0 +1,26 @@ +.fade-in { + opacity: 1; + z-index: 1; +} + +.sl-overlay { + background-color: rgb(0, 0, 0); +} + +.sl-navigation button { + color: rgb(255, 255, 255) !important; +} + +.lightbox-caption { + background: rgba(0, 0, 0, 0) !important; + bottom: initial !important; + top: 100% !important; +} + +.simple-lightbox:focus { + outline: none; +} + +.simple-lightbox { + backdrop-filter: blur(2px); +} diff --git a/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.eot b/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.eot new file mode 100644 index 00000000..6c1bd983 Binary files /dev/null and b/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.eot differ diff --git a/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.svg b/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.svg new file mode 100644 index 00000000..e0335f97 --- /dev/null +++ b/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.svg @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.ttf b/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.ttf new file mode 100644 index 00000000..f8274721 Binary files /dev/null and b/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.ttf differ diff --git a/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.woff b/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.woff new file mode 100644 index 00000000..03df1e06 Binary files /dev/null and b/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.woff differ diff --git a/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.woff2 b/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.woff2 new file mode 100644 index 00000000..3e406a7b Binary files /dev/null and b/app/frontend/packs/styles/fonts/inconsolata-v20-latin-regular.woff2 differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.eot b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.eot new file mode 100644 index 00000000..597f0907 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.eot differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.svg b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.svg new file mode 100644 index 00000000..cf65298a --- /dev/null +++ b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.svg @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.ttf b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.ttf new file mode 100644 index 00000000..01500103 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.ttf differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.woff b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.woff new file mode 100644 index 00000000..63424542 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.woff differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.woff2 b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.woff2 new file mode 100644 index 00000000..e1bcd41b Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300.woff2 differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.eot b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.eot new file mode 100644 index 00000000..d89b0a6a Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.eot differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.svg b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.svg new file mode 100644 index 00000000..bfc32be5 --- /dev/null +++ b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.svg @@ -0,0 +1,374 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.ttf b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.ttf new file mode 100644 index 00000000..338dafa4 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.ttf differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.woff b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.woff new file mode 100644 index 00000000..3eb55bb0 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.woff differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.woff2 b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.woff2 new file mode 100644 index 00000000..ba659149 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-300italic.woff2 differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.eot b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.eot new file mode 100644 index 00000000..10690d7e Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.eot differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.svg b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.svg new file mode 100644 index 00000000..17ef94e6 --- /dev/null +++ b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.svg @@ -0,0 +1,375 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.ttf b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.ttf new file mode 100644 index 00000000..077c6f70 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.ttf differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.woff b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.woff new file mode 100644 index 00000000..7987c6cc Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.woff differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.woff2 b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.woff2 new file mode 100644 index 00000000..d3817393 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500.woff2 differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.eot b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.eot new file mode 100644 index 00000000..1e592683 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.eot differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.svg b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.svg new file mode 100644 index 00000000..23c32924 --- /dev/null +++ b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.svg @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.ttf b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.ttf new file mode 100644 index 00000000..21850385 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.ttf differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.woff b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.woff new file mode 100644 index 00000000..f55e6484 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.woff differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.woff2 b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.woff2 new file mode 100644 index 00000000..9950f6ff Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-500italic.woff2 differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.eot b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.eot new file mode 100644 index 00000000..6fc087e5 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.eot differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.svg b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.svg new file mode 100644 index 00000000..a207a111 --- /dev/null +++ b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.svg @@ -0,0 +1,374 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.ttf b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.ttf new file mode 100644 index 00000000..5655f4c7 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.ttf differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.woff b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.woff new file mode 100644 index 00000000..4d901bdc Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.woff differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.woff2 b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.woff2 new file mode 100644 index 00000000..6c38b9ea Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600.woff2 differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.eot b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.eot new file mode 100644 index 00000000..c66d682e Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.eot differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.svg b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.svg new file mode 100644 index 00000000..87e1b27e --- /dev/null +++ b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.svg @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.ttf b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.ttf new file mode 100644 index 00000000..f0133b55 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.ttf differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.woff b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.woff new file mode 100644 index 00000000..f9a84867 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.woff differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.woff2 b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.woff2 new file mode 100644 index 00000000..1e010bc7 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-600italic.woff2 differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.eot b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.eot new file mode 100644 index 00000000..71d74d33 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.eot differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.svg b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.svg new file mode 100644 index 00000000..7748b5cb --- /dev/null +++ b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.svg @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.ttf b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.ttf new file mode 100644 index 00000000..35998e43 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.ttf differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.woff b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.woff new file mode 100644 index 00000000..28527553 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.woff differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.woff2 b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.woff2 new file mode 100644 index 00000000..24a5266d Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700.woff2 differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.eot b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.eot new file mode 100644 index 00000000..5a012b80 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.eot differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.svg b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.svg new file mode 100644 index 00000000..c1c10f9b --- /dev/null +++ b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.svg @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.ttf b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.ttf new file mode 100644 index 00000000..6b50ab9f Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.ttf differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.woff b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.woff new file mode 100644 index 00000000..41b7890c Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.woff differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.woff2 b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.woff2 new file mode 100644 index 00000000..6eae9d33 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-700italic.woff2 differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.eot b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.eot new file mode 100644 index 00000000..84bb9477 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.eot differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.svg b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.svg new file mode 100644 index 00000000..0a0654ab --- /dev/null +++ b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.svg @@ -0,0 +1,374 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.ttf b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.ttf new file mode 100644 index 00000000..87d80ad1 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.ttf differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.woff b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.woff new file mode 100644 index 00000000..34237b94 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.woff differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.woff2 b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.woff2 new file mode 100644 index 00000000..87272624 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800.woff2 differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.eot b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.eot new file mode 100644 index 00000000..52b04e43 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.eot differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.svg b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.svg new file mode 100644 index 00000000..6afae936 --- /dev/null +++ b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.svg @@ -0,0 +1,375 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.ttf b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.ttf new file mode 100644 index 00000000..47c2632b Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.ttf differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.woff b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.woff new file mode 100644 index 00000000..7e468812 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.woff differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.woff2 b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.woff2 new file mode 100644 index 00000000..5c952087 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-800italic.woff2 differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.eot b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.eot new file mode 100644 index 00000000..c6d5de92 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.eot differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.svg b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.svg new file mode 100644 index 00000000..5d9276cb --- /dev/null +++ b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.svg @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.ttf b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.ttf new file mode 100644 index 00000000..434322b6 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.ttf differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.woff b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.woff new file mode 100644 index 00000000..a1253472 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.woff differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.woff2 b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.woff2 new file mode 100644 index 00000000..53c512a2 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-italic.woff2 differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.eot b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.eot new file mode 100644 index 00000000..47572994 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.eot differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.svg b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.svg new file mode 100644 index 00000000..b94fce40 --- /dev/null +++ b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.svg @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.ttf b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.ttf new file mode 100644 index 00000000..6036a598 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.ttf differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.woff b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.woff new file mode 100644 index 00000000..e41a2b77 Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.woff differ diff --git a/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.woff2 b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.woff2 new file mode 100644 index 00000000..c53b99fa Binary files /dev/null and b/app/frontend/packs/styles/fonts/merriweather-sans-v13-latin-regular.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.eot b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.eot new file mode 100644 index 00000000..b64d040f Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.svg b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.svg new file mode 100644 index 00000000..2541fd2e --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.svg @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.ttf b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.ttf new file mode 100644 index 00000000..e6a37f0e Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.woff b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.woff new file mode 100644 index 00000000..4cc73bfc Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.woff2 b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.woff2 new file mode 100644 index 00000000..cc7a1e9d Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-100.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.eot b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.eot new file mode 100644 index 00000000..2216d111 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.svg b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.svg new file mode 100644 index 00000000..9ecb9dda --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.svg @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.ttf b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.ttf new file mode 100644 index 00000000..c07a582a Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.woff b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.woff new file mode 100644 index 00000000..e94017f6 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.woff2 b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.woff2 new file mode 100644 index 00000000..e34ea989 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-200.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.eot b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.eot new file mode 100644 index 00000000..df8813ac Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.svg b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.svg new file mode 100644 index 00000000..f7f86669 --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.svg @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.ttf b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.ttf new file mode 100644 index 00000000..ac27facc Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.woff b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.woff new file mode 100644 index 00000000..349f3053 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.woff2 b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.woff2 new file mode 100644 index 00000000..3100e32c Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-300.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.eot b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.eot new file mode 100644 index 00000000..a56a2695 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.svg b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.svg new file mode 100644 index 00000000..da0061cd --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.svg @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.ttf b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.ttf new file mode 100644 index 00000000..83a744bd Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.woff b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.woff new file mode 100644 index 00000000..7b21a3ec Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.woff2 b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.woff2 new file mode 100644 index 00000000..ec193de6 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-500.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.eot b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.eot new file mode 100644 index 00000000..ec0d738b Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.svg b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.svg new file mode 100644 index 00000000..1f392573 --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.svg @@ -0,0 +1,336 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.ttf b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.ttf new file mode 100644 index 00000000..5f74a22b Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.woff b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.woff new file mode 100644 index 00000000..7c3774e2 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.woff2 b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.woff2 new file mode 100644 index 00000000..1e20cbf4 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-600.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.eot b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.eot new file mode 100644 index 00000000..6d85f1a2 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.svg b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.svg new file mode 100644 index 00000000..4b19c6c2 --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.svg @@ -0,0 +1,334 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.ttf b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.ttf new file mode 100644 index 00000000..c4852d2b Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.woff b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.woff new file mode 100644 index 00000000..a1dbdd7f Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.woff2 b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.woff2 new file mode 100644 index 00000000..9813ce22 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-700.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.eot b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.eot new file mode 100644 index 00000000..47270b24 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.svg b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.svg new file mode 100644 index 00000000..d7f5517c --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.svg @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.ttf b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.ttf new file mode 100644 index 00000000..363792a5 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.woff b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.woff new file mode 100644 index 00000000..89e8b52d Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.woff2 b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.woff2 new file mode 100644 index 00000000..48c58311 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-800.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.eot b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.eot new file mode 100644 index 00000000..0c887f4c Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.svg b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.svg new file mode 100644 index 00000000..70dbec8c --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.svg @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.ttf b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.ttf new file mode 100644 index 00000000..a4f26026 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.woff b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.woff new file mode 100644 index 00000000..88006300 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.woff2 b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.woff2 new file mode 100644 index 00000000..91ae1576 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-900.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.eot b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.eot new file mode 100644 index 00000000..398d0c99 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.svg b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.svg new file mode 100644 index 00000000..daee16e6 --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.svg @@ -0,0 +1,337 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.ttf b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.ttf new file mode 100644 index 00000000..b2c90f03 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.woff b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.woff new file mode 100644 index 00000000..4ef4ab83 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.woff2 b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.woff2 new file mode 100644 index 00000000..b135852b Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-slab-v12-latin-regular.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-100.eot b/app/frontend/packs/styles/fonts/roboto-v20-latin-100.eot new file mode 100644 index 00000000..aaa225b2 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-100.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-100.svg b/app/frontend/packs/styles/fonts/roboto-v20-latin-100.svg new file mode 100644 index 00000000..e8c8fc83 --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-v20-latin-100.svg @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-100.ttf b/app/frontend/packs/styles/fonts/roboto-v20-latin-100.ttf new file mode 100644 index 00000000..08ba2228 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-100.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-100.woff b/app/frontend/packs/styles/fonts/roboto-v20-latin-100.woff new file mode 100644 index 00000000..7306a7b7 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-100.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-100.woff2 b/app/frontend/packs/styles/fonts/roboto-v20-latin-100.woff2 new file mode 100644 index 00000000..a5cc2839 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-100.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.eot b/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.eot new file mode 100644 index 00000000..2974a1c5 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.svg b/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.svg new file mode 100644 index 00000000..c51ce871 --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.svg @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.ttf b/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.ttf new file mode 100644 index 00000000..d63c8205 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.woff b/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.woff new file mode 100644 index 00000000..4e0c9295 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.woff2 b/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.woff2 new file mode 100644 index 00000000..327bebc5 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-100italic.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-300.eot b/app/frontend/packs/styles/fonts/roboto-v20-latin-300.eot new file mode 100644 index 00000000..574375d4 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-300.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-300.svg b/app/frontend/packs/styles/fonts/roboto-v20-latin-300.svg new file mode 100644 index 00000000..4ded944a --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-v20-latin-300.svg @@ -0,0 +1,312 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-300.ttf b/app/frontend/packs/styles/fonts/roboto-v20-latin-300.ttf new file mode 100644 index 00000000..57a24e82 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-300.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-300.woff b/app/frontend/packs/styles/fonts/roboto-v20-latin-300.woff new file mode 100644 index 00000000..2f6bdb5e Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-300.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-300.woff2 b/app/frontend/packs/styles/fonts/roboto-v20-latin-300.woff2 new file mode 100644 index 00000000..ef8c8836 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-300.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.eot b/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.eot new file mode 100644 index 00000000..c6fd27f4 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.svg b/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.svg new file mode 100644 index 00000000..758402b6 --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.svg @@ -0,0 +1,329 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.ttf b/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.ttf new file mode 100644 index 00000000..61d95b8e Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.woff b/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.woff new file mode 100644 index 00000000..57c12ee0 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.woff2 b/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.woff2 new file mode 100644 index 00000000..b6653fb9 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-300italic.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-500.eot b/app/frontend/packs/styles/fonts/roboto-v20-latin-500.eot new file mode 100644 index 00000000..2ec7bdd7 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-500.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-500.svg b/app/frontend/packs/styles/fonts/roboto-v20-latin-500.svg new file mode 100644 index 00000000..67eecf44 --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-v20-latin-500.svg @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-500.ttf b/app/frontend/packs/styles/fonts/roboto-v20-latin-500.ttf new file mode 100644 index 00000000..dd04ff19 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-500.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-500.woff b/app/frontend/packs/styles/fonts/roboto-v20-latin-500.woff new file mode 100644 index 00000000..86992586 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-500.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-500.woff2 b/app/frontend/packs/styles/fonts/roboto-v20-latin-500.woff2 new file mode 100644 index 00000000..6362d7f6 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-500.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.eot b/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.eot new file mode 100644 index 00000000..d9d0600a Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.svg b/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.svg new file mode 100644 index 00000000..bed50dcf --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.svg @@ -0,0 +1,326 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.ttf b/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.ttf new file mode 100644 index 00000000..e62fa931 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.woff b/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.woff new file mode 100644 index 00000000..b794d20d Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.woff2 b/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.woff2 new file mode 100644 index 00000000..0ff2f813 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-500italic.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-700.eot b/app/frontend/packs/styles/fonts/roboto-v20-latin-700.eot new file mode 100644 index 00000000..0168f09b Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-700.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-700.svg b/app/frontend/packs/styles/fonts/roboto-v20-latin-700.svg new file mode 100644 index 00000000..11db87dd --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-v20-latin-700.svg @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-700.ttf b/app/frontend/packs/styles/fonts/roboto-v20-latin-700.ttf new file mode 100644 index 00000000..ea06a634 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-700.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-700.woff b/app/frontend/packs/styles/fonts/roboto-v20-latin-700.woff new file mode 100644 index 00000000..0f14effb Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-700.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-700.woff2 b/app/frontend/packs/styles/fonts/roboto-v20-latin-700.woff2 new file mode 100644 index 00000000..32b25eee Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-700.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.eot b/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.eot new file mode 100644 index 00000000..4eef294c Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.svg b/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.svg new file mode 100644 index 00000000..050bee0e --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.svg @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.ttf b/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.ttf new file mode 100644 index 00000000..a0c37246 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.woff b/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.woff new file mode 100644 index 00000000..85ec2583 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.woff2 b/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.woff2 new file mode 100644 index 00000000..fe58be2f Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-700italic.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-900.eot b/app/frontend/packs/styles/fonts/roboto-v20-latin-900.eot new file mode 100644 index 00000000..0f818971 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-900.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-900.svg b/app/frontend/packs/styles/fonts/roboto-v20-latin-900.svg new file mode 100644 index 00000000..9efdf4e9 --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-v20-latin-900.svg @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-900.ttf b/app/frontend/packs/styles/fonts/roboto-v20-latin-900.ttf new file mode 100644 index 00000000..0efba538 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-900.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-900.woff b/app/frontend/packs/styles/fonts/roboto-v20-latin-900.woff new file mode 100644 index 00000000..4d50531e Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-900.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-900.woff2 b/app/frontend/packs/styles/fonts/roboto-v20-latin-900.woff2 new file mode 100644 index 00000000..802499d3 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-900.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.eot b/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.eot new file mode 100644 index 00000000..fda4f151 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.svg b/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.svg new file mode 100644 index 00000000..f8f5ab39 --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.svg @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.ttf b/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.ttf new file mode 100644 index 00000000..e6b29c9c Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.woff b/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.woff new file mode 100644 index 00000000..a3dd7c2d Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.woff2 b/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.woff2 new file mode 100644 index 00000000..7d846b1a Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-900italic.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.eot b/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.eot new file mode 100644 index 00000000..0753b883 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.svg b/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.svg new file mode 100644 index 00000000..4d597971 --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.svg @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.ttf b/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.ttf new file mode 100644 index 00000000..bdbb1085 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.woff b/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.woff new file mode 100644 index 00000000..b940dbcb Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.woff2 b/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.woff2 new file mode 100644 index 00000000..2741d4f0 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-italic.woff2 differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.eot b/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.eot new file mode 100644 index 00000000..4f348009 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.eot differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.svg b/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.svg new file mode 100644 index 00000000..627f5a36 --- /dev/null +++ b/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.svg @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.ttf b/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.ttf new file mode 100644 index 00000000..a97385df Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.ttf differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.woff b/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.woff new file mode 100644 index 00000000..69c88254 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.woff differ diff --git a/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.woff2 b/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.woff2 new file mode 100644 index 00000000..1a537015 Binary files /dev/null and b/app/frontend/packs/styles/fonts/roboto-v20-latin-regular.woff2 differ diff --git a/app/frontend/packs/styles/themes/syntax_highlighting.scss b/app/frontend/packs/styles/themes/syntax_highlighting.scss new file mode 100644 index 00000000..faa9b1e9 --- /dev/null +++ b/app/frontend/packs/styles/themes/syntax_highlighting.scss @@ -0,0 +1,167 @@ +$text: rgb(226, 226, 226); +$background: rgb(41, 42, 43); + +.code-block { + background-color: $background; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.15); + color: $text; + font-weight: 400; + line-height: 1.25; + margin: 1em 0 1.75em; + overflow-x: auto; + padding: 1em 1.1em; + word-wrap: initial; + + + .code-block { + margin-bottom: 2em; + } + + table td { + padding: 5px; + } + + table pre { + margin: 0; + } + + .w { + background-color: $background; + color: $text; + } + + .c, + .ch, + .cd, + .cm, + .cpf, + .c1, + .cs { + color: #848383; + } + + .cp, + .nt { + color: #f4bf75; + } + + .o, + .ow { + color: #d0d0d0; + } + + .p, + .pi { + color: #d0d0d0; + + } + + .gi { + color: #90a959; + + } + + .gd { + color: #ac4142; + + } + + .gh { + background-color: #151515; + color: #6a9fb5; + font-weight: bold; + } + + .k, + .kn, + .kp, + .kr, + .kv { + color: rgb(255, 106, 172); + } + + .kc { + color: #d28445; + + } + + .kt { + color: #d28445; + + } + + .kd { + color: #d28445; + + } + + .s, + .sa, + .sb, + .sc, + .dl, + .sd, + .s2, + .sh, + .sx, + .s1, + .si, + .err { + color: #18f8d3; + } + + .sr { + color: #75b5aa; + } + + .se { + color: #8f5536; + + } + + .nn { + color: #f4bf75; + } + + .no, + .ss, + .nc { + color: rgb(249, 5, 89); + } + + .n { + color: rgb(231 206 168); + } + + .na { + color: #6a9fb5; + } + + .nf { + color: $text; + } + + .m, + .mb, + .mf, + .mh, + .mi, + .il, + .mo, + .mx { + color: #e456b9; + } + + &.shell { + .nv { + color: #18f8d3; + } + + .nc { + color: rgb(249, 5, 89); + } + + .nt { + color: rgb(255, 106, 172); + } + } +} diff --git a/app/frontend/packs/styles/vendor/hamburger.scss b/app/frontend/packs/styles/vendor/hamburger.scss new file mode 100644 index 00000000..be55b4e1 --- /dev/null +++ b/app/frontend/packs/styles/vendor/hamburger.scss @@ -0,0 +1,124 @@ +// Default Variables +$container-position: relative !default; +$container-height: 55px !default; +$container-width: 55px !default; +$container-z-index: 1 !default; +$container-color: none !default; +$hamburger-padding: 6px 6px !default; +$bar-height: 5px !default; +$bar-color-normal: rgb(0, 0, 0) !default; +$bar-color-clicked: rgb(0, 0, 0) !default; +$animation-duration: 0.3s !default; +$length-scale: 0.96 !default; + +// Location and Dimensions +.hamburger-container { + align-items: center; + background-color: $container-color; + box-sizing: border-box; + display: flex; + height: $container-height; + justify-content: center; + position: $container-position; + width: $container-width; + z-index: $container-z-index; + + &:hover { + cursor: pointer; + } + + &:focus { + outline: none; + } +} + +.hamburger { + box-sizing: border-box; + display: flex; + flex-direction: column; + height: 100%; + justify-content: space-evenly; + margin: auto; + padding: $hamburger-padding; + position: absolute; + width: 100%; +} + +.hamburger-bar { + background-color: $bar-color-normal; + border-radius: 999px; + display: block; + height: $bar-height; + transition: background-color 0.1s ease 0.1s; + width: 100%; +} + +.clicked .hamburger-bar { + background-color: $bar-color-clicked; + transition: background-color 0.1s ease 0s; +} + +// Crown Animation + +@keyframes hamburger-crown-rotate { + 0% {transform: rotate(0deg) scaleX(1);} + 100% {transform: rotate(45deg) scaleX($length-scale);} +} +@keyframes hamburger-crown-rotate-reverse { + 0% {transform: rotate(45deg) scaleX($length-scale);} + 100% {transform: rotate(0deg) scaleX(1);} +} + +// Patty Animation + +@keyframes hamburger-patty-hide { + 0% {transform: scale(1, 1);} + 100% {transform: scale(0, 0);} +} +@keyframes hamburger-patty-show { + 0% {transform: scale(0, 0);} + 100% {transform: scale(1, 1);} +} + +// Heel Animation + +@keyframes hamburger-heel-rotate { + 0% {transform: rotate(0deg) scaleX(1);} + 100% {transform: rotate(-45deg) scaleX($length-scale);} +} +@keyframes hamburger-heel-rotate-reverse { + 0% {transform: rotate(-45deg) scaleX($length-scale);} + 100% {transform: rotate(0deg) scaleX(1);} +} + +// Hover Event + +.clicked #hamburger-crown { + animation: hamburger-crown-rotate $animation-duration ease-in-out 0s 1 normal forwards; + transform-origin: 9%; +} + +.clicked #hamburger-patty { + animation: hamburger-patty-hide $animation-duration ease-in-out 0s 1 normal forwards; +} + +.clicked #hamburger-heel { + animation: hamburger-heel-rotate $animation-duration ease-in-out 0s 1 normal forwards; + transform-origin: 9%; +} + +// Hover Off Event + +.reset-animation #hamburger-crown { + animation: hamburger-crown-rotate-reverse $animation-duration ease-in-out 0s 1 normal backwards; + transform-origin: 9%; +} + +.reset-animation #hamburger-patty { + animation: hamburger-patty-show $animation-duration ease-in-out 0s 1 normal backwards; +} + +.reset-animation #hamburger-heel { + animation: hamburger-heel-rotate-reverse $animation-duration ease-in-out 0s 1 normal backwards; + transform-origin: 9%; +} diff --git a/app/frontend/packs/styles/vendor/loaders.scss b/app/frontend/packs/styles/vendor/loaders.scss new file mode 100644 index 00000000..bc40bb78 --- /dev/null +++ b/app/frontend/packs/styles/vendor/loaders.scss @@ -0,0 +1,54 @@ +$loader-size: 4em; +$loader-width: 0.8em; +$loader-background: rgba(255, 255, 255, 0.3); +$loader-color: rgba(255, 255, 255, 0.7); + +.loader-container { + align-items: center; + box-sizing: border-box; + display: flex; + display: none; + height: 100%; + justify-content: center; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.default-loader { + border-radius: 50%; + height: 3.5em; + margin: 0; + transition: visibility 0.1s linear 0.1s; + width: 3.5em; +} + +.default-loader { + animation: loading 1s infinite linear; + animation: loading 1s infinite linear; + animation: loading 1s infinite linear; + border-bottom: $loader-width solid $loader-background; + border-left: $loader-width solid $loader-background; + border-right: $loader-width solid $loader-background; + border-top: $loader-width solid $loader-color; + box-sizing: border-box; + font-size: 10px; + position: relative; + transform: translateZ(0); + transform: translateZ(0); + transform: translateZ(0); +} + +@keyframes loading { + 0% {transform: rotate(0deg);} + 100% {transform: rotate(360deg);} +} +@keyframes loading { + 0% {transform: rotate(0deg);} + 100% {transform: rotate(360deg);} +} +@keyframes loading { + 0% {transform: rotate(0deg);} + 100% {transform: rotate(360deg);} +} diff --git a/app/frontend/packs/styles/vendor/normalize.css b/app/frontend/packs/styles/vendor/normalize.css new file mode 100644 index 00000000..0239a27f --- /dev/null +++ b/app/frontend/packs/styles/vendor/normalize.css @@ -0,0 +1,373 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} + + +/* Custom + ========================================================================== */ + + +/** + * Remove default button styling + */ + +button { + text-indent: 0px; + text-shadow: none; + display: block; + text-align: center; + align-items: flex-start; + cursor: pointer; + background-color: inherit; + box-sizing: border-box; + margin: 0em; + font: inherit; + padding: 0; + border-width: 0; +} diff --git a/app/helpers/admin_link_helper.rb b/app/helpers/admin_link_helper.rb new file mode 100644 index 00000000..62d959fc --- /dev/null +++ b/app/helpers/admin_link_helper.rb @@ -0,0 +1,31 @@ +module AdminLinkHelper + def admin_link_helper_admin_path(model, singular = false) + if singular + send(:"edit_admin_#{model.model_name.singular}_path") + else + send(:"edit_admin_#{model.model_name.singular}_path", model) + end + end + + def admin_link_helper_section_path(model, singular = false) + if singular + send(:"#{model.model_name.singular}_path") + else + send(:"#{model.model_name.plural}_path") + end + end + + def admin_link_helper_new_path(model) + send(:"new_admin_#{model.model_name.singular}_path") + end + + def in_admin_scope? + current_path.match?(%r{^/admin/}) + end + + private + + def current_path + request.original_fullpath + end +end \ No newline at end of file diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index de6be794..b7a01841 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,2 +1,7 @@ module ApplicationHelper -end + def header_height + controllers = [/\Ahomepages\z/, /\Aadmins?/] + return 300 if controllers.any? { |pattern| pattern.match?(params[:controller]) } + 205 + end +end \ No newline at end of file diff --git a/app/helpers/attachment_helper.rb b/app/helpers/attachment_helper.rb new file mode 100644 index 00000000..5e42a8de --- /dev/null +++ b/app/helpers/attachment_helper.rb @@ -0,0 +1,39 @@ +module AttachmentHelper + IMAGE_NOT_FOUND = 'default_images/image_not_found.png'.freeze + + def image_path_helper(image_model:, variant: nil) + if image_attached?(image_model) + return image_model.image_file.variant(image_model.variant_sizes[variant]) if variant + return image_model.image_file + end + default_image(image_model) + end + + def image_file_name(image:, default_name: nil, model_name: nil) + return image.image_file.attachment.blob.filename if image&.image_file&.attached? + default_name || "default #{"#{model_name} " if model_name}image" + end + + def image_attached?(image_model) + return false unless image_model&.image_file&.attached? + true + end + + def default_image(image_model) + return image_model.default_image if image_model.respond_to?(:default_image) + IMAGE_NOT_FOUND + end + + def fetch_image_url(image_model:, variant: nil) + if image_attached?(image_model) + if variant + attachment = image_model.image_file.variant(image_model.variant_sizes[variant]) + return Rails.application.routes.url_helpers.rails_representation_url(attachment, only_path: true) + else + attachment = image_model.image_file + return Rails.application.routes.url_helpers.rails_blob_path(attachment) + end + end + default_image(image_model) + end +end \ No newline at end of file diff --git a/app/helpers/date_helper.rb b/app/helpers/date_helper.rb new file mode 100644 index 00000000..7afa9a8c --- /dev/null +++ b/app/helpers/date_helper.rb @@ -0,0 +1,21 @@ +module DateHelper + def full_date(date) + export_html(render_date(date)) + end + + def full_date_and_time(datetime) + export_html("#{render_date(datetime)} at #{render_time(datetime)}") + end + + def export_html(string) + "#{string}".html_safe + end + + def render_date(date) + "#{date.strftime('%B %d')}#{date.day.ordinal}#{date.strftime(', %Y')}" + end + + def render_time(datetime) + datetime.strftime('%l:%M%p').downcase + end +end diff --git a/app/helpers/homepage_helper.rb b/app/helpers/homepage_helper.rb deleted file mode 100644 index c5bbfe51..00000000 --- a/app/helpers/homepage_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module HomepageHelper -end diff --git a/app/helpers/markdown_helper.rb b/app/helpers/markdown_helper.rb new file mode 100644 index 00000000..2c036d5e --- /dev/null +++ b/app/helpers/markdown_helper.rb @@ -0,0 +1,46 @@ +module MarkdownHelper + require 'rouge/plugins/redcarpet' + + class HTML < Redcarpet::Render::HTML + include Rouge::Plugins::Redcarpet + + def rouge_formatter(lexer) + Rouge::Formatters::HTMLLegacy.new(css_class: "code-block #{lexer.tag}") + end + end + + def markdown_admin(text) + text ||= '' + render_options = { + hard_wrap: true, + link_attributes: { + rel: 'nofollow', + target: '_blank' + } + } + + extensions = { + autolink: true, + fenced_code_blocks: true, + lax_spacing: true, + no_intra_emphasis: true, + strikethrough: true, + superscript: true, + tables: true, + underline: true + } + + renderer = HTML.new(render_options) + markdown = Redcarpet::Markdown.new(renderer, extensions) + html = markdown.render(text) + encapsulate_markdown(html).html_safe + end + + def markdown_code(code:, extension:) + markdown_admin("```#{extension}\n#{code}\n```") + end + + def encapsulate_markdown(html) + %(
#{html}
) + end +end \ No newline at end of file diff --git a/app/javascript/channels/consumer.js b/app/javascript/channels/consumer.js deleted file mode 100644 index 0eceb59b..00000000 --- a/app/javascript/channels/consumer.js +++ /dev/null @@ -1,6 +0,0 @@ -// Action Cable provides the framework to deal with WebSockets in Rails. -// You can generate new channels where WebSocket features live using the `rails generate channel` command. - -import { createConsumer } from "@rails/actioncable" - -export default createConsumer() diff --git a/app/javascript/channels/index.js b/app/javascript/channels/index.js deleted file mode 100644 index 0cfcf749..00000000 --- a/app/javascript/channels/index.js +++ /dev/null @@ -1,5 +0,0 @@ -// Load all the channels within this directory and all subdirectories. -// Channel files must be named *_channel.js. - -const channels = require.context('.', true, /_channel\.js$/) -channels.keys().forEach(channels) diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js deleted file mode 100644 index 9cd55d4b..00000000 --- a/app/javascript/packs/application.js +++ /dev/null @@ -1,17 +0,0 @@ -// This file is automatically compiled by Webpack, along with any other files -// present in this directory. You're encouraged to place your actual application logic in -// a relevant structure within app/javascript and only use these pack files to reference -// that code so it'll be compiled. - -require("@rails/ujs").start() -require("turbolinks").start() -require("@rails/activestorage").start() -require("channels") - - -// Uncomment to copy all static images under ../images to the output folder and reference -// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>) -// or the `imagePath` JavaScript helper below. -// -// const images = require.context('../images', true) -// const imagePath = (name) => images(name, true) diff --git a/app/jobs/new_contact_message_job.rb b/app/jobs/new_contact_message_job.rb new file mode 100644 index 00000000..cc5cca1c --- /dev/null +++ b/app/jobs/new_contact_message_job.rb @@ -0,0 +1,8 @@ +class NewContactMessageJob < ApplicationJob + queue_as :default + + def perform(contact_message:) + ContactMessageMailer.with(contact_message: contact_message).contact_message.deliver_now + ContactMessageMailer.with(contact_message: contact_message).confirmation.deliver_now + end +end diff --git a/app/jobs/password_reset_job.rb b/app/jobs/password_reset_job.rb new file mode 100644 index 00000000..3ff32168 --- /dev/null +++ b/app/jobs/password_reset_job.rb @@ -0,0 +1,8 @@ +class PasswordResetJob < ApplicationJob + queue_as :default + + def perform(email:) + user = User.find_by(email: email) + user&.send_password_reset_email! + end +end diff --git a/app/jobs/password_updated_job.rb b/app/jobs/password_updated_job.rb new file mode 100644 index 00000000..a074d6a7 --- /dev/null +++ b/app/jobs/password_updated_job.rb @@ -0,0 +1,7 @@ +class PasswordUpdatedJob < ApplicationJob + queue_as :default + + def perform(user:) + user.send_password_updated_email! + end +end diff --git a/app/jobs/process_image_variant_job.rb b/app/jobs/process_image_variant_job.rb new file mode 100644 index 00000000..15c01089 --- /dev/null +++ b/app/jobs/process_image_variant_job.rb @@ -0,0 +1,7 @@ +class ProcessImageVariantJob < ApplicationJob + queue_as :default + + def perform(model:, variant:) + model.image_file.variant(variant).processed + end +end diff --git a/app/jobs/render_code_snippet_job.rb b/app/jobs/render_code_snippet_job.rb new file mode 100644 index 00000000..6f6242fe --- /dev/null +++ b/app/jobs/render_code_snippet_job.rb @@ -0,0 +1,15 @@ +class RenderCodeSnippetJob < ApplicationJob + queue_as :default + + def perform(model:, snippet:, extension:) + start_line = 0 + end_line = 12 + + RenderCodeSnippetService.render_and_attach_image( + snippet_text: snippet, + syntax_extension: extension, + attachment: model.image_file, + start_line: start_line, + end_line: end_line) + end +end \ No newline at end of file diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb index 286b2239..9a245500 100644 --- a/app/mailers/application_mailer.rb +++ b/app/mailers/application_mailer.rb @@ -1,4 +1,4 @@ class ApplicationMailer < ActionMailer::Base - default from: 'from@example.com' + default from: %("#{Rails.configuration.email_default_name}" <#{Rails.configuration.email_default_address}>) layout 'mailer' end diff --git a/app/mailers/contact_message_mailer.rb b/app/mailers/contact_message_mailer.rb new file mode 100644 index 00000000..fbd88b1c --- /dev/null +++ b/app/mailers/contact_message_mailer.rb @@ -0,0 +1,44 @@ +class ContactMessageMailer < ApplicationMailer + include AttachmentHelper + include DateHelper + + default from: Rails.configuration.email_no_reply_address + + def contact_message + assign_default_variables + @to_email = @about.contact_email + @to_name = @about.name + @from_name = @contact_message.from + @from_email = @contact_message.email + mail(to: @to_email, reply_to: @from_email, subject: "New contact message: #{@subject}") do |format| + format.html { render layout: 'default_email' } + end + end + + def confirmation + assign_default_variables + @to_email = @contact_message.email + @to_name = @contact_message.from + @user_name = @about.name + mail(to: @to_email, subject: "Contact message sent: #{@subject}") do |format| + format.html { render layout: 'default_email' } + end + end + + private + + def assign_default_variables + @about = About.first + @contact_message = params[:contact_message] + @user = @contact_message.user + @subject = @contact_message.subject + @content = @contact_message.content + @datetime = full_date_and_time(@contact_message.created_at) + header_image = SiteSetting.first.header_image + @header_image_url = if header_image.image_file.attached? + Rails.application.routes.url_helpers.rails_blob_path(header_image.image_file) + else + image_path_helper(image_model: header_image) + end + end +end diff --git a/app/mailers/password_mailer.rb b/app/mailers/password_mailer.rb new file mode 100644 index 00000000..0eb27df9 --- /dev/null +++ b/app/mailers/password_mailer.rb @@ -0,0 +1,31 @@ +class PasswordMailer < ApplicationMailer + include AttachmentHelper + + default from: Rails.configuration.email_no_reply_address + + def password_reset_email + assign_default_variables + mail(to: @user.email, subject: "Password Reset: #{@user.email}") do |format| + format.html { render layout: 'default_email' } + end + end + + def password_updated_email + assign_default_variables + mail(to: @user.email, subject: "Your Password Has Been Updated: #{@user.email}") do |format| + format.html { render layout: 'default_email' } + end + end + + private + + def assign_default_variables + @user = params[:user] + header_image = SiteSetting.first.header_image + @header_image_url = if header_image.image_file.attached? + Rails.application.routes.url_helpers.rails_blob_path(header_image.image_file) + else + image_path_helper(image_model: header_image) + end + end +end diff --git a/app/models/about.rb b/app/models/about.rb new file mode 100644 index 00000000..149942e9 --- /dev/null +++ b/app/models/about.rb @@ -0,0 +1,51 @@ +# == Schema Information +# +# Table name: abouts +# +# id :bigint not null, primary key +# about_me :text +# contact_email :string not null +# github_link :string +# linkedin_link :string +# location :string not null +# name :string not null +# section_title :string +# created_at :datetime not null +# updated_at :datetime not null +# +class About < ApplicationRecord + has_one :profile_image, dependent: :destroy + accepts_nested_attributes_for :profile_image, allow_destroy: true + + validates :linkedin_link, + url: { allow_blank: true, message: 'Linkedin link is not valid' } + + validates :github_link, + url: { allow_blank: true, message: 'Github link is not valid' } + + validates :name, + length: { minimum: 1, message: 'Name cannot be blank' } + + validates :location, + length: { minimum: 1, message: 'Location cannot be blank' } + + validates :contact_email, + format: { with: URI::MailTo::EMAIL_REGEXP, message: 'Email must be valid format' } + + validates_associated :profile_image + + def change_messages + messages = [] + messages += (previous_changes.keys - ['updated_at']) + messages.map!{ |key| "#{key.humanize} updated!" } + messages.push('Profile image updated!') if profile_image&.change_messages&.any? + messages + end + + def footer_links + { + github_link: github_link, + linkedin_link: linkedin_link + } + end +end diff --git a/app/models/code_snippet.rb b/app/models/code_snippet.rb new file mode 100644 index 00000000..6915c3a5 --- /dev/null +++ b/app/models/code_snippet.rb @@ -0,0 +1,50 @@ +# == Schema Information +# +# Table name: code_snippets +# +# id :bigint not null, primary key +# extension :string not null +# overview :string not null +# snippet :text not null +# text :text +# title :string not null +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint +# +# Indexes +# +# index_code_snippets_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# +class CodeSnippet < ApplicationRecord + belongs_to :user + + has_one :code_snippet_image, dependent: :destroy + + validates :title, + length: { minimum: 1, maximum: 60, message: 'Title length must be between 1 and 60 charaters' } + + validates :overview, + length: { minimum: 1, maximum: 160, message: 'Overview length must be between 1 and 160 charaters' } + + validates :snippet, + length: { minimum: 1, message: 'Code snippet cannot be blank' } + + validates :extension, + format: { with: /\A[a-zA-Z0-9]+\z/, message: 'Code must be valid file extension' } + + after_commit :render_code_snippet + + def render_code_snippet + RenderCodeSnippetJob.set(wait: 5.seconds).perform_later(model: create_code_snippet_image, snippet: snippet, extension: extension) if snippet_previously_changed? + end + + def to_param + parameterized_title = "-#{title.parameterize}" if title.present? + "#{id}#{parameterized_title}" + end +end diff --git a/app/models/contact_message.rb b/app/models/contact_message.rb new file mode 100644 index 00000000..d76cbe53 --- /dev/null +++ b/app/models/contact_message.rb @@ -0,0 +1,56 @@ +# == Schema Information +# +# Table name: contact_messages +# +# id :bigint not null, primary key +# content :text not null +# email :string not null +# from :string not null +# subject :string not null +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint +# +# Indexes +# +# index_contact_messages_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# +class ContactMessage < ApplicationRecord + belongs_to :user + + validates :from, + length: { minimum: 1, message: 'From field cannot be blank' } + + validates :email, + format: { with: URI::MailTo::EMAIL_REGEXP, message: 'Email must be valid' } + + validates :subject, + length: { minimum: 1, message: 'Subject cannot be blank' } + + validates :content, + length: { minimum: 1, message: 'Content cannot be blank' } + + before_validation :sanitize_inputs + after_commit :send_contact_message + + def sanitize_inputs + self.from = sanitize(from) + self.email = sanitize(email) + self.subject = sanitize(subject) + self.content = sanitize(content) + end + + def send_contact_message + NewContactMessageJob.perform_later(contact_message: self) + end + + private + + def sanitize(string) + ActionView::Base.full_sanitizer.sanitize(string) + end +end diff --git a/app/models/event.rb b/app/models/event.rb new file mode 100644 index 00000000..1279c5c2 --- /dev/null +++ b/app/models/event.rb @@ -0,0 +1,26 @@ +# == Schema Information +# +# Table name: ahoy_events +# +# id :bigint not null, primary key +# name :string +# properties :jsonb +# time :datetime +# user_id :bigint +# visit_id :bigint +# +# Indexes +# +# index_ahoy_events_on_name_and_time (name,time) +# index_ahoy_events_on_properties (properties) USING gin +# index_ahoy_events_on_user_id (user_id) +# index_ahoy_events_on_visit_id (visit_id) +# +class Event < ApplicationRecord + include Ahoy::QueryMethods + + self.table_name = 'ahoy_events' + + belongs_to :visit + belongs_to :user, optional: true +end diff --git a/app/models/image.rb b/app/models/image.rb new file mode 100644 index 00000000..d390b492 --- /dev/null +++ b/app/models/image.rb @@ -0,0 +1,73 @@ +class Image < ApplicationRecord + require 'image_processing' + require 'mini_magick' + + self.abstract_class = true + + has_one_attached :image_file + + validates :description, + length: { minimum: 1, message: 'Description cannot be blank' } + + before_save :process_new_image_attachment + after_commit :process_variants + + def change_messages + messages = [] + messages += (previous_changes.keys - ['updated_at']) + messages.map!{ |key| "#{description.humanize.tr('-', ' ')} #{key.humanize(capitalize: false)} updated!" } + messages.push("#{description.humanize.tr('-', ' ')} updated!") if image_file&.attachment&.blob&.previous_changes&.any? + messages + end + + def process_new_image_attachment + image_upload = attachment_changes['image_file'] + return unless image_upload&.attachable.instance_of?(ActionDispatch::Http::UploadedFile) + process_and_reattach_image(image_upload.attachable) + end + + def process_variants + return unless attachment_changes['image_file'] + return unless respond_to?(:variant_sizes) + variant_sizes&.each_value do |process| + ProcessImageVariantJob.set(wait: 5.seconds).perform_later(model: self, variant: process) + end + end + + def self.valid?(image_path) + image = MiniMagick::Image.new(image_path) + return false unless image.mime_type.match?(%r{\Aimage/(png|jpeg)\z}i) + image.valid? + end + + def self.image_processing_pipeline(image_path:, quality: 60) + pipeline = initalize_image(image_path) + pipeline = yield(pipeline) if block_given? + pipeline + .strip + .saver(quality: quality) + .convert('jpg') + .call + end + + private + + def process_and_reattach_image(image_attachment) + validate_image(image_attachment) + processed_image_file = process_image(image_attachment) + image_file.attach( + io: File.open(processed_image_file), + filename: 'image.jpg', + content_type: image_attachment.content_type) + end + + def validate_image(image_attachment) + return if Image.valid?(image_attachment.tempfile.path) + errors.add(:base, :blank, message: 'Image invalid, please upload a jpeg or png file!') + throw(:abort) + end + + private_class_method def self.initalize_image(image_path) + ImageProcessing::MiniMagick.source(image_path) + end +end diff --git a/app/models/images/code_snippet_image.rb b/app/models/images/code_snippet_image.rb new file mode 100644 index 00000000..229fe22f --- /dev/null +++ b/app/models/images/code_snippet_image.rb @@ -0,0 +1,27 @@ +# == Schema Information +# +# Table name: code_snippet_images +# +# id :bigint not null, primary key +# description :string not null +# created_at :datetime not null +# updated_at :datetime not null +# code_snippet_id :bigint not null +# +# Indexes +# +# index_code_snippet_images_on_code_snippet_id (code_snippet_id) +# +# Foreign Keys +# +# fk_rails_... (code_snippet_id => code_snippets.id) +# +class CodeSnippetImage < Image + belongs_to :code_snippet + + before_validation :set_defaults + + def set_defaults + self.description ||= 'code-snippet-image' + end +end \ No newline at end of file diff --git a/app/models/images/cover_image.rb b/app/models/images/cover_image.rb new file mode 100644 index 00000000..c9232c3f --- /dev/null +++ b/app/models/images/cover_image.rb @@ -0,0 +1,37 @@ +# == Schema Information +# +# Table name: cover_images +# +# id :bigint not null, primary key +# description :string +# link :string +# x_loc :integer default(50) +# y_loc :integer default(50) +# created_at :datetime not null +# updated_at :datetime not null +# site_setting_id :bigint +# +# Indexes +# +# index_cover_images_on_site_setting_id (site_setting_id) +# +# Foreign Keys +# +# fk_rails_... (site_setting_id => site_settings.id) +# +class CoverImage < SiteImage + X_DIM = 1100 + Y_DIM = 600 + + def default_image + 'default_images/default_cover_image.jpg' + end + + def x_dim + X_DIM + end + + def y_dim + Y_DIM + end +end diff --git a/app/models/images/gallery_image.rb b/app/models/images/gallery_image.rb new file mode 100644 index 00000000..32536d43 --- /dev/null +++ b/app/models/images/gallery_image.rb @@ -0,0 +1,114 @@ +# == Schema Information +# +# Table name: gallery_images +# +# id :bigint not null, primary key +# date_taken :datetime +# description :string not null +# latitude :decimal(10, 6) +# longitude :decimal(10, 6) +# title :string +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint not null +# +# Indexes +# +# index_gallery_images_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# +class GalleryImage < Image + require 'mini_magick' + + MAX_DIM = 3000 + + VARIANT_SIZES = { + thumbnail: { resize_to_limit: [700, 500] } + }.freeze + + belongs_to :user + + validates :date_taken, + date: { + message: 'Date taken must be date' + } + + validates :latitude, + numericality: { + allow_nil: true, + message: 'Latitude must be a (10, 6) decimal' + }, + format: { + allow_nil: true, + with: /\A[+-]?\d{1,3}\.\d{0,7}\z/, + message: 'Latitude must be a (10, 6) decimal' + } + + validates :longitude, + numericality: { + allow_nil: true, + message: 'Longitude must be a (10, 6) decimal' + }, + format: { + allow_nil: true, + with: /\A[+-]?\d{1,3}\.\d{0,7}\z/, + message: 'Longitude must be a (10, 6) decimal' + } + + before_validation :extract_meta_data, :set_defaults + + def variant_sizes + VARIANT_SIZES + end + + private + + def set_defaults + self.description ||= 'gallery-image' + self.date_taken ||= DateTime.current + end + + def process_image(attached_image) + Image.image_processing_pipeline(image_path: attached_image, quality: 80) do |pipeline| + pipeline.resize_to_limit(MAX_DIM, MAX_DIM) + end + end + + def extract_meta_data + image_upload = attachment_changes['image_file'] + return unless image_upload&.attachable.instance_of?(ActionDispatch::Http::UploadedFile) + image_meta_data = MiniMagick::Image.new(image_upload.attachable.tempfile.path).exif + extract_date_taken(image_meta_data) + extract_gps_coordinates(image_meta_data) + end + + def extract_date_taken(image_meta_data) + return unless date_taken.blank? && image_meta_data['DateTimeOriginal'] + begin + self.date_taken = DateTime.parse(image_meta_data['DateTimeOriginal'].tr(':', '-')) + rescue StandardError + self.date_taken = nil + end + end + + def extract_gps_coordinates(image_meta_data) + return unless longitude.blank? && latitude.blank? && image_meta_data['GPSLatitude'] && image_meta_data['GPSLatitudeRef'] + begin + self.latitude = parse_exif_dms(coordinate: image_meta_data['GPSLatitude'], ref: image_meta_data['GPSLatitudeRef']) + self.longitude = parse_exif_dms(coordinate: image_meta_data['GPSLongitude'], ref: image_meta_data['GPSLongitudeRef']) + rescue StandardError + self.latitude = nil + self.longitude = nil + end + end + + def parse_exif_dms(coordinate:, ref:) + d, m, s = coordinate.split(', ').map(&:to_r) + dd = d + (m / 60) + (s / 3600) + dd *= -1 if %w[S W].include?(ref) + dd + end +end diff --git a/app/models/images/header_image.rb b/app/models/images/header_image.rb new file mode 100644 index 00000000..5dd83b6f --- /dev/null +++ b/app/models/images/header_image.rb @@ -0,0 +1,36 @@ +# == Schema Information +# +# Table name: header_images +# +# id :bigint not null, primary key +# description :string +# x_loc :integer default(50) +# y_loc :integer default(50) +# created_at :datetime not null +# updated_at :datetime not null +# site_setting_id :bigint +# +# Indexes +# +# index_header_images_on_site_setting_id (site_setting_id) +# +# Foreign Keys +# +# fk_rails_... (site_setting_id => site_settings.id) +# +class HeaderImage < SiteImage + X_DIM = 2560 + Y_DIM = 300 + + def default_image + 'default_images/default_header_image.jpg' + end + + def x_dim + X_DIM + end + + def y_dim + Y_DIM + end +end diff --git a/app/models/images/post_section_image.rb b/app/models/images/post_section_image.rb new file mode 100644 index 00000000..351e7d86 --- /dev/null +++ b/app/models/images/post_section_image.rb @@ -0,0 +1,46 @@ +# == Schema Information +# +# Table name: post_section_images +# +# id :bigint not null, primary key +# description :string default("post-image"), not null +# title :string +# created_at :datetime not null +# updated_at :datetime not null +# post_section_id :bigint not null +# +# Indexes +# +# index_post_section_images_on_post_section_id (post_section_id) +# +# Foreign Keys +# +# fk_rails_... (post_section_id => post_sections.id) +# +class PostSectionImage < Image + belongs_to :post_section + + before_save :assign_description_from_title + + MAX_DIM = 3000 + + VARIANT_SIZES = { + thumbnail: { resize_to_limit: [1000, 1000] } + }.freeze + + def variant_sizes + VARIANT_SIZES + end + + private + + def process_image(attached_image) + Image.image_processing_pipeline(image_path: attached_image, quality: 80) do |pipeline| + pipeline.resize_to_limit(MAX_DIM, MAX_DIM) + end + end + + def assign_description_from_title + self.description = title unless title.nil? || title.blank? + end +end diff --git a/app/models/images/profile_image.rb b/app/models/images/profile_image.rb new file mode 100644 index 00000000..cf1830f4 --- /dev/null +++ b/app/models/images/profile_image.rb @@ -0,0 +1,46 @@ +# == Schema Information +# +# Table name: profile_images +# +# id :bigint not null, primary key +# description :string +# created_at :datetime not null +# updated_at :datetime not null +# about_id :bigint +# +# Indexes +# +# index_profile_images_on_about_id (about_id) +# +# Foreign Keys +# +# fk_rails_... (about_id => abouts.id) +# +class ProfileImage < Image + belongs_to :about + + X_DIM = 500 + Y_DIM = 500 + + before_validation :set_defaults + + def set_defaults + self.description ||= 'about-me-profile-image' + end + + def x_dim + X_DIM + end + + def y_dim + Y_DIM + end + + private + + def process_image(attached_image) + Image.image_processing_pipeline(image_path: attached_image) do |pipeline| + pipeline.resize_to_fill(x_dim, y_dim, gravity: 'north-west') + end + end +end diff --git a/app/models/images/project_image.rb b/app/models/images/project_image.rb new file mode 100644 index 00000000..b595e9cd --- /dev/null +++ b/app/models/images/project_image.rb @@ -0,0 +1,39 @@ +# == Schema Information +# +# Table name: project_images +# +# id :bigint not null, primary key +# description :string default("project-image"), not null +# order :integer +# title :string +# created_at :datetime not null +# updated_at :datetime not null +# project_id :bigint not null +# +# Indexes +# +# index_project_images_on_project_id (project_id) +# +# Foreign Keys +# +# fk_rails_... (project_id => projects.id) +# +class ProjectImage < Image + MAX_DIM = 2000 + + VARIANT_SIZES = { + thumbnail: { resize_to_limit: [1200, 850] } + }.freeze + + belongs_to :project + + def variant_sizes + VARIANT_SIZES + end + + def process_image(attached_image) + Image.image_processing_pipeline(image_path: attached_image, quality: 80) do |pipeline| + pipeline.resize_to_limit(MAX_DIM, MAX_DIM) + end + end +end diff --git a/app/models/images/site_image.rb b/app/models/images/site_image.rb new file mode 100644 index 00000000..c7a8fe4e --- /dev/null +++ b/app/models/images/site_image.rb @@ -0,0 +1,41 @@ +class SiteImage < Image + self.abstract_class = true + + belongs_to :site_setting + + DEFAULT_X_LOC = 50 + DEFAULT_Y_LOC = 50 + + validates :x_loc, + presence: true, + numericality: { + greater_than_or_equal_to: 0, + less_than_or_equal_to: 100, + message: 'X loc must be in range 0-100' + } + + validates :y_loc, + presence: true, + numericality: { + greater_than_or_equal_to: 0, + less_than_or_equal_to: 100, + message: 'Y loc must be in range 0-100' + } + + def custom_style + "object-position: #{x_loc}% #{y_loc}%;" if x_loc != DEFAULT_X_LOC || y_loc != DEFAULT_Y_LOC + end + + def reset_to_default + image_file.purge_later + update(x_loc: DEFAULT_X_LOC, y_loc: DEFAULT_Y_LOC) + end + + private + + def process_image(attached_image) + Image.image_processing_pipeline(image_path: attached_image) do |pipeline| + pipeline.resize_to_fill(x_dim, y_dim, gravity: 'north-west') + end + end +end diff --git a/app/models/post.rb b/app/models/post.rb new file mode 100644 index 00000000..76090956 --- /dev/null +++ b/app/models/post.rb @@ -0,0 +1,44 @@ +# == Schema Information +# +# Table name: posts +# +# id :bigint not null, primary key +# date_published :datetime not null +# overview :string not null +# title :string not null +# visible :boolean default(TRUE), not null +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint not null +# +# Indexes +# +# index_posts_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# +class Post < ApplicationRecord + belongs_to :user + + has_many :post_sections, -> { order(order: :asc) }, dependent: :destroy, inverse_of: :post + accepts_nested_attributes_for :post_sections, allow_destroy: true + validates_associated :post_sections + + validates :date_published, + date: { message: 'Date published must be date' } + + validates :overview, + length: { minimum: 1, message: 'Blog post overview cannot be empty' } + + validates :title, + length: { minimum: 1, message: 'Blog post title cannot be empty' } + + validates :visible, inclusion: { in: [true, false] } + + def to_param + parameterized_title = "-#{title.parameterize}" if title.present? + "#{id}#{parameterized_title}" + end +end diff --git a/app/models/post_section.rb b/app/models/post_section.rb new file mode 100644 index 00000000..ecb6a361 --- /dev/null +++ b/app/models/post_section.rb @@ -0,0 +1,29 @@ +# == Schema Information +# +# Table name: post_sections +# +# id :bigint not null, primary key +# order :integer default(0), not null +# text :text +# created_at :datetime not null +# updated_at :datetime not null +# post_id :bigint +# +# Indexes +# +# index_post_sections_on_post_id (post_id) +# +# Foreign Keys +# +# fk_rails_... (post_id => posts.id) +# +class PostSection < ApplicationRecord + belongs_to :post + + has_one :post_section_image, dependent: :destroy, inverse_of: :post_section + accepts_nested_attributes_for :post_section_image, allow_destroy: true + validates_associated :post_section_image + + validates :order, + presence: { message: 'Post Section order cannot be nil' } +end diff --git a/app/models/project.rb b/app/models/project.rb new file mode 100644 index 00000000..17c608af --- /dev/null +++ b/app/models/project.rb @@ -0,0 +1,51 @@ +# == Schema Information +# +# Table name: projects +# +# id :bigint not null, primary key +# date :datetime not null +# github_link :string +# overview :text +# site_link :string +# title :string not null +# created_at :datetime not null +# updated_at :datetime not null +# +class Project < ApplicationRecord + has_many :project_images, -> { order(order: :asc) }, dependent: :destroy, inverse_of: :project + accepts_nested_attributes_for :project_images, allow_destroy: true + validates_associated :project_images + + validates :title, + length: { minimum: 1, message: 'Title cannot be empty' } + + validates :date, + date: { message: 'Date format invalid' } + + validates :github_link, + url: { allow_blank: true, message: 'Github link is not valid' } + + validates :site_link, + url: { allow_blank: true, message: 'Site link is not valid' } + + def render_code_snippet(**kwargs) + return false unless code_snippet_valid?(**kwargs) + + RenderCodeSnippetJob.set(wait: 5.seconds).perform_later(model: project_images.create, **kwargs) + true + end + + def self.all_with_images + order(date: :desc).includes(:project_images).order('project_images.order ASC') + end + + private + + def code_snippet_valid?(snippet:, extension:) + return false unless snippet.is_a?(String) + return false unless snippet.length > 0 + return false unless extension.is_a?(String) + return false unless /\A[a-zA-Z0-9]+\z/.match?(extension) + true + end +end diff --git a/app/models/site_setting.rb b/app/models/site_setting.rb new file mode 100644 index 00000000..4a2c6ff4 --- /dev/null +++ b/app/models/site_setting.rb @@ -0,0 +1,36 @@ +# == Schema Information +# +# Table name: site_settings +# +# id :bigint not null, primary key +# name :string +# created_at :datetime not null +# updated_at :datetime not null +# typed_header_enabled :boolean +# header_text :string +# subtitle_text :string +# +class SiteSetting < ApplicationRecord + require 'mini_magick' + + has_one :header_image, dependent: :destroy + has_many :cover_images, dependent: :destroy + + validates :name, + length: { in: 1..255, too_short: 'Site name cannot be blank', too_long: 'Site name cannot be longer than 255 charaters' } + + validates :typed_header_enabled, + inclusion: { in: [true, false] } + + validates :header_text, + length: { maximum: 255, too_long: 'Header text cannot be longer than 255 charaters' } + + validates :subtitle_text, + length: { maximum: 255, too_long: 'Subtitle text cannot be longer than 255 charaters' } + + def change_messages + messages = [] + messages += (previous_changes.keys - ['updated_at']) + messages.map!{ |key| "#{key.humanize} updated!" } + end +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 00000000..8132b1cd --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,111 @@ +# == Schema Information +# +# Table name: users +# +# id :bigint not null, primary key +# current_login_ip :string +# current_login_time :datetime +# email :text +# last_login_ip :string +# last_login_time :datetime +# mobile_number :text +# password_digest :text +# password_reset_expiry :datetime +# password_reset_token :string +# username :text +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_users_on_email (email) UNIQUE +# index_users_on_mobile_number (mobile_number) UNIQUE +# index_users_on_username (username) UNIQUE +# +class User < ApplicationRecord + DEFAULT_REMOTE_IP = '127.0.0.1'.freeze + + has_many :posts, dependent: :destroy + has_many :gallery_images, dependent: :destroy + has_many :contact_messages, dependent: :destroy + has_many :code_snippets, dependent: :destroy + + has_secure_password validations: false + after_initialize :add_defaults + after_validation :convert_mobile_number, if: -> { :mobile_number_changed? && !mobile_number.nil? } + after_save :remove_password_reset + + validates :password, + presence: true, + length: { minimum: 8, too_short: 'The password must have at least 8 characters' }, + confirmation: { message: 'Passwords do not match' }, + if: -> { new_record? || !password.nil? } + + validates :username, + presence: true, + uniqueness: { message: 'Username already taken' }, + format: { with: /\A[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*\z/, message: 'Only standard charaters and [ _-] are allowed' }, + confirmation: { message: 'Usernames do not match' }, + if: -> { new_record? || !username.nil? } + + validates :email, + presence: true, + uniqueness: { message: 'Email address already taken' }, + format: { with: URI::MailTo::EMAIL_REGEXP, message: 'Email must be valid format' }, + confirmation: { message: 'Emails do not match' }, + if: -> { new_record? || !email.nil? } + + validates :mobile_number, + uniqueness: { message: 'Mobile phone numbers already taken' }, + format: { with: /\A(\+44|0)7\d{9}\z/, message: 'Please enter valid UK mobile phone number' }, + confirmation: { message: 'Mobile phone numbers do not match' }, + if: -> { !mobile_number.nil? } + + def send_password_reset_email! + generate_hashed_token + PasswordMailer.with(user: self).password_reset_email.deliver_now + end + + def self.user_from_password_reset_token(token) + return unless token + return unless (reset_user = User.find_by(password_reset_token: token)) + reset_user if reset_user.password_reset_expiry > Time.zone.now + end + + def send_password_updated_email! + PasswordMailer.with(user: self).password_updated_email.deliver_now + end + + def convert_mobile_number + self.mobile_number = mobile_number.sub(/\A(0)(7\d{9})\z/, '+44\2') + self.mobile_number_confirmation = mobile_number_confirmation.sub(/\A(0)(7\d{9})\z/, '+44\2') if mobile_number_confirmation + end + + def record_ip(request) + update({ + last_login_time: current_login_time, + last_login_ip: current_login_ip, + current_login_time: Time.zone.now, + current_login_ip: request.remote_ip + }) + end + + private + + def add_defaults + self.last_login_time ||= Time.zone.now + self.last_login_ip ||= DEFAULT_REMOTE_IP + end + + def remove_password_reset + update(password_reset_token: nil, password_reset_expiry: nil) if previous_changes.key?('password_digest') && password_reset_token && password_reset_expiry + end + + def generate_hashed_token + unique_token = loop do + token = SecureRandom.urlsafe_base64(32) + break token unless User.exists?(password_reset_token: token) + end + update(password_reset_token: unique_token, password_reset_expiry: 1.hour.from_now) + end +end diff --git a/app/models/visit.rb b/app/models/visit.rb new file mode 100644 index 00000000..01abf8e0 --- /dev/null +++ b/app/models/visit.rb @@ -0,0 +1,43 @@ +# == Schema Information +# +# Table name: ahoy_visits +# +# id :bigint not null, primary key +# app_version :string +# browser :string +# city :string +# country :string +# device_type :string +# ip :string +# landing_page :text +# latitude :float +# longitude :float +# os :string +# os_version :string +# platform :string +# referrer :text +# referring_domain :string +# region :string +# started_at :datetime +# user_agent :text +# utm_campaign :string +# utm_content :string +# utm_medium :string +# utm_source :string +# utm_term :string +# visit_token :string +# visitor_token :string +# user_id :bigint +# +# Indexes +# +# index_ahoy_visits_on_user_id (user_id) +# index_ahoy_visits_on_visit_token (visit_token) UNIQUE +# + +class Visit < ApplicationRecord + self.table_name = 'ahoy_visits' + + has_many :events, class_name: 'Ahoy::Event', dependent: :destroy + belongs_to :user, optional: true +end diff --git a/app/serializers/gallery_image_serializer.rb b/app/serializers/gallery_image_serializer.rb new file mode 100644 index 00000000..3ae942e2 --- /dev/null +++ b/app/serializers/gallery_image_serializer.rb @@ -0,0 +1,36 @@ +# == Schema Information +# +# Table name: gallery_images +# +# id :bigint not null, primary key +# date_taken :datetime +# description :string not null +# latitude :decimal(10, 6) +# longitude :decimal(10, 6) +# title :string +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint not null +# +# Indexes +# +# index_gallery_images_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# +class GalleryImageSerializer + include JSONAPI::Serializer + extend AttachmentHelper + + attributes :title, :description + + attribute :thumbnail_url do |gallery_image| + fetch_image_url(image_model: gallery_image, variant: :thumbnail) + end + + attribute :url do |gallery_image| + fetch_image_url(image_model: gallery_image) + end +end diff --git a/app/services/re_captcha_service.rb b/app/services/re_captcha_service.rb new file mode 100644 index 00000000..c5fa8321 --- /dev/null +++ b/app/services/re_captcha_service.rb @@ -0,0 +1,16 @@ +require 'faraday' +require 'json' + +module ReCaptchaService + mattr_accessor :logger + + class << self + def recaptcha_valid?(client_response) + response = Faraday.post('https://www.google.com/recaptcha/api/siteverify') do |request| + request.params['secret'] = Rails.configuration.grecaptcha_site_secret + request.params['response'] = client_response + end + JSON.parse(response.body)['success'] == true + end + end +end \ No newline at end of file diff --git a/app/services/render_code_snippet_service.rb b/app/services/render_code_snippet_service.rb new file mode 100644 index 00000000..6958f1b7 --- /dev/null +++ b/app/services/render_code_snippet_service.rb @@ -0,0 +1,68 @@ +module RenderCodeSnippetService + def self.render_and_attach_image(snippet_text:, syntax_extension:, attachment:, start_line: nil, end_line: nil) + renderer = Renderer.new(snippet_text: snippet_text, syntax_extension: syntax_extension, attachment: attachment, start_line: start_line, end_line: end_line) + renderer.perform! + end + + class Renderer + require 'tempfile' + + DEFAULT_FILENAME = 'code-snippet'.freeze + + def initialize(snippet_text:, syntax_extension:, attachment:, start_line: nil, end_line: nil) + @config_path = Rails.root.join('config/carbon-config.json') + @text = snippet_text + @extension = syntax_extension.match?(/\A\.[A-Za-z0-9]\z/) ? syntax_extension : ".#{syntax_extension}" + @attachment = attachment + @filename = DEFAULT_FILENAME + @start_line = start_line + @end_line = end_line + end + + def perform! + generate_temp_files + generate_image + attach_image + cleanup + end + + private + + def generate_temp_files + @tmp_img_file = Tempfile.new('code-snippet-image') + @tmp_code_file = Tempfile.new([@filename, @extension]) + @tmp_code_file.write(@text) + @tmp_code_file.rewind + @tmp_img_file.close + @tmp_img_file.close + end + + def generate_image + command = [ + 'carbon-now', + @tmp_code_file.path, + "-l #{File.dirname(@tmp_img_file.path)}", + "-t #{File.basename(@tmp_img_file.path)}", + '--headless', + "--config #{@config_path}", + '-p default' + ] + command.push("-s #{@start_line}") if @start_line + command.push("-e #{@end_line}") if @end_line + io = IO.popen(command.join(' '), 'w+') + io.close + end + + def attach_image + @attachment.attach( + io: File.open("#{@tmp_img_file.path}.png"), + filename: "#{@filename}.png", + content_type: 'image/png') + end + + def cleanup + @tmp_code_file.unlink + @tmp_img_file.unlink + end + end +end \ No newline at end of file diff --git a/app/services/two_factor_auth_service.rb b/app/services/two_factor_auth_service.rb new file mode 100644 index 00000000..a00710a0 --- /dev/null +++ b/app/services/two_factor_auth_service.rb @@ -0,0 +1,72 @@ +module TwoFactorAuthService + require 'twilio-ruby' + + mattr_accessor :logger, :twilio_client + + class << self + def start(session, user) + session[:two_factor_auth_id] = user.id + true + end + + def started?(session) + !!session[:two_factor_auth_id] + end + + def send_auth_code(session) + return true if auth_code_sent?(session) + user_mobile_number = get_user_mobile_number(session) + return false unless user_mobile_number + begin + twilio_client + .verifications + .create(to: user_mobile_number, channel: 'sms') + session[:two_factor_auth_code_sent] = true + true + rescue StandardError => e + logger.error(e) + false + end + end + + def auth_code_format_valid?(auth_code) + auth_code.match?(/^\d{6}$/) + end + + def auth_code_valid?(session:, auth_code:) + return false unless auth_code_sent?(session) + user_mobile_number = get_user_mobile_number(session) + return false unless user_mobile_number + begin + verification_check = twilio_client + .verification_checks + .create(to: user_mobile_number, code: auth_code) + verification_check.status == 'approved' + rescue StandardError => e + logger.error(e) + false + end + end + + def get_user(session) + User.find_by(id: session[:two_factor_auth_id]) + end + + private + + def get_user_mobile_number(session) + get_user(session)&.mobile_number + end + + def twilio_client + @twilio_client ||= Twilio::REST::Client + .new(Rails.configuration.twilio_account_sid, Rails.configuration.twilio_auth_token) + .verify + .services(Rails.configuration.twilio_verify_service_sid) + end + + def auth_code_sent?(session) + session[:two_factor_auth_code_sent] == true + end + end +end \ No newline at end of file diff --git a/app/views/abouts/show.html.erb b/app/views/abouts/show.html.erb new file mode 100644 index 00000000..6020c498 --- /dev/null +++ b/app/views/abouts/show.html.erb @@ -0,0 +1,21 @@ +<% content_for :section_title do %> + <%= @about.section_title %> +<% end %> + +<% content_for :meta_title do %> + <%= @about.section_title %> +<% end %> + +<% content_for :meta_description do %> + A little bit about me... +<% end %> + +
+ <%= render partial: 'partials/admin_toolbar', locals: { model: @about, singular: true } %> + + <%= render partial: 'partials/profile_image', locals: { model: @about, contact_link: true } %> + +
+ <%= markdown_admin(@about.about_me) %> +
+
diff --git a/app/views/admin/abouts/_edit_form.html.erb b/app/views/admin/abouts/_edit_form.html.erb new file mode 100644 index 00000000..6ca8ce07 --- /dev/null +++ b/app/views/admin/abouts/_edit_form.html.erb @@ -0,0 +1,51 @@ + +<%= turbo_frame_tag 'admin_abouts_edit_form' do %> + <%= form_with(model: [:admin, about], method: "put", class: 'section-form', id: 'admin-abouts-edit-form') do |f| %> + + <%= render partial: 'layouts/images/profile_image_upload', locals: {image: about.profile_image, form: f} %> + +
+ <%= f.label(:section_title, 'Section title', class: 'input-label embedded-label') %> + <%= f.text_field(:section_title, class: 'input-box embedded-input-box', placeholder: 'Enter about section title') %> +
+ +
+ <%= f.label(:name, 'Contact name', class: 'input-label embedded-label') %> + <%= f.text_field(:name, class: 'input-box embedded-input-box', placeholder: 'Enter contact name') %> +
+ +
+ <%= f.label(:location, 'Location', class: 'input-label embedded-label') %> + <%= f.text_field(:location, class: 'input-box embedded-input-box', placeholder: 'Enter location (this is public)') %> +
+ +
+ <%= f.label(:contact_email, 'Contact email', class: 'input-label embedded-label') %> + <%= f.text_field(:contact_email, class: 'input-box embedded-input-box', placeholder: 'Enter contact email') %> +
+ +
+ <%= f.label(:linkedin_link, 'LinkedIn Link', class: 'input-label embedded-label') %> + <%= f.text_field(:linkedin_link, class: 'input-box embedded-input-box', placeholder: 'Enter valid link') %> +
+ +
+ <%= f.label(:github_link, 'Github Link', class: 'input-label embedded-label') %> + <%= f.text_field(:github_link, class: 'input-box embedded-input-box', placeholder: 'Enter valid link') %> +
+ +
+ <%= f.label(:about_me, 'About me', class: 'input-label embedded-label') %> +
+ +
+ <%= f.text_area(:about_me, class: 'input-box embedded-text-area', placeholder: 'Add about me text (you can use markdown)...') %> +
+ +
+ <%= render partial: "partials/submit_right", locals: {form: f, button_text: 'Update About'} %> +
+ + <%= render partial: 'partials/system_messages' %> + <% end %> +<% end %> \ No newline at end of file diff --git a/app/views/admin/abouts/edit.html.erb b/app/views/admin/abouts/edit.html.erb new file mode 100644 index 00000000..68a43052 --- /dev/null +++ b/app/views/admin/abouts/edit.html.erb @@ -0,0 +1,14 @@ +<% content_for :section_subtitle do %> + About/Contact +<% end %> + +
+

+ Update About and Contact details +

+
+<%= render partial: 'admin/abouts/edit_form', locals: { about: @about } %> + +
+ <%= link_to('Return', about_path, class: 'standard-button input-submit') %> +
diff --git a/app/views/admin/code_snippets/_edit_form.html.erb b/app/views/admin/code_snippets/_edit_form.html.erb new file mode 100644 index 00000000..76d65f14 --- /dev/null +++ b/app/views/admin/code_snippets/_edit_form.html.erb @@ -0,0 +1,16 @@ +<%= turbo_frame_tag 'admin_code_snippets_edit_form' do %> + <%= form_with(model: [:admin, code_snippet], method: 'put', class: 'section-form', id: 'admin-code-snippets-edit-form', data: { turbo_frame: '_top' }) do |f| %> + + <%= render partial: 'admin/code_snippets/form_components', locals: { f: f } %> + + <% end %> + +
+ <%= link_to('Return', code_snippet_path(code_snippet), class: 'standard-button input-submit') %> + <%= form_with(model: [:admin, code_snippet], method: :delete) do |r| %> + <%= r.submit("Remove", class: 'input-submit destroy-button', data: {confirm: "Are you sure?"}) %> + <% end %> +
+<% end %> + + diff --git a/app/views/admin/code_snippets/_form_components.html.erb b/app/views/admin/code_snippets/_form_components.html.erb new file mode 100644 index 00000000..a302123c --- /dev/null +++ b/app/views/admin/code_snippets/_form_components.html.erb @@ -0,0 +1,37 @@ + +
+ <%= f.label(:title, 'Title', class: 'input-label embedded-label') %> + <%= f.text_field(:title, class: 'input-box embedded-input-box', placeholder: 'Enter title...') %> +
+ +
+ <%= f.label(:overview, 'Overview', class: 'input-label embedded-label') %> + <%= f.text_field(:overview, class: 'input-box embedded-input-box', placeholder: 'Enter overview...') %> +
+ +
+ <%= f.label(:snippet, 'Code Snippet', class: 'input-label embedded-label') %> +
+ +
+ <%= f.text_area(:snippet, class: 'input-box embedded-text-area', placeholder: 'Enter code snippet to be rendered into cover image...') %> +
+ +
+ <%= f.label(:extension, 'Code file extension', class: 'input-label embedded-label') %> + <%= f.text_field(:extension, class: 'input-box embedded-input-box', placeholder: 'Enter file extension such as `rb`...') %> +
+ +
+ <%= f.label(:text, 'Text content', class: 'input-label embedded-label') %> +
+ +
+ <%= f.text_area(:text, class: 'input-box embedded-text-area', placeholder: 'Add text content (you can use markdown)...') %> +
+ +
+ <%= render partial: "partials/submit_right", locals: {form: f, button_text: 'Submit'} %> +
+ +<%= render partial: 'partials/system_messages' %> diff --git a/app/views/admin/code_snippets/_new_form.html.erb b/app/views/admin/code_snippets/_new_form.html.erb new file mode 100644 index 00000000..3a35aac9 --- /dev/null +++ b/app/views/admin/code_snippets/_new_form.html.erb @@ -0,0 +1,12 @@ +<%= turbo_frame_tag 'admin_code_snippets_new_form' do %> + <%= form_with(model: [:admin, code_snippet], class: 'section-form', id: 'admin-code-snippets-new-form', data: { turbo_frame: '_top' } ) do |f| %> + + <%= render partial: 'admin/code_snippets/form_components', locals: { f: f } %> + + <% end %> + +
+ <%= link_to('Return', code_snippets_path, class: 'standard-button input-submit') %> +
+<% end %> + diff --git a/app/views/admin/code_snippets/edit.html.erb b/app/views/admin/code_snippets/edit.html.erb new file mode 100644 index 00000000..887cb94b --- /dev/null +++ b/app/views/admin/code_snippets/edit.html.erb @@ -0,0 +1,7 @@ +<% content_for :section_subtitle do %> + Code Snippets: Edit Code Snippet +<% end %> + +
+ <%= render partial: 'admin/code_snippets/edit_form', locals: { code_snippet: @code_snippet } %> +
diff --git a/app/views/admin/code_snippets/edit.turbo_stream.erb b/app/views/admin/code_snippets/edit.turbo_stream.erb new file mode 100644 index 00000000..94d42ab9 --- /dev/null +++ b/app/views/admin/code_snippets/edit.turbo_stream.erb @@ -0,0 +1,2 @@ +<%# https://github.com/hotwired/turbo/issues/138#issuecomment-847699281 %> +<%= turbo_stream.replace("admin_code_snippets_edit_form", partial: 'edit_form', locals: { code_snippet: @code_snippet }) %> diff --git a/app/views/admin/code_snippets/new.html.erb b/app/views/admin/code_snippets/new.html.erb new file mode 100644 index 00000000..e3e2293c --- /dev/null +++ b/app/views/admin/code_snippets/new.html.erb @@ -0,0 +1,7 @@ +<% content_for :section_subtitle do %> + Code Snippets: New Code Snippet +<% end %> + +
+ <%= render partial: 'admin/code_snippets/new_form', locals: { code_snippet: @code_snippet } %> +
diff --git a/app/views/admin/code_snippets/new.turbo_stream.erb b/app/views/admin/code_snippets/new.turbo_stream.erb new file mode 100644 index 00000000..fa75ced0 --- /dev/null +++ b/app/views/admin/code_snippets/new.turbo_stream.erb @@ -0,0 +1,2 @@ +<%# https://github.com/hotwired/turbo/issues/138#issuecomment-847699281 %> +<%= turbo_stream.replace("admin_code_snippets_new_form", partial: 'new_form', locals: { code_snippet: @code_snippet }) %> diff --git a/app/views/admin/gallery_images/_edit_form.html.erb b/app/views/admin/gallery_images/_edit_form.html.erb new file mode 100644 index 00000000..b56ac5d4 --- /dev/null +++ b/app/views/admin/gallery_images/_edit_form.html.erb @@ -0,0 +1,27 @@ +
+
+ Current image +
+
+ <%= gallery_image.image_file.attached? ? gallery_image.image_file.attachment.blob.filename : "default #{gallery_image.description.humanize(capitalize: false)}" %> +
+
+ +
+ <%= image_tag(image_path_helper(image_model: gallery_image), class: 'embedded-full-width embedded-cover-image') %> +
+ +<%= turbo_frame_tag 'admin_gallery_images_edit_form' do %> + <%= form_with(model: [:admin, gallery_image], class: 'section-form', id: 'admin-gallery-images-edit-form', data: { turbo_frame: '_top' }) do |f| %> + + <%= render partial: 'admin/gallery_images/form_components', locals: { f: f } %> + + <% end %> + +
+ <%= link_to('Return', admin_gallery_images_path, class: 'standard-button input-submit') %> + <%= form_with(model: [:admin, gallery_image], method: :delete) do |r| %> + <%= r.submit("Remove", class: 'input-submit destroy-button', data: {confirm: "Are you sure?"}) %> + <% end %> +
+<% end %> \ No newline at end of file diff --git a/app/views/admin/gallery_images/_form_components.html.erb b/app/views/admin/gallery_images/_form_components.html.erb new file mode 100644 index 00000000..b42782c1 --- /dev/null +++ b/app/views/admin/gallery_images/_form_components.html.erb @@ -0,0 +1,30 @@ +<%= render partial: 'partials/system_messages' %> + +
+ <%= f.label(:image_file, 'Upload image', class: 'input-label embedded-label') %> + <%= f.file_field(:image_file, accept: 'image/png,image/jpeg', class: 'input-box embedded-no-border') %> +
+ +
+ <%= f.label(:title, 'Title', class: 'input-label embedded-label') %> + <%= f.text_field(:title, class: 'input-box embedded-input-box', placeholder: 'Enter title...') %> +
+ +
+ <%= f.label(:date_taken, 'Date taken', class: 'input-label embedded-label') %> + <%= f.date_field(:date_taken, class: 'input-box embedded-input-box', placeholder: 'Enter date taken...', autocomplete: "off") %> +
+ +
+ <%= f.label(:latitude, 'Latitude', class: 'input-label embedded-label') %> + <%= f.number_field(:latitude, class: 'input-box embedded-input-box', placeholder: 'Enter latitude...') %> +
+ +
+ <%= f.label(:longitude, 'Longitude', class: 'input-label embedded-label') %> + <%= f.number_field(:longitude, class: 'input-box embedded-input-box', placeholder: 'Enter longitude...') %> +
+ +
+ <%= render partial: "partials/submit_right", locals: {form: f, button_text: 'Submit'} %> +
\ No newline at end of file diff --git a/app/views/admin/gallery_images/_image_container.html.erb b/app/views/admin/gallery_images/_image_container.html.erb new file mode 100644 index 00000000..7e0679c9 --- /dev/null +++ b/app/views/admin/gallery_images/_image_container.html.erb @@ -0,0 +1,5 @@ + diff --git a/app/views/admin/gallery_images/_new_form.html.erb b/app/views/admin/gallery_images/_new_form.html.erb new file mode 100644 index 00000000..4d2ef1c1 --- /dev/null +++ b/app/views/admin/gallery_images/_new_form.html.erb @@ -0,0 +1,11 @@ +<%= turbo_frame_tag 'admin_gallery_images_new_form' do %> + <%= form_with(model: gallery_image, url: {action: 'create', controller: 'admin/gallery_images'}, class: 'section-form', id: 'admin-gallery-images-new-form', data: { turbo_frame: '_top' }) do |f| %> + + <%= render partial: 'admin/gallery_images/form_components', locals: { f: f } %> + + <% end %> + +
+ <%= link_to('Return', admin_gallery_images_path, class: 'standard-button input-submit') %> +
+<% end %> \ No newline at end of file diff --git a/app/views/admin/gallery_images/edit.html.erb b/app/views/admin/gallery_images/edit.html.erb new file mode 100644 index 00000000..9b0ee1c9 --- /dev/null +++ b/app/views/admin/gallery_images/edit.html.erb @@ -0,0 +1,9 @@ +<% content_for :section_subtitle do %> + Gallery: Edit Gallery Image +<% end %> + +
+ + <%= render partial: 'admin/gallery_images/edit_form', locals: { gallery_image: @gallery_image } %> + +
diff --git a/app/views/admin/gallery_images/edit.turbo_stream.erb b/app/views/admin/gallery_images/edit.turbo_stream.erb new file mode 100644 index 00000000..69aa2e3d --- /dev/null +++ b/app/views/admin/gallery_images/edit.turbo_stream.erb @@ -0,0 +1,2 @@ +<%# https://github.com/hotwired/turbo/issues/138#issuecomment-847699281 %> +<%= turbo_stream.replace("admin_gallery_images_edit_form", partial: 'edit_form', locals: { gallery_image: @gallery_image }) %> diff --git a/app/views/admin/gallery_images/index.html.erb b/app/views/admin/gallery_images/index.html.erb new file mode 100644 index 00000000..e37c20a6 --- /dev/null +++ b/app/views/admin/gallery_images/index.html.erb @@ -0,0 +1,19 @@ +<% content_for :section_subtitle do %> + Gallery: Index +<% end %> + +<%= render partial: 'partials/admin_toolbar', locals: { model: GalleryImage.new } %> + +<%= render partial: 'partials/system_messages' %> + + diff --git a/app/views/admin/gallery_images/new.html.erb b/app/views/admin/gallery_images/new.html.erb new file mode 100644 index 00000000..4cac2e68 --- /dev/null +++ b/app/views/admin/gallery_images/new.html.erb @@ -0,0 +1,7 @@ +<% content_for :section_subtitle do %> + Admin: New Gallery Image +<% end %> + +
+ <%= render partial: 'admin/gallery_images/new_form', locals: { gallery_image: @gallery_image } %> +
diff --git a/app/views/admin/gallery_images/new.turbo_stream.erb b/app/views/admin/gallery_images/new.turbo_stream.erb new file mode 100644 index 00000000..39570e95 --- /dev/null +++ b/app/views/admin/gallery_images/new.turbo_stream.erb @@ -0,0 +1,2 @@ +<%# https://github.com/hotwired/turbo/issues/138#issuecomment-847699281 %> +<%= turbo_stream.replace("admin_gallery_images_new_form", partial: 'new_form', locals: { gallery_image: @gallery_image }) %> diff --git a/app/views/admin/images/_edit_image_form_entry.html.erb b/app/views/admin/images/_edit_image_form_entry.html.erb new file mode 100644 index 00000000..d5551f7f --- /dev/null +++ b/app/views/admin/images/_edit_image_form_entry.html.erb @@ -0,0 +1,58 @@ +
+

<%= image.description.humanize %>

+ +<%= form_with(model: [:admin, image], method: "put") do |f| %> + +
+
+ Current image +
+
+ <%= image.image_file.attached? ? image.image_file.attachment.blob.filename : "default #{image.description.humanize(capitalize: false)}" %> +
+
+ +
+ <%= image_tag(image_path_helper(image_model: image), class: 'embedded-full-width embedded-cover-image') %> +
+ +
+
+ Note: Images will be resized to <%= image.x_dim %>px wide and cropped to <%= image.y_dim %>px tall. Accepted image formats are jpeg and png. +
+
+ +
+ <%= f.label(:image_file, 'Update image', class: 'input-label embedded-label') %> + <%= f.file_field(:image_file, accept: 'image/png,image/jpeg', class: 'input-box embedded-no-border') %> +
+ +
+ + <%= f.range_field(:x_loc, min: 0, max: 100, value: image.x_loc, class: "slider embedded-input-box", step: "1", data: { action: "input->slider#update", 'slider-target': 'input' }) %> +
+ +
+ + <%= f.range_field(:y_loc, min: 0, max: 100, value: image.y_loc, class: "slider embedded-input-box", step: "1", data: { action: "input->slider#update", 'slider-target': 'input' }) %> +
+ +
+ <%= label(:attachment, :reset, 'Reset to defaults', class: 'input-label embedded-label') %> + <%= check_box(:attachment, :reset, class: 'input-check-box') %> +
+ +
+ <%= render partial: "partials/submit_right", locals: {form: f, button_text: "Update #{image.description.humanize(capitalize: false)}"} %> +
+<% end %> diff --git a/app/views/admin/images/index.html.erb b/app/views/admin/images/index.html.erb new file mode 100644 index 00000000..b179dcb6 --- /dev/null +++ b/app/views/admin/images/index.html.erb @@ -0,0 +1,16 @@ +<% content_for :section_subtitle do %> + Images +<% end %> + +
+

+ Update site images +

+
+<%= render partial: 'partials/system_messages' %> +<% @images.each do |image| %> +
+ <%= render partial: "admin/images/edit_image_form_entry", locals: {image: image} %> +
+
+<% end %> diff --git a/app/views/admin/posts/_edit_form.html.erb b/app/views/admin/posts/_edit_form.html.erb new file mode 100644 index 00000000..ac6eb212 --- /dev/null +++ b/app/views/admin/posts/_edit_form.html.erb @@ -0,0 +1,14 @@ +<%= turbo_frame_tag 'admin_posts_edit_form' do %> + <%= form_with(model: [:admin, post], method: 'put', class: 'section-form', id: 'admin-post-update-form', data: { turbo_frame: '_top' }) do |f| %> + + <%= render partial: 'admin/posts/form_components', locals: { f: f } %> + + <% end %> + +
+ <%= link_to('Return', post_path(post), class: 'standard-button input-submit') %> + <%= form_with(model: [:admin, post], method: :delete) do |r| %> + <%= r.submit("Remove", class: 'input-submit destroy-button', data: {confirm: "Are you sure?"}) %> + <% end %> +
+<% end %> \ No newline at end of file diff --git a/app/views/admin/posts/_form_components.html.erb b/app/views/admin/posts/_form_components.html.erb new file mode 100644 index 00000000..dea1c5dc --- /dev/null +++ b/app/views/admin/posts/_form_components.html.erb @@ -0,0 +1,31 @@ +<%= render partial: 'partials/system_messages' %> + +

+ Post Details +

+ +
+ <%= f.label(:title, 'Title', class: 'input-label embedded-label') %> + <%= f.text_field(:title, class: 'input-box embedded-input-box', placeholder: 'Enter title...') %> +
+ +
+ <%= f.label(:visible, 'Is post visible?', class: 'input-label embedded-label') %> + <%= f.check_box(:visible, class: 'input-check-box') %> +
+ +
+ <%= f.label(:overview, 'Overview', class: 'input-label embedded-label') %> + <%= f.text_field(:overview, class: 'input-box embedded-input-box', placeholder: 'Enter overview...') %> +
+ +
+ <%= f.label(:date_published, 'Date published', class: 'input-label embedded-label') %> + <%= f.date_field(:date_published, class: 'input-box embedded-input-box', placeholder: 'Enter date published...', autocomplete: "off") %> +
+ +<%= render partial: "admin/posts/post_sections", locals: {form: f} %> + +
+ <%= render partial: "partials/submit_right", locals: {form: f, button_text: 'Submit'} %> +
diff --git a/app/views/admin/posts/_new_form.html.erb b/app/views/admin/posts/_new_form.html.erb new file mode 100644 index 00000000..b8fc0e50 --- /dev/null +++ b/app/views/admin/posts/_new_form.html.erb @@ -0,0 +1,11 @@ +<%= turbo_frame_tag 'admin_posts_new_form' do %> + <%= form_with(model: post, url: {action: 'create', controller: 'admin/posts'}, class: 'section-form', id: 'admin-post-new-form', data: { turbo_frame: '_top' }) do |f| %> + + <%= render partial: 'admin/posts/form_components', locals: { f: f } %> + + <% end %> + +
+ <%= link_to('Return', posts_path, class: 'standard-button input-submit') %> +
+<% end %> diff --git a/app/views/admin/posts/_post_overview.html.erb b/app/views/admin/posts/_post_overview.html.erb new file mode 100644 index 00000000..1bf5b83b --- /dev/null +++ b/app/views/admin/posts/_post_overview.html.erb @@ -0,0 +1,11 @@ + +
+ <%= full_date(post.date_published) %> +
+

+ <%= post.title %> +

+
+ <%= post.overview %> +
+
diff --git a/app/views/admin/posts/_post_section_image.html.erb b/app/views/admin/posts/_post_section_image.html.erb new file mode 100644 index 00000000..92e68f3b --- /dev/null +++ b/app/views/admin/posts/_post_section_image.html.erb @@ -0,0 +1,31 @@ +<% post_section_image = post_section.post_section_image || post_section.build_post_section_image %> +<% image_label_text = post_section_image.new_record? ? 'Add image' : 'Update image' %> + +
+ <%= form.fields_for(:post_section_image, post_section_image) do |post_section_image_form| %> +
+ <% unless post_section_image.new_record? %> +
+ <%= image_tag(image_path_helper(image_model: post_section_image), class: 'embedded-full-width') %> +
+ <% end %> + +
+ <%= post_section_image_form.label(:image_file, image_label_text, class: 'input-label embedded-label') %> + <%= post_section_image_form.file_field(:image_file, accept: 'image/png,image/jpeg', class: 'input-box embedded-no-border post-section-image-file-field') %> +
+ +
+ <%= post_section_image_form.label(:title, 'Caption', class: 'input-label embedded-label') %> + <%= post_section_image_form.text_field(:title, class: 'input-box embedded-input-box post-section-image-title-field', placeholder: 'Enter image caption...') %> +
+ + <% unless post_section_image.new_record? %> +
+ <%= post_section_image_form.label(:_destroy, 'Remove image:', class: 'input-label inline-label', draggable: false) %> + <%= post_section_image_form.check_box(:_destroy, value: 0) %> +
+ <% end %> +
+ <% end %> +
\ No newline at end of file diff --git a/app/views/admin/posts/_post_sections.html.erb b/app/views/admin/posts/_post_sections.html.erb new file mode 100644 index 00000000..f510e41f --- /dev/null +++ b/app/views/admin/posts/_post_sections.html.erb @@ -0,0 +1,50 @@ +<% post = form.object %> +<% post_sections = form.object.post_sections %> +<% post_sections = [PostSection.new(order: 0)] unless post_sections.any? %> + +

+ Post Content +

+ +
+ + <% post_sections.each_with_index do |post_section, index| %> + +
+ <%= form.fields_for(:post_sections, post_section, multiple: true) do |nested_post_section_form| %> +
+
'/> + + <%= render partial: 'admin/posts/post_section_image', locals: {form: nested_post_section_form, post_section: post_section} %> + +
+ <%= nested_post_section_form.text_area(:text, class: 'input-box embedded-text-area post', placeholder: 'Add text content (you can use markdown)...') %> +
+ + <%= nested_post_section_form.hidden_field(:order, class: 'item-order-position') %> + <%= nested_post_section_form.hidden_field(:_destroy, class: 'destroy-post-section', value: 0) %> + +
+ + + +
+
+ <% end %> +
+ + <% end %> + +
\ No newline at end of file diff --git a/app/views/admin/posts/edit.html.erb b/app/views/admin/posts/edit.html.erb new file mode 100644 index 00000000..2852246b --- /dev/null +++ b/app/views/admin/posts/edit.html.erb @@ -0,0 +1,7 @@ +<% content_for :section_subtitle do %> + Blog: Edit Post +<% end %> + +
+ <%= render partial: 'admin/posts/edit_form', locals: { post: @post } %> +
diff --git a/app/views/admin/posts/edit.turbo_stream.erb b/app/views/admin/posts/edit.turbo_stream.erb new file mode 100644 index 00000000..36977fc9 --- /dev/null +++ b/app/views/admin/posts/edit.turbo_stream.erb @@ -0,0 +1,2 @@ +<%# https://github.com/hotwired/turbo/issues/138#issuecomment-847699281 %> +<%= turbo_stream.replace("admin_posts_edit_form", partial: 'edit_form', locals: { post: @post }) %> diff --git a/app/views/admin/posts/new.html.erb b/app/views/admin/posts/new.html.erb new file mode 100644 index 00000000..b3e3cc8b --- /dev/null +++ b/app/views/admin/posts/new.html.erb @@ -0,0 +1,7 @@ +<% content_for :section_subtitle do %> + Blog: New Blog Post +<% end %> + +
+ <%= render partial: 'admin/posts/new_form', locals: { post: @post } %> +
diff --git a/app/views/admin/posts/new.turbo_stream.erb b/app/views/admin/posts/new.turbo_stream.erb new file mode 100644 index 00000000..ecabdae7 --- /dev/null +++ b/app/views/admin/posts/new.turbo_stream.erb @@ -0,0 +1,2 @@ +<%# https://github.com/hotwired/turbo/issues/138#issuecomment-847699281 %> +<%= turbo_stream.replace("admin_posts_new_form", partial: 'new_form', locals: { post: @post }) %> diff --git a/app/views/admin/projects/_edit_form.html.erb b/app/views/admin/projects/_edit_form.html.erb new file mode 100644 index 00000000..0829ac24 --- /dev/null +++ b/app/views/admin/projects/_edit_form.html.erb @@ -0,0 +1,14 @@ +<%= turbo_frame_tag 'admin_projects_edit_form' do %> + <%= form_with(model: [:admin, project], method: 'put', class: 'section-form', id: 'admin-projects-edit-form', multipart: true, data: { turbo_frame: '_top' }) do |f| %> + + <%= render partial: 'admin/projects/form_components', locals: { f: f, project: project } %> + + <% end %> + +
+ <%= link_to('Return', projects_path, class: 'standard-button input-submit') %> + <%= form_with(model: [:admin, project], method: :delete) do |r| %> + <%= r.submit("Remove", class: 'input-submit destroy-button', data: {confirm: "Are you sure?"}) %> + <% end %> +
+<% end %> \ No newline at end of file diff --git a/app/views/admin/projects/_form_components.html.erb b/app/views/admin/projects/_form_components.html.erb new file mode 100644 index 00000000..3886daf9 --- /dev/null +++ b/app/views/admin/projects/_form_components.html.erb @@ -0,0 +1,48 @@ +<%= render partial: 'partials/system_messages' %> + +
+ <%= f.label(:title, 'Title', class: 'input-label embedded-label') %> + <%= f.text_field(:title, class: 'input-box embedded-input-box', placeholder: 'Enter title...', required: true) %> +
+ +
+ <%= f.label(:overview, 'Overview', class: 'input-label embedded-label') %> +
+ +
+ <%= f.text_area(:overview, class: 'input-box embedded-text-area', placeholder: 'Enter overview...') %> +
+ +
+ <%= f.label(:date, 'Date', class: 'input-label embedded-label') %> + <%= f.date_field(:date, class: 'input-box embedded-input-box', placeholder: 'Enter date...', autocomplete: "off", required: true) %> +
+ +
+ <%= f.label(:github_link, 'Github link', class: 'input-label embedded-label') %> + <%= f.text_field(:github_link, class: 'input-box embedded-input-box', placeholder: 'Enter github link...') %> +
+ +
+ <%= f.label(:site_link, 'Site link', class: 'input-label embedded-label') %> + <%= f.text_field(:site_link, class: 'input-box embedded-input-box', placeholder: 'Enter site link...') %> +
+ +<%= render partial: 'admin/projects/project_image_upload', locals: {project: project, form: f} %> + +
+ <%= label(:snippet, :snippet, 'Render Code Snippet to Image', class: 'input-label embedded-label-full-width') %> +
+ +
+ <%= text_area(:snippet, :snippet, class: 'input-box embedded-text-area', placeholder: 'Enter code snippet to be rendered into cover image...') %> +
+ +
+ <%= label(:snippet, :extension, 'Code file extension', class: 'input-label embedded-label') %> + <%= text_field(:snippet, :extension, class: 'input-box embedded-input-box', placeholder: 'Enter file extension such as `rb`...') %> +
+ +
+ <%= render partial: "partials/submit_right", locals: {form: f, button_text: 'Submit'} %> +
\ No newline at end of file diff --git a/app/views/admin/projects/_new_form.html.erb b/app/views/admin/projects/_new_form.html.erb new file mode 100644 index 00000000..f850e33f --- /dev/null +++ b/app/views/admin/projects/_new_form.html.erb @@ -0,0 +1,11 @@ +<%= turbo_frame_tag 'admin_projects_new_form' do %> + <%= form_with(model: [:admin, project], class: 'section-form', id: 'admin-projects-new-form', multipart: true, data: { turbo_frame: '_top' }) do |f| %> + + <%= render partial: 'admin/projects/form_components', locals: { f: f, project: project } %> + + <% end %> + +
+ <%= link_to('Return', projects_path, class: 'standard-button input-submit') %> +
+<% end %> \ No newline at end of file diff --git a/app/views/admin/projects/_project_image_upload.html.erb b/app/views/admin/projects/_project_image_upload.html.erb new file mode 100644 index 00000000..c8cb68e1 --- /dev/null +++ b/app/views/admin/projects/_project_image_upload.html.erb @@ -0,0 +1,47 @@ + +<% images = project.project_images %> + +
+

+ Project images +

+
+ +
    + <%= form.fields_for(:project_images, project.project_images, include_id: false) do |nested_image_form| %> +
  • +
    +
    + + <%= image_tag('icons/drag-icon.svg', alt: 'drag icon', draggable: false ) %> + +
    + +
    + <%= image_tag(image_path_helper(image_model: nested_image_form.object, variant: :thumbnail), draggable: false) %> +
    + +
    + <%= nested_image_form.label(:title, 'Image title:', class: 'input-label embedded-label-full-width', draggable: false) %> + <%= nested_image_form.text_field(:title, class: 'input-box embedded-input-box full-width', placeholder: 'Enter image title...', draggable: false) %> + +
    + <%= nested_image_form.label(:_destroy, 'Remove image:', class: 'input-label inline-label', draggable: false) %> + <%= nested_image_form.check_box(:_destroy, {draggable: false}, 1, 0) %> +
    +
    + <%= nested_image_form.hidden_field(:order, class: 'item-order-position') %> + <%= nested_image_form.hidden_field(:id) %> +
    +
  • + <% end %> +
+ +
+ <%= label(:new_project_images, :image_files, 'Add project images', class: 'input-label embedded-label') %> + <%= file_field(:new_project_images, :image_files, accept: 'image/png,image/jpeg', multiple: true, class: 'input-box embedded-no-border') %> +
diff --git a/app/views/admin/projects/edit.html.erb b/app/views/admin/projects/edit.html.erb new file mode 100644 index 00000000..383ce944 --- /dev/null +++ b/app/views/admin/projects/edit.html.erb @@ -0,0 +1,7 @@ +<% content_for :section_subtitle do %> + Projects: Edit Project +<% end %> + +
+ <%= render partial: 'admin/projects/edit_form', locals: { project: @project } %> +
diff --git a/app/views/admin/projects/edit.turbo_stream.erb b/app/views/admin/projects/edit.turbo_stream.erb new file mode 100644 index 00000000..4a87ac1a --- /dev/null +++ b/app/views/admin/projects/edit.turbo_stream.erb @@ -0,0 +1,2 @@ +<%# https://github.com/hotwired/turbo/issues/138#issuecomment-847699281 %> +<%= turbo_stream.replace("admin_projects_edit_form", partial: 'edit_form', locals: { project: @project }) %> diff --git a/app/views/admin/projects/new.html.erb b/app/views/admin/projects/new.html.erb new file mode 100644 index 00000000..367e6e8a --- /dev/null +++ b/app/views/admin/projects/new.html.erb @@ -0,0 +1,7 @@ +<% content_for :section_subtitle do %> + Projects: New Project +<% end %> + +
+ <%= render partial: 'admin/projects/new_form', locals: { project: @project } %> +
diff --git a/app/views/admin/projects/new.turbo_stream.erb b/app/views/admin/projects/new.turbo_stream.erb new file mode 100644 index 00000000..fd1a0d37 --- /dev/null +++ b/app/views/admin/projects/new.turbo_stream.erb @@ -0,0 +1,2 @@ +<%# https://github.com/hotwired/turbo/issues/138#issuecomment-847699281 %> +<%= turbo_stream.replace("admin_projects_new_form", partial: 'new_form', locals: { project: @project }) %> diff --git a/app/views/admin/site_settings/_edit_form.html.erb b/app/views/admin/site_settings/_edit_form.html.erb new file mode 100644 index 00000000..613f827f --- /dev/null +++ b/app/views/admin/site_settings/_edit_form.html.erb @@ -0,0 +1,32 @@ +<%= turbo_frame_tag 'admin_site_settings_edit_form' do %> + <%= form_with(model: site_settings, :url => admin_site_setting_path(site_settings), method: "put", id: "admin-site-settings-edit-form") do |f| %> +
+ <%= f.label(:name, 'Site name', class: 'input-label embedded-label') %> + <%= f.text_field(:name, class: 'input-box embedded-input-box', placeholder: 'new site name') %> +
+ +
+ <%= f.label(:header_text, 'Homepage header', class: 'input-label embedded-label') %> + <%= f.text_field(:header_text, class: 'input-box embedded-input-box', placeholder: 'new homepage header') %> +
+ +
+ <%= f.label(:subtitle_text, 'Homepage subtitle', class: 'input-label embedded-label') %> + <%= f.text_field(:subtitle_text, class: 'input-box embedded-input-box', placeholder: 'new homepage subtitle') %> +
+ +
+ <%= f.label(:typed_header_enabled, 'Enable typed header', class: 'input-label embedded-label') %> + <%= f.check_box(:typed_header_enabled, {class: 'input-check-box'}) %> +
+ +
+ +
+ <%= render partial: "partials/submit_right", locals: {form: f, button_text: 'Update site settings'} %> +
+ + <%= render partial: 'partials/system_messages' %> + + <% end %> +<% end %> \ No newline at end of file diff --git a/app/views/admin/site_settings/index.html.erb b/app/views/admin/site_settings/index.html.erb new file mode 100644 index 00000000..eb306f98 --- /dev/null +++ b/app/views/admin/site_settings/index.html.erb @@ -0,0 +1,12 @@ +<% content_for :section_subtitle do %> + Site Settings +<% end %> + +
+

+ Update Site Settings +

+
+
+ <%= render partial: 'admin/site_settings/edit_form', locals: {site_settings: @site_settings} %> +
diff --git a/app/views/admin/users/_edit_form.html.erb b/app/views/admin/users/_edit_form.html.erb new file mode 100644 index 00000000..10fcde6b --- /dev/null +++ b/app/views/admin/users/_edit_form.html.erb @@ -0,0 +1,50 @@ +

+ Update Details +

+<%= form_with(model: [:admin, @user], method: "put") do |f| %> + <%= render partial: 'partials/system_messages' %> +
+ <%= label(:username, :username, 'Username', class: 'input-label embedded-label') %> + <%= text_field(:username, :username, {class: 'input-box embedded-input-box', placeholder: 'new username'}) %> +
+
+ <%= label(:username, :username_confirmation, 'Username confirmation', class: 'input-label embedded-label') %> + <%= text_field(:username, :username_confirmation, class: 'input-box embedded-input-box', placeholder: 'username confirmation') %> +
+
+
+ <%= label(:email, :email, 'Email', class: 'input-label embedded-label') %> + <%= text_field(:email, :email, {class: 'input-box embedded-input-box', placeholder: 'new email'}) %> +
+
+ <%= label(:email, :email_confirmation, 'Email confirmation', class: 'input-label embedded-label') %> + <%= text_field(:email, :email_confirmation, class: 'input-box embedded-input-box', placeholder: 'email confirmation') %> +
+
+
+ <%= label(:password, :password, 'Password', class: 'input-label embedded-label') %> + <%= password_field(:password, :password, {class: 'input-box embedded-input-box', placeholder: 'new password'}) %> +
+
+ <%= label(:password, :password_confirmation, 'Password confirmation', class: 'input-label embedded-label') %> + <%= password_field(:password, :password_confirmation, class: 'input-box embedded-input-box', placeholder: 'password confirmation') %> +
+
+
+ <%= label(:mobile_number, :mobile_number, 'UK mobile number', class: 'input-label embedded-label') %> + <%= text_field(:mobile_number, :mobile_number, {class: 'input-box embedded-input-box', placeholder: 'new mobile number'}) %> +
+
+ <%= label(:mobile_number, :mobile_numberconfirmation, 'UK mobile number confirmation', class: 'input-label embedded-label') %> + <%= text_field(:mobile_number, :mobile_number_confirmation, class: 'input-box embedded-input-box', placeholder: 'mobile number confirmation') %> +
+
+
+ <%= label(:current_password, :password, 'Enter current password to confirm changes', class: 'input-label embedded-label') %> + <%= password_field(:current_password, :password, class: 'input-box embedded-input-box', placeholder: 'current password') %> +
+
+
+ <%= f.submit('Update details', class: 'input-submit') %> +
+<% end %> diff --git a/app/views/admin/users/edit.html.erb b/app/views/admin/users/edit.html.erb new file mode 100644 index 00000000..ce5d566d --- /dev/null +++ b/app/views/admin/users/edit.html.erb @@ -0,0 +1,11 @@ +<% content_for :section_subtitle do %> + User Settings +<% end %> + +
+ <%= render 'admins/current_user_details' %> +
+
+
+ <%= render partial: 'admin/users/edit_form' %> +
diff --git a/app/views/admins/_current_user_details.html.erb b/app/views/admins/_current_user_details.html.erb new file mode 100644 index 00000000..f740515b --- /dev/null +++ b/app/views/admins/_current_user_details.html.erb @@ -0,0 +1,8 @@ +

+ User Details +

+Username <%= @user.username %> +

+Email Address <%= @user.email %> +

+Mobile Number <%= @user.mobile_number %> diff --git a/app/views/admins/analytics.html.erb b/app/views/admins/analytics.html.erb new file mode 100644 index 00000000..1a60e727 --- /dev/null +++ b/app/views/admins/analytics.html.erb @@ -0,0 +1,10 @@ +<% content_for :section_subtitle do %> + Analytics +<% end %> + +
+

+ Website hits +

+ Placeholder +
diff --git a/app/views/admins/general.html.erb b/app/views/admins/general.html.erb new file mode 100644 index 00000000..5cdd398b --- /dev/null +++ b/app/views/admins/general.html.erb @@ -0,0 +1,37 @@ +<% content_for :section_subtitle do %> + General +<% end %> + +
+

+ System Messages +

+ <%= render partial: 'partials/system_messages', locals: { no_messages: true } %> +
+
+
+

+ Last Login +

+ Time and Date: <%= @user.last_login_time.strftime("%H:%M %d-%m-%Y") %> +

+ IP Address: <%= @user.last_login_ip %> +
+
+
+ <%= render 'admins/current_user_details' %> +
+
+
+

+ Notifications +

+ Placeholder +
+
+
+

+ Analytics +

+ Placeholder +
diff --git a/app/views/admins/notifications.html.erb b/app/views/admins/notifications.html.erb new file mode 100644 index 00000000..e53aca06 --- /dev/null +++ b/app/views/admins/notifications.html.erb @@ -0,0 +1,24 @@ +<% content_for :section_subtitle do %> + Notifications +<% end %> + +
+

+ Contact Emails +

+ Placeholder +
+
+
+

+ Blog Comments +

+ Placeholder +
+
+
+

+ Say Hellos +

+ Placeholder +
diff --git a/app/views/code_snippets/_code_snippet_overview.html.erb b/app/views/code_snippets/_code_snippet_overview.html.erb new file mode 100644 index 00000000..234515ca --- /dev/null +++ b/app/views/code_snippets/_code_snippet_overview.html.erb @@ -0,0 +1,14 @@ +
+ +
+ <%= image_tag(image_path_helper(image_model: code_snippet.code_snippet_image), data: {action: "load->image-loader#imageLoaded"}, alt: 'render of code snippet', itemprop: 'contentUrl') %> +
+

+ <%= code_snippet.title %> +

+
+ <%= code_snippet.overview %> +
+ +
+
\ No newline at end of file diff --git a/app/views/code_snippets/index.html.erb b/app/views/code_snippets/index.html.erb new file mode 100644 index 00000000..c2ed4bad --- /dev/null +++ b/app/views/code_snippets/index.html.erb @@ -0,0 +1,25 @@ +<% content_for :section_title do %> + Code Snippets +<% end %> + +<% content_for :meta_title do %> + Code Snippets +<% end %> + +<% content_for :meta_description do %> + Browse my most recent code snippets +<% end %> + +<%= render partial: 'partials/admin_toolbar', locals: { model: CodeSnippet.new } %> + +<%= render partial: 'partials/system_messages' %> + +<% if @code_snippets.empty? %> + <%= render partial: 'partials/no_items', locals: {item: 'code snippets'} %> +<% else %> +
+ <% @code_snippets.each_with_index do |code_snippet, index| %> + <%= render partial: 'code_snippets/code_snippet_overview', locals: {code_snippet: code_snippet, path: code_snippet_path(code_snippet), index: index} %> + <% end %> +
+<% end %> diff --git a/app/views/code_snippets/show.html.erb b/app/views/code_snippets/show.html.erb new file mode 100644 index 00000000..dd5736ba --- /dev/null +++ b/app/views/code_snippets/show.html.erb @@ -0,0 +1,50 @@ +<% content_for :section_title do %> + Code Snippets +<% end %> + +<% content_for :meta_title do %> + <%= @code_snippet.title %> - Code Snippet +<% end %> + +<% content_for :meta_description do %> + <%= @code_snippet.overview %> +<% end %> + +<% if @code_snippet.code_snippet_image&.image_file&.attached? %> + <% content_for :meta_image_path do %> + <%= polymorphic_url(@code_snippet.code_snippet_image.image_file) %> + <% end %> + + <% content_for :meta_image_alt do %> + <%= @code_snippet.code_snippet_image.description %> + <% end %> +<% end %> + + +<%= render partial: 'partials/admin_toolbar', locals: { model: @code_snippet } %> + +
+ <%= render partial: 'partials/system_messages' %> +
+ +
+
+

<%= @code_snippet.title %>

+
+ | Last updated: +
+
+ +
+ <%= markdown_code(code: @code_snippet.snippet, extension: @code_snippet.extension) %> +
+ +
+ <%= markdown_admin(@code_snippet.text) %> +
+ +
+ + diff --git a/app/views/contact_message_mailer/confirmation.html.erb b/app/views/contact_message_mailer/confirmation.html.erb new file mode 100644 index 00000000..409a84c8 --- /dev/null +++ b/app/views/contact_message_mailer/confirmation.html.erb @@ -0,0 +1,23 @@ +<%= content_for :email_title do %> + Contact Message Confirmation +<% end %> + +<%= content_for :username do %> + <%= @to_name %> +<% end %> + + + + You sent <%= @user_name %> a new contact message at <%= @datetime %>. + + + + + <%= @content %> + + + + + I will reply to your message as soon as possible. + + diff --git a/app/views/contact_message_mailer/confirmation.txt.erb b/app/views/contact_message_mailer/confirmation.txt.erb new file mode 100644 index 00000000..4ec37951 --- /dev/null +++ b/app/views/contact_message_mailer/confirmation.txt.erb @@ -0,0 +1,9 @@ +Hi <%= @to_name %>, + +You sent <%= @user_name %> a new contact message at <%= @datetime %>. + + +<%= @content %> + + +Thanks for your message, I will reply as soon as possible. \ No newline at end of file diff --git a/app/views/contact_message_mailer/contact_message.html.erb b/app/views/contact_message_mailer/contact_message.html.erb new file mode 100644 index 00000000..388129bc --- /dev/null +++ b/app/views/contact_message_mailer/contact_message.html.erb @@ -0,0 +1,23 @@ +<%= content_for :email_title do %> + New Contact Message +<% end %> + +<%= content_for :username do %> + <%= @to_name %> +<% end %> + + + + You have received a new contact message from: <%= @from_name %> at <%= @datetime %>. + + + + + <%= @content %> + + + + + Reply to this message to respond. + + diff --git a/app/views/contact_message_mailer/contact_message.txt.erb b/app/views/contact_message_mailer/contact_message.txt.erb new file mode 100644 index 00000000..a97b6898 --- /dev/null +++ b/app/views/contact_message_mailer/contact_message.txt.erb @@ -0,0 +1,9 @@ +Hi <%= @to_name %>, + +You have received a new contact message from: <%= @from_name %> at <%= @datetime %> + + +<%= @content %> + + +Reply to this message to respond. \ No newline at end of file diff --git a/app/views/contact_messages/_form_components.html.erb b/app/views/contact_messages/_form_components.html.erb new file mode 100644 index 00000000..20fae1c6 --- /dev/null +++ b/app/views/contact_messages/_form_components.html.erb @@ -0,0 +1,30 @@ +
+ <%= f.label(:from, 'From', class: 'input-label embedded-label') %> + <%= f.text_field(:from, class: 'input-box embedded-input-box', placeholder: 'Enter your name...', required: true) %> +
+ +
+ <%= f.label(:email, 'Email', class: 'input-label embedded-label') %> + <%= f.text_field(:email, type: 'email', class: 'input-box embedded-input-box', placeholder: 'Enter your email...', required: true) %> +
+ +
+ <%= f.label(:subject, 'Subject', class: 'input-label embedded-label') %> + <%= f.text_field(:subject, class: 'input-box embedded-input-box', placeholder: 'Enter message subject...', required: true) %> +
+ +
+ <%= f.label(:content, 'Message', class: 'input-label embedded-label') %> +
+ +
+ <%= f.text_area(:content, class: 'input-box embedded-text-area contact', placeholder: 'Enter message...', required: true) %> +
+ +
+ +
+ <%= render partial: "partials/submit_right", locals: {form: f, button_text: 'Send'} %> +
+ +<%= render partial: 'partials/system_messages' %> diff --git a/app/views/contact_messages/_new_form.html.erb b/app/views/contact_messages/_new_form.html.erb new file mode 100644 index 00000000..1eca056b --- /dev/null +++ b/app/views/contact_messages/_new_form.html.erb @@ -0,0 +1,9 @@ +<%= turbo_frame_tag 'create_contact_message_form' do %> +
+ <%= form_with(model: contact_message, url: {action: 'create', controller: 'contact_messages'}, class: 'section-form', id: 'contact-messages-new-form') do |f| %> + + <%= render partial: 'contact_messages/form_components', locals: { f: f } %> + + <% end %> +
+<% end %> \ No newline at end of file diff --git a/app/views/contact_messages/new.html.erb b/app/views/contact_messages/new.html.erb new file mode 100644 index 00000000..66878131 --- /dev/null +++ b/app/views/contact_messages/new.html.erb @@ -0,0 +1,17 @@ +<%= content_for(:section_title) do %> + Contact +<% end %> + +<% content_for :meta_title do %> + Contact +<% end %> + +<% content_for :meta_description do %> + Talk to me +<% end %> + +
+

👋 Send me a message

+ + <%= render partial: 'contact_messages/new_form', locals: {contact_message: @contact_message} %> +
diff --git a/app/views/gallery_images/_image_container.html.erb b/app/views/gallery_images/_image_container.html.erb new file mode 100644 index 00000000..a35ff454 --- /dev/null +++ b/app/views/gallery_images/_image_container.html.erb @@ -0,0 +1,5 @@ + diff --git a/app/views/gallery_images/_image_thumbnail.html.erb b/app/views/gallery_images/_image_thumbnail.html.erb new file mode 100644 index 00000000..d8ac2041 --- /dev/null +++ b/app/views/gallery_images/_image_thumbnail.html.erb @@ -0,0 +1 @@ +<%= image_tag(image_path_helper(image_model: gallery_image, variant: :thumbnail), class: 'gallery-image-thumbnail', title: gallery_image.title, alt: gallery_image.description, data: {action: "load->justified-gallery#imageLoaded", 'justified-gallery-target': 'galleryItem'}, itemprop: 'contentUrl') %> diff --git a/app/views/gallery_images/index.html.erb b/app/views/gallery_images/index.html.erb new file mode 100644 index 00000000..a819196c --- /dev/null +++ b/app/views/gallery_images/index.html.erb @@ -0,0 +1,38 @@ +<% content_for :section_title do %> + Gallery +<% end %> + +<% content_for :meta_title do %> + Gallery +<% end %> + +<% content_for :meta_description do %> + An interesting selection if pictures I've taken +<% end %> + +<% if @user %> +
+ <%= link_to('Admin Edit', admin_gallery_images_path, class: 'standard-button view-section') %> +
+<% end %> + +<%= render partial: 'partials/system_messages' %> + + diff --git a/app/views/homepage/index.html.erb b/app/views/homepage/index.html.erb deleted file mode 100644 index 777594e1..00000000 --- a/app/views/homepage/index.html.erb +++ /dev/null @@ -1,3 +0,0 @@ -Hello Friend! - -Locally hosted on RPi \ No newline at end of file diff --git a/app/views/homepages/index.html.erb b/app/views/homepages/index.html.erb new file mode 100644 index 00000000..9d0bd6d1 --- /dev/null +++ b/app/views/homepages/index.html.erb @@ -0,0 +1,30 @@ +<% if @site_settings.typed_header_enabled %> + <% content_for :typed_header do %> + <%= @site_settings.header_text %> + <% end %> + <% content_for :typed_header_sub do %> + <%= @site_settings.subtitle_text %> + <% end %> +<% else %> + <% content_for :section_title do %> + <%= @site_settings.header_text %> + <% end %> + <% content_for :section_subtitle do %> + <%= @site_settings.subtitle_text %> + <% end %> +<% end %> + +<%= render partial: 'partials/system_messages' %> + +
+ <% @cover_images.each_with_index do |image, index| %> +
+ <%= image_tag(image_path_helper(image_model: image), class: "cover-image", style: image.custom_style, alt: image.description, data: {action: "load->image-loader#imageLoaded", 'image-loader-target': 'fade'} ) %> + + + <%= image.description %> + + +
+ <% end %> +
diff --git a/app/views/layouts/admin_dashboard.html.erb b/app/views/layouts/admin_dashboard.html.erb new file mode 100644 index 00000000..d2c60487 --- /dev/null +++ b/app/views/layouts/admin_dashboard.html.erb @@ -0,0 +1,18 @@ +<% content_for :head do %> + +<% end %> + +<% content_for :section_title do %> + Admin Zone +<% end %> + +<% content_for :content do %> +
+ <%= render partial: 'partials/dashboard_sidebar' %> +
+ <%= yield %> +
+
+<% end %> + +<%= render template: 'layouts/application' %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index b587e481..e45977d8 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,15 +1,49 @@ - + - HomeServer + <%= csrf_meta_tags %> <%= csp_meta_tag %> - - <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> - <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> + <%= stylesheet_pack_tag 'application', media: 'all' %> + <%= javascript_pack_tag 'application' %> + <%= favicon_link_tag 'favicon.svg', type: 'image/svg+xml' %> + <%= favicon_link_tag 'favicon.svg', rel: 'rel="apple-touch-icon', type: 'image/svg+xml' %> + + "> + + <%= content_for?(:meta_title) ? "#{yield(:meta_title).html_safe} - #{@site_settings.name}" : @site_settings.name %> + + "> + "> + '> + '> + + + + + "> + '> + + "> + + + + "> + <%= yield(:head) %> - - <%= yield %> + +
+ <%= render partial: 'partials/navigation' %> + <%= render partial: 'partials/header_image', locals: { scrollTarget: 'header-image' } %> +
+
+ <%= render partial: 'partials/section_title' %> + <%= content_for?(:content) ? yield(:content) : yield %> +
+ <%= render partial: 'partials/footer' %> +
+
+
diff --git a/app/views/layouts/default_email.html.erb b/app/views/layouts/default_email.html.erb new file mode 100644 index 00000000..ab89b242 --- /dev/null +++ b/app/views/layouts/default_email.html.erb @@ -0,0 +1,49 @@ + + + + +
+ + + +
+ + + + + + + +
); background-repeat: no-repeat; background-position: top center; background-size: cover;'> + <%= ENV['EMAIL_COMPANY_NAME'] %> +
+
+ + + + + + + + + <%= yield %> + + + +
+ <%= yield :email_title %> +
+ Hi <%= yield :username %>, +
+ Thanks, +
+
+ <%= Rails.configuration.email_default_name %> +
+
+
+
+ + + + diff --git a/app/views/layouts/forms/floating_form.html.erb b/app/views/layouts/forms/floating_form.html.erb new file mode 100644 index 00000000..373e26fc --- /dev/null +++ b/app/views/layouts/forms/floating_form.html.erb @@ -0,0 +1,5 @@ +
+
+ <%= yield :form %> +
+
diff --git a/app/views/layouts/images/_images_will_be_resized.html.erb b/app/views/layouts/images/_images_will_be_resized.html.erb new file mode 100644 index 00000000..bc566d09 --- /dev/null +++ b/app/views/layouts/images/_images_will_be_resized.html.erb @@ -0,0 +1,5 @@ +
+
+ Note: Images will be resized to <%= image.x_dim %>px wide and cropped to <%= image.y_dim %>px tall. Accepted image formats are jpeg and png. +
+
diff --git a/app/views/layouts/images/_profile_image_upload.html.erb b/app/views/layouts/images/_profile_image_upload.html.erb new file mode 100644 index 00000000..560635e5 --- /dev/null +++ b/app/views/layouts/images/_profile_image_upload.html.erb @@ -0,0 +1,43 @@ +<% if image %> + +
+
+ Current profile image +
+
+ <%= image_file_name(image: image, default_name: 'no image') %> +
+
+ +
+ <%= image_tag(image_path_helper(image_model: image), class: 'profile-image admin') %> +
+ + <%= render partial: 'layouts/images/images_will_be_resized', locals: {image: image} %> + + <%= form.fields_for :profile_image do |p| %> +
+ <%= p.label(:image_file, 'Update image', class: 'input-label embedded-label') %> + <%= p.file_field(:image_file, accept: 'image/png,image/jpeg', class: 'input-box embedded-no-border', id: "image-update-#{image.description}") %> +
+ +
+ <%= p.label(:_destroy, 'Remove image', class: 'input-label embedded-label') %> + <%= p.check_box(:_destroy, {class: 'input-check-box', id: "image-reset-#{image.description}"}, 1, 0) %> +
+ <% end %> + +<% else %> + + <% image = ProfileImage.new %> + + <%= render partial: 'layouts/images/images_will_be_resized', locals: {image: image} %> + + <%= form.fields_for(:profile_image_attributes, image) do |p| %> +
+ <%= p.label(:image_file, 'New image', class: 'input-label embedded-label') %> + <%= p.file_field(:image_file, accept: 'image/png,image/jpeg', class: 'input-box embedded-no-border', id: "image-update-#{image.description}") %> +
+ <% end %> + +<% end %> diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb index cbd34d2e..3453e40b 100644 --- a/app/views/layouts/mailer.html.erb +++ b/app/views/layouts/mailer.html.erb @@ -1,13 +1,10 @@ - - + + + + - - - <%= yield %> - + <%= yield %> diff --git a/app/views/partials/_admin_toolbar.html.erb b/app/views/partials/_admin_toolbar.html.erb new file mode 100644 index 00000000..8ca9066f --- /dev/null +++ b/app/views/partials/_admin_toolbar.html.erb @@ -0,0 +1,14 @@ +<% singular = false if local_assigns[:singular].nil? %> +<% if @user %> +
+ <% if in_admin_scope? %> + <%= link_to('View Section', admin_link_helper_section_path(model, singular), class: 'standard-button view-section') %> + <% end %> + <% if model.new_record? %> + <%= link_to('Create New', admin_link_helper_new_path(model), class: 'standard-button new') %> + <% else %> + + <%= link_to('Edit', admin_link_helper_admin_path(model, singular), class: 'standard-button edit') %> + <% end %> +
+<% end %> diff --git a/app/views/partials/_dashboard_sidebar.html.erb b/app/views/partials/_dashboard_sidebar.html.erb new file mode 100644 index 00000000..b185c460 --- /dev/null +++ b/app/views/partials/_dashboard_sidebar.html.erb @@ -0,0 +1,41 @@ +
+

+ Dashboard +

+ + General + + + Notifications + + + Analytics + + + User Settings + + + Site Settings + + + Images + + + About/Contact + + + Gallery + +
+
>
+
>
+
Open Options
+
>
+
>
+
<
+
<
+
Close Options
+
<
+
<
+
+
diff --git a/app/views/partials/_footer.html.erb b/app/views/partials/_footer.html.erb new file mode 100644 index 00000000..dc1046f4 --- /dev/null +++ b/app/views/partials/_footer.html.erb @@ -0,0 +1,21 @@ + diff --git a/app/views/partials/_form_replacement.js.erb b/app/views/partials/_form_replacement.js.erb new file mode 100644 index 00000000..16f6d2a4 --- /dev/null +++ b/app/views/partials/_form_replacement.js.erb @@ -0,0 +1,31 @@ +var oldForm = window.document.querySelector('#<%= j(selector_id) %>'); +var parent = oldForm.parentNode; + +tempDiv = window.document.createElement('div'); +tempDiv.innerHTML = '<%= j(render partial: form_partial, locals: model ) %>'; +var newForm = tempDiv.childNodes[0]; + +var images = newForm.getElementsByTagName("img"); + +var numImages = images.length; +var counter = 0; + +function replaceAndScrollForm() { + parent.replaceChild(newForm, oldForm); + newForm.scrollIntoView({ block: 'start', behavior: 'smooth' }); +} + +function imageLoaded() { + counter += 1; + if (counter == numImages) { + replaceAndScrollForm(); + } +} + +if (this.images.length > 0) { + for (var i = 0; i < this.images.length; i++) { + this.images[i].addEventListener('load', imageLoaded); + } +} else { + replaceAndScrollForm(); +} diff --git a/app/views/partials/_header_image.html.erb b/app/views/partials/_header_image.html.erb new file mode 100644 index 00000000..bba52005 --- /dev/null +++ b/app/views/partials/_header_image.html.erb @@ -0,0 +1,6 @@ +
+ <%= image_tag(image_path_helper(image_model: @header_image), + id: "#{scrollTarget}", + style: @header_image.custom_style, + alt: 'header image') %> +
diff --git a/app/views/partials/_navigation.html.erb b/app/views/partials/_navigation.html.erb new file mode 100644 index 00000000..5d3ff475 --- /dev/null +++ b/app/views/partials/_navigation.html.erb @@ -0,0 +1,62 @@ + diff --git a/app/views/partials/_no_items.html.erb b/app/views/partials/_no_items.html.erb new file mode 100644 index 00000000..79fc7b68 --- /dev/null +++ b/app/views/partials/_no_items.html.erb @@ -0,0 +1,3 @@ +
+ There are no <%= item %> here... +
diff --git a/app/views/partials/_profile_image.html.erb b/app/views/partials/_profile_image.html.erb new file mode 100644 index 00000000..4a65eb39 --- /dev/null +++ b/app/views/partials/_profile_image.html.erb @@ -0,0 +1,3 @@ +
+ <%= image_tag(image_path_helper(image_model: model.profile_image), class: 'profile-image about', alt: 'profile image') %> +
diff --git a/app/views/partials/_section_title.html.erb b/app/views/partials/_section_title.html.erb new file mode 100644 index 00000000..418561b4 --- /dev/null +++ b/app/views/partials/_section_title.html.erb @@ -0,0 +1,25 @@ +<% if content_for?(:typed_header) %> +
+ +

+ +

+
+<% else %> +
+

+ <%= yield :section_title %> +

+

+ <%= yield :section_subtitle %> +

+
+<% end %> diff --git a/app/views/partials/_standard_ruler.html.erb b/app/views/partials/_standard_ruler.html.erb new file mode 100644 index 00000000..1f9281ea --- /dev/null +++ b/app/views/partials/_standard_ruler.html.erb @@ -0,0 +1 @@ +
diff --git a/app/views/partials/_submit_right.html.erb b/app/views/partials/_submit_right.html.erb new file mode 100644 index 00000000..f6f542c6 --- /dev/null +++ b/app/views/partials/_submit_right.html.erb @@ -0,0 +1,9 @@ +
+ <%= form.submit('input-submit-tag', id: "input-submit-tag-#{form.object_id}", class: 'input-submit-tag hidden') %> + +
\ No newline at end of file diff --git a/app/views/partials/_system_messages.html.erb b/app/views/partials/_system_messages.html.erb new file mode 100644 index 00000000..a3de6e08 --- /dev/null +++ b/app/views/partials/_system_messages.html.erb @@ -0,0 +1,16 @@ +<% no_messages = false if local_assigns[:no_messages].nil? %> + +
+ <% flash.each do |type, msg| %> + <% if msg.kind_of?(Array) %> + <% msg.each do |i| %> +
<%= i %>
+ <% end %> + <% else %> +
<%= msg %>
+ <% end %> + <% end %> + <% if no_messages %> +
You have no messages
+ <% end %> +
diff --git a/app/views/password_mailer/password_reset_email.html.erb b/app/views/password_mailer/password_reset_email.html.erb new file mode 100644 index 00000000..d14be689 --- /dev/null +++ b/app/views/password_mailer/password_reset_email.html.erb @@ -0,0 +1,31 @@ +<%= content_for :email_title do %> + Reset your password +<% end %> + +<%= content_for :username do %> + <%= @user.username %> +<% end %> + + + + We recently received a request to reset the password for your account <%= @user.email %>. To reset your password, click the button below. This link will expire in 1 hour: + + + + + + + + +
+ + Reset Password + +
+ + + + + If you did not request your password to be reset, please contact <%= Rails.configuration.email_default_address %> + + diff --git a/app/views/password_mailer/password_reset_email.txt.erb b/app/views/password_mailer/password_reset_email.txt.erb new file mode 100644 index 00000000..c22ab714 --- /dev/null +++ b/app/views/password_mailer/password_reset_email.txt.erb @@ -0,0 +1,11 @@ +Hi <%= @user.username %>, + +To reset your password, click the URL below. The link will expire in 1 hour: + +<%= reset_password_url(reset_token: @user.password_reset_token) %> + +If you did not request your password to be reset, please contact <%= Rails.configuration.email_default_address %> + +Thanks, + +<%= ENV['EMAIL_COMPANY_NAME'] %> \ No newline at end of file diff --git a/app/views/password_mailer/password_updated_email.html.erb b/app/views/password_mailer/password_updated_email.html.erb new file mode 100644 index 00000000..9fe69bfe --- /dev/null +++ b/app/views/password_mailer/password_updated_email.html.erb @@ -0,0 +1,18 @@ +<%= content_for :email_title do %> + Account Updated +<% end %> + +<%= content_for :username do %> + <%= @user.username %> +<% end %> + + + + Your password was updated on: <%= @user.updated_at.strftime("%H:%M %d-%m-%Y") %> + + + + + If you did not updated your password, please contact <%= Rails.configuration.email_default_address %> + + diff --git a/app/views/password_mailer/password_updated_email.txt.erb b/app/views/password_mailer/password_updated_email.txt.erb new file mode 100644 index 00000000..c5f9c4cd --- /dev/null +++ b/app/views/password_mailer/password_updated_email.txt.erb @@ -0,0 +1,9 @@ +Hi <%= @user.username %>, + +Your password was updated on: <%= @user.updated_at.strftime("%H:%M %d-%m-%Y") %> + +If you did not updated your password, please contact <%= Rails.configuration.email_default_address %> + +Thanks, + +<%= ENV['EMAIL_COMPANY_NAME'] %> \ No newline at end of file diff --git a/app/views/passwords/forgotten_password.html.erb b/app/views/passwords/forgotten_password.html.erb new file mode 100644 index 00000000..30645096 --- /dev/null +++ b/app/views/passwords/forgotten_password.html.erb @@ -0,0 +1,22 @@ +<% content_for :head do %> + +<% end %> + +<% content_for :section_title do %> + Forgotten Password +<% end %> + +<% content_for :form do %> + <%= form_with(url: '/forgotten-password', method: :post, class: 'floating-form') do |f| %> + <%= render partial: 'partials/system_messages' %> + <%= label_tag(:email, 'Please enter your email address:', class: 'input-label') %> + <%= f.text_field(:email, type: 'email', required: true, class: 'input-box', placeholder: 'admin@example.com') %> +
+
+
+ <%= render partial: "partials/submit_right", locals: {form: f, button_text: 'Reset Password'} %> +
+ <% end %> +<% end %> + +<%= render template: "layouts/forms/floating_form" %> diff --git a/app/views/passwords/reset_password.html.erb b/app/views/passwords/reset_password.html.erb new file mode 100644 index 00000000..8673d354 --- /dev/null +++ b/app/views/passwords/reset_password.html.erb @@ -0,0 +1,26 @@ +<% content_for :head do %> + +<% end %> + +<% content_for :section_title do %> + Reset Password +<% end %> + +<% content_for :form do %> + <%= form_with(url: '/reset-password', method: :post, class: 'floating-form') do |f| %> + <%= render partial: 'partials/system_messages' %> +
+ User: <%= @user.username %> +

+ <%= label_tag(:password, 'Please enter your new password, it must be more than 8 charaters:', class: 'input-label') %> + <%= f.password_field(:password, required: true, class: 'input-box', placeholder: 'password') %> +
+ <%= f.password_field(:password_confirmation, required: true, class: 'input-box', placeholder: 'confirmation') %> +
+
+ <%= render partial: "partials/submit_right", locals: {form: f, button_text: 'Reset Password'} %> +
+ <% end %> +<% end %> + +<%= render template: "layouts/forms/floating_form" %> diff --git a/app/views/posts/_post_overview.html.erb b/app/views/posts/_post_overview.html.erb new file mode 100644 index 00000000..cdb971ad --- /dev/null +++ b/app/views/posts/_post_overview.html.erb @@ -0,0 +1,16 @@ +
  • +
    + +
    +
  • diff --git a/app/views/posts/_post_section.html.erb b/app/views/posts/_post_section.html.erb new file mode 100644 index 00000000..b98756b3 --- /dev/null +++ b/app/views/posts/_post_section.html.erb @@ -0,0 +1,18 @@ +
    + + <% if post_section.post_section_image %> + + <%= image_tag(image_path_helper(image_model: post_section.post_section_image, variant: :thumbnail), class: 'post-section-image-thumbnail', title: post_section.post_section_image.title, alt: post_section.post_section_image.description, itemprop: 'contentUrl') %> + +
    + <%= post_section.post_section_image.title %> +
    + <% end %> + + <%= markdown_admin(post_section.text) %> + +
    \ No newline at end of file diff --git a/app/views/posts/index.html.erb b/app/views/posts/index.html.erb new file mode 100644 index 00000000..6bbe4e8e --- /dev/null +++ b/app/views/posts/index.html.erb @@ -0,0 +1,25 @@ +<% content_for :section_title do %> + Blog +<% end %> + +<% content_for :meta_title do %> + Blog +<% end %> + +<% content_for :meta_description do %> + Browse my most recent blog posts +<% end %> + +
    + <%= render partial: 'partials/admin_toolbar', locals: { model: Post.new } %> + + <%= render partial: 'partials/system_messages' %> + + <% if @posts.empty? %> + <%= render partial: 'partials/no_items', locals: {item: 'posts'} %> + <% else %> +
      + <%= render partial: 'posts/post_overview', collection: @posts, as: :post, spacer_template: "partials/standard_ruler" %> +
    + <% end %> +
    diff --git a/app/views/posts/show.html.erb b/app/views/posts/show.html.erb new file mode 100644 index 00000000..f4399dbf --- /dev/null +++ b/app/views/posts/show.html.erb @@ -0,0 +1,35 @@ +<% content_for :section_title do %> + Blog +<% end %> + +<% content_for :meta_title do %> + <%= @post.title.length > 65 ? "#{@post.title[0..62]}...".html_safe : @post.title.html_safe %> +<% end %> + +<% content_for :meta_description do %> + <%= @post.overview %> - Blog post by <%= @post.user.username %> +<% end %> + +<%= render partial: 'partials/admin_toolbar', locals: { model: @post } %> + + +
    + <%= render partial: 'partials/system_messages' %> + +
    +

    <%= @post.title %> <%= @post.visible ? "" : "(hidden)" %>

    +
    + | +
    +
    + <%= render partial: "posts/post_section", collection: @post.post_sections, as: :post_section %> +
    + +
    + + +
    + diff --git a/app/views/projects/_project_overview.html.erb b/app/views/projects/_project_overview.html.erb new file mode 100644 index 00000000..7ee1a4d4 --- /dev/null +++ b/app/views/projects/_project_overview.html.erb @@ -0,0 +1,5 @@ +
    + <%= render(partial: 'projects/project_overview_gallery', locals: {project: project, project_index: project_iteration.index}) %> + <%= render(partial: 'projects/project_overview_content', locals: {project: project}) %> +
    +<%= render partial: 'partials/admin_toolbar', locals: { model: project } %> diff --git a/app/views/projects/_project_overview_content.html.erb b/app/views/projects/_project_overview_content.html.erb new file mode 100644 index 00000000..dd2c4298 --- /dev/null +++ b/app/views/projects/_project_overview_content.html.erb @@ -0,0 +1,20 @@ +
    +

    + <%= project.title %> +

    + +
    +
    + <%= markdown_admin(project.overview) %> +
    diff --git a/app/views/projects/_project_overview_gallery.html.erb b/app/views/projects/_project_overview_gallery.html.erb new file mode 100644 index 00000000..e07e46fd --- /dev/null +++ b/app/views/projects/_project_overview_gallery.html.erb @@ -0,0 +1,19 @@ +<% project_images = project.project_images %> +<% if project_images.any? %> + <% gallery_id = "project-embedded-gallery-#{project_index}" %> + +<% end %> diff --git a/app/views/projects/index.html.erb b/app/views/projects/index.html.erb new file mode 100644 index 00000000..578ed195 --- /dev/null +++ b/app/views/projects/index.html.erb @@ -0,0 +1,23 @@ +<% content_for :section_title do %> + Projects +<% end %> + +<% content_for :meta_title do %> + Projects +<% end %> + +<% content_for :meta_description do %> + Checkout my most recent projects +<% end %> + +
    + <%= render partial: 'partials/admin_toolbar', locals: { model: Project.new } %> + + <%= render partial: 'partials/system_messages' %> + + <% if @projects.empty? %> + <%= render partial: 'partials/no_items', locals: {item: 'projects'} %> + <% else %> + <%= render partial: 'projects/project_overview', collection: @projects, as: :project, spacer_template: "partials/standard_ruler" %> + <% end %> +
    diff --git a/app/views/sessions/login.html.erb b/app/views/sessions/login.html.erb new file mode 100644 index 00000000..373e9ca5 --- /dev/null +++ b/app/views/sessions/login.html.erb @@ -0,0 +1,26 @@ +<% content_for :head do %> + +<% end %> + +<% content_for :section_title do %> + Login +<% end %> + +<% content_for :form do %> + <%= form_with(url: "/login", method: "post", class: 'floating-form') do |f| %> + <%= render partial: 'partials/system_messages' %> + <%= f.text_field(:user, required: true, class: 'input-box', placeholder: 'Username or Email', autocomplete: "on") %> +
    + <%= f.password_field(:password, required: true, class: 'input-box', placeholder: 'Password', autocomplete: "on") %> +
    + +
    +
    + <%= render partial: "partials/submit_right", locals: {form: f, button_text: 'Login'} %> +
    + <% end %> +<% end %> + +<%= render template: "layouts/forms/floating_form" %> diff --git a/app/views/sessions/two_factor_auth.html.erb b/app/views/sessions/two_factor_auth.html.erb new file mode 100644 index 00000000..5b0b3962 --- /dev/null +++ b/app/views/sessions/two_factor_auth.html.erb @@ -0,0 +1,26 @@ +<% content_for :head do %> + +<% end %> + +<% content_for :section_title do %> + Two Factor Authentication +<% end %> + +<% content_for :form do %> + <%= form_with(url: "/2fa", method: :post, class: 'floating-form') do |f| %> + <%= render partial: 'partials/system_messages' %> + <%= f.text_field(:auth_code, required: true, class: 'input-box', placeholder: '2FA Code') %> +
    + <%= render partial: "partials/submit_right", locals: {form: f, button_text: 'Login'} %> + <% end %> +
    + <%= form_tag('/2fa', method: :put) do %> + <%= submit_tag("Resend 2fa code", class: 'option left') %> + <% end %> + <%= form_with(url: "/login", method: 'delete') do %> + <%= submit_tag("Cancel Login", class: 'option right') %> + <% end %> +
    +<% end %> + +<%= render template: "layouts/forms/floating_form" %> diff --git a/babel.config.js b/babel.config.js index 12f98da5..8bc835c2 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,9 +1,9 @@ -module.exports = function(api) { - var validEnv = ['development', 'test', 'production'] - var currentEnv = api.env() - var isDevelopmentEnv = api.env('development') - var isProductionEnv = api.env('production') - var isTestEnv = api.env('test') +module.exports = function (api) { + const validEnv = ['development', 'test', 'production'] + const currentEnv = api.env() + const isDevelopmentEnv = api.env('development') + const isProductionEnv = api.env('production') + const isTestEnv = api.env('test') if (!validEnv.includes(currentEnv)) { throw new Error( @@ -30,8 +30,8 @@ module.exports = function(api) { { forceAllTransforms: true, useBuiltIns: 'entry', - corejs: 3, modules: false, + corejs: 3, exclude: ['transform-typeof-symbol'] } ] @@ -53,12 +53,23 @@ module.exports = function(api) { useBuiltIns: true } ], + [ + '@babel/plugin-proposal-private-property-in-object', + { + loose: true + } + ], + [ + '@babel/plugin-proposal-private-methods', + { + loose: true + } + ], [ '@babel/plugin-transform-runtime', { helpers: false, - regenerator: true, - corejs: false + regenerator: true } ], [ @@ -66,7 +77,8 @@ module.exports = function(api) { { async: false } - ] + ], + isTestEnv && '@babel/plugin-transform-modules-commonjs' ].filter(Boolean) } } diff --git a/bin/bundle b/bin/bundle index a71368e3..a430f55e 100755 --- a/bin/bundle +++ b/bin/bundle @@ -8,46 +8,44 @@ # this file is here to facilitate running it. # -require "rubygems" +require 'rubygems' m = Module.new do module_function def invoked_as_script? - File.expand_path($0) == File.expand_path(__FILE__) + File.expand_path($PROGRAM_NAME) == File.expand_path(__FILE__) end def env_var_version - ENV["BUNDLER_VERSION"] + ENV['BUNDLER_VERSION'] end def cli_arg_version return unless invoked_as_script? # don't want to hijack other binstubs - return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update` + return unless 'update'.start_with?(ARGV.first || ' ') # must be running `bundle update` bundler_version = nil update_index = nil ARGV.each_with_index do |a, i| - if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN - bundler_version = a - end + bundler_version = a if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/ - bundler_version = $1 + bundler_version = Regexp.last_match(1) update_index = i end bundler_version end def gemfile - gemfile = ENV["BUNDLE_GEMFILE"] + gemfile = ENV['BUNDLE_GEMFILE'] return gemfile if gemfile && !gemfile.empty? - File.expand_path("../../Gemfile", __FILE__) + File.expand_path('../Gemfile', __dir__) end def lockfile lockfile = case File.basename(gemfile) - when "gems.rb" then gemfile.sub(/\.rb$/, gemfile) + when 'gems.rb' then gemfile.sub(/\.rb$/, gemfile) else "#{gemfile}.lock" end File.expand_path(lockfile) @@ -63,7 +61,7 @@ m = Module.new do def bundler_version @bundler_version ||= env_var_version || cli_arg_version || - lockfile_version + lockfile_version end def bundler_requirement @@ -73,26 +71,26 @@ m = Module.new do requirement = bundler_gem_version.approximate_recommendation - return requirement unless Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.7.0") + return requirement unless Gem::Version.new(Gem::VERSION) < Gem::Version.new('3.1.0') - requirement += ".a" if bundler_gem_version.prerelease? + requirement += '.a' if bundler_gem_version.prerelease? requirement end def load_bundler! - ENV["BUNDLE_GEMFILE"] ||= gemfile + ENV['BUNDLE_GEMFILE'] ||= gemfile activate_bundler end def activate_bundler gem_error = activation_error_handling do - gem "bundler", bundler_requirement + gem 'bundler', bundler_requirement end return if gem_error.nil? require_error = activation_error_handling do - require "bundler/version" + require 'bundler/version' end return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION)) warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`" @@ -109,6 +107,4 @@ end m.load_bundler! -if m.invoked_as_script? - load Gem.bin_path("bundler", "bundle") -end +load Gem.bin_path('bundler', 'bundle') if m.invoked_as_script? diff --git a/bin/rails b/bin/rails index 5badb2fd..efc03774 100755 --- a/bin/rails +++ b/bin/rails @@ -1,9 +1,4 @@ #!/usr/bin/env ruby -begin - load File.expand_path('../spring', __FILE__) -rescue LoadError => e - raise unless e.message.include?('spring') -end -APP_PATH = File.expand_path('../config/application', __dir__) -require_relative '../config/boot' -require 'rails/commands' +APP_PATH = File.expand_path("../config/application", __dir__) +require_relative "../config/boot" +require "rails/commands" diff --git a/bin/rake b/bin/rake index d87d5f57..4fbf10b9 100755 --- a/bin/rake +++ b/bin/rake @@ -1,9 +1,4 @@ #!/usr/bin/env ruby -begin - load File.expand_path('../spring', __FILE__) -rescue LoadError => e - raise unless e.message.include?('spring') -end -require_relative '../config/boot' -require 'rake' +require_relative "../config/boot" +require "rake" Rake.application.run diff --git a/bin/setup b/bin/setup index 5853b5ea..ed32309b 100755 --- a/bin/setup +++ b/bin/setup @@ -1,36 +1,39 @@ #!/usr/bin/env ruby -require 'fileutils' +require "fileutils" # path to your application root. -APP_ROOT = File.expand_path('..', __dir__) +APP_ROOT = File.expand_path("..", __dir__) def system!(*args) system(*args) || abort("\n== Command #{args} failed ==") end FileUtils.chdir APP_ROOT do - # This script is a way to setup or update your development environment automatically. - # This script is idempotent, so that you can run it at anytime and get an expectable outcome. + # This script is a way to set up or update your development environment automatically. + # This script is idempotent, so that you can run it at any time and get an expectable outcome. # Add necessary setup steps to this file. - puts '== Installing dependencies ==' - system! 'gem install bundler --conservative' - system('bundle check') || system!('bundle install') + puts "== Installing dependencies ==" + system! "gem install bundler --conservative" + system("bundle check") || system!("bundle install") # Install JavaScript dependencies - # system('bin/yarn') + system! "bin/yarn" + + # Install JavaScript dependencies + system! 'bin/yarn' # puts "\n== Copying sample files ==" - # unless File.exist?('config/database.yml') - # FileUtils.cp 'config/database.yml.sample', 'config/database.yml' + # unless File.exist?("config/database.yml") + # FileUtils.cp "config/database.yml.sample", "config/database.yml" # end puts "\n== Preparing database ==" - system! 'bin/rails db:prepare' + system! "bin/rails db:prepare" puts "\n== Removing old logs and tempfiles ==" - system! 'bin/rails log:clear tmp:clear' + system! "bin/rails log:clear tmp:clear" puts "\n== Restarting application server ==" - system! 'bin/rails restart' + system! "bin/rails restart" end diff --git a/bin/spring b/bin/spring index d89ee495..b4147e84 100755 --- a/bin/spring +++ b/bin/spring @@ -1,17 +1,14 @@ #!/usr/bin/env ruby +if !defined?(Spring) && [nil, "development", "test"].include?(ENV["RAILS_ENV"]) + gem "bundler" + require "bundler" -# This file loads Spring without using Bundler, in order to be fast. -# It gets overwritten when you run the `spring binstub` command. - -unless defined?(Spring) - require 'rubygems' - require 'bundler' - - lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) - spring = lockfile.specs.detect { |spec| spec.name == 'spring' } - if spring + # Load Spring without loading other gems in the Gemfile, for speed. + Bundler.locked_gems&.specs&.find { |spec| spec.name == "spring" }&.tap do |spring| Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path - gem 'spring', spring.version - require 'spring/binstub' + gem "spring", spring.version + require "spring/binstub" + rescue Gem::LoadError + # Ignore when Spring is not installed. end end diff --git a/bin/webpack b/bin/webpacker similarity index 50% rename from bin/webpack rename to bin/webpacker index 1031168d..e92c8b68 100755 --- a/bin/webpack +++ b/bin/webpacker @@ -1,14 +1,9 @@ #!/usr/bin/env ruby -ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development" -ENV["NODE_ENV"] ||= "development" - -require "pathname" -ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", - Pathname.new(__FILE__).realpath) +ENV["RAILS_ENV"] ||= "development" +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__) require "bundler/setup" - require "webpacker" require "webpacker/webpack_runner" diff --git a/bin/webpack-dev-server b/bin/webpacker-dev-server similarity index 51% rename from bin/webpack-dev-server rename to bin/webpacker-dev-server index dd966273..c7bc0ff2 100755 --- a/bin/webpack-dev-server +++ b/bin/webpacker-dev-server @@ -1,14 +1,9 @@ #!/usr/bin/env ruby -ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development" -ENV["NODE_ENV"] ||= "development" - -require "pathname" -ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", - Pathname.new(__FILE__).realpath) +ENV["RAILS_ENV"] ||= "development" +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__) require "bundler/setup" - require "webpacker" require "webpacker/dev_server_runner" diff --git a/bin/yarn b/bin/yarn index 460dd565..8649db4d 100755 --- a/bin/yarn +++ b/bin/yarn @@ -1,9 +1,16 @@ #!/usr/bin/env ruby -APP_ROOT = File.expand_path('..', __dir__) + +APP_ROOT = File.expand_path('.', __dir__) Dir.chdir(APP_ROOT) do - begin - exec "yarnpkg", *ARGV - rescue Errno::ENOENT + yarn = ENV["PATH"].split(File::PATH_SEPARATOR). + select { |dir| File.expand_path(dir) != __dir__ }. + product(["yarn", "yarnpkg", "yarn.cmd", "yarn.ps1"]). + map { |dir, file| File.expand_path(file, dir) }. + find { |file| File.executable?(file) } + + if yarn + exec yarn, *ARGV + else $stderr.puts "Yarn executable was not detected in the system." $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" exit 1 diff --git a/config.ru b/config.ru index f7ba0b52..ad1fbf29 100644 --- a/config.ru +++ b/config.ru @@ -3,3 +3,4 @@ require_relative 'config/environment' run Rails.application +Rails.application.load_server diff --git a/config/application.rb b/config/application.rb index 1b785f4c..c2013931 100644 --- a/config/application.rb +++ b/config/application.rb @@ -1,6 +1,6 @@ -require_relative 'boot' +require_relative "boot" -require 'rails/all' +require "rails/all" # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. @@ -9,11 +9,53 @@ module HomeServer class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 6.0 + config.load_defaults 7.0 + config.middleware.use Rack::Attack - # Settings in config/environments/* take precedence over those specified here. - # Application configuration can go into files in config/initializers - # -- all .rb files in that directory are automatically loaded after loading - # the framework and any gems in your application. + config.generators do |g| + g.test_framework :rspec, :fixture => false + g.template_engine :erb + g.view_specs false + g.helper_specs false + g.stylesheets false + end + + # Configuration for the application, engines, and railties goes here. + # + # These settings can be overridden in specific environments using the files + # in config/environments, which are processed later. + # + # config.time_zone = "Central Time (US & Canada)" + # config.eager_load_paths << Rails.root.join("extras") + + config.active_storage.queues.purge = :default + config.active_storage.queues.analysis = :default + + config.action_view.field_error_proc = Proc.new { |html_tag, instance| + html_tag + } + + config.autoload_paths += Dir[Rails.root.join('app', 'jobs', '**/')] + config.autoload_paths += Dir[Rails.root.join('app', 'models', '**/')] + config.autoload_paths += Dir[Rails.root.join('app', 'mailers', '**/')] + + # email + config.email_default_name = ENV['EMAIL_DEFAULT_NAME'] + config.email_default_address = ENV['EMAIL_DEFAULT_ADDRESS'] + config.email_no_reply_address = ENV['EMAIL_NO_REPLY_ADDRESS'] + + # google recaptcha + config.grecaptcha_site_secret = ENV['GRECAPTCHA_SITE_SECRET'] + + # twilio + config.twilio_account_sid = ENV['TWILIO_ACCOUNT_SID'] + config.twilio_auth_token = ENV['TWILIO_AUTH_TOKEN'] + config.twilio_verify_service_sid = ENV['TWILIO_VERIFY_SERVICE_SID'] + + # Image processing + config.active_storage.variant_processor = :mini_magick + + # Active storage + config.active_storage.service_urls_expire_in = 1.week end end diff --git a/config/boot.rb b/config/boot.rb index b9e460ce..28201161 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,4 +1,3 @@ -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) -require 'bundler/setup' # Set up gems listed in the Gemfile. -require 'bootsnap/setup' # Speed up boot time by caching expensive operations. +require "bundler/setup" # Set up gems listed in the Gemfile. diff --git a/config/carbon-config.json b/config/carbon-config.json new file mode 100644 index 00000000..069b68c9 --- /dev/null +++ b/config/carbon-config.json @@ -0,0 +1,23 @@ +{ + "default": { + "t": "panda-syntax", + "l": "auto", + "bg": "#FFFFFF", + "wt": "sharp", + "wc": false, + "fm": "Inconsolata", + "fs": "16px", + "ln": false, + "ds": false, + "dsyoff": "20px", + "dsblur": "68px", + "wa": true, + "lh": "110%", + "pv": "0px", + "ph": "0px", + "si": false, + "wm": false, + "es": "4x", + "type": "png" + } +} \ No newline at end of file diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc deleted file mode 100644 index 9c4f8d76..00000000 --- a/config/credentials.yml.enc +++ /dev/null @@ -1 +0,0 @@ -SND2n628N65danBK5oJwZCyLf2zV6UGfrFnqAv4kldGvTVpYsZUUw7myZIcajQ/npJtkVYMd4H3NsUlsHI30F1CXS/rheEZHQW5kadI+SjOBrTXiQ+iu5PiFFxCcTD3RKkZ1CHun/UNaQZu323wT3/gRcCjOqnggjD2zXjereM6J0a/cYyYdw9hiIwJ0poi2B1fTwf7SfQ3yT9Y3l2DUNMqXfea6uhHS1heUTPBP3tgpUxwfd3OArwNjFfOJk7ceeFScAy6DQy51qsiz2oPRzC8GbFevi8LDf9y8cHNPlePJkBFqTowdLlKveogFpHybZpDwzxSyOhFc+JxSO0pnjIpGfLhzV+uScSvage2zut+L7sa9pgmFhAbcGjHhL+4VF/GxyNH05FFVG/85WVxJJy/xqY+FzAhYS9kc--F6a4wvgCjfjS1TRK--PsJyoQe/hbzFNyoe6gSakA== \ No newline at end of file diff --git a/config/database.yml b/config/database.yml index 4a8a1b26..ee1162b9 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,25 +1,21 @@ -# SQLite. Versions 3.8.0 and up are supported. -# gem install sqlite3 -# -# Ensure the SQLite 3 gem is defined in your Gemfile -# gem 'sqlite3' -# default: &default - adapter: sqlite3 - pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + adapter: postgresql + encoding: unicode + username: <%= ENV['DB_USERNAME'] %> + password: <%= ENV['DB_PASSWORD'] %> + host: <%= ENV.fetch('DB_HOST') { 'localhost' } %> + port: <%= ENV.fetch('DB_PORT') { 5432 } %> + pool: 5 timeout: 5000 -development: +production: <<: *default - database: db/development.sqlite3 + database: home_server_production -# Warning: The database defined as "test" will be erased and -# re-generated from your development database when you run "rake". -# Do not set this db to the same as development or production. -test: +development: <<: *default - database: db/test.sqlite3 + database: home_server_development -production: +test: <<: *default - database: db/production.sqlite3 + database: home_server_test diff --git a/config/env/.env.template b/config/env/.env.template new file mode 100644 index 00000000..85d6ff1e --- /dev/null +++ b/config/env/.env.template @@ -0,0 +1,52 @@ +# PSQL Database Credentials +DB_USERNAME= +DB_PASSWORD= +DB_HOST= + +# Google ReCaptcha v2 Credentials +GRECAPTCHA_SITE_KEY= +GRECAPTCHA_SITE_SECRET= + +# Twilio Credentials +TWILIO_ACCOUNT_SID= +TWILIO_AUTH_TOKEN= +TWILIO_VERIFY_SERVICE_SID= + +# Admin User Details +ADMIN_USERNAME=admin +ADMIN_PASSWORD=password +ADMIN_EMAIL=admin@example.com +ADMIN_MOBILE_NUMBER= + +# Site Settings +SITE_HOST= +SECRET_KEY_BASE= + +# Email Settings +EMAIL_ASSET_HOST= +EMAIL_DEFAULT_ADDRESS= +EMAIL_NO_REPLY_ADDRESS= +EMAIL_DEFAULT_NAME= +EMAIL_COMPANY_NAME= +EMAIL_SMTP_USERNAME= +EMAIL_SMTP_PASSWORD= +EMAIL_SMTP_SERVER_ADDRESS= +EMAIL_SMTP_SERVER_PORT= +EMAIL_HELO_DOMAIN= + +# AWS Credentials +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_REGION= +AWS_BUCKET= + +# Depolyment Settings +PUMA_STARTING_THREADS= +PUMA_MAX_THREADS= +PUMA_WEB_CONCURRENCY= + +# Background worker +REDIS_HOST= + +# Sentry Error Reporting +SENTRY_DSN= diff --git a/config/env/build_args.env.template b/config/env/build_args.env.template new file mode 100644 index 00000000..179e4978 --- /dev/null +++ b/config/env/build_args.env.template @@ -0,0 +1,6 @@ +# Google ReCaptcha v2 Credentials +export GRECAPTCHA_SITE_KEY= +export GRECAPTCHA_SITE_SECRET= + +# Geocoder +export MAX_MIND_LICENSE= diff --git a/config/env/test-defaults.env b/config/env/test-defaults.env new file mode 100644 index 00000000..f090a6ec --- /dev/null +++ b/config/env/test-defaults.env @@ -0,0 +1,29 @@ +# Rails +RACK_ENV=test +RAILS_ENV=test + +# PSQL Database +DB_NAME_TEST=home_server_test + +# Google ReCaptcha v2 Credentials +GRECAPTCHA_SITE_KEY=test +GRECAPTCHA_SITE_SECRET=test + +# Twilio Credentials +TWILIO_ACCOUNT_SID=test +TWILIO_AUTH_TOKEN=test +TWILIO_VERIFY_SERVICE_SID=test + +# Site Settings +SITE_HOST=example.com +SECRET_KEY_BASE=1234567890 + +# Email Settings +EMAIL_ASSET_HOST=example.com +EMAIL_DEFAULT_ADDRESS=admin@example.com +EMAIL_NO_REPLY_ADDRESS=no-reply@example.com +EMAIL_DEFAULT_NAME=admin +EMAIL_COMPANY_NAME=home-server + +# Sentry Error Reporting +SENTRY_DSN=test \ No newline at end of file diff --git a/config/environment.rb b/config/environment.rb index 426333bb..cac53157 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,5 +1,5 @@ # Load the Rails application. -require_relative 'application' +require_relative "application" # Initialize the Rails application. Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb index 66df51f6..16be685e 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,8 +1,10 @@ +require "active_support/core_ext/integer/time" + Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - # In the development environment your application's code is reloaded on - # every request. This slows down response time but is perfect for development + # In the development environment your application's code is reloaded any time + # it changes. This slows down response time but is perfect for development # since you don't have to restart the web server when you make code changes. config.cache_classes = false @@ -12,15 +14,18 @@ # Show full error reports. config.consider_all_requests_local = true + # Enable server timing + config.server_timing = true + # Enable/disable caching. By default caching is disabled. # Run rails dev:cache to toggle caching. - if Rails.root.join('tmp', 'caching-dev.txt').exist? + if Rails.root.join("tmp/caching-dev.txt").exist? config.action_controller.perform_caching = true config.action_controller.enable_fragment_cache_logging = true config.cache_store = :memory_store config.public_file_server.headers = { - 'Cache-Control' => "public, max-age=#{2.days.to_i}" + "Cache-Control" => "public, max-age=#{2.days.to_i}" } else config.action_controller.perform_caching = false @@ -31,14 +36,15 @@ # Store uploaded files on the local file system (see config/storage.yml for options). config.active_storage.service = :local - # Don't care if the mailer can't send. - config.action_mailer.raise_delivery_errors = false - - config.action_mailer.perform_caching = false - # Print deprecation notices to the Rails logger. config.active_support.deprecation = :log + # Raise exceptions for disallowed deprecations. + config.active_support.disallowed_deprecation = :raise + + # Tell Active Support which deprecation messages to disallow. + config.active_support.disallowed_deprecation_warnings = [] + # Raise an error on page load if there are pending migrations. config.active_record.migration_error = :page_load @@ -54,9 +60,36 @@ config.assets.quiet = true # Raises error for missing translations. - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true + + # Uncomment if you wish to allow Action Cable access from any origin. + # config.action_cable.disable_request_forgery_protection = true + - # Use an evented file watcher to asynchronously detect changes in source code, - # routes, locales, etc. This feature depends on the listen gem. - config.file_watcher = ActiveSupport::EventedFileUpdateChecker + config.log_level = :debug + + # Active Mailer Settings + config.action_mailer.default_url_options = { host: ENV['SITE_HOST'] } + config.action_mailer.asset_host = ENV['EMAIL_ASSET_HOST'] + config.action_mailer.delivery_method = :smtp + config.action_mailer.smtp_settings = { :address => 'mailcatcher', :port => 1025 } + config.action_mailer.raise_delivery_errors = false + config.action_mailer.perform_deliveries = true + config.action_mailer.perform_caching = false + config.action_mailer.preview_paths << "#{Rails.root}/spec/mailers/previews" + + Rails.application.routes.default_url_options = { + host: ENV['SITE_HOST'], + protocol: 'http' + } + + # Active Job Settings + config.active_job.queue_adapter = :sidekiq + + # Console whitelist + config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16'] + config.hosts << 'app' end diff --git a/config/environments/production.rb b/config/environments/production.rb index fd57cfe4..1b3d334e 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,3 +1,5 @@ +require "active_support/core_ext/integer/time" + Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. @@ -20,7 +22,10 @@ # Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. - config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + config.public_file_server.enabled = true + config.public_file_server.headers = { + "Cache-Control" => "private, max-age=#{1.year.to_i}" + } # Compress CSS using a preprocessor. # config.assets.css_compressor = :sass @@ -29,32 +34,31 @@ config.assets.compile = false # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.action_controller.asset_host = 'http://assets.example.com' + # config.asset_host = "http://assets.example.com" # Specifies the header that your server uses for sending files. - # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache - # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache + # config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :local + config.active_storage.service = :amazon # Mount Action Cable outside main process or domain. # config.action_cable.mount_path = nil - # config.action_cable.url = 'wss://example.com/cable' - # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + # config.action_cable.url = "wss://example.com/cable" + # config.action_cable.allowed_request_origins = [ "http://example.com", /http:\/\/example.*/ ] # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. # config.force_ssl = true - # Use the lowest log level to ensure availability of diagnostic information - # when problems arise. - config.log_level = :debug + # Include generic and useful information about system operation, but avoid logging too much + # information to avoid inadvertent exposure of personally identifiable information (PII). + config.log_level = :warn # Prepend all log lines with the following tags. config.log_tags = [ :request_id ] - config.logger = Logger.new(STDOUT) - - config.assets.compile = true + + # Use a different cache store in production. # config.cache_store = :mem_cache_store @@ -73,17 +77,20 @@ # the I18n.default_locale when a translation cannot be found). config.i18n.fallbacks = true - # Send deprecation notices to registered listeners. - config.active_support.deprecation = :notify + # Don't log any deprecations. + config.active_support.report_deprecations = false # Use default logging formatter so that PID and timestamp are not suppressed. config.log_formatter = ::Logger::Formatter.new # Use a different logger for distributed setups. - # require 'syslog/logger' - # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + # require "syslog/logger" + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new "app-name") + + config.logger = Logger.new(STDOUT) + config.logger.datetime_format = "%Y-%m-%d %H:%M:%S" - if ENV["RAILS_LOG_TO_STDOUT"].present? + if ENV['RAILS_LOG_TO_STDOUT'].present? logger = ActiveSupport::Logger.new(STDOUT) logger.formatter = config.log_formatter config.logger = ActiveSupport::TaggedLogging.new(logger) @@ -92,25 +99,24 @@ # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false - # Inserts middleware to perform automatic connection switching. - # The `database_selector` hash is used to pass options to the DatabaseSelector - # middleware. The `delay` is used to determine how long to wait after a write - # to send a subsequent read to the primary. - # - # The `database_resolver` class is used by the middleware to determine which - # database is appropriate to use based on the time delay. - # - # The `database_resolver_context` class is used by the middleware to set - # timestamps for the last write to the primary. The resolver uses the context - # class timestamps to determine how long to wait before reading from the - # replica. - # - # By default Rails will store a last write timestamp in the session. The - # DatabaseSelector middleware is designed as such you can define your own - # strategy for connection switching and pass that into the middleware through - # these configuration options. - # config.active_record.database_selector = { delay: 2.seconds } - # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver - # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session - config.force_ssl = true + # Active Mailer Settings + config.action_mailer.default_url_options = { host: ENV['SITE_HOST'] } + config.action_mailer.asset_host = ENV['EMAIL_ASSET_HOST'] + config.action_mailer.delivery_method = :smtp + config.action_mailer.smtp_settings = { + address: ENV['EMAIL_SMTP_SERVER_ADDRESS'], + port: ENV['EMAIL_SMTP_SERVER_PORT'], + user_name: ENV['EMAIL_SMTP_USERNAME'], + password: ENV['EMAIL_SMTP_PASSWORD'], + domain: ENV['EMAIL_HELO_DOMAIN'], + tls: true + } + + Rails.application.routes.default_url_options = { + host: ENV['SITE_HOST'], + protocol: 'https' + } + + # Active Job Settings + config.active_job.queue_adapter = :sidekiq end diff --git a/config/environments/test.rb b/config/environments/test.rb index 1d62e91b..b1ccc209 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,3 +1,5 @@ +require "active_support/core_ext/integer/time" + # The test environment is used exclusively to run your application's # test suite. You never need to work with it otherwise. Remember that # your test database is "scratch space" for the test suite and is wiped @@ -6,17 +8,18 @@ Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - config.cache_classes = false + # Turn false under Spring and add config.action_view.cache_template_loading = true. + config.cache_classes = true - # Do not eager load code on boot. This avoids loading your whole application - # just for the purpose of running a single test. If you are using a tool that - # preloads Rails for running tests, you may have to set it to true. - config.eager_load = false + # Eager loading loads your whole application. When running a single test locally, + # this probably isn't necessary. It's a good idea to do in a continuous integration + # system, or in some way before deploying your code. + config.eager_load = ENV["CI"].present? # Configure public file server for tests with Cache-Control for performance. config.public_file_server.enabled = true config.public_file_server.headers = { - 'Cache-Control' => "public, max-age=#{1.hour.to_i}" + "Cache-Control" => "public, max-age=#{1.hour.to_i}" } # Show full error reports and disable caching. @@ -43,6 +46,29 @@ # Print deprecation notices to the stderr. config.active_support.deprecation = :stderr + # Raise exceptions for disallowed deprecations. + config.active_support.disallowed_deprecation = :raise + + # Tell Active Support which deprecation messages to disallow. + config.active_support.disallowed_deprecation_warnings = [] + # Raises error for missing translations. - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true + + # Active Mailer Settings + config.action_mailer.default_url_options = { host: 'http://localhost:3001' } + config.action_mailer.asset_host = 'http://localhost:3001' + config.action_mailer.delivery_method = :test + config.action_mailer.perform_caching = false + + Rails.application.routes.default_url_options = { + host: 'localhost:3001', + protocol: 'http' + } + + # Active Job Settings + config.active_job.queue_adapter = :test end diff --git a/config/initializers/ahoy.rb b/config/initializers/ahoy.rb new file mode 100644 index 00000000..d1231709 --- /dev/null +++ b/config/initializers/ahoy.rb @@ -0,0 +1,20 @@ +class Ahoy::Store < Ahoy::DatabaseStore + protected + def visit_model + ::Visit + end + def event_model + ::Event + end +end + +# set to true for JavaScript tracking +Ahoy.api = false + +# set to true for geocoding (and add the geocoder gem to your Gemfile) +# we recommend configuring local geocoding as well +# see https://github.com/ankane/ahoy#geocoding +Ahoy.geocode = true + +Ahoy.mask_ips = true +Ahoy.cookies = false diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 4b828e80..a339c6ac 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -1,14 +1,16 @@ # Be sure to restart your server when you modify this file. # Version of your assets, change this if you want to expire all your assets. -Rails.application.config.assets.version = '1.0' +Rails.application.config.assets.version = "1.0" # Add additional assets to the asset load path. # Rails.application.config.assets.paths << Emoji.images_path -# Add Yarn node_modules folder to the asset load path. Rails.application.config.assets.paths << Rails.root.join('node_modules') + # Precompile additional assets. # application.js, application.css, and all non-JS/CSS in the app/assets # folder are already added. # Rails.application.config.assets.precompile += %w( admin.js admin.css ) + +Rails.application.config.assets.paths << Rails.root.join("app", "assets", "fonts") diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb index 59385cdf..33699c30 100644 --- a/config/initializers/backtrace_silencers.rb +++ b/config/initializers/backtrace_silencers.rb @@ -1,7 +1,8 @@ # Be sure to restart your server when you modify this file. # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. -# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } +# Rails.backtrace_cleaner.add_silencer { |line| /my_noisy_library/.match?(line) } -# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. -# Rails.backtrace_cleaner.remove_silencers! +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code +# by setting BACKTRACE=1 before calling your invocation, like "BACKTRACE=1 ./bin/rails runner 'MyClass.perform'". +Rails.backtrace_cleaner.remove_silencers! if ENV["BACKTRACE"] diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index 35d0f26f..c7f0ef96 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -1,30 +1,31 @@ # Be sure to restart your server when you modify this file. -# Define an application-wide content security policy -# For further information see the following documentation -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy +# Define an application-wide content security policy. +# See the Securing Rails Applications Guide for more information: +# https://guides.rubyonrails.org/security.html#content-security-policy-header -# Rails.application.config.content_security_policy do |policy| -# policy.default_src :self, :https -# policy.font_src :self, :https, :data -# policy.img_src :self, :https, :data -# policy.object_src :none -# policy.script_src :self, :https -# policy.style_src :self, :https -# # If you are using webpack-dev-server then specify webpack-dev-server host -# policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development? +if Rails.env.production? + Rails.application.configure do + config.content_security_policy do |policy| + policy.default_src :self + policy.font_src :self, :data + policy.img_src :self, :data, "https://#{ENV.fetch('AWS_BUCKET', '')}.s3.#{ENV.fetch('AWS_REGION', '')}.amazonaws.com", 'https://img.shields.io' + policy.media_src :self, :data, "https://#{ENV.fetch('AWS_BUCKET', '')}.s3.#{ENV.fetch('AWS_REGION', '')}.amazonaws.com" + policy.object_src :none + policy.base_uri :self + policy.script_src :self, :unsafe_eval, :unsafe_inline, 'https://www.google.com/recaptcha/api.js', 'https://www.gstatic.com/recaptcha/' + policy.style_src :self, :unsafe_inline + policy.connect_src :self + policy.frame_src :self, 'https://www.google.com/' + # Specify URI for violation reports + # policy.report_uri "/csp-violation-report-endpoint" + end -# # Specify URI for violation reports -# # policy.report_uri "/csp-violation-report-endpoint" -# end + # Generate session nonces for permitted importmap and inline scripts + config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s } + config.content_security_policy_nonce_directives = %w(script-src) -# If you are using UJS then enable automatic nonce generation -# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } - -# Set the nonce only to specific directives -# Rails.application.config.content_security_policy_nonce_directives = %w(script-src) - -# Report CSP violations to a specified URI -# For further information see the following documentation: -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only -# Rails.application.config.content_security_policy_report_only = true + # Report violations without enforcing the policy. + # config.content_security_policy_report_only = true + end +end diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb index 4a994e1e..adc6568c 100644 --- a/config/initializers/filter_parameter_logging.rb +++ b/config/initializers/filter_parameter_logging.rb @@ -1,4 +1,8 @@ # Be sure to restart your server when you modify this file. -# Configure sensitive parameters which will be filtered from the log file. -Rails.application.config.filter_parameters += [:password] +# Configure parameters to be filtered from the log file. Use this to limit dissemination of +# sensitive information. See the ActiveSupport::ParameterFilter documentation for supported +# notations and behaviors. +Rails.application.config.filter_parameters += [ + :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn +] diff --git a/config/initializers/geocoder.rb b/config/initializers/geocoder.rb new file mode 100644 index 00000000..859aecf4 --- /dev/null +++ b/config/initializers/geocoder.rb @@ -0,0 +1,6 @@ +Geocoder.configure( + ip_lookup: :geoip2, + geoip2: { + file: "/var/opt/maxmind/GeoLite2-City.mmdb" + } +) diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index ac033bf9..3860f659 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -4,13 +4,13 @@ # are locale specific, and you may define rules for as many different # locales as you wish. All of these examples are active by default: # ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.plural /^(ox)$/i, '\1en' -# inflect.singular /^(ox)en/i, '\1' -# inflect.irregular 'person', 'people' +# inflect.plural /^(ox)$/i, "\\1en" +# inflect.singular /^(ox)en/i, "\\1" +# inflect.irregular "person", "people" # inflect.uncountable %w( fish sheep ) # end # These inflection rules are supported but not enabled by default: # ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.acronym 'RESTful' +# inflect.acronym "RESTful" # end diff --git a/config/initializers/logger.rb b/config/initializers/logger.rb new file mode 100644 index 00000000..3e10e744 --- /dev/null +++ b/config/initializers/logger.rb @@ -0,0 +1,2 @@ +require 'two_factor_auth_service' +TwoFactorAuthService.logger = Rails.logger \ No newline at end of file diff --git a/config/initializers/permissions_policy.rb b/config/initializers/permissions_policy.rb new file mode 100644 index 00000000..00f64d71 --- /dev/null +++ b/config/initializers/permissions_policy.rb @@ -0,0 +1,11 @@ +# Define an application-wide HTTP permissions policy. For further +# information see https://developers.google.com/web/updates/2018/06/feature-policy +# +# Rails.application.config.permissions_policy do |f| +# f.camera :none +# f.gyroscope :none +# f.microphone :none +# f.usb :none +# f.fullscreen :self +# f.payment :self, "https://secure.example.com" +# end diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb new file mode 100644 index 00000000..635b744b --- /dev/null +++ b/config/initializers/rack_attack.rb @@ -0,0 +1,10 @@ +# Throttle requests to login to 1 per second per ip +Rack::Attack.throttle("requests by ip", limit: 60, period: 1) do |request| + request.ip +end + +# Using 503 because it may make attacker think that they have successfully +# DOSed the site. Rack::Attack returns 429 for throttling by default +Rack::Attack.throttled_responder = lambda do |request| + [503, {}, ["Server Error\n"]] +end \ No newline at end of file diff --git a/config/initializers/sentry.rb b/config/initializers/sentry.rb new file mode 100644 index 00000000..838db3b6 --- /dev/null +++ b/config/initializers/sentry.rb @@ -0,0 +1,8 @@ +if Rails.env.production? + Sentry.init do |config| + config.dsn = ENV['SENTRY_DSN'] + config.breadcrumbs_logger = [:active_support_logger] + + config.traces_sample_rate = 0.001 + end +end \ No newline at end of file diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb new file mode 100644 index 00000000..0f741db7 --- /dev/null +++ b/config/initializers/session_store.rb @@ -0,0 +1,4 @@ +Rails.application.config.session_store :cookie_store, + :key => '_my_session', + :expire_after => 7.days, + :secure => (Rails.env == 'production') \ No newline at end of file diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb new file mode 100644 index 00000000..13ac086e --- /dev/null +++ b/config/initializers/sidekiq.rb @@ -0,0 +1,9 @@ +Sidekiq.configure_server do |config| + db_num = (Rails.env == 'production' ? 1 : 0) + config.redis = { url: "redis://#{ENV.fetch('REDIS_HOST') {'localhost'}}:6379/0", db: db_num } +end + +Sidekiq.configure_client do |config| + db_num = (Rails.env == 'production' ? 1 : 0) + config.redis = { url: "redis://#{ENV.fetch('REDIS_HOST') {'localhost'}}:6379/0", db: db_num } +end \ No newline at end of file diff --git a/config/puma.rb b/config/puma.rb index 499c0dab..b9144640 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -1,34 +1,37 @@ # vars -app_dir = File.expand_path("../..", __FILE__) +app_dir = File.expand_path('..', __dir__) shared_dir = "#{app_dir}/shared" # Specifies the `environment` that Puma will run in. -environment ENV.fetch("RAILS_ENV") { "development" } +environment ENV.fetch('RAILS_ENV') { 'development' } + +# Specifies the `worker_timeout` threshold that Puma will use to wait before +# terminating a worker in development environments. +# +worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development" # pidfile and state pidfile "#{shared_dir}/pids/puma.pid" state_path "#{shared_dir}/pids/puma.state" # Threads for serving requests -threads 1, 16 +threads ENV.fetch('PUMA_STARTING_THREADS') { 1 }, ENV.fetch('PUMA_MAX_THREADS') { 1 } # Workers (cpu cores) -workers ENV.fetch("WEB_CONCURRENCY") { 1 } +workers ENV.fetch('PUMA_WEB_CONCURRENCY') { 0 } preload_app! -# Unix socket to for nginix reverse proxy -bind "unix://#{shared_dir}/sockets/puma.sock" +# Unix socket to for reverse proxy +# bind "unix://#{shared_dir}/sockets/puma.sock" +port ENV.fetch("PORT") { 5000 } # Debugging debug -# Logging -stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true +# Redirect logging +# stdout_redirect "#{app_dir}/log/puma.stdout.log", "#{app_dir}/log/puma.stderr.log", true activate_control_app -# on_worker_boot do -# require "active_record" -# ActiveRecord::Base.connection.disconnect! raise ActiveRecord::ConnectionNotEstablished -# ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env]) -# end +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 530d0fd9..00e03a43 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,48 @@ Rails.application.routes.draw do - root to: 'homepage#index' - get '/say-hello', to: 'homepage#index' + root to: 'homepages#index' + + get '/login', to: 'sessions#login' + post '/login', to: 'sessions#new' + get '/2fa', to: 'sessions#send_2fa' + post '/2fa', to: 'sessions#verify_2fa' + put '/2fa', to: 'sessions#reset_2fa' + delete '/login', to: 'sessions#destroy' + + get '/forgotten-password', to: 'passwords#forgotten_password' + post '/forgotten-password', to: 'passwords#send_reset_link' + get '/reset-password', to: 'passwords#reset_password' + post '/reset-password', to: 'passwords#update_password' + + get '/admin', to: 'admins#general' + get '/admin/notifications', to: 'admins#notifications' + get '/admin/analytics', to: 'admins#analytics' + + namespace :admin do + resources :site_settings, only: [:index, :update] + resources :images, only: [:index] + resources :users, only: [:edit, :update] + resources :header_images, only: [:update], path: '/header-images' + resources :cover_images, only: [:update], path: '/cover-images' + resource :about, only: [:edit, :update] + resources :posts, only: [:new, :create, :edit, :update, :destroy] + resources :gallery_images, only: [:index], path: "/gallery" + resources :gallery_images, only: [:new, :create, :edit, :update, :destroy], path: '/gallery-images' + resources :code_snippets, only: [:new, :create, :edit, :update, :destroy], path: "/code-snippets" + resources :projects, only: [:new, :create, :edit, :update, :destroy] + end + + resource :about, only: [:show] + + get '/contact', to: 'contact_messages#new' + resources :contact_messages, only: [:create], path: 'contact-messages' + + resource :users, only: [:update] + + resources :posts, only: [:index, :show], path: "/blog" + + resources :gallery_images, only: [:index], path: "/gallery" + + resources :code_snippets, only: [:index, :show], path: "/code-snippets" + + resources :projects, only: [:index] end diff --git a/config/schedule.rb b/config/schedule.rb new file mode 100644 index 00000000..e52719ec --- /dev/null +++ b/config/schedule.rb @@ -0,0 +1,3 @@ +every 1.day, :at => '5:00 am' do + rake "sitemap:refresh" +end \ No newline at end of file diff --git a/config/sidekiq.yml b/config/sidekiq.yml new file mode 100644 index 00000000..0503419e --- /dev/null +++ b/config/sidekiq.yml @@ -0,0 +1,5 @@ +:concurrency: 1 +:queues: + - default + - mailers + diff --git a/config/sitemap.rb b/config/sitemap.rb new file mode 100644 index 00000000..db4bd9f5 --- /dev/null +++ b/config/sitemap.rb @@ -0,0 +1,18 @@ +SitemapGenerator::Sitemap.default_host = "https://#{ENV['SITE_HOST']}" +SitemapGenerator.verbose = false + +SitemapGenerator::Sitemap.create(:compress => false) do + add root_path + add about_path + add contact_path + add posts_path + Post.find_each do |post| + add post_path(post), :lastmod => post.updated_at + end + add gallery_images_path + add code_snippets_path + CodeSnippet.find_each do |code_snippet| + add code_snippet_path(code_snippet), :lastmod => code_snippet.updated_at + end + add projects_path +end diff --git a/config/spring.rb b/config/spring.rb index db5bf130..8f6432bf 100644 --- a/config/spring.rb +++ b/config/spring.rb @@ -1,6 +1,6 @@ Spring.watch( - ".ruby-version", - ".rbenv-vars", - "tmp/restart.txt", - "tmp/caching-dev.txt" + '.ruby-version', + '.rbenv-vars', + 'tmp/restart.txt', + 'tmp/caching-dev.txt' ) diff --git a/config/storage.yml b/config/storage.yml index d32f76e8..a8716304 100644 --- a/config/storage.yml +++ b/config/storage.yml @@ -6,13 +6,14 @@ local: service: Disk root: <%= Rails.root.join("storage") %> -# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) -# amazon: -# service: S3 -# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> -# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> -# region: us-east-1 -# bucket: your_own_bucket +amazon: + service: S3 + access_key_id: <%= ENV.fetch('AWS_ACCESS_KEY_ID') { 'example' } %> + secret_access_key: <%= ENV.fetch('AWS_SECRET_ACCESS_KEY') { 'example' } %> + region: <%= ENV.fetch('AWS_REGION') { 'example' } %> + bucket: <%= ENV.fetch('AWS_BUCKET') { 'example' } %> + upload: + cache_control: 'private, max-age=31536000' # Remember not to checkin your GCS keyfile to a repository # google: diff --git a/config/webpack/development.js b/config/webpack/development.js deleted file mode 100644 index c5edff94..00000000 --- a/config/webpack/development.js +++ /dev/null @@ -1,5 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'development' - -const environment = require('./environment') - -module.exports = environment.toWebpackConfig() diff --git a/config/webpack/environment.js b/config/webpack/environment.js deleted file mode 100644 index d16d9af7..00000000 --- a/config/webpack/environment.js +++ /dev/null @@ -1,3 +0,0 @@ -const { environment } = require('@rails/webpacker') - -module.exports = environment diff --git a/config/webpack/loaders/erb.js b/config/webpack/loaders/erb.js new file mode 100644 index 00000000..a4049f13 --- /dev/null +++ b/config/webpack/loaders/erb.js @@ -0,0 +1,11 @@ +module.exports = { + test: /\.erb$/, + enforce: 'pre', + exclude: /node_modules/, + use: [{ + loader: 'rails-erb-loader', + options: { + runner: (/^win/.test(process.platform) ? 'ruby ' : '') + 'bin/rails runner' + } + }] +} diff --git a/config/webpack/loaders/fonts.js b/config/webpack/loaders/fonts.js new file mode 100644 index 00000000..efc2b28a --- /dev/null +++ b/config/webpack/loaders/fonts.js @@ -0,0 +1,11 @@ +module.exports = { + test: /\.(woff(2)?|eot|otf|ttf)$/, + use: { + loader: 'file-loader', + options: { + name: '[name]-[contenthash].[ext]', + outputPath: 'css/fonts/', + publicPath: (url) => `fonts/${url}`, + } + } +} \ No newline at end of file diff --git a/config/webpack/production.js b/config/webpack/production.js deleted file mode 100644 index be0f53aa..00000000 --- a/config/webpack/production.js +++ /dev/null @@ -1,5 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'production' - -const environment = require('./environment') - -module.exports = environment.toWebpackConfig() diff --git a/config/webpack/test.js b/config/webpack/test.js deleted file mode 100644 index c5edff94..00000000 --- a/config/webpack/test.js +++ /dev/null @@ -1,5 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'development' - -const environment = require('./environment') - -module.exports = environment.toWebpackConfig() diff --git a/config/webpack/webpack.config.js b/config/webpack/webpack.config.js new file mode 100644 index 00000000..c0af2eae --- /dev/null +++ b/config/webpack/webpack.config.js @@ -0,0 +1,27 @@ +// See the shakacode/shakapacker README and docs directory for advice on customizing your webpackConfig. + +const { webpackConfig } = require('shakapacker') + +// Allow Webpack to read erb files +const erb = require('./loaders/erb') +webpackConfig.module.rules.unshift(erb) + +// Allow Webpack to read font files +const fonts = require('./loaders/fonts') +webpackConfig.module.rules.unshift(fonts) + +// resolve-url-loader must be used before sass-loader +webpackConfig.module.rules.find(rule => rule.test.test('.sass')).use.splice(-1, 0, { + loader: 'resolve-url-loader' +}) + +// Get the actual sass-loader config and set loader to dart sass +const sassLoader = webpackConfig.module.rules.find(rule => rule.test.test('.sass')) +const sassLoaderConfig = sassLoader.use.find( e => e.loader && e.loader.includes('sass-loader')) +sassLoaderConfig.options.implementation = require('sass') + + +webpackConfig.performance = { + maxEntrypointSize: 512000 +} +module.exports = webpackConfig diff --git a/config/webpacker.yml b/config/webpacker.yml index 8581ac04..f1851caf 100644 --- a/config/webpacker.yml +++ b/config/webpacker.yml @@ -1,23 +1,48 @@ -# Note: You must restart bin/webpack-dev-server for changes to take effect +# Note: You must restart bin/webpacker-dev-server for changes to take effect default: &default - source_path: app/javascript + source_path: app/frontend source_entry_path: packs public_root_path: public public_output_path: packs cache_path: tmp/cache/webpacker check_yarn_integrity: false webpack_compile_output: true + # See https://github.com/shakacode/shakapacker#deployment + webpacker_precompile: true + + # If nested_entries is true, then we'll pick up subdirectories within the source_entry_path. + # You cannot set this option to true if you set source_entry_path to '/' + nested_entries: false + + # While using a File-System-based automated bundle generation feature, miscellaneous warnings suggesting css order + # conflicts may arise due to the mini-css-extract-plugin. For projects where css ordering has been mitigated through + # consistent use of scoping or naming conventions, the css order warnings can be disabled by setting + # css_extract_ignore_order_warnings to true + css_extract_ignore_order_warnings: false # Additional paths webpack should lookup modules # ['app/assets', 'engine/foo/app/assets'] resolved_paths: [] + # Additional paths webpack should look up modules + # ['app/assets', 'engine/foo/app/assets'] + additional_paths: [] + + # Select loader to use, available options are 'babel' (default), 'swc' or 'esbuild' + webpack_loader: 'babel' + + # Set to true to enable check for matching versions of shakapacker gem and NPM package - will raise an error if there is a mismatch or wildcard versioning is used + ensure_consistent_versioning: false + # Reload manifest.json on all requests so we reload latest compiled packs cache_manifest: false # Extract and emit a css file - extract_css: false + extract_css: true + + # Select whether the compiler will use SHA digest ('digest' option) or most most recent modified timestamp ('mtime') to determine freshness + compiler_strategy: digest static_assets_extensions: - .jpg @@ -27,13 +52,10 @@ default: &default - .tiff - .ico - .svg - - .eot - - .otf - - .ttf - - .woff - - .woff2 extensions: + - .erb + - .js.erb - .mjs - .js - .sass @@ -51,20 +73,22 @@ default: &default development: <<: *default compile: true + compiler_strategy: mtime # Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules - check_yarn_integrity: true + check_yarn_integrity: false # Reference: https://webpack.js.org/configuration/dev-server/ dev_server: https: false - host: localhost + host: 0.0.0.0 port: 3035 - public: localhost:3035 - hmr: false + public: 0.0.0.0:3035 + hmr: true # Inline should be set to true if using HMR - inline: true - overlay: true + inline_css: true + client: + overlay: true compress: true disable_host_check: true use_local_ip: false @@ -72,8 +96,10 @@ development: pretty: false headers: 'Access-Control-Allow-Origin': '*' - watch_options: - ignored: '**/node_modules/**' + static: + watch: + ignored: '**/node_modules/**' + test: diff --git a/db/migrate/20200428200152_create_users.rb b/db/migrate/20200428200152_create_users.rb new file mode 100644 index 00000000..f0b76b4c --- /dev/null +++ b/db/migrate/20200428200152_create_users.rb @@ -0,0 +1,10 @@ +class CreateUsers < ActiveRecord::Migration[6.0] + def change + create_table :users do |t| + t.text :email + t.text :username + t.text :password_digest + t.timestamps + end + end +end diff --git a/db/migrate/20200501155113_add_mobile_to_users.rb b/db/migrate/20200501155113_add_mobile_to_users.rb new file mode 100644 index 00000000..8f190de2 --- /dev/null +++ b/db/migrate/20200501155113_add_mobile_to_users.rb @@ -0,0 +1,5 @@ +class AddMobileToUsers < ActiveRecord::Migration[6.0] + def change + add_column :users, :mobile_number, :text + end +end diff --git a/db/migrate/20200508173155_add_password_reset_to_users.rb b/db/migrate/20200508173155_add_password_reset_to_users.rb new file mode 100644 index 00000000..9fc71b38 --- /dev/null +++ b/db/migrate/20200508173155_add_password_reset_to_users.rb @@ -0,0 +1,6 @@ +class AddPasswordResetToUsers < ActiveRecord::Migration[6.0] + def change + add_column :users, :password_reset_token, :string + add_column :users, :password_reset_expiry, :datetime + end +end diff --git a/db/migrate/20200522141243_add_last_login_to_users.rb b/db/migrate/20200522141243_add_last_login_to_users.rb new file mode 100644 index 00000000..3697680d --- /dev/null +++ b/db/migrate/20200522141243_add_last_login_to_users.rb @@ -0,0 +1,6 @@ +class AddLastLoginToUsers < ActiveRecord::Migration[6.0] + def change + add_column :users, :last_login_ip, :string + add_column :users, :last_login_time, :datetime + end +end diff --git a/db/migrate/20200612140808_add_current_login_to_user.rb b/db/migrate/20200612140808_add_current_login_to_user.rb new file mode 100644 index 00000000..a8ab084d --- /dev/null +++ b/db/migrate/20200612140808_add_current_login_to_user.rb @@ -0,0 +1,6 @@ +class AddCurrentLoginToUser < ActiveRecord::Migration[6.0] + def change + add_column :users, :current_login_ip, :string + add_column :users, :current_login_time, :datetime + end +end diff --git a/db/migrate/20200612152004_add_email_and_username_uniqueness_to_user.rb b/db/migrate/20200612152004_add_email_and_username_uniqueness_to_user.rb new file mode 100644 index 00000000..c43fe80a --- /dev/null +++ b/db/migrate/20200612152004_add_email_and_username_uniqueness_to_user.rb @@ -0,0 +1,6 @@ +class AddEmailAndUsernameUniquenessToUser < ActiveRecord::Migration[6.0] + def change + add_index :users, :email, unique: true + add_index :users, :username, unique: true + end +end diff --git a/db/migrate/20200703154647_add_mobile_number_uniqueness_to_user.rb b/db/migrate/20200703154647_add_mobile_number_uniqueness_to_user.rb new file mode 100644 index 00000000..688d20dd --- /dev/null +++ b/db/migrate/20200703154647_add_mobile_number_uniqueness_to_user.rb @@ -0,0 +1,5 @@ +class AddMobileNumberUniquenessToUser < ActiveRecord::Migration[6.0] + def change + add_index :users, :mobile_number, unique: true + end +end diff --git a/db/migrate/20200707143222_create_site_settings.rb b/db/migrate/20200707143222_create_site_settings.rb new file mode 100644 index 00000000..1bb72b75 --- /dev/null +++ b/db/migrate/20200707143222_create_site_settings.rb @@ -0,0 +1,8 @@ +class CreateSiteSettings < ActiveRecord::Migration[6.0] + def change + create_table :site_settings do |t| + t.string 'name' + t.timestamps + end + end +end diff --git a/db/migrate/20200707213621_create_active_storage_tables.active_storage.rb b/db/migrate/20200707213621_create_active_storage_tables.active_storage.rb new file mode 100644 index 00000000..0b2ce257 --- /dev/null +++ b/db/migrate/20200707213621_create_active_storage_tables.active_storage.rb @@ -0,0 +1,27 @@ +# This migration comes from active_storage (originally 20170806125915) +class CreateActiveStorageTables < ActiveRecord::Migration[5.2] + def change + create_table :active_storage_blobs do |t| + t.string :key, null: false + t.string :filename, null: false + t.string :content_type + t.text :metadata + t.bigint :byte_size, null: false + t.string :checksum, null: false + t.datetime :created_at, null: false + + t.index [ :key ], unique: true + end + + create_table :active_storage_attachments do |t| + t.string :name, null: false + t.references :record, null: false, polymorphic: true, index: false + t.references :blob, null: false + + t.datetime :created_at, null: false + + t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true + t.foreign_key :active_storage_blobs, column: :blob_id + end + end +end diff --git a/db/migrate/20200710154824_create_images.rb b/db/migrate/20200710154824_create_images.rb new file mode 100644 index 00000000..249cc7da --- /dev/null +++ b/db/migrate/20200710154824_create_images.rb @@ -0,0 +1,7 @@ +class CreateImages < ActiveRecord::Migration[6.0] + def change + create_table :images do |t| + t.timestamps + end + end +end diff --git a/db/migrate/20200710164350_add_site_setting_to_images.rb b/db/migrate/20200710164350_add_site_setting_to_images.rb new file mode 100644 index 00000000..47561231 --- /dev/null +++ b/db/migrate/20200710164350_add_site_setting_to_images.rb @@ -0,0 +1,5 @@ +class AddSiteSettingToImages < ActiveRecord::Migration[6.0] + def change + add_reference :images, :site_settings, index: true, foreign_key: true + end +end diff --git a/db/migrate/20200710172452_add_name_to_image.rb b/db/migrate/20200710172452_add_name_to_image.rb new file mode 100644 index 00000000..0be9f3c8 --- /dev/null +++ b/db/migrate/20200710172452_add_name_to_image.rb @@ -0,0 +1,5 @@ +class AddNameToImage < ActiveRecord::Migration[6.0] + def change + add_column :images, :name, :string + end +end diff --git a/db/migrate/20200710184312_update_image_references.rb b/db/migrate/20200710184312_update_image_references.rb new file mode 100644 index 00000000..916a71d5 --- /dev/null +++ b/db/migrate/20200710184312_update_image_references.rb @@ -0,0 +1,6 @@ +class UpdateImageReferences < ActiveRecord::Migration[6.0] + def change + remove_reference :images, :site_settings + add_reference :images, :site_setting, index: true, foreign_key: true + end +end diff --git a/db/migrate/20200710202220_add_dimensions_to_images.rb b/db/migrate/20200710202220_add_dimensions_to_images.rb new file mode 100644 index 00000000..789e8ae0 --- /dev/null +++ b/db/migrate/20200710202220_add_dimensions_to_images.rb @@ -0,0 +1,6 @@ +class AddDimensionsToImages < ActiveRecord::Migration[6.0] + def change + add_column :images, :x_dim, :integer + add_column :images, :y_dim, :integer + end +end diff --git a/db/migrate/20200721214949_add_location_to_images.rb b/db/migrate/20200721214949_add_location_to_images.rb new file mode 100644 index 00000000..2c5fca9c --- /dev/null +++ b/db/migrate/20200721214949_add_location_to_images.rb @@ -0,0 +1,6 @@ +class AddLocationToImages < ActiveRecord::Migration[6.0] + def change + add_column :images, :x_loc, :integer, :default => 50 + add_column :images, :y_loc, :integer, :default => 50 + end +end diff --git a/db/migrate/20200722160315_add_type_link_and_description_to_images.rb b/db/migrate/20200722160315_add_type_link_and_description_to_images.rb new file mode 100644 index 00000000..0f92ccc7 --- /dev/null +++ b/db/migrate/20200722160315_add_type_link_and_description_to_images.rb @@ -0,0 +1,7 @@ +class AddTypeLinkAndDescriptionToImages < ActiveRecord::Migration[6.0] + def change + add_column :images, :image_type, :string + add_column :images, :link, :string + add_column :images, :description, :string + end +end diff --git a/db/migrate/20200722190353_add_typed_header_settings_to_site_settings.rb b/db/migrate/20200722190353_add_typed_header_settings_to_site_settings.rb new file mode 100644 index 00000000..20bbb5cf --- /dev/null +++ b/db/migrate/20200722190353_add_typed_header_settings_to_site_settings.rb @@ -0,0 +1,7 @@ +class AddTypedHeaderSettingsToSiteSettings < ActiveRecord::Migration[6.0] + def change + add_column :site_settings, :typed_header_enabled, :boolean + add_column :site_settings, :header_text, :string + add_column :site_settings, :subtitle_text, :string + end +end diff --git a/db/migrate/20201005153032_create_abouts.rb b/db/migrate/20201005153032_create_abouts.rb new file mode 100644 index 00000000..136735cd --- /dev/null +++ b/db/migrate/20201005153032_create_abouts.rb @@ -0,0 +1,9 @@ +class CreateAbouts < ActiveRecord::Migration[6.0] + def change + create_table :abouts do |t| + t.string :name + t.text :about_me + t.timestamps + end + end +end diff --git a/db/migrate/20201005153956_add_abouts_to_images.rb b/db/migrate/20201005153956_add_abouts_to_images.rb new file mode 100644 index 00000000..17e33ffa --- /dev/null +++ b/db/migrate/20201005153956_add_abouts_to_images.rb @@ -0,0 +1,5 @@ +class AddAboutsToImages < ActiveRecord::Migration[6.0] + def change + add_reference :images, :abouts, index: true, foreign_key: true + end +end diff --git a/db/migrate/20201005155552_update_about_to_image_reference.rb b/db/migrate/20201005155552_update_about_to_image_reference.rb new file mode 100644 index 00000000..c0bd378d --- /dev/null +++ b/db/migrate/20201005155552_update_about_to_image_reference.rb @@ -0,0 +1,6 @@ +class UpdateAboutToImageReference < ActiveRecord::Migration[6.0] + def change + remove_reference :images, :abouts + add_reference :images, :about, index: true, foreign_key: true + end +end diff --git a/db/migrate/20201005161221_remove_about_to_image_reference.rb b/db/migrate/20201005161221_remove_about_to_image_reference.rb new file mode 100644 index 00000000..af5a99a7 --- /dev/null +++ b/db/migrate/20201005161221_remove_about_to_image_reference.rb @@ -0,0 +1,5 @@ +class RemoveAboutToImageReference < ActiveRecord::Migration[6.0] + def change + remove_reference :images, :about + end +end diff --git a/db/migrate/20201005161305_create_profile_images.rb b/db/migrate/20201005161305_create_profile_images.rb new file mode 100644 index 00000000..3585dc2d --- /dev/null +++ b/db/migrate/20201005161305_create_profile_images.rb @@ -0,0 +1,13 @@ +class CreateProfileImages < ActiveRecord::Migration[6.0] + def change + create_table :profile_images do |t| + t.string :description + t.integer :x_loc, :default => 50 + t.integer :y_loc, :default => 50 + t.integer :x_dim + t.integer :y_dim + t.references :about, index: true, foreign_key: true + t.timestamps + end + end +end diff --git a/db/migrate/20201005163308_create_cover_images.rb b/db/migrate/20201005163308_create_cover_images.rb new file mode 100644 index 00000000..c30d8c94 --- /dev/null +++ b/db/migrate/20201005163308_create_cover_images.rb @@ -0,0 +1,14 @@ +class CreateCoverImages < ActiveRecord::Migration[6.0] + def change + create_table :cover_images do |t| + t.string :link + t.string :description + t.integer :x_loc, :default => 50 + t.integer :y_loc, :default => 50 + t.integer :x_dim + t.integer :y_dim + t.references :site_setting, index: true, foreign_key: true + t.timestamps + end + end +end \ No newline at end of file diff --git a/db/migrate/20201005163611_create_header_images.rb b/db/migrate/20201005163611_create_header_images.rb new file mode 100644 index 00000000..848f2bfe --- /dev/null +++ b/db/migrate/20201005163611_create_header_images.rb @@ -0,0 +1,13 @@ +class CreateHeaderImages < ActiveRecord::Migration[6.0] + def change + create_table :header_images do |t| + t.string :description + t.integer :x_loc, :default => 50 + t.integer :y_loc, :default => 50 + t.integer :x_dim + t.integer :y_dim + t.references :site_setting, index: true, foreign_key: true + t.timestamps + end + end +end diff --git a/db/migrate/20201005163945_drop_images_table.rb b/db/migrate/20201005163945_drop_images_table.rb new file mode 100644 index 00000000..9bc4074e --- /dev/null +++ b/db/migrate/20201005163945_drop_images_table.rb @@ -0,0 +1,16 @@ +class DropImagesTable < ActiveRecord::Migration[6.0] + def change + drop_table :images do |t| + t.string :name + t.string :link + t.string :description + t.string :image_type + t.integer :x_loc, :default => 50 + t.integer :y_loc, :default => 50 + t.integer :x_dim + t.integer :y_dim + t.references :site_setting, index: true, foreign_key: true + t.timestamps null: false + end + end +end diff --git a/db/migrate/20201007102040_remove_x_dim_and_y_dim_from_profile_images.rb b/db/migrate/20201007102040_remove_x_dim_and_y_dim_from_profile_images.rb new file mode 100644 index 00000000..2ad4e7f1 --- /dev/null +++ b/db/migrate/20201007102040_remove_x_dim_and_y_dim_from_profile_images.rb @@ -0,0 +1,6 @@ +class RemoveXDimAndYDimFromProfileImages < ActiveRecord::Migration[6.0] + def change + remove_column :profile_images, :x_dim, :integer + remove_column :profile_images, :y_dim, :integer + end +end diff --git a/db/migrate/20201007102049_remove_x_dim_and_y_dim_from_header_images.rb b/db/migrate/20201007102049_remove_x_dim_and_y_dim_from_header_images.rb new file mode 100644 index 00000000..64a06bc9 --- /dev/null +++ b/db/migrate/20201007102049_remove_x_dim_and_y_dim_from_header_images.rb @@ -0,0 +1,6 @@ +class RemoveXDimAndYDimFromHeaderImages < ActiveRecord::Migration[6.0] + def change + remove_column :header_images, :x_dim, :integer + remove_column :header_images, :y_dim, :integer + end +end diff --git a/db/migrate/20201007102057_remove_x_dim_and_y_dim_from_cover_images.rb b/db/migrate/20201007102057_remove_x_dim_and_y_dim_from_cover_images.rb new file mode 100644 index 00000000..f46ca3f8 --- /dev/null +++ b/db/migrate/20201007102057_remove_x_dim_and_y_dim_from_cover_images.rb @@ -0,0 +1,6 @@ +class RemoveXDimAndYDimFromCoverImages < ActiveRecord::Migration[6.0] + def change + remove_column :cover_images, :x_dim, :integer + remove_column :cover_images, :y_dim, :integer + end +end \ No newline at end of file diff --git a/db/migrate/20201015152536_add_linkedin_link_and_github_link_to_abouts.rb b/db/migrate/20201015152536_add_linkedin_link_and_github_link_to_abouts.rb new file mode 100644 index 00000000..2b33bd40 --- /dev/null +++ b/db/migrate/20201015152536_add_linkedin_link_and_github_link_to_abouts.rb @@ -0,0 +1,6 @@ +class AddLinkedinLinkAndGithubLinkToAbouts < ActiveRecord::Migration[6.0] + def change + add_column :abouts, :linkedin_link, :string + add_column :abouts, :github_link, :string + end +end diff --git a/db/migrate/20201016092248_create_posts.rb b/db/migrate/20201016092248_create_posts.rb new file mode 100644 index 00000000..9d9b4d7d --- /dev/null +++ b/db/migrate/20201016092248_create_posts.rb @@ -0,0 +1,12 @@ +class CreatePosts < ActiveRecord::Migration[6.0] + def change + create_table :posts do |t| + t.string :title, null: false + t.timestamp :date_published, null: false + t.string :overview, null: false + t.text :text + t.references :user, foreign_key: true, null: false + t.timestamps + end + end +end diff --git a/db/migrate/20201021101632_create_gallery_images.rb b/db/migrate/20201021101632_create_gallery_images.rb new file mode 100644 index 00000000..2077b96d --- /dev/null +++ b/db/migrate/20201021101632_create_gallery_images.rb @@ -0,0 +1,12 @@ +class CreateGalleryImages < ActiveRecord::Migration[6.0] + def change + create_table :gallery_images do |t| + t.string :description, null: false + t.timestamp :date_taken + t.decimal :latitude, precision: 10, scale: 6 + t.decimal :longitude, precision: 10, scale: 6 + t.references :user, index: true, foreign_key: true, null: false + t.timestamps + end + end +end diff --git a/db/migrate/20201023143427_remove_x_loc_and_y_loc_from_profile_images.rb b/db/migrate/20201023143427_remove_x_loc_and_y_loc_from_profile_images.rb new file mode 100644 index 00000000..1aff675c --- /dev/null +++ b/db/migrate/20201023143427_remove_x_loc_and_y_loc_from_profile_images.rb @@ -0,0 +1,6 @@ +class RemoveXLocAndYLocFromProfileImages < ActiveRecord::Migration[6.0] + def change + remove_column :profile_images, :x_loc, :integer + remove_column :profile_images, :y_loc, :integer + end +end diff --git a/db/migrate/20201023170632_add_title_to_gallery_image.rb b/db/migrate/20201023170632_add_title_to_gallery_image.rb new file mode 100644 index 00000000..2692b46e --- /dev/null +++ b/db/migrate/20201023170632_add_title_to_gallery_image.rb @@ -0,0 +1,5 @@ +class AddTitleToGalleryImage < ActiveRecord::Migration[6.0] + def change + add_column :gallery_images, :title, :string + end +end diff --git a/db/migrate/20201026103615_add_name_and_contact_email_and_location_to_abouts.rb b/db/migrate/20201026103615_add_name_and_contact_email_and_location_to_abouts.rb new file mode 100644 index 00000000..6255586d --- /dev/null +++ b/db/migrate/20201026103615_add_name_and_contact_email_and_location_to_abouts.rb @@ -0,0 +1,11 @@ +class AddNameAndContactEmailAndLocationToAbouts < ActiveRecord::Migration[6.0] + def change + rename_column :abouts, :name, :section_title + add_column :abouts, :name, :string, null: false, default: 'name' + add_column :abouts, :location, :string, null: false, default: 'location' + add_column :abouts, :contact_email, :string, null: false, default: 'admin@example.com' + change_column :abouts, :name, :string, default: nil + change_column :abouts, :location, :string, default: nil + change_column :abouts, :contact_email, :string, default: nil + end +end diff --git a/db/migrate/20201026160806_create_contact_messages.rb b/db/migrate/20201026160806_create_contact_messages.rb new file mode 100644 index 00000000..43a778f1 --- /dev/null +++ b/db/migrate/20201026160806_create_contact_messages.rb @@ -0,0 +1,11 @@ +class CreateContactMessages < ActiveRecord::Migration[6.0] + def change + create_table :contact_messages do |t| + t.string :from, null: false + t.string :email, null: false + t.string :subject, null: false + t.text :content, null: false + t.timestamps + end + end +end diff --git a/db/migrate/20201026181616_add_user_id_to_contact_messages.rb b/db/migrate/20201026181616_add_user_id_to_contact_messages.rb new file mode 100644 index 00000000..108384b7 --- /dev/null +++ b/db/migrate/20201026181616_add_user_id_to_contact_messages.rb @@ -0,0 +1,5 @@ +class AddUserIdToContactMessages < ActiveRecord::Migration[6.0] + def change + add_reference :contact_messages, :user, index: true, foreign_key: true + end +end diff --git a/db/migrate/20201027122042_create_code_snippets.rb b/db/migrate/20201027122042_create_code_snippets.rb new file mode 100644 index 00000000..683ec839 --- /dev/null +++ b/db/migrate/20201027122042_create_code_snippets.rb @@ -0,0 +1,12 @@ +class CreateCodeSnippets < ActiveRecord::Migration[6.0] + def change + create_table :code_snippets do |t| + t.string :title, null: false + t.string :overview, null: false + t.text :snippet, null: false + t.text :text + t.references :user, index: true, foreign_key: true + t.timestamps + end + end +end diff --git a/db/migrate/20201027161959_create_code_snippet_images.rb b/db/migrate/20201027161959_create_code_snippet_images.rb new file mode 100644 index 00000000..f0f979bd --- /dev/null +++ b/db/migrate/20201027161959_create_code_snippet_images.rb @@ -0,0 +1,9 @@ +class CreateCodeSnippetImages < ActiveRecord::Migration[6.0] + def change + create_table :code_snippet_images do |t| + t.string :description, null: false + t.references :code_snippet, index: true, foreign_key: true, null: false + t.timestamps + end + end +end diff --git a/db/migrate/20201027163921_add_extension_to_code_snippets.rb b/db/migrate/20201027163921_add_extension_to_code_snippets.rb new file mode 100644 index 00000000..475a822e --- /dev/null +++ b/db/migrate/20201027163921_add_extension_to_code_snippets.rb @@ -0,0 +1,5 @@ +class AddExtensionToCodeSnippets < ActiveRecord::Migration[6.0] + def change + add_column :code_snippets, :extension, :string, null: false + end +end diff --git a/db/migrate/20201029115927_create_projects.rb b/db/migrate/20201029115927_create_projects.rb new file mode 100644 index 00000000..e3dfaa24 --- /dev/null +++ b/db/migrate/20201029115927_create_projects.rb @@ -0,0 +1,13 @@ +class CreateProjects < ActiveRecord::Migration[6.0] + def change + create_table :projects do |t| + t.string :title, null: false + t.text :overview + t.timestamp :date, null: false + t.string :github_link + t.string :site_link + t.text :snippet + t.timestamps + end + end +end diff --git a/db/migrate/20201029121517_add_extension_to_projects.rb b/db/migrate/20201029121517_add_extension_to_projects.rb new file mode 100644 index 00000000..267f6943 --- /dev/null +++ b/db/migrate/20201029121517_add_extension_to_projects.rb @@ -0,0 +1,5 @@ +class AddExtensionToProjects < ActiveRecord::Migration[6.0] + def change + add_column :projects, :extension, :string + end +end diff --git a/db/migrate/20201029160140_create_project_images.rb b/db/migrate/20201029160140_create_project_images.rb new file mode 100644 index 00000000..54d3c87a --- /dev/null +++ b/db/migrate/20201029160140_create_project_images.rb @@ -0,0 +1,10 @@ +class CreateProjectImages < ActiveRecord::Migration[6.0] + def change + create_table :project_images do |t| + t.string :description, null: false, default: 'project-image' + t.string :title + t.references :project, index: true, foreign_key: true, null: false + t.timestamps + end + end +end diff --git a/db/migrate/20201029164957_add_main_project_image_to_projects.rb b/db/migrate/20201029164957_add_main_project_image_to_projects.rb new file mode 100644 index 00000000..e7769530 --- /dev/null +++ b/db/migrate/20201029164957_add_main_project_image_to_projects.rb @@ -0,0 +1,5 @@ +class AddMainProjectImageToProjects < ActiveRecord::Migration[6.0] + def change + add_reference :projects, :main_image, foreign_key: { to_table: :project_images } + end +end diff --git a/db/migrate/20201029215956_remove_main_project_image_from_projects.rb b/db/migrate/20201029215956_remove_main_project_image_from_projects.rb new file mode 100644 index 00000000..25d92885 --- /dev/null +++ b/db/migrate/20201029215956_remove_main_project_image_from_projects.rb @@ -0,0 +1,5 @@ +class RemoveMainProjectImageFromProjects < ActiveRecord::Migration[6.0] + def change + remove_reference :projects, :main_image, foreign_key: { to_table: :project_images } + end +end diff --git a/db/migrate/20201029220401_remove_snippet_and_extension_from_projects.rb b/db/migrate/20201029220401_remove_snippet_and_extension_from_projects.rb new file mode 100644 index 00000000..fd65f25b --- /dev/null +++ b/db/migrate/20201029220401_remove_snippet_and_extension_from_projects.rb @@ -0,0 +1,6 @@ +class RemoveSnippetAndExtensionFromProjects < ActiveRecord::Migration[6.0] + def change + remove_column :projects, :snippet, :text + remove_column :projects, :extension, :string + end +end diff --git a/db/migrate/20201105133838_add_order_to_project_image.rb b/db/migrate/20201105133838_add_order_to_project_image.rb new file mode 100644 index 00000000..9007a1e6 --- /dev/null +++ b/db/migrate/20201105133838_add_order_to_project_image.rb @@ -0,0 +1,5 @@ +class AddOrderToProjectImage < ActiveRecord::Migration[6.0] + def change + add_column :project_images, :order, :integer + end +end diff --git a/db/migrate/20210320153611_add_service_name_to_active_storage_blobs.active_storage.rb b/db/migrate/20210320153611_add_service_name_to_active_storage_blobs.active_storage.rb new file mode 100644 index 00000000..9967a132 --- /dev/null +++ b/db/migrate/20210320153611_add_service_name_to_active_storage_blobs.active_storage.rb @@ -0,0 +1,18 @@ +# This migration comes from active_storage (originally 20190112182829) +class AddServiceNameToActiveStorageBlobs < ActiveRecord::Migration[6.0] + def up + unless column_exists?(:active_storage_blobs, :service_name) + add_column :active_storage_blobs, :service_name, :string + + if configured_service = ActiveStorage::Blob.service.name + ActiveStorage::Blob.unscoped.update_all(service_name: configured_service) + end + + change_column :active_storage_blobs, :service_name, :string, null: false + end + end + + def down + remove_column :active_storage_blobs, :service_name + end +end diff --git a/db/migrate/20210320153612_create_active_storage_variant_records.active_storage.rb b/db/migrate/20210320153612_create_active_storage_variant_records.active_storage.rb new file mode 100644 index 00000000..a2862695 --- /dev/null +++ b/db/migrate/20210320153612_create_active_storage_variant_records.active_storage.rb @@ -0,0 +1,12 @@ +# This migration comes from active_storage (originally 20191206030411) +class CreateActiveStorageVariantRecords < ActiveRecord::Migration[6.0] + def change + create_table :active_storage_variant_records do |t| + t.belongs_to :blob, null: false, index: false + t.string :variation_digest, null: false + + t.index %i[ blob_id variation_digest ], name: "index_active_storage_variant_records_uniqueness", unique: true + t.foreign_key :active_storage_blobs, column: :blob_id + end + end +end diff --git a/db/migrate/20210404160338_create_post_sections.rb b/db/migrate/20210404160338_create_post_sections.rb new file mode 100644 index 00000000..73890150 --- /dev/null +++ b/db/migrate/20210404160338_create_post_sections.rb @@ -0,0 +1,10 @@ +class CreatePostSections < ActiveRecord::Migration[6.1] + def change + create_table :post_sections do |t| + t.text :text + t.integer :order, null: false + + t.timestamps + end + end +end diff --git a/db/migrate/20210404162559_add_default_to_post_section_order.rb b/db/migrate/20210404162559_add_default_to_post_section_order.rb new file mode 100644 index 00000000..8a77f25f --- /dev/null +++ b/db/migrate/20210404162559_add_default_to_post_section_order.rb @@ -0,0 +1,5 @@ +class AddDefaultToPostSectionOrder < ActiveRecord::Migration[6.1] + def change + change_column :post_sections, :order, :integer, null: false, default: 0 + end +end diff --git a/db/migrate/20210404163417_add_post_section_to_post.rb b/db/migrate/20210404163417_add_post_section_to_post.rb new file mode 100644 index 00000000..ff30dd8a --- /dev/null +++ b/db/migrate/20210404163417_add_post_section_to_post.rb @@ -0,0 +1,5 @@ +class AddPostSectionToPost < ActiveRecord::Migration[6.1] + def change + add_reference :post_sections, :post, index: true, foreign_key: true + end +end \ No newline at end of file diff --git a/db/migrate/20210404163732_migrate_post_text_to_post_section.rb b/db/migrate/20210404163732_migrate_post_text_to_post_section.rb new file mode 100644 index 00000000..3dc0b0b4 --- /dev/null +++ b/db/migrate/20210404163732_migrate_post_text_to_post_section.rb @@ -0,0 +1,18 @@ +class MigratePostTextToPostSection < ActiveRecord::Migration[6.1] + def up + Post.find_each do |post| + PostSection.create!(post: post, text: post.text) + end + remove_column :posts, :text + end + + def down + add_column :posts, :text, :text + Post.find_each do |post| + Post.post_sections.order(order: :asc).each do |post_section| + post.text += post_section.text + end + post.save! + end + end +end diff --git a/db/migrate/20210405132316_create_post_section_images.rb b/db/migrate/20210405132316_create_post_section_images.rb new file mode 100644 index 00000000..d2c00df3 --- /dev/null +++ b/db/migrate/20210405132316_create_post_section_images.rb @@ -0,0 +1,10 @@ +class CreatePostSectionImages < ActiveRecord::Migration[6.1] + def change + create_table :post_section_images do |t| + t.string :description, null: false, default: 'post-image' + t.string :title + t.references :post_section, index: true, foreign_key: true, null: false + t.timestamps + end + end +end diff --git a/db/migrate/20220724205659_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb b/db/migrate/20220724205659_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb new file mode 100644 index 00000000..93c8b85a --- /dev/null +++ b/db/migrate/20220724205659_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb @@ -0,0 +1,8 @@ +# This migration comes from active_storage (originally 20211119233751) +class RemoveNotNullOnActiveStorageBlobsChecksum < ActiveRecord::Migration[6.0] + def change + return unless table_exists?(:active_storage_blobs) + + change_column_null(:active_storage_blobs, :checksum, true) + end +end diff --git a/db/migrate/20220912160630_add_visible_to_blog_posts.rb b/db/migrate/20220912160630_add_visible_to_blog_posts.rb new file mode 100644 index 00000000..5ef6e09b --- /dev/null +++ b/db/migrate/20220912160630_add_visible_to_blog_posts.rb @@ -0,0 +1,5 @@ +class AddVisibleToBlogPosts < ActiveRecord::Migration[7.0] + def change + add_column :posts, :visible, :boolean, default: true, null: false + end +end diff --git a/db/migrate/20220913215432_create_ahoy_visits_and_events.rb b/db/migrate/20220913215432_create_ahoy_visits_and_events.rb new file mode 100644 index 00000000..177ea524 --- /dev/null +++ b/db/migrate/20220913215432_create_ahoy_visits_and_events.rb @@ -0,0 +1,61 @@ +class CreateAhoyVisitsAndEvents < ActiveRecord::Migration[7.0] + def change + create_table :ahoy_visits do |t| + t.string :visit_token + t.string :visitor_token + + # the rest are recommended but optional + # simply remove any you don't want + + # user + t.references :user + + # standard + t.string :ip + t.text :user_agent + t.text :referrer + t.string :referring_domain + t.text :landing_page + + # technology + t.string :browser + t.string :os + t.string :device_type + + # location + t.string :country + t.string :region + t.string :city + t.float :latitude + t.float :longitude + + # utm parameters + t.string :utm_source + t.string :utm_medium + t.string :utm_term + t.string :utm_content + t.string :utm_campaign + + # native apps + t.string :app_version + t.string :os_version + t.string :platform + + t.datetime :started_at + end + + add_index :ahoy_visits, :visit_token, unique: true + + create_table :ahoy_events do |t| + t.references :visit + t.references :user + + t.string :name + t.jsonb :properties + t.datetime :time + end + + add_index :ahoy_events, [:name, :time] + add_index :ahoy_events, :properties, using: :gin, opclass: :jsonb_path_ops + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 00000000..c8853a98 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,260 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# This file is the source Rails uses to define your schema when running `bin/rails +# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema[7.1].define(version: 2022_09_13_215432) do + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "abouts", force: :cascade do |t| + t.string "section_title" + t.text "about_me" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "linkedin_link" + t.string "github_link" + t.string "name", null: false + t.string "location", null: false + t.string "contact_email", null: false + end + + create_table "active_storage_attachments", force: :cascade do |t| + t.string "name", null: false + t.string "record_type", null: false + t.bigint "record_id", null: false + t.bigint "blob_id", null: false + t.datetime "created_at", precision: nil, null: false + t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id" + t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true + end + + create_table "active_storage_blobs", force: :cascade do |t| + t.string "key", null: false + t.string "filename", null: false + t.string "content_type" + t.text "metadata" + t.bigint "byte_size", null: false + t.string "checksum" + t.datetime "created_at", precision: nil, null: false + t.string "service_name", null: false + t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true + end + + create_table "active_storage_variant_records", force: :cascade do |t| + t.bigint "blob_id", null: false + t.string "variation_digest", null: false + t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true + end + + create_table "ahoy_events", force: :cascade do |t| + t.bigint "visit_id" + t.bigint "user_id" + t.string "name" + t.jsonb "properties" + t.datetime "time" + t.index ["name", "time"], name: "index_ahoy_events_on_name_and_time" + t.index ["properties"], name: "index_ahoy_events_on_properties", opclass: :jsonb_path_ops, using: :gin + t.index ["user_id"], name: "index_ahoy_events_on_user_id" + t.index ["visit_id"], name: "index_ahoy_events_on_visit_id" + end + + create_table "ahoy_visits", force: :cascade do |t| + t.string "visit_token" + t.string "visitor_token" + t.bigint "user_id" + t.string "ip" + t.text "user_agent" + t.text "referrer" + t.string "referring_domain" + t.text "landing_page" + t.string "browser" + t.string "os" + t.string "device_type" + t.string "country" + t.string "region" + t.string "city" + t.float "latitude" + t.float "longitude" + t.string "utm_source" + t.string "utm_medium" + t.string "utm_term" + t.string "utm_content" + t.string "utm_campaign" + t.string "app_version" + t.string "os_version" + t.string "platform" + t.datetime "started_at" + t.index ["user_id"], name: "index_ahoy_visits_on_user_id" + t.index ["visit_token"], name: "index_ahoy_visits_on_visit_token", unique: true + end + + create_table "code_snippet_images", force: :cascade do |t| + t.string "description", null: false + t.bigint "code_snippet_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["code_snippet_id"], name: "index_code_snippet_images_on_code_snippet_id" + end + + create_table "code_snippets", force: :cascade do |t| + t.string "title", null: false + t.string "overview", null: false + t.text "snippet", null: false + t.text "text" + t.bigint "user_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "extension", null: false + t.index ["user_id"], name: "index_code_snippets_on_user_id" + end + + create_table "contact_messages", force: :cascade do |t| + t.string "from", null: false + t.string "email", null: false + t.string "subject", null: false + t.text "content", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.bigint "user_id" + t.index ["user_id"], name: "index_contact_messages_on_user_id" + end + + create_table "cover_images", force: :cascade do |t| + t.string "link" + t.string "description" + t.integer "x_loc", default: 50 + t.integer "y_loc", default: 50 + t.bigint "site_setting_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["site_setting_id"], name: "index_cover_images_on_site_setting_id" + end + + create_table "gallery_images", force: :cascade do |t| + t.string "description", null: false + t.datetime "date_taken", precision: nil + t.decimal "latitude", precision: 10, scale: 6 + t.decimal "longitude", precision: 10, scale: 6 + t.bigint "user_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "title" + t.index ["user_id"], name: "index_gallery_images_on_user_id" + end + + create_table "header_images", force: :cascade do |t| + t.string "description" + t.integer "x_loc", default: 50 + t.integer "y_loc", default: 50 + t.bigint "site_setting_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["site_setting_id"], name: "index_header_images_on_site_setting_id" + end + + create_table "post_section_images", force: :cascade do |t| + t.string "description", default: "post-image", null: false + t.string "title" + t.bigint "post_section_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["post_section_id"], name: "index_post_section_images_on_post_section_id" + end + + create_table "post_sections", force: :cascade do |t| + t.text "text" + t.integer "order", default: 0, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.bigint "post_id" + t.index ["post_id"], name: "index_post_sections_on_post_id" + end + + create_table "posts", force: :cascade do |t| + t.string "title", null: false + t.datetime "date_published", precision: nil, null: false + t.string "overview", null: false + t.bigint "user_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "visible", default: true, null: false + t.index ["user_id"], name: "index_posts_on_user_id" + end + + create_table "profile_images", force: :cascade do |t| + t.string "description" + t.bigint "about_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["about_id"], name: "index_profile_images_on_about_id" + end + + create_table "project_images", force: :cascade do |t| + t.string "description", default: "project-image", null: false + t.string "title" + t.bigint "project_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "order" + t.index ["project_id"], name: "index_project_images_on_project_id" + end + + create_table "projects", force: :cascade do |t| + t.string "title", null: false + t.text "overview" + t.datetime "date", precision: nil, null: false + t.string "github_link" + t.string "site_link" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "site_settings", force: :cascade do |t| + t.string "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "typed_header_enabled" + t.string "header_text" + t.string "subtitle_text" + end + + create_table "users", force: :cascade do |t| + t.text "email" + t.text "username" + t.text "password_digest" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.text "mobile_number" + t.string "password_reset_token" + t.datetime "password_reset_expiry", precision: nil + t.string "last_login_ip" + t.datetime "last_login_time", precision: nil + t.string "current_login_ip" + t.datetime "current_login_time", precision: nil + t.index ["email"], name: "index_users_on_email", unique: true + t.index ["mobile_number"], name: "index_users_on_mobile_number", unique: true + t.index ["username"], name: "index_users_on_username", unique: true + end + + add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" + add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" + add_foreign_key "code_snippet_images", "code_snippets" + add_foreign_key "code_snippets", "users" + add_foreign_key "contact_messages", "users" + add_foreign_key "cover_images", "site_settings" + add_foreign_key "gallery_images", "users" + add_foreign_key "header_images", "site_settings" + add_foreign_key "post_section_images", "post_sections" + add_foreign_key "post_sections", "posts" + add_foreign_key "posts", "users" + add_foreign_key "profile_images", "abouts" + add_foreign_key "project_images", "projects" +end diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2ac..fa4ff36b 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,7 +1,50 @@ -# This file should contain all the record creation needed to seed the database with its default values. -# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). -# -# Examples: -# -# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) -# Character.create(name: 'Luke', movie: movies.first) +User.create( + username: ENV['ADMIN_USERNAME'], + email: ENV['ADMIN_EMAIL'], + password: ENV['ADMIN_PASSWORD'], + mobile_number: ENV['ADMIN_MOBILE_NUMBER']) + +site_settings = SiteSetting.create( + name: 'home-server', + typed_header_enabled: true, + header_text: 'Welcome to your...', + subtitle_text: 'home-server') + +HeaderImage.create( + site_setting: site_settings, + description: 'Header image') + +CoverImage.create( + site_setting: site_settings, + link: '/about', + description: 'ABOUT') + +CoverImage.create( + site_setting: site_settings, + link: '/projects', + description: 'PROJECTS') + +CoverImage.create( + site_setting: site_settings, + link: '/blog', + description: 'BLOG') + +CoverImage.create( + site_setting: site_settings, + link: '/code-snippets', + description: 'CODE SNIPPETS') + +CoverImage.create( + site_setting: site_settings, + link: '/gallery', + description: 'GALLERY') + +CoverImage.create( + site_setting: site_settings, + link: '/contact', + description: 'CONTACT') + +About.create(section_title: 'About me', + name: 'admin', + location: 'London, UK', + contact_email: 'admin@example.com') \ No newline at end of file diff --git a/infrastructure/tasks b/infrastructure/tasks new file mode 100755 index 00000000..09d35d8c --- /dev/null +++ b/infrastructure/tasks @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +set -euo pipefail + +terraform_version=1.5 + +user_id="$(id -u)" +group_id="$(id -g)" + +remote_state_aws_profile="${REMOTE_STATE_AWS_PROFILE:-default}" +remote_state_bucket_region="${REMOTE_STATE_BUCKET_REGION:-eu-west-2}" +remote_state_bucket="${REMOTE_STATE_BUCKET:-cpcwood-terraform-remote-state}" +remote_state_lock_table="${REMOTE_STATE_LOCK_TABLE:-cpcwood-terraform-remote-state-lock-table}" +remote_state_key="${REMOTE_STATE_KEY:-home-server/production/terraform.tfstate}" + +function tf { + docker run -it --rm \ + --workdir /opt \ + -v ./terraform/:/opt \ + -v ~/.aws:/.aws \ + -e AWS_CONFIG_FILE=/.aws/config \ + -e AWS_SHARED_CREDENTIALS_FILE=/.aws/credentials \ + --user "$user_id:$group_id" \ + "hashicorp/terraform:$terraform_version" "$@" +} + +function init { + tf init \ + -backend-config "region=$remote_state_bucket_region" \ + -backend-config "bucket=$remote_state_bucket" \ + -backend-config "dynamodb_table=$remote_state_lock_table" \ + -backend-config "profile=$remote_state_aws_profile" \ + -backend-config "key=$remote_state_key" \ + "$@" +} + +function plan { + tf plan "$@" +} + +function apply { + tf apply "$@" +} + +function plan-ci { + tf plan -out=.terraform.plan.cache + tf show -json .terraform.plan.cache > plan.json +} + +function apply-ci { + tf apply -input=false .terraform.plan.cache +} + +function sh { + docker run -it --rm \ + --workdir /opt \ + -v ./terraform/:/opt \ + -v ~/.aws:/.aws \ + -e AWS_CONFIG_FILE=/.aws/config \ + -e AWS_SHARED_CREDENTIALS_FILE=/.aws/credentials \ + --user "$user_id:$group_id" \ + --entrypoint=/bin/sh \ + "hashicorp/terraform:$terraform_version" +} + +if [[ ! $(type -t "$1") == function ]]; then + echo "Invalid command entered" + exit 1 +fi + +TIMEFORMAT="Task completed in %3lR" +time "${@:-default}" diff --git a/infrastructure/terraform/application_storage_s3.tf b/infrastructure/terraform/application_storage_s3.tf new file mode 100644 index 00000000..3454cc08 --- /dev/null +++ b/infrastructure/terraform/application_storage_s3.tf @@ -0,0 +1,7 @@ +resource "random_id" "application_storage_s3" { + byte_length = 6 +} + +resource "aws_s3_bucket" "application_storage_s3" { + bucket = "${var.application_storage_s3_bucket_name}-${var.environment}-${random_id.application_storage_s3.hex}" +} diff --git a/infrastructure/terraform/main.tf b/infrastructure/terraform/main.tf new file mode 100644 index 00000000..833af599 --- /dev/null +++ b/infrastructure/terraform/main.tf @@ -0,0 +1,19 @@ +terraform { + required_version = "~> 1.5" + + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 5.5" + } + } + + backend "s3" { + encrypt = true + } +} + +provider "aws" { + region = var.aws_region + profile = var.aws_profile +} diff --git a/infrastructure/terraform/outputs.tf b/infrastructure/terraform/outputs.tf new file mode 100644 index 00000000..d8c150da --- /dev/null +++ b/infrastructure/terraform/outputs.tf @@ -0,0 +1,3 @@ +output "application_storage_s3_bucket_id" { + value = aws_s3_bucket.application_storage_s3.id +} diff --git a/infrastructure/terraform/variables.tf b/infrastructure/terraform/variables.tf new file mode 100644 index 00000000..9a78f8ef --- /dev/null +++ b/infrastructure/terraform/variables.tf @@ -0,0 +1,17 @@ +variable "environment" { + default = "production" +} + +variable "aws_profile" { + description = "AWS profile to access AWS API" + default = "default" +} + +variable "aws_region" { + description = "AWS region to deploy to" + default = "eu-west-2" +} + +variable "application_storage_s3_bucket_name" { + default = "home-server-application-storage" +} diff --git a/lib/tasks/auto_annotate_models.rake b/lib/tasks/auto_annotate_models.rake new file mode 100644 index 00000000..fd2b0120 --- /dev/null +++ b/lib/tasks/auto_annotate_models.rake @@ -0,0 +1,58 @@ +# NOTE: only doing this in development as some production environments (Heroku) +# NOTE: are sensitive to local FS writes, and besides -- it's just not proper +# NOTE: to have a dev-mode tool do its thing in production. +if Rails.env.development? + require 'annotate' + task set_annotation_options: :environment do + # You can override any of these by setting an environment variable of the + # same name. + Annotate.set_defaults( + 'active_admin' => 'false', + 'additional_file_patterns' => [], + 'routes' => 'false', + 'models' => 'true', + 'position_in_routes' => 'before', + 'position_in_class' => 'before', + 'position_in_test' => 'before', + 'position_in_fixture' => 'before', + 'position_in_factory' => 'before', + 'position_in_serializer' => 'before', + 'show_foreign_keys' => 'true', + 'show_complete_foreign_keys' => 'false', + 'show_indexes' => 'true', + 'simple_indexes' => 'false', + 'model_dir' => 'app/models', + 'root_dir' => '', + 'include_version' => 'false', + 'require' => '', + 'exclude_tests' => 'false', + 'exclude_fixtures' => 'false', + 'exclude_factories' => 'false', + 'exclude_serializers' => 'false', + 'exclude_scaffolds' => 'true', + 'exclude_controllers' => 'true', + 'exclude_helpers' => 'true', + 'exclude_sti_subclasses' => 'false', + 'ignore_model_sub_dir' => 'false', + 'ignore_columns' => nil, + 'ignore_routes' => nil, + 'ignore_unknown_models' => 'false', + 'hide_limit_column_types' => 'integer,bigint,boolean', + 'hide_default_column_types' => 'json,jsonb,hstore', + 'skip_on_db_migrate' => 'false', + 'format_bare' => 'true', + 'format_rdoc' => 'false', + 'format_yard' => 'false', + 'format_markdown' => 'false', + 'sort' => 'false', + 'force' => 'false', + 'frozen' => 'false', + 'classified_sort' => 'true', + 'trace' => 'false', + 'wrapper_open' => nil, + 'wrapper_close' => nil, + 'with_comment' => 'true') + end + + Annotate.load_tasks +end diff --git a/lib/tasks/db_exists.rake b/lib/tasks/db_exists.rake new file mode 100644 index 00000000..42a1929b --- /dev/null +++ b/lib/tasks/db_exists.rake @@ -0,0 +1,11 @@ +namespace :db do + desc 'Checks to see if the database exists' + task exists: :environment do + Rake::Task['environment'].invoke + ActiveRecord::Base.connection + rescue StandardError + exit 1 + else + exit 0 + end +end \ No newline at end of file diff --git a/package.json b/package.json index 23de1290..6d7f5f75 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,100 @@ { "name": "home_server", "private": true, + "scripts": { + "test": "NODE_ENV=test jest --no-cache", + "lint": "eslint --fix . && stylelint --fix \"**/*.scss\"" + }, "dependencies": { - "@rails/actioncable": "^6.0.0", - "@rails/activestorage": "^6.0.0", - "@rails/ujs": "^6.0.0", - "@rails/webpacker": "4.2.2", - "turbolinks": "^5.2.0" + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@babel/plugin-transform-modules-commonjs": "^7.20.0", + "@babel/plugin-transform-runtime": "^7.19.0", + "@babel/preset-env": "^7.20.0", + "@babel/runtime": "^7.20.0", + "@hotwired/stimulus": "3.2.2", + "@hotwired/stimulus-webpack-helpers": "^1.0.1", + "@hotwired/turbo-rails": "^7.2.0", + "babel-loader": "^8.2.0", + "babel-plugin-macros": "^3.1.0", + "carbon-now-cli": "1.4.0", + "compression-webpack-plugin": "^9.2.0", + "core-js": "^3.27.0", + "css-loader": "^6.7.0", + "css-minimizer-webpack-plugin": "^4.2.0", + "file-loader": "^6.2.0", + "js-cookie": "3.0.1", + "justified-layout": "4.1.0", + "mini-css-extract-plugin": "^2.7.0", + "postcss": "^8.4.0", + "rails-erb-loader": "5.5.2", + "resolve-url-loader": "5.0.0", + "sass": "1.57.1", + "sass-loader": "10.4.1", + "shakapacker": "6.6.0", + "simplelightbox": "2.11.0", + "style-loader": "^3.3.0", + "terser-webpack-plugin": "^5.3.0", + "typed.js": "2.0.12", + "webpack": "^5.76", + "webpack-assets-manifest": "^5.1.0", + "webpack-cli": "^4.0.0", + "webpack-dev-server": "^4.11.0", + "webpack-merge": "^5.0.0" }, - "version": "0.1.0", + "version": "1.0.0", "devDependencies": { - "webpack-dev-server": "^3.10.3" - } + "@babel/eslint-parser": "^7.19.1", + "@testing-library/dom": "^8.19.1", + "babel-plugin-dynamic-import-node": "^2.3.3", + "eslint": "^8.31.0", + "eslint-config-standard": "^17.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-n": "^15.6.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.0", + "eslint-plugin-standard": "^5.0.0", + "html-loader-jest": "^0.2.1", + "jest": "^29.3.1", + "jest-environment-jsdom": "^29.3.1", + "jest-erb-transformer": "^1.2.10", + "stylelint": "^15.10.1", + "stylelint-config-sass-guidelines": "^9.0.1", + "stylelint-config-standard": "^29.0.0" + }, + "jest": { + "testRegex": ".*_spec.js", + "roots": [ + "", + "/spec/javascript" + ], + "moduleFileExtensions": [ + "js", + "js.erb", + "erb" + ], + "moduleDirectories": [ + "node_modules", + "/app/frontend/packs" + ], + "moduleNameMapper": { + "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/spec/javascript/__mocks__/fileMock.js", + "\\.(css|less)$": "/spec/javascript/__mocks__/styleMock.js" + }, + "transform": { + "^.+\\.js$": "babel-jest", + "^.+\\.erb$": [ + "jest-erb-transformer", + { + "application": "rails", + "timeout": 20000, + "babelConfig": true + } + ] + } + }, + "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610" } diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png deleted file mode 100644 index e69de29b..00000000 diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index e69de29b..00000000 diff --git a/public/robots.txt b/public/robots.txt index c19f78ab..240192b7 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1 +1,8 @@ -# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file +User-agent: * +Disallow: /admin +Disallow: /admin/ +Disallow: /login +Disallow: /2fa +Disallow: /forgotten-password +Disallow: /reset-password +Sitemap: https://cpcwood.com/sitemap.xml \ No newline at end of file diff --git a/public/sitemap.xml.gz b/public/sitemap.xml.gz new file mode 100644 index 00000000..d8e0ffcf Binary files /dev/null and b/public/sitemap.xml.gz differ diff --git a/scripts/circle-ci/circle-ci-auto-merge b/scripts/circle-ci/circle-ci-auto-merge new file mode 100755 index 00000000..02b6a309 --- /dev/null +++ b/scripts/circle-ci/circle-ci-auto-merge @@ -0,0 +1,53 @@ +#!/bin/bash -e +# CircleCI Automerge GitHub Pull Request Script + +# Ensure in PR +if [ -z "$CIRCLE_PULL_REQUEST" ]; then + >&2 echo 'Not in pull request, skipping automerge' + exit 1 +fi + +# Ensure all required environment variables are present +if [ -z "$CIRCLE_PROJECT_REPONAME" ] || \ + [ -z "$CIRCLE_PROJECT_USERNAME" ] || \ + [ -z "$CIRCLE_PULL_REQUEST" ] || \ + [ -z "$CIRCLE_BRANCH" ] || \ + [ -z "$CIRCLE_SHA1" ] || \ + [ -z "$GITHUB_SECRET_TOKEN" ]; then + >&2 echo 'Required variable unset, automerging failed' + exit 1 +fi + +# Extract GitHub PR number +github_pr_number="$(echo "$CIRCLE_PULL_REQUEST" | sed -n 's/^.*\/\([0-9]\+\)$/\1/p')" +if [ -z "$github_pr_number" ]; then + >&2 echo 'GitHub PR number not found' + exit 1 +fi + +# Fetch target branch name +curl -L "https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64" -o jq +chmod +x jq +url="https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/pulls/$github_pr_number" +target_branch=$(curl -H "Authorization: $GITHUB_SECRET_TOKEN" "$url" | ./jq '.base.ref' | tr -d '"') +if [ -z "$target_branch" ]; then + >&2 echo 'Failed to fetch GitHub PR target branch' + exit 1 +fi + +echo : " +CircleCI Automerge Pull Request +Repo: $CIRCLE_PROJECT_REPONAME +Pull Request: $github_pr_number +Merging: $CIRCLE_BRANCH >> $target_branch +" + +# Merge PR via GitHub API +curl \ + --fail-with-body \ + --request PUT \ + --header "Accept: application/vnd.github+json" \ + --header "Authorization: Bearer $GITHUB_SECRET_TOKEN" \ + --header "X-GitHub-Api-Version: 2022-11-28" \ + --data '{"commit_title":"CircleCI automerge '"$CIRCLE_BRANCH >> $target_branch"'", "sha": "'"$CIRCLE_SHA1"'"}' \ + "https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/pulls/$github_pr_number/merge" diff --git a/scripts/kube/sidekiq_quiet.sh b/scripts/kube/sidekiq_quiet.sh new file mode 100755 index 00000000..70c5eb63 --- /dev/null +++ b/scripts/kube/sidekiq_quiet.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# Find Pid +SIDEKIQ_PID=$(ps aux | grep sidekiq | grep busy | awk '{ print $2 }') +# Send TSTP signal +kill -SIGTSTP $SIDEKIQ_PID \ No newline at end of file diff --git a/shared/log/.gitkeep b/shared/log/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/test/controllers/.keep b/shared/log/.keep similarity index 100% rename from test/controllers/.keep rename to shared/log/.keep diff --git a/shared/pids/.gitkeep b/shared/pids/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/test/fixtures/.keep b/shared/pids/.keep similarity index 100% rename from test/fixtures/.keep rename to shared/pids/.keep diff --git a/shared/sockets/.gitkeep b/shared/sockets/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/test/fixtures/files/.keep b/shared/sockets/.keep similarity index 100% rename from test/fixtures/files/.keep rename to shared/sockets/.keep diff --git a/spec/factories/about.rb b/spec/factories/about.rb new file mode 100644 index 00000000..aa1afd50 --- /dev/null +++ b/spec/factories/about.rb @@ -0,0 +1,11 @@ +FactoryBot.define do + factory :about, class: 'About' do + section_title { 'about me' } + about_me { 'test about me' } + linkedin_link { 'https://linkedin.com' } + github_link { 'https://github.com' } + name { 'test name' } + location { 'london' } + contact_email { 'admin@example.com' } + end +end \ No newline at end of file diff --git a/spec/factories/code_snippets.rb b/spec/factories/code_snippets.rb new file mode 100644 index 00000000..fcb495a7 --- /dev/null +++ b/spec/factories/code_snippets.rb @@ -0,0 +1,32 @@ +# == Schema Information +# +# Table name: code_snippets +# +# id :bigint not null, primary key +# extension :string not null +# overview :string not null +# snippet :text not null +# text :text +# title :string not null +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint +# +# Indexes +# +# index_code_snippets_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# +FactoryBot.define do + factory :code_snippet do + title { 'a code snippet' } + overview { 'snippet overview' } + snippet { "const codeSnippet = () => console.log('code snippet');" } + text { 'some explaination for the snippet' } + extension { 'js' } + user + end +end diff --git a/spec/factories/contact_messages.rb b/spec/factories/contact_messages.rb new file mode 100644 index 00000000..32e41cb1 --- /dev/null +++ b/spec/factories/contact_messages.rb @@ -0,0 +1,30 @@ +# == Schema Information +# +# Table name: contact_messages +# +# id :bigint not null, primary key +# content :text not null +# email :string not null +# from :string not null +# subject :string not null +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint +# +# Indexes +# +# index_contact_messages_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# +FactoryBot.define do + factory :contact_message do + from { 'another user' } + email { 'user@example.com' } + subject { 'new contact message' } + content { 'message content ' } + user + end +end diff --git a/spec/factories/images.rb b/spec/factories/images.rb new file mode 100644 index 00000000..b8b48432 --- /dev/null +++ b/spec/factories/images.rb @@ -0,0 +1,51 @@ +FactoryBot.define do + factory :image, class: 'Image' do + description { 'image_description' } + + factory :site_image, class: 'SiteImage' do + x_loc { 50 } + y_loc { 50 } + site_setting + + factory :header_image, class: 'HeaderImage' do + description { 'header_image' } + end + + factory :cover_image, class: 'CoverImage' do + description { 'cover_image' } + link { 'http://example.com' } + end + end + + factory :profile_image, class: 'ProfileImage' do + description { 'profile_image' } + about + end + + factory :code_snippet_image, class: 'CodeSnippetImage' do + description { 'code_snippet_image' } + code_snippet + end + + factory :gallery_image, class: 'GalleryImage' do + description { 'gallery_image' } + title { 'a nice picture' } + date_taken { DateTime.new(2020, 04, 19, 0, 0, 0) } + latitude { 51.510357 } + longitude { -0.116773 } + user + end + + factory :project_image, class: 'ProjectImage' do + description { 'project_image' } + title { 'project image' } + project + end + + factory :post_section_image, class: 'PostSectionImage' do + description { 'post_section_image_description' } + title { 'post section image title' } + post_section + end + end +end \ No newline at end of file diff --git a/spec/factories/post_sections.rb b/spec/factories/post_sections.rb new file mode 100644 index 00000000..14bee582 --- /dev/null +++ b/spec/factories/post_sections.rb @@ -0,0 +1,26 @@ +# == Schema Information +# +# Table name: post_sections +# +# id :bigint not null, primary key +# order :integer default(0), not null +# text :text +# created_at :datetime not null +# updated_at :datetime not null +# post_id :bigint +# +# Indexes +# +# index_post_sections_on_post_id (post_id) +# +# Foreign Keys +# +# fk_rails_... (post_id => posts.id) +# +FactoryBot.define do + factory :post_section do + text { 'MyText' } + order { 1 } + post + end +end diff --git a/spec/factories/posts.rb b/spec/factories/posts.rb new file mode 100644 index 00000000..d9978b6b --- /dev/null +++ b/spec/factories/posts.rb @@ -0,0 +1,30 @@ +# == Schema Information +# +# Table name: posts +# +# id :bigint not null, primary key +# date_published :datetime not null +# overview :string not null +# title :string not null +# visible :boolean default(TRUE), not null +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint not null +# +# Indexes +# +# index_posts_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# +FactoryBot.define do + factory :post do + date_published { DateTime.new(2020, 04, 19, 0, 0, 0) } + overview { 'test blog post overview' } + title { 'test blog post title' } + visible { true } + user + end +end diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb new file mode 100644 index 00000000..35f33bbb --- /dev/null +++ b/spec/factories/projects.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: projects +# +# id :bigint not null, primary key +# date :datetime not null +# github_link :string +# overview :text +# site_link :string +# title :string not null +# created_at :datetime not null +# updated_at :datetime not null +# +FactoryBot.define do + factory :project do + title { 'MyString' } + overview { 'MyText' } + date { '2020-10-29 11:59:27' } + github_link { 'https://github.com/' } + site_link { 'https://example.com/' } + end +end diff --git a/spec/factories/site_settings.rb b/spec/factories/site_settings.rb new file mode 100644 index 00000000..b8013467 --- /dev/null +++ b/spec/factories/site_settings.rb @@ -0,0 +1,29 @@ +# == Schema Information +# +# Table name: site_settings +# +# id :bigint not null, primary key +# header_text :string +# name :string +# subtitle_text :string +# typed_header_enabled :boolean +# created_at :datetime not null +# updated_at :datetime not null +# +FactoryBot.define do + factory :site_setting, class: 'SiteSetting' do + name { 'site name' } + typed_header_enabled { 0 } + header_text { 'test header text' } + subtitle_text { 'test subtitle text' } + + factory :site_setting_with_images do + header_image { create(:header_image) } + cover_images do + [ + create(:cover_image) + ] + end + end + end +end diff --git a/spec/factories/users.rb b/spec/factories/users.rb new file mode 100644 index 00000000..56e5dd77 --- /dev/null +++ b/spec/factories/users.rb @@ -0,0 +1,39 @@ +# == Schema Information +# +# Table name: users +# +# id :bigint not null, primary key +# current_login_ip :string +# current_login_time :datetime +# email :text +# last_login_ip :string +# last_login_time :datetime +# mobile_number :text +# password_digest :text +# password_reset_expiry :datetime +# password_reset_token :string +# username :text +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_users_on_email (email) UNIQUE +# index_users_on_mobile_number (mobile_number) UNIQUE +# index_users_on_username (username) UNIQUE +# +FactoryBot.define do + factory :user, class: 'User' do + email { 'test@example.com' } + username { 'test' } + password { 'Securepass1' } + mobile_number { '+447123456789' } + end + + factory :user2, class: 'User' do + email { 'test2@example.com' } + username { 'test2' } + password { 'Securepass2' } + mobile_number { '+447234567891' } + end +end diff --git a/spec/feature/about_feature_spec.rb b/spec/feature/about_feature_spec.rb new file mode 100644 index 00000000..e88fc463 --- /dev/null +++ b/spec/feature/about_feature_spec.rb @@ -0,0 +1,45 @@ +feature 'Admin update about section', feature: true do + before(:each) do + seed_user_and_settings + seed_about + end + + context 'public user' do + scenario 'view about' do + visit('/') + click_on('ABOUT') + expect(page).to have_current_path('/about') + expect(page).not_to have_button('Admin Edit') + expect(page).to have_content(@about.section_title) + expect(page).to have_content(@about.about_me) + end + end + + context 'admin user' do + scenario 'Update about settings' do + login_feature + visit('/about') + click_on('Edit') + fill_in('about[section_title]', with: 'new section name') + fill_in('about[name]', with: 'new about name') + fill_in('about[location]', with: 'new about location') + fill_in('about[contact_email]', with: 'new@example.com') + fill_in('about[about_me]', with: "#new about me text in markdown\n + ```ruby + def some(code) + ```") + find_field('about[profile_image_attributes][image_file]').set(Rails.root.join('spec/files/sample_image.jpg')) + click_button('Update About') + expect(page).to have_content('Section title updated!') + expect(page).to have_content('About me updated!') + expect(page).to have_content('Name updated!') + expect(page).to have_content('Location updated!') + expect(page).to have_content('Contact email updated!') + click_on('Return') + expect(page).to have_content('new section name') + expect(page.html).to match('

    new about me text in markdown

    ') + expect(page).to have_selector('code') + expect(page).to have_selector('img.profile-image') + end + end +end diff --git a/spec/feature/admin_login_logout_spec.rb b/spec/feature/admin_login_logout_spec.rb new file mode 100644 index 00000000..433d9114 --- /dev/null +++ b/spec/feature/admin_login_logout_spec.rb @@ -0,0 +1,12 @@ +feature 'Admin login logout', feature: true do + before(:each) do + seed_user_and_settings + end + + scenario 'Admin can login and logout' do + login_feature + expect(page).to have_content("#{@user.username} welcome back to your home-server!") + page.find(:css, '#logout-button').click + expect(current_path).to eq '/' + end +end \ No newline at end of file diff --git a/spec/feature/admin_update_details_spec.rb b/spec/feature/admin_update_details_spec.rb new file mode 100644 index 00000000..7229e5f0 --- /dev/null +++ b/spec/feature/admin_update_details_spec.rb @@ -0,0 +1,51 @@ +feature 'Admin update details', feature: true do + before(:each) do + seed_user_and_settings + login_feature + visit('admin') + click_on('User Settings') + end + + scenario 'Update username' do + new_username = 'new username' + fill_in('username[username]', with: new_username) + fill_in('username[username_confirmation]', with: new_username) + fill_in('current_password[password]', with: @user_password) + click_button('Update details') + expect(page).to have_content('Username updated!') + @user.reload + expect(@user.username).to eq(new_username) + end + + scenario 'Update email' do + new_email = 'new@example.com' + fill_in('email[email]', with: new_email) + fill_in('email[email_confirmation]', with: new_email) + fill_in('current_password[password]', with: @user_password) + click_button('Update details') + expect(page).to have_content('Email address updated!') + @user.reload + expect(@user.email).to eq(new_email) + end + + scenario 'Update password' do + new_password = 'newpassword' + fill_in('password[password]', with: new_password) + fill_in('password[password_confirmation]', with: new_password) + fill_in('current_password[password]', with: @user_password) + click_button('Update details') + expect(page).to have_content('Password updated!') + @user.reload + expect(@user.authenticate(new_password)).to eq(@user) + end + + scenario 'Update mobile number' do + fill_in('mobile_number[mobile_number]', with: '07123456789') + fill_in('mobile_number[mobile_number_confirmation]', with: '07123456789') + fill_in('current_password[password]', with: @user_password) + click_button('Update details') + expect(page).to have_content('Mobile number updated!') + @user.reload + expect(@user.mobile_number).to eq('+447123456789') + end +end \ No newline at end of file diff --git a/spec/feature/admin_update_images_spec.rb b/spec/feature/admin_update_images_spec.rb new file mode 100644 index 00000000..81405707 --- /dev/null +++ b/spec/feature/admin_update_images_spec.rb @@ -0,0 +1,39 @@ +feature 'Admin update images', feature: true, slow: true do + before(:each) do + seed_user_and_settings + login_feature + visit('admin/images') + end + + scenario 'Update custom image location' do + fill_in('header_image_x_loc', match: :first, with: '10') + first('.input-submit-tag').click + expect(page).to have_content('Header image x loc updated!') + visit('/') + header_image = first('.header-image > img') + expect(header_image[:style]).to match(/object-position: 10% 50%/) + end + + scenario 'Update header image' do + find_field('header_image[image_file]').set(Rails.root.join('spec/files/sample_image.jpg')) + first('.input-submit-tag').click + expect(page).to have_content('Header image updated!') + visit('/') + expect(page).to have_css("img[src*='image.jpg']") + visit('admin/images') + first("input[name='attachment[reset]']", text: '').set(true) + first('.input-submit-tag').click + expect(page).to have_content('Header image reset!') + visit('/') + expect(page).to_not have_css("img[src*='image.jpg']") + end + + scenario 'Update custom image location' do + fill_in('header_image_x_loc', match: :first, with: '10') + first('.input-submit-tag').click + expect(page).to have_content('Header image x loc updated!') + visit('/') + header_image = first('.header-image > img') + expect(header_image[:style]).to match(/object-position: 10% 50%/) + end +end diff --git a/spec/feature/admin_update_site_settings_spec.rb b/spec/feature/admin_update_site_settings_spec.rb new file mode 100644 index 00000000..6d22c370 --- /dev/null +++ b/spec/feature/admin_update_site_settings_spec.rb @@ -0,0 +1,21 @@ +feature 'Admin update site settings', feature: true, slow: true do + before(:each) do + seed_user_and_settings + login_feature + end + + scenario 'Update site settings' do + visit('admin/site_settings') + fill_in('site_setting[name]', with: 'new_site_name') + fill_in('site_setting[header_text]', with: 'new_header') + fill_in('site_setting[subtitle_text]', with: 'new_subtitle') + click_button('Update site settings') + expect(page).to have_content('Name updated!') + expect(page).to have_content('Header text updated!') + expect(page).to have_content('Subtitle text updated!') + visit('/') + expect(page).to have_content('new_site_name') + expect(page).to have_content('new_header') + expect(page).to have_content('new_subtitle') + end +end \ No newline at end of file diff --git a/spec/feature/blog_posts_feature_spec.rb b/spec/feature/blog_posts_feature_spec.rb new file mode 100644 index 00000000..6a2d2e35 --- /dev/null +++ b/spec/feature/blog_posts_feature_spec.rb @@ -0,0 +1,113 @@ +feature 'blog posts feature', feature: true do + before(:each) do + seed_user_and_settings + end + + context 'public user' do + scenario 'no blog posts' do + visit('/') + click_on('BLOG') + expect(page).to have_current_path('/blog') + expect(page).to have_content('There are no posts here...') + end + + scenario 'view blog post' do + seed_blog_post + visit('/blog') + expect(page).not_to have_button('Admin Edit') + expect(page).to have_content(@blog_post.title) + expect(page).to have_content(@blog_post.overview) + first('.show-blog-post-button').click + expect(page).to have_content(@blog_post_section.text) + end + end + + context 'admin user' do + before(:each) do + seed_blog_post + login_feature + end + + scenario 'create blog post', js: true do + visit('/blog') + click_on('Create New') + fill_in('post[title]', with: 'post title') + fill_in('post[overview]', with: 'post overview') + + # fill in first post section + fill_in('post[post_sections_attributes][0][text]', with: 'post section text content 1') + + # add second post section + first('.post-editor-toolbar-button.new-section').click + fill_in('post[post_sections_attributes][1][text]', with: 'post section text content 2') + + # add third post section + all('.post-editor-toolbar-button.new-section')[1].click + fill_in('post[post_sections_attributes][2][text]', with: 'post section text content 3') + find_field('post[post_sections_attributes][0][post_section_image_attributes][image_file]').set(Rails.root.join('spec/files/sample_image.jpg')) + fill_in('post[post_sections_attributes][0][post_section_image_attributes][title]', with: 'post section image caption 3') + + # remove second post section + all('.post-editor-toolbar-button.remove-section')[1].click + + # remove and restore third post section + all('.post-editor-toolbar-button.remove-section')[1].click + all('.post-editor-toolbar-button.restore-section')[1].click + + fill_in('post[date_published]', with: DateTime.new(2020, 04, 19, 0, 0, 0)) + first('.input-submit').click + expect(page).to have_content('Blog post created') + expect(page).to have_content('post title') + expect(page).to have_content('April 19th, 2020') + + expect(page).to have_content('post section text content 1') + expect(page).not_to have_content('post section text content 2') + expect(page).to have_content('post section text content 3') + expect(page).to have_selector('img.post-section-image-thumbnail') + expect(page).to have_content('post section image caption 3') + + first('.reading-footer .standard-button').click + expect(page).to have_content('post overview') + end + + scenario 'update blog post' do + visit('/blog') + first('.show-blog-post-button').click + click_on('Edit') + expect(page).to have_content(@blog_post_section.text) + fill_in('post[title]', with: 'new title') + click_button('Submit') + expect(page).to have_content('Blog post updated') + expect(page).to have_content('new title') + end + + scenario 'delete blog post' do + visit('/blog') + first('.show-blog-post-button').click + click_on('Edit') + first('.destroy-button').click + expect(page).to have_content('Blog post removed') + expect(page).to have_content('There are no posts here...') + end + + scenario 'hide blog post' do + visit('/blog') + first('.show-blog-post-button').click + click_on('Edit') + expect(page).to have_content(@blog_post_section.text) + find(:css, 'input[name="post[visible]"]').set(false) + click_button('Submit') + expect(page).to have_content('Blog post updated') + expect(page).to have_content(@blog_post.title) + expect(page).to have_content('(hidden)') + + visit('/blog') + expect(page).to have_content(@blog_post.title) + expect(page).to have_content('(hidden)') + + logout_feature + visit('/blog') + expect(page).to have_content('There are no posts here...') + end + end +end diff --git a/spec/feature/code_snippets_feature_spec.rb b/spec/feature/code_snippets_feature_spec.rb new file mode 100644 index 00000000..523923e5 --- /dev/null +++ b/spec/feature/code_snippets_feature_spec.rb @@ -0,0 +1,68 @@ +feature 'code snippets feature', feature: true do + before(:each) do + seed_user_and_settings + end + + context 'public user' do + scenario 'no code snippets' do + visit('/') + click_on('CODE SNIPPETS') + expect(page).to have_current_path('/code-snippets') + expect(page).to have_content('There are no code snippets here...') + end + + scenario 'view code snippet' do + seed_code_snippet + visit('/code-snippets') + expect(page).not_to have_button('Admin Edit') + expect(page).to have_content(@code_snippet.title) + expect(page).to have_content(@code_snippet.overview) + first('.show-button').click + expect(page).to have_content(@code_snippet.text) + end + end + + context 'admin user' do + before(:each) do + login_feature + seed_code_snippet + end + + scenario 'create code snippet' do + visit('/code-snippets') + click_on('Create New') + fill_in('code_snippet[title]', with: 'code snippet title') + fill_in('code_snippet[overview]', with: 'code snippet overview') + fill_in('code_snippet[snippet]', with: 'def code_snippet; end') + fill_in('code_snippet[extension]', with: 'js') + fill_in('code_snippet[text]', with: 'code snippet text content') + click_button('Submit') + expect(page).to have_content('Code snippet created') + expect(page).to have_content('code snippet title') + expect(page).to have_content('code snippet overview') + first('.show-button').click + expect(page).to have_content('code snippet text content') + expect(page).to have_content('def code_snippet; end') + end + + scenario 'update code snippet' do + visit('/code-snippets') + first('.show-button').click + click_on('Edit') + expect(page).to have_content(@code_snippet.text) + fill_in('code_snippet[title]', with: 'new title') + click_button('Submit') + expect(page).to have_content('Code snippet updated') + expect(page).to have_content('new title') + end + + scenario 'delete code snippet' do + visit('/code-snippets') + first('.show-button').click + click_on('Edit') + first('.destroy-button').click + expect(page).to have_content('Code snippet removed') + expect(page).to have_content('There are no code snippets here...') + end + end +end \ No newline at end of file diff --git a/spec/feature/contact_message_feature_spec.rb b/spec/feature/contact_message_feature_spec.rb new file mode 100644 index 00000000..fe0015d4 --- /dev/null +++ b/spec/feature/contact_message_feature_spec.rb @@ -0,0 +1,22 @@ +feature 'send contact message', feature: true do + before(:each) do + seed_user_and_settings + allow(ReCaptchaService).to receive(:recaptcha_valid?).and_return(true) + end + + context 'public user' do + scenario 'send message' do + visit('/') + click_on('CONTACT') + expect(page).to have_current_path('/contact') + fill_in('contact_message[from]', with: 'new from name') + fill_in('contact_message[email]', with: 'email@example.com') + fill_in('contact_message[subject]', with: 'new message') + fill_in('contact_message[content]', with: 'new contact message') + expect{ click_on('Send') }.to change{ ContactMessage.all.length }.from(0).to(1) + new_message = ContactMessage.first + expect(NewContactMessageJob).to have_been_enqueued.with(contact_message: new_message) + expect(page).to have_content('Message sent! You should receive a confirmation email shortly.') + end + end +end diff --git a/spec/feature/footer_feature_spec.rb b/spec/feature/footer_feature_spec.rb new file mode 100644 index 00000000..a609d967 --- /dev/null +++ b/spec/feature/footer_feature_spec.rb @@ -0,0 +1,13 @@ +feature 'Footer', feature: true do + before(:each) do + seed_user_and_settings + end + + scenario 'links are rendered' do + visit('/') + expect(page).to have_css('footer .footer-links') + expect(page).to have_selector(:css, "a.github-link[href='#{@about.github_link}']") + expect(page).to have_selector(:css, "a.linkedin-link[href='#{@about.linkedin_link}']") + expect(page).to have_selector(:css, "a.homepage-link[href='#{root_path}']") + end +end \ No newline at end of file diff --git a/spec/feature/gallery_feature_spec.rb b/spec/feature/gallery_feature_spec.rb new file mode 100644 index 00000000..2745d490 --- /dev/null +++ b/spec/feature/gallery_feature_spec.rb @@ -0,0 +1,70 @@ +feature 'admin update gallery', feature: true do + before(:each) do + seed_user_and_settings + end + + context 'public user' do + scenario 'no gallery images' do + visit('/') + click_on('GALLERY') + expect(page).to have_current_path('/gallery') + expect(page).to have_content('There are no images here...') + end + + scenario 'gallery images' do + seed_gallery_image + visit('/gallery') + expect(page).to have_selector('img.gallery-image-thumbnail') + expect(page.html).to include(@gallery_image.title) + expect(page.html).to include(@gallery_image.description) + end + end + + context 'admin user' do + before(:each) do + login_feature + end + + scenario 'create new image' do + visit('/gallery') + click_on('Admin Edit') + expect(page).to have_content('There are no images here...') + click_on('Create New') + fill_in('gallery_image[title]', with: 'new gallery image') + fill_in('gallery_image[date_taken]', with: DateTime.new(2020, 04, 19, 0, 0, 0)) + fill_in('gallery_image[latitude]', with: 179) + fill_in('gallery_image[longitude]', with: -179) + find_field('gallery_image[image_file]').set(Rails.root.join('spec/files/sample_image.jpg')) + click_button('Submit') + expect(page).to have_content('Gallery image created') + expect(page).to have_selector('img.gallery-image-thumbnail') + expect(page.html).to include('new gallery image') + end + + scenario 'edit image' do + seed_gallery_image + visit('/gallery') + click_on('Admin Edit') + first('.view-gallery-image').click + fill_in('gallery_image[title]', with: 'edited gallery image') + fill_in('gallery_image[date_taken]', with: DateTime.new(2020, 04, 19, 0, 0, 0)) + fill_in('gallery_image[latitude]', with: 179) + fill_in('gallery_image[longitude]', with: -179) + find_field('gallery_image[image_file]').set(Rails.root.join('spec/files/sample_image.jpg')) + click_button('Submit') + expect(page).to have_content('Gallery image updated') + expect(page).to have_selector('img.gallery-image-thumbnail') + expect(page.html).to include('edited gallery image') + end + + scenario 'delete blog post' do + seed_gallery_image + visit('/gallery') + click_on('Admin Edit') + first('.view-gallery-image').click + first('.destroy-button').click + expect(page).to have_content('Gallery image removed') + expect(page).to have_content('There are no images here...') + end + end +end \ No newline at end of file diff --git a/spec/feature/nav_menu_action_spec.rb b/spec/feature/nav_menu_action_spec.rb new file mode 100644 index 00000000..db910911 --- /dev/null +++ b/spec/feature/nav_menu_action_spec.rb @@ -0,0 +1,13 @@ +feature 'Nav menu action', feature: true, js: true do + before(:each) do + seed_user_and_settings + end + + scenario 'Clicking hamburger opens and closes navbar menu' do + visit('/') + page.find(:css, '.hamburger-container').click + expect(page).to have_css('.sidebar-open') + page.find(:css, '.hamburger-container').click + expect(page).not_to have_css('.sidebar-open') + end +end \ No newline at end of file diff --git a/spec/feature/password_reset_spec.rb b/spec/feature/password_reset_spec.rb new file mode 100644 index 00000000..7ec0e9fe --- /dev/null +++ b/spec/feature/password_reset_spec.rb @@ -0,0 +1,42 @@ +feature 'Password reset', feature: true do + before(:each) do + seed_user_and_settings + stub_recaptcha_service + end + + scenario 'Filling in password reset form' do + visit('/login') + click_on('Forgotten Password') + fill_in('email', with: @user.email) + click_button('Reset Password') + expect(page).to have_content('If the submitted email is associated with an account, a password reset link will be sent') + expect(current_path).to eq('/login') + expect(PasswordResetJob).to have_been_enqueued.exactly(:once) + end + + scenario 'Submitting new password' do + # Reset password + @user.send_password_reset_email! + reset_token = @user.password_reset_token + visit("/reset-password?reset_token=#{reset_token}") + fill_in('password', with: 'new_password') + fill_in('password_confirmation', with: 'new_password') + click_button('Reset Password') + expect(current_path).to eq('/login') + expect(page).to have_content('Password updated') + + # Attempt to reset password again with same token + visit("/reset-password?reset_token=#{reset_token}") + expect(current_path).to eq('/login') + expect(page).to have_content('Password reset token expired') + + # Login with new password + stub_two_factor_auth_service + fill_in('user', with: @user.username) + fill_in('password', with: 'new_password') + click_button('Login') + fill_in('auth_code', with: '123456') + click_button('Login') + expect(page).to have_content("#{@user.username} welcome back to your home-server!") + end +end \ No newline at end of file diff --git a/spec/feature/projects_feature_spec.rb b/spec/feature/projects_feature_spec.rb new file mode 100644 index 00000000..53ae2ae8 --- /dev/null +++ b/spec/feature/projects_feature_spec.rb @@ -0,0 +1,70 @@ +feature 'projects feature', feature: true do + before(:each) do + seed_user_and_settings + end + + context 'public user' do + scenario 'no projects' do + visit('/') + click_on('PROJECTS') + expect(page).to have_current_path('/projects') + expect(page).to have_content('There are no projects here...') + end + + scenario 'projects present' do + seed_project + visit('/projects') + expect(page).not_to have_button('Admin Edit') + expect(page).to have_content(@project.title) + expect(page).to have_content(@project.overview) + end + end + + context 'admin user' do + before(:each) do + login_feature + end + + scenario 'create code snippet' do + visit('/projects') + click_on('Create New') + fill_in('project[title]', with: 'project title') + fill_in('project[overview]', with: 'project overview') + fill_in('project[github_link]', with: 'https://example.com/github') + fill_in('project[site_link]', with: 'https://example.com/site') + fill_in('project[date]', with: DateTime.new(2020, 04, 19, 0, 0, 0)) + find_field('new_project_images[image_files][]').set(Rails.root.join('spec/files/sample_image.jpg')) + click_on('Submit') + expect(page).to have_content('Project created') + expect(page).to have_content('project title') + expect(page).to have_content('project overview') + expect(Project.first.project_images.length).to be(1) + expect(page).to have_content('project title') + expect(page).to have_content('project overview') + expect(page.html).to include('https://example.com/github') + expect(page.html).to include('https://example.com/site') + end + + scenario 'update project' do + seed_project + visit('/projects') + first('.standard-button.edit').click + expect(page).to have_content(@project.overview) + fill_in('project[title]', with: 'new title') + fill_in('snippet[snippet]', with: 'new code snippet') + fill_in('snippet[extension]', with: 'rb') + click_button('Submit') + expect(page).to have_content('Project updated') + expect(page).to have_content('new title') + end + + scenario 'delete project' do + seed_project + visit('/projects') + first('.standard-button.edit').click + first('.destroy-button').click + expect(page).to have_content('Project removed') + expect(page).to have_content('There are no projects here...') + end + end +end \ No newline at end of file diff --git a/spec/feature/unauthorised_user_redirect_spec.rb b/spec/feature/unauthorised_user_redirect_spec.rb new file mode 100644 index 00000000..ac6e9b1f --- /dev/null +++ b/spec/feature/unauthorised_user_redirect_spec.rb @@ -0,0 +1,10 @@ +feature 'Unauthorised user redirect', feature: true do + before(:each) do + seed_user_and_settings + end + + scenario 'Only logged in user can access admin page' do + visit('/admin') + expect(page).to have_current_path('/') + end +end \ No newline at end of file diff --git a/public/apple-touch-icon-precomposed.png b/spec/files/image_mock.jpg similarity index 100% rename from public/apple-touch-icon-precomposed.png rename to spec/files/image_mock.jpg diff --git a/spec/files/sample_image.jpg b/spec/files/sample_image.jpg new file mode 100644 index 00000000..c04e63f0 Binary files /dev/null and b/spec/files/sample_image.jpg differ diff --git a/spec/helpers/admin_link_helper_spec.rb b/spec/helpers/admin_link_helper_spec.rb new file mode 100644 index 00000000..7c0d51bc --- /dev/null +++ b/spec/helpers/admin_link_helper_spec.rb @@ -0,0 +1,56 @@ +describe AdminLinkHelper do + let(:about) { create(:about) } + let(:post) do + user = create(:user) + create(:post, user: user) + end + + describe '#admin_link_helper_admin_path' do + it 'singular resource' do + expect(helper.admin_link_helper_admin_path(about, true)).to eq(edit_admin_about_path) + end + + it 'standard resources' do + expect(helper.admin_link_helper_admin_path(about)).to eq(edit_admin_about_path(about)) + end + end + + describe '#admin_link_helper_section_path' do + it 'singular resource' do + expect(helper.admin_link_helper_section_path(about, true)).to eq(about_path) + end + + it 'standard resources' do + expect(helper.admin_link_helper_section_path(post)).to eq(posts_path) + end + end + + describe '#admin_link_helper_new_path' do + it 'standard resources' do + expect(helper.admin_link_helper_new_path(post)).to eq(new_admin_post_path) + end + end + + describe '#in_admin_scope?' do + it 'in admin scope' do + path = '/admin/some-page' + request_mock = double(:request, original_fullpath: path) + allow(helper).to receive(:request).and_return(request_mock) + expect(helper.in_admin_scope?).to eq(true) + end + + it 'not in admin scope - simple' do + path = '/some-page' + request_mock = double(:request, original_fullpath: path) + allow(helper).to receive(:request).and_return(request_mock) + expect(helper.in_admin_scope?).to eq(false) + end + + it 'not in admin scope - edge' do + path = '/admin-not-admin/' + request_mock = double(:request, original_fullpath: path) + allow(helper).to receive(:request).and_return(request_mock) + expect(helper.in_admin_scope?).to eq(false) + end + end +end \ No newline at end of file diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb new file mode 100644 index 00000000..78d8b98d --- /dev/null +++ b/spec/helpers/application_helper_spec.rb @@ -0,0 +1,35 @@ +describe ApplicationHelper do + describe '#header_height' do + it 'homepage path' do + mock_params = { + controller: 'homepages' + } + allow(helper).to receive(:params).and_return(mock_params) + expect(helper.header_height).to eq(300) + end + + it 'admin path' do + mock_params = { + controller: 'admin' + } + allow(helper).to receive(:params).and_return(mock_params) + expect(helper.header_height).to eq(300) + end + + it 'admin scope path' do + mock_params = { + controller: 'admin/gallery' + } + allow(helper).to receive(:params).and_return(mock_params) + expect(helper.header_height).to eq(300) + end + + it 'other path' do + mock_params = { + controller: 'other' + } + allow(helper).to receive(:params).and_return(mock_params) + expect(helper.header_height).to eq(205) + end + end +end \ No newline at end of file diff --git a/spec/helpers/attachment_helper_spec.rb b/spec/helpers/attachment_helper_spec.rb new file mode 100644 index 00000000..c4476033 --- /dev/null +++ b/spec/helpers/attachment_helper_spec.rb @@ -0,0 +1,109 @@ +describe AttachmentHelper do + default_image_path = 'path-to-default-image' + let(:mock_variant) { double :variant, key: 'test-variant' } + let(:mock_image_variant) { double :image_file_variant, blob: mock_image_file, variation: mock_variant } + let(:mock_image_file) { double :image_file, signed_id: 'test-id', filename: 'test-name' } + let(:header_image) { double :header_image, image_file: mock_image_file, default_image: default_image_path } + let(:profile_image) { double :profile_image, image_file: mock_image_file } + + describe '#image_path_helper' do + it 'image attached' do + allow(mock_image_file).to receive(:attached?).and_return(true) + expect(helper.image_path_helper(image_model: header_image)).to eq(mock_image_file) + end + + it 'default image method implemented' do + allow(mock_image_file).to receive(:attached?).and_return(false) + expect(helper.image_path_helper(image_model: header_image)).to eq(default_image_path) + end + + it 'no image attached' do + allow(mock_image_file).to receive(:attached?).and_return(false) + expect(helper.image_path_helper(image_model: profile_image)).to eq(AttachmentHelper::IMAGE_NOT_FOUND) + end + + it 'no image passed' do + expect(helper.image_path_helper(image_model: nil)).to eq(AttachmentHelper::IMAGE_NOT_FOUND) + end + + it 'variant passed' do + allow(mock_image_file).to receive(:attached?).and_return(true) + allow(header_image).to receive(:variant_sizes).and_return({ thumbnail: { resize_to_limit: [100, 100] }}) + expect(mock_image_file).to receive(:variant).with({ resize_to_limit: [100, 100] }) + helper.image_path_helper(image_model: header_image, variant: :thumbnail) + end + end + + describe '#image_file_name' do + let(:image_path) { Rails.root.join('spec/files/sample_image.jpg') } + let(:image_fixture) { fixture_file_upload(image_path, 'image/png') } + let(:image_file_attached) { build_stubbed(:profile_image, image_file: image_fixture) } + let(:image_file_not_attached) { build_stubbed(:profile_image) } + + it 'no image passed' do + expect(helper.image_file_name(image: nil)).to eq('default image') + end + + it 'image file not attached' do + expect(helper.image_file_name(image: image_file_not_attached)).to eq('default image') + end + + it 'default name' do + default_name = 'default image name' + expect(helper.image_file_name(image: nil, default_name: default_name)).to eq(default_name) + end + + it 'model name' do + model_name = 'model with image attachement' + expect(helper.image_file_name(image: nil, model_name: model_name)).to eq("default #{model_name} image") + end + + it 'image file attached' do + expect(helper.image_file_name(image: image_file_attached)).to eq('sample_image.jpg') + end + end + + describe '#image_attached?' do + it 'no image passed' do + expect(helper.image_attached?(nil)).to eq(false) + end + + it 'no image attached' do + allow(mock_image_file).to receive(:attached?).and_return(false) + expect(helper.image_attached?(header_image)).to eq(false) + end + + it 'image attached' do + allow(mock_image_file).to receive(:attached?).and_return(true) + expect(helper.image_attached?(header_image)).to eq(true) + end + end + + describe '#fetch_image_url' do + it 'no image passed' do + expect(helper.fetch_image_url(image_model: nil)).to eq(AttachmentHelper::IMAGE_NOT_FOUND) + end + + it 'no image attached' do + allow(mock_image_file).to receive(:attached?).and_return(false) + expect(helper.fetch_image_url(image_model: profile_image)).to eq(AttachmentHelper::IMAGE_NOT_FOUND) + end + + it 'default image method implemented' do + allow(mock_image_file).to receive(:attached?).and_return(false) + expect(helper.fetch_image_url(image_model: header_image)).to eq(default_image_path) + end + + it 'image attached' do + allow(mock_image_file).to receive(:attached?).and_return(true) + expect(helper.fetch_image_url(image_model: header_image)).to eq('/rails/active_storage/blobs/redirect/test-id/test-name') + end + + it 'variant passed' do + allow(mock_image_file).to receive(:attached?).and_return(true) + allow(header_image).to receive(:variant_sizes).and_return({ thumbnail: { resize_to_limit: [100, 100] }}) + allow(mock_image_file).to receive(:variant).with({ resize_to_limit: [100, 100] }).and_return(mock_image_variant) + expect(helper.fetch_image_url(image_model: header_image, variant: :thumbnail)).to eq('/rails/active_storage/representations/redirect/test-id/test-variant/test-name') + end + end +end \ No newline at end of file diff --git a/spec/helpers/date_helper_spec.rb b/spec/helpers/date_helper_spec.rb new file mode 100644 index 00000000..2460a94b --- /dev/null +++ b/spec/helpers/date_helper_spec.rb @@ -0,0 +1,20 @@ +describe DateHelper do + let(:date) { Date.new(2020, 04, 19) } + let(:datetime) { DateTime.new(2020, 04, 19, 01, 02, 03) } + + describe '#full_date' do + it 'process to html' do + result = helper.full_date(date) + expect(result).to eq('April 19th, 2020') + expect(result).to be_kind_of(ActiveSupport::SafeBuffer) + end + end + + describe '#full_date_and_time' do + it 'process to html' do + result = helper.full_date_and_time(datetime) + expect(result).to eq('April 19th, 2020 at 1:02am') + expect(result).to be_kind_of(ActiveSupport::SafeBuffer) + end + end +end diff --git a/spec/helpers/markdown_helper_spec.rb b/spec/helpers/markdown_helper_spec.rb new file mode 100644 index 00000000..667021a0 --- /dev/null +++ b/spec/helpers/markdown_helper_spec.rb @@ -0,0 +1,28 @@ +describe MarkdownHelper do + describe '#markdown_admin' do + let(:test_html) { '

    some html

    ' } + let(:redcarpet_mock) { double(:redcarpet, render: test_html) } + let(:renderer_mock) { double(:html) } + + it 'renders markdown' do + expect(Redcarpet::Render::HTML).to receive(:new).with(anything).and_return(renderer_mock) + expect(Redcarpet::Markdown).to receive(:new).with(renderer_mock, anything).and_return(redcarpet_mock) + helper.markdown_admin('test') + end + + it 'markdown encapsulated in class' do + allow(Redcarpet::Render::HTML).to receive(:new).and_return(renderer_mock) + allow(Redcarpet::Markdown).to receive(:new).and_return(redcarpet_mock) + expect(helper.markdown_admin('test')).to eq(%(
    #{test_html}
    )) + end + end + + describe '#markdown_code' do + it 'encapsulates code' do + code = 'some code' + extension = 'rb' + expect(helper).to receive(:markdown_admin).with("```#{extension}\n#{code}\n```").and_return('rendered markdown') + expect(helper.markdown_code(code: code, extension: extension)).to eq('rendered markdown') + end + end +end \ No newline at end of file diff --git a/spec/javascript/.eslintrc b/spec/javascript/.eslintrc new file mode 100644 index 00000000..8e6898a2 --- /dev/null +++ b/spec/javascript/.eslintrc @@ -0,0 +1,5 @@ +{ + "rules": { + "no-undef": "off" + } +} \ No newline at end of file diff --git a/spec/javascript/__mocks__/ResizeObserver.js b/spec/javascript/__mocks__/ResizeObserver.js new file mode 100644 index 00000000..ed9c6b62 --- /dev/null +++ b/spec/javascript/__mocks__/ResizeObserver.js @@ -0,0 +1,21 @@ +class ResizeObserver { + constructor (callback) { + this.callback = callback + } + + observe () { + this.callback() + } + + unobserve () { + // do nothing + } + + disconnect () { + + } +} + +window.ResizeObserver = ResizeObserver + +export default ResizeObserver diff --git a/spec/javascript/__mocks__/fileMock.js b/spec/javascript/__mocks__/fileMock.js new file mode 100644 index 00000000..0e56c5b5 --- /dev/null +++ b/spec/javascript/__mocks__/fileMock.js @@ -0,0 +1 @@ +module.exports = 'test-file-stub' diff --git a/spec/javascript/__mocks__/styleMock.js b/spec/javascript/__mocks__/styleMock.js new file mode 100644 index 00000000..4ba52ba2 --- /dev/null +++ b/spec/javascript/__mocks__/styleMock.js @@ -0,0 +1 @@ +module.exports = {} diff --git a/spec/javascript/dashboard_sidebar_controller_spec.js b/spec/javascript/dashboard_sidebar_controller_spec.js new file mode 100644 index 00000000..c6977c65 --- /dev/null +++ b/spec/javascript/dashboard_sidebar_controller_spec.js @@ -0,0 +1,53 @@ +/** + * @jest-environment jsdom + */ + +import { Application } from '@hotwired/stimulus' +import dashboardSidebarController from 'controllers/dashboard_sidebar_controller' +const fs = require('fs') + +describe('dashboard_sidebar_controller', () => { + let dashboardSidebar + let dashboardSidebarToggle + let applicationHTML + + beforeAll(done => { + const application = Application.start() + application.register('dashboard-sidebar', dashboardSidebarController) + fs.readFile('app/views/partials/_dashboard_sidebar.html.erb', 'utf8', (err, data) => { + if (err) throw new Error(err) + applicationHTML = data + done() + }) + }) + + beforeEach(() => { + document.body.innerHTML = applicationHTML + dashboardSidebar = document.querySelector('.dashboard-sidebar') + dashboardSidebarToggle = document.querySelector('.dashboard-sidebar-toggle') + }) + + describe('#sidebarToggle', () => { + it("on toggle click - adds and removes 'open' class to sidebarToggleTarget", () => { + dashboardSidebarToggle.click() + expect(dashboardSidebarToggle.classList).toContain('open') + dashboardSidebarToggle.click() + expect(dashboardSidebarToggle.classList).not.toContain('open') + }) + + it("on toggle click - adds and removes 'open' class to sidebarTarget", () => { + dashboardSidebarToggle.click() + expect(dashboardSidebar.classList).toContain('open') + dashboardSidebarToggle.click() + expect(dashboardSidebar.classList).not.toContain('open') + }) + + it('on toggle click - sidebar open state added to controller element', () => { + expect(dashboardSidebar.getAttribute('data-dashboard-sidebar-open')).toEqual('false') + dashboardSidebarToggle.click() + expect(dashboardSidebar.getAttribute('data-dashboard-sidebar-open')).toEqual('true') + dashboardSidebarToggle.click() + expect(dashboardSidebar.getAttribute('data-dashboard-sidebar-open')).toEqual('false') + }) + }) +}) diff --git a/spec/javascript/embedded_gallery_controller_spec.js.js b/spec/javascript/embedded_gallery_controller_spec.js.js new file mode 100644 index 00000000..f1b8e425 --- /dev/null +++ b/spec/javascript/embedded_gallery_controller_spec.js.js @@ -0,0 +1,360 @@ +/** + * @jest-environment jsdom + */ + +import { Application } from '@hotwired/stimulus' +import embeddedGalleryController from 'controllers/embedded_gallery_controller' + +jest.useFakeTimers() + +describe('embedded_gallery_controller', () => { + let startPosition = 0 + let nextButton + let prevButton + let image1 + let image2 + let image3 + + const assignHTML = () => { + document.body.innerHTML = ` +
    + + + + + +
    + ` + nextButton = document.querySelector('#next-button') + prevButton = document.querySelector('#prev-button') + image1 = document.querySelector('#image1') + image2 = document.querySelector('#image2') + image3 = document.querySelector('#image3') + } + + beforeAll(() => { + const application = Application.start() + application.register('embedded-gallery', embeddedGalleryController) + }) + + afterEach(() => { + startPosition = 0 + }) + + describe('#connect', () => { + describe('0 start position', () => { + beforeEach(() => { + assignHTML() + }) + + it('image styles', () => { + expect(image1.style.opacity).toEqual('1') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('0') + expect(image1.style.zIndex).toEqual('1') + expect(image2.style.zIndex).toEqual('') + expect(image3.style.zIndex).toEqual('') + }) + + it('navButton styles', () => { + expect(nextButton.style.display).toEqual('flex') + expect(prevButton.style.display).toEqual('flex') + }) + }) + + describe('1 start position', () => { + beforeEach(() => { + startPosition = 1 + assignHTML() + }) + + it('image styles', () => { + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('1') + expect(image3.style.opacity).toEqual('0') + expect(image1.style.zIndex).toEqual('') + expect(image2.style.zIndex).toEqual('1') + expect(image3.style.zIndex).toEqual('') + }) + }) + + describe('-1 start position', () => { + beforeEach(() => { + startPosition = -1 + assignHTML() + }) + + it('image styles', () => { + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('1') + expect(image1.style.zIndex).toEqual('') + expect(image2.style.zIndex).toEqual('') + expect(image3.style.zIndex).toEqual('1') + }) + }) + + describe('invalid integer start position', () => { + beforeEach(() => { + startPosition = -10 + assignHTML() + }) + + it('image styles', () => { + expect(image1.style.opacity).toEqual('1') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('0') + expect(image1.style.zIndex).toEqual('1') + expect(image2.style.zIndex).toEqual('') + expect(image3.style.zIndex).toEqual('') + }) + }) + + describe('invalid integer format position', () => { + beforeEach(() => { + startPosition = 'not an integer' + assignHTML() + }) + + it('image styles', () => { + expect(image1.style.opacity).toEqual('1') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('0') + expect(image1.style.zIndex).toEqual('1') + expect(image2.style.zIndex).toEqual('') + expect(image3.style.zIndex).toEqual('') + }) + }) + }) + + describe('#next', () => { + describe('0 position', () => { + beforeEach(() => { + startPosition = 0 + assignHTML() + }) + + it('image styles', () => { + nextButton.dispatchEvent(new Event('click')) + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('0') + jest.runOnlyPendingTimers() + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('1') + expect(image3.style.opacity).toEqual('0') + expect(image1.style.zIndex).toEqual('') + expect(image2.style.zIndex).toEqual('1') + expect(image3.style.zIndex).toEqual('') + }) + }) + + describe('1 position', () => { + beforeEach(() => { + startPosition = 1 + assignHTML() + }) + + it('image styles', () => { + nextButton.dispatchEvent(new Event('click')) + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('0') + jest.runOnlyPendingTimers() + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('1') + expect(image1.style.zIndex).toEqual('') + expect(image2.style.zIndex).toEqual('') + expect(image3.style.zIndex).toEqual('1') + }) + }) + + describe('2 position', () => { + beforeEach(() => { + startPosition = 2 + assignHTML() + }) + + it('image styles', () => { + nextButton.dispatchEvent(new Event('click')) + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('0') + jest.runOnlyPendingTimers() + expect(image1.style.opacity).toEqual('1') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('0') + expect(image1.style.zIndex).toEqual('1') + expect(image2.style.zIndex).toEqual('') + expect(image3.style.zIndex).toEqual('') + }) + }) + + describe('double click before initial timer complete', () => { + beforeEach(() => { + startPosition = 0 + assignHTML() + }) + + it('image styles', () => { + nextButton.dispatchEvent(new Event('click')) + nextButton.dispatchEvent(new Event('click')) + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('0') + jest.runOnlyPendingTimers() + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('1') + expect(image1.style.zIndex).toEqual('') + expect(image2.style.zIndex).toEqual('') + expect(image3.style.zIndex).toEqual('1') + }) + }) + + describe('double click before next image fade in timer complete', () => { + beforeEach(() => { + startPosition = 0 + assignHTML() + }) + + it('image styles', () => { + nextButton.dispatchEvent(new Event('click')) + jest.runOnlyPendingTimers() + nextButton.dispatchEvent(new Event('click')) + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('1') + expect(image1.style.zIndex).toEqual('') + expect(image2.style.zIndex).toEqual('') + expect(image3.style.zIndex).toEqual('1') + }) + }) + }) + + describe('#prev', () => { + describe('0 position', () => { + beforeEach(() => { + startPosition = 0 + assignHTML() + }) + + it('image styles', () => { + prevButton.dispatchEvent(new Event('click')) + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('0') + jest.runOnlyPendingTimers() + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('1') + expect(image1.style.zIndex).toEqual('') + expect(image2.style.zIndex).toEqual('') + expect(image3.style.zIndex).toEqual('1') + }) + }) + + describe('1 position', () => { + beforeEach(() => { + startPosition = 1 + assignHTML() + }) + + it('image styles', () => { + prevButton.dispatchEvent(new Event('click')) + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('0') + jest.runOnlyPendingTimers() + expect(image1.style.opacity).toEqual('1') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('0') + expect(image1.style.zIndex).toEqual('1') + expect(image2.style.zIndex).toEqual('') + expect(image3.style.zIndex).toEqual('') + }) + }) + + describe('2 position', () => { + beforeEach(() => { + startPosition = 2 + assignHTML() + }) + + it('image styles', () => { + prevButton.dispatchEvent(new Event('click')) + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('0') + jest.runOnlyPendingTimers() + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('1') + expect(image3.style.opacity).toEqual('0') + expect(image1.style.zIndex).toEqual('') + expect(image2.style.zIndex).toEqual('1') + expect(image3.style.zIndex).toEqual('') + }) + }) + + describe('double click before initial timer complete', () => { + beforeEach(() => { + startPosition = 0 + assignHTML() + }) + + it('image styles', () => { + prevButton.dispatchEvent(new Event('click')) + prevButton.dispatchEvent(new Event('click')) + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('0') + expect(image3.style.opacity).toEqual('0') + jest.runOnlyPendingTimers() + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('1') + expect(image3.style.opacity).toEqual('0') + expect(image1.style.zIndex).toEqual('') + expect(image2.style.zIndex).toEqual('1') + expect(image3.style.zIndex).toEqual('') + }) + }) + + describe('double click before next image fade in timer complete', () => { + beforeEach(() => { + startPosition = 0 + assignHTML() + }) + + it('image styles', () => { + prevButton.dispatchEvent(new Event('click')) + jest.runOnlyPendingTimers() + prevButton.dispatchEvent(new Event('click')) + expect(image1.style.opacity).toEqual('0') + expect(image2.style.opacity).toEqual('1') + expect(image3.style.opacity).toEqual('0') + expect(image1.style.zIndex).toEqual('') + expect(image2.style.zIndex).toEqual('1') + expect(image3.style.zIndex).toEqual('') + }) + }) + }) + + describe('one image', () => { + beforeEach(() => { + document.body.innerHTML = ` +
    + + + +
    + ` + nextButton = document.querySelector('#next-button') + prevButton = document.querySelector('#prev-button') + }) + + it('navButton styles', () => { + expect(nextButton.style.display).toEqual('') + expect(prevButton.style.display).toEqual('') + }) + }) +}) diff --git a/spec/javascript/gallery_lightbox_controller_spec.js b/spec/javascript/gallery_lightbox_controller_spec.js new file mode 100644 index 00000000..8da8b10a --- /dev/null +++ b/spec/javascript/gallery_lightbox_controller_spec.js @@ -0,0 +1,66 @@ +/** + * @jest-environment jsdom + */ + +import { Application } from '@hotwired/stimulus' +import galleryLightboxController from 'controllers/gallery_lightbox_controller' +import SimpleLightbox from 'simplelightbox' + +const mockSimpleLightbox = { destroy: jest.fn() } + +jest.mock('simplelightbox', () => { + return jest.fn().mockImplementation(() => { + return mockSimpleLightbox + }) +}) + +describe('gallery_lightbox_controller', () => { + const galleryContainerItemSelector = '.gallery-container a' + const pathToGalleryItem = 'path-to-full-image.jpg' + const galleryItemDescription = 'gallery item description' + let container + + beforeAll(() => { + const application = Application.start() + application.register('gallery-lightbox', galleryLightboxController) + }) + + beforeEach(() => { + document.body.innerHTML = ` + + ` + container = document.querySelector('.gallery-container') + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + describe('#connect', () => { + it('lightbox initialized', () => { + expect(SimpleLightbox).toHaveBeenCalledWith(galleryContainerItemSelector, { + animationSlide: false, + animationSpeed: 100, + captionClass: 'lightbox-caption', + close: false, + fadeSpeed: 150, + history: false, + htmlClass: false, + showCounter: false + }) + }) + }) + + describe('#reConnect', () => { + it('lightbox destroyed and reinitialized', () => { + container.dispatchEvent(new Event('reConnectLightbox')) + expect(mockSimpleLightbox.destroy).toHaveBeenCalled() + }) + }) +}) diff --git a/spec/javascript/headerScroll_spec.js b/spec/javascript/headerScroll_spec.js new file mode 100644 index 00000000..cac37813 --- /dev/null +++ b/spec/javascript/headerScroll_spec.js @@ -0,0 +1,70 @@ +/** + * @jest-environment jsdom + */ + +import headerScroll from 'listeners/headerScroll' + +describe('header_scroll_controller', () => { + let headerImage + let navImage + + beforeEach(() => { + jest.spyOn(window, 'requestAnimationFrame').mockImplementation(cb => cb()) + window.addEventListener('scroll', headerScroll, { passive: true }) + }) + + afterEach(() => { + window.requestAnimationFrame.mockRestore() + window.removeEventListener('scroll', headerScroll) + }) + + describe('#scrollHeaderImage', () => { + const imageHeight = 300 + const headerHeight = 60 + + beforeEach(() => { + document.body.innerHTML = ` +
    +
    + +
    + ` + headerImage = document.querySelector('#header-image') + navImage = document.querySelector('#nav-image') + }) + + it('initial height', () => { + window.pageYOffset = 0 + window.dispatchEvent(new Event('scroll')) + expect(headerImage.style.bottom).toEqual('0px') + expect(navImage.style.top).toEqual('0px') + }) + + it('scroll', () => { + let scrollTop = 10 + window.pageYOffset = scrollTop + window.dispatchEvent(new Event('scroll')) + expect(headerImage.style.bottom).toEqual(`${-scrollTop / 3.5}px`) + expect(navImage.style.top).toEqual(`${-(scrollTop - scrollTop / 3.5)}px`) + + scrollTop = 100 + window.pageYOffset = scrollTop + window.dispatchEvent(new Event('scroll')) + expect(headerImage.style.bottom).toEqual(`${-scrollTop / 3.5}px`) + expect(navImage.style.top).toEqual(`${-(scrollTop - scrollTop / 3.5)}px`) + }) + + it('scroll limit', () => { + const scrollLimit = imageHeight - headerHeight + window.pageYOffset = scrollLimit + window.dispatchEvent(new Event('scroll')) + expect(headerImage.style.bottom).toEqual(`${-scrollLimit / 3.5}px`) + expect(navImage.style.top).toEqual(`${-(scrollLimit - scrollLimit / 3.5)}px`) + + window.pageYOffset = scrollLimit + 1 + window.dispatchEvent(new Event('scroll')) + expect(headerImage.style.bottom).toEqual(`${-scrollLimit / 3.5}px`) + expect(navImage.style.top).toEqual(`${-(scrollLimit - scrollLimit / 3.5)}px`) + }) + }) +}) diff --git a/spec/javascript/image_loader_controller_spec.js b/spec/javascript/image_loader_controller_spec.js new file mode 100644 index 00000000..b46d1b9c --- /dev/null +++ b/spec/javascript/image_loader_controller_spec.js @@ -0,0 +1,87 @@ +/** + * @jest-environment jsdom + */ + +import { Application } from '@hotwired/stimulus' +import imageLoaderController from 'controllers/image_loader_controller' + +jest.useFakeTimers() + +describe('image_loader_controller', () => { + let fadeTargetOne + let fadeTargetTwo + + beforeAll(() => { + const application = Application.start() + application.register('image-loader', imageLoaderController) + }) + + beforeEach(() => { + jest.spyOn(window, 'requestAnimationFrame').mockImplementation(cb => cb()) + }) + + afterEach(() => { + window.requestAnimationFrame.mockRestore() + }) + + describe('images present', () => { + beforeEach(() => { + document.body.innerHTML = ` +
    + + +
    + ` + const fadeTargets = document.getElementsByClassName('fade-target') + fadeTargetOne = fadeTargets[0] + fadeTargetTwo = fadeTargets[1] + fadeTargetOne.addEventListener('load', () => { + jest.spyOn(fadeTargetOne, 'naturalHeight', 'get').mockReturnValue(1) + }) + fadeTargetTwo.addEventListener('load', () => { + jest.spyOn(fadeTargetTwo, 'naturalHeight', 'get').mockReturnValue(1) + }) + }) + + describe('#imageLoaded', () => { + it('not all images loaded', () => { + fadeTargetOne.dispatchEvent(new Event('load')) + jest.runOnlyPendingTimers() + expect(fadeTargetOne.classList).not.toContain('fade-in') + expect(fadeTargetTwo.classList).not.toContain('fade-in') + }) + + it('all images loaded', () => { + fadeTargetOne.dispatchEvent(new Event('load')) + fadeTargetTwo.dispatchEvent(new Event('load')) + jest.runOnlyPendingTimers() + expect(fadeTargetOne.classList).toContain('fade-in') + expect(fadeTargetTwo.classList).toContain('fade-in') + expect(fadeTargetOne.style.transitionDelay).toBe('0s') + expect(fadeTargetTwo.style.transitionDelay).toBe('0.1s') + }) + }) + }) + + describe('no images', () => { + let fadeTarget + + beforeEach(() => { + document.body.innerHTML = ` +
    +
    + I still need fading in +
    +
    + ` + fadeTarget = document.getElementById('fade-target') + }) + + describe('#initialize', () => { + it('fade in still occurs', () => { + jest.runOnlyPendingTimers() + expect(fadeTarget.classList).toContain('fade-in') + }) + }) + }) +}) diff --git a/spec/javascript/justified_gallery_controller_spec.js b/spec/javascript/justified_gallery_controller_spec.js new file mode 100644 index 00000000..f5c5e45f --- /dev/null +++ b/spec/javascript/justified_gallery_controller_spec.js @@ -0,0 +1,124 @@ +/** + * @jest-environment jsdom + */ + +import { Application } from '@hotwired/stimulus' +import justifiedGalleryController from 'controllers/justified_gallery_controller' +import justifiedLayout from 'justified-layout' + +require('./__mocks__/ResizeObserver') +jest.mock('justified-layout') +jest.useFakeTimers() + +describe('justified_gallery_controller', () => { + let galleryContainer + let galleryItemTargetOne + const galleryItemOneDimensions = { + width: 100, + height: 150 + } + let galleryItemTargetTwo + const galleryItemTwoDimensions = { + width: 200, + height: 250 + } + const margin = 10 + + beforeAll(() => { + const application = Application.start() + application.register('justified-gallery', justifiedGalleryController) + }) + + beforeEach(() => { + jest.spyOn(window, 'requestAnimationFrame').mockImplementation(cb => cb()) + justifiedLayout.mockImplementation(() => { + return { + boxes: [ + { width: 20, height: 30 }, + { width: 40, height: 50 } + ] + } + }) + document.body.innerHTML = ` + + ` + galleryContainer = document.querySelector('.gallery-container') + const galleryItemTargets = document.getElementsByClassName('gallery-item') + galleryItemTargetOne = galleryItemTargets[0] + galleryItemTargetTwo = galleryItemTargets[1] + galleryItemTargetOne.addEventListener('load', () => { + jest.spyOn(galleryItemTargetOne, 'naturalHeight', 'get').mockReturnValue(1) + }) + galleryItemTargetTwo.addEventListener('load', () => { + jest.spyOn(galleryItemTargetTwo, 'naturalHeight', 'get').mockReturnValue(1) + }) + }) + + afterEach(() => { + jest.clearAllMocks() + window.requestAnimationFrame.mockRestore() + }) + + describe('#imageLoaded', () => { + describe('not all images loaded', () => { + it('controller waiting', () => { + galleryItemTargetOne.dispatchEvent(new Event('load')) + jest.runOnlyPendingTimers() + expect(galleryItemTargetOne.classList).not.toContain('fade-in') + expect(galleryItemTargetTwo.classList).not.toContain('fade-in') + expect(justifiedLayout).not.toHaveBeenCalled() + }) + }) + + describe('all images loaded', () => { + it('fade in', () => { + galleryItemTargetOne.dispatchEvent(new Event('load')) + galleryItemTargetTwo.dispatchEvent(new Event('load')) + jest.runOnlyPendingTimers() + expect(galleryItemTargetOne.classList).toContain('fade-in') + expect(galleryItemTargetTwo.classList).toContain('fade-in') + }) + + it('galleryRendered Event', () => { + let eventTriggered = false + galleryContainer.addEventListener('galleryRendered', () => { + eventTriggered = true + }) + galleryItemTargetOne.dispatchEvent(new Event('load')) + galleryItemTargetTwo.dispatchEvent(new Event('load')) + jest.runOnlyPendingTimers() + expect(eventTriggered).toBe(true) + }) + + it('images justified', () => { + const containerWidth = 15 + const galleryContainer = document.querySelector('.gallery-container') + jest + .spyOn(galleryContainer, 'clientWidth', 'get') + .mockImplementation(() => containerWidth) + galleryItemTargetOne.dispatchEvent(new Event('load')) + galleryItemTargetTwo.dispatchEvent(new Event('load')) + jest.runOnlyPendingTimers() + + expect(justifiedLayout).toHaveBeenCalledWith([ + galleryItemOneDimensions, + galleryItemTwoDimensions + ], { + boxSpacing: { + horizontal: margin, + vertical: 0 + }, + containerWidth, + targetRowHeight: 295 + }) + expect(galleryItemTargetOne.width).toEqual(20) + expect(galleryItemTargetOne.height).toEqual(30) + expect(galleryItemTargetTwo.width).toEqual(40) + expect(galleryItemTargetTwo.height).toEqual(50) + }) + }) + }) +}) diff --git a/spec/javascript/nav_menu_controller_spec.js b/spec/javascript/nav_menu_controller_spec.js new file mode 100644 index 00000000..d49977fd --- /dev/null +++ b/spec/javascript/nav_menu_controller_spec.js @@ -0,0 +1,74 @@ +/** + * @jest-environment jsdom + */ + +import { Application } from '@hotwired/stimulus' +import navMenuController from 'controllers/nav_menu_controller' +const fs = require('fs') + +describe('nav_menu_controller', () => { + let navHamburger + let navSidebar + let navScreenCover + let navMenu + let applicationHTML + + beforeAll(done => { + const application = Application.start() + application.register('nav-menu', navMenuController) + fs.readFile('app/views/partials/_navigation.html.erb', 'utf8', (err, data) => { + if (err) throw new Error(err) + applicationHTML = data + done() + }) + }) + + beforeEach(() => { + document.body.innerHTML = applicationHTML + navMenu = document.querySelector('.nav-menu') + navHamburger = document.querySelector('.hamburger-container') + navSidebar = document.querySelector('.nav-sidebar') + navScreenCover = document.querySelector('.nav-screen-cover') + }) + + describe('#menuToggle - navHamburger click', () => { + it('toggles menu open status', () => { + expect(navMenu.getAttribute('data-nav-menu-open')).toEqual('false') + navHamburger.click() + expect(navMenu.getAttribute('data-nav-menu-open')).toEqual('true') + navHamburger.click() + expect(navMenu.getAttribute('data-nav-menu-open')).toEqual('false') + }) + + it("adds and removes navSidebar 'sidebar-open' class", () => { + navHamburger.click() + expect(navSidebar.classList).toContain('sidebar-open') + navHamburger.click() + expect(navSidebar.classList).not.toContain('sidebar-open') + }) + + it("adds and removes navHamburger 'clicked' class", () => { + navHamburger.click() + expect(navHamburger.classList).toContain('clicked') + navHamburger.click() + expect(navHamburger.classList).not.toContain('clicked') + }) + + it("removes and adds navHamburger 'reset-animation' class", () => { + navHamburger.click() + expect(navHamburger.classList).not.toContain('reset-animation') + navHamburger.click() + expect(navHamburger.classList).toContain('reset-animation') + }) + }) + + describe('#menuToggle - navScreenCover click', () => { + it('sets menu open status to false', () => { + navMenu.setAttribute('data-nav-menu-open', 'true') + navScreenCover.click() + expect(navMenu.getAttribute('data-nav-menu-open')).toEqual('false') + navScreenCover.click() + expect(navMenu.getAttribute('data-nav-menu-open')).toEqual('false') + }) + }) +}) diff --git a/spec/javascript/recaptcha_controller_spec.js b/spec/javascript/recaptcha_controller_spec.js new file mode 100644 index 00000000..115565a8 --- /dev/null +++ b/spec/javascript/recaptcha_controller_spec.js @@ -0,0 +1,77 @@ +/** + * @jest-environment jsdom + */ + +import { Application } from '@hotwired/stimulus' +import reCaptchaController from 'controllers/recaptcha_controller' + +describe('recaptcha_controller', () => { + let application + let mock + let createElementSpy + let appendChildSpy + let removeChildSpyHead + let mockGrecaptcha + + beforeAll(() => { + application = Application.start() + application.register('recaptcha', reCaptchaController) + }) + + afterEach(() => { + jest.restoreAllMocks() + document.innerHTML = '' + window.grecaptcha = null + }) + + describe('#connect', () => { + beforeEach(() => { + appendChildSpy = jest.spyOn(document.head, 'appendChild').mockReturnValue(null) + mock = { src: null, className: null } + createElementSpy = jest.spyOn(document, 'createElement').mockReturnValue(mock) + document.body.innerHTML = ` +
    + ` + }) + + it('grecaptcha not loaded', () => { + expect(createElementSpy).toHaveBeenCalledWith('script') + expect(mock.src).toEqual('https://www.google.com/recaptcha/api.js?onload=reCaptchaOnload&render=explicit') + expect(mock.className).toEqual('recaptcha-script') + expect(appendChildSpy).toHaveBeenCalled() + }) + }) + + describe('#connect', () => { + beforeEach(() => { + createElementSpy = jest.spyOn(document, 'createElement') + mockGrecaptcha = { + reset: jest.fn(), + render: jest.fn() + } + window.grecaptcha = mockGrecaptcha + document.body.innerHTML = ` +
    + ` + }) + + it('grecaptcha already loaded', () => { + expect(createElementSpy).not.toHaveBeenCalled() + expect(mockGrecaptcha.render).toHaveBeenCalled() + }) + }) + + describe('#disconnect', () => { + beforeEach(() => { + removeChildSpyHead = jest.spyOn(document.head, 'removeChild').mockReturnValue(null) + document.body.innerHTML = ` +
    + ` + }) + + it('removes reCaptchaScript from head on disconnect', () => { + application.unload('recaptcha') + expect(removeChildSpyHead).toHaveBeenCalled() + }) + }) +}) diff --git a/spec/javascript/slider_controller_spec.js b/spec/javascript/slider_controller_spec.js new file mode 100644 index 00000000..1b752c2a --- /dev/null +++ b/spec/javascript/slider_controller_spec.js @@ -0,0 +1,41 @@ +/** + * @jest-environment jsdom + */ + +import { Application } from '@hotwired/stimulus' +import sliderController from 'controllers/slider_controller' +import { fireEvent } from '@testing-library/dom' + +describe('slider_controller', () => { + let application + let sliderInput + let sliderValue + + beforeAll(() => { + application = Application.start() + application.register('slider', sliderController) + }) + + afterAll(() => { + jest.clearAllMocks() + application.unload('slider') + }) + + beforeEach(() => { + document.body.innerHTML = ` +
    + + 50 +
    + ` + sliderInput = document.querySelector('.slider-input') + sliderValue = document.querySelector('.slider-value') + }) + + describe('#update', () => { + it('Updates slider value entry on page', () => { + fireEvent.input(sliderInput, { target: { value: 25 } }) + expect(sliderValue.innerHTML).toEqual('25') + }) + }) +}) diff --git a/spec/javascript/touch_hover_tile_controller_spec.js b/spec/javascript/touch_hover_tile_controller_spec.js new file mode 100644 index 00000000..d352b7ff --- /dev/null +++ b/spec/javascript/touch_hover_tile_controller_spec.js @@ -0,0 +1,98 @@ +/** + * @jest-environment jsdom + */ + +import { Application } from '@hotwired/stimulus' +import touchHoverTileController from 'controllers/touch_hover_tile_controller' + +describe('touch_hover_tile_controller', () => { + let flexImageTileOne + let flexImageTileTwo + + beforeAll(() => { + const application = Application.start() + application.register('touch-hover-tile', touchHoverTileController) + }) + + beforeEach(() => { + document.body.innerHTML = ` + + + ` + const flexImageTiles = document.getElementsByClassName('flex-image-tile') + flexImageTileOne = flexImageTiles[0] + flexImageTileTwo = flexImageTiles[1] + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + describe('touch events', () => { + const touchTime = 249 + + it('touch < touchTime', () => { + jest.spyOn(Date, 'now').mockReturnValueOnce(new Date('2020-04-19T00:00:00.000')).mockReturnValue(new Date(`2020-04-19T00:00:00.${touchTime}`)) + flexImageTileOne.dispatchEvent(new Event('touchstart')) + flexImageTileOne.dispatchEvent(new Event('touchend')) + + expect(flexImageTileOne.querySelector('.cover-title').classList).toContain('hover') + }) + + it('touch >= touchTime', () => { + jest.spyOn(Date, 'now').mockReturnValueOnce(new Date('2020-04-19T00:00:00.000')).mockReturnValue(new Date(`2020-04-19T00:00:00.${touchTime + 1}`)) + flexImageTileOne.dispatchEvent(new Event('touchstart')) + flexImageTileOne.dispatchEvent(new Event('touchend')) + + expect(flexImageTileOne.querySelector('.cover-title').classList).not.toContain('hover') + }) + + it('other tile already being hovered on', () => { + let dateMock = jest.spyOn(Date, 'now').mockReturnValueOnce(new Date('2020-04-19T00:00:00.000')).mockReturnValue(new Date(`2020-04-19T00:00:00.${touchTime}`)) + flexImageTileOne.dispatchEvent(new Event('touchstart')) + flexImageTileOne.dispatchEvent(new Event('touchend')) + + dateMock.mockRestore() + dateMock = jest.spyOn(Date, 'now').mockReturnValueOnce(new Date('2020-04-19T00:00:00.000')).mockReturnValue(new Date(`2020-04-19T00:00:00.${touchTime}`)) + flexImageTileTwo.dispatchEvent(new Event('touchstart')) + flexImageTileTwo.dispatchEvent(new Event('touchend')) + + expect(flexImageTileTwo.querySelector('.cover-title').classList).toContain('hover') + expect(flexImageTileOne.querySelector('.cover-title').classList).not.toContain('hover') + }) + }) + + describe('mouse events', () => { + it('mouseenter event', () => { + flexImageTileOne.dispatchEvent(new Event('mouseenter')) + expect(flexImageTileOne.querySelector('.cover-title').classList).toContain('hover') + }) + + it('mouseleave event', () => { + flexImageTileOne.dispatchEvent(new Event('mouseenter')) + flexImageTileOne.dispatchEvent(new Event('mouseleave')) + expect(flexImageTileOne.querySelector('.cover-title').classList).not.toContain('hover') + }) + + it('other tile already being hovered on', () => { + flexImageTileOne.dispatchEvent(new Event('mouseenter')) + flexImageTileTwo.dispatchEvent(new Event('mouseenter')) + expect(flexImageTileOne.querySelector('.cover-title').classList).not.toContain('hover') + expect(flexImageTileTwo.querySelector('.cover-title').classList).toContain('hover') + }) + }) +}) diff --git a/spec/javascript/typed_header_controller_spec.js b/spec/javascript/typed_header_controller_spec.js new file mode 100644 index 00000000..766dcacd --- /dev/null +++ b/spec/javascript/typed_header_controller_spec.js @@ -0,0 +1,83 @@ +/** + * @jest-environment jsdom + */ + +import { Application } from '@hotwired/stimulus' +import Typed from 'typed.js' +import Cookies from 'js-cookie' +import typedHeaderController from 'controllers/typed_header_controller' +jest.mock('typed.js') +jest.mock('js-cookie') + +describe('typed_header_controller', () => { + let application + + const testHtml = ` +
    +
    +
    +

    + Typed header +

    +
    + +
    +

    + Typed subtitle +

    +
    + +
    +
    + ` + + beforeAll(() => { + application = Application.start() + application.register('typed-header', typedHeaderController) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + afterAll(() => { + application.unload('typed-header') + }) + + describe('first visit', () => { + beforeEach(() => { + document.body.innerHTML = testHtml + }) + + describe('#connect', () => { + it('typed object initialized', () => { + expect(Typed).toHaveBeenCalledTimes(1) + expect(Cookies.set).toHaveBeenCalledTimes(1) + }) + }) + + describe('#disconnect', () => { + beforeEach(() => { + document.body.innerHTML = 'test' + }) + + it('typed object removed', () => { + expect(Typed.mock.instances[0].destroy).toHaveBeenCalledTimes(1) + }) + }) + }) + + describe('second visit', () => { + beforeEach(() => { + Cookies.get.mockImplementation(() => { + return 'true' + }) + document.body.innerHTML = testHtml + }) + + it('strings filled if already typed', () => { + expect(Typed).toHaveBeenCalledTimes(0) + expect(Cookies.set).toHaveBeenCalledTimes(1) + }) + }) +}) diff --git a/spec/jobs/new_contact_message_job_spec.rb b/spec/jobs/new_contact_message_job_spec.rb new file mode 100644 index 00000000..c68663fc --- /dev/null +++ b/spec/jobs/new_contact_message_job_spec.rb @@ -0,0 +1,14 @@ +RSpec.describe NewContactMessageJob, type: :job do + let(:about) { create(:about) } + let(:contact_message) { build_stubbed(:contact_message) } + let(:mock_contact_message_mailer) { double(:ContactMessageMailer, deliver_now: nil) } + + it 'Contact message sent' do + about + expect(ContactMessageMailer).to receive(:with).twice.and_return(mock_contact_message_mailer) + expect(mock_contact_message_mailer).to receive(:confirmation).and_return(mock_contact_message_mailer) + expect(mock_contact_message_mailer).to receive(:contact_message).and_return(mock_contact_message_mailer) + + NewContactMessageJob.perform_now(contact_message: contact_message) + end +end diff --git a/spec/jobs/password_reset_job_spec.rb b/spec/jobs/password_reset_job_spec.rb new file mode 100644 index 00000000..fe9f3d8f --- /dev/null +++ b/spec/jobs/password_reset_job_spec.rb @@ -0,0 +1,15 @@ +RSpec.describe PasswordResetJob, type: :job do + let(:user) { create(:user) } + + it 'If user exists, password reset email sent' do + user + expect_any_instance_of(User).to receive(:send_password_reset_email!) + PasswordResetJob.perform_now(email: user.email) + end + + it 'If user does not exist, no email sent' do + user + expect_any_instance_of(User).not_to receive(:send_password_reset_email!) + PasswordResetJob.perform_now(email: 'idontexist@example.com') + end +end diff --git a/spec/jobs/password_updated_job_spec.rb b/spec/jobs/password_updated_job_spec.rb new file mode 100644 index 00000000..57cd5a4b --- /dev/null +++ b/spec/jobs/password_updated_job_spec.rb @@ -0,0 +1,8 @@ +RSpec.describe PasswordUpdatedJob, type: :job do + let(:user) { build_stubbed(:user) } + + it 'Password reset email sent' do + expect(user).to receive(:send_password_updated_email!) + PasswordUpdatedJob.perform_now(user: user) + end +end diff --git a/spec/jobs/process_image_variant_job_spec.rb b/spec/jobs/process_image_variant_job_spec.rb new file mode 100644 index 00000000..32f7fade --- /dev/null +++ b/spec/jobs/process_image_variant_job_spec.rb @@ -0,0 +1,16 @@ +RSpec.describe ProcessImageVariantJob, type: :job do + let(:image_file_upload) { fixture_file_upload(Rails.root.join('spec/files/sample_image.jpg'), 'image/jpeg') } + let(:image) { create(:gallery_image, image_file: image_file_upload) } + + before(:each) do + allow_any_instance_of(Image).to receive(:process_new_image_attachment).and_return(true) + end + + it 'Password reset email sent' do + variant_details = { resize_to_limit: [100, 100] } + mock_variant = double(:variant, processed: nil) + expect(image.image_file).to receive(:variant).with(variant_details).and_return(mock_variant) + expect(mock_variant).to receive(:processed) + ProcessImageVariantJob.perform_now(model: image, variant: variant_details) + end +end \ No newline at end of file diff --git a/spec/jobs/render_code_snippet_job_spec.rb b/spec/jobs/render_code_snippet_job_spec.rb new file mode 100644 index 00000000..4c6af570 --- /dev/null +++ b/spec/jobs/render_code_snippet_job_spec.rb @@ -0,0 +1,19 @@ +RSpec.describe RenderCodeSnippetJob, type: :job do + let(:code_snippet) { build_stubbed(:code_snippet) } + + it 'code snippet image rendered and attached' do + mock_attachment = double(:attachment) + mock_code_snippet_image = double(:code_snippet_image, image_file: mock_attachment) + allow(code_snippet).to receive(:create_code_snippet_image).and_return(mock_code_snippet_image) + + expect(RenderCodeSnippetService).to receive(:render_and_attach_image) + .with( + snippet_text: code_snippet.snippet, + syntax_extension: code_snippet.extension, + attachment: mock_attachment, + start_line: 0, + end_line: 12) + + RenderCodeSnippetJob.perform_now(model: code_snippet.create_code_snippet_image, snippet: code_snippet.snippet, extension: code_snippet.extension) + end +end \ No newline at end of file diff --git a/spec/mailers/contact_message_mailer_spec.rb b/spec/mailers/contact_message_mailer_spec.rb new file mode 100644 index 00000000..11664d8d --- /dev/null +++ b/spec/mailers/contact_message_mailer_spec.rb @@ -0,0 +1,94 @@ +RSpec.describe ContactMessageMailer, type: :mailer do + include DateHelper + + let(:about) { create(:about) } + let(:user) { build_stubbed(:user) } + let(:contact_message) { build_stubbed(:contact_message, user: user) } + let(:header_image) { create(:header_image, site_setting: create(:site_setting)) } + let(:image_name) { 'image_mock.jpg' } + let(:image_attachment) { fixture_file_upload(Rails.root.join("spec/files/#{image_name}"), 'image/png') } + + before(:each) do + about + user + header_image + end + + describe '#contact_message' do + let(:mail) { ContactMessageMailer.with(contact_message: contact_message).contact_message } + + it 'renders the receivers email' do + expect(mail.to).to eql([about.contact_email]) + end + + it 'renders the sender email correctly' do + expect(mail.from).to eql([Rails.configuration.email_no_reply_address]) + end + + it 'renders the reply to email' do + expect(mail.reply_to).to eql([contact_message.email]) + end + + it 'renders the subject' do + expect(mail.subject).to eql("New contact message: #{contact_message.subject}") + end + + it 'renders greeting in email' do + expect(mail.body.encoded).to match(/Hi[\w\W]+#{about.name}/) + end + + it 'renders intro message' do + expect(mail.body.encoded).to match(contact_message.from) + end + + it 'renders message timestamp' do + expect(mail.body.encoded).to match(full_date_and_time(contact_message.created_at)) + end + + it 'renders message content' do + expect(mail.body.encoded).to match(contact_message.content) + end + + it 'Renders attached header image path' do + header_image.image_file.attach(image_attachment) + expect(mail.body.encoded).to match(image_name) + end + end + + describe '#confirmation' do + let(:mail) { ContactMessageMailer.with(contact_message: contact_message).confirmation } + + it 'renders the receivers email' do + expect(mail.to).to eql([contact_message.email]) + end + + it 'renders the sender email correctly' do + expect(mail.from).to eql([Rails.configuration.email_no_reply_address]) + end + + it 'renders the subject' do + expect(mail.subject).to eql("Contact message sent: #{contact_message.subject}") + end + + it 'renders greeting in email' do + expect(mail.body.encoded).to match(/Hi[\w\W]+#{contact_message.from}/) + end + + it 'renders intro message' do + expect(mail.body.encoded).to match(about.name) + end + + it 'renders message timestamp' do + expect(mail.body.encoded).to match(full_date_and_time(contact_message.created_at)) + end + + it 'renders message content' do + expect(mail.body.encoded).to match(contact_message.content) + end + + it 'Renders attached header image path' do + header_image.image_file.attach(image_attachment) + expect(mail.body.encoded).to match(image_name) + end + end +end \ No newline at end of file diff --git a/spec/mailers/password_mailer_spec.rb b/spec/mailers/password_mailer_spec.rb new file mode 100644 index 00000000..32cd333c --- /dev/null +++ b/spec/mailers/password_mailer_spec.rb @@ -0,0 +1,96 @@ +RSpec.describe PasswordMailer, type: :mailer do + let(:user) { build_stubbed(:user) } + let(:header_image) { create(:header_image, site_setting: create(:site_setting)) } + let(:image_name) { 'image_mock.jpg' } + let(:image_attachment) { fixture_file_upload(Rails.root.join("spec/files/#{image_name}"), 'image/png') } + + before(:each) do + header_image + end + + describe '#password_reset_email' do + let(:mail) { PasswordMailer.with(user: user).password_reset_email } + + it 'Renders the receivers email' do + expect(mail.to).to eql([user.email]) + end + + it 'Renders the sender email correctly' do + expect(mail.from).to eql([Rails.configuration.email_no_reply_address]) + end + + it 'Renders the subject' do + expect(mail.subject).to eql("Password Reset: #{user.email}") + end + + it 'Assigns greeting in email' do + expect(mail.body.encoded).to match(/Hi[\w\W]+test/) + end + + it 'Assigns adds password reset url' do + user.password_reset_token = 'hashed-token' + expect(mail.body.encoded).to include(reset_password_url(reset_token: 'hashed-token')) + end + + it 'Provides contact email' do + expect(mail.body.encoded).to match("please contact #{Rails.configuration.email_default_address}") + end + + it 'Renders signoff with company name' do + expect(mail.body.encoded).to match(/Thanks[\w\W]+
    [\w\W]+
    [\w\W]+#{Rails.configuration.email_default_name}/) + end + + it 'Renders attached header image path' do + header_image.image_file.attach(image_attachment) + expect(mail.body.encoded).to match(image_name) + end + + it 'Renders default header image path' do + expect(mail.body.encoded).to match(/default_header_image-\w+.jpg/) + end + end + + describe '#password_updated_email' do + let(:mail) { PasswordMailer.with(user: user).password_updated_email } + + it 'Renders the receivers email' do + expect(mail.to).to eql([user.email]) + end + + it 'Renders the sender email correctly' do + expect(mail.from).to eql([Rails.configuration.email_no_reply_address]) + end + + it 'Renders the subject' do + expect(mail.subject).to eql("Your Password Has Been Updated: #{user.email}") + end + + it 'Assigns greeting in email' do + expect(mail.body.encoded).to match(/Hi[\w\W]+test/) + end + + it 'Provides contact email' do + expect(mail.body.encoded).to match("please contact #{Rails.configuration.email_default_address}") + end + + it 'Renders signoff with company name' do + expect(mail.body.encoded).to match(/Thanks[\w\W]+
    [\w\W]+
    [\w\W]+#{Rails.configuration.email_default_name}/) + end + + it 'Renders time at which account was updated' do + travel_to Time.zone.local(2020, 04, 19, 12, 10, 00) + another_user = build_stubbed(:user) + mail = PasswordMailer.with(user: another_user).password_updated_email + expect(mail.body.encoded).to match('Your password was updated on: 12:10 19-04-2020') + end + + it 'Renders attached header image path' do + header_image.image_file.attach(image_attachment) + expect(mail.body.encoded).to match(image_name) + end + + it 'Renders default header image path' do + expect(mail.body.encoded).to match(/default_header_image-\w+.jpg/) + end + end +end \ No newline at end of file diff --git a/spec/mailers/previews/password_mailer_preview.rb b/spec/mailers/previews/password_mailer_preview.rb new file mode 100644 index 00000000..2c8a2491 --- /dev/null +++ b/spec/mailers/previews/password_mailer_preview.rb @@ -0,0 +1,12 @@ +# Preview all emails at http://localhost:3000/rails/mailers/password_mailer +class PasswordMailerPreview < ActionMailer::Preview + def password_reset_email + @user = User.find_by(username: 'admin') + PasswordMailer.with(user: @user).password_reset_email + end + + def password_updated + @user = User.find_by(username: 'admin') + PasswordMailer.with(user: @user).password_updated_email + end +end diff --git a/spec/models/about_spec.rb b/spec/models/about_spec.rb new file mode 100644 index 00000000..7be2a6f2 --- /dev/null +++ b/spec/models/about_spec.rb @@ -0,0 +1,107 @@ +# == Schema Information +# +# Table name: abouts +# +# id :bigint not null, primary key +# about_me :text +# contact_email :string not null +# github_link :string +# linkedin_link :string +# location :string not null +# name :string not null +# section_title :string +# created_at :datetime not null +# updated_at :datetime not null +# + +RSpec.describe About, type: :model do + let(:image_file_upload) { fixture_file_upload(Rails.root.join('spec/files/sample_image.jpg'), 'image/jpeg') } + let(:about) { create(:about) } + + context 'validations' do + describe 'linkedin_link' do + it 'is link' do + about.linkedin_link = 'not a link' + expect(about).to_not be_valid + expect(about.errors.messages[:linkedin_link]).to eq ['Linkedin link is not valid'] + about.linkedin_link = '' + expect(about).to be_valid + end + end + + describe 'github_link' do + it 'is link' do + about.github_link = 'not a link' + expect(about).to_not be_valid + expect(about.errors.messages[:github_link]).to eq ['Github link is not valid'] + about.github_link = '' + expect(about).to be_valid + end + end + + describe 'name' do + it 'format' do + about.name = nil + expect(about).to_not be_valid + about.name = '' + expect(about).to_not be_valid + expect(about.errors.messages[:name]).to eq ['Name cannot be blank'] + about.name = 'a' + expect(about).to be_valid + end + end + + describe 'location' do + it 'format' do + about.location = nil + expect(about).to_not be_valid + about.location = '' + expect(about).to_not be_valid + expect(about.errors.messages[:location]).to eq ['Location cannot be blank'] + about.location = 'a' + expect(about).to be_valid + end + end + + describe 'contact_email' do + it 'format' do + about.contact_email = nil + expect(about).to_not be_valid + about.contact_email = 'admin@' + expect(about).to_not be_valid + expect(about.errors.messages[:contact_email]).to eq ['Email must be valid format'] + about.contact_email = 'admin@example.com' + expect(about).to be_valid + end + end + end + + describe '#change_messages' do + it 'no changes' do + about.reload + expect(about.change_messages).to eq([]) + end + + it 'attribute changes' do + about.update(name: 'new name', about_me: 'new description') + expect(about.change_messages).to include('Name updated!') + expect(about.change_messages).to include('About me updated!') + end + + it 'attachment changes' do + about.update(profile_image_attributes: { + image_file: image_file_upload + }) + expect(about.change_messages).to eq(['Profile image updated!']) + end + end + + describe '#footer_links' do + it 'array of footer links' do + expect(about.footer_links).to eq({ + github_link: about.github_link, + linkedin_link: about.linkedin_link + }) + end + end +end diff --git a/spec/models/code_snippet_image_spec.rb b/spec/models/code_snippet_image_spec.rb new file mode 100644 index 00000000..89582fcf --- /dev/null +++ b/spec/models/code_snippet_image_spec.rb @@ -0,0 +1,30 @@ +# == Schema Information +# +# Table name: code_snippet_images +# +# id :bigint not null, primary key +# description :string not null +# created_at :datetime not null +# updated_at :datetime not null +# code_snippet_id :bigint not null +# +# Indexes +# +# index_code_snippet_images_on_code_snippet_id (code_snippet_id) +# +# Foreign Keys +# +# fk_rails_... (code_snippet_id => code_snippets.id) +# +RSpec.describe CodeSnippetImage, type: :model do + subject { create(:code_snippet_image) } + + describe 'before_validation' do + describe '#set_defaults' do + it 'no description' do + code_snippet_image = create(:code_snippet_image, description: nil) + expect(code_snippet_image.description).to eq('code-snippet-image') + end + end + end +end diff --git a/spec/models/code_snippet_spec.rb b/spec/models/code_snippet_spec.rb new file mode 100644 index 00000000..25cd7c73 --- /dev/null +++ b/spec/models/code_snippet_spec.rb @@ -0,0 +1,104 @@ +# == Schema Information +# +# Table name: code_snippets +# +# id :bigint not null, primary key +# extension :string not null +# overview :string not null +# snippet :text not null +# text :text +# title :string not null +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint +# +# Indexes +# +# index_code_snippets_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# +RSpec.describe CodeSnippet, type: :model do + subject { build_stubbed(:code_snippet) } + + describe 'validations' do + describe 'title' do + it 'format' do + subject.title = nil + expect(subject).to_not be_valid + subject.title = '' + expect(subject).to_not be_valid + subject.title = 'a' * 61 + expect(subject).to_not be_valid + expect(subject.errors.messages[:title]).to eq ['Title length must be between 1 and 60 charaters'] + subject.title = 'a' + expect(subject).to be_valid + subject.title = 'a' * 60 + expect(subject).to be_valid + end + end + + describe 'overview' do + it 'format' do + subject.overview = nil + expect(subject).to_not be_valid + subject.overview = '' + expect(subject).to_not be_valid + subject.overview = 'a' * 161 + expect(subject).to_not be_valid + expect(subject.errors.messages[:overview]).to eq ['Overview length must be between 1 and 160 charaters'] + subject.overview = 'a' + expect(subject).to be_valid + subject.overview = 'a' * 160 + expect(subject).to be_valid + end + end + + describe 'snippet' do + it 'format' do + subject.snippet = nil + expect(subject).to_not be_valid + subject.snippet = '' + expect(subject).to_not be_valid + expect(subject.errors.messages[:snippet]).to eq ['Code snippet cannot be blank'] + subject.snippet = 'a' + expect(subject).to be_valid + end + end + + describe 'extension' do + it 'format' do + subject.extension = nil + expect(subject).to_not be_valid + subject.extension = '' + expect(subject).to_not be_valid + subject.extension = '.a' + expect(subject).to_not be_valid + expect(subject.errors.messages[:extension]).to eq ['Code must be valid file extension'] + subject.extension = 'a' + expect(subject).to be_valid + end + end + end + + describe 'after_commit' do + describe '#render_snippet_image' do + it 'after model commited' do + code_snippet = create(:code_snippet) + mock_code_snippet_image = create(:code_snippet_image, code_snippet: code_snippet) + allow(code_snippet).to receive(:create_code_snippet_image).and_return(mock_code_snippet_image) + code_snippet.update(snippet: 'new snippet') + expect(RenderCodeSnippetJob).to have_been_enqueued.with(model: mock_code_snippet_image, snippet: 'new snippet', extension: code_snippet.extension) + end + end + end + + describe 'to_param' do + it 'human title' do + code_snippet = create(:code_snippet) + expect(code_snippet.to_param).to eq("#{code_snippet.id}-#{code_snippet.title.parameterize}") + end + end +end diff --git a/spec/models/contact_message_spec.rb b/spec/models/contact_message_spec.rb new file mode 100644 index 00000000..50a42e22 --- /dev/null +++ b/spec/models/contact_message_spec.rb @@ -0,0 +1,102 @@ +# == Schema Information +# +# Table name: contact_messages +# +# id :bigint not null, primary key +# content :text not null +# email :string not null +# from :string not null +# subject :string not null +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint +# +# Indexes +# +# index_contact_messages_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# + +RSpec.describe ContactMessage, type: :model do + subject { build_stubbed(:contact_message) } + + describe 'validations' do + describe 'from' do + it 'format' do + subject.from = nil + expect(subject).to_not be_valid + subject.from = '' + expect(subject).to_not be_valid + expect(subject.errors.messages[:from]).to eq(['From field cannot be blank']) + subject.from = 'a' + expect(subject).to be_valid + end + end + + describe 'email' do + it 'format' do + subject.email = nil + expect(subject).to_not be_valid + subject.email = 'test@' + expect(subject).to_not be_valid + expect(subject.errors.messages[:email]).to eq(['Email must be valid']) + subject.email = 'test@example.com' + expect(subject).to be_valid + end + end + + describe 'subject' do + it 'format' do + subject.subject = nil + expect(subject).to_not be_valid + subject.subject = '' + expect(subject).to_not be_valid + expect(subject.errors.messages[:subject]).to eq(['Subject cannot be blank']) + subject.subject = 'a' + expect(subject).to be_valid + end + end + + describe 'content' do + it 'format' do + subject.content = nil + expect(subject).to_not be_valid + subject.content = '' + expect(subject).to_not be_valid + expect(subject.errors.messages[:content]).to eq(['Content cannot be blank']) + subject.content = 'a' + expect(subject).to be_valid + end + end + end + + describe 'before_validate' do + describe 'sanitize_inputs' do + it 'sanitizes attributes for email' do + contact_message = create(:contact_message) + contact_message.from = 'clean' + contact_message.subject = 'clean' + contact_message.email = 'clean@example.com' + contact_message.content = 'clean' + contact_message.save + expect(contact_message.from).to eq('clean') + expect(contact_message.subject).to eq('clean') + expect(contact_message.email).to eq('clean@example.com') + expect(contact_message.content).to eq('clean') + end + end + end + + describe 'after_commit' do + describe '#send_contact_message' do + it 'generates new job' do + message = build(:contact_message) + expect(NewContactMessageJob).to receive(:perform_later).with(contact_message: message) + message.save + end + end + end +end diff --git a/spec/models/cover_image_spec.rb b/spec/models/cover_image_spec.rb new file mode 100644 index 00000000..4607156d --- /dev/null +++ b/spec/models/cover_image_spec.rb @@ -0,0 +1,42 @@ +# == Schema Information +# +# Table name: cover_images +# +# id :bigint not null, primary key +# description :string +# link :string +# x_loc :integer default(50) +# y_loc :integer default(50) +# created_at :datetime not null +# updated_at :datetime not null +# site_setting_id :bigint +# +# Indexes +# +# index_cover_images_on_site_setting_id (site_setting_id) +# +# Foreign Keys +# +# fk_rails_... (site_setting_id => site_settings.id) +# +RSpec.describe CoverImage, type: :model do + subject { create(:cover_image) } + + describe '#default_image' do + it 'default value' do + expect(subject.default_image).to eq('default_images/default_cover_image.jpg') + end + end + + describe '#x_dim' do + it 'default_value' do + expect(subject.x_dim).to eq(CoverImage::X_DIM) + end + end + + describe '#y_dim' do + it 'default_value' do + expect(subject.y_dim).to eq(CoverImage::Y_DIM) + end + end +end diff --git a/spec/models/gallery_image_spec.rb b/spec/models/gallery_image_spec.rb new file mode 100644 index 00000000..6b8adce1 --- /dev/null +++ b/spec/models/gallery_image_spec.rb @@ -0,0 +1,144 @@ +# == Schema Information +# +# Table name: gallery_images +# +# id :bigint not null, primary key +# date_taken :datetime +# description :string not null +# latitude :decimal(10, 6) +# longitude :decimal(10, 6) +# title :string +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint not null +# +# Indexes +# +# index_gallery_images_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# + +RSpec.describe GalleryImage, type: :model do + subject { create(:gallery_image) } + + let(:image_file_upload) { fixture_file_upload(Rails.root.join('spec/files/sample_image.jpg'), 'image/jpeg') } + + context 'validations' do + describe 'date_taken' do + it 'default value' do + travel_to Time.zone.local(2020, 04, 19, 00, 00, 00) + subject.date_taken = nil + expect(subject).to be_valid + subject.save + expect(subject.date_taken).to eq(DateTime.new(2020, 04, 19, 0, 0, 0)) + end + end + + describe 'latitude' do + it 'type' do + subject.latitude = 'not a number' + expect(subject).to_not be_valid + expect(subject.errors.messages[:latitude].first).to eq('Latitude must be a (10, 6) decimal') + end + + it 'format' do + subject.latitude = 1179.999999 + expect(subject).to_not be_valid + expect(subject.errors.messages[:latitude].first).to eq('Latitude must be a (10, 6) decimal') + subject.latitude = nil + expect(subject).to be_valid + subject.latitude = 179.999999 + expect(subject).to be_valid + end + end + + describe 'longitude' do + it 'type' do + subject.longitude = 'not a number' + expect(subject).to_not be_valid + expect(subject.errors.messages[:longitude].first).to eq('Longitude must be a (10, 6) decimal') + end + + it 'format' do + subject.longitude = 1179.999999 + expect(subject).to_not be_valid + expect(subject.errors.messages[:longitude].first).to eq('Longitude must be a (10, 6) decimal') + subject.longitude = nil + expect(subject).to be_valid + subject.longitude = 179.999999 + expect(subject).to be_valid + end + end + end + + describe '#variant_sizes' do + it 'default_value' do + expect(subject.variant_sizes).to eq(GalleryImage::VARIANT_SIZES) + end + end + + describe 'before_validation' do + describe '#set_defaults' do + it 'no description' do + gallery_image = create(:gallery_image, description: nil) + expect(gallery_image.description).to eq('gallery-image') + end + end + + describe '#extract_meta_data' do + it 'image already processed' do + allow(image_file_upload).to receive(:instance_of?).with(ActionDispatch::Http::UploadedFile).and_return(false) + allow(subject).to receive(:process_new_image_attachment).and_throw(:abort) + expect(MiniMagick::Image).not_to receive(:new) + subject.image_file = image_file_upload + subject.save + end + + describe 'image not yet processed' do + before(:each) do + allow(image_file_upload).to receive(:instance_of?).with(ActionDispatch::Http::UploadedFile).and_return(true) + mini_magick_mock = double(:mini_magick, exif: { + 'DateTimeOriginal' => '2020:04:19 00:00', + 'GPSLatitude' => '1, 60, 3600', + 'GPSLatitudeRef' => 'N', + 'GPSLongitude' => '1, 60, 3600', + 'GPSLongitudeRef' => 'W' + }) + allow(MiniMagick::Image).to receive(:new).and_return(mini_magick_mock) + allow(subject).to receive(:process_new_image_attachment).and_throw(:abort) + subject.image_file = image_file_upload + end + + it 'date_taken attribute missing' do + subject.date_taken = nil + subject.save + expect(subject.date_taken).to eq(DateTime.new(2020, 04, 19)) + end + + it 'date_taken error extracting' do + allow(DateTime).to receive(:parse).and_throw('error') + subject.date_taken = nil + expect(subject.save).to eq(false) + end + + it 'extract gps coordinates attribute missing' do + subject.latitude = nil + subject.longitude = nil + subject.save + expect(subject.latitude).to eq(3) + expect(subject.longitude).to eq(-3) + end + + it 'extract gps coordinates error' do + allow_any_instance_of(GalleryImage).to receive(:parse_exif_dms).and_throw('error') + subject.latitude = nil + subject.longitude = nil + expect(subject).to be_valid + end + end + end + end +end diff --git a/spec/models/header_image_spec.rb b/spec/models/header_image_spec.rb new file mode 100644 index 00000000..7b5a203d --- /dev/null +++ b/spec/models/header_image_spec.rb @@ -0,0 +1,29 @@ +# == Schema Information +# +# Table name: header_images +# +# id :bigint not null, primary key +# description :string +# x_loc :integer default(50) +# y_loc :integer default(50) +# created_at :datetime not null +# updated_at :datetime not null +# site_setting_id :bigint +# +# Indexes +# +# index_header_images_on_site_setting_id (site_setting_id) +# +# Foreign Keys +# +# fk_rails_... (site_setting_id => site_settings.id) +# +RSpec.describe HeaderImage, type: :model do + subject { create(:header_image) } + + describe '#default_image' do + it 'default value' do + expect(subject.default_image).to eq('default_images/default_header_image.jpg') + end + end +end diff --git a/spec/models/image_spec.rb b/spec/models/image_spec.rb new file mode 100644 index 00000000..98248a28 --- /dev/null +++ b/spec/models/image_spec.rb @@ -0,0 +1,157 @@ +RSpec.describe Image, type: :model do + subject { create(:gallery_image) } + let(:image_jpg_path) { Rails.root.join('spec/files/sample_image.jpg') } + let(:image_file_upload) { fixture_file_upload(image_jpg_path, 'image/jpeg') } + + describe 'validations' do + subject { create(:cover_image) } + + describe 'description validations' do + it 'presence' do + subject.description = nil + expect(subject).to_not be_valid + expect(subject.errors.messages[:description].first).to eq('Description cannot be blank') + end + + it 'format' do + subject.description = '' + expect(subject).to_not be_valid + expect(subject.errors.messages[:description].first).to eq('Description cannot be blank') + end + end + end + + describe '#change_messages' do + it 'no changes' do + subject.reload + expect(subject.change_messages).to eq([]) + end + + it 'attribute changes' do + subject.image_file = image_file_upload + subject.description = 'new description' + subject.save + expect(subject.change_messages).to eq(["#{subject.description.humanize} description updated!", "#{subject.description.humanize} updated!"]) + end + end + + describe '.valid?' do + it 'jpg type' do + mock_jpg_image = double(:image, mime_type: 'image/jpeg', valid?: true) + allow(MiniMagick::Image).to receive(:new).and_return(mock_jpg_image) + expect(Image.valid?('jpg image path')).to eq(true) + end + + it 'png type' do + mock_png_image = double(:image, mime_type: 'image/png', valid?: true) + allow(MiniMagick::Image).to receive(:new).and_return(mock_png_image) + expect(Image.valid?('png image path')).to eq(true) + end + + it 'invalid type' do + mock_gif_image = double(:image, mime_type: 'image/gif', valid?: true) + allow(MiniMagick::Image).to receive(:new).and_return(mock_gif_image) + expect(Image.valid?('invalid image path')).to eq(false) + end + + it 'content' do + mock_invalid_image = double(:image, mime_type: 'image/jpeg', valid?: false) + allow(MiniMagick::Image).to receive(:new).and_return(mock_invalid_image) + expect(Image.valid?('invalid image path')).to eq(false) + end + end + + describe '.image_processing_pipeline' do + it 'no block passed' do + image_path = 'test_image_path.jpg' + mock_pipeline = double(:image_processing_pipeline) + expect(ImageProcessing::MiniMagick).to receive(:source).with(image_path).and_return(mock_pipeline) + expect(mock_pipeline).to receive_message_chain(:strip, :saver, :convert, :call) + Image.image_processing_pipeline(image_path: image_path) + end + + it 'block passed' do + image_path = 'test_image_path.jpg' + mock_pipeline = double(:image_processing_pipeline) + allow(ImageProcessing::MiniMagick).to receive(:source).with(image_path).and_return(mock_pipeline) + allow(mock_pipeline).to receive_message_chain(:strip, :saver, :convert, :call) + expect(mock_pipeline).to receive(:pipeline_method).and_return(mock_pipeline) + Image.image_processing_pipeline(image_path: image_path, &:pipeline_method) + end + + it 'quality defined' do + image_path = 'test_image_path.jpg' + mock_pipeline = double(:image_processing_pipeline) + allow(ImageProcessing::MiniMagick).to receive(:source).with(image_path).and_return(mock_pipeline) + allow(mock_pipeline).to receive(:strip).and_return(mock_pipeline) + expect(mock_pipeline).to receive(:saver).with(quality: 50).and_return(mock_pipeline) + allow(mock_pipeline).to receive_message_chain(:convert, :call) + Image.image_processing_pipeline(image_path: image_path, quality: 50) + end + end + + describe 'before_save' do + describe '#process_image_attachment' do + before(:each) do + subject.image_file = image_file_upload + end + + it 'image already processed' do + allow(image_file_upload).to receive(:instance_of?).with(ActionDispatch::Http::UploadedFile).and_return(false) + expect(subject).not_to receive(:process_and_reattach_image) + subject.save + end + + describe 'image not yet processed' do + before(:each) do + allow(image_file_upload).to receive(:instance_of?).with(ActionDispatch::Http::UploadedFile).and_return(true) + end + + it 'validate image' do + expect(Image).to receive(:valid?).and_return(false) + expect(subject.save).to eq(false) + expect(subject.errors.messages[:base]).to eq ['Image invalid, please upload a jpeg or png file!'] + end + + it 'image processed' do + mock_image_file = double(:image_file) + allow(Image).to receive(:valid?).and_return(true) + expect(subject).to receive(:process_image).and_return(image_jpg_path) + allow(subject).to receive(:image_file).and_return(mock_image_file) + expect(mock_image_file).to receive(:attach) + subject.save + end + end + end + end + + describe 'after_commit' do + describe '#process_variants' do + before(:each) do + allow_any_instance_of(Image).to receive(:process_new_image_attachment).and_return(true) + end + + it 'no image attached' do + subject.description = 'attribute update' + expect { subject.save }.not_to have_enqueued_job(ProcessImageVariantJob) + end + + it 'no variant sizes' do + allow(subject).to receive(:variant_sizes).and_return(nil) + subject.image_file = image_file_upload + expect { subject.save }.not_to have_enqueued_job(ProcessImageVariantJob) + end + + it 'image attached with size to process' do + allow(subject).to receive(:variant_sizes).and_return({ + thumbnail: { resize_to_limit: [100, 100] }, + hero: { resize_to_limit: [100, 500] } + }) + subject.image_file = image_file_upload + subject.save + expect(ProcessImageVariantJob).to have_been_enqueued.with(model: subject, variant: { resize_to_limit: [100, 100] }) + expect(ProcessImageVariantJob).to have_been_enqueued.with(model: subject, variant: { resize_to_limit: [100, 500] }) + end + end + end +end diff --git a/spec/models/post_section_image_spec.rb b/spec/models/post_section_image_spec.rb new file mode 100644 index 00000000..d60fc69d --- /dev/null +++ b/spec/models/post_section_image_spec.rb @@ -0,0 +1,49 @@ +# == Schema Information +# +# Table name: post_section_images +# +# id :bigint not null, primary key +# description :string default("post-image"), not null +# title :string +# created_at :datetime not null +# updated_at :datetime not null +# post_section_id :bigint not null +# +# Indexes +# +# index_post_section_images_on_post_section_id (post_section_id) +# +# Foreign Keys +# +# fk_rails_... (post_section_id => post_sections.id) +# +require 'rails_helper' + +RSpec.describe PostSectionImage, type: :model do + subject { create(:post_section_image) } + + describe '#variant_sizes' do + it 'default_value' do + expect(subject.variant_sizes).to eq(PostSectionImage::VARIANT_SIZES) + end + end + + describe '#description' do + it 'if title present' do + subject.title = 'test title' + subject.description = 'test description' + subject.save + expect(subject.description).to eq(subject.title) + end + + it 'if title nil' do + subject.title = nil + expect{ subject.save }.not_to(change{ subject.description }) + end + + it 'if title blank' do + subject.title = '' + expect{ subject.save }.not_to(change{ subject.description }) + end + end +end diff --git a/spec/models/post_section_spec.rb b/spec/models/post_section_spec.rb new file mode 100644 index 00000000..863e30df --- /dev/null +++ b/spec/models/post_section_spec.rb @@ -0,0 +1,34 @@ +# == Schema Information +# +# Table name: post_sections +# +# id :bigint not null, primary key +# order :integer default(0), not null +# text :text +# created_at :datetime not null +# updated_at :datetime not null +# post_id :bigint +# +# Indexes +# +# index_post_sections_on_post_id (post_id) +# +# Foreign Keys +# +# fk_rails_... (post_id => posts.id) +# +RSpec.describe PostSection, type: :model do + subject { create(:post_section) } + + context 'validations' do + describe 'order' do + it 'presence' do + subject.order = nil + expect(subject).to_not be_valid + expect(subject.errors.messages[:order].first).to eq('Post Section order cannot be nil') + subject.order = 1 + expect(subject).to be_valid + end + end + end +end diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb new file mode 100644 index 00000000..55af95cb --- /dev/null +++ b/spec/models/post_spec.rb @@ -0,0 +1,85 @@ +# == Schema Information +# +# Table name: posts +# +# id :bigint not null, primary key +# date_published :datetime not null +# overview :string not null +# title :string not null +# visible :boolean default(TRUE), not null +# created_at :datetime not null +# updated_at :datetime not null +# user_id :bigint not null +# +# Indexes +# +# index_posts_on_user_id (user_id) +# +# Foreign Keys +# +# fk_rails_... (user_id => users.id) +# + +RSpec.describe Post, type: :model do + let(:user) { create(:user) } + subject { create(:post) } + + context 'validations' do + describe 'date_published' do + it 'format' do + begin + subject.date_published = nil + subject.valid? + expect(subject).to_not be_valid + rescue StandardError => e + ap e.backtrace + end + + subject.date_published = 'not a date' + expect(subject).to_not be_valid + expect(subject.errors.messages[:date_published]).to eq ['Date published must be date'] + end + end + + describe 'overview' do + it 'format' do + subject.overview = nil + expect(subject).to_not be_valid + subject.overview = '' + expect(subject).to_not be_valid + expect(subject.errors.messages[:overview]).to eq ['Blog post overview cannot be empty'] + end + end + + describe 'title' do + it 'format' do + subject.title = nil + expect(subject).to_not be_valid + subject.title = '' + expect(subject).to_not be_valid + expect(subject.errors.messages[:title]).to eq ['Blog post title cannot be empty'] + end + end + + describe 'user associtation' do + it 'presence' do + subject.user = nil + expect(subject).to_not be_valid + end + end + + describe 'visibile' do + it 'presence' do + subject.visible = nil + expect(subject).to_not be_valid + end + end + end + + describe 'to_param' do + it 'human title' do + post = create(:post) + expect(post.to_param).to eq("#{post.id}-#{post.title.parameterize}") + end + end +end diff --git a/spec/models/profile_image_spec.rb b/spec/models/profile_image_spec.rb new file mode 100644 index 00000000..8f0059f9 --- /dev/null +++ b/spec/models/profile_image_spec.rb @@ -0,0 +1,43 @@ +# == Schema Information +# +# Table name: profile_images +# +# id :bigint not null, primary key +# description :string +# created_at :datetime not null +# updated_at :datetime not null +# about_id :bigint +# +# Indexes +# +# index_profile_images_on_about_id (about_id) +# +# Foreign Keys +# +# fk_rails_... (about_id => abouts.id) +# + +RSpec.describe ProfileImage, type: :model do + subject { create(:profile_image) } + + describe '#x_dim' do + it 'default_value' do + expect(subject.x_dim).to eq(ProfileImage::X_DIM) + end + end + + describe '#y_dim' do + it 'default_value' do + expect(subject.y_dim).to eq(ProfileImage::Y_DIM) + end + end + + describe 'before_validation' do + describe '#set_defaults' do + it 'no description' do + profile_image = create(:profile_image, description: nil) + expect(profile_image.description).to eq('about-me-profile-image') + end + end + end +end diff --git a/spec/models/project_image_spec.rb b/spec/models/project_image_spec.rb new file mode 100644 index 00000000..17478b83 --- /dev/null +++ b/spec/models/project_image_spec.rb @@ -0,0 +1,29 @@ +# == Schema Information +# +# Table name: project_images +# +# id :bigint not null, primary key +# description :string default("project-image"), not null +# order :integer +# title :string +# created_at :datetime not null +# updated_at :datetime not null +# project_id :bigint not null +# +# Indexes +# +# index_project_images_on_project_id (project_id) +# +# Foreign Keys +# +# fk_rails_... (project_id => projects.id) +# +RSpec.describe ProjectImage, type: :model do + subject { create(:project_image) } + + describe '#variant_sizes' do + it 'default_value' do + expect(subject.variant_sizes).to eq(ProjectImage::VARIANT_SIZES) + end + end +end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb new file mode 100644 index 00000000..6c75f59f --- /dev/null +++ b/spec/models/project_spec.rb @@ -0,0 +1,100 @@ +# == Schema Information +# +# Table name: projects +# +# id :bigint not null, primary key +# date :datetime not null +# github_link :string +# overview :text +# site_link :string +# title :string not null +# created_at :datetime not null +# updated_at :datetime not null +# + +RSpec.describe Project, type: :model do + subject { create(:project) } + + describe 'validation' do + describe 'title' do + it 'format' do + subject.title = nil + expect(subject).to_not be_valid + subject.title = '' + expect(subject).to_not be_valid + expect(subject.errors.messages[:title]).to eq ['Title cannot be empty'] + subject.title = 'a' + expect(subject).to be_valid + end + end + + describe 'date' do + it 'format' do + subject.date = nil + expect(subject).to_not be_valid + subject.date = 'not a date' + expect(subject).to_not be_valid + expect(subject.errors.messages[:date]).to eq ['Date format invalid'] + subject.date = DateTime.new(2020, 04, 19, 0, 0, 0) + expect(subject).to be_valid + end + end + + describe 'github_link' do + it 'is link' do + subject.github_link = 'not a link' + expect(subject).to_not be_valid + expect(subject.errors.messages[:github_link]).to eq ['Github link is not valid'] + subject.github_link = '' + expect(subject).to be_valid + end + end + + describe 'site_link' do + it 'is link' do + subject.site_link = 'not a link' + expect(subject).to_not be_valid + expect(subject.errors.messages[:site_link]).to eq ['Site link is not valid'] + subject.site_link = '' + expect(subject).to be_valid + end + end + end + + describe '#render_code_snippet' do + describe 'validations' do + describe 'snippet' do + it 'type' do + expect(subject.render_code_snippet(snippet: 1, extension: 'rb')).to be(false) + expect(subject.render_code_snippet(snippet: 'string', extension: 'rb')).to be(true) + end + + it 'format' do + expect(subject.render_code_snippet(snippet: '', extension: 'rb')).to be(false) + expect(subject.render_code_snippet(snippet: 'a', extension: 'rb')).to be(true) + end + end + + describe 'extension' do + it 'type' do + expect(subject.render_code_snippet(snippet: 'code', extension: 1)).to be(false) + expect(subject.render_code_snippet(snippet: 'code', extension: 'string')).to be(true) + end + + it 'format' do + expect(subject.render_code_snippet(snippet: 'code', extension: '.rb')).to be(false) + expect(subject.render_code_snippet(snippet: 'code', extension: 'rb')).to be(true) + end + end + end + + it 'valid inputs' do + project = create(:project) + mock_project_image = create(:project_image, project: project) + mock_collection = double(:collection, create: mock_project_image) + allow(project).to receive(:project_images).and_return(mock_collection) + project.render_code_snippet(snippet: 'code', extension: 'rb') + expect(RenderCodeSnippetJob).to have_been_enqueued.with(model: mock_project_image, snippet: 'code', extension: 'rb') + end + end +end diff --git a/spec/models/site_image_spec.rb b/spec/models/site_image_spec.rb new file mode 100644 index 00000000..f29ae9e4 --- /dev/null +++ b/spec/models/site_image_spec.rb @@ -0,0 +1,82 @@ +RSpec.describe SiteImage, type: :model do + subject { create(:cover_image) } + let(:image_jpg_path) { Rails.root.join('spec/files/sample_image.jpg') } + let(:image_file_upload) { fixture_file_upload(image_jpg_path, 'image/jpeg') } + + describe 'validations' do + describe 'x_loc' do + it 'presence' do + subject.x_loc = nil + expect(subject).to_not be_valid + end + + it 'format' do + subject.x_loc = -1 + expect(subject).to_not be_valid + expect(subject.errors.messages[:x_loc].first).to eq('X loc must be in range 0-100') + subject.x_loc = 0 + expect(subject).to be_valid + subject.x_loc = 101 + expect(subject).to_not be_valid + subject.x_loc = 100 + expect(subject).to be_valid + end + end + + describe 'y_loc' do + it 'presence' do + subject.y_loc = nil + expect(subject).to_not be_valid + end + + it 'format' do + subject.y_loc = -1 + expect(subject).to_not be_valid + expect(subject.errors.messages[:y_loc].first).to eq('Y loc must be in range 0-100') + subject.y_loc = 0 + expect(subject).to be_valid + subject.y_loc = 101 + expect(subject).to_not be_valid + subject.y_loc = 100 + expect(subject).to be_valid + end + end + end + + describe '#custom_style' do + it 'locations are default' do + expect(subject.custom_style).to eq(nil) + end + + it 'x_loc custom' do + subject.update(x_loc: 10) + expect(subject.custom_style).to eq('object-position: 10% 50%;') + end + + it 'y_loc custom' do + subject.update(y_loc: 10) + expect(subject.custom_style).to eq('object-position: 50% 10%;') + end + + it 'x_loc and y_loc custom' do + subject.update(x_loc: 10, y_loc: 90) + expect(subject.custom_style).to eq('object-position: 10% 90%;') + end + end + + describe '#reset_to_default' do + it 'file purged' do + expect(subject.image_file).to receive(:purge_later) + subject.reset_to_default + end + + it 'locations reset' do + subject.x_loc = 40 + subject.y_loc = 60 + subject.save + subject.reset_to_default + expect(subject.x_loc).to eq(SiteImage::DEFAULT_X_LOC) + expect(subject.y_loc).to eq(SiteImage::DEFAULT_Y_LOC) + end + end +end diff --git a/spec/models/site_setting_spec.rb b/spec/models/site_setting_spec.rb new file mode 100644 index 00000000..eedc17df --- /dev/null +++ b/spec/models/site_setting_spec.rb @@ -0,0 +1,78 @@ +# == Schema Information +# +# Table name: site_settings +# +# id :bigint not null, primary key +# name :string +# created_at :datetime not null +# updated_at :datetime not null +# typed_header_enabled :boolean +# header_text :string +# subtitle_text :string +# + +RSpec.describe SiteSetting, type: :model do + subject { create(:site_setting) } + + describe 'name validations' do + it 'rejects too short' do + subject.name = '' + expect(subject).to_not be_valid + expect(subject.errors.messages[:name]).to eq(['Site name cannot be blank']) + end + + it 'rejects too long' do + subject.name = '0' * 256 + expect(subject).to_not be_valid + expect(subject.errors.messages[:name]).to eq(['Site name cannot be longer than 255 charaters']) + end + + it 'accepts correct length' do + subject.name = '0' + expect(subject).to be_valid + subject.name = '0' * 255 + expect(subject).to be_valid + end + end + + describe 'typed_header_enabled validations' do + it 'data type' do + subject.typed_header_enabled = nil + expect(subject).to_not be_valid + subject.typed_header_enabled = true + expect(subject).to be_valid + end + end + + describe 'header_text validations' do + it 'max length' do + subject.header_text = '0' * 256 + expect(subject).to_not be_valid + expect(subject.errors.messages[:header_text]).to eq(['Header text cannot be longer than 255 charaters']) + subject.header_text = '0' * 255 + expect(subject).to be_valid + end + end + + describe 'subtitle_text validations' do + it 'max length' do + subject.subtitle_text = '0' * 256 + expect(subject).to_not be_valid + expect(subject.errors.messages[:subtitle_text]).to eq(['Subtitle text cannot be longer than 255 charaters']) + subject.subtitle_text = '0' * 255 + expect(subject).to be_valid + end + end + + describe '#change_messages' do + it 'no change' do + expect(subject.reload.change_messages).to eq([]) + end + + it 'attribute changes' do + subject.reload + subject.update(name: 'new name', header_text: 'new header') + expect(subject.change_messages).to eq(['Name updated!', 'Header text updated!']) + end + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb new file mode 100644 index 00000000..d263a8d5 --- /dev/null +++ b/spec/models/user_spec.rb @@ -0,0 +1,261 @@ +# == Schema Information +# +# Table name: users +# +# id :bigint not null, primary key +# current_login_ip :string +# current_login_time :datetime +# email :text +# last_login_ip :string +# last_login_time :datetime +# mobile_number :text +# password_digest :text +# password_reset_expiry :datetime +# password_reset_token :string +# username :text +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_users_on_email (email) UNIQUE +# index_users_on_mobile_number (mobile_number) UNIQUE +# index_users_on_username (username) UNIQUE +# + +RSpec.describe User, type: :model do + subject { create(:user) } + let(:user2) { create(:user2) } + + before(:each) do + allow(PasswordMailer).to receive_message_chain(:with, :password_reset_email, :deliver_now) + end + + describe 'Password validations' do + it 'Rejects passwords less than 8 charaters' do + subject.password = 'passwor' + expect(subject).to_not be_valid + expect(subject.errors.messages[:password]).to eq ['The password must have at least 8 characters'] + end + + it 'Accepts passwords with 8 or more charaters' do + subject.password = 'newpassw' + expect(subject).to be_valid + end + + it 'Requires a password confirmation if present' do + subject.password = 'newpassw' + subject.password_confirmation = '' + expect(subject).to_not be_valid + expect(subject.errors.messages[:password_confirmation].last).to eq 'Passwords do not match' + subject.password_confirmation = 'newpassw' + expect(subject).to be_valid + end + end + + describe 'Username validations' do + it 'Rejects blank usernames' do + subject.username = '' + expect(subject).to_not be_valid + end + + it 'Rejects invalid username formats' do + subject.username = ' example' + expect(subject).to_not be_valid + subject.username = 'example ' + expect(subject).to_not be_valid + subject.username = 'e@xample' + expect(subject).to_not be_valid + end + + it 'Accepts valid username formats' do + subject.username = 'e' + expect(subject).to be_valid + subject.username = 'exa mple' + expect(subject).to be_valid + subject.username = 'exa-mple example' + expect(subject).to be_valid + end + + it 'Username must be unique' do + user2 = build(:user2, username: subject.username) + expect(user2).to_not be_valid + end + + it 'Requires confirmation for change' do + subject.username = 'new-username' + subject.username_confirmation = '' + expect(subject).to_not be_valid + expect(subject.errors.messages[:username_confirmation]).to eq ['Usernames do not match'] + subject.username_confirmation = 'new-username' + expect(subject).to be_valid + end + end + + describe 'Email validations' do + it 'Accepts valid emails' do + subject.email = 'new@example.com' + expect(subject).to be_valid + subject.email = 'ad_m.in@exam-ple.co.uk' + expect(subject).to be_valid + end + + it 'Rejects emails with incorrect format' do + subject.email = '@example.com' + expect(subject).to_not be_valid + subject.email = 'example.com' + expect(subject).to_not be_valid + subject.email = 'admin@' + expect(subject).to_not be_valid + subject.email = 'admin' + expect(subject).to_not be_valid + end + + it 'Rejects emails with invalid charaters' do + subject.email = '\#@example.com' + expect(subject).to_not be_valid + expect(subject.errors.messages[:email]).to eq ['Email must be valid format'] + end + + it 'Email must be unique' do + user2 = build(:user2, email: subject.email) + expect(user2).to_not be_valid + end + + it 'Requires confirmation for change' do + subject.email = 'new@example.com' + subject.email_confirmation = '' + expect(subject).to_not be_valid + expect(subject.errors.messages[:email_confirmation]).to eq ['Emails do not match'] + subject.email_confirmation = 'new@example.com' + expect(subject).to be_valid + end + end + + describe 'Mobile number validations' do + it 'Rejects non-unique mobile numbers' do + user2 = build(:user2, mobile_number: subject.mobile_number) + expect(user2).to_not be_valid + end + + it 'Rejects invalid UK mobile numbers with message' do + subject.mobile_number = '01234567' + expect(subject).to_not be_valid + expect(subject.errors.messages[:mobile_number]).to eq ['Please enter valid UK mobile phone number'] + end + + it 'Requires confirmation for change' do + subject.mobile_number = '+447345678901' + subject.mobile_number_confirmation = '' + expect(subject).to_not be_valid + expect(subject.errors.messages[:mobile_number_confirmation]).to eq ['Mobile phone numbers do not match'] + subject.mobile_number_confirmation = '+447345678901' + expect(subject).to be_valid + end + end + + describe 'Before_validation: mobile_number' do + it 'Adds area code to standard UK mobile number' do + subject.mobile_number = '07345678902' + subject.mobile_number_confirmation = '07345678902' + subject.save + expect(subject.mobile_number).to eq('+447345678902') + end + end + + describe 'after_save: #remove_password_reset' do + it 'password updated after reset' do + subject.send_password_reset_email! + subject.update(password: 'new-password', password_confirmation: 'new-password') + subject.reload + expect(subject.password_reset_token).to eq(nil) + expect(subject.password_reset_expiry).to eq(nil) + end + end + + describe '#send_password_reset_email!' do + it 'Adds a password reset token to user' do + allow(SecureRandom).to receive(:urlsafe_base64).and_return('testtoken') + subject.send_password_reset_email! + expect(subject.password_reset_token).to eq('testtoken') + end + + it 'Password reset token is unique' do + create(:user2, password_reset_token: 'not_unique_token') + allow(SecureRandom).to receive(:urlsafe_base64).and_return('not_unique_token', 'unique_token') + subject.send_password_reset_email! + expect(subject.password_reset_token).to eq('unique_token') + end + + it 'Adds a password reset expiry to user' do + travel_to Time.zone.local(2020, 04, 19, 00, 00, 00) + subject.send_password_reset_email! + expect(subject.password_reset_expiry).to eq(1.hour.from_now) + end + + it 'Password reset email requested to be sent' do + expect(PasswordMailer).to receive_message_chain(:with, :password_reset_email, :deliver_now) + subject.send_password_reset_email! + end + end + + describe '.user_from_password_reset_token' do + it 'Returns user if reset token matches and in date' do + travel_to Time.zone.local(2020, 04, 19, 00, 00, 00) + subject.update_attribute(:password_reset_token, 'test-token') + subject.update_attribute(:password_reset_expiry, 1.hour.from_now) + travel_to Time.zone.local(2020, 04, 19, 00, 59, 00) + expect(User.user_from_password_reset_token('test-token')).to eq(subject) + end + + it 'Returns nil if reset token matches and but not in date' do + travel_to Time.zone.local(2020, 04, 19, 00, 00, 00) + subject.update_attribute(:password_reset_token, 'test-token') + subject.update_attribute(:password_reset_expiry, 1.hour.from_now) + travel_to Time.zone.local(2020, 04, 19, 01, 01, 00) + expect(User.user_from_password_reset_token('test-token')).to eq(nil) + end + + it 'Returns nil if reset token invalid' do + subject.update_attribute(:password_reset_token, 'test-token') + expect(User.user_from_password_reset_token('not_valid')).to eq(nil) + end + + it 'Returns nil if reset token no present' do + expect(User.user_from_password_reset_token(nil)).to eq(nil) + end + end + + describe '#send_password_updated_email!' do + it 'Password updated email sent to user' do + expect(PasswordMailer).to receive_message_chain(:with, :password_updated_email, :deliver_now) + subject.send_password_updated_email! + end + end + + describe '#record_ip' do + let(:remoteip1) { '192.168.1.1' } + let(:remoteip2) { '192.168.1.2' } + let(:request) { double(:request, remote_ip: remoteip1) } + + it 'update user' do + travel_to Time.zone.local(2020, 04, 19, 00, 00, 00) + time1 = Time.zone.now + subject.record_ip(request) + subject.reload + expect(subject.last_login_time).to eq(time1) + expect(subject.last_login_ip).to eq(User::DEFAULT_REMOTE_IP) + expect(subject.current_login_time).to eq(time1) + expect(subject.current_login_ip).to eq(remoteip1) + travel_to Time.zone.local(2020, 04, 19, 00, 00, 00) + time2 = Time.zone.now + allow(request).to receive(:remote_ip).and_return(remoteip2) + subject.record_ip(request) + subject.reload + expect(subject.last_login_time).to eq(time1) + expect(subject.last_login_ip).to eq(remoteip1) + expect(subject.current_login_time).to eq(time2) + expect(subject.current_login_ip).to eq(remoteip2) + end + end +end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb new file mode 100644 index 00000000..078de2ac --- /dev/null +++ b/spec/rails_helper.rb @@ -0,0 +1,69 @@ +# This file is copied to spec/ when you run 'rails generate rspec:install' +require File.expand_path('../config/environment', __dir__) +# Prevent database truncation if the environment is production +abort('The Rails environment is running in production mode!') if Rails.env.production? +require 'rspec/rails' +require 'rails-controller-testing' +Rails::Controller::Testing.install +# Add additional requires below this line. Rails is not loaded until this point! + +# require 'support/factory_bot' +Dir[Rails.root.join('spec/support/**/*.rb')].sort.each { |f| require f } + +# Requires supporting ruby files with custom matchers and macros, etc, in +# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are +# run as spec files by default. This means that files in spec/support that end +# in _spec.rb will both be required and run as specs, causing the specs to be +# run twice. It is recommended that you do not name files matching this glob to +# end with _spec.rb. You can configure this pattern with the --pattern +# option on the command line or in ~/.rspec, .rspec or `.rspec-local`. +# +# The following line is provided for convenience purposes. It has the downside +# of increasing the boot-up time by auto-requiring all files in the support +# directory. Alternatively, in the individual `*_spec.rb` files, manually +# require only the support files necessary. +# +# Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f } + +# Checks for pending migrations and applies them before tests are run. +# If you are not using ActiveRecord, you can remove these lines. +begin + ActiveRecord::Migration.maintain_test_schema! +rescue ActiveRecord::PendingMigrationError => e + puts e.to_s.strip + exit 1 +end +RSpec.configure do |config| + config.include ActionDispatch::TestProcess::FixtureFile + config.fixture_paths = [Rails.root.join('spec/fixtures')] + + # If you're not using ActiveRecord, or you'd prefer not to run each of your + # examples within a transaction, remove the following line or assign false + # instead of true. + config.use_transactional_fixtures = true + + # You can uncomment this line to turn off ActiveRecord support entirely. + # config.use_active_record = false + + # RSpec Rails can automatically mix in different behaviours to your tests + # based on their file location, for example enabling you to call `get` and + # `post` in specs under `spec/controllers`. + # + # You can disable this behaviour by removing the line below, and instead + # explicitly tag your specs with their type, e.g.: + # + # RSpec.describe UsersController, type: :controller do + # # ... + # end + # + # The different available types are documented in the features, such as in + # https://relishapp.com/rspec/rspec-rails/docs + config.infer_spec_type_from_file_location! + + # Filter lines from Rails gems in backtraces. + config.filter_rails_from_backtrace! + # arbitrary gems may also be filtered via: + # config.filter_gems_from_backtrace("gem name") + + config.include ActiveSupport::Testing::TimeHelpers +end diff --git a/spec/requests/abouts_request_spec.rb b/spec/requests/abouts_request_spec.rb new file mode 100644 index 00000000..2da8f6ab --- /dev/null +++ b/spec/requests/abouts_request_spec.rb @@ -0,0 +1,11 @@ +RSpec.describe 'AboutsController', type: :request do + before(:each) do + seed_user_and_settings + seed_about + end + + it 'Renders about page' do + get '/about' + expect(response).to render_template(:show) + end +end diff --git a/spec/requests/admin/abouts_request_spec.rb b/spec/requests/admin/abouts_request_spec.rb new file mode 100644 index 00000000..b69aa06e --- /dev/null +++ b/spec/requests/admin/abouts_request_spec.rb @@ -0,0 +1,85 @@ +RSpec.describe 'Admin::AboutsController', type: :request, slow: true do + let(:image_fixture) { fixture_file_upload(Rails.root.join('spec/files/sample_image.jpg'), 'image/png') } + + before(:each) do + allow_any_instance_of(Image).to receive(:process_new_image_attachment).and_return(true) + seed_user_and_settings + login + end + + describe 'GET /admin/about/edit #edit' do + it 'Renders the index page' do + get '/admin/about/edit' + expect(response).to render_template(:edit) + end + end + + describe 'PUT /admin/about #update' do + let(:attribute_update) do + { + section_title: 'new section name', + about_me: 'new about me section', + linkedin_link: 'http://example.com', + github_link: 'http://example.com', + name: 'new name', + location: 'new location', + contact_email: 'new@example.com' + } + end + + it 'Update sucessful' do + put '/admin/about', params: { + about: attribute_update + } + expect(flash[:notice]).to include('Section title updated!') + expect(flash[:notice]).to include('About me updated!') + expect(flash[:notice].length).to eq(attribute_update.length) + @about.reload + expect(@about.section_title).to eq(attribute_update[:section_title]) + expect(@about.about_me).to eq(attribute_update[:about_me]) + end + + it 'Save failure' do + allow_any_instance_of(About).to receive(:save).and_return(false) + allow_any_instance_of(About).to receive(:errors).and_return({ error: 'save failure' }) + put '/admin/about', params: { + about: attribute_update + } + expect(response.body).to include('save failure') + end + + it 'General error' do + allow_any_instance_of(About).to receive(:save).and_raise('general error') + put '/admin/about', params: { + about: attribute_update + } + expect(response.body).to include('general error') + end + + it 'upload image' do + put '/admin/about', params: { + about: { + profile_image_attributes: { + image_file: image_fixture + } + } + } + expect(@about.reload.profile_image.image_file.attached?).to be(true) + end + + it 'remove image' do + @about.create_profile_image(image_file: image_fixture) + expect(@about.profile_image.image_file.attached?).to be(true) + put '/admin/about', params: { + about: { + profile_image_attributes: { + id: @about.profile_image.id, + _destroy: '1' + } + } + } + expect(@about.reload.profile_image).to be_nil + end + end +end + diff --git a/spec/requests/admin/admin_base_request_spec.rb b/spec/requests/admin/admin_base_request_spec.rb new file mode 100644 index 00000000..02518d0a --- /dev/null +++ b/spec/requests/admin/admin_base_request_spec.rb @@ -0,0 +1,20 @@ +RSpec.describe 'Admin::AdminBaseController', type: :request do + before(:each) do + seed_user_and_settings + end + + describe 'before_action:' do + describe 'check_admin_logged_in' do + it 'admin not logged in' do + get '/admin/images' + expect(response).to redirect_to('/') + end + + it 'admin logged in' do + login + get '/admin/images' + expect(response.status).to eq(200) + end + end + end +end \ No newline at end of file diff --git a/spec/requests/admin/code_snippets_request_spec.rb b/spec/requests/admin/code_snippets_request_spec.rb new file mode 100644 index 00000000..f7613c9b --- /dev/null +++ b/spec/requests/admin/code_snippets_request_spec.rb @@ -0,0 +1,119 @@ +RSpec.describe 'Admin::CodeSnippetsController', type: :request do + let(:valid_attributes) do + { code_snippet: { + title: 'new code snippet', + overview: 'code snippet overview', + snippet: 'def code_snippet; end', + extension: 'rb', + text: 'code snippet content' + }} + end + + let(:invalid_attributes) do + { code_snippet: { + title: '' + }} + end + + before(:each) do + seed_user_and_settings + login + end + + describe 'GET /admin/code-snippets/new #new' do + it 'succesful request' do + get('/admin/code-snippets/new') + expect(response).to render_template(:new) + end + end + + describe 'POST /admin/code-snippets #create' do + it 'successful request' do + post('/admin/code-snippets', params: valid_attributes) + expect(flash[:notice]).to include('Code snippet created') + expect(response).to redirect_to(code_snippets_path) + end + + it 'validation failure' do + post('/admin/code-snippets', params: invalid_attributes) + expect(response.body).to include('Code must be valid file extension') + end + + it 'general error' do + allow_any_instance_of(CodeSnippet).to receive(:save).and_raise('general error') + post('/admin/code-snippets', params: valid_attributes) + expect(response.body).to include('general error') + end + end + + describe 'GET /admin/code-snippets/:id/edit #edit' do + it 'succesful request' do + code_snippet = create(:code_snippet, user: @user) + get("/admin/code-snippets/#{code_snippet.id}/edit") + expect(response).to render_template(:edit) + end + + it 'invalid code snippet id' do + get('/admin/code-snippets/not-a-post-id/edit') + expect(response).to redirect_to(code_snippets_path) + expect(flash[:alert]).to include('Code snippet not found') + end + end + + describe 'PUT /admin/code-snippets/:id #update' do + it 'id invalid' do + put('/admin/code-snippets/not-a-post-id', params: valid_attributes) + expect(response).to redirect_to(code_snippets_path) + expect(flash[:alert]).to include('Code snippet not found') + end + + it 'update sucessful' do + code_snippet = create(:code_snippet, user: @user) + put("/admin/code-snippets/#{code_snippet.id}", params: valid_attributes) + code_snippet.reload + expect(response).to redirect_to(code_snippet_path(code_snippet)) + expect(flash[:notice]).to include('Code snippet updated') + expect(code_snippet.title).to eq(valid_attributes[:code_snippet][:title]) + expect(code_snippet.overview).to eq(valid_attributes[:code_snippet][:overview]) + end + + it 'save failure' do + code_snippet = create(:code_snippet, user: @user) + put("/admin/code-snippets/#{code_snippet.id}", params: invalid_attributes) + expect(response).not_to redirect_to(code_snippet_path(code_snippet)) + expect(response.body).to include('Title length must be between 1 and 60 charaters') + end + + it 'general error' do + code_snippet = create(:code_snippet, user: @user) + allow_any_instance_of(CodeSnippet).to receive(:save).and_raise('general error') + put("/admin/code-snippets/#{code_snippet.id}", params: valid_attributes) + expect(response).not_to redirect_to(code_snippet_path(code_snippet)) + expect(response.body).to include('general error') + end + end + + describe 'DELETE /admin/code-snippets/:id #destroy' do + it 'id invalid' do + delete('/admin/code-snippets/not-a-post-id') + expect(response).to redirect_to(code_snippets_path) + expect(flash[:alert]).to include('Code snippet not found') + end + + it 'successful request' do + code_snippet = create(:code_snippet, user: @user) + delete("/admin/code-snippets/#{code_snippet.id}") + expect(response).to redirect_to(code_snippets_path) + expect(flash[:notice]).to include('Code snippet removed') + expect(CodeSnippet.find_by(id: code_snippet.id)).to be_nil + end + + it 'general error' do + code_snippet = create(:code_snippet, user: @user) + allow_any_instance_of(CodeSnippet).to receive(:destroy).and_raise('general error') + delete("/admin/code-snippets/#{code_snippet.id}") + expect(response).to redirect_to(code_snippets_path) + expect(flash[:alert]).to include('general error') + end + end +end diff --git a/spec/requests/admin/gallery_images_request_spec.rb b/spec/requests/admin/gallery_images_request_spec.rb new file mode 100644 index 00000000..367b3982 --- /dev/null +++ b/spec/requests/admin/gallery_images_request_spec.rb @@ -0,0 +1,138 @@ +RSpec.describe 'Admin::GalleryImagesController', type: :request do + let(:image_fixture) { fixture_file_upload(Rails.root.join('spec/files/sample_image.jpg'), 'image/png') } + + let(:valid_attributes) do + { + gallery_image: { + image_file: image_fixture, + title: 'new gallery image', + date_taken: Date.new(2021, 04, 19), + latitude: 180, + longitude: -180 + } + } + end + + let(:invalid_attributes) do + { + gallery_image: { + latitude: '&£!!@£^' + } + } + end + + before(:each) do + allow_any_instance_of(Image).to receive(:process_new_image_attachment).and_return(true) + seed_user_and_settings + login + end + + describe 'GET /admin/gallery #index' do + it 'template render' do + get('/admin/gallery') + expect(response).to render_template(:index) + end + end + + describe 'GET /admin/gallery-images/new #new' do + it 'template render' do + get('/admin/gallery-images/new') + expect(response).to render_template(:new) + end + end + + describe 'POST /admin/gallery-images #create' do + it 'successful request' do + post('/admin/gallery-images', params: valid_attributes) + expect(flash[:notice]).to include('Gallery image created') + expect(response).to redirect_to(admin_gallery_images_path) + end + + it 'validation failure' do + post('/admin/gallery-images', params: invalid_attributes) + expect(response.body).to include('Latitude must be a (10, 6) decimal') + expect(response).not_to redirect_to(admin_gallery_images_path) + end + + it 'general error' do + allow_any_instance_of(GalleryImage).to receive(:save).and_raise('general error') + post('/admin/gallery-images', params: valid_attributes) + expect(response.body).to include('general error') + expect(response).not_to redirect_to(admin_gallery_images_path) + end + end + + describe 'GET /admin/gallery-images/:id/edit #edit' do + it 'valid request' do + gallery_image = create(:gallery_image, user: @user) + get("/admin/gallery-images/#{gallery_image.id}/edit") + expect(response).to render_template(:edit) + end + + it 'invalid id' do + get('/admin/gallery-images/not-a-valid-id/edit') + expect(response).to redirect_to(admin_gallery_images_path) + expect(flash[:alert]).to include('Gallery image not found') + end + end + + describe 'PUT /admin/gallery-images/:id #update' do + it 'post id invalid' do + put('/admin/gallery-images/not-a-image-id', params: valid_attributes) + expect(response).to redirect_to(admin_gallery_images_path) + expect(flash[:alert]).to include('Gallery image not found') + end + + it 'update sucessful' do + gallery_image = create(:gallery_image, user: @user) + put("/admin/gallery-images/#{gallery_image.id}", params: valid_attributes) + expect(response).to redirect_to(admin_gallery_images_path) + expect(flash[:notice]).to include('Gallery image updated') + gallery_image.reload + expect(gallery_image.title).to eq(valid_attributes[:gallery_image][:title]) + expect(gallery_image.date_taken).to eq(valid_attributes[:gallery_image][:date_taken]) + expect(gallery_image.longitude).to eq(valid_attributes[:gallery_image][:longitude]) + expect(gallery_image.latitude).to eq(valid_attributes[:gallery_image][:latitude]) + expect(gallery_image.image_file.attached?).to eq(true) + end + + it 'save failure' do + gallery_image = create(:gallery_image, user: @user) + put("/admin/gallery-images/#{gallery_image.id}", params: invalid_attributes) + expect(response).not_to redirect_to(admin_gallery_images_path) + expect(response.body).to include('Latitude must be a (10, 6) decimal') + end + + it 'general error' do + gallery_image = create(:gallery_image, user: @user) + allow_any_instance_of(GalleryImage).to receive(:update).and_raise('general error') + put("/admin/gallery-images/#{gallery_image.id}", params: valid_attributes) + expect(response).not_to redirect_to(admin_gallery_images_path) + expect(response.body).to include('general error') + end + end + + describe 'DELETE /admin/posts/:id #update' do + it 'post id invalid' do + delete('/admin/gallery-images/not-a-post-id') + expect(response).to redirect_to(admin_gallery_images_path) + expect(flash[:alert]).to include('Gallery image not found') + end + + it 'successful request' do + gallery_image = create(:gallery_image, user: @user) + delete("/admin/gallery-images/#{gallery_image.id}") + expect(response).to redirect_to(admin_gallery_images_path) + expect(flash[:notice]).to include('Gallery image removed') + expect(GalleryImage.find_by(id: gallery_image.id)).to be_nil + end + + it 'general error' do + gallery_image = create(:gallery_image, user: @user) + allow_any_instance_of(GalleryImage).to receive(:destroy).and_raise('general error') + delete("/admin/gallery-images/#{gallery_image.id}") + expect(response).to redirect_to(admin_gallery_images_path) + expect(flash[:alert]).to include('general error') + end + end +end diff --git a/spec/requests/admin/images_request_spec.rb b/spec/requests/admin/images_request_spec.rb new file mode 100644 index 00000000..532c4dac --- /dev/null +++ b/spec/requests/admin/images_request_spec.rb @@ -0,0 +1,135 @@ +RSpec.describe 'Admin::ImagesController', type: :request do + let(:image_fixture) { fixture_file_upload(Rails.root.join('spec/files/sample_image.jpg'), 'image/png') } + + before(:each) do + allow_any_instance_of(Image).to receive(:process_new_image_attachment).and_return(true) + seed_user_and_settings + login + end + + describe 'GET /admin/images #index' do + it 'Renders the index page' do + get '/admin/images' + expect(response).to render_template(:index) + end + end + + describe 'PUT /admin/header-images/:id #update' do + it 'successful request' do + put "/admin/header-images/#{@header_image.id}", params: { + header_image: { + image_file: image_fixture, + x_loc: 10, + y_loc: 15 + }, + attachment: { + reset: '0' + } + } + expect(flash[:notice]).to include('Header image updated!') + @header_image.reload + expect(@header_image.image_file.attached?).to eq(true) + expect(@header_image.x_loc).to eq(10) + expect(@header_image.y_loc).to eq(15) + end + + it 'invalid image id' do + put '/admin/header-images/not-a-valid-id', params: { + header_image: { + image_file: image_fixture, + x_loc: 50, + y_loc: 50 + }, + attachment: { + reset: '0' + } + } + expect(flash[:alert]).to include('Image not found') + @header_image.reload + expect(@header_image.image_file.attached?).to eq(false) + end + + it 'validation failure' do + put "/admin/header-images/#{@header_image.id}", params: { + header_image: { + x_loc: -1, + y_loc: 50 + }, + attachment: { + reset: '0' + } + } + expect(flash[:alert]).to include('X loc must be in range 0-100') + @header_image.reload + expect(@header_image.image_file.attached?).to eq(false) + end + + it 'general error' do + allow_any_instance_of(HeaderImage).to receive(:save).and_raise('general error') + put "/admin/header-images/#{@header_image.id}", params: { + header_image: { + image_file: image_fixture, + x_loc: 50, + y_loc: 50 + }, + attachment: { + reset: '0' + } + } + expect(flash[:alert]).to include('general error') + @header_image.reload + expect(@header_image.image_file.attached?).to eq(false) + end + + it 'Reset to default' do + put "/admin/header-images/#{@header_image.id}", params: { + header_image: { + image_file: image_fixture, + x_loc: 50, + y_loc: 50 + }, + attachment: { + reset: '1' + } + } + expect(flash[:notice]).to include('Header image reset!') + @header_image.reload + expect(@header_image.image_file.attached?).to eq(false) + end + + describe 'PUT /admin/cover-images/:id #update' do + it 'sucessful request' do + put "/admin/cover-images/#{@cover_image.id}", params: { + cover_image: { + image_file: image_fixture, + x_loc: 50, + y_loc: 50 + }, + attachment: { + reset: '0' + } + } + expect(flash[:notice]).to include('Cover image updated!') + @cover_image.reload + expect(@cover_image.image_file.attached?).to eq(true) + end + + it 'general error' do + allow_any_instance_of(CoverImage).to receive(:save).and_raise('general error') + put "/admin/cover-images/#{@cover_image.id}", params: { + cover_image: { + image_file: image_fixture, + x_loc: 50, + y_loc: 50 + }, + attachment: { + reset: '0' + } + } + expect(flash[:alert]).to include('general error') + @cover_image.reload + expect(@cover_image.image_file.attached?).to eq(false) + end + end + end +end diff --git a/spec/requests/admin/posts_request_spec.rb b/spec/requests/admin/posts_request_spec.rb new file mode 100644 index 00000000..8c7a000f --- /dev/null +++ b/spec/requests/admin/posts_request_spec.rb @@ -0,0 +1,148 @@ +RSpec.describe 'Admin::PostsController', type: :request do + before(:each) do + seed_user_and_settings + login + end + + describe 'GET /admin/posts/:id/edit #edit' do + it 'valid request' do + post = create(:post, user: @user) + get "/admin/posts/#{post.id}/edit" + expect(response).to render_template(:edit) + end + + it 'invalid id' do + get '/admin/posts/not-a-post-id/edit' + expect(response).to redirect_to(posts_path) + expect(flash[:alert]).to include('Post not found') + end + end + + describe 'POST /admin/posts #create' do + let(:valid_post_attributes) do + { post: { + title: 'new blog post', + overview: 'post overview', + date_published: DateTime.new(2020, 04, 19, 0, 0, 0), + post_sections_attributes: { + '0': { + text: 'new post section text 1', + order: '0' + }, + '1': { + text: 'new post section text 2', + order: '1' + } + } + }} + end + + let(:invalid_post_attributes) do + invalid_post_attribubtes = valid_post_attributes + invalid_post_attribubtes[:post][:title] = '' + invalid_post_attribubtes + end + + it 'create sucessful' do + post('/admin/posts', params: valid_post_attributes) + new_post = Post.first + expect(response).to redirect_to(post_path(new_post)) + expect(flash[:notice]).to include('Blog post created') + expect(new_post.post_sections.length).to eq(2) + end + + it 'save failure' do + post('/admin/posts', params: invalid_post_attributes) + expect(response.body).to include('Blog post title cannot be empty') + end + + it 'general error' do + allow_any_instance_of(Post).to receive(:save).and_raise('general error') + post('/admin/posts', params: valid_post_attributes) + expect(response.body).to include('general error') + end + end + + describe 'PUT /admin/posts/:id #update' do + let(:valid_post_attributes) do + { post: { + title: 'a current blog post', + overview: 'post overview', + date_published: DateTime.new(2020, 04, 19, 0, 0, 0), + post_sections_attributes: { + '0': { + text: 'new post section text 1', + order: '0' + }, + '1': { + text: 'new post section text 2', + order: '1' + } + } + }} + end + + let(:invalid_post_attributes) do + invalid_post_attribubtes = valid_post_attributes + invalid_post_attribubtes[:post][:title] = '' + invalid_post_attribubtes + end + + it 'post id invalid' do + put('/admin/posts/not-a-post-id', params: valid_post_attributes) + expect(response).to redirect_to(posts_path) + expect(flash[:alert]).to include('Post not found') + end + + it 'update sucessful' do + post = create(:post, user: @user) + post_section = create(:post_section, post: post, text: 'post section text') + valid_post_attributes[:post][:post_sections_attributes][:'0'][:id] = post_section.id + put("/admin/posts/#{post.id}", params: valid_post_attributes) + post.reload + expect(response).to redirect_to(post_path(post)) + expect(flash[:notice]).to include('Blog post updated') + expect(post.title).to eq(valid_post_attributes[:post][:title]) + expect(post.overview).to eq(valid_post_attributes[:post][:overview]) + expect(post.post_sections.first.text).to eq('new post section text 1') + expect(post.post_sections.length).to eq(2) + end + + it 'save failure' do + post = create(:post, user: @user) + put("/admin/posts/#{post.id}", params: invalid_post_attributes) + expect(response.body).to include('Blog post title cannot be empty') + end + + it 'general error' do + post = create(:post, user: @user) + allow_any_instance_of(Post).to receive(:save).and_raise('general error') + put("/admin/posts/#{post.id}", params: valid_post_attributes) + expect(response.body).to include('general error') + end + end + + describe 'DELETE /admin/posts/:id #destroy' do + it 'post id invalid' do + delete('/admin/posts/not-a-post-id') + expect(response).to redirect_to(posts_path) + expect(flash[:alert]).to include('Post not found') + end + + it 'successful request' do + post = create(:post, user: @user) + delete("/admin/posts/#{post.id}") + expect(response).to redirect_to(posts_path) + expect(flash[:notice]).to include('Blog post removed') + expect(Post.find_by(id: post.id)).to be_nil + end + + it 'general error' do + post = create(:post, user: @user) + allow_any_instance_of(Post).to receive(:destroy).and_raise('general error') + delete("/admin/posts/#{post.id}") + expect(response).to redirect_to(posts_path) + expect(flash[:alert]).to include('general error') + end + end +end diff --git a/spec/requests/admin/projects_request_spec.rb b/spec/requests/admin/projects_request_spec.rb new file mode 100644 index 00000000..cd839f4a --- /dev/null +++ b/spec/requests/admin/projects_request_spec.rb @@ -0,0 +1,203 @@ +RSpec.describe 'Admin::ProjectsController', type: :request do + let(:image_fixture) { fixture_file_upload(Rails.root.join('spec/files/sample_image.jpg'), 'image/png') } + + let(:valid_attributes) do + { project: { + title: 'new project', + overview: 'project overview', + date: DateTime.new(2020, 04, 19, 0, 0, 0), + github_link: 'https://example.com/github', + site_link: 'https://example.com/site' + }} + end + + let(:new_image_upload_attributes) do + new_image_upload_attributes = valid_attributes + new_image_upload_attributes[:new_project_images] = { + image_files: [ + image_fixture + ] + } + new_image_upload_attributes + end + + let(:invalid_attributes) do + invalid_attributes = valid_attributes + invalid_attributes[:project][:title] = '' + invalid_attributes + end + + before(:each) do + seed_user_and_settings + login + end + + describe 'GET /admin/projects/new #new' do + it 'sucessful request' do + get '/admin/projects/new' + expect(response).to render_template(:new) + end + end + + describe 'POST /admin/projects #create' do + it 'sucessful request' do + expect{ post('/admin/projects', params: valid_attributes) }.to change{ + Project.all.length + }.from(0).to(1) + expect(response).to redirect_to(projects_path) + expect(flash[:notice]).to include('Project created') + end + + it 'sucessful request - new image' do + expect{ post('/admin/projects', params: new_image_upload_attributes) }.to change{ + ProjectImage.all.length + }.from(0).to(1) + expect(response).to redirect_to(projects_path) + expect(flash[:notice]).to include('Project created') + end + + it 'save failure - project' do + post('/admin/projects', params: invalid_attributes) + expect(response.body).to include('Title cannot be empty') + end + + it 'save failure - image' do + allow(ProjectImage).to receive(:create).and_return(false) + post('/admin/projects', params: new_image_upload_attributes) + expect(response.body).to include('Image upload error') + expect(Project.all.length).to eq(0) + expect(ProjectImage.all.length).to eq(0) + end + + it 'general error' do + allow_any_instance_of(Project).to receive(:save).and_raise('general error') + post('/admin/projects', params: valid_attributes) + expect(response.body).to include('general error') + end + end + + describe 'GET /admin/project/:id/edit #edit' do + it 'succesful request' do + project = create(:project) + get("/admin/projects/#{project.id}/edit") + expect(response).to render_template(:edit) + end + + it 'invalid id' do + get('/admin/projects/not-a-project-id/edit') + expect(response).to redirect_to(projects_path) + expect(flash[:alert]).to include('Project not found') + end + end + + describe 'PUT /admin/projects/:id #update' do + it 'id invalid' do + put('/admin/projects/not-a-project-id', params: valid_attributes) + expect(response).to redirect_to(projects_path) + expect(flash[:alert]).to include('Project not found') + end + + it 'sucessful request' do + project = create(:project) + put("/admin/projects/#{project.id}", params: valid_attributes) + project.reload + expect(response).to redirect_to(projects_path) + expect(flash[:notice]).to include('Project updated') + expect(project.title).to eq(valid_attributes[:project][:title]) + expect(project.overview).to eq(valid_attributes[:project][:overview]) + end + + it 'sucessful - new image' do + project = create(:project) + expect{ put("/admin/projects/#{project.id}", params: new_image_upload_attributes) }.to change{ + project.reload.project_images.length + }.by(1) + end + + it 'sucessful request - update image title' do + project = create(:project) + project_image = project.project_images.create + update_image_attributes = valid_attributes + update_image_attributes[:project][:project_images_attributes] = [ + { title: 'new title', id: project_image.id, order: '1' } + ] + put("/admin/projects/#{project.id}", params: update_image_attributes) + expect(project_image.reload.title).to eq('new title') + end + + it 'sucessful request - remove image' do + project = create(:project) + project_image = project.project_images.create + remove_image_attributes = valid_attributes + remove_image_attributes[:project][:project_images_attributes] = [ + { _destroy: '1', id: project_image.id, order: '1' } + ] + expect{ put("/admin/projects/#{project.id}", params: remove_image_attributes) }.to change{ + project.reload.project_images.length + }.from(1).to(0) + end + + it 'sucessful request - add code snippet' do + project = create(:project) + code_snippet_attributes = valid_attributes + code_snippet_attributes[:snippet] = { + snippet: 'new code snippet', + extension: 'rb' + } + expect_any_instance_of(Project).to receive(:render_code_snippet).with(code_snippet_attributes[:snippet]).and_return(true) + put("/admin/projects/#{project.id}", params: code_snippet_attributes) + expect(response).to redirect_to(projects_path) + expect(flash[:notice]).to include('Code snippet rendered') + end + + it 'failed request - save failure' do + project = create(:project) + put("/admin/projects/#{project.id}", params: invalid_attributes) + expect(response.body).to include('Title cannot be empty') + end + + it 'failed request - invalid code snippet' do + project = create(:project) + code_snippet_attributes = valid_attributes + code_snippet_attributes[:snippet] = { + snippet: 'new code snippet', + extension: 'not-A\n-extens|on.' + } + expect_any_instance_of(Project).to receive(:render_code_snippet).with(code_snippet_attributes[:snippet]).and_return(false) + put("/admin/projects/#{project.id}", params: code_snippet_attributes) + expect(response.body).to include('Code snippet invalid') + end + + it 'failed request - general error' do + project = create(:project) + allow_any_instance_of(Project).to receive(:save).and_raise('general error') + put("/admin/projects/#{project.id}", params: valid_attributes) + expect(response.body).to include('general error') + end + end + + describe 'DELETE /admin/projects/:id #destroy' do + it 'id invalid' do + delete('/admin/projects/not-a-project-id') + expect(response).to redirect_to(projects_path) + expect(flash[:alert]).to include('Project not found') + end + + it 'successful request' do + project = create(:project) + expect{ delete("/admin/projects/#{project.id}") }.to change{ + Project.all.length + }.from(1).to(0) + expect(response).to redirect_to(projects_path) + expect(flash[:notice]).to include('Project removed') + end + + it 'general error' do + project = create(:project) + allow_any_instance_of(Project).to receive(:destroy).and_raise('general error') + delete("/admin/projects/#{project.id}") + expect(response).to redirect_to(projects_path) + expect(flash[:alert]).to include('general error') + end + end +end diff --git a/spec/requests/admin/site_settings_request_spec.rb b/spec/requests/admin/site_settings_request_spec.rb new file mode 100644 index 00000000..7b4f0297 --- /dev/null +++ b/spec/requests/admin/site_settings_request_spec.rb @@ -0,0 +1,63 @@ +RSpec.describe 'Admin:SiteSettingsController', type: :request, slow: true do + before(:each) do + seed_user_and_settings + login + end + + describe 'GET /admin/site_settings #index' do + it 'renders the index page' do + get '/admin/site_settings' + expect(response).to render_template(:index) + end + end + + describe 'PUT /admin/site_settings/:id #update' do + it 'update unsuccessful - validations' do + put "/admin/site_settings/#{@site_settings.id}", params: { + site_setting: { + name: '' + } + } + expect(response.body).to include('Site name cannot be blank') + end + + it 'update unsuccessful - general error' do + allow_any_instance_of(SiteSetting).to receive(:update).and_raise('general error') + put "/admin/site_settings/#{@site_settings.id}", params: { + site_setting: { + name: '' + } + } + expect(response.body).to include('Sorry, something went wrong!') + expect(response.body).to include('general error') + end + + it 'single attribute update' do + put "/admin/site_settings/#{@site_settings.id}", params: { + site_setting: { + name: 'new_site_name' + } + } + expect(flash[:notice]).to include('Name updated!') + @site_settings.reload + expect(@site_settings.name).to eq('new_site_name') + end + + it 'multiple attribute update' do + put "/admin/site_settings/#{@site_settings.id}", params: { + site_setting: { + header_text: 'New header text', + subtitle_text: 'New subtitle text', + typed_header_enabled: '1' + } + } + expect(flash[:notice]).to include('Header text updated!') + expect(flash[:notice]).to include('Typed header enabled updated!') + expect(flash[:notice]).to include('Subtitle text updated!') + @site_settings.reload + expect(@site_settings.header_text).to eq('New header text') + expect(@site_settings.subtitle_text).to eq('New subtitle text') + expect(@site_settings.typed_header_enabled).to eq(true) + end + end +end diff --git a/spec/requests/admin/users_request_spec.rb b/spec/requests/admin/users_request_spec.rb new file mode 100644 index 00000000..df247135 --- /dev/null +++ b/spec/requests/admin/users_request_spec.rb @@ -0,0 +1,174 @@ +RSpec.describe 'Admin::UsersController', type: :request do + before(:each) do + seed_user_and_settings + end + + describe 'GET /admin/users/:id/edit #edit' do + it 'sucessful request' do + login + get("/admin/users/#{@user.id}/edit") + expect(response).to render_template(:edit) + end + end + + describe 'PUT /admin/users/:id #update' do + let(:blank_username_params) { { username: '', username_confirmation: '' } } + let(:blank_email_params) { { email: '', email_confirmation: '' } } + let(:blank_password_params) { { password: '', password_confirmation: '' } } + let(:blank_mobile_number_params) { { mobile_number: '', mobile_number_confirmation: '' } } + let(:default_current_password_params) { { password: @user_password } } + + it 'Redirects to homepage if user not logged in' do + put("/admin/users/#{@user.id}") + expect(response).to redirect_to('/') + end + + it 'Original password must be present to update section' do + login + put("/admin/users/#{@user.id}", params: { + username: { + username: 'new_username', + username_confirmation: 'new_username' + }, + email: blank_email_params, + password: blank_password_params, + mobile_number: blank_mobile_number_params, + current_password: { + password: '' + } + }) + expect(flash[:alert]).to include('Enter current password to update details') + end + + it 'Username can be updated' do + login + put("/admin/users/#{@user.id}", params: { + username: { + username: 'new_username', + username_confirmation: 'new_username' + }, + email: blank_email_params, + password: blank_password_params, + mobile_number: blank_mobile_number_params, + current_password: default_current_password_params + }) + expect(flash[:notice]).to include('Username updated!') + @user.reload + expect(@user.username).to eq('new_username') + end + + it 'Username not updated if fields are left empty' do + original_username = @user.username + login + put("/admin/users/#{@user.id}", params: { + username: { + username: '', + username_confirmation: '' + }, + email: blank_email_params, + password: blank_password_params, + mobile_number: blank_mobile_number_params, + current_password: default_current_password_params + }) + expect(response).to redirect_to(edit_admin_user_path) + @user.reload + expect(@user.username).to eq(original_username) + end + + it 'Username update validation errors get displayed' do + login + put("/admin/users/#{@user.id}", params: { + username: { + username: 'new_username', + username_confirmation: '' + }, + email: blank_email_params, + password: blank_password_params, + mobile_number: blank_mobile_number_params, + current_password: default_current_password_params + }) + expect(flash[:alert]).to include('Usernames do not match') + end + + it 'Email can be updated' do + login + put("/admin/users/#{@user.id}", params: { + email: { + email: 'new@example.com', + email_confirmation: 'new@example.com' + }, + username: blank_username_params, + password: blank_password_params, + mobile_number: blank_mobile_number_params, + current_password: default_current_password_params + }) + expect(flash[:notice]).to include('Email address updated!') + @user.reload + expect(@user.email).to eq('new@example.com') + end + + it 'Email update validation errors get displayed' do + login + put("/admin/users/#{@user.id}", params: { + email: { + email: 'example.com', + email_confirmation: 'example.com' + }, + username: blank_username_params, + password: blank_password_params, + mobile_number: blank_mobile_number_params, + current_password: default_current_password_params + }) + expect(flash[:alert]).to include('Email must be valid format') + end + + it 'Password can be updated' do + login + put("/admin/users/#{@user.id}", params: { + password: { + password: 'newpassword', + password_confirmation: 'newpassword' + }, + email: blank_email_params, + username: blank_username_params, + mobile_number: blank_mobile_number_params, + current_password: default_current_password_params + }) + expect(flash[:notice]).to include('Password updated!') + @user.reload + expect(@user.authenticate('newpassword')).to eq(@user) + end + + it 'Password update validation errors get displayed' do + login + put("/admin/users/#{@user.id}", params: { + password: { + password: 'badpassword', + password_confirmation: 'newpassword' + }, + email: blank_email_params, + username: blank_username_params, + mobile_number: blank_mobile_number_params, + current_password: default_current_password_params + }) + expect(flash[:alert]).to include('Passwords do not match') + end + + it 'Mobile number can be updated' do + login + put("/admin/users/#{@user.id}", params: { + mobile_number: { + mobile_number: '07123456789', + mobile_number_confirmation: '07123456789' + }, + password: blank_password_params, + email: blank_email_params, + username: blank_username_params, + current_password: default_current_password_params + }) + expect(flash[:notice]).to include('Mobile number updated!') + @user.reload + expect(@user.mobile_number).to eq('+447123456789') + end + end +end \ No newline at end of file diff --git a/spec/requests/admins_request_spec.rb b/spec/requests/admins_request_spec.rb new file mode 100644 index 00000000..5cad4db3 --- /dev/null +++ b/spec/requests/admins_request_spec.rb @@ -0,0 +1,34 @@ +RSpec.describe 'AdminsController', type: :request do + before(:each) do + seed_user_and_settings + end + + describe 'GET /admin #general' do + it 'Redirects to homepage if user not logged in' do + get '/admin' + expect(response).to redirect_to('/') + end + + it 'Displays general page as default' do + login + get '/admin' + expect(response).to render_template(:general) + end + end + + describe 'GET /admin/notifications #notifications' do + it 'Displays notifications page' do + login + get '/admin/notifications' + expect(response).to render_template(:notifications) + end + end + + describe 'GET /admin/analytics #analytics' do + it 'Displays analytics page' do + login + get '/admin/analytics' + expect(response).to render_template(:analytics) + end + end +end diff --git a/spec/requests/code_snippets_request_spec.rb b/spec/requests/code_snippets_request_spec.rb new file mode 100644 index 00000000..d89b5581 --- /dev/null +++ b/spec/requests/code_snippets_request_spec.rb @@ -0,0 +1,26 @@ +RSpec.describe 'CodeSnippetsController', type: :request do + before(:each) do + seed_user_and_settings + end + + describe 'GET /code-snippets #index' do + it 'succesful request' do + get('/code-snippets') + expect(response).to render_template(:index) + end + end + + describe 'GET /code-snippets/:id #show' do + it 'succesful request' do + code_snippet = create(:code_snippet, user: @user) + get("/code-snippets/#{code_snippet.id}") + expect(response).to render_template(:show) + end + + it 'invalid code snippet id' do + get('/code-snippets/not-a-post-id') + expect(response).to redirect_to(code_snippets_path) + expect(flash[:alert]).to include('Code snippet not found') + end + end +end diff --git a/spec/requests/contact_messages_requests_spec.rb b/spec/requests/contact_messages_requests_spec.rb new file mode 100644 index 00000000..b5606910 --- /dev/null +++ b/spec/requests/contact_messages_requests_spec.rb @@ -0,0 +1,71 @@ +RSpec.describe 'ContactMessagesController', type: :request do + before(:each) do + seed_user_and_settings + end + + let(:valid_params) do + { + contact_message: { + from: 'test user', + email: 'test@example.com', + subject: 'new message subject', + content: 'new message text content' + }, + 'g-recaptcha-response' => 'test' + } + end + + let(:invalid_params) do + { + contact_message: { + from: '', + email: 'test@example.com', + subject: 'new message subject', + content: 'new message text content' + }, + 'g-recaptcha-response' => 'test' + } + end + + describe 'GET /contact' do + it 'sucessful request' do + get('/contact') + expect(response).to render_template(:new) + end + end + + describe 'POST /contact-messages' do + before(:each) do + stub_recaptcha_service + allow(ReCaptchaService).to receive(:recaptcha_valid?).and_return(true) + end + + it 'sucessful request' do + expect{ post('/contact-messages', params: valid_params) }.to change{ ContactMessage.all.length }.from(0).to(1) + expect(response).to redirect_to(contact_path) + expect(flash[:notice]).to include('Message sent! You should receive a confirmation email shortly.') + new_message = ContactMessage.first + expect(NewContactMessageJob).to have_been_enqueued.with(contact_message: new_message) + end + + it 'save failure' do + expect{ post('/contact-messages', params: invalid_params) }.not_to(change{ ContactMessage.all.length }) + expect(response).not_to redirect_to(admin_posts_path) + expect(response.body).to include('From field cannot be blank') + end + + it 'general error' do + allow_any_instance_of(ContactMessage).to receive(:save).and_raise('general error') + expect{ post('/contact-messages', params: valid_params) }.not_to(change{ ContactMessage.all.length }) + expect(response).not_to redirect_to(admin_posts_path) + expect(response.body).to include('Sorry, something went wrong!') + expect(response.body).not_to include('general error') + end + + it 'invalid recaptcha' do + allow(ReCaptchaService).to receive(:recaptcha_valid?).with(valid_params['g-recaptcha-response']).and_return(false) + post('/contact-messages', params: valid_params) + expect(response.body).to include('reCaptcha failed, please try again') + end + end +end diff --git a/spec/requests/gallery_images_request_spec.rb b/spec/requests/gallery_images_request_spec.rb new file mode 100644 index 00000000..1c28b028 --- /dev/null +++ b/spec/requests/gallery_images_request_spec.rb @@ -0,0 +1,43 @@ +RSpec.describe 'GalleryImagesController', type: :request do + before(:each) do + seed_user_and_settings + seed_gallery_image + end + + context 'html' do + describe 'GET /gallery #index' do + it 'renders index' do + get('/gallery') + expect(response).to render_template(:index) + end + end + end + + context 'json' do + describe 'GET /gallery #index' do + it 'json response' do + allow_any_instance_of(AttachmentHelper).to receive(:fetch_image_url).and_return('test') + get('/gallery.json') + parsed_body = response.parsed_body + expect(parsed_body['data'][0]['attributes']).to eq({ + 'title' => @gallery_image.title, + 'description' => @gallery_image.description, + 'thumbnail_url' => 'test', + 'url' => 'test' + }) + end + + it 'paginaton' do + seed_images = 15 + seed_images.times{ create(:gallery_image, user: @user) } + seeded_images = 1 + seed_images + get('/gallery.json') + parsed_body = response.parsed_body + expect(parsed_body['data'].length).to eq([GalleryImagesController::PAGE_SIZE, seeded_images].min) + get('/gallery.json?page=2') + parsed_body = response.parsed_body + expect(parsed_body['data'].length).to eq([seeded_images - GalleryImagesController::PAGE_SIZE, 0].max) + end + end + end +end diff --git a/spec/requests/homepages_request_spec.rb b/spec/requests/homepages_request_spec.rb new file mode 100644 index 00000000..fac36849 --- /dev/null +++ b/spec/requests/homepages_request_spec.rb @@ -0,0 +1,10 @@ +RSpec.describe 'HomepagesController', type: :request do + before(:each) do + seed_user_and_settings + end + + it 'Renders the homepage' do + get '/' + expect(response).to render_template(:index) + end +end diff --git a/spec/requests/passwords_request_spec.rb b/spec/requests/passwords_request_spec.rb new file mode 100644 index 00000000..4a044071 --- /dev/null +++ b/spec/requests/passwords_request_spec.rb @@ -0,0 +1,99 @@ +RSpec.describe 'PasswordsController', type: :request do + before(:each) do + seed_user_and_settings + end + + describe 'before_action' do + it 'user logged in' do + login + get '/forgotten-password' + expect(response).to redirect_to(:admin) + end + end + + describe 'GET /forgotten-password #forgotten_password' do + it 'request forgotten password page' do + get '/forgotten-password' + expect(response).to render_template(:forgotten_password) + end + end + + describe 'POST /forgotten-password #send_reset_link' do + before(:each) do + stub_recaptcha_service + end + + it 'invalid recaptcha' do + allow(ReCaptchaService).to receive(:recaptcha_valid?).and_return(false) + post '/forgotten-password', params: { email: @user.email, 'g-recaptcha-response' => 'test' } + expect(response).to redirect_to(:forgotten_password) + expect(flash[:alert]).to include('reCaptcha failed, please try again') + end + + it 'valid forgotten password request' do + expect(PasswordResetJob).to receive(:perform_later).with(email: @user.email) + post '/forgotten-password', params: { email: @user.email, 'g-recaptcha-response' => 'test' } + expect(response).to redirect_to(:login) + expect(flash[:notice]).to eq('If the submitted email is associated with an account, a password reset link will be sent') + end + end + + describe 'GET /reset-password #reset_password' do + it 'invalid reset_token' do + get '/reset-password', params: { reset_token: 'invalid-token' } + expect(response).to redirect_to(:login) + expect(flash[:alert]).to include('Password reset token expired') + end + + it 'valid reset_token' do + allow(PasswordMailer).to receive_message_chain(:with, :password_reset_email, :deliver_now).and_return(nil) + @user.send_password_reset_email! + get '/reset-password', params: { reset_token: @user.password_reset_token } + expect(response).to render_template(:reset_password) + expect(session[:reset_token] = @user.password_reset_token) + end + + it 'reset token in session' do + @user.send_password_reset_email! + get '/reset-password', params: { reset_token: @user.password_reset_token } + get '/reset-password' + expect(response).to render_template(:reset_password) + end + end + + describe 'POST /reset-password #update_password' do + it 'no reset_token in session' do + post '/reset-password', params: { password: 'unauthorized-password', password_confirmation: 'unauthorized-password' } + expect(response).to redirect_to(:login) + expect(flash[:alert]).to include('Password reset token expired') + end + + it 'password confirmations do not match' do + @user.send_password_reset_email! + get '/reset-password', params: { reset_token: @user.password_reset_token } + post '/reset-password', params: { password: 'Securepassword1', password_confirmation: 'not-the-same-password' } + expect(response).to redirect_to(:reset_password) + expect(flash[:alert]).to include('Passwords do not match') + end + + it 'invalid password' do + @user.send_password_reset_email! + get '/reset-password', params: { reset_token: @user.password_reset_token } + post '/reset-password', params: { password: 'passwor', password_confirmation: 'passwor' } + expect(response).to redirect_to(:reset_password) + expect(flash[:alert]).to include('The password must have at least 8 characters') + end + + it 'valid password reset request' do + expect(PasswordUpdatedJob).to receive(:perform_later).with(user: @user) + @user.send_password_reset_email! + get '/reset-password', params: { reset_token: @user.password_reset_token } + post '/reset-password', params: { password: 'Securepassword2', password_confirmation: 'Securepassword2' } + expect(response).to redirect_to(:login) + expect(flash[:notice]).to eq('Password updated') + @user.reload + expect(@user.password_reset_token).to be_nil + expect(@user.password_reset_expiry).to be_nil + end + end +end diff --git a/spec/requests/posts_request_spec.rb b/spec/requests/posts_request_spec.rb new file mode 100644 index 00000000..57f6b8e9 --- /dev/null +++ b/spec/requests/posts_request_spec.rb @@ -0,0 +1,26 @@ +RSpec.describe 'PostsController', type: :request do + before(:each) do + seed_user_and_settings + end + + describe 'GET /blog' do + it 'Renders posts index page' do + get '/blog' + expect(response).to render_template(:index) + end + end + + describe 'GET /blog/:id' do + it 'valid post' do + post = create(:post, user: @user) + get("/blog/#{post.id}") + expect(response).to render_template(:show) + end + + it 'invalid post' do + get('/blog/not-a-post-id') + expect(response).to redirect_to(posts_path) + expect(flash[:alert]).to include('Post not found') + end + end +end diff --git a/spec/requests/projects_request_spec.rb b/spec/requests/projects_request_spec.rb new file mode 100644 index 00000000..51d32beb --- /dev/null +++ b/spec/requests/projects_request_spec.rb @@ -0,0 +1,12 @@ +RSpec.describe 'ProjectsController', type: :request do + before(:each) do + seed_user_and_settings + end + + describe 'GET /projects #index' do + it 'sucessful request' do + get '/projects' + expect(response).to render_template(:index) + end + end +end diff --git a/spec/requests/sessions_request_spec.rb b/spec/requests/sessions_request_spec.rb new file mode 100644 index 00000000..f9e81072 --- /dev/null +++ b/spec/requests/sessions_request_spec.rb @@ -0,0 +1,142 @@ +RSpec.describe 'SessionsController', type: :request do + before(:each) do + seed_user_and_settings + end + + describe 'GET /login #login ' do + it 'Renders login page' do + get '/login' + expect(response).to render_template(:login) + end + + it 'If already logged in, redirect to admin page' do + login + get '/login' + expect(response).to redirect_to(:admin) + end + end + + describe 'POST /login #new' do + it 'Allows inital login with username' do + password_athenticate_admin(user: @user.username, password: @user_password) + expect(response).to redirect_to('/2fa') + expect(session[:two_factor_auth_id]).not_to eq(nil) + end + + it 'Allows inital login with email' do + password_athenticate_admin(user: @user.email, password: @user_password) + expect(response).to redirect_to('/2fa') + end + + it 'Blocks login if user not found' do + password_athenticate_admin(user: @user.username, password: 'nopass') + expect(response).to redirect_to login_path + expect(flash[:alert]).to include('User not found') + end + + it 'Blocks login if captcha incorrect' do + allow(ReCaptchaService).to receive(:recaptcha_valid?).and_return(false) + post '/login', params: { user: @user.username, password: @user_password, 'g-recaptcha-response': 'test' } + expect(response).to redirect_to login_path + expect(flash[:alert]).to include('reCaptcha failed, please try again') + end + end + + describe 'GET /2fa #send_2fa' do + it 'blocks unauthorised access' do + get '/2fa' + expect(response).to redirect_to('/login') + end + + it 'If already logged in, redirect to admin page' do + login + get '/2fa' + expect(response).to redirect_to(:admin) + end + + it 'Sends verify request to twilio' do + password_athenticate_admin(user: @user.username, password: @user_password) + expect(TwoFactorAuthService).to receive(:send_auth_code).and_return(true) + get '/2fa' + expect(response).to render_template(:two_factor_auth) + expect(flash[:notice]).to eq('Please enter the 6 digit code sent to mobile number assoicated with this account') + end + + it 'error sending auth code' do + allow(TwoFactorAuthService).to receive(:send_auth_code).and_return(false) + password_athenticate_admin(user: @user.username, password: @user_password) + get '/2fa' + expect(response.body).to include('Sorry something went wrong') + end + end + + describe 'POST /2fa #verify_2fa' do + let(:auth_code) { '123456' } + + before(:each) do + allow(TwoFactorAuthService).to receive(:auth_code_format_valid?).and_return(true) + end + + it 'invalid auth code format' do + password_athenticate_admin(user: @user.username, password: @user_password) + allow(TwoFactorAuthService).to receive(:auth_code_format_valid?).and_return(false) + post '/2fa', params: { auth_code: auth_code } + expect(response).to redirect_to('/2fa') + expect(flash[:alert]).to include('Verification code must be 6 digits long') + end + + it 'invalid auth code' do + password_athenticate_admin(user: @user.username, password: @user_password) + allow(TwoFactorAuthService).to receive(:auth_code_valid?).and_return(false) + post '/2fa', params: { auth_code: auth_code } + expect(flash[:alert]).to include('2fa code incorrect, please try again') + end + + it 'successful login' do + expect_any_instance_of(User).to receive(:record_ip) + login + expect(response.body).to include("#{@user.username} welcome back to your home-server!") + end + + it 'Resets session after 7 days of inactivity' do + travel_to Time.zone.local(2020, 04, 19, 00, 00, 00) + login + expect(session[:user_id]).not_to eq(nil) + travel_to Time.zone.local(2020, 04, 25, 23, 59, 59) + get '/' + expect(session[:user_id]).not_to eq(nil) + travel_to Time.zone.local(2020, 05, 03, 00, 00, 00) + get '/' + expect(session[:user_id]).to eq(nil) + end + + it 'Block unauthorised access' do + post '/2fa', params: { auth_code: auth_code } + expect(response).to redirect_to('/login') + end + end + + describe 'PUT /2fa #reset_2fa' do + it 'Resends 2fa code' do + password_athenticate_admin(user: @user.username, password: @user_password) + allow(TwoFactorAuthService).to receive(:send_auth_code).and_return(true) + get '/2fa' + put '/2fa' + expect(session[:auth_code_sent]).to eq(nil) + expect(response).to redirect_to('/2fa') + expect(flash[:notice]).to eq('Two factor authentication code resent') + end + end + + describe 'DELETE /login #destroy' do + it 'Resets session' do + login + expect(session[:user_id]).not_to eq(nil) + logout + expect(response).to redirect_to root_path + expect(session[:user_id]).to eq(nil) + end + end +end + + diff --git a/spec/services/re_captcha_service_spec.rb b/spec/services/re_captcha_service_spec.rb new file mode 100644 index 00000000..9b1c6892 --- /dev/null +++ b/spec/services/re_captcha_service_spec.rb @@ -0,0 +1,19 @@ +describe ReCaptchaService do + let(:client_response) { 'client recaptcha response code' } + let(:post_response_valid) { double(:response, body: '{"success": true}') } + let(:post_response_invalid) { double(:response, body: '{"success": false}') } + + describe '.recaptcha_valid?' do + it 'valid client_response' do + request_stub = stub_request(:post, "https://www.google.com/recaptcha/api/siteverify?response=#{client_response}&secret=#{Rails.configuration.grecaptcha_site_secret}") + .to_return(status: 200, body: '{"success": true}', headers: {}) + expect(subject.recaptcha_valid?(client_response)).to eq(true) + expect(request_stub).to have_been_requested.times(1) + end + + it 'invalid client_response' do + expect(Faraday).to receive(:post).with('https://www.google.com/recaptcha/api/siteverify').and_return(post_response_invalid) + expect(subject.recaptcha_valid?(client_response)).to eq(false) + end + end +end \ No newline at end of file diff --git a/spec/services/render_code_snippet_service_spec.rb b/spec/services/render_code_snippet_service_spec.rb new file mode 100644 index 00000000..f80612d0 --- /dev/null +++ b/spec/services/render_code_snippet_service_spec.rb @@ -0,0 +1,81 @@ +describe RenderCodeSnippetService do + let(:config_path) { Rails.root.join('config/carbon-config.json') } + + describe '.render_and_attach_image' do + it 'default config' do + snippet_text = 'test text' + extension = 'rb' + rails_root_mock = double(:rails, join: 'config-path.json') + attachment_mock = double(:attachment) + tmp_code_file_mock = double(:tempfile, path: 'code-file-path-test', close: nil, rewind: nil) + tmp_image_file_mock = double(:tempfile, path: 'img-file-path-test', close: nil) + io_mock = double(:io, close: nil) + + allow(Rails).to receive(:root).and_return(rails_root_mock) + allow(Tempfile).to receive(:new).with('code-snippet-image').and_return(tmp_image_file_mock) + allow(Tempfile).to receive(:new).with([RenderCodeSnippetService::Renderer::DEFAULT_FILENAME, ".#{extension}"]).and_return(tmp_code_file_mock) + allow(File).to receive(:dirname).with('img-file-path-test').and_return('img-file-dir') + allow(File).to receive(:basename).with('img-file-path-test').and_return('img-file-name') + allow(File).to receive(:open).with('img-file-path-test.png').and_return('img-file') + + expect(tmp_code_file_mock).to receive(:write).with(snippet_text) + expect(IO).to receive(:popen) + .with('carbon-now code-file-path-test -l img-file-dir -t img-file-name --headless --config config-path.json -p default', 'w+') + .and_return(io_mock) + expect(attachment_mock).to receive(:attach) + .with(io: 'img-file', filename: "#{RenderCodeSnippetService::Renderer::DEFAULT_FILENAME}.png", content_type: 'image/png') + expect(tmp_code_file_mock).to receive(:unlink) + expect(tmp_image_file_mock).to receive(:unlink) + + RenderCodeSnippetService.render_and_attach_image(snippet_text: snippet_text, syntax_extension: extension, attachment: attachment_mock) + end + + describe 'custom config' do + before(:each) do + @snippet_text = 'test text' + @attachment_mock = double(:attachment, attach: nil) + @extension = 'rb' + rails_root_mock = double(:rails, join: 'config-path.json') + tmp_code_file_mock = double(:tempfile, path: 'code-file-path-test', close: nil, unlink: nil, write: nil, rewind: nil) + tmp_image_file_mock = double(:tempfile, path: 'img-file-path-test', close: nil, unlink: nil) + allow(Rails).to receive(:root).and_return(rails_root_mock) + allow(Tempfile).to receive(:new).with('code-snippet-image').and_return(tmp_image_file_mock) + allow(Tempfile).to receive(:new).with([RenderCodeSnippetService::Renderer::DEFAULT_FILENAME, ".#{@extension}"]).and_return(tmp_code_file_mock) + allow(File).to receive(:dirname).with('img-file-path-test').and_return('img-file-dir') + allow(File).to receive(:basename).with('img-file-path-test').and_return('img-file-name') + allow(File).to receive(:open).with('img-file-path-test.png').and_return('img-file') + end + + it 'custom line start' do + start_line = 1 + io_mock = double(:io, close: nil) + expect(IO).to receive(:popen) + .with("carbon-now code-file-path-test -l img-file-dir -t img-file-name --headless --config config-path.json -p default -s #{start_line}", 'w+') + .and_return(io_mock) + + RenderCodeSnippetService.render_and_attach_image(start_line: start_line, snippet_text: @snippet_text, syntax_extension: @extension, attachment: @attachment_mock) + end + + it 'custom line end' do + end_line = 2 + io_mock = double(:io, close: nil) + expect(IO).to receive(:popen) + .with("carbon-now code-file-path-test -l img-file-dir -t img-file-name --headless --config config-path.json -p default -e #{end_line}", 'w+') + .and_return(io_mock) + + RenderCodeSnippetService.render_and_attach_image(end_line: end_line, snippet_text: @snippet_text, syntax_extension: @extension, attachment: @attachment_mock) + end + + it 'custom line start and end' do + start_line = 1 + end_line = 3 + io_mock = double(:io, close: nil) + expect(IO).to receive(:popen) + .with("carbon-now code-file-path-test -l img-file-dir -t img-file-name --headless --config config-path.json -p default -s #{start_line} -e #{end_line}", 'w+') + .and_return(io_mock) + + RenderCodeSnippetService.render_and_attach_image(start_line: start_line, end_line: end_line, snippet_text: @snippet_text, syntax_extension: @extension, attachment: @attachment_mock) + end + end + end +end \ No newline at end of file diff --git a/spec/services/two_factor_auth_service_spec.rb b/spec/services/two_factor_auth_service_spec.rb new file mode 100644 index 00000000..d22607f3 --- /dev/null +++ b/spec/services/two_factor_auth_service_spec.rb @@ -0,0 +1,126 @@ +describe TwoFactorAuthService do + let(:user) { create(:user) } + let(:session) { {} } + + describe '.start' do + it 'user start two factor auth flow' do + subject.start(session, user) + expect(session[:two_factor_auth_id]).to eq(user.id) + end + end + + describe '.started?' do + it 'two factor not started' do + expect(subject.started?(session)).to eq(false) + end + + it 'two factor started' do + subject.start(session, user) + expect(subject.started?(session)).to eq(true) + end + end + + describe '.send_auth_code' do + before(:each) do + subject.start(session, user) + end + + it 'user does not exist' do + user.destroy + expect(subject.send_auth_code(session)).to eq(false) + end + + it 'user has no mobile number' do + user.mobile_number = nil + user.save + expect(subject.send_auth_code(session)).to eq(false) + end + + it 'twilio error' do + allow(subject).to receive(:twilio_client).and_raise('error') + expect(subject.send_auth_code(session)).to eq(false) + end + + it 'successful send request' do + expect_any_instance_of(Twilio::REST::Verify::V2::ServiceContext::VerificationList).to receive(:create).with(to: user.mobile_number, channel: 'sms') + expect(subject.send_auth_code(session)).to eq(true) + expect(session[:two_factor_auth_code_sent]).to eq(true) + end + + it 'send request already made' do + allow_any_instance_of(Twilio::REST::Verify::V2::ServiceContext::VerificationList).to receive(:create) + subject.send_auth_code(session) + expect_any_instance_of(Twilio::REST::Verify::V2::ServiceContext::VerificationList).not_to receive(:create) + expect(subject.send_auth_code(session)).to eq(true) + end + end + + describe '.auth_code_format_valid?' do + it 'format valid' do + auth_code = '1' * 6 + expect(subject.auth_code_format_valid?(auth_code)).to eq(true) + end + + it 'format invalid' do + auth_code = '1' * 5 + expect(subject.auth_code_format_valid?(auth_code)).to eq(false) + auth_code = '1' * 7 + expect(subject.auth_code_format_valid?(auth_code)).to eq(false) + auth_code = 'a' * 6 + expect(subject.auth_code_format_valid?(auth_code)).to eq(false) + end + end + + describe '.auth_code_valid?' do + let(:auth_code) { '123456' } + + before(:each) do + subject.start(session, user) + allow_any_instance_of(Twilio::REST::Verify::V2::ServiceContext::VerificationList).to receive(:create) + subject.send_auth_code(session) + end + + it 'auth code not yet sent' do + new_session = {} + subject.start(new_session, user) + expect(subject.auth_code_valid?(session: new_session, auth_code: auth_code)).to eq(false) + end + + it 'user does not exist' do + user.destroy + expect(subject.auth_code_valid?(session: session, auth_code: auth_code)).to eq(false) + end + + it 'twilio error' do + allow(subject).to receive(:twilio_client).and_raise('error') + expect(subject.auth_code_valid?(session: session, auth_code: auth_code)).to eq(false) + end + + it 'invalid auth code' do + verification_double = double('verification', status: 'failed') + allow_any_instance_of(Twilio::REST::Verify::V2::ServiceContext::VerificationCheckList).to receive(:create).and_return(verification_double) + expect(subject.auth_code_valid?(session: session, auth_code: auth_code)).to eq(false) + end + + it 'valid auth code' do + verification_double = double('verification', status: 'approved') + expect_any_instance_of(Twilio::REST::Verify::V2::ServiceContext::VerificationCheckList).to receive(:create).with(to: user.mobile_number, code: auth_code).and_return(verification_double) + expect(subject.auth_code_valid?(session: session, auth_code: auth_code)).to eq(true) + end + end + + describe '.get_user' do + before(:each) do + subject.start(session, user) + end + + it 'user does not exist' do + user.destroy + expect(subject.get_user(session)).to eq(nil) + end + + it 'user exists' do + expect(subject.get_user(session)).to eq(user) + end + end +end \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 00000000..8b4760e6 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,109 @@ +ENV['RAILS_ENV'] = 'test' + +require 'dotenv' +Dotenv.load('config/env/test-defaults.env') + +` +if bundle exec rake db:exists; then + bundle exec rake db:migrate +else + bundle exec rake db:setup +fi +` + +require 'coveralls' +Coveralls.wear!('rails') + +require 'webdrivers' +Webdrivers.install_dir = './vendor' + +require 'rails_helper' +require 'capybara/rspec' +require 'sidekiq/testing' +require 'database_cleaner/active_record' + +Selenium::WebDriver::Chrome::Service.driver_path = ENV['CHROMEDRIVER'] if ENV['CHROMEDRIVER'] + +Capybara.register_driver :headless_chrome_driver do |app| + options = Selenium::WebDriver::Chrome::Options.new(args: ['--headless', '--no-sandbox', '--window-size=1920,1080']) + Capybara::Selenium::Driver.new(app, browser: :chrome, options: options) +end + +Capybara.default_max_wait_time = 0.5 +Capybara.server = :puma, { Silent: true } +Capybara.default_driver = :rack_test +Capybara.javascript_driver = :headless_chrome_driver + +require 'capybara-screenshot' +require 'capybara-screenshot/rspec' + +Capybara::Screenshot.register_driver(:headless_chrome_driver) do |driver, path| + driver.browser.save_screenshot(path) +end + +require 'simplecov' +require 'simplecov-console' + +SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([SimpleCov::Formatter::Console, Coveralls::SimpleCov::Formatter]) +SimpleCov::Formatter::Console.max_rows = 4 +SimpleCov::Formatter::Console.missing_len = 50 +SimpleCov.add_filter 'app/channels' +SimpleCov.add_filter '/spec/' + +require 'webmock/rspec' + +whitelist = ['storage.googleapis.com', 'github.com', 'amazonaws.com', 'googlechromelabs.github.io'] +allowed_sites = ->(uri){ uri.host.match?(Regexp.union(whitelist)) } +WebMock.disable_net_connect!( + allow_localhost: true, + allow: allowed_sites) + +# require helper methods +Dir[Rails.root.join('spec/spec_helpers/**/*.rb')].sort.each { |f| require f } + +RSpec.configure do |config| + config.use_transactional_fixtures = false + + config.before(:suite) do + `bin/webpacker` + DatabaseCleaner.clean_with(:truncation) + end + + config.before(:each) do + DatabaseCleaner.strategy = :transaction + end + + config.before(:each, type: :feature) do + driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test + DatabaseCleaner.strategy = :truncation unless driver_shares_db_connection_with_specs + end + + config.before(:each) do + DatabaseCleaner.start + end + + config.append_after(:each) do + DatabaseCleaner.clean + end + + config.expect_with :rspec do |expectations| + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on a real object. + mocks.verify_partial_doubles = true + end + + config.shared_context_metadata_behavior = :apply_to_host_groups + + # Use color not only in STDOUT but also in pagers and files + config.tty = true + + # Use the specified formatter + config.formatter = :documentation + + config.after(:suite) do + puts + end +end diff --git a/spec/spec_helpers/db_helper.rb b/spec/spec_helpers/db_helper.rb new file mode 100644 index 00000000..5f743526 --- /dev/null +++ b/spec/spec_helpers/db_helper.rb @@ -0,0 +1,41 @@ +def seed_user + @user_password = 'Securepass1' + @user = create(:user, password: @user_password) +end + +def seed_site_settings + @site_settings = create(:site_setting) do |site_setting| + @header_image = create(:header_image, site_setting: site_setting) + @cover_image = create(:cover_image, site_setting: site_setting) + end +end + +def seed_about + @about = create(:about) do |about| + @profile_image = create(:profile_image, about: about) + end +end + +def seed_blog_post + @blog_post = create(:post, user: @user) do |post| + @blog_post_section = create(:post_section, post: post) + end +end + +def seed_gallery_image + @gallery_image = create(:gallery_image, user: @user) +end + +def seed_code_snippet + @code_snippet = create(:code_snippet, user: @user) +end + +def seed_project + @project = create(:project) +end + +def seed_user_and_settings + seed_user + seed_site_settings + seed_about +end \ No newline at end of file diff --git a/spec/spec_helpers/feature_helpers.rb b/spec/spec_helpers/feature_helpers.rb new file mode 100644 index 00000000..324f46ec --- /dev/null +++ b/spec/spec_helpers/feature_helpers.rb @@ -0,0 +1,33 @@ +require 'spec_helpers/session_helper' +require 'spec_helpers/db_helper' + +def login_feature + stub_recaptcha_service + stub_two_factor_auth_service + visit('/') + page.find(:css, '.hamburger-container').click + page.find(:css, '#login-button').click + fill_in('user', with: @user.username) + fill_in('password', with: @user_password) + js_click_input + fill_in('auth_code', with: '123456') + sleep(0.1) + js_click_input + sleep(0.1) +end + +def logout_feature + page.driver.delete('/login') +end + +def js_true? + RSpec.current_example.metadata[:js] +end + +def js_click_input + if js_true? + find('.input-submit').click + else + find('.input-submit-tag', visible: false).click + end +end diff --git a/spec/spec_helpers/session_helper.rb b/spec/spec_helpers/session_helper.rb new file mode 100644 index 00000000..96910d17 --- /dev/null +++ b/spec/spec_helpers/session_helper.rb @@ -0,0 +1,24 @@ +def password_athenticate_admin(user:, password:) + stub_recaptcha_service + post('/login', params: { user: user, password: password, 'g-recaptcha-response': 'test' }) +end + +def login + stub_two_factor_auth_service + password_athenticate_admin(user: @user.username, password: @user_password) + post('/2fa', params: { auth_code: '123456' }) + follow_redirect! +end + +def logout + delete('/login') +end + +def stub_two_factor_auth_service + allow(TwoFactorAuthService).to receive(:send_auth_code).and_return(true) + allow(TwoFactorAuthService).to receive(:auth_code_valid?).and_return(true) +end + +def stub_recaptcha_service + allow(ReCaptchaService).to receive(:recaptcha_valid?).and_return(true) +end \ No newline at end of file diff --git a/spec/support/factory_bot.rb b/spec/support/factory_bot.rb new file mode 100644 index 00000000..195f20aa --- /dev/null +++ b/spec/support/factory_bot.rb @@ -0,0 +1,3 @@ +RSpec.configure do |config| + config.include FactoryBot::Syntax::Methods +end \ No newline at end of file diff --git a/spec/views/abouts/index.html.erb_spec.rb b/spec/views/abouts/index.html.erb_spec.rb new file mode 100644 index 00000000..ad0763c4 --- /dev/null +++ b/spec/views/abouts/index.html.erb_spec.rb @@ -0,0 +1,25 @@ +describe 'Views' do + let(:user) { build_stubbed(:user) } + let(:profile_image) { build_stubbed(:profile_image) } + let(:about) { build_stubbed(:about) } + let(:about_attached_image) { build_stubbed(:about, profile_image: profile_image) } + + describe '/about rendering' do + it 'show view' do + assign(:about, about) + + render template: 'abouts/show' + + expect(rendered).to match(about.about_me) + expect(rendered).not_to match('toolbar-container') + end + + it 'user signed in' do + assign(:about, about) + assign(:user, user) + + render template: 'abouts/show' + expect(rendered).to match('toolbar-container') + end + end +end diff --git a/spec/views/admin/abouts/edit.html.erb_spec.rb b/spec/views/admin/abouts/edit.html.erb_spec.rb new file mode 100644 index 00000000..a851fad2 --- /dev/null +++ b/spec/views/admin/abouts/edit.html.erb_spec.rb @@ -0,0 +1,44 @@ +describe 'Views' do + let(:profile_image) { build_stubbed(:profile_image) } + let(:about) { build_stubbed(:about) } + let(:about_attached_image) { build_stubbed(:about, profile_image: profile_image) } + + describe 'admin/about rendering' do + it 'default view' do + assign(:about, about) + + render template: 'admin/abouts/edit' + + expect(rendered).to match(about.section_title) + expect(rendered).to match(about.about_me) + expect(rendered).to match(about.linkedin_link) + expect(rendered).to match(about.github_link) + expect(rendered).to match(about.name) + expect(rendered).to match(about.location) + expect(rendered).to match(about.contact_email) + expect(rendered).to match("Images will be resized to #{profile_image.x_dim}") + expect(rendered).to match(profile_image.y_dim.to_s) + end + + it 'No image attached' do + about.profile_image = nil + assign(:about, about) + + render template: 'admin/abouts/edit' + + expect(rendered).to match('New image') + expect(rendered).not_to match('Update image') + expect(rendered).not_to match('Remove image') + end + + it 'image attached' do + assign(:about, about_attached_image) + + render template: 'admin/abouts/edit' + + expect(rendered).to match('Update image') + expect(rendered).to match('Remove image') + expect(rendered).not_to match('New image') + end + end +end \ No newline at end of file diff --git a/spec/views/admin/code_snippets/edit.html.erb_spec.rb b/spec/views/admin/code_snippets/edit.html.erb_spec.rb new file mode 100644 index 00000000..d8f1272a --- /dev/null +++ b/spec/views/admin/code_snippets/edit.html.erb_spec.rb @@ -0,0 +1,28 @@ +describe 'Views' do + let(:code_snippet) { create(:code_snippet) } + + describe '/admin/code_snippets/:id/edit rendering' do + context 'edit view' do + before(:each) do + assign(:code_snippet, code_snippet) + render template: '/admin/code_snippets/edit' + end + + it 'it renders code_snippets' do + expect(rendered).to match('code_snippet_title') + expect(rendered).to match('code_snippet_overview') + expect(rendered).to match('code_snippet_snippet') + expect(rendered).to match('code_snippet_extension') + expect(rendered).to match('code_snippet_text') + expect(rendered).to match(code_snippet.title) + expect(rendered).to match(code_snippet.overview) + expect(rendered).to match(code_snippet.text) + expect(rendered).to match(code_snippet.extension) + expect(rendered).to match(admin_code_snippet_path(code_snippet)) + expect(rendered).to match(admin_code_snippets_path) + expect(rendered).to match('Return') + expect(rendered).to match('Remove') + end + end + end +end \ No newline at end of file diff --git a/spec/views/admin/code_snippets/new.html.erb_spec.rb b/spec/views/admin/code_snippets/new.html.erb_spec.rb new file mode 100644 index 00000000..72751582 --- /dev/null +++ b/spec/views/admin/code_snippets/new.html.erb_spec.rb @@ -0,0 +1,20 @@ +describe 'Views' do + let(:code_snippet) { build(:code_snippet) } + + describe '/admin/code-snippets/new rendering' do + context 'new view' do + before(:each) do + assign(:code_snippet, code_snippet) + render template: '/admin/code_snippets/new' + end + + it 'it renders code_snippets' do + expect(rendered).to match('code_snippet_title') + expect(rendered).to match('code_snippet_overview') + expect(rendered).to match('code_snippet_snippet') + expect(rendered).to match('code_snippet_extension') + expect(rendered).to match('code_snippet_text') + end + end + end +end \ No newline at end of file diff --git a/spec/views/admin/gallery_images/edit.html.erb_spec.rb b/spec/views/admin/gallery_images/edit.html.erb_spec.rb new file mode 100644 index 00000000..34b3cef7 --- /dev/null +++ b/spec/views/admin/gallery_images/edit.html.erb_spec.rb @@ -0,0 +1,23 @@ +describe 'Views' do + let(:gallery_image) { create(:gallery_image) } + + describe '/admin/gallery-images/:id/edit rendering' do + context 'edit view' do + before(:each) do + gallery_image + assign(:gallery_image, gallery_image) + render template: 'admin/gallery_images/edit' + end + + it 'it renders posts' do + expect(rendered).to match(Regexp.escape(gallery_image.title)) + expect(rendered).to match(Regexp.escape(gallery_image.latitude.to_s)) + expect(rendered).to match(Regexp.escape(gallery_image.longitude.to_s)) + expect(rendered).to match(admin_gallery_image_path(gallery_image)) + expect(rendered).to match(admin_gallery_images_path) + expect(rendered).to match('Return') + expect(rendered).to match('Remove') + end + end + end +end \ No newline at end of file diff --git a/spec/views/admin/gallery_images/index.html.erb_spec.rb b/spec/views/admin/gallery_images/index.html.erb_spec.rb new file mode 100644 index 00000000..e68feeec --- /dev/null +++ b/spec/views/admin/gallery_images/index.html.erb_spec.rb @@ -0,0 +1,33 @@ +describe 'Views' do + let(:user) { build_stubbed(:user) } + let(:gallery_image1) { build_stubbed(:gallery_image, user: user) } + let(:gallery_image2) { build_stubbed(:gallery_image, user: user) } + let(:gallery_images) { [gallery_image1, gallery_image2] } + + describe '/admin/gallery rendering' do + before(:each) do + allow_any_instance_of(AdminLinkHelper).to receive(:in_admin_scope?).and_return(true) + end + + context 'index view' do + before(:each) do + assign(:gallery_images, gallery_images) + assign(:user, user) + render template: '/admin/gallery_images/index' + end + + it 'it renders gallery_images' do + expect(rendered).to match(gallery_image1.description) + expect(rendered).to match(gallery_image2.description) + expect(rendered).to match('toolbar-container') + end + + it 'no gallery_images' do + assign(:gallery_images, []) + assign(:user, user) + render template: 'gallery_images/index' + expect(rendered).to match('There are no images here...') + end + end + end +end \ No newline at end of file diff --git a/spec/views/admin/gallery_images/new.html.erb_spec.rb b/spec/views/admin/gallery_images/new.html.erb_spec.rb new file mode 100644 index 00000000..d6f43558 --- /dev/null +++ b/spec/views/admin/gallery_images/new.html.erb_spec.rb @@ -0,0 +1,21 @@ +describe 'Views' do + let(:gallery_image) { build(:gallery_image) } + + describe '/admin/gallery-images/new rendering' do + context 'new view' do + before(:each) do + assign(:gallery_image, gallery_image) + render template: '/admin/gallery_images/new' + end + + it 'gallery image form' do + expect(rendered).to match('gallery_image_image_file') + expect(rendered).to match('gallery_image_title') + expect(rendered).to match('gallery_image_date_taken') + expect(rendered).to match('gallery_image_latitude') + expect(rendered).to match('gallery_image_longitude') + expect(rendered).to match(admin_gallery_images_path(GalleryImage.new)) + end + end + end +end \ No newline at end of file diff --git a/spec/views/admin/images/index.html.erb_spec.rb b/spec/views/admin/images/index.html.erb_spec.rb new file mode 100644 index 00000000..ef671174 --- /dev/null +++ b/spec/views/admin/images/index.html.erb_spec.rb @@ -0,0 +1,17 @@ +describe 'Views' do + let(:site_setting) { build_stubbed(:site_setting_with_images) } + + describe 'admin/images rendering' do + it 'Displays current site name' do + site_images = ([site_setting.header_image] + site_setting.cover_images) + + assign(:images, site_images) + + render template: 'admin/images/index' + + expect(rendered).to match('Header image') + expect(rendered).to match('Current image') + expect(rendered).to match(Regexp.escape(site_images.first.description)) + end + end +end \ No newline at end of file diff --git a/spec/views/admin/posts/edit.html.erb_spec.rb b/spec/views/admin/posts/edit.html.erb_spec.rb new file mode 100644 index 00000000..f5b7fd37 --- /dev/null +++ b/spec/views/admin/posts/edit.html.erb_spec.rb @@ -0,0 +1,25 @@ +describe 'Views' do + let!(:post) { create(:post) } + let!(:post_section_one) { create(:post_section, post: post, text: 'post section 1') } + let!(:post_section_two) { create(:post_section, post: post, text: 'post section 2') } + + describe '/admin/posts/:id/edit rendering' do + context 'edit view' do + before(:each) do + assign(:post, post.reload) + render template: '/admin/posts/edit' + end + + it 'it renders posts' do + expect(rendered).to match(Regexp.escape(post.title)) + expect(rendered).to match(Regexp.escape(post.overview)) + expect(rendered).to match(Regexp.escape(post_section_one.text)) + expect(rendered).to match(Regexp.escape(post_section_two.text)) + expect(rendered).to match(admin_post_path(post)) + expect(rendered).to match(posts_path) + expect(rendered).to match('Return') + expect(rendered).to match('Remove') + end + end + end +end \ No newline at end of file diff --git a/spec/views/admin/posts/new.html.erb_spec.rb b/spec/views/admin/posts/new.html.erb_spec.rb new file mode 100644 index 00000000..109b72fe --- /dev/null +++ b/spec/views/admin/posts/new.html.erb_spec.rb @@ -0,0 +1,18 @@ +describe 'Views' do + let(:post) { build(:post) } + + describe '/admin/posts/new rendering' do + context 'new view' do + before(:each) do + assign(:post, post) + render template: '/admin/posts/new' + end + + it 'it renders posts' do + expect(rendered).to match('post_title') + expect(rendered).to match('post_overview') + expect(rendered).to match('post_date_published') + end + end + end +end \ No newline at end of file diff --git a/spec/views/admin/projects/edit.html.erb_spec.rb b/spec/views/admin/projects/edit.html.erb_spec.rb new file mode 100644 index 00000000..647d8655 --- /dev/null +++ b/spec/views/admin/projects/edit.html.erb_spec.rb @@ -0,0 +1,31 @@ +describe 'Views' do + describe '/admin/projects/:id/edit rendering' do + context 'edit view' do + it 'it renders projects' do + project = create(:project) + assign(:project, project) + render template: '/admin/projects/edit' + + expect(rendered).to match(project.title) + expect(rendered).to match(project.overview) + expect(rendered).to match(project.github_link) + expect(rendered).to match(project.site_link) + expect(rendered).to match(admin_project_path(project)) + expect(rendered).to match('Return') + expect(rendered).to match(admin_projects_path) + expect(rendered).to match('Remove') + end + + it 'project-image-attached' do + project = create(:project) + project_image = project.project_images.create(title: 'test') + assign(:project, project) + render template: '/admin/projects/edit' + + expect(rendered).to match('Project image') + expect(rendered).to match('Remove image') + expect(rendered).to match(project_image.title) + end + end + end +end \ No newline at end of file diff --git a/spec/views/admin/projects/new.html.erb_spec.rb b/spec/views/admin/projects/new.html.erb_spec.rb new file mode 100644 index 00000000..28261a19 --- /dev/null +++ b/spec/views/admin/projects/new.html.erb_spec.rb @@ -0,0 +1,18 @@ +describe 'Views' do + describe '/admin/projects/new rendering' do + context 'new view' do + it 'it renders projects' do + project = build(:project) + assign(:project, project) + render template: '/admin/projects/new' + + expect(rendered).to match('project_title') + expect(rendered).to match('project_overview') + expect(rendered).to match('project_github_link') + expect(rendered).to match('project_site_link') + expect(rendered).to match('[project_image_attributes][image_file]') + expect(rendered).to match(admin_projects_path(Project.new)) + end + end + end +end \ No newline at end of file diff --git a/spec/views/admin/site_settings/index.html.erb_spec.rb b/spec/views/admin/site_settings/index.html.erb_spec.rb new file mode 100644 index 00000000..7e75dd75 --- /dev/null +++ b/spec/views/admin/site_settings/index.html.erb_spec.rb @@ -0,0 +1,22 @@ +describe 'Views' do + let(:site_setting) { build_stubbed(:site_setting) } + + describe 'admin/site_settings rendering' do + it 'Displays current site name' do + assign(:site_settings, site_setting) + + render template: 'admin/site_settings/index' + + expect(rendered).to match('Site name') + expect(rendered).to match(Regexp.escape(site_setting.name)) + + expect(rendered).to match('Homepage header') + expect(rendered).to match(Regexp.escape(site_setting.header_text)) + + expect(rendered).to match('Homepage subtitle') + expect(rendered).to match(Regexp.escape(site_setting.subtitle_text)) + + expect(rendered).to match('Enable typed header') + end + end +end \ No newline at end of file diff --git a/spec/views/admin/users/edit.html.erb_spec.rb b/spec/views/admin/users/edit.html.erb_spec.rb new file mode 100644 index 00000000..a19d628e --- /dev/null +++ b/spec/views/admin/users/edit.html.erb_spec.rb @@ -0,0 +1,15 @@ +describe 'Views' do + let(:user) { build_stubbed(:user) } + + describe 'admin/users/:id/edit rendering' do + it 'Displays current user details' do + assign(:user, user) + + render template: 'admin/users/edit' + + expect(rendered).to match(Regexp.escape("Username #{user.username}")) + expect(rendered).to match(Regexp.escape("Email Address #{user.email}")) + expect(rendered).to match(Regexp.escape("Mobile Number #{user.mobile_number}")) + end + end +end \ No newline at end of file diff --git a/spec/views/admins/analytics.html.erb_spec.rb b/spec/views/admins/analytics.html.erb_spec.rb new file mode 100644 index 00000000..04609dc2 --- /dev/null +++ b/spec/views/admins/analytics.html.erb_spec.rb @@ -0,0 +1,14 @@ +describe 'Views' do + let(:user) { build_stubbed(:user) } + + describe 'admins/analytics rendering' do + it 'Displays website hits analytics' do + # Placeholder spec + assign(:user, user) + + render template: 'admins/analytics' + + expect(rendered).to match(/Website hits/) + end + end +end \ No newline at end of file diff --git a/spec/views/admins/general.html.erb_spec.rb b/spec/views/admins/general.html.erb_spec.rb new file mode 100644 index 00000000..ad842b02 --- /dev/null +++ b/spec/views/admins/general.html.erb_spec.rb @@ -0,0 +1,52 @@ +describe 'Views' do + let(:user) { create(:user) } + + describe 'admins/general section' do + it 'Displays last login time' do + travel_to Time.zone.local(2020, 04, 19, 15, 20, 00) + user.update(last_login_time: Time.zone.now) + assign(:user, user) + + render template: 'admins/general' + + expect(rendered).to match(%r{Time and Date: 15:20 19-04-2020}) + end + + it 'Displays last login ip address' do + user.update(last_login_ip: '127.0.0.1') + assign(:user, user) + + render template: 'admins/general' + + expect(rendered).to match(%r{IP Address: 127.0.0.1}) + end + + it 'Displays user details' do + assign(:user, user) + + render template: 'admins/general' + + expect(rendered).to match(Regexp.escape("Username #{user.username}")) + expect(rendered).to match(Regexp.escape("Email Address #{user.email}")) + expect(rendered).to match(Regexp.escape("Mobile Number #{user.mobile_number}")) + end + + it 'Displays overview of notifications' do + # Placeholder spec + assign(:user, user) + + render template: 'admins/general' + + expect(rendered).to match(/Notifications/) + end + + it 'Displays overview of notifications' do + # Placeholder spec + assign(:user, user) + + render template: 'admins/general' + + expect(rendered).to match(/Analytics/) + end + end +end \ No newline at end of file diff --git a/spec/views/admins/notifications.html.erb_spec.rb b/spec/views/admins/notifications.html.erb_spec.rb new file mode 100644 index 00000000..61a6a07f --- /dev/null +++ b/spec/views/admins/notifications.html.erb_spec.rb @@ -0,0 +1,41 @@ +describe 'Views' do + let(:user) { build_stubbed(:user) } + + describe 'admins/notifications rendering' do + it 'Displays new contact emails' do + # Placeholder spec + assign(:user, user) + + render template: 'admins/notifications' + + expect(rendered).to match(/Contact Emails/) + end + + it 'Displays new blog comment notifications' do + # Placeholder spec + assign(:user, user) + + render template: 'admins/notifications' + + expect(rendered).to match(/Blog Comments/) + end + + it 'Displays new blog comment notifications' do + # Placeholder spec + assign(:user, user) + + render template: 'admins/notifications' + + expect(rendered).to match(/Blog Comments/) + end + + it 'Displays new say hello notifications' do + # Placeholder spec + assign(:user, user) + + render template: 'admins/notifications' + + expect(rendered).to match(/Say Hellos/) + end + end +end \ No newline at end of file diff --git a/spec/views/code_snippets/index.html.erb_spec.rb b/spec/views/code_snippets/index.html.erb_spec.rb new file mode 100644 index 00000000..4b7de3ce --- /dev/null +++ b/spec/views/code_snippets/index.html.erb_spec.rb @@ -0,0 +1,36 @@ +describe 'Views' do + let(:user) { build_stubbed(:user) } + let(:code_snippet1) { build_stubbed(:code_snippet, user: user) } + let(:code_snippet2) { build_stubbed(:code_snippet, user: user) } + let(:code_snippets) { [code_snippet1, code_snippet2] } + + describe '/blog rendering' do + it 'index view' do + assign(:code_snippets, code_snippets) + + render template: 'code_snippets/index' + + expect(rendered).to match(code_snippet1.title) + expect(rendered).to match(code_snippet2.title) + expect(rendered).to match(code_snippet1.overview) + expect(rendered).to match(code_snippet2.overview) + expect(rendered).not_to match('toolbar-container') + expect(rendered).to match(code_snippet_path(code_snippet1)) + expect(rendered).to match(code_snippet_path(code_snippet2)) + end + + it 'user signed in' do + assign(:code_snippets, code_snippets) + assign(:user, user) + + render template: 'code_snippets/index' + expect(rendered).to match('toolbar-container') + end + + it 'no code_snippets' do + assign(:code_snippets, []) + render template: 'code_snippets/index' + expect(rendered).to match('There are no code snippets here...') + end + end +end \ No newline at end of file diff --git a/spec/views/code_snippets/show.html.erb_spec.rb b/spec/views/code_snippets/show.html.erb_spec.rb new file mode 100644 index 00000000..cfc740af --- /dev/null +++ b/spec/views/code_snippets/show.html.erb_spec.rb @@ -0,0 +1,22 @@ +describe 'Views' do + let(:user) { build_stubbed(:user) } + let(:code_snippet) { build_stubbed(:code_snippet, user: user) } + + describe '/code-snippets/:id rendering' do + it 'show view' do + assign(:code_snippet, code_snippet) + expect_any_instance_of(MarkdownHelper).to receive(:markdown_admin).with(code_snippet.text).and_return('some markdown') + expect_any_instance_of(MarkdownHelper).to receive(:markdown_code).with(code: code_snippet.snippet, extension: code_snippet.extension).and_return('highlighted snippet') + expect_any_instance_of(DateHelper).to receive(:full_date).with(code_snippet.updated_at).and_return('updated_date') + + render template: 'code_snippets/show' + + expect(rendered).to match(code_snippet.title) + expect(rendered).to match(user.username) + expect(rendered).to match('some markdown') + expect(rendered).to match('highlighted snippet') + expect(rendered).to match('updated_date') + expect(rendered).to match(code_snippets_path) + end + end +end \ No newline at end of file diff --git a/spec/views/contact_messages/new.html.erb_spec.rb b/spec/views/contact_messages/new.html.erb_spec.rb new file mode 100644 index 00000000..14c8c703 --- /dev/null +++ b/spec/views/contact_messages/new.html.erb_spec.rb @@ -0,0 +1,22 @@ +describe 'Views' do + let(:contact_message) { build(:contact_message) } + let(:about) { build(:about) } + + describe '/contact rendering' do + context 'new view' do + before(:each) do + assign(:contact_message, contact_message) + assign(:about, about) + render template: '/contact_messages/new' + end + + it 'it renders form' do + expect(rendered).to match('contact_message_from') + expect(rendered).to match('contact_message_subject') + expect(rendered).to match('contact_message_email') + expect(rendered).to match('contact_message_content') + expect(rendered).to match(contact_messages_path) + end + end + end +end diff --git a/spec/views/gallery_images/index.html.erb_spec.rb b/spec/views/gallery_images/index.html.erb_spec.rb new file mode 100644 index 00000000..c51af266 --- /dev/null +++ b/spec/views/gallery_images/index.html.erb_spec.rb @@ -0,0 +1,32 @@ +describe 'Views' do + let(:user) { build_stubbed(:user) } + let(:gallery_image1) { build_stubbed(:gallery_image, user: user) } + let(:gallery_image2) { build_stubbed(:gallery_image, user: user) } + let(:gallery_images) { [gallery_image1, gallery_image2] } + + describe '/gallery rendering' do + it 'index view' do + assign(:gallery_images, gallery_images) + + render template: 'gallery_images/index' + + expect(rendered).to match(gallery_image1.description) + expect(rendered).to match(gallery_image2.description) + expect(rendered).not_to match('toolbar-container') + end + + it 'user signed in' do + assign(:gallery_images, gallery_images) + assign(:user, user) + + render template: 'gallery_images/index' + expect(rendered).to match('toolbar-container') + end + + it 'no gallery_images' do + assign(:gallery_images, []) + render template: 'gallery_images/index' + expect(rendered).to match('There are no images here...') + end + end +end \ No newline at end of file diff --git a/spec/views/homepages/index.html.erb_spec.rb b/spec/views/homepages/index.html.erb_spec.rb new file mode 100644 index 00000000..5aefb5b9 --- /dev/null +++ b/spec/views/homepages/index.html.erb_spec.rb @@ -0,0 +1,30 @@ +describe 'Views' do + let(:site_setting) { build_stubbed(:site_setting) } + let(:site_setting_header_enabled) { build_stubbed(:site_setting, typed_header_enabled: true) } + let(:header_image) { build_stubbed(:header_image, site_setting: site_setting) } + + describe 'homepages/index rendering' do + it 'Custom user titles' do + assign(:site_settings, site_setting) + assign(:cover_images, []) + assign(:header_image, header_image) + + render template: 'homepages/index', layout: 'layouts/application' + + expect(rendered).to match(Regexp.escape(site_setting.header_text)) + expect(rendered).to match(Regexp.escape(site_setting.subtitle_text)) + expect(rendered).to_not match(/id="typed-strings-header"/) + expect(rendered).to_not match(/id="typed-strings-subtitle"/) + end + + it 'Typed header enabled' do + assign(:site_settings, site_setting_header_enabled) + assign(:cover_images, []) + assign(:header_image, header_image) + + render template: 'homepages/index', layout: 'layouts/application' + expect(rendered).to match(/id="typed-strings-header"/) + expect(rendered).to match(/id="typed-strings-header"/) + end + end +end \ No newline at end of file diff --git a/spec/views/partials/_admin_toolbar_spec.rb b/spec/views/partials/_admin_toolbar_spec.rb new file mode 100644 index 00000000..79adb1bf --- /dev/null +++ b/spec/views/partials/_admin_toolbar_spec.rb @@ -0,0 +1,50 @@ +describe 'Views' do + let(:user) { create(:user) } + let(:new_model) { build(:post, user: user) } + let(:exisiting_singular_resource) { create(:about) } + let(:exisiting_resources) { create(:post, user: user) } + + describe 'admin toolbar rendering' do + context('user unassigned') do + it 'no render' do + render partial: 'partials/admin_toolbar', locals: { model: exisiting_resources } + expect(rendered).not_to match('toolbar-container') + end + end + + context('user assigned') do + before(:each) do + assign(:user, user) + allow_any_instance_of(AdminLinkHelper).to receive(:current_path).and_return('/admin/test') + end + + context 'admin scope' do + it 'singular model' do + render partial: 'partials/admin_toolbar', locals: { model: exisiting_singular_resource, singular: true } + expect(rendered).to match('View Section') + end + + it 'resources' do + render partial: 'partials/admin_toolbar', locals: { model: exisiting_resources } + expect(rendered).to match('View Section') + end + end + + context 'public scope' do + before(:each) do + allow_any_instance_of(AdminLinkHelper).to receive(:current_path).and_return('/test') + end + + it 'new model' do + render partial: 'partials/admin_toolbar', locals: { model: new_model } + expect(rendered).to match('Create New') + end + + it 'edit model' do + render partial: 'partials/admin_toolbar', locals: { model: exisiting_resources } + expect(rendered).to match('Edit') + end + end + end + end +end \ No newline at end of file diff --git a/spec/views/password/reset_password.html.erb_spec.rb b/spec/views/password/reset_password.html.erb_spec.rb new file mode 100644 index 00000000..cfa019a9 --- /dev/null +++ b/spec/views/password/reset_password.html.erb_spec.rb @@ -0,0 +1,13 @@ +describe 'Views' do + let(:user) { create(:user) } + + describe 'passwords/reset rendering' do + it 'Displays username' do + assign(:user, user) + + render template: 'passwords/reset_password' + + expect(rendered).to match(Regexp.escape("User: #{user.username}")) + end + end +end \ No newline at end of file diff --git a/spec/views/posts/index.html.erb_spec.rb b/spec/views/posts/index.html.erb_spec.rb new file mode 100644 index 00000000..0e89a5ac --- /dev/null +++ b/spec/views/posts/index.html.erb_spec.rb @@ -0,0 +1,36 @@ +describe 'Views' do + let(:user) { build_stubbed(:user) } + let(:post1) { build_stubbed(:post, user: user) } + let(:post2) { build_stubbed(:post, user: user) } + let(:posts) { [post1, post2] } + + describe '/blog rendering' do + it 'index view' do + assign(:posts, posts) + + render template: 'posts/index' + + expect(rendered).to match(post1.title) + expect(rendered).to match(post2.title) + expect(rendered).to match(post1.overview) + expect(rendered).to match(post2.overview) + expect(rendered).not_to match('toolbar-container') + expect(rendered).to match(post_path(post1)) + expect(rendered).to match(post_path(post2)) + end + + it 'user signed in' do + assign(:posts, posts) + assign(:user, user) + + render template: 'posts/index' + expect(rendered).to match('toolbar-container') + end + + it 'no posts' do + assign(:posts, []) + render template: 'posts/index' + expect(rendered).to match('There are no posts here...') + end + end +end \ No newline at end of file diff --git a/spec/views/posts/show.html.erb_spec.rb b/spec/views/posts/show.html.erb_spec.rb new file mode 100644 index 00000000..41098981 --- /dev/null +++ b/spec/views/posts/show.html.erb_spec.rb @@ -0,0 +1,22 @@ +describe 'Views' do + let!(:user) { create(:user) } + let!(:post) { create(:post, user: user) } + let!(:post_section_one) { create(:post_section, post: post, text: 'post section 1') } + let!(:post_section_two) { create(:post_section, post: post, text: 'post section 2') } + + describe '/blog/:id rendering' do + it 'show view' do + assign(:post, post.reload) + expect_any_instance_of(MarkdownHelper).to receive(:markdown_admin).with(post_section_one.text).and_return("markdown #{post_section_one.text} markdown") + expect_any_instance_of(MarkdownHelper).to receive(:markdown_admin).with(post_section_two.text).and_return("markdown #{post_section_two.text} markdown") + + render template: 'posts/show' + + expect(rendered).to match(Regexp.escape(post.title)) + expect(rendered).to match(Regexp.escape(user.username)) + expect(rendered).to match(posts_path) + expect(rendered).to match("markdown #{post_section_one.text} markdown") + expect(rendered).to match("markdown #{post_section_two.text} markdown") + end + end +end \ No newline at end of file diff --git a/spec/views/projects/index.html.erb_spec.rb b/spec/views/projects/index.html.erb_spec.rb new file mode 100644 index 00000000..a99829e6 --- /dev/null +++ b/spec/views/projects/index.html.erb_spec.rb @@ -0,0 +1,38 @@ +describe 'Views' do + let(:user) { build_stubbed(:user) } + let(:project1) { build_stubbed(:project) } + let(:project2) { build_stubbed(:project) } + let(:projects) { [project1, project2] } + + describe '/projects rendering' do + it 'index view' do + assign(:projects, projects) + + render template: 'projects/index' + + expect(rendered).to match(project1.title) + expect(rendered).to match(project2.title) + expect(rendered).to match(project1.overview) + expect(rendered).to match(project2.overview) + expect(rendered).to match(project1.github_link) + expect(rendered).to match(project2.github_link) + expect(rendered).to match(project1.site_link) + expect(rendered).to match(project2.site_link) + expect(rendered).not_to match('toolbar-container') + end + + it 'no projects' do + assign(:projects, []) + render template: 'projects/index' + expect(rendered).to match('There are no projects here...') + end + + it 'user signed in' do + assign(:projects, projects) + assign(:user, user) + + render template: 'projects/index' + expect(rendered).to match('toolbar-container') + end + end +end \ No newline at end of file diff --git a/tasks b/tasks new file mode 100755 index 00000000..c435534b --- /dev/null +++ b/tasks @@ -0,0 +1,147 @@ +#!/usr/bin/env bash +set -euo pipefail + +COMPOSE_PROJECT_NAME=home-server-development +APP_SERVICE_NAME=app +APP_HEALTHCHECK_URL=http://0.0.0.0:5000 + +# Set container user ID +export FIXUID="$(id -u)" +export FIXGID="$(id -g)" + +function build { + source ./config/env/build_args.env + docker compose \ + -p $COMPOSE_PROJECT_NAME \ + -f ./.docker/docker-compose/dev.yml \ + build "$@" +} + +function start { + docker compose \ + -p $COMPOSE_PROJECT_NAME \ + -f ./.docker/docker-compose/dev.yml \ + up "$@" +} + +function stop { + docker compose \ + -p $COMPOSE_PROJECT_NAME \ + -f ./.docker/docker-compose/dev.yml \ + down "$@" +} + +function run { + docker compose \ + -p $COMPOSE_PROJECT_NAME \ + -f ./.docker/docker-compose/dev.yml \ + run $APP_SERVICE_NAME /bin/bash -c "source ./.docker/scripts/entrypoint-dev && $*" +} + +function exec { + ensure_app_container_running + docker compose \ + -p $COMPOSE_PROJECT_NAME \ + -f ./.docker/docker-compose/dev.yml \ + exec $APP_SERVICE_NAME /bin/bash -c "source ./.docker/scripts/entrypoint-dev && $*" +} + +function sh { + ensure_app_container_running + docker compose \ + -p $COMPOSE_PROJECT_NAME \ + -f ./.docker/docker-compose/dev.yml \ + exec $APP_SERVICE_NAME /bin/bash --init-file ./.docker/scripts/entrypoint-dev +} + +function rails { + exec bundle exec rails "$@" +} + +function yarn { + exec yarn "$@" +} + +function bundle { + exec bundle "$@" +} + +function rubocop { + exec bundle exec rubocop "$@" +} + +function attach { + docker attach --detach-keys="ctrl-c" home-server-app-dev +} + +function rspec { + ensure_app_container_running + docker compose \ + -p $COMPOSE_PROJECT_NAME \ + -f ./.docker/docker-compose/dev.yml \ + exec -e RAILS_ENV=test $APP_SERVICE_NAME \ + /bin/bash -c "source ./.docker/scripts/entrypoint-dev && bundle exec rspec $*" +} + +function ensure_app_container_running { + (! (docker ps | grep -q $COMPOSE_PROJECT_NAME)) && up -d + until curl --output /dev/null --silent --head "$APP_HEALTHCHECK_URL" ; do + echo 'waiting for app...' + sleep 2.5 + done +} + +function build-all-images { + build-images-base + build-images-app + build-images-worker + build +} + +function build-images-base { + source ./config/env/build_args.env + [ -z "$GRECAPTCHA_SITE_KEY" ] && echo "GRECAPTCHA_SITE_KEY empty, set in config/env/build_args.env" && exit 1 + + GIT_SHA="$(git rev-parse HEAD | head -c8)" + + docker build \ + --build-arg grecaptcha_site_key="$GRECAPTCHA_SITE_KEY" \ + -t cpcwood/home-server-base:latest \ + -t cpcwood/home-server-base:"$GIT_SHA" \ + -f ./.docker/dockerfiles/base.Dockerfile \ + . +} + +function build-images-app { + GIT_SHA="$(git rev-parse HEAD | head -c8)" + + docker build \ + -t cpcwood/home-server-app:latest \ + -t cpcwood/home-server-app:"$GIT_SHA" \ + -f ./.docker/dockerfiles/Dockerfile \ + . +} + +function build-images-worker { + GIT_SHA="$(git rev-parse HEAD | head -c8)" + + docker build \ + -t cpcwood/home-server-worker-dependencies:latest \ + -t cpcwood/home-server-worker-dependencies:"$GIT_SHA" \ + -f ./.docker/dockerfiles/worker-dependencies.Dockerfile \ + . + + docker build \ + -t cpcwood/home-server-worker:latest \ + -t cpcwood/home-server-worker:"$GIT_SHA" \ + -f ./.docker/dockerfiles/worker.Dockerfile \ + . +} + +if [[ ! $(type -t "$1") == function ]]; then + echo "Invalid command entered" + exit 1 +fi + +TIMEFORMAT="Task completed in %3lR" +time "${@:-default}" diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb deleted file mode 100644 index d19212ab..00000000 --- a/test/application_system_test_case.rb +++ /dev/null @@ -1,5 +0,0 @@ -require "test_helper" - -class ApplicationSystemTestCase < ActionDispatch::SystemTestCase - driven_by :selenium, using: :chrome, screen_size: [1400, 1400] -end diff --git a/test/channels/application_cable/connection_test.rb b/test/channels/application_cable/connection_test.rb deleted file mode 100644 index 800405f1..00000000 --- a/test/channels/application_cable/connection_test.rb +++ /dev/null @@ -1,11 +0,0 @@ -require "test_helper" - -class ApplicationCable::ConnectionTest < ActionCable::Connection::TestCase - # test "connects with cookies" do - # cookies.signed[:user_id] = 42 - # - # connect - # - # assert_equal connection.user_id, "42" - # end -end diff --git a/test/controllers/homepage_controller_test.rb b/test/controllers/homepage_controller_test.rb deleted file mode 100644 index d46ae261..00000000 --- a/test/controllers/homepage_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class HomepageControllerTest < ActionDispatch::IntegrationTest - # test "the truth" do - # assert true - # end -end diff --git a/test/helpers/.keep b/test/helpers/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/test/integration/.keep b/test/integration/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/test/mailers/.keep b/test/mailers/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/test/models/.keep b/test/models/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/test/system/.keep b/test/system/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/test/test_helper.rb b/test/test_helper.rb deleted file mode 100644 index d5300f88..00000000 --- a/test/test_helper.rb +++ /dev/null @@ -1,13 +0,0 @@ -ENV['RAILS_ENV'] ||= 'test' -require_relative '../config/environment' -require 'rails/test_help' - -class ActiveSupport::TestCase - # Run tests in parallel with specified workers - parallelize(workers: :number_of_processors) - - # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. - fixtures :all - - # Add more helper methods to be used by all tests here... -end diff --git a/yarn.lock b/yarn.lock index 3fea1e0a..45477579 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,1144 +2,2129 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" - integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== - dependencies: - browserslist "^4.9.1" - invariant "^2.2.4" - semver "^5.5.0" - -"@babel/core@^7.7.2": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== -"@babel/generator@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" - integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA== - dependencies: - "@babel/types" "^7.9.0" +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742" + integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.20.0", "@babel/core@^7.22.15", "@babel/core@^7.23.9": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3" + integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.1" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.24.1" + "@babel/parser" "^7.24.1" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/eslint-parser@^7.19.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz#e27eee93ed1d271637165ef3a86e2b9332395c32" + integrity sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.1" + +"@babel/generator@^7.24.1", "@babel/generator@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" + integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== + dependencies: + "@babel/types" "^7.24.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" - integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" - integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-compilation-targets@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" - integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== - dependencies: - "@babel/compat-data" "^7.8.6" - browserslist "^4.9.1" - invariant "^2.2.4" - levenary "^1.1.1" - semver "^5.5.0" - -"@babel/helper-create-class-features-plugin@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" - integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" - -"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" - integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-regex" "^7.8.3" - regexpu-core "^4.7.0" - -"@babel/helper-define-map@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" - integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/types" "^7.8.3" - lodash "^4.17.13" - -"@babel/helper-explode-assignable-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" - integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== - dependencies: - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-hoist-variables@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" - integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== - dependencies: - "@babel/types" "^7.8.3" -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== +"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.22.5" -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" - lodash "^4.17.13" + "@babel/types" "^7.22.15" -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== - -"@babel/helper-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" - integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz#db58bf57137b623b916e24874ab7188d93d7f68f" + integrity sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd" + integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA== dependencies: - lodash "^4.17.13" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" -"@babel/helper-remap-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" - integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-wrap-function" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" - integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== +"@babel/helper-member-expression-to-functions@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== + dependencies: + "@babel/types" "^7.24.0" + +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" + integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== + +"@babel/helper-remap-async-to-generator@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" + integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94" + integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" - integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== - -"@babel/helper-wrap-function@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" - integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helpers@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" - integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - -"@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - chalk "^2.0.0" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.1" + "@babel/types" "^7.24.0" + +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" js-tokens "^4.0.0" - -"@babel/parser@^7.8.6", "@babel/parser@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" - integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== - -"@babel/plugin-proposal-async-generator-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" - integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" + integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" + integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" + integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.24.1" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" + integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + 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" + +"@babel/plugin-proposal-object-rest-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-proposal-private-property-in-object@^7.21.11": + version "7.21.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz#69d597086b6760c4126525cfa154f34631ff272c" + integrity sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" - "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.7.0": +"@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" - integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-proposal-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" - integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-proposal-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" - integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" - integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.8.3": +"@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" - integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - -"@babel/plugin-proposal-object-rest-spread@^7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" - integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" -"@babel/plugin-proposal-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" - integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== +"@babel/plugin-syntax-import-assertions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" + integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-proposal-optional-chaining@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" - integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== +"@babel/plugin-syntax-import-attributes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" + integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" - integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.8" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-async-generators@^7.8.0": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" + integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-syntax-json-strings@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: - "@babel/helper-plugin-utils" "^7.8.0" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" - integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.0": +"@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.8.0": +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.0": +"@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" - integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" - integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" - integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" + integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-block-scoped-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" - integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" - integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== +"@babel/plugin-transform-arrow-functions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" + integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - lodash "^4.17.13" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-classes@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" - integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ== +"@babel/plugin-transform-async-generator-functions@^7.24.3": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" + integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" - globals "^11.1.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-computed-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" - integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== +"@babel/plugin-transform-async-to-generator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" + integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-imports" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-remap-async-to-generator" "^7.22.20" -"@babel/plugin-transform-destructuring@^7.6.0", "@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b" - integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ== +"@babel/plugin-transform-block-scoped-functions@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" + integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" - integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== +"@babel/plugin-transform-block-scoping@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz#27af183d7f6dad890531256c7a45019df768ac1f" + integrity sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-duplicate-keys@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" - integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== +"@babel/plugin-transform-class-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" + integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-exponentiation-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" - integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== +"@babel/plugin-transform-class-static-block@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz#4e37efcca1d9f2fcb908d1bae8b56b4b6e9e1cb6" + integrity sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-for-of@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" - integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== +"@babel/plugin-transform-classes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1" + integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" -"@babel/plugin-transform-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" - integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== +"@babel/plugin-transform-computed-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" + integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/template" "^7.24.0" -"@babel/plugin-transform-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" - integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== +"@babel/plugin-transform-destructuring@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345" + integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-member-expression-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" - integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== +"@babel/plugin-transform-dotall-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" + integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-modules-amd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" - integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== +"@babel/plugin-transform-duplicate-keys@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" + integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-modules-commonjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" - integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== +"@babel/plugin-transform-dynamic-import@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" + integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-modules-systemjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" - integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== +"@babel/plugin-transform-exponentiation-operator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" + integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-modules-umd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" - integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== +"@babel/plugin-transform-export-namespace-from@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" + integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" - integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== +"@babel/plugin-transform-for-of@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" + integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-new-target@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" - integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== +"@babel/plugin-transform-function-name@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" + integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-object-super@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" - integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== +"@babel/plugin-transform-json-strings@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" + integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-parameters@^7.8.7": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a" - integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg== +"@babel/plugin-transform-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" + integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-property-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" - integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== +"@babel/plugin-transform-logical-assignment-operators@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" + integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-regenerator@^7.7.0", "@babel/plugin-transform-regenerator@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" - integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== +"@babel/plugin-transform-member-expression-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" + integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== dependencies: - regenerator-transform "^0.14.2" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-modules-amd@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" + integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-reserved-words@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" - integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== +"@babel/plugin-transform-modules-commonjs@^7.20.0", "@babel/plugin-transform-modules-commonjs@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" + integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-runtime@^7.6.2": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b" - integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw== +"@babel/plugin-transform-modules-systemjs@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" + integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - resolve "^1.8.1" - semver "^5.5.1" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-identifier" "^7.22.20" -"@babel/plugin-transform-shorthand-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" - integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== +"@babel/plugin-transform-modules-umd@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" + integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" + integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" - integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" + integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" + integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff" + integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA== + dependencies: + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.24.1" + +"@babel/plugin-transform-object-super@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" + integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-replace-supers" "^7.24.1" + +"@babel/plugin-transform-optional-catch-binding@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" + integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-sticky-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" - integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6" + integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-regex" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510" + integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-template-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" - integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== +"@babel/plugin-transform-private-methods@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" + integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-typeof-symbol@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" - integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== +"@babel/plugin-transform-private-property-in-object@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a" + integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-unicode-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" - integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== +"@babel/plugin-transform-property-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" + integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.24.0" -"@babel/preset-env@^7.7.1": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" - integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== - dependencies: - "@babel/compat-data" "^7.9.0" - "@babel/helper-compilation-targets" "^7.8.7" - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-proposal-async-generator-functions" "^7.8.3" - "@babel/plugin-proposal-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-json-strings" "^7.8.3" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-numeric-separator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.9.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.9.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.8.0" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.8.3" - "@babel/plugin-transform-async-to-generator" "^7.8.3" - "@babel/plugin-transform-block-scoped-functions" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.9.0" - "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" - "@babel/plugin-transform-dotall-regex" "^7.8.3" - "@babel/plugin-transform-duplicate-keys" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.9.0" - "@babel/plugin-transform-function-name" "^7.8.3" - "@babel/plugin-transform-literals" "^7.8.3" - "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.9.0" - "@babel/plugin-transform-modules-commonjs" "^7.9.0" - "@babel/plugin-transform-modules-systemjs" "^7.9.0" - "@babel/plugin-transform-modules-umd" "^7.9.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" - "@babel/plugin-transform-new-target" "^7.8.3" - "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.7" - "@babel/plugin-transform-property-literals" "^7.8.3" - "@babel/plugin-transform-regenerator" "^7.8.7" - "@babel/plugin-transform-reserved-words" "^7.8.3" - "@babel/plugin-transform-shorthand-properties" "^7.8.3" - "@babel/plugin-transform-spread" "^7.8.3" - "@babel/plugin-transform-sticky-regex" "^7.8.3" - "@babel/plugin-transform-template-literals" "^7.8.3" - "@babel/plugin-transform-typeof-symbol" "^7.8.4" - "@babel/plugin-transform-unicode-regex" "^7.8.3" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.9.0" - browserslist "^4.9.1" - core-js-compat "^3.6.2" - invariant "^2.2.2" - levenary "^1.1.1" - semver "^5.5.0" - -"@babel/preset-modules@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" - integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== +"@babel/plugin-transform-regenerator@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" + integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" + integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-runtime@^7.19.0": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f" + integrity sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ== + dependencies: + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-plugin-utils" "^7.24.0" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.1" + babel-plugin-polyfill-regenerator "^0.6.1" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" + integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-spread@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" + integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" + integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-template-literals@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" + integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-typeof-symbol@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7" + integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-unicode-escapes@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" + integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-unicode-property-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" + integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-unicode-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" + integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/plugin-transform-unicode-sets-regex@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" + integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.24.0" + +"@babel/preset-env@^7.20.0": + version "7.24.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.3.tgz#f3f138c844ffeeac372597b29c51b5259e8323a3" + integrity sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA== + dependencies: + "@babel/compat-data" "^7.24.1" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@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.24.1" + "@babel/plugin-syntax-import-attributes" "^7.24.1" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@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-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.24.1" + "@babel/plugin-transform-async-generator-functions" "^7.24.3" + "@babel/plugin-transform-async-to-generator" "^7.24.1" + "@babel/plugin-transform-block-scoped-functions" "^7.24.1" + "@babel/plugin-transform-block-scoping" "^7.24.1" + "@babel/plugin-transform-class-properties" "^7.24.1" + "@babel/plugin-transform-class-static-block" "^7.24.1" + "@babel/plugin-transform-classes" "^7.24.1" + "@babel/plugin-transform-computed-properties" "^7.24.1" + "@babel/plugin-transform-destructuring" "^7.24.1" + "@babel/plugin-transform-dotall-regex" "^7.24.1" + "@babel/plugin-transform-duplicate-keys" "^7.24.1" + "@babel/plugin-transform-dynamic-import" "^7.24.1" + "@babel/plugin-transform-exponentiation-operator" "^7.24.1" + "@babel/plugin-transform-export-namespace-from" "^7.24.1" + "@babel/plugin-transform-for-of" "^7.24.1" + "@babel/plugin-transform-function-name" "^7.24.1" + "@babel/plugin-transform-json-strings" "^7.24.1" + "@babel/plugin-transform-literals" "^7.24.1" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" + "@babel/plugin-transform-member-expression-literals" "^7.24.1" + "@babel/plugin-transform-modules-amd" "^7.24.1" + "@babel/plugin-transform-modules-commonjs" "^7.24.1" + "@babel/plugin-transform-modules-systemjs" "^7.24.1" + "@babel/plugin-transform-modules-umd" "^7.24.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.24.1" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" + "@babel/plugin-transform-numeric-separator" "^7.24.1" + "@babel/plugin-transform-object-rest-spread" "^7.24.1" + "@babel/plugin-transform-object-super" "^7.24.1" + "@babel/plugin-transform-optional-catch-binding" "^7.24.1" + "@babel/plugin-transform-optional-chaining" "^7.24.1" + "@babel/plugin-transform-parameters" "^7.24.1" + "@babel/plugin-transform-private-methods" "^7.24.1" + "@babel/plugin-transform-private-property-in-object" "^7.24.1" + "@babel/plugin-transform-property-literals" "^7.24.1" + "@babel/plugin-transform-regenerator" "^7.24.1" + "@babel/plugin-transform-reserved-words" "^7.24.1" + "@babel/plugin-transform-shorthand-properties" "^7.24.1" + "@babel/plugin-transform-spread" "^7.24.1" + "@babel/plugin-transform-sticky-regex" "^7.24.1" + "@babel/plugin-transform-template-literals" "^7.24.1" + "@babel/plugin-transform-typeof-symbol" "^7.24.1" + "@babel/plugin-transform-unicode-escapes" "^7.24.1" + "@babel/plugin-transform-unicode-property-regex" "^7.24.1" + "@babel/plugin-transform-unicode-regex" "^7.24.1" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== 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" -"@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" - integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" - integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.0" - "@babel/types" "^7.9.0" - debug "^4.1.0" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.20.0", "@babel/runtime@^7.8.4": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" + integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + +"@babel/traverse@^7.24.1": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" + integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== + dependencies: + "@babel/code-frame" "^7.24.1" + "@babel/generator" "^7.24.1" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.24.1" + "@babel/types" "^7.24.0" + debug "^4.3.1" globals "^11.1.0" - lodash "^4.17.13" -"@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" - integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - lodash "^4.17.13" + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@csstools/convert-colors@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" - integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@rails/actioncable@^6.0.0": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-6.0.2.tgz#bcba9bcd6ee09a47c6628336e07399a68ca87814" - integrity sha512-vN78gohsXPlC5jxBHlmiwkUI9bv6SulcZaE72kAIg/G4ou+wTdiMWPJK1bf2IxUNf+sfOjhl+tbRmY4AzJcgrw== +"@csstools/css-parser-algorithms@^2.3.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz#c45440d1efa2954006748a01697072dae5881bcd" + integrity sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA== -"@rails/activestorage@^6.0.0": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@rails/activestorage/-/activestorage-6.0.2.tgz#3882da2716d1f21091840fc52b71091d406a9c43" - integrity sha512-X0uGBLNsSKvVw5n93rH7k+7rbxc3Cq7p0ShiQbrk1cN0xflGjElzEJRY3okZZHsKkCV+h6rFCk0BOBVrLSrJ0A== - dependencies: - spark-md5 "^3.0.0" +"@csstools/css-tokenizer@^2.2.0": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz#a4b8718ed7fcd2dcd555de16b31ca59ad4b96a06" + integrity sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw== -"@rails/ujs@^6.0.0": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.0.2.tgz#8d32452d51c5e115374a218fb5475803dc17f4c0" - integrity sha512-KSQjJG8yzSWC1IT+UtFQglefABU37hpJ7uAz39K1/iWtoaJaI9ydGIaxxpJBT/PmYv4kS6lCSjXq13DELeJocw== +"@csstools/media-query-list-parser@^2.1.4": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz#feb4b7268f998956eb3ded69507869e73d005dda" + integrity sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA== -"@rails/webpacker@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@rails/webpacker/-/webpacker-4.2.2.tgz#b9dd3235fdf4d0badbda8e33f6ebee742a9f3abb" - integrity sha512-jzw7qMfSCLdrt9j1X+2IvXjf63huXYqeIPwLujXa9pYFvxtEstbVYRDivuLhiDokzih+PrYpB+dLTGBNgVsnpw== - dependencies: - "@babel/core" "^7.7.2" - "@babel/plugin-proposal-class-properties" "^7.7.0" - "@babel/plugin-proposal-object-rest-spread" "^7.6.2" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.6.0" - "@babel/plugin-transform-regenerator" "^7.7.0" - "@babel/plugin-transform-runtime" "^7.6.2" - "@babel/preset-env" "^7.7.1" - "@babel/runtime" "^7.7.2" - babel-loader "^8.0.6" - babel-plugin-dynamic-import-node "^2.3.0" - babel-plugin-macros "^2.6.1" - case-sensitive-paths-webpack-plugin "^2.2.0" - compression-webpack-plugin "^3.0.0" - core-js "^3.4.0" - css-loader "^3.2.0" - file-loader "^4.2.0" - flatted "^2.0.1" - glob "^7.1.6" - js-yaml "^3.13.1" - mini-css-extract-plugin "^0.8.0" - node-sass "^4.13.0" - optimize-css-assets-webpack-plugin "^5.0.3" - path-complete-extname "^1.0.0" - pnp-webpack-plugin "^1.5.0" - postcss-flexbugs-fixes "^4.1.0" - postcss-import "^12.0.1" - postcss-loader "^3.0.0" - postcss-preset-env "^6.7.0" - postcss-safe-parser "^4.0.1" - regenerator-runtime "^0.13.3" - sass-loader "7.3.1" - style-loader "^1.0.0" - terser-webpack-plugin "^2.2.1" - webpack "^4.41.2" - webpack-assets-manifest "^3.1.1" - webpack-cli "^3.3.10" - webpack-sources "^1.4.3" - -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@csstools/selector-specificity@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz#208a3929ee614967a1fc8cd6cb758d9fcbf0caae" + integrity sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q== -"@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" -"@types/node@*": - version "13.9.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.3.tgz#6356df2647de9eac569f9a52eda3480fa9e70b4d" - integrity sha512-01s+ac4qerwd6RHD+mVbOEsraDHSgUaefQlEdBbUolnQFjKwCr7luvAlEwW1RFojh67u0z4OUTjPn9LEl4zIkA== +"@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@hotwired/stimulus-webpack-helpers@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@hotwired/stimulus-webpack-helpers/-/stimulus-webpack-helpers-1.0.1.tgz#4cd74487adeca576c9865ac2b9fe5cb20cef16dd" + integrity sha512-wa/zupVG0eWxRYJjC1IiPBdt3Lruv0RqGN+/DTMmUWUyMAEB27KXmVY6a8YpUVTM7QwVuaLNGW4EqDgrS2upXQ== -"@types/q@^1.5.1": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" - integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== +"@hotwired/stimulus@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.2.2.tgz#071aab59c600fed95b97939e605ff261a4251608" + integrity sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A== -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== +"@hotwired/turbo-rails@^7.2.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@hotwired/turbo-rails/-/turbo-rails-7.3.0.tgz#422c21752509f3edcd6c7b2725bbe9e157815f51" + integrity sha512-fvhO64vp/a2UVQ3jue9WTc2JisMv9XilIC7ViZmXAREVwiQ2S4UC7Go8f9A1j4Xu7DBI6SbFdqILk5ImqVoqyA== dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" + "@hotwired/turbo" "^7.3.0" + "@rails/actioncable" "^7.0" -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== +"@hotwired/turbo@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@hotwired/turbo/-/turbo-7.3.0.tgz#2226000fff1aabda9fd9587474565c9929dbf15d" + integrity sha512-Dcu+NaSvHLT7EjrDrkEmH4qET2ZJZ5IcCWmNXxNQTBwlnE5tBZfN6WxZ842n5cHV52DH/AKNirbPBtcEXDLW4g== -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: - "@webassemblyjs/wast-printer" "1.9.0" + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: - "@webassemblyjs/ast" "1.9.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" + expect "^29.7.0" + jest-snapshot "^29.7.0" -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: - "@xtuc/ieee754" "^1.2.0" + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@xtuc/long" "4.2.2" + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" - "@xtuc/long" "4.2.2" +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@xtuc/long" "4.2.2" + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== +"@rails/actioncable@^7.0": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-7.1.3.tgz#4db480347775aeecd4dde2405659eef74a458881" + integrity sha512-ojNvnoZtPN0pYvVFtlO7dyEN9Oml1B6IDM+whGKVak69MMYW99lC2NOWXWeE3bmwEydbP/nn6ERcpfjHVjYQjA== + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz#a21117b19ee9be70c379ec1877537ef2e1c63301" + integrity sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ== dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" + any-observable "^0.3.0" -acorn@^6.2.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -aggregate-error@^3.0.0: +"@sindresorhus/jimp@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/jimp/-/jimp-0.3.0.tgz#c9c42f716bf47e5c9f6608a5349f31db3a016f5b" + integrity sha512-ikwHOfJF0umx1eV/JpQDMsFxODvCSdD9zdIQVDEjcTNpfofz7+PZrjfKUFkG3iQ9mSUG3BwODv0XOEvTRNdovw== + dependencies: + bignumber.js "^2.1.0" + bmp-js "0.0.3" + exif-parser "^0.1.9" + file-type "^3.1.0" + jpeg-js "^0.2.0" + load-bmfont "^1.2.3" + mime "^1.3.4" + mkdirp "0.5.1" + pixelmatch "^4.0.0" + pngjs "^3.0.0" + raw-body "^2.3.2" + tinycolor2 "^1.1.2" + utif "^1.1.2" + +"@sinonjs/commons@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + type-detect "4.0.8" -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: - version "6.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" - integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== +"@testing-library/dom@^8.19.1": + version "8.20.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" + integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== 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" + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" -alphanum-sort@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== -ansi-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + dependencies: + "@babel/types" "^7.20.7" + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.56.7" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.7.tgz#c33b5b5a9cfb66881beb7b5be6c34aa3e81d3366" + integrity sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.43" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54" + integrity sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/http-proxy@^1.17.8": + version "1.17.14" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.14.tgz#57f8ccaa1c1c3780644f8a94f9c6b5000b5e2eec" + integrity sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/minimist@^1.2.2": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== + +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "20.12.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.3.tgz#d6658c2c7776c1cad93534bb45428195ed840c65" + integrity sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw== + dependencies: + undici-types "~5.26.4" + +"@types/normalize-package-data@^2.4.0": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== + +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +"@types/qs@*": + version "6.9.14" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.14.tgz#169e142bfe493895287bee382af6039795e9b75b" + integrity sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.1": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.6" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.6.tgz#9cacd9b0b0fc5183ff0d5b27c1b1cad398113673" + integrity sha512-xkChxykiNb1X2YBevPIhQhNU9m9M7h9e2gDsmePAP2kNqhOvpKOrZWOCzq2ERQqfNFzlzHG2bdM0u3z5x+gQgg== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + +"@types/sockjs@^0.3.33": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/tough-cookie@*": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + +"@types/ws@^8.5.5": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@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@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@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@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + +"@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + +"@xmldom/xmldom@^0.8.8": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + +acorn@^8.1.0, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + 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" + +ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA== + dependencies: + string-width "^2.0.0" + +ansi-escapes@^3.0.0, ansi-escapes@^3.1.0, ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" + color-convert "^2.0.1" -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-path@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/app-path/-/app-path-2.2.0.tgz#2af5c2b544a40e15fc1ac55548314397460845d0" + integrity sha512-8Nayxm2u6rVd+8OuVV8mwzSVB+EMDGCC8SV82YIOuFutFtHFCnXY52fhPEPT61FmPLpzd4HctsofSPp3UQonMw== + dependencies: + execa "^0.4.0" + +arch@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== argparse@^1.0.7: version "1.0.10" @@ -1148,10 +2133,22 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== arr-flatten@^1.1.0: version "1.1.0" @@ -1161,165 +2158,272 @@ arr-flatten@^1.1.0: arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== +array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: - safer-buffer "~2.1.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: - object-assign "^4.1.1" - util "0.10.3" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== +ast-types@0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + integrity sha512-qEdtR2UH78yyHX/AUNfXmJTlM48XoFZKBdwi1nzkI1mJL21cmbu0cvjxjpkXJ5NENMq42H+hNs8VLJcqXLerBQ== -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^9.6.1: - version "9.7.5" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.5.tgz#8df10b9ff9b5814a8d411a5cfbab9c793c392376" - integrity sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +babel-jest@^29.6.4, babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-loader@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: - browserslist "^4.11.0" - caniuse-lite "^1.0.30001036" - chalk "^2.4.2" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^7.0.27" - postcss-value-parser "^4.0.3" + object.assign "^4.1.0" -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" -aws4@^1.8.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" - integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== - -babel-loader@^8.0.6: - version "8.1.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" - integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== - dependencies: - find-cache-dir "^2.1.0" - loader-utils "^1.4.0" - mkdirp "^0.5.3" - pify "^4.0.1" - schema-utils "^2.6.5" +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.10" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1" + integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.1" + semver "^6.3.1" -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== +babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" + integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== dependencies: - object.assign "^4.1.0" + "@babel/helper-define-polyfill-provider" "^0.6.1" + core-js-compat "^3.36.1" -babel-plugin-macros@^2.6.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" - integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be" + integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g== dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" + "@babel/helper-define-polyfill-provider" "^0.6.1" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@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-top-level-await" "^7.8.3" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +balanced-match@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" + integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== + +base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base@^0.11.1: version "0.11.2" @@ -1337,81 +2441,71 @@ base@^0.11.1: batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" +bignumber.js@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8" + integrity sha512-uw4ra6Cv483Op/ebM0GBKKfxZlSmn6NgFRby5L3yGTlunLj53KQgndDlqy2WVFOwgvurocApYkSud0aO+mvrpQ== -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +bmp-js@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.3.tgz#64113e9c7cf1202b376ed607bf30626ebe57b18a" + integrity sha512-epsm3Z92j5xwek9p97pVw3KbsNc0F4QnbYh+N93SpbJYuHFQQ/UAh6K+bKFGyLePH3Hudtl/Sa95Quqp0gX8IQ== -body-parser@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== +body-parser@1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== dependencies: - bytes "3.1.0" - content-type "~1.0.4" + bytes "3.1.2" + content-type "~1.0.5" debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -boolbase@^1.0.0, boolbase@~1.0.0: + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" + integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== + dependencies: + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" brace-expansion@^1.1.7: version "1.1.11" @@ -1421,7 +2515,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1, braces@^2.3.2: +braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -1437,163 +2531,61 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" + fill-range "^7.0.1" -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== +browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.2, browserslist@^4.23.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" + node-int64 "^0.4.0" -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== -browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.9.1: - version "4.11.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.0.tgz#aef4357b10a8abda00f97aac7cd587b2082ba1ad" - integrity sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A== - dependencies: - caniuse-lite "^1.0.30001035" - electron-to-chromium "^1.3.380" - node-releases "^1.1.52" - pkg-up "^3.1.0" +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + integrity sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA== buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== +builtins@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + semver "^7.0.0" bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" - integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== - dependencies: - chownr "^1.1.2" - figgy-pudding "^3.5.1" - fs-minipass "^2.0.0" - glob "^7.1.4" - graceful-fs "^4.2.2" - infer-owner "^1.0.4" - lru-cache "^5.1.1" - minipass "^3.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - p-map "^3.0.0" - promise-inflight "^1.0.1" - rimraf "^2.7.1" - ssri "^7.0.0" - unique-filename "^1.1.1" +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cache-base@^1.0.1: version "1.0.1" @@ -1610,53 +2602,69 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: - caller-callsite "^2.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= +call-me-maybe@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" + integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w== dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" + no-case "^2.2.0" + upper-case "^1.1.1" -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q== + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= +camelcase-keys@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-7.0.2.tgz#d048d8c69448745bb0de6fc4c1c52a30dfbe7252" + integrity sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg== + dependencies: + camelcase "^6.3.0" + map-obj "^4.1.0" + quick-lru "^5.1.1" + type-fest "^1.2.1" -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== + +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.2.0, camelcase@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -1667,34 +2675,45 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001036: - version "1.0.30001036" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001036.tgz#930ea5272010d8bf190d859159d757c0b398caf0" - integrity sha512-jU8CIFIj2oR7r4W+5AKcsvWNVIb6Q6OZE3UsrXrZBHFtreT4YgTeOJtTucp+zSedEpTi3L5wASSP0LYIE3if6w== - -case-sensitive-paths-webpack-plugin@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" - integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001587: + version "1.0.30001605" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz#ca12d7330dd8bcb784557eb9aa64f0037870d9d6" + integrity sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +capture-stack-trace@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz#1c43f6b059d4249e7f3f8724f15f048b927d3a8a" + integrity sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w== -chalk@2.4.2, chalk@^2.0, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== +carbon-now-cli@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/carbon-now-cli/-/carbon-now-cli-1.4.0.tgz#6559252d2dd71ac42c9a15b61cd1d12c458636ac" + integrity sha512-VVwArD/VAKG2p7Om8x5E7eEHNS/7b2agp8o7zM6i0XXento1XTkLynaQRsuwCtjJwSSvOvNTyRN/akiFQhGBDA== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^1.1.1: + chalk "^2.4.1" + clipboardy "^1.2.3" + del "^3.0.0" + file-exists "^5.0.1" + file-extension "^4.0.5" + get-stdin "^6.0.0" + globby "^8.0.1" + inquirer "^6.2.1" + jsonfile "^5.0.0" + listr "^0.14.3" + lodash "^4.17.11" + meow "^5.0.0" + nanoid "^2.0.0" + opn "^5.4.0" + puppeteer "^1.11.0" + query-string "^6.2.0" + tempy "^0.2.1" + terminal-image "^0.1.2" + update-notifier "^2.5.0" + +chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1702,44 +2721,67 @@ chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" -chokidar@^2.0.2, chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== +chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" -chownr@^1.1.1, chownr@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" -chrome-trace-event@^1.0.2: +char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + 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" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== class-utils@^0.3.5: version "0.3.6" @@ -1751,37 +2793,54 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +clean-css@4.2.x: + version "4.2.4" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" + integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== + dependencies: + source-map "~0.6.0" -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg== + +cli-cursor@^2.0.0, cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg== dependencies: + slice-ansi "0.0.4" string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +clipboardy@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.3.tgz#0526361bf78724c1f20be248d428e365433c07ef" + integrity sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA== dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" + arch "^2.1.0" + execa "^0.8.0" -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" clone-deep@^4.0.1: version "4.0.1" @@ -1792,82 +2851,99 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== dependencies: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@^1.0.0: +color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" +colord@^2.9.1, colord@^2.9.3: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== -color@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" - integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" +colorette@^2.0.10, colorette@^2.0.14: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" +commander@2.17.x: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^7.0.0, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@~2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== compressible@~2.0.16: version "2.0.18" @@ -1876,17 +2952,13 @@ compressible@~2.0.16: dependencies: mime-db ">= 1.43.0 < 2" -compression-webpack-plugin@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-3.1.0.tgz#9f510172a7b5fae5aad3b670652e8bd7997aeeca" - integrity sha512-iqTHj3rADN4yHwXMBrQa/xrncex/uEQy8QHlaTKxGchT/hC0SdlJlmL/5eRqffmWq2ep0/Romw6Ld39JjTR/ug== +compression-webpack-plugin@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-9.2.0.tgz#57fd539d17c5907eebdeb4e83dcfe2d7eceb9ef6" + integrity sha512-R/Oi+2+UHotGfu72fJiRoVpuRifZT0tTC6UqFD/DUo+mv8dbOow9rVOuTvDv5nPPm3GZhHL/fKkwxwIHnJ8Nyw== dependencies: - cacache "^13.0.1" - find-cache-dir "^3.0.0" - neo-async "^2.5.0" - schema-utils "^2.6.1" - serialize-javascript "^2.1.2" - webpack-sources "^1.0.1" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" compression@^1.7.4: version "1.7.4" @@ -1904,9 +2976,9 @@ compression@^1.7.4: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-stream@^1.5.0: +concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -1916,445 +2988,477 @@ concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +configstore@^3.0.0: + version "3.1.5" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.5.tgz#e9af331fadc14dabd544d3e7e76dc446a09a530f" + integrity sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA== + dependencies: + dot-prop "^4.2.1" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: - safe-buffer "5.1.2" + safe-buffer "5.2.1" -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== -core-js-compat@^3.6.2: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" - integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== +core-js-compat@^3.31.0, core-js-compat@^3.36.1: + version "3.36.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.1.tgz#1818695d72c99c25d621dca94e6883e190cea3c8" + integrity sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA== dependencies: - browserslist "^4.8.3" - semver "7.0.0" + browserslist "^4.23.0" -core-js@^3.4.0: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== +core-js@^3.27.0: + version "3.36.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.36.1.tgz#c97a7160ebd00b2de19e62f4bbd3406ab720e578" + integrity sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA== -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cosmiconfig@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" + import-fresh "^3.2.1" parse-json "^5.0.0" path-type "^4.0.0" - yaml "^1.7.2" + yaml "^1.10.0" -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== +cosmiconfig@^8.2.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw== dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" + capture-stack-trace "^1.0.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" -cross-spawn@6.0.5, cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== +cross-spawn-async@^2.1.1: + version "2.2.5" + resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" + integrity sha512-snteb3aVrxYYOX9e8BabYFK9WhCDhTlw1YQktfTthBogxri4/2r9U2nQc0ffY73ZAxezDc+U8gvHAeU1wy1ubQ== dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" + lru-cache "^4.0.0" + which "^1.2.8" -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== dependencies: lru-cache "^4.0.1" + shebang-command "^1.2.0" which "^1.2.9" -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-blank-pseudo@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" - integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== - dependencies: - postcss "^7.0.5" - -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - postcss "^7.0.1" - timsort "^0.3.0" + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -css-has-pseudo@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" - integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^5.0.0-rc.4" +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg== -css-loader@^3.2.0: - version "3.4.2" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" - integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== - dependencies: - camelcase "^5.3.1" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^1.2.3" - normalize-path "^3.0.0" - postcss "^7.0.23" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.1.1" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.0.2" - schema-utils "^2.6.0" - -css-prefers-color-scheme@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" - integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== - dependencies: - postcss "^7.0.5" +css-declaration-sorter@^6.3.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" + integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== +css-functions-list@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.1.tgz#2eb205d8ce9f9ce74c5c1d7490b66b77c45ce3ea" + integrity sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ== + +css-loader@^6.7.0: + version "6.10.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.10.0.tgz#7c172b270ec7b833951b52c348861206b184a4b7" + integrity sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.4" + postcss-modules-scope "^3.1.1" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.5.4" + +css-minimizer-webpack-plugin@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" + integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== + dependencies: + cssnano "^5.1.8" + jest-worker "^29.1.2" + postcss "^8.4.17" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: - mdn-data "2.0.4" + mdn-data "2.0.14" source-map "^0.6.1" -css-tree@1.0.0-alpha.39: - version "1.0.0-alpha.39" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" - integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== +css-tree@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== dependencies: - mdn-data "2.0.6" - source-map "^0.6.1" - -css-what@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" - integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== - -cssdb@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" - integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + mdn-data "2.0.30" + source-map-js "^1.0.1" -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= +cssnano-preset-default@^5.2.14: + version "5.2.14" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" + integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + 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.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.4" + 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.1" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.2" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= +cssnano@^5.1.8: + version "5.1.15" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== + dependencies: + cssnano-preset-default "^5.2.14" + lilconfig "^2.0.3" + yaml "^1.10.2" -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: - postcss "^7.0.0" + css-tree "^1.1.2" -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== -cssnano@^4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== - dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" - is-resolvable "^1.0.0" - postcss "^7.0.0" +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -csso@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" - integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== dependencies: - css-tree "1.0.0-alpha.39" + cssom "~0.3.6" currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + integrity sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng== dependencies: array-find-index "^1.0.1" -cyclist@^1.0.1: +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +data-view-buffer@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== dependencies: - assert-plus "^1.0.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +date-fns@^1.27.2: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - ms "^2.1.1" + ms "2.1.2" -debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== +debug@^3.1.0, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize-keys@^1.0.0, decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decamelize@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-5.0.1.tgz#db11a92e58c741ef339fb0a2868d8a06a9a7b1e9" + integrity sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA== + +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2, deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" + execa "^5.0.0" -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - object-keys "^1.0.12" + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== dependencies: is-descriptor "^1.0.0" @@ -2366,174 +3470,172 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + integrity sha512-7yjqSoVSlJzA4t/VUwazuEagGeANEKB3f/aNI//06pfKgwoCb7f6Q1gETN1sZzYaj6chTQ0AhIwDiPdfOjko4A== dependencies: - "@types/glob" "^7.1.1" globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +dir-glob@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" + path-type "^4.0.0" -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= +dns-packet@^5.2.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" -dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" + esutils "^2.0.2" -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: - buffer-indexof "^1.0.0" + esutils "^2.0.2" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" + domhandler "^4.2.0" entities "^2.0.0" -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -domelementtype@1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== -domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== dependencies: - dom-serializer "0" - domelementtype "1" + webidl-conversions "^7.0.0" -dot-prop@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" - integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== +domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: - is-obj "^2.0.0" + domelementtype "^2.2.0" -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== +domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= +dot-prop@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" + integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" + is-obj "^1.0.0" + +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.3.380: - version "1.3.382" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.382.tgz#cad02da655c33f7a3d6ca7525bd35c17e90f3a8f" - integrity sha512-gJfxOcgnBlXhfnUUObsq3n3ReU8CT6S8je97HndYRkKsNZMJJ38zO/pI5aqO7L3Myfq+E3pqPyKK/ynyLEQfBA== +electron-to-chromium@^1.4.668: + version "1.4.724" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.724.tgz#e0a86fe4d3d0e05a4d7b032549d79608078f830d" + integrity sha512-RTRvkmRkGhNBPPpdrgtDKvmOEYTrPlXDfc0J/Nfq5s29tEahAwhiX4mmhNzj6febWMleulxVYPh7QwCSL/EldA== -elliptic@^6.0.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ== -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emojis-list@^3.0.0: version "3.0.0" @@ -2543,68 +3645,144 @@ emojis-list@^3.0.0: encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -enhanced-resolve@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" - integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== +enhanced-resolve@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" + graceful-fs "^4.2.4" + tapable "^2.2.0" entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== - dependencies: - prr "~1.0.1" +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -error-ex@^1.2.0, error-ex@^1.3.1: +envinfo@^7.7.3: + version "7.11.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.1.tgz#2ffef77591057081b0129a8fd8cf6118da1b94e1" + integrity sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg== + +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== - dependencies: +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-module-lexer@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.0.tgz#4878fee3789ad99e065f975fdd3c645529ff0236" + integrity sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -2615,41 +3793,290 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== + dependencies: + es6-promise "^4.0.3" + +es6-templates@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4" + integrity sha512-sziUVwcvQ+lOsrTyUY0Q11ilAPj+dy7AQ1E1MgSaHTaaAFTffaa08QSlGNU61iyVaroyb6nYdBV6oD7nzn6i8w== + dependencies: + recast "~0.11.12" + through "~2.3.6" + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-standard@^17.0.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" + integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== + dependencies: + debug "^3.2.7" + +eslint-plugin-es@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-es@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9" + integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.26.0: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-n@^15.6.0: + version "15.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz#e29221d8f5174f84d18f2eb94765f2eeea033b90" + integrity sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q== + dependencies: + builtins "^5.0.1" + eslint-plugin-es "^4.1.0" + eslint-utils "^3.0.0" + ignore "^5.1.1" + is-core-module "^2.11.0" + minimatch "^3.1.2" + resolve "^1.22.1" + semver "^7.3.8" + +eslint-plugin-node@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== + dependencies: + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-promise@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" + integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== + +eslint-plugin-standard@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-5.0.0.tgz#c43f6925d669f177db46f095ea30be95476b1ee4" + integrity sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" -esprima@^4.0.0: +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.31.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esprima@~3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -2658,50 +4085,85 @@ esutils@^2.0.2: etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== eventemitter3@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" - integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -eventsource@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" - integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== +execa@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" + integrity sha512-QPexBaNjeOjyiZ47q0FCukTO1kX3F+HMM0EWpnxXddcr3MZtElILMkz9Y38nmSZtp03+ZiSRMffrKWBPOIoSIg== dependencies: - original "^1.0.0" + cross-spawn-async "^2.1.1" + is-stream "^1.1.0" + npm-run-path "^1.0.0" + object-assign "^4.0.1" + path-key "^1.0.0" + strip-eof "^1.0.0" -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA== dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" + cross-spawn "^5.0.1" + get-stream "^3.0.0" is-stream "^1.1.0" npm-run-path "^2.0.0" p-finally "^1.0.0" signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + 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" + +exif-parser@^0.1.9: + version "0.1.12" + resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" + integrity sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw== + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -2711,45 +4173,50 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= +expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: - homedir-polyfill "^1.0.1" + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" -express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== +express@^4.17.3: + version "4.19.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== dependencies: - accepts "~1.3.7" + accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" + body-parser "1.20.2" + content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.0" + cookie "0.6.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + 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.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" + proxy-addr "~2.0.7" + qs "6.11.0" range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" + 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" @@ -2757,22 +4224,26 @@ express@^4.17.1: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" extglob@^2.0.4: version "2.0.4" @@ -2788,115 +4259,196 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= +extract-zip@^1.6.6: + version "1.7.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== + dependencies: + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^2.0.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" -fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== +fast-glob@^3.2.9, fast-glob@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + 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" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastparse@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: - websocket-driver ">=0.5.1" + reusify "^1.0.4" -faye-websocket@~0.11.1: - version "0.11.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" - integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" -figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" -file-loader@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" - integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== dependencies: - loader-utils "^1.2.3" - schema-utils "^2.5.0" + pend "~1.2.0" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ== + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-entry-cache@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-7.0.2.tgz#2d61bb70ba89b9548e3035b7c9173fe91deafff0" + integrity sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g== + dependencies: + flat-cache "^3.2.0" + +file-exists@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-exists/-/file-exists-5.0.1.tgz#1dcd017f787fc7be7a09a6ef3e6a3550cea31198" + integrity sha512-TeBMgeKbdSsQtcY2XqKY/yTa4BciMD/Gw8YcND0XMDZt4CDj87l1Wl4x7K0ravZ80tZcyIGMD0hj2VSRPR8M8Q== + +file-extension@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/file-extension/-/file-extension-4.0.5.tgz#ae6cef34c28e7313a92baa4aa955755cacdf0ce3" + integrity sha512-l0rOL3aKkoi6ea7MNZe6OHgqYYpn48Qfflr8Pe9G9JPPTx5A+sfboK91ZufzIs59/lPqh351l0eb6iKU9J5oGg== + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-type@^3.1.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA== fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" repeat-string "^1.6.1" to-regex-range "^2.1.0" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-cache-dir@^3.0.0, find-cache-dir@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: - locate-path "^3.0.0" + locate-path "^2.0.0" -find-up@^4.0.0: +find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -2904,237 +4456,224 @@ find-up@^4.0.0: locate-path "^5.0.0" path-exists "^4.0.0" -findup-sync@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" + locate-path "^6.0.0" + path-exists "^4.0.0" -flatted@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== +flat-cache@^3.0.4, flat-cache@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== follow-redirects@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb" - integrity sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ== + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: - debug "^3.0.0" + is-callable "^1.1.3" for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" + combined-stream "^1.0.8" mime-types "^2.1.12" -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" +fs-monkey@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.12" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" - integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fstream@^1.0.0, fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: - globule "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - pump "^3.0.0" + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig== + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@2.0.0: +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== + dependencies: + ini "^1.3.4" + +global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== dependencies: global-prefix "^3.0.0" -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - global-prefix@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" @@ -3144,15 +4683,49 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" +global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + 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" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -3160,69 +4733,118 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -globule@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.1.tgz#90a25338f22b7fbeb527cee63c629aea754d33b9" - integrity sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g== +globby@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" + integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== dependencies: - glob "~7.1.1" - lodash "~4.17.12" - minimatch "~3.0.2" + array-union "^1.0.1" + dir-glob "2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" + integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== -handle-thing@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" - integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg== + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== dependencies: ansi-regex "^2.0.0" +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -3231,7 +4853,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -3240,451 +4862,445 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== dependencies: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.0, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" + function-bind "^1.1.2" -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== +he@1.2.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + lru-cache "^6.0.0" hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== dependencies: inherits "^2.0.1" obuf "^1.0.0" readable-stream "^2.0.1" wbuf "^1.1.0" -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= +html-entities@^2.3.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" + integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -html-entities@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= +html-loader-jest@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/html-loader-jest/-/html-loader-jest-0.2.1.tgz#1803c2bcd9e41ccc738a0979cc6de0acbabac3f8" + integrity sha512-Sq9eDpsr/8kI+kyiQAL8jawa+aGRphANCeIeoLyU05DEfHd9vCi4Zz8AXUQTbqnF0TRGfVn9qN69/ox378kyGg== + dependencies: + html-loader "^0.5.1" + +html-loader@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.5.5.tgz#6356dbeb0c49756d8ebd5ca327f16ff06ab5faea" + integrity sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog== + dependencies: + es6-templates "^0.2.3" + fastparse "^1.1.1" + html-minifier "^3.5.8" + loader-utils "^1.1.0" + object-assign "^4.1.1" + +html-minifier@^3.5.8: + version "3.5.21" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" + integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA== + dependencies: + camel-case "3.0.x" + clean-css "4.2.x" + commander "2.17.x" + he "1.2.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +html-tags@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== dependencies: depd "~1.1.2" inherits "2.0.3" setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -"http-parser-js@>=0.4.0 <0.4.11": - version "0.4.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" - integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== -http-proxy-middleware@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: - http-proxy "^1.17.0" - is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + 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" -http-proxy@^1.17.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" - integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= +https-proxy-agent@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + agent-base "^4.3.0" + debug "^3.1.0" -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: - postcss "^7.0.14" + safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== -import-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= - dependencies: - import-from "^2.1.0" +ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" +immutable@^4.0.0: + version "4.3.5" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" + integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== -import-fresh@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== +import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" -import-from@^2.1.0: +import-lazy@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= - dependencies: - resolve-from "^3.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== -import-local@2.0.0, import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -in-publish@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" - integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ== -infer-owner@^1.0.3, infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@^1.3.4, ini@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -internal-ip@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== +inquirer@^6.2.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" - -interpret@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" -invariant@^2.2.2, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== +internal-slot@^1.0.4, internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -ipaddr.js@1.9.1, ipaddr.js@^1.9.0: +ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-absolute-url@^2.0.0: +ipaddr.js@^2.0.1: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= +is-accessor-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" + integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== dependencies: - kind-of "^3.0.2" + hasown "^2.0.0" -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: - kind-of "^6.0.0" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: - binary-extensions "^1.0.0" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" + ci-info "^1.5.0" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - kind-of "^3.0.2" + hasown "^2.0.0" -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== +is-data-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" + integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== dependencies: - kind-of "^6.0.0" + hasown "^2.0.0" -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" + integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" + integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extendable@^1.0.1: version "1.0.1" @@ -3696,74 +5312,136 @@ is-extendable@^1.0.1: is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-function@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw== + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-map@^2.0.2, is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== dependencies: kind-of "^3.0.2" -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-cwd@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== dependencies: - is-path-inside "^2.1.0" + symbol-observable "^1.1.0" -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw== + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g== dependencies: - path-is-inside "^1.0.2" + path-is-inside "^1.0.1" -is-plain-obj@^1.0.0: +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" @@ -3772,48 +5450,103 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-regex@^1.0.4, is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-promise@^2.1.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: - has "^1.0.3" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== +is-retry-allowed@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-set@^2.0.2, is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" -is-stream@^1.1.0: +is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: - html-comment-regex "^1.1.0" + has-tostringtag "^1.0.0" -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -3821,65 +5554,557 @@ is-windows@^1.0.1, is-windows@^1.0.2: is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz#91655936cf7380e4e473383081e38478b69993b1" + integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +iterm2-version@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/iterm2-version/-/iterm2-version-3.0.0.tgz#fdf609712b6214e206a2e1b320f311f195117d4f" + integrity sha512-R2SE/AQrE4IhlyRbBp7ASIjFO+Wlpfra2Q7GMZkOjQb890MLtKyINPawJ7fr+Z7CPgHoXj2J3BNyebBIbVn8PQ== + dependencies: + app-path "^2.1.0" + plist "^3.0.1" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-jsdom@^29.3.1: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" + integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jsdom "^20.0.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" -jest-worker@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" - integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== +jest-erb-transformer@^1.2.10: + version "1.2.12" + resolved "https://registry.yarnpkg.com/jest-erb-transformer/-/jest-erb-transformer-1.2.12.tgz#6da995a1a88ee3a8366ee54bc4e08da056ec9388" + integrity sha512-Ek/scuanA4ohKTMjfwoWX31RCRa9lpDMTYwQwLvCwg+QTFavl6/KPR437g+WC6FQtEiqySy1tQ79E7GGNK5NEQ== + dependencies: + "@babel/core" "^7.22.15" + babel-jest "^29.6.4" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" merge-stream "^2.0.0" - supports-color "^7.0.0" + supports-color "^8.0.0" -js-base64@^2.1.8: - version "2.5.2" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209" - integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ== +jest-worker@^29.1.2, jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.3.1: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + +jpeg-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482" + integrity sha512-Ni9PffhJtYtdD7VwxH6V2MnievekGfUefosGCHadog0/jAevRu6HPjYeMHbUemn0IPE8d4wGa8UsOGsX+iKy2g== + +"jpgjs@github:notmasteryet/jpgjs": + version "1.0.0" + resolved "https://codeload.github.com/notmasteryet/jpgjs/tar.gz/f1d30922fda93417669246f5a25cf2393dd9c108" + +js-cookie@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414" + integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw== -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" jsesc@^2.5.1: version "2.5.2" @@ -3889,165 +6114,240 @@ jsesc@^2.5.1: jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json3@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" - integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json5@^1.0.1: +json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.1, json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" - integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== - dependencies: - minimist "^1.2.5" +json5@^2.1.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= +jsonfile@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-5.0.0.tgz#e6b718f73da420d612823996fdf14a03f6ff6922" + integrity sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w== dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" + universalify "^0.1.2" + optionalDependencies: + graceful-fs "^4.1.6" -killable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== +justified-layout@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/justified-layout/-/justified-layout-4.1.0.tgz#0584091b45e69f19ac97a54539f0a03eebe7bcfe" + integrity sha512-M5FimNMXgiOYerVRGsXZ2YK9YNCaTtwtYp7Hb2308U1Q9TXXHx5G0p08mcVR5O53qf8bWY4NJcPBxE6zuayXSg== + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -last-call-webpack-plugin@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" - integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== - dependencies: - lodash "^4.17.5" - webpack-sources "^1.1.0" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= +klona@^2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + +known-css-properties@^0.29.0: + version "0.29.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.29.0.tgz#e8ba024fb03886f23cb882e806929f32d814158f" + integrity sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ== + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w== dependencies: - invert-kv "^1.0.0" + package-json "^4.0.0" -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== +launch-editor@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== dependencies: - invert-kv "^2.0.0" + picocolors "^1.0.0" + shell-quote "^1.8.1" leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levenary@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" - integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - leven "^3.1.0" + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA== + +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^2.3.0" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== + dependencies: + chalk "^2.4.1" + cli-cursor "^2.1.0" + date-fns "^1.27.2" + figures "^2.0.0" + +listr@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" + +load-bmfont@^1.2.3: + version "1.4.1" + resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.1.tgz#c0f5f4711a1e2ccff725a7b6078087ccfcddd3e9" + integrity sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA== + dependencies: + buffer-equal "0.0.1" + mime "^1.3.4" + parse-bmfont-ascii "^1.0.3" + parse-bmfont-binary "^1.0.5" + parse-bmfont-xml "^1.1.4" + phin "^2.9.1" + xhr "^2.0.1" + xtend "^4.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== dependencies: graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== +loader-utils@^1.1.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== dependencies: big.js "^5.2.2" - emojis-list "^2.0.0" + emojis-list "^3.0.0" json5 "^1.0.1" -loader-utils@^1.0.1, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" - json5 "^1.0.1" + json5 "^2.1.2" -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: - p-locate "^3.0.0" + p-locate "^2.0.0" path-exists "^3.0.0" locate-path@^5.0.0: @@ -4057,72 +6357,100 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lockfile@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" + integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== + dependencies: + signal-exit "^3.0.2" -lodash.get@^4.0: +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== + +lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== -lodash.has@^4.0: +lodash.has@^4.5.2: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" - integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= + integrity sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g== lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== -lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@~4.17.12: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@^4.17.11, lodash@^4.17.12: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -loglevel@^1.6.6: - version "1.6.7" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" - integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ== + dependencies: + chalk "^1.0.0" -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg== dependencies: - js-tokens "^3.0.0 || ^4.0.0" + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + integrity sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ== dependencies: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lru-cache@^4.0.1: +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lru-cache@^4.0.0, lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -4137,126 +6465,154 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -make-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: - pify "^4.0.1" - semver "^5.6.0" + yallist "^4.0.0" -make-dir@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" - integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: - p-defer "^1.0.0" + semver "^7.5.3" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== -map-obj@^1.0.0, map-obj@^1.0.1: +map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ== + +map-obj@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== dependencies: object-visit "^1.0.0" -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" +mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== -mdn-data@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" - integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -memory-fs@^0.4.0, memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= +memfs@^3.4.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== + dependencies: + fs-monkey "^1.0.4" + +meow@^10.1.5: + version "10.1.5" + resolved "https://registry.yarnpkg.com/meow/-/meow-10.1.5.tgz#be52a1d87b5f5698602b0f32875ee5940904aa7f" + integrity sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw== + dependencies: + "@types/minimist" "^1.2.2" + camelcase-keys "^7.0.0" + decamelize "^5.0.0" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.2" + read-pkg-up "^8.0.0" + redent "^4.0.0" + trim-newlines "^4.0.2" + type-fest "^1.2.2" + yargs-parser "^20.2.9" + +meow@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" + minimist-options "^3.0.1" normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + yargs-parser "^10.0.0" merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.1.10: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -4275,116 +6631,104 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" + braces "^3.0.2" + picomatch "^2.3.1" -mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": - version "1.43.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.26" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.43.0" + mime-db "1.52.0" -mime@1.6.0: +mime@1.6.0, mime@^1.3.4: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== +mime@^2.0.3: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-fn@^2.0.0: +mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mini-css-extract-plugin@^0.8.0: - version "0.8.2" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz#a875e169beb27c88af77dd962771c9eedc3da161" - integrity sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw== +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== dependencies: - loader-utils "^1.1.0" - normalize-url "1.9.1" - schema-utils "^1.0.0" - webpack-sources "^1.1.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + dom-walk "^0.1.0" -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +min-indent@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -minimatch@^3.0.4, minimatch@~3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +mini-css-extract-plugin@^2.7.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz#75245f3f30ce3a56dbdd478084df6fe475f02dc7" + integrity sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA== dependencies: - brace-expansion "^1.1.7" + schema-utils "^4.0.0" + tapable "^2.2.1" -minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: - minipass "^3.0.0" + brace-expansion "^1.1.7" -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== dependencies: - minipass "^3.0.0" + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" -minipass-pipeline@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" - integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== dependencies: - minipass "^3.0.0" + arrify "^1.0.1" + is-plain-obj "^1.1.0" -minipass@^3.0.0, minipass@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" - integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== - dependencies: - yallist "^4.0.0" +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q== -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== mixin-deep@^1.2.0: version "1.3.2" @@ -4394,57 +6738,57 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -"mkdirp@>=0.5 0", mkdirp@^0.5, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: - version "0.5.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" - integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== +mkdirp@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA== dependencies: - minimist "^1.2.5" + minimist "0.0.8" -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= +mkdirp@^0.5.4: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" + minimist "^1.2.6" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== dependencies: - dns-packet "^1.3.1" + dns-packet "^5.2.2" thunky "^1.0.2" -nan@^2.12.1, nan@^2.13.2: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== + +nanoid@^2.0.0: + version "2.1.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280" + integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA== + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== nanomatch@^1.2.9: version "1.2.13" @@ -4463,109 +6807,42 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -neo-async@^2.5.0, neo-async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -node-forge@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" - integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -node-gyp@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-releases@^1.1.52: - version "1.1.52" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" - integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== dependencies: - semver "^6.3.0" + lower-case "^1.1.1" -node-sass@^4.13.0: - version "4.13.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.1.tgz#9db5689696bb2eec2c32b98bfea4c7a2e992d0a3" - integrity sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw== - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash "^4.17.15" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.13.2" - node-gyp "^3.8.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "^2.2.4" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - -"nopt@2 || 3": - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" @@ -4577,102 +6854,92 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= +normalize-package-data@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== dependencies: - remove-trailing-separator "^1.0.1" + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -normalize-url@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= +npm-run-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" + integrity sha512-PrGAi1SLlqNvKN5uGBjIgnrTb8fl0Jz0a3JJmeMcGnIBh7UE9Gc4zsAMlwDajOMg2b1OgP6UPvoLUboTmMZPFA== dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + path-key "^1.0.0" npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" + path-key "^3.0.0" -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: - boolbase "~1.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + boolbase "^1.0.0" number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== +nwsapi@^2.2.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== -object-is@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" - integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -4680,54 +6947,64 @@ object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== dependencies: isobject "^3.0.0" -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== +object.assign@^4.1.0, object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" -object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" -object.values@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== +object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" @@ -4736,102 +7013,92 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== dependencies: - is-wsl "^1.1.0" + mimic-fn "^1.0.0" -optimize-css-assets-webpack-plugin@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" - integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: - cssnano "^4.1.10" - last-call-webpack-plugin "^3.0.0" + mimic-fn "^2.1.0" -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== +open@^8.0.9: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: - url-parse "^1.4.3" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= +opn@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== dependencies: - lcid "^1.0.0" + is-wsl "^1.1.0" -os-locale@^3.0.0, os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" -os-tmpdir@^1.0.0: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" -p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - p-limit "^2.0.0" + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" p-locate@^4.1.0: version "4.1.0" @@ -4840,43 +7107,62 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: - aggregate-error "^3.0.0" + "@types/retry" "0.12.0" + retry "^0.13.1" -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== - dependencies: - retry "^0.12.0" +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pako@~1.0.5: +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA== + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pako@^1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w== dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" + no-case "^2.2.0" parent-module@^1.0.0: version "1.0.1" @@ -4885,47 +7171,53 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0: - version "5.1.5" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" - integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" +parse-bmfont-ascii@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" + integrity sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA== -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= +parse-bmfont-binary@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" + integrity sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA== + +parse-bmfont-xml@^1.1.4: + version "1.1.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz#016b655da7aebe6da38c906aca16bf0415773767" + integrity sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA== dependencies: - error-ex "^1.2.0" + xml-parse-from-string "^1.0.0" + xml2js "^0.5.0" + +parse-headers@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" @@ -4935,34 +7227,22 @@ parseurl@~1.3.2, parseurl@~1.3.3: pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== path-complete-extname@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-complete-extname/-/path-complete-extname-1.0.0.tgz#f889985dc91000c815515c0bfed06c5acda0752b" integrity sha512-CVjiWcMRdGU8ubs08YQVzhutOR5DEfO97ipRIlOGMK5Bek5nQySknBpuxVAVJ36hseTNs+vdIcv57ZrWxH7zvg== -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" @@ -4972,772 +7252,436 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-is-inside@^1.0.2: +path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" + integrity sha512-T3hWy7tyXlk3QvPFnT+o2tmXRzU4GkitkUWLp/WZ0S/FXd7XMx176tRurgTvHTNMJOQzTcesHNpBqetH86mQ9g== -path-key@^2.0.0, path-key@^2.0.1: +path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" + pify "^3.0.0" path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +phin@^2.9.1: + version "2.9.3" + resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" + integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0, pify@^2.3.0: +pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pixelmatch@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" + integrity sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA== dependencies: - find-up "^3.0.0" + pngjs "^3.0.0" -pkg-dir@^4.1.0: +pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" -pkg-up@^3.1.0: +plist@^3.0.1: version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -pnp-webpack-plugin@^1.5.0: - version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" - integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" + integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== dependencies: - ts-pnp "^1.1.6" + "@xmldom/xmldom" "^0.8.8" + base64-js "^1.5.1" + xmlbuilder "^15.1.1" -portfinder@^1.0.25: - version "1.0.25" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" - integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.1" +pngjs@^3.0.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-attribute-case-insensitive@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" - integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^6.0.2" - -postcss-calc@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" - integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== - dependencies: - postcss "^7.0.27" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" - -postcss-color-functional-notation@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" - integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-gray@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" - integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-color-hex-alpha@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" - integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== - dependencies: - postcss "^7.0.14" - postcss-values-parser "^2.0.1" - -postcss-color-mod-function@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" - integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-rebeccapurple@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" - integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== - dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-custom-media@^7.0.8: - version "7.0.8" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" - integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== - dependencies: - postcss "^7.0.14" - -postcss-custom-properties@^8.0.11: - version "8.0.11" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" - integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== - dependencies: - postcss "^7.0.17" - postcss-values-parser "^2.0.1" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== -postcss-custom-selectors@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" - integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-dir-pseudo-class@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" - integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== - dependencies: - postcss "^7.0.0" - -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== - dependencies: - postcss "^7.0.0" - -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== - dependencies: - postcss "^7.0.0" - -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== - dependencies: - postcss "^7.0.0" - -postcss-double-position-gradients@^1.0.0: +possible-typed-array-names@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" - integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== - dependencies: - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-env-function@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" - integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-flexbugs-fixes@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.0.tgz#662b3dcb6354638b9213a55eed8913bcdc8d004a" - integrity sha512-QRE0n3hpkxxS/OGvzOa+PDuy4mh/Jg4o9ui22/ko5iGYOG3M5dfJabjnAZjTdh2G9F85c7Hv8hWcEDEKW/xceQ== - dependencies: - postcss "^7.0.26" - -postcss-focus-visible@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" - integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== - dependencies: - postcss "^7.0.2" - -postcss-focus-within@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" - integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== - dependencies: - postcss "^7.0.2" - -postcss-font-variant@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" - integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== - dependencies: - postcss "^7.0.2" - -postcss-gap-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" - integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== - dependencies: - postcss "^7.0.2" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss-image-set-function@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" - integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" -postcss-import@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153" - integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw== +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== dependencies: - postcss "^7.0.1" - postcss-value-parser "^3.2.3" - read-cache "^1.0.0" - resolve "^1.1.7" + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" -postcss-initial@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" - integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== dependencies: - lodash.template "^4.5.0" - postcss "^7.0.2" + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" -postcss-lab-function@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" - integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== -postcss-load-config@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" - integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== - dependencies: - cosmiconfig "^5.0.0" - import-cwd "^2.0.0" +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== -postcss-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" - integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== - dependencies: - loader-utils "^1.1.0" - postcss "^7.0.0" - postcss-load-config "^2.0.0" - schema-utils "^1.0.0" +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== -postcss-logical@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" - integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== - dependencies: - postcss "^7.0.2" +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== -postcss-media-minmax@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" - integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== - dependencies: - postcss "^7.0.2" +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" + postcss-value-parser "^4.2.0" + stylehacks "^5.1.1" -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== dependencies: - browserslist "^4.0.0" + browserslist "^4.21.4" caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" - -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== - dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - uniqs "^2.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== dependencies: - postcss "^7.0.5" + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-modules-local-by-default@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" - integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== dependencies: - icss-utils "^4.1.1" - postcss "^7.0.16" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.0" + browserslist "^4.21.4" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-modules-scope@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" + postcss-selector-parser "^6.0.5" -postcss-modules-values@^3.0.0: +postcss-modules-extract-imports@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== - dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" - -postcss-nesting@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" - integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== - dependencies: - postcss "^7.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== +postcss-modules-local-by-default@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz#7cbed92abd312b94aaea85b68226d3dec39a14e6" + integrity sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q== dependencies: - postcss "^7.0.0" + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== +postcss-modules-scope@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz#32cfab55e84887c079a19bbb215e721d683ef134" + integrity sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA== dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-selector-parser "^6.0.4" -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + icss-utils "^5.0.0" -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" -postcss-overflow-shorthand@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" - integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== dependencies: - postcss "^7.0.2" + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" -postcss-page-break@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" - integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== dependencies: - postcss "^7.0.2" + postcss-value-parser "^4.2.0" -postcss-place@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" - integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-preset-env@^6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" - integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== - dependencies: - autoprefixer "^9.6.1" - browserslist "^4.6.4" - caniuse-lite "^1.0.30000981" - css-blank-pseudo "^0.1.4" - css-has-pseudo "^0.10.0" - css-prefers-color-scheme "^3.1.1" - cssdb "^4.4.0" - postcss "^7.0.17" - postcss-attribute-case-insensitive "^4.0.1" - postcss-color-functional-notation "^2.0.1" - postcss-color-gray "^5.0.0" - postcss-color-hex-alpha "^5.0.3" - postcss-color-mod-function "^3.0.3" - postcss-color-rebeccapurple "^4.0.1" - postcss-custom-media "^7.0.8" - postcss-custom-properties "^8.0.11" - postcss-custom-selectors "^5.1.2" - postcss-dir-pseudo-class "^5.0.0" - postcss-double-position-gradients "^1.0.0" - postcss-env-function "^2.0.2" - postcss-focus-visible "^4.0.0" - postcss-focus-within "^3.0.0" - postcss-font-variant "^4.0.0" - postcss-gap-properties "^2.0.0" - postcss-image-set-function "^3.0.1" - postcss-initial "^3.0.0" - postcss-lab-function "^2.0.1" - postcss-logical "^3.0.0" - postcss-media-minmax "^4.0.0" - postcss-nesting "^7.0.0" - postcss-overflow-shorthand "^2.0.0" - postcss-page-break "^2.0.0" - postcss-place "^4.0.1" - postcss-pseudo-class-any-link "^6.0.0" - postcss-replace-overflow-wrap "^3.0.0" - postcss-selector-matches "^4.0.0" - postcss-selector-not "^4.0.0" - -postcss-pseudo-class-any-link@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" - integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== dependencies: - browserslist "^4.0.0" + browserslist "^4.21.4" caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-replace-overflow-wrap@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" - integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== - dependencies: - postcss "^7.0.2" +postcss-resolve-nested-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" + integrity sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw== -postcss-safe-parser@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" - integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g== - dependencies: - postcss "^7.0.26" +postcss-safe-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" + integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== -postcss-selector-matches@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" - integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" +postcss-scss@^4.0.2: + version "4.0.9" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685" + integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A== -postcss-selector-not@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" - integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.13, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.16" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" + cssesc "^3.0.0" + util-deprecate "^1.0.2" -postcss-selector-parser@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" - integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== - dependencies: - dot-prop "^5.2.0" - indexes-of "^1.0.1" - uniq "^1.0.1" +postcss-sorting@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-sorting/-/postcss-sorting-7.0.1.tgz#923b5268451cf2d93ebf8835e17a6537757049a5" + integrity sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g== -postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" + postcss-value-parser "^4.2.0" + svgo "^2.7.0" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" - integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== dependencies: - cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" + postcss-selector-parser "^6.0.5" -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== - dependencies: - is-svg "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== +postcss@^8.2.14, postcss@^8.3.11, postcss@^8.4.0, postcss@^8.4.17, postcss@^8.4.28, postcss@^8.4.33: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" -postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" - integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg== -postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" - integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.27" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" - integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" -private@^0.1.8: +private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -5750,184 +7694,195 @@ process-nextick-args@~2.0.0: process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +progress@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: - forwarded "~0.1.2" + kleur "^3.0.3" + sisteransi "^1.0.5" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" ipaddr.js "1.9.1" -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= +proxy-from-env@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== -psl@^1.1.28: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== +puppeteer@^1.11.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.20.0.tgz#e3d267786f74e1d87cf2d15acc59177f471bbe38" + integrity sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ== dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" + debug "^4.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^2.2.1" + mime "^2.0.3" + progress "^2.0.1" + proxy-from-env "^1.0.0" + rimraf "^2.6.1" + ws "^6.1.0" + +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" + side-channel "^1.0.4" -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== +query-string@^6.2.0: + version "6.14.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" + integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + decode-uri-component "^0.2.0" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA== -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== -querystringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" - integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== +rails-erb-loader@5.5.2: + version "5.5.2" + resolved "https://registry.yarnpkg.com/rails-erb-loader/-/rails-erb-loader-5.5.2.tgz#db3fa8ac89600f09d179a1a70a2ca18c592576ea" + integrity sha512-cjQH9SuSvRPhnWkvjmmAW/S4AFVDfAtYnQO4XpKJ8xpRdZayT73iXoE+IPc3VzN03noZXhVmyvsCvKvHj4LY6w== + dependencies: + loader-utils "^1.1.0" + lodash.defaults "^4.2.0" -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: +randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== +raw-body@2.5.2, raw-body@^2.3.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: - bytes "3.1.0" - http-errors "1.7.2" + bytes "3.1.2" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= +rc@^1.0.1, rc@^1.1.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: - pify "^2.3.0" + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" + find-up "^2.0.0" + read-pkg "^3.0.0" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= +read-pkg-up@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-8.0.0.tgz#72f595b65e66110f43b052dd9af4de6b10534670" + integrity sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ== + dependencies: + find-up "^5.0.0" + read-pkg "^6.0.0" + type-fest "^1.0.1" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== dependencies: - load-json-file "^1.0.0" + load-json-file "^4.0.0" normalize-package-data "^2.3.2" - path-type "^1.0.0" + path-type "^3.0.0" + +read-pkg@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-6.0.0.tgz#a67a7d6a1c2b0c3cd6aa2ea521f40c458a4a504c" + integrity sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^3.0.2" + parse-json "^5.2.0" + type-fest "^1.0.1" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== +readable-stream@^2.0.1, readable-stream@^2.2.2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -5938,55 +7893,77 @@ read-pkg@^1.0.0: util-deprecate "~1.0.1" readable-stream@^3.0.6: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" + picomatch "^2.2.1" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= +recast@~0.11.12: + version "0.11.23" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + integrity sha512-+nixG+3NugceyR8O1bLU45qs84JgI3+8EauyRZafLgC9XbdAOIVgwV1Pe2da0YzGo62KzWoZwUpVEQf6qNAXWA== dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" + ast-types "0.9.6" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" -regenerate-unicode-properties@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" - integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== dependencies: - regenerate "^1.4.0" + resolve "^1.9.0" -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== +redent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw== + dependencies: + indent-string "^3.0.0" + strip-indent "^2.0.0" + +redent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-4.0.0.tgz#0c0ba7caabb24257ab3bb7a4fd95dd1d5c5681f9" + integrity sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag== + dependencies: + indent-string "^5.0.0" + strip-indent "^4.0.0" -regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== +regenerate-unicode-properties@^10.1.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-transform@^0.14.2: - version "0.14.4" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" - integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" - private "^0.1.8" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -5996,318 +7973,361 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== +regex-parser@^2.2.11: + version "2.3.0" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.0.tgz#4bb61461b1a19b8b913f3960364bb57887f920ee" + integrity sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg== + +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" -regexpu-core@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" - integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== +regexpp@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +registry-auth-token@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.2.0" - regjsgen "^0.5.1" - regjsparser "^0.6.4" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.2.0" + rc "^1.1.6" + safe-buffer "^5.0.1" -regjsgen@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" - integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA== + dependencies: + rc "^1.0.1" -regjsparser@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" - integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - -request@^2.87.0, request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -resolve-from@^3.0.0: +resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-url-loader@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz#ee3142fb1f1e0d9db9524d539cfa166e9314f795" + integrity sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^8.2.14" + source-map "0.6.1" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4, resolve@^1.9.0: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.8.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== dependencies: - path-parse "^1.0.6" + onetime "^2.0.0" + signal-exit "^3.0.2" ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: +rimraf@^2.2.8, rimraf@^2.6.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" + glob "^7.1.3" -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= +run-async@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^6.3.3, rxjs@^6.4.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: - aproba "^1.1.1" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass-graph@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" - integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= +sass-loader@10.4.1: + version "10.4.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.4.1.tgz#bea4e173ddf512c9d7f53e9ec686186146807cbf" + integrity sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ== dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^7.0.0" + klona "^2.0.4" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^3.0.0" + semver "^7.3.2" -sass-loader@7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.3.1.tgz#a5bf68a04bcea1c13ff842d747150f7ab7d0d23f" - integrity sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA== +sass@1.57.1: + version "1.57.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5" + integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw== dependencies: - clone-deep "^4.0.1" - loader-utils "^1.0.1" - neo-async "^2.5.0" - pify "^4.0.1" - semver "^6.3.0" + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" -sax@~1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +sax@>=0.6.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" + xmlchars "^2.2.0" -schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5: - version "2.6.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" - integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: - ajv "^6.12.0" - ajv-keywords "^3.4.1" + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0, schema-utils@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -selfsigned@^1.10.7: - version "1.10.7" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" - integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== +selfsigned@^2.1.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: - node-forge "0.9.0" + "@types/node-forge" "^1.3.0" + node-forge "^1" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw== + dependencies: + semver "^5.0.3" -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.0.0, semver@^6.1.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= +semver@^7.0.0, semver@^7.3.2, semver@^7.3.4, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + 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 "~1.7.2" + http-errors "2.0.0" mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" + ms "2.1.3" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" -serialize-javascript@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" - integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== dependencies: accepts "~1.3.4" batch "0.6.1" @@ -6317,20 +8337,37 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.1" + send "0.18.0" -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" @@ -6342,28 +8379,24 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== +shakapacker@6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/shakapacker/-/shakapacker-6.6.0.tgz#1e372a7ce6fa93f1a7bd1820737b8168679eb220" + integrity sha512-7sNnv8PXMlgm2Ob7vZOayLKu0+PPMN3q0HEyAlkFIJtHJt7wA3p1rObhlk0/OrNeBa4dio/9HiBUeEU7bZsHvw== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + glob "^7.2.0" + js-yaml "^4.1.0" + path-complete-extname "^1.0.0" shallow-clone@^3.0.0: version "3.0.1" @@ -6375,26 +8408,85 @@ shallow-clone@^3.0.0: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= +shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simplelightbox@2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/simplelightbox/-/simplelightbox-2.11.0.tgz#9f9891349d635244719e2af4b8baee00f13cd77e" + integrity sha512-+ylze7HQqnksITf2egX7/6XjsMdFMz80j70oFrKwlac2lQ2InO6JcE+75aGaAh8uG3O3rClJyE4hcQpgKQZ2Ig== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: - is-arrayish "^0.3.1" + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" snapdragon-node@^2.0.1: version "2.1.1" @@ -6426,37 +8518,19 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sockjs-client@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" - integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== - dependencies: - debug "^3.2.5" - eventsource "^1.0.7" - faye-websocket "~0.11.1" - inherits "^2.0.3" - json3 "^3.3.2" - url-parse "^1.4.3" - -sockjs@0.3.19: - version "0.3.19" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" - integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== - dependencies: - faye-websocket "^0.10.0" - uuid "^3.0.1" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: - is-plain-obj "^1.0.0" + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== source-map-resolve@^0.5.0: version "0.5.3" @@ -6469,66 +8543,62 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@~0.5.12: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: - amdefine ">=0.0.4" + buffer-from "^1.0.0" + source-map "^0.6.0" -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -spark-md5@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.1.tgz#83a0e255734f2ab4e5c466e5a2cfc9ba2aa2124d" - integrity sha512-0tF3AGSD1ppQeuffsLDIOWlKUd3lS92tFxcsrh5Pe3ZphhnoK+oXIBTzOAThZCiuINZLvpiLH/1VS1/ANEJVig== +source-map@^0.5.6, source-map@~0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.17" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" + integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== spdy-transport@^3.0.0: version "3.0.0" @@ -6542,10 +8612,10 @@ spdy-transport@^3.0.0: readable-stream "^3.0.6" wbuf "^1.7.3" -spdy@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2" - integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA== +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" handle-thing "^2.0.0" @@ -6553,6 +8623,11 @@ spdy@^4.0.1: select-hose "^2.0.0" spdy-transport "^3.0.0" +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -6563,110 +8638,68 @@ split-string@^3.0.1, split-string@^3.0.2: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== - dependencies: - figgy-pudding "^3.5.1" - -ssri@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" - integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== - dependencies: - figgy-pudding "^3.5.1" - minipass "^3.1.1" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== dependencies: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== - dependencies: - readable-stream "^2.0.1" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" + internal-slot "^1.0.4" -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + char-regex "^1.0.2" + strip-ansi "^6.0.0" -string-width@^1.0.1, string-width@^1.0.2: +string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -6674,32 +8707,44 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" -string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string_decoder@^1.0.0, string_decoder@^1.1.1: +string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -6716,71 +8761,180 @@ string_decoder@~1.1.1: strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - is-utf8 "^0.2.0" + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA== + +strip-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853" + integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA== + dependencies: + min-indent "^1.0.1" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +style-loader@^3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" + integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== + +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" + integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== dependencies: - get-stdin "^4.0.1" + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +stylelint-config-recommended@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz#1c9e07536a8cd875405f8ecef7314916d94e7e40" + integrity sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ== -style-loader@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.1.3.tgz#9e826e69c683c4d9bf9db924f85e9abb30d5e200" - integrity sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw== +stylelint-config-sass-guidelines@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/stylelint-config-sass-guidelines/-/stylelint-config-sass-guidelines-9.0.1.tgz#3114ce780f2085ba9ea5da2b7d97a1e85e968fa7" + integrity sha512-N06PsVsrgKijQ3YT5hqKA7x3NUkgELTRI1cbWMqcYiCGG6MjzvNk6Cb5YYA1PrvrksBV76BvY9P9bAswojVMqA== dependencies: - loader-utils "^1.2.3" - schema-utils "^2.6.4" + postcss-scss "^4.0.2" + stylelint-order "^5.0.0" + stylelint-scss "^4.0.0" -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== +stylelint-config-standard@^29.0.0: + version "29.0.0" + resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz#4cc0e0f05512a39bb8b8e97853247d3a95d66fa2" + integrity sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" + stylelint-config-recommended "^9.0.0" -supports-color@6.1.0, supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== +stylelint-order@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/stylelint-order/-/stylelint-order-5.0.0.tgz#abd20f6b85ac640774cbe40e70d3fe9c6fdf4400" + integrity sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw== dependencies: - has-flag "^3.0.0" + postcss "^8.3.11" + postcss-sorting "^7.0.1" + +stylelint-scss@^4.0.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-4.7.0.tgz#f986bf8c5a4b93eae2b67d3a3562eef822657908" + integrity sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg== + dependencies: + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + +stylelint@^15.10.1: + version "15.11.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-15.11.0.tgz#3ff8466f5f5c47362bc7c8c9d382741c58bc3292" + integrity sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw== + dependencies: + "@csstools/css-parser-algorithms" "^2.3.1" + "@csstools/css-tokenizer" "^2.2.0" + "@csstools/media-query-list-parser" "^2.1.4" + "@csstools/selector-specificity" "^3.0.0" + balanced-match "^2.0.0" + colord "^2.9.3" + cosmiconfig "^8.2.0" + css-functions-list "^3.2.1" + css-tree "^2.3.1" + debug "^4.3.4" + fast-glob "^3.3.1" + fastest-levenshtein "^1.0.16" + file-entry-cache "^7.0.0" + global-modules "^2.0.0" + globby "^11.1.0" + globjoin "^0.1.4" + html-tags "^3.3.1" + ignore "^5.2.4" + import-lazy "^4.0.0" + imurmurhash "^0.1.4" + is-plain-object "^5.0.0" + known-css-properties "^0.29.0" + mathml-tag-names "^2.1.3" + meow "^10.1.5" + micromatch "^4.0.5" + normalize-path "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.28" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^6.0.0" + postcss-selector-parser "^6.0.13" + postcss-value-parser "^4.2.0" + resolve-from "^5.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + style-search "^0.1.0" + supports-hyperlinks "^3.0.0" + svg-tags "^1.0.0" + table "^6.8.1" + write-file-atomic "^5.0.1" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== supports-color@^5.3.0: version "5.5.0" @@ -6789,135 +8943,208 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" -svgo@^1.0.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" + has-flag "^4.0.0" + +supports-hyperlinks@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz#c711352a5c89070779b4dad54c05a2f14b15c94b" + integrity sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== + +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + 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" - unquote "~1.1.1" - util.promisify "~1.0.0" -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== +symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -tar@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" - integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^6.8.1: + version "6.8.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== dependencies: - block-stream "*" - fstream "^1.0.12" - inherits "2" + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" -terser-webpack-plugin@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" - integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== +tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== + +tempy@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.2.1.tgz#9038e4dbd1c201b74472214179bc2c6f7776e54c" + integrity sha512-LB83o9bfZGrntdqPuRdanIVCPReam9SOZKW0fOy5I9X3A854GGWi0tjCqoXEk84XIEYBc/x9Hq3EFop/H5wJaw== dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^2.1.2" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser-webpack-plugin@^2.2.1: - version "2.3.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81" - integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w== - dependencies: - cacache "^13.0.1" - find-cache-dir "^3.2.0" - jest-worker "^25.1.0" - p-limit "^2.2.2" - schema-utils "^2.6.4" - serialize-javascript "^2.1.2" - source-map "^0.6.1" - terser "^4.4.3" - webpack-sources "^1.4.3" + temp-dir "^1.0.0" + unique-string "^1.0.0" -terser@^4.1.2, terser@^4.4.3: - version "4.6.7" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" - integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== +term-img@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/term-img/-/term-img-3.0.0.tgz#95d7584f08e0e43a115d947519377ab0160f0a34" + integrity sha512-ZXwggmsv+mheSNZ0yOtpOBS5kTSosGPVcTeS9didqs2VRW0sIByYr2cLS1N2vlpGAjq5PKqmy6Z3hZEgcCG4Wg== + dependencies: + ansi-escapes "^3.1.0" + iterm2-version "^3.0.0" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ== dependencies: + execa "^0.7.0" + +terminal-image@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/terminal-image/-/terminal-image-0.1.2.tgz#38cbb56f0c08da56b4751646938df39add50cddd" + integrity sha512-2dNHutFy2+EM93JGKw23avlgO9Uf1iBdKR87Lv9SYHUwPJmmDM9cN7mkyo65bLYP3AHMU9gDZV4HKTRbr99AAw== + dependencies: + "@sindresorhus/jimp" "^0.3.0" + chalk "^2.4.1" + term-img "^3.0.0" + +terser-webpack-plugin@^5.3.0, terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@^5.26.0: + version "5.30.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.2.tgz#79fc2222c241647cea54ab928ac987ffbe8ce9e2" + integrity sha512-vTDjRKYKip4dOFL5VizdoxHTYDfEXPdz5t+FbxCC5Rp2s+KbEO8w5wqMDPgj7CtFKZuzq7PXv28fZoXfqqBVuw== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" + source-map-support "~0.5.20" -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through@^2.3.6, through@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -timers-browserify@^2.0.4: - version "2.0.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== - dependencies: - setimmediate "^1.0.4" +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tinycolor2@^1.1.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" + integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== dependencies: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -6928,64 +9155,81 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== +tough-cookie@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: - psl "^1.1.28" + psl "^1.1.33" punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - -"true-case-path@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== dependencies: - glob "^7.1.2" + punycode "^2.1.1" -ts-pnp@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a" - integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ== +trim-newlines@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA== -tslib@^1.9.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" - integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== +trim-newlines@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-4.1.1.tgz#28c88deb50ed10c7ba6dc2474421904a00139125" + integrity sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ== -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - safe-buffer "^5.0.1" + prelude-ls "^1.2.1" -turbolinks@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/turbolinks/-/turbolinks-5.2.0.tgz#e6877a55ea5c1cb3bb225f0a4ae303d6d32ff77c" - integrity sha512-pMiez3tyBo6uRHFNNZoYMmrES/IaGgMhQQM+VFF36keryjb5ms0XkVpmKHkfW/4Vy96qiGW3K9bz0tF5sK9bBw== +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-is@~1.6.17, type-is@~1.6.18: +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^1.0.1, type-fest@^1.2.1, type-fest@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -6993,33 +9237,105 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typed.js@2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/typed.js/-/typed.js-2.0.12.tgz#246aff074c8e18d32ec27acb7be15094ac0bc0e1" + integrity sha512-lyACZh1cu+vpfYY3DG/bvsGLXXbdoDDpWxmqta10IQUdMXisMXOEyl+jos+YT9uBbzK4QaKYBjT3R0kTJO0Slw== + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== +uglify-js@3.4.x: + version "3.4.10" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" + integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== + dependencies: + commander "~2.19.0" + source-map "~0.6.1" -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" -unicode-match-property-value-ecmascript@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" - integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -unicode-property-aliases-ecmascript@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" - integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== union-value@^1.0.0: version "1.0.1" @@ -7031,129 +9347,133 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg== dependencies: - unique-slug "^2.0.0" + crypto-random-string "^1.0.0" -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" +universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== dependencies: has-value "^0.3.1" isobject "^3.0.0" -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== -url-parse@^1.4.3: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA== dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" + prepend-http "^1.0.1" -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: - punycode "1.3.2" - querystring "0.2.0" + querystringify "^2.1.1" + requires-port "^1.0.0" use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= +utif@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/utif/-/utif-1.3.0.tgz#d527e94d979eb58fe7b2c47674b52ac64fd61143" + integrity sha512-Rv9/OsKlBgMlLGai2EAoVheIbdBlndMunkXH4BuU81R2+Nky24I670OdGIb+NMpCbuHGyKjk9OQ7hdyOxuNXgw== dependencies: - inherits "2.0.1" + jpgjs "github:notmasteryet/jpgjs" + pako "^1.0.5" -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^3.0.1, uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" - integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== +v8-to-istanbul@^9.0.1: + version "9.2.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" + integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" validate-npm-package-license@^3.0.1: version "3.0.4" @@ -7166,35 +9486,29 @@ validate-npm-package-license@^3.0.1: vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" + xml-name-validator "^4.0.0" -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" -watchpack@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== +watchpack@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== dependencies: - chokidar "^2.0.2" + glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" - neo-async "^2.5.0" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" @@ -7203,224 +9517,346 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -webpack-assets-manifest@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/webpack-assets-manifest/-/webpack-assets-manifest-3.1.1.tgz#39bbc3bf2ee57fcd8ba07cda51c9ba4a3c6ae1de" - integrity sha512-JV9V2QKc5wEWQptdIjvXDUL1ucbPLH2f27toAY3SNdGZp+xSaStAgpoMcvMZmqtFrBc9a5pTS1058vxyMPOzRQ== - dependencies: - chalk "^2.0" - lodash.get "^4.0" - lodash.has "^4.0" - mkdirp "^0.5" - schema-utils "^1.0.0" - tapable "^1.0.0" - webpack-sources "^1.0.0" - -webpack-cli@^3.3.10: - version "3.3.11" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631" - integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g== - dependencies: - chalk "2.4.2" - cross-spawn "6.0.5" - enhanced-resolve "4.1.0" - findup-sync "3.0.0" - global-modules "2.0.0" - import-local "2.0.0" - interpret "1.2.0" - loader-utils "1.2.3" - supports-color "6.1.0" - v8-compile-cache "2.0.3" - yargs "13.2.4" - -webpack-dev-middleware@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" - integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== - dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" - range-parser "^1.2.1" - webpack-log "^2.0.0" +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== -webpack-dev-server@^3.10.3: - version "3.10.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0" - integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ== - dependencies: - ansi-html "0.0.7" - bonjour "^3.5.0" - chokidar "^2.1.8" +webpack-assets-manifest@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/webpack-assets-manifest/-/webpack-assets-manifest-5.2.1.tgz#7ebe4c882efdc343029ed2f54a6f7ce990406f08" + integrity sha512-MsEcXVio1GY6R+b4dVfTHIDMB0RB90KajQG8neRbH92vE2S1ClGw9mNa9NPlratYBvZOhExmN0qqMNFTaCTuIg== + dependencies: + chalk "^4.1.2" + deepmerge "^4.3.1" + lockfile "^1.0.4" + lodash.get "^4.4.2" + lodash.has "^4.5.2" + schema-utils "^3.3.0" + tapable "^2.2.1" + +webpack-cli@^4.0.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" + colorette "^2.0.14" + commander "^7.0.0" + cross-spawn "^7.0.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" + integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.11.0: + version "4.15.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" + integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== + 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.5" + 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 "^1.6.0" - debug "^4.1.1" - del "^4.1.1" - express "^4.17.1" - html-entities "^1.2.1" - http-proxy-middleware "0.19.1" - import-local "^2.0.0" - internal-ip "^4.3.0" - ip "^1.1.5" - is-absolute-url "^3.0.3" - killable "^1.0.1" - loglevel "^1.6.6" - opn "^5.5.0" - p-retry "^3.0.1" - portfinder "^1.0.25" - schema-utils "^1.0.0" - selfsigned "^1.10.7" - semver "^6.3.0" + 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" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" serve-index "^1.9.1" - sockjs "0.3.19" - sockjs-client "1.4.0" - spdy "^4.0.1" - strip-ansi "^3.0.1" - supports-color "^6.1.0" - url "^0.11.0" - webpack-dev-middleware "^3.7.2" - webpack-log "^2.0.0" - ws "^6.2.1" - yargs "12.0.5" - -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.4" + ws "^8.13.0" -webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== +webpack-merge@^5.0.0, webpack-merge@^5.7.3: + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@^4.41.2: - version "4.42.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.1.tgz#ae707baf091f5ca3ef9c38b884287cfe8f1983ef" - integrity sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.2.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.76: + version "5.91.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" + integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^4.1.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.6.0" - webpack-sources "^1.4.1" - -websocket-driver@>=0.5.1: - version "0.7.3" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" - integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== - dependencies: - http-parser-js ">=0.4.0 <0.4.11" + enhanced-resolve "^5.16.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + 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.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" safe-buffer ">=5.1.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -which-module@^2.0.0: +whatwg-encoding@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" -which@1, which@^1.2.14, which@^1.2.9, which@^1.3.1: +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-collection@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^1.2.8, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: - string-width "^1.0.2 || 2" + isexe "^2.0.0" -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== dependencies: - errno "~0.1.7" + string-width "^2.1.1" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= +wildcard@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ== dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" + string-width "^2.1.1" + strip-ansi "^4.0.0" -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^2.0.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +write-file-atomic@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" -ws@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== +ws@^6.1.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== dependencies: async-limiter "~1.0.0" -xtend@^4.0.0, xtend@~4.0.1: +ws@^8.11.0, ws@^8.13.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ== + +xhr@^2.0.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== + dependencies: + global "~4.4.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xml-parse-from-string@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" + integrity sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g== + +xml2js@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" + integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= - -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== yallist@^3.0.2: version "3.1.1" @@ -7432,86 +9868,50 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.7.2: - version "1.8.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.8.3.tgz#2f420fca58b68ce3a332d0ca64be1d191dd3f87a" - integrity sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw== - dependencies: - "@babel/runtime" "^7.8.7" +yaml@^1.10.0, yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== +yargs-parser@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" + camelcase "^4.1.0" -yargs-parser@^13.1.0: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= - dependencies: - camelcase "^3.0.0" +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - -yargs@13.2.4: - version "13.2.4" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" - integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.0" - -yargs@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" - integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^5.0.0" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==