From fadec9751e6e93829a56e80d75fa8cf6017ef8bd Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Tue, 2 Sep 2025 23:56:00 +1000 Subject: [PATCH] React --- backend/internal/user.js | 55 +- backend/yarn.lock | 1982 ++-- docker/rootfs/etc/nginx/conf.d/dev.conf | 12 +- .../etc/s6-overlay/s6-rc.d/frontend/run | 2 +- frontend/.babelrc | 17 - frontend/.gitignore | 24 +- frontend/biome.json | 91 + frontend/check-locales.cjs | 172 + frontend/fonts/feather | 1 - ...urce-sans-pro-v14-latin-ext_latin-700.woff | Bin 31740 -> 0 bytes ...rce-sans-pro-v14-latin-ext_latin-700.woff2 | Bin 25348 -> 0 bytes ...ans-pro-v14-latin-ext_latin-700italic.woff | Bin 28540 -> 0 bytes ...ns-pro-v14-latin-ext_latin-700italic.woff2 | Bin 22240 -> 0 bytes ...e-sans-pro-v14-latin-ext_latin-italic.woff | Bin 28744 -> 0 bytes ...-sans-pro-v14-latin-ext_latin-italic.woff2 | Bin 22436 -> 0 bytes ...-sans-pro-v14-latin-ext_latin-regular.woff | Bin 32128 -> 0 bytes ...sans-pro-v14-latin-ext_latin-regular.woff2 | Bin 25656 -> 0 bytes frontend/html/index.ejs | 9 - frontend/html/login.ejs | 9 - frontend/html/partials/footer.ejs | 2 - frontend/html/partials/header.ejs | 34 - frontend/images | 1 - frontend/index.html | 44 + frontend/js/app/api.js | 757 -- frontend/js/app/audit-log/list/item.ejs | 80 - frontend/js/app/audit-log/list/item.js | 32 - frontend/js/app/audit-log/list/main.ejs | 9 - frontend/js/app/audit-log/list/main.js | 27 - frontend/js/app/audit-log/main.ejs | 25 - frontend/js/app/audit-log/main.js | 82 - frontend/js/app/audit-log/meta.ejs | 27 - frontend/js/app/audit-log/meta.js | 7 - frontend/js/app/cache.js | 10 - frontend/js/app/controller.js | 441 - frontend/js/app/dashboard/main.ejs | 67 - frontend/js/app/dashboard/main.js | 90 - frontend/js/app/empty/main.ejs | 11 - frontend/js/app/empty/main.js | 33 - frontend/js/app/error/main.ejs | 7 - frontend/js/app/error/main.js | 27 - frontend/js/app/help/main.ejs | 12 - frontend/js/app/help/main.js | 16 - frontend/js/app/i18n.js | 23 - frontend/js/app/main.js | 155 - frontend/js/app/nginx/access/delete.ejs | 23 - frontend/js/app/nginx/access/delete.js | 32 - frontend/js/app/nginx/access/form.ejs | 108 - frontend/js/app/nginx/access/form.js | 153 - frontend/js/app/nginx/access/form/client.ejs | 13 - frontend/js/app/nginx/access/form/client.js | 7 - frontend/js/app/nginx/access/form/item.ejs | 10 - frontend/js/app/nginx/access/form/item.js | 7 - frontend/js/app/nginx/access/list/item.ejs | 42 - frontend/js/app/nginx/access/list/item.js | 33 - frontend/js/app/nginx/access/list/main.ejs | 14 - frontend/js/app/nginx/access/list/main.js | 32 - frontend/js/app/nginx/access/main.ejs | 28 - frontend/js/app/nginx/access/main.js | 108 - .../js/app/nginx/certificates-list-item.ejs | 18 - frontend/js/app/nginx/certificates/delete.ejs | 19 - frontend/js/app/nginx/certificates/delete.js | 34 - frontend/js/app/nginx/certificates/form.ejs | 185 - frontend/js/app/nginx/certificates/form.js | 294 - .../js/app/nginx/certificates/list/item.ejs | 68 - .../js/app/nginx/certificates/list/item.js | 68 - .../js/app/nginx/certificates/list/main.ejs | 13 - .../js/app/nginx/certificates/list/main.js | 32 - frontend/js/app/nginx/certificates/main.ejs | 36 - frontend/js/app/nginx/certificates/main.js | 109 - frontend/js/app/nginx/certificates/renew.ejs | 14 - frontend/js/app/nginx/certificates/renew.js | 31 - frontend/js/app/nginx/certificates/test.ejs | 15 - frontend/js/app/nginx/certificates/test.js | 75 - frontend/js/app/nginx/dead/delete.ejs | 23 - frontend/js/app/nginx/dead/delete.js | 32 - frontend/js/app/nginx/dead/form.ejs | 206 - frontend/js/app/nginx/dead/form.js | 286 - frontend/js/app/nginx/dead/list/item.ejs | 54 - frontend/js/app/nginx/dead/list/item.js | 61 - frontend/js/app/nginx/dead/list/main.ejs | 12 - frontend/js/app/nginx/dead/list/main.js | 32 - frontend/js/app/nginx/dead/main.ejs | 28 - frontend/js/app/nginx/dead/main.js | 108 - .../js/app/nginx/proxy/access-list-item.ejs | 13 - frontend/js/app/nginx/proxy/delete.ejs | 23 - frontend/js/app/nginx/proxy/delete.js | 32 - frontend/js/app/nginx/proxy/form.ejs | 281 - frontend/js/app/nginx/proxy/form.js | 369 - frontend/js/app/nginx/proxy/list/item.ejs | 60 - frontend/js/app/nginx/proxy/list/item.js | 61 - frontend/js/app/nginx/proxy/list/main.ejs | 14 - frontend/js/app/nginx/proxy/list/main.js | 32 - frontend/js/app/nginx/proxy/location-item.ejs | 64 - frontend/js/app/nginx/proxy/location.js | 54 - frontend/js/app/nginx/proxy/main.ejs | 28 - frontend/js/app/nginx/proxy/main.js | 108 - frontend/js/app/nginx/redirection/delete.ejs | 23 - frontend/js/app/nginx/redirection/delete.js | 32 - frontend/js/app/nginx/redirection/form.ejs | 253 - frontend/js/app/nginx/redirection/form.js | 288 - .../js/app/nginx/redirection/list/item.ejs | 63 - .../js/app/nginx/redirection/list/item.js | 61 - .../js/app/nginx/redirection/list/main.ejs | 15 - .../js/app/nginx/redirection/list/main.js | 32 - frontend/js/app/nginx/redirection/main.ejs | 28 - frontend/js/app/nginx/redirection/main.js | 107 - frontend/js/app/nginx/stream/delete.ejs | 19 - frontend/js/app/nginx/stream/delete.js | 32 - frontend/js/app/nginx/stream/form.ejs | 194 - frontend/js/app/nginx/stream/form.js | 225 - frontend/js/app/nginx/stream/list/item.ejs | 59 - frontend/js/app/nginx/stream/list/item.js | 54 - frontend/js/app/nginx/stream/list/main.ejs | 14 - frontend/js/app/nginx/stream/list/main.js | 32 - frontend/js/app/nginx/stream/main.ejs | 28 - frontend/js/app/nginx/stream/main.js | 108 - frontend/js/app/router.js | 19 - .../js/app/settings/default-site/main.ejs | 57 - frontend/js/app/settings/default-site/main.js | 69 - frontend/js/app/settings/list/item.ejs | 21 - frontend/js/app/settings/list/item.js | 23 - frontend/js/app/settings/list/main.ejs | 8 - frontend/js/app/settings/list/main.js | 27 - frontend/js/app/settings/main.ejs | 14 - frontend/js/app/settings/main.js | 48 - frontend/js/app/tokens.js | 126 - frontend/js/app/ui/footer/main.ejs | 16 - frontend/js/app/ui/footer/main.js | 14 - frontend/js/app/ui/header/main.ejs | 34 - frontend/js/app/ui/header/main.js | 67 - frontend/js/app/ui/main.ejs | 21 - frontend/js/app/ui/main.js | 98 - frontend/js/app/ui/menu/main.ejs | 52 - frontend/js/app/ui/menu/main.js | 39 - frontend/js/app/user/delete.ejs | 19 - frontend/js/app/user/delete.js | 34 - frontend/js/app/user/form.ejs | 58 - frontend/js/app/user/form.js | 108 - frontend/js/app/user/password.ejs | 31 - frontend/js/app/user/password.js | 69 - frontend/js/app/user/permissions.ejs | 68 - frontend/js/app/user/permissions.js | 95 - frontend/js/app/users/list/item.ejs | 45 - frontend/js/app/users/list/item.js | 68 - frontend/js/app/users/list/main.ejs | 10 - frontend/js/app/users/list/main.js | 27 - frontend/js/app/users/main.ejs | 26 - frontend/js/app/users/main.js | 78 - frontend/js/i18n/messages.json | 301 - frontend/js/index.js | 119 - frontend/js/lib/helpers.js | 26 - frontend/js/lib/marionette.js | 15 - frontend/js/login.js | 5 - frontend/js/login/main.js | 14 - frontend/js/login/ui/login.ejs | 37 - frontend/js/login/ui/login.js | 42 - frontend/js/models/access-list.js | 25 - frontend/js/models/audit-log.js | 18 - frontend/js/models/certificate.js | 38 - frontend/js/models/dead-host.js | 32 - frontend/js/models/proxy-host-location.js | 35 - frontend/js/models/proxy-host.js | 40 - frontend/js/models/redirection-host.js | 37 - frontend/js/models/setting.js | 22 - frontend/js/models/stream.js | 32 - frontend/js/models/user.js | 54 - frontend/package.json | 107 +- .../images}/default-avatar.jpg | Bin .../favicon}/android-chrome-192x192.png | Bin .../favicon}/android-chrome-512x512.png | Bin .../images/favicon}/apple-touch-icon.png | Bin .../images/favicon}/browserconfig.xml | 0 .../images/favicon}/favicon-16x16.png | Bin .../images/favicon}/favicon-32x32.png | Bin .../images/favicon}/favicon.ico | Bin .../images/favicon}/mstile-150x150.png | Bin .../images/favicon}/safari-pinned-tab.svg | 0 .../images/favicon}/site.webmanifest | 0 .../images}/logo-256.png | Bin .../images/logo-bold-horizontal-grey.svg | 1 + frontend/public/images/logo-no-text.svg | 93 + .../images/logo-text-horizontal-grey.png | Bin 0 -> 22203 bytes .../images}/logo-text-vertical-grey.png | Bin frontend/public/images/unhealthy.svg | 63 + frontend/scss/custom.scss | 42 - frontend/scss/fonts.scss | 39 - frontend/scss/selectize.scss | 196 - frontend/scss/styles.scss | 17 - frontend/scss/tabler-extra.scss | 171 - frontend/src/App.css | 7 + frontend/src/App.tsx | 28 + frontend/src/Router.tsx | 78 + frontend/src/api/backend/base.ts | 152 + frontend/src/api/backend/createAccessList.ts | 13 + frontend/src/api/backend/createCertificate.ts | 13 + frontend/src/api/backend/createDeadHost.ts | 13 + frontend/src/api/backend/createProxyHost.ts | 13 + .../src/api/backend/createRedirectionHost.ts | 16 + frontend/src/api/backend/createStream.ts | 13 + frontend/src/api/backend/createUser.ts | 13 + frontend/src/api/backend/deleteAccessList.ts | 10 + frontend/src/api/backend/deleteCertificate.ts | 10 + frontend/src/api/backend/deleteDeadHost.ts | 10 + frontend/src/api/backend/deleteProxyHost.ts | 10 + .../src/api/backend/deleteRedirectionHost.ts | 10 + frontend/src/api/backend/deleteStream.ts | 10 + frontend/src/api/backend/deleteUser.ts | 10 + .../src/api/backend/downloadCertificate.ts | 11 + frontend/src/api/backend/getAccessList.ts | 11 + frontend/src/api/backend/getAccessLists.ts | 14 + frontend/src/api/backend/getAuditLog.ts | 12 + frontend/src/api/backend/getCertificate.ts | 11 + frontend/src/api/backend/getCertificates.ts | 12 + frontend/src/api/backend/getDeadHost.ts | 11 + frontend/src/api/backend/getDeadHosts.ts | 14 + frontend/src/api/backend/getHealth.ts | 11 + frontend/src/api/backend/getHostsReport.ts | 10 + frontend/src/api/backend/getProxyHost.ts | 11 + frontend/src/api/backend/getProxyHosts.ts | 14 + .../src/api/backend/getRedirectionHost.ts | 11 + .../src/api/backend/getRedirectionHosts.ts | 16 + frontend/src/api/backend/getSetting.ts | 11 + frontend/src/api/backend/getSettings.ts | 12 + frontend/src/api/backend/getStream.ts | 11 + frontend/src/api/backend/getStreams.ts | 14 + frontend/src/api/backend/getToken.ts | 19 + frontend/src/api/backend/getUser.ts | 10 + frontend/src/api/backend/getUsers.ts | 14 + frontend/src/api/backend/helpers.ts | 54 + frontend/src/api/backend/index.ts | 54 + frontend/src/api/backend/models.ts | 193 + frontend/src/api/backend/refreshToken.ts | 11 + frontend/src/api/backend/renewCertificate.ts | 11 + frontend/src/api/backend/responseTypes.ts | 18 + .../src/api/backend/testHttpCertificate.ts | 16 + frontend/src/api/backend/toggleDeadHost.ts | 14 + frontend/src/api/backend/toggleProxyHost.ts | 14 + .../src/api/backend/toggleRedirectionHost.ts | 14 + frontend/src/api/backend/toggleStream.ts | 10 + frontend/src/api/backend/updateAccessList.ts | 15 + frontend/src/api/backend/updateAuth.ts | 26 + frontend/src/api/backend/updateDeadHost.ts | 15 + frontend/src/api/backend/updateProxyHost.ts | 15 + .../src/api/backend/updateRedirectionHost.ts | 18 + frontend/src/api/backend/updateSetting.ts | 15 + frontend/src/api/backend/updateStream.ts | 15 + frontend/src/api/backend/updateUser.ts | 15 + frontend/src/api/backend/uploadCertificate.ts | 18 + .../src/api/backend/validateCertificate.ts | 17 + frontend/src/components/Button.tsx | 64 + frontend/src/components/ErrorNotFound.tsx | 23 + frontend/src/components/Flag.tsx | 24 + frontend/src/components/HasPermission.tsx | 50 + .../src/components/LoadingPage.module.css | 3 + frontend/src/components/LoadingPage.tsx | 27 + .../src/components/LocalePicker.module.css | 15 + frontend/src/components/LocalePicker.tsx | 71 + frontend/src/components/NavLink.tsx | 29 + frontend/src/components/Page.module.css | 5 + frontend/src/components/Page.tsx | 10 + frontend/src/components/SiteContainer.tsx | 6 + frontend/src/components/SiteFooter.tsx | 64 + frontend/src/components/SiteHeader.module.css | 8 + frontend/src/components/SiteHeader.tsx | 119 + frontend/src/components/SiteMenu.tsx | 195 + frontend/src/components/Table/EmptyRow.tsx | 16 + .../Table/Formatter/CertificateFormatter.tsx | 13 + .../Table/Formatter/DomainsFormatter.tsx | 25 + .../Table/Formatter/GravatarFormatter.tsx | 17 + .../Table/Formatter/StatusFormatter.tsx | 11 + .../Formatter/ValueWithDateFormatter.tsx | 21 + .../src/components/Table/Formatter/index.ts | 5 + frontend/src/components/Table/TableBody.tsx | 39 + frontend/src/components/Table/TableHeader.tsx | 26 + frontend/src/components/Table/TableHelpers.ts | 64 + frontend/src/components/Table/TableLayout.tsx | 22 + frontend/src/components/Table/index.ts | 4 + .../src/components/ThemeSwitcher.module.css | 15 + frontend/src/components/ThemeSwitcher.tsx | 41 + frontend/src/components/Unhealthy.tsx | 17 + frontend/src/components/index.ts | 15 + frontend/src/context/AuthContext.tsx | 72 + frontend/src/context/LocaleContext.tsx | 38 + frontend/src/context/ThemeContext.tsx | 68 + frontend/src/context/index.ts | 3 + frontend/src/declarations.d.ts | 1 + frontend/src/hooks/index.ts | 10 + frontend/src/hooks/useAccessLists.ts | 17 + frontend/src/hooks/useDeadHosts.ts | 17 + frontend/src/hooks/useHealth.ts | 18 + frontend/src/hooks/useHostReport.ts | 18 + frontend/src/hooks/useProxyHosts.ts | 17 + frontend/src/hooks/useRedirectionHosts.ts | 17 + frontend/src/hooks/useStreams.ts | 17 + frontend/src/hooks/useTheme.ts | 8 + frontend/src/hooks/useUser.ts | 37 + frontend/src/hooks/useUsers.ts | 17 + frontend/src/locale/IntlProvider.tsx | 64 + frontend/src/locale/README.md | 23 + frontend/src/locale/index.ts | 1 + frontend/src/locale/lang/de.json | 3 + frontend/src/locale/lang/en.json | 92 + frontend/src/locale/lang/fa.json | 3 + frontend/src/locale/lang/lang-list.json | 5 + frontend/src/locale/src/de.json | 5 + frontend/src/locale/src/en.json | 272 + frontend/src/locale/src/fa.json | 5 + frontend/src/locale/src/lang-list.json | 11 + frontend/src/main.tsx | 13 + frontend/src/modals/ChangePasswordModal.tsx | 153 + frontend/src/modals/UserModal.tsx | 213 + frontend/src/modals/index.ts | 2 + frontend/src/modules/AuthStore.ts | 89 + frontend/src/modules/Validations.tsx | 51 + frontend/src/pages/Access/Empty.tsx | 20 + frontend/src/pages/Access/Table.tsx | 123 + frontend/src/pages/Access/TableWrapper.tsx | 52 + frontend/src/pages/Access/index.tsx | 12 + frontend/src/pages/AuditLog/AuditTable.tsx | 128 + frontend/src/pages/AuditLog/index.tsx | 12 + .../pages/Certificates/CertificateTable.tsx | 132 + frontend/src/pages/Certificates/index.tsx | 12 + frontend/src/pages/Dashboard/index.tsx | 145 + frontend/src/pages/Login/index.module.css | 10 + frontend/src/pages/Login/index.tsx | 126 + frontend/src/pages/Nginx/DeadHosts/Empty.tsx | 20 + frontend/src/pages/Nginx/DeadHosts/Table.tsx | 109 + .../pages/Nginx/DeadHosts/TableWrapper.tsx | 52 + frontend/src/pages/Nginx/DeadHosts/index.tsx | 12 + frontend/src/pages/Nginx/ProxyHosts/Empty.tsx | 25 + frontend/src/pages/Nginx/ProxyHosts/Table.tsx | 125 + .../pages/Nginx/ProxyHosts/TableWrapper.tsx | 52 + frontend/src/pages/Nginx/ProxyHosts/index.tsx | 12 + .../pages/Nginx/RedirectionHosts/Empty.tsx | 20 + .../pages/Nginx/RedirectionHosts/Table.tsx | 130 + .../Nginx/RedirectionHosts/TableWrapper.tsx | 52 + .../pages/Nginx/RedirectionHosts/index.tsx | 12 + frontend/src/pages/Nginx/Streams/Empty.tsx | 20 + frontend/src/pages/Nginx/Streams/Table.tsx | 139 + .../src/pages/Nginx/Streams/TableWrapper.tsx | 52 + frontend/src/pages/Nginx/Streams/index.tsx | 12 + frontend/src/pages/Settings/SettingTable.tsx | 111 + frontend/src/pages/Settings/index.tsx | 12 + frontend/src/pages/Users/Empty.tsx | 20 + frontend/src/pages/Users/Table.tsx | 128 + frontend/src/pages/Users/TableWrapper.tsx | 62 + frontend/src/pages/Users/index.tsx | 12 + frontend/src/vite-env.d.ts | 1 + frontend/tsconfig.json | 43 + frontend/tsconfig.node.json | 10 + frontend/vite.config.ts | 44 + frontend/vitest-setup.js | 1 + frontend/webpack.config.js | 144 - frontend/yarn.lock | 8432 +++++------------ scripts/ci/frontend-build | 2 +- 355 files changed, 9308 insertions(+), 17813 deletions(-) delete mode 100644 frontend/.babelrc create mode 100644 frontend/biome.json create mode 100755 frontend/check-locales.cjs delete mode 120000 frontend/fonts/feather delete mode 100644 frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700.woff delete mode 100644 frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700.woff2 delete mode 100644 frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700italic.woff delete mode 100644 frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700italic.woff2 delete mode 100644 frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-italic.woff delete mode 100644 frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-italic.woff2 delete mode 100644 frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-regular.woff delete mode 100644 frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-regular.woff2 delete mode 100644 frontend/html/index.ejs delete mode 100644 frontend/html/login.ejs delete mode 100644 frontend/html/partials/footer.ejs delete mode 100644 frontend/html/partials/header.ejs delete mode 120000 frontend/images create mode 100644 frontend/index.html delete mode 100644 frontend/js/app/api.js delete mode 100644 frontend/js/app/audit-log/list/item.ejs delete mode 100644 frontend/js/app/audit-log/list/item.js delete mode 100644 frontend/js/app/audit-log/list/main.ejs delete mode 100644 frontend/js/app/audit-log/list/main.js delete mode 100644 frontend/js/app/audit-log/main.ejs delete mode 100644 frontend/js/app/audit-log/main.js delete mode 100644 frontend/js/app/audit-log/meta.ejs delete mode 100644 frontend/js/app/audit-log/meta.js delete mode 100644 frontend/js/app/cache.js delete mode 100644 frontend/js/app/controller.js delete mode 100644 frontend/js/app/dashboard/main.ejs delete mode 100644 frontend/js/app/dashboard/main.js delete mode 100644 frontend/js/app/empty/main.ejs delete mode 100644 frontend/js/app/empty/main.js delete mode 100644 frontend/js/app/error/main.ejs delete mode 100644 frontend/js/app/error/main.js delete mode 100644 frontend/js/app/help/main.ejs delete mode 100644 frontend/js/app/help/main.js delete mode 100644 frontend/js/app/i18n.js delete mode 100644 frontend/js/app/main.js delete mode 100644 frontend/js/app/nginx/access/delete.ejs delete mode 100644 frontend/js/app/nginx/access/delete.js delete mode 100644 frontend/js/app/nginx/access/form.ejs delete mode 100644 frontend/js/app/nginx/access/form.js delete mode 100644 frontend/js/app/nginx/access/form/client.ejs delete mode 100644 frontend/js/app/nginx/access/form/client.js delete mode 100644 frontend/js/app/nginx/access/form/item.ejs delete mode 100644 frontend/js/app/nginx/access/form/item.js delete mode 100644 frontend/js/app/nginx/access/list/item.ejs delete mode 100644 frontend/js/app/nginx/access/list/item.js delete mode 100644 frontend/js/app/nginx/access/list/main.ejs delete mode 100644 frontend/js/app/nginx/access/list/main.js delete mode 100644 frontend/js/app/nginx/access/main.ejs delete mode 100644 frontend/js/app/nginx/access/main.js delete mode 100644 frontend/js/app/nginx/certificates-list-item.ejs delete mode 100644 frontend/js/app/nginx/certificates/delete.ejs delete mode 100644 frontend/js/app/nginx/certificates/delete.js delete mode 100644 frontend/js/app/nginx/certificates/form.ejs delete mode 100644 frontend/js/app/nginx/certificates/form.js delete mode 100644 frontend/js/app/nginx/certificates/list/item.ejs delete mode 100644 frontend/js/app/nginx/certificates/list/item.js delete mode 100644 frontend/js/app/nginx/certificates/list/main.ejs delete mode 100644 frontend/js/app/nginx/certificates/list/main.js delete mode 100644 frontend/js/app/nginx/certificates/main.ejs delete mode 100644 frontend/js/app/nginx/certificates/main.js delete mode 100644 frontend/js/app/nginx/certificates/renew.ejs delete mode 100644 frontend/js/app/nginx/certificates/renew.js delete mode 100644 frontend/js/app/nginx/certificates/test.ejs delete mode 100644 frontend/js/app/nginx/certificates/test.js delete mode 100644 frontend/js/app/nginx/dead/delete.ejs delete mode 100644 frontend/js/app/nginx/dead/delete.js delete mode 100644 frontend/js/app/nginx/dead/form.ejs delete mode 100644 frontend/js/app/nginx/dead/form.js delete mode 100644 frontend/js/app/nginx/dead/list/item.ejs delete mode 100644 frontend/js/app/nginx/dead/list/item.js delete mode 100644 frontend/js/app/nginx/dead/list/main.ejs delete mode 100644 frontend/js/app/nginx/dead/list/main.js delete mode 100644 frontend/js/app/nginx/dead/main.ejs delete mode 100644 frontend/js/app/nginx/dead/main.js delete mode 100644 frontend/js/app/nginx/proxy/access-list-item.ejs delete mode 100644 frontend/js/app/nginx/proxy/delete.ejs delete mode 100644 frontend/js/app/nginx/proxy/delete.js delete mode 100644 frontend/js/app/nginx/proxy/form.ejs delete mode 100644 frontend/js/app/nginx/proxy/form.js delete mode 100644 frontend/js/app/nginx/proxy/list/item.ejs delete mode 100644 frontend/js/app/nginx/proxy/list/item.js delete mode 100644 frontend/js/app/nginx/proxy/list/main.ejs delete mode 100644 frontend/js/app/nginx/proxy/list/main.js delete mode 100644 frontend/js/app/nginx/proxy/location-item.ejs delete mode 100644 frontend/js/app/nginx/proxy/location.js delete mode 100644 frontend/js/app/nginx/proxy/main.ejs delete mode 100644 frontend/js/app/nginx/proxy/main.js delete mode 100644 frontend/js/app/nginx/redirection/delete.ejs delete mode 100644 frontend/js/app/nginx/redirection/delete.js delete mode 100644 frontend/js/app/nginx/redirection/form.ejs delete mode 100644 frontend/js/app/nginx/redirection/form.js delete mode 100644 frontend/js/app/nginx/redirection/list/item.ejs delete mode 100644 frontend/js/app/nginx/redirection/list/item.js delete mode 100644 frontend/js/app/nginx/redirection/list/main.ejs delete mode 100644 frontend/js/app/nginx/redirection/list/main.js delete mode 100644 frontend/js/app/nginx/redirection/main.ejs delete mode 100644 frontend/js/app/nginx/redirection/main.js delete mode 100644 frontend/js/app/nginx/stream/delete.ejs delete mode 100644 frontend/js/app/nginx/stream/delete.js delete mode 100644 frontend/js/app/nginx/stream/form.ejs delete mode 100644 frontend/js/app/nginx/stream/form.js delete mode 100644 frontend/js/app/nginx/stream/list/item.ejs delete mode 100644 frontend/js/app/nginx/stream/list/item.js delete mode 100644 frontend/js/app/nginx/stream/list/main.ejs delete mode 100644 frontend/js/app/nginx/stream/list/main.js delete mode 100644 frontend/js/app/nginx/stream/main.ejs delete mode 100644 frontend/js/app/nginx/stream/main.js delete mode 100644 frontend/js/app/router.js delete mode 100644 frontend/js/app/settings/default-site/main.ejs delete mode 100644 frontend/js/app/settings/default-site/main.js delete mode 100644 frontend/js/app/settings/list/item.ejs delete mode 100644 frontend/js/app/settings/list/item.js delete mode 100644 frontend/js/app/settings/list/main.ejs delete mode 100644 frontend/js/app/settings/list/main.js delete mode 100644 frontend/js/app/settings/main.ejs delete mode 100644 frontend/js/app/settings/main.js delete mode 100644 frontend/js/app/tokens.js delete mode 100644 frontend/js/app/ui/footer/main.ejs delete mode 100644 frontend/js/app/ui/footer/main.js delete mode 100644 frontend/js/app/ui/header/main.ejs delete mode 100644 frontend/js/app/ui/header/main.js delete mode 100644 frontend/js/app/ui/main.ejs delete mode 100644 frontend/js/app/ui/main.js delete mode 100644 frontend/js/app/ui/menu/main.ejs delete mode 100644 frontend/js/app/ui/menu/main.js delete mode 100644 frontend/js/app/user/delete.ejs delete mode 100644 frontend/js/app/user/delete.js delete mode 100644 frontend/js/app/user/form.ejs delete mode 100644 frontend/js/app/user/form.js delete mode 100644 frontend/js/app/user/password.ejs delete mode 100644 frontend/js/app/user/password.js delete mode 100644 frontend/js/app/user/permissions.ejs delete mode 100644 frontend/js/app/user/permissions.js delete mode 100644 frontend/js/app/users/list/item.ejs delete mode 100644 frontend/js/app/users/list/item.js delete mode 100644 frontend/js/app/users/list/main.ejs delete mode 100644 frontend/js/app/users/list/main.js delete mode 100644 frontend/js/app/users/main.ejs delete mode 100644 frontend/js/app/users/main.js delete mode 100644 frontend/js/i18n/messages.json delete mode 100644 frontend/js/index.js delete mode 100644 frontend/js/lib/helpers.js delete mode 100644 frontend/js/lib/marionette.js delete mode 100644 frontend/js/login.js delete mode 100644 frontend/js/login/main.js delete mode 100644 frontend/js/login/ui/login.ejs delete mode 100644 frontend/js/login/ui/login.js delete mode 100644 frontend/js/models/access-list.js delete mode 100644 frontend/js/models/audit-log.js delete mode 100644 frontend/js/models/certificate.js delete mode 100644 frontend/js/models/dead-host.js delete mode 100644 frontend/js/models/proxy-host-location.js delete mode 100644 frontend/js/models/proxy-host.js delete mode 100644 frontend/js/models/redirection-host.js delete mode 100644 frontend/js/models/setting.js delete mode 100644 frontend/js/models/stream.js delete mode 100644 frontend/js/models/user.js rename frontend/{app-images => public/images}/default-avatar.jpg (100%) rename frontend/{app-images/favicons => public/images/favicon}/android-chrome-192x192.png (100%) rename frontend/{app-images/favicons => public/images/favicon}/android-chrome-512x512.png (100%) rename frontend/{app-images/favicons => public/images/favicon}/apple-touch-icon.png (100%) rename frontend/{app-images/favicons => public/images/favicon}/browserconfig.xml (100%) rename frontend/{app-images/favicons => public/images/favicon}/favicon-16x16.png (100%) rename frontend/{app-images/favicons => public/images/favicon}/favicon-32x32.png (100%) rename frontend/{app-images/favicons => public/images/favicon}/favicon.ico (100%) rename frontend/{app-images/favicons => public/images/favicon}/mstile-150x150.png (100%) rename frontend/{app-images/favicons => public/images/favicon}/safari-pinned-tab.svg (100%) rename frontend/{app-images/favicons => public/images/favicon}/site.webmanifest (100%) rename frontend/{app-images => public/images}/logo-256.png (100%) create mode 100644 frontend/public/images/logo-bold-horizontal-grey.svg create mode 100644 frontend/public/images/logo-no-text.svg create mode 100644 frontend/public/images/logo-text-horizontal-grey.png rename frontend/{app-images => public/images}/logo-text-vertical-grey.png (100%) create mode 100644 frontend/public/images/unhealthy.svg delete mode 100644 frontend/scss/custom.scss delete mode 100644 frontend/scss/fonts.scss delete mode 100644 frontend/scss/selectize.scss delete mode 100644 frontend/scss/styles.scss delete mode 100644 frontend/scss/tabler-extra.scss create mode 100644 frontend/src/App.css create mode 100644 frontend/src/App.tsx create mode 100644 frontend/src/Router.tsx create mode 100644 frontend/src/api/backend/base.ts create mode 100644 frontend/src/api/backend/createAccessList.ts create mode 100644 frontend/src/api/backend/createCertificate.ts create mode 100644 frontend/src/api/backend/createDeadHost.ts create mode 100644 frontend/src/api/backend/createProxyHost.ts create mode 100644 frontend/src/api/backend/createRedirectionHost.ts create mode 100644 frontend/src/api/backend/createStream.ts create mode 100644 frontend/src/api/backend/createUser.ts create mode 100644 frontend/src/api/backend/deleteAccessList.ts create mode 100644 frontend/src/api/backend/deleteCertificate.ts create mode 100644 frontend/src/api/backend/deleteDeadHost.ts create mode 100644 frontend/src/api/backend/deleteProxyHost.ts create mode 100644 frontend/src/api/backend/deleteRedirectionHost.ts create mode 100644 frontend/src/api/backend/deleteStream.ts create mode 100644 frontend/src/api/backend/deleteUser.ts create mode 100644 frontend/src/api/backend/downloadCertificate.ts create mode 100644 frontend/src/api/backend/getAccessList.ts create mode 100644 frontend/src/api/backend/getAccessLists.ts create mode 100644 frontend/src/api/backend/getAuditLog.ts create mode 100644 frontend/src/api/backend/getCertificate.ts create mode 100644 frontend/src/api/backend/getCertificates.ts create mode 100644 frontend/src/api/backend/getDeadHost.ts create mode 100644 frontend/src/api/backend/getDeadHosts.ts create mode 100644 frontend/src/api/backend/getHealth.ts create mode 100644 frontend/src/api/backend/getHostsReport.ts create mode 100644 frontend/src/api/backend/getProxyHost.ts create mode 100644 frontend/src/api/backend/getProxyHosts.ts create mode 100644 frontend/src/api/backend/getRedirectionHost.ts create mode 100644 frontend/src/api/backend/getRedirectionHosts.ts create mode 100644 frontend/src/api/backend/getSetting.ts create mode 100644 frontend/src/api/backend/getSettings.ts create mode 100644 frontend/src/api/backend/getStream.ts create mode 100644 frontend/src/api/backend/getStreams.ts create mode 100644 frontend/src/api/backend/getToken.ts create mode 100644 frontend/src/api/backend/getUser.ts create mode 100644 frontend/src/api/backend/getUsers.ts create mode 100644 frontend/src/api/backend/helpers.ts create mode 100644 frontend/src/api/backend/index.ts create mode 100644 frontend/src/api/backend/models.ts create mode 100644 frontend/src/api/backend/refreshToken.ts create mode 100644 frontend/src/api/backend/renewCertificate.ts create mode 100644 frontend/src/api/backend/responseTypes.ts create mode 100644 frontend/src/api/backend/testHttpCertificate.ts create mode 100644 frontend/src/api/backend/toggleDeadHost.ts create mode 100644 frontend/src/api/backend/toggleProxyHost.ts create mode 100644 frontend/src/api/backend/toggleRedirectionHost.ts create mode 100644 frontend/src/api/backend/toggleStream.ts create mode 100644 frontend/src/api/backend/updateAccessList.ts create mode 100644 frontend/src/api/backend/updateAuth.ts create mode 100644 frontend/src/api/backend/updateDeadHost.ts create mode 100644 frontend/src/api/backend/updateProxyHost.ts create mode 100644 frontend/src/api/backend/updateRedirectionHost.ts create mode 100644 frontend/src/api/backend/updateSetting.ts create mode 100644 frontend/src/api/backend/updateStream.ts create mode 100644 frontend/src/api/backend/updateUser.ts create mode 100644 frontend/src/api/backend/uploadCertificate.ts create mode 100644 frontend/src/api/backend/validateCertificate.ts create mode 100644 frontend/src/components/Button.tsx create mode 100644 frontend/src/components/ErrorNotFound.tsx create mode 100644 frontend/src/components/Flag.tsx create mode 100644 frontend/src/components/HasPermission.tsx create mode 100644 frontend/src/components/LoadingPage.module.css create mode 100644 frontend/src/components/LoadingPage.tsx create mode 100644 frontend/src/components/LocalePicker.module.css create mode 100644 frontend/src/components/LocalePicker.tsx create mode 100644 frontend/src/components/NavLink.tsx create mode 100644 frontend/src/components/Page.module.css create mode 100644 frontend/src/components/Page.tsx create mode 100644 frontend/src/components/SiteContainer.tsx create mode 100644 frontend/src/components/SiteFooter.tsx create mode 100644 frontend/src/components/SiteHeader.module.css create mode 100644 frontend/src/components/SiteHeader.tsx create mode 100644 frontend/src/components/SiteMenu.tsx create mode 100644 frontend/src/components/Table/EmptyRow.tsx create mode 100644 frontend/src/components/Table/Formatter/CertificateFormatter.tsx create mode 100644 frontend/src/components/Table/Formatter/DomainsFormatter.tsx create mode 100644 frontend/src/components/Table/Formatter/GravatarFormatter.tsx create mode 100644 frontend/src/components/Table/Formatter/StatusFormatter.tsx create mode 100644 frontend/src/components/Table/Formatter/ValueWithDateFormatter.tsx create mode 100644 frontend/src/components/Table/Formatter/index.ts create mode 100644 frontend/src/components/Table/TableBody.tsx create mode 100644 frontend/src/components/Table/TableHeader.tsx create mode 100644 frontend/src/components/Table/TableHelpers.ts create mode 100644 frontend/src/components/Table/TableLayout.tsx create mode 100644 frontend/src/components/Table/index.ts create mode 100644 frontend/src/components/ThemeSwitcher.module.css create mode 100644 frontend/src/components/ThemeSwitcher.tsx create mode 100644 frontend/src/components/Unhealthy.tsx create mode 100644 frontend/src/components/index.ts create mode 100644 frontend/src/context/AuthContext.tsx create mode 100644 frontend/src/context/LocaleContext.tsx create mode 100644 frontend/src/context/ThemeContext.tsx create mode 100644 frontend/src/context/index.ts create mode 100644 frontend/src/declarations.d.ts create mode 100644 frontend/src/hooks/index.ts create mode 100644 frontend/src/hooks/useAccessLists.ts create mode 100644 frontend/src/hooks/useDeadHosts.ts create mode 100644 frontend/src/hooks/useHealth.ts create mode 100644 frontend/src/hooks/useHostReport.ts create mode 100644 frontend/src/hooks/useProxyHosts.ts create mode 100644 frontend/src/hooks/useRedirectionHosts.ts create mode 100644 frontend/src/hooks/useStreams.ts create mode 100644 frontend/src/hooks/useTheme.ts create mode 100644 frontend/src/hooks/useUser.ts create mode 100644 frontend/src/hooks/useUsers.ts create mode 100644 frontend/src/locale/IntlProvider.tsx create mode 100644 frontend/src/locale/README.md create mode 100644 frontend/src/locale/index.ts create mode 100644 frontend/src/locale/lang/de.json create mode 100644 frontend/src/locale/lang/en.json create mode 100644 frontend/src/locale/lang/fa.json create mode 100644 frontend/src/locale/lang/lang-list.json create mode 100644 frontend/src/locale/src/de.json create mode 100644 frontend/src/locale/src/en.json create mode 100644 frontend/src/locale/src/fa.json create mode 100644 frontend/src/locale/src/lang-list.json create mode 100644 frontend/src/main.tsx create mode 100644 frontend/src/modals/ChangePasswordModal.tsx create mode 100644 frontend/src/modals/UserModal.tsx create mode 100644 frontend/src/modals/index.ts create mode 100644 frontend/src/modules/AuthStore.ts create mode 100644 frontend/src/modules/Validations.tsx create mode 100644 frontend/src/pages/Access/Empty.tsx create mode 100644 frontend/src/pages/Access/Table.tsx create mode 100644 frontend/src/pages/Access/TableWrapper.tsx create mode 100644 frontend/src/pages/Access/index.tsx create mode 100644 frontend/src/pages/AuditLog/AuditTable.tsx create mode 100644 frontend/src/pages/AuditLog/index.tsx create mode 100644 frontend/src/pages/Certificates/CertificateTable.tsx create mode 100644 frontend/src/pages/Certificates/index.tsx create mode 100644 frontend/src/pages/Dashboard/index.tsx create mode 100644 frontend/src/pages/Login/index.module.css create mode 100644 frontend/src/pages/Login/index.tsx create mode 100644 frontend/src/pages/Nginx/DeadHosts/Empty.tsx create mode 100644 frontend/src/pages/Nginx/DeadHosts/Table.tsx create mode 100644 frontend/src/pages/Nginx/DeadHosts/TableWrapper.tsx create mode 100644 frontend/src/pages/Nginx/DeadHosts/index.tsx create mode 100644 frontend/src/pages/Nginx/ProxyHosts/Empty.tsx create mode 100644 frontend/src/pages/Nginx/ProxyHosts/Table.tsx create mode 100644 frontend/src/pages/Nginx/ProxyHosts/TableWrapper.tsx create mode 100644 frontend/src/pages/Nginx/ProxyHosts/index.tsx create mode 100644 frontend/src/pages/Nginx/RedirectionHosts/Empty.tsx create mode 100644 frontend/src/pages/Nginx/RedirectionHosts/Table.tsx create mode 100644 frontend/src/pages/Nginx/RedirectionHosts/TableWrapper.tsx create mode 100644 frontend/src/pages/Nginx/RedirectionHosts/index.tsx create mode 100644 frontend/src/pages/Nginx/Streams/Empty.tsx create mode 100644 frontend/src/pages/Nginx/Streams/Table.tsx create mode 100644 frontend/src/pages/Nginx/Streams/TableWrapper.tsx create mode 100644 frontend/src/pages/Nginx/Streams/index.tsx create mode 100644 frontend/src/pages/Settings/SettingTable.tsx create mode 100644 frontend/src/pages/Settings/index.tsx create mode 100644 frontend/src/pages/Users/Empty.tsx create mode 100644 frontend/src/pages/Users/Table.tsx create mode 100644 frontend/src/pages/Users/TableWrapper.tsx create mode 100644 frontend/src/pages/Users/index.tsx create mode 100644 frontend/src/vite-env.d.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.ts create mode 100644 frontend/vitest-setup.js delete mode 100644 frontend/webpack.config.js diff --git a/backend/internal/user.js b/backend/internal/user.js index 012252cf..e3d7ca4c 100644 --- a/backend/internal/user.js +++ b/backend/internal/user.js @@ -12,6 +12,8 @@ const omissions = () => { return ["is_deleted"]; } +const DEFAULT_AVATAR = 'https://gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=200&d=mp&r=g'; + const internalUser = { /** * @param {Access} access @@ -33,7 +35,6 @@ const internalUser = { .can("users:create", data) .then(() => { data.avatar = gravatar.url(data.email, { default: "mm" }); - return userModel.query().insertAndFetch(data).then(utils.omitRow(omissions())); }) .then((user) => { @@ -133,7 +134,6 @@ const internalUser = { } data.avatar = gravatar.url(data.email || user.email, { default: "mm" }); - return userModel.query().patchAndFetchById(user.id, data).then(utils.omitRow(omissions())); }) .then(() => { @@ -193,6 +193,11 @@ const internalUser = { if (typeof thisData.omit !== "undefined" && thisData.omit !== null) { return _.omit(row, thisData.omit); } + + if (row.avatar === "") { + row.avatar = DEFAULT_AVATAR; + } + return row; }); }, @@ -299,32 +304,32 @@ const internalUser = { * @param {String} [search_query] * @returns {Promise} */ - getAll: (access, expand, search_query) => { - return access.can("users:list").then(() => { - const query = userModel - .query() - .where("is_deleted", 0) - .groupBy("id") - .allowGraph("[permissions]") - .orderBy("name", "ASC"); + getAll: async (access, expand, search_query) => { + await access.can("users:list"); + const query = userModel + .query() + .where("is_deleted", 0) + .groupBy("id") + .allowGraph("[permissions]") + .orderBy("name", "ASC"); - // Query is used for searching - if (typeof search_query === "string") { - query.where(function () { - this.where("name", "like", `%${search_query}%`).orWhere( - "email", - "like", - `%${search_query}%`, - ); - }); - } + // Query is used for searching + if (typeof search_query === "string") { + query.where(function () { + this.where("name", "like", `%${search_query}%`).orWhere( + "email", + "like", + `%${search_query}%`, + ); + }); + } - if (typeof expand !== "undefined" && expand !== null) { - query.withGraphFetched(`[${expand.join(", ")}]`); - } + if (typeof expand !== "undefined" && expand !== null) { + query.withGraphFetched(`[${expand.join(", ")}]`); + } - return query.then(utils.omitRows(omissions())); - }); + const res = await query; + return utils.omitRows(omissions())(res); }, /** diff --git a/backend/yarn.lock b/backend/yarn.lock index bf8091ec..fd936a9b 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -2,19 +2,19 @@ # yarn lockfile v1 -"@apidevtools/json-schema-ref-parser@9.0.6": - version "9.0.6" - resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz#5d9000a3ac1fd25404da886da6b266adcd99cf1c" - integrity sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg== +"@apidevtools/json-schema-ref-parser@11.7.2": + version "11.7.2" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz#cdf3e0aded21492364a70e193b45b7cf4177f031" + integrity sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA== dependencies: "@jsdevtools/ono" "^7.1.3" - call-me-maybe "^1.0.1" - js-yaml "^3.13.1" + "@types/json-schema" "^7.0.15" + js-yaml "^4.1.0" "@apidevtools/json-schema-ref-parser@^11.7.0": - version "11.7.0" - resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.0.tgz#228d72018a0e7cbee744b677eaa01a8968f302d9" - integrity sha512-pRrmXMCwnmrkS3MLgAIW5dXRzeTv6GLjkjb4HmxNnvAKXN1Nfzp4KmGADBQvlVUcqi+a5D+hfGDLLnd5NnYxog== + version "11.9.3" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz#0e0c9061fc41cf03737d499a4e6a8299fdd2bfa7" + integrity sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ== dependencies: "@jsdevtools/ono" "^7.1.3" "@types/json-schema" "^7.0.15" @@ -31,17 +31,17 @@ integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg== "@apidevtools/swagger-parser@^10.1.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@apidevtools/swagger-parser/-/swagger-parser-10.1.0.tgz#a987d71e5be61feb623203be0c96e5985b192ab6" - integrity sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw== + version "10.1.1" + resolved "https://registry.yarnpkg.com/@apidevtools/swagger-parser/-/swagger-parser-10.1.1.tgz#e29bf17cf94b487a340e06784e9fbe20cb671c45" + integrity sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA== dependencies: - "@apidevtools/json-schema-ref-parser" "9.0.6" + "@apidevtools/json-schema-ref-parser" "11.7.2" "@apidevtools/openapi-schemas" "^2.1.0" "@apidevtools/swagger-methods" "^3.0.2" "@jsdevtools/ono" "^7.1.3" - ajv "^8.6.3" + ajv "^8.17.1" ajv-draft-04 "^1.0.0" - call-me-maybe "^1.0.1" + call-me-maybe "^1.0.2" "@biomejs/biome@2.2.0": version "2.2.0" @@ -107,10 +107,10 @@ resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== -"@mapbox/node-pre-gyp@^1.0.0": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz#8e6735ccebbb1581e5a7e652244cadc8a844d03c" - integrity sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA== +"@mapbox/node-pre-gyp@^1.0.0", "@mapbox/node-pre-gyp@^1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" + integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== dependencies: detect-libc "^2.0.0" https-proxy-agent "^5.0.0" @@ -138,28 +138,11 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - "@types/json-schema@^7.0.15": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -170,7 +153,7 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@~1.3.5, accepts@~1.3.8: +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== @@ -186,12 +169,10 @@ agent-base@6, agent-base@^6.0.2: debug "4" agentkeepalive@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" - integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== + version "4.6.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a" + integrity sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ== dependencies: - debug "^4.1.0" - depd "^2.0.0" humanize-ms "^1.2.1" aggregate-error@^3.0.0: @@ -207,7 +188,7 @@ ajv-draft-04@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== -ajv@^8.17.1, ajv@^8.6.3: +ajv@^8.17.1, ajv@^8.6.2: version "8.17.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== @@ -217,43 +198,6 @@ ajv@^8.17.1, ajv@^8.6.3: json-schema-traverse "^1.0.0" require-from-string "^2.0.2" -ajv@^8.6.2: - 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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== - dependencies: - string-width "^3.0.0" - -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= - -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= - -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== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -267,30 +211,24 @@ ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== +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: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - "aproba@^1.0.3 || ^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.1.0.tgz#75500a190313d95c64e871e7e4284c6ac219f0b1" + integrity sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew== archiver-utils@^2.1.0: version "2.1.0" @@ -308,16 +246,32 @@ archiver-utils@^2.1.0: normalize-path "^3.0.0" readable-stream "^2.0.0" +archiver-utils@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-3.0.4.tgz#a0d201f1cf8fce7af3b5a05aea0a337329e96ec7" + integrity sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw== + dependencies: + glob "^7.2.3" + graceful-fs "^4.2.0" + lazystream "^1.0.0" + lodash.defaults "^4.2.0" + lodash.difference "^4.5.0" + lodash.flatten "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.union "^4.6.0" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + archiver@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.0.tgz#dd3e097624481741df626267564f7dd8640a45ba" - integrity sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg== + version "5.3.2" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.2.tgz#99991d5957e53bd0303a392979276ac4ddccf3b0" + integrity sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw== dependencies: archiver-utils "^2.1.0" - async "^3.2.0" + async "^3.2.4" buffer-crc32 "^0.2.1" readable-stream "^3.6.0" - readdir-glob "^1.0.0" + readdir-glob "^1.1.2" tar-stream "^2.2.0" zip-stream "^4.1.0" @@ -337,21 +291,6 @@ are-we-there-yet@^3.0.0: delegates "^1.0.0" readable-stream "^3.6.0" -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== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - 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" @@ -360,19 +299,19 @@ argparse@^2.0.1: 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== asn1@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" -async@^3.2.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== +async@^3.2.4: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== aws-ssl-profiles@^1.1.1: version "1.1.2" @@ -380,9 +319,9 @@ aws-ssl-profiles@^1.1.1: integrity sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g== 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.3.1: version "1.5.1" @@ -392,20 +331,20 @@ base64-js@^1.3.1: batchflow@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/batchflow/-/batchflow-0.4.0.tgz#7d419df79b6b7587b06f9ea34f96ccef6f74e5b5" - integrity sha1-fUGd95trdYewb56jT5bM72905bU= + integrity sha512-XwQQoCGPUjdLWzmpAvRNZc91wnBYuKLmj52d9LLZ1Ww06ow5RBqBt8kUmU9/3ZvPq88j7Elh3V4cEhgNKXbIlQ== bcrypt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.0.0.tgz#051407c7cd5ffbfb773d541ca3760ea0754e37e2" - integrity sha512-jB0yCBl4W/kVHM2whjfyqnxTmOHkCX4kHEa5nYKSoGeYe8YrjTYTc87/6bwt1g8cmV0QrbhKriETg9jWtcREhg== + version "5.1.1" + resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.1.1.tgz#0f732c6dcb4e12e5b70a25e326a72965879ba6e2" + integrity sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww== dependencies: - node-addon-api "^3.0.0" - node-pre-gyp "0.15.0" + "@mapbox/node-pre-gyp" "^1.0.11" + node-addon-api "^5.0.0" binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bl@^4.0.3: version "4.1.0" @@ -417,9 +356,9 @@ bl@^4.0.3: readable-stream "^3.4.0" blueimp-md5@^2.16.0: - version "2.17.0" - resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.17.0.tgz#f4fcac088b115f7b4045f19f5da59e9d01b1bb96" - integrity sha512-x5PKJHY5rHQYaADj6NwPUR2QRCUVSggPzrUKkeENpj871o9l9IefJbO2jkT5UvYykeOK9dx0VmkIo6dZ+vThYw== + version "2.19.0" + resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" + integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== body-parser@1.20.3, body-parser@^1.20.3: version "1.20.3" @@ -439,20 +378,6 @@ body-parser@1.20.3, body-parser@^1.20.3: type-is "~1.6.18" unpipe "1.0.0" -boxen@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" - integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^5.3.1" - chalk "^3.0.0" - cli-boxes "^2.2.0" - string-width "^4.1.0" - term-size "^2.1.0" - type-fest "^0.8.1" - widest-line "^3.1.0" - brace-expansion@^1.1.7: version "1.1.12" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" @@ -461,6 +386,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== + dependencies: + balanced-match "^1.0.0" + braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" @@ -471,12 +403,12 @@ braces@~3.0.2: buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== -buffer-equal-constant-time@1.0.1: +buffer-equal-constant-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== buffer@^5.5.0: version "5.7.1" @@ -486,17 +418,12 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -busboy@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" - integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: - dicer "0.3.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= + streamsearch "^1.1.0" bytes@3.1.2: version "3.1.2" @@ -527,36 +454,28 @@ cacache@^15.2.0: tar "^6.0.2" unique-filename "^1.1.1" -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -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: - 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" -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= +call-bound@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" -camelcase@^5.0.0, camelcase@^5.3.1: +call-me-maybe@^1.0.2: + 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== + +camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -578,54 +497,31 @@ chalk@^2.3.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== +chokidar@^3.5.2: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@^3.2.2: - version "3.4.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" - integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g== - dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.4.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.1.2" - -chownr@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + fsevents "~2.3.2" chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - 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== -cli-boxes@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" - integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -635,18 +531,6 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= - dependencies: - mimic-response "^1.0.0" - -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= - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -664,7 +548,7 @@ color-convert@^2.0.1: 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.1.4: version "1.1.4" @@ -682,26 +566,26 @@ colorette@2.0.19: integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== commander@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" - integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== commander@^9.1.0: version "9.5.0" resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== -compress-commons@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d" - integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ== +compress-commons@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.2.tgz#6542e59cb63e1f46a8b21b0e06f9a32e4c8b06df" + integrity sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg== dependencies: buffer-crc32 "^0.2.13" crc32-stream "^4.0.2" normalize-path "^3.0.0" readable-stream "^3.6.0" -compressible@~2.0.16: +compressible@~2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== @@ -709,39 +593,27 @@ compressible@~2.0.16: mime-db ">= 1.43.0 < 2" compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + version "1.8.1" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" + integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" + bytes "3.1.2" + compressible "~2.0.18" debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" + negotiator "~0.6.4" + on-headers "~1.1.0" + safe-buffer "5.2.1" vary "~1.1.2" 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== -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - -console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: +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= + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== content-disposition@0.5.4: version "0.5.4" @@ -758,107 +630,80 @@ content-type@~1.0.4, content-type@~1.0.5: 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= + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== 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= + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== crc-32@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" - integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== - dependencies: - exit-on-epipe "~1.0.1" - printj "~1.1.0" + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== crc32-stream@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007" - integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== + version "4.0.3" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.3.tgz#85dd677eb78fa7cad1ba17cc506a597d41fc6f33" + integrity sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw== dependencies: crc-32 "^1.2.0" readable-stream "^3.4.0" -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - db-errors@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/db-errors/-/db-errors-0.2.3.tgz#a6a38952e00b20e790f2695a6446b3c65497ffa2" integrity sha512-OOgqgDuCavHXjYSJoV2yGhv6SeG8nk42aoCSoyXLZUH7VwFG27rxbavU1z+VrZbZjphw5UkDQwUlD21MwZpUng== -debug@2.6.9, debug@^2.2.0: +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@4, debug@4.3.4, debug@^4.1.0, debug@^4.3.3: +debug@4, debug@^4.3.3: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + +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.2" -debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== +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.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -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== - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -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: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== denque@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== -depd@2.0.0, depd@^2.0.0: +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== @@ -868,34 +713,19 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-libc@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" - integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.4.tgz#f04715b8ba815e53b4d8109655b6508a6865a7e8" + integrity sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA== -dicer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" - integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: - streamsearch "0.1.2" - -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== - dependencies: - is-obj "^2.0.0" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" ecdsa-sig-formatter@1.0.11: version "1.0.11" @@ -907,18 +737,13 @@ ecdsa-sig-formatter@1.0.11: 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== email-validator@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed" integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ== -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== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -927,7 +752,7 @@ emoji-regex@^8.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= + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== encodeurl@~2.0.0: version "2.0.0" @@ -941,10 +766,10 @@ encoding@^0.1.12: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - 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== +end-of-stream@^1.4.1: + version "1.4.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== dependencies: once "^1.4.0" @@ -965,116 +790,106 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -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-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== 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== -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 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.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== esm@^3.2.25: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -exit-on-epipe@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" - integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== express-fileupload@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/express-fileupload/-/express-fileupload-1.1.9.tgz#e798e9318394ed5083e56217ad6cda576da465d2" - integrity sha512-f2w0aoe7lj3NeD8a4MXmYQsqir3Z66I08l9AKq04QbFUAjeZNmPwTlR5Lx2NGwSu/PslsAjGC38MWzo5tTjoBg== + version "1.5.2" + resolved "https://registry.yarnpkg.com/express-fileupload/-/express-fileupload-1.5.2.tgz#4da70ba6f2ffd4c736eab0776445865a9dbd9bfa" + integrity sha512-wxUJn2vTHvj/kZCVmc5/bJO15C7aSMyHeuXYY3geKpeKibaAoQGcEv5+sM6nHS2T7VF+QHS4hTWPiY2mKofEdg== dependencies: - busboy "^0.3.1" + busboy "^1.6.0" express@^4.20.0: - version "4.20.0" - resolved "https://registry.yarnpkg.com/express/-/express-4.20.0.tgz#f1d08e591fcec770c07be4767af8eb9bcfd67c48" - integrity sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw== + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: accepts "~1.3.8" array-flatten "1.1.1" body-parser "1.20.3" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.6.0" + cookie "0.7.1" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.2.0" + finalhandler "1.3.1" fresh "0.5.2" http-errors "2.0.0" merge-descriptors "1.0.3" methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.10" + path-to-regexp "0.1.12" proxy-addr "~2.0.7" - qs "6.11.0" + qs "6.13.0" range-parser "~1.2.1" safe-buffer "5.2.1" send "0.19.0" - serve-static "1.16.0" + serve-static "1.16.2" setprototypeof "1.2.0" statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: +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-uri@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.2.tgz#d78b298cf70fd3b752fd951175a3da6a7b48f024" - integrity sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row== + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" + integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== dependencies: escape-string-regexp "^1.0.5" @@ -1085,13 +900,13 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -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== +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "2.4.1" parseurl "~1.3.3" @@ -1101,7 +916,7 @@ finalhandler@1.2.0: find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" @@ -1121,20 +936,13 @@ forwarded@0.2.0: fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -1145,17 +953,12 @@ fs-minipass@^2.0.0: 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= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -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: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" @@ -1191,20 +994,6 @@ gauge@^4.0.3: strip-ansi "^6.0.1" wide-align "^1.1.5" -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" - generate-function@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" @@ -1217,122 +1006,73 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.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== +get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" es-errors "^1.3.0" + es-object-atoms "^1.1.1" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" 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-stream@^4.1.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-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== - dependencies: - pump "^3.0.0" + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" getopts@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4" integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA== -glob-parent@~5.1.0: +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@^7.1.3: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.1.3, glob@^7.1.4, glob@^7.2.3: + 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" -glob@^7.1.4: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -global-dirs@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" - integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== - dependencies: - ini "^1.3.5" - -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@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -graceful-fs@^4.2.0: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - -graceful-fs@^4.2.6: +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.0, graceful-fs@^4.2.6: 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== gravatar@^1.8.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/gravatar/-/gravatar-1.8.1.tgz#743bbdf3185c3433172e00e0e6ff5f6b30c58997" - integrity sha512-18frnfVp4kRYkM/eQW32Mfwlsh/KMbwd3S6nkescBZHioobflFEFHsvM71qZAkUSLNifyi2uoI+TuGxJAnQIOA== + version "1.8.2" + resolved "https://registry.yarnpkg.com/gravatar/-/gravatar-1.8.2.tgz#f298642b1562ed685af2ae938dbe31ec0c542cc1" + integrity sha512-GdRwLM3oYpFQKy47MKuluw9hZ2gaCtiKPbDGdcDEuYDKlc8eNnW27KYL9LVbIDzEsx88WtDWQm2ClBcsgBnj6w== dependencies: blueimp-md5 "^2.16.0" email-validator "^2.0.4" @@ -1342,58 +1082,34 @@ gravatar@^1.8.0: 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-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-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-proto@^1.0.1: - 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.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-unicode@^2.0.0, has-unicode@^2.0.1: +has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -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" - -hasown@^2.0.0: +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: function-bind "^1.1.2" -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== +http-cache-semantics@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5" + integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== http-errors@2.0.0: version "2.0.0" @@ -1430,20 +1146,27 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.4: +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" -iconv-lite@^0.6.2, iconv-lite@^0.6.3: +iconv-lite@^0.6.2: 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: safer-buffer ">= 2.1.2 < 3.0.0" +iconv-lite@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.0.tgz#c50cd80e6746ca8115eb98743afa81aa0e147a3e" + integrity sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -1452,24 +1175,12 @@ ieee754@^1.1.13: ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= - -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== 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== indent-string@^4.0.0: version "4.0.0" @@ -1484,7 +1195,7 @@ infer-owner@^1.0.4: 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" @@ -1497,22 +1208,17 @@ inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -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== + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== 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== -ip@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" - integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== +ip-address@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.0.1.tgz#a8180b783ce7788777d796286d61bce4276818ed" + integrity sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA== ipaddr.js@1.9.1: version "1.9.1" @@ -1522,7 +1228,7 @@ ipaddr.js@1.9.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-binary-path@~2.1.0: version "2.1.0" @@ -1531,36 +1237,17 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: - ci-info "^2.0.0" - -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" + hasown "^2.0.2" 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-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= - 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-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -1568,82 +1255,41 @@ is-fullwidth-code-point@^3.0.0: integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + 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.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== - dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" - is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-npm@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" - integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== - 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-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-path-inside@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== - is-property@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" integrity sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g== is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - -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-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 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== 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= - -js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== js-yaml@^4.1.0: version "4.1.0" @@ -1652,11 +1298,6 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - 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" @@ -1668,21 +1309,27 @@ json-schema-traverse@^1.0.0: integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== jsonwebtoken@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" - integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== + version "9.0.2" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" + integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== dependencies: jws "^3.2.2" - lodash "^4.17.21" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" ms "^2.1.1" - semver "^7.3.8" + semver "^7.5.4" jwa@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" - integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + version "1.4.2" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.2.tgz#16011ac6db48de7b102777e57897901520eec7b9" + integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw== dependencies: - buffer-equal-constant-time "1.0.1" + buffer-equal-constant-time "^1.0.1" ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" @@ -1694,13 +1341,6 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - knex@2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/knex/-/knex-2.4.2.tgz#a34a289d38406dc19a0447a78eeaf2d16ebedd61" @@ -1721,17 +1361,10 @@ knex@2.4.2: tarn "^3.0.2" tildify "2.0.0" -latest-version@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + version "1.0.1" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" + integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== dependencies: readable-stream "^2.0.5" @@ -1745,7 +1378,7 @@ liquidjs@10.6.1: 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 sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== dependencies: graceful-fs "^4.1.2" parse-json "^4.0.0" @@ -1755,7 +1388,7 @@ load-json-file@^4.0.0: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -1770,27 +1403,57 @@ locate-path@^5.0.0: lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== lodash.difference@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= + integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA== lodash.flatten@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== lodash.union@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" - integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= + integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== lodash@^4.17.21: version "4.17.21" @@ -1798,19 +1461,9 @@ lodash@^4.17.21: integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== long@^5.2.1: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + version "5.3.2" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" + integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== lru-cache@^6.0.0: version "6.0.0" @@ -1824,10 +1477,10 @@ lru-cache@^7.14.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -lru-cache@^8.0.0: - version "8.0.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-8.0.5.tgz#983fe337f3e176667f8e567cfcce7cb064ea214e" - integrity sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA== +lru.min@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/lru.min/-/lru.min-1.1.2.tgz#01ce1d72cc50c7faf8bd1f809ebf05d4331021eb" + integrity sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg== make-dir@^3.0.0, make-dir@^3.1.0: version "3.1.0" @@ -1858,10 +1511,15 @@ make-fetch-happen@^9.1.0: socks-proxy-agent "^6.0.0" ssri "^8.0.0" +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + 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= + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== merge-descriptors@1.0.3: version "1.0.3" @@ -1871,26 +1529,19 @@ merge-descriptors@1.0.3: methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== mime-db@1.52.0: 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.24: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== - dependencies: - mime-db "1.44.0" +"mime-db@>= 1.43.0 < 2": + version "1.54.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== -mime-types@~2.1.34: +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== @@ -1902,22 +1553,19 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +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: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +minimatch@^5.1.0: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" minipass-collect@^1.0.2: version "1.0.2" @@ -1958,14 +1606,6 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^2.6.0, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" @@ -1973,17 +1613,10 @@ minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: dependencies: yallist "^4.0.0" -minipass@^4.0.0: - version "4.2.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.5.tgz#9e0e5256f1e3513f8c34691dd68549e85b2c8ceb" - integrity sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q== - -minizlib@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== minizlib@^2.0.0, minizlib@^2.1.1: version "2.1.2" @@ -1993,49 +1626,42 @@ minizlib@^2.0.0, minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" -mkdirp@^0.5.3, mkdirp@^0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== moment@^2.29.4: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2, 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== -ms@2.1.3, ms@^2.0.0: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== mysql2@^3.11.1: - version "3.11.1" - resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-3.11.1.tgz#edfb856e2176fcf43d2cc066dd4959e9fc76ea85" - integrity sha512-Oc8Zffd0gpIJnJ/NOMp6IiiJJDdWc7nmWpS+UE3K9feTpYia8XkbgL6EaOJYz52f6+2pAoC0eAQqUzal4lnNGQ== + version "3.14.4" + resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-3.14.4.tgz#36e33a8d33820a299fb9e9221486310b1a4c8767" + integrity sha512-Cs/jx3WZPNrYHVz+Iunp9ziahaG5uFMvD2R8Zlmc194AqXNxt9HBNu7ZsPYrUtmJsF0egETCWIdMIYAwOGjL1w== dependencies: aws-ssl-profiles "^1.1.1" denque "^2.1.0" generate-function "^2.3.1" - iconv-lite "^0.6.3" + iconv-lite "^0.7.0" long "^5.2.1" - lru-cache "^8.0.0" + lru.min "^1.0.0" named-placeholders "^1.1.3" seq-queue "^0.0.5" sqlstring "^2.3.2" @@ -2047,34 +1673,30 @@ named-placeholders@^1.1.3: dependencies: lru-cache "^7.14.1" -needle@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.0.tgz#e6fc4b3cc6c25caed7554bd613a5cf0bac8c31c0" - integrity sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.3, negotiator@^0.6.2: +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-addon-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.0.0.tgz#812446a1001a54f71663bed188314bba07e09247" - integrity sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg== +negotiator@^0.6.2, negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== node-addon-api@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + node-fetch@^2.6.7: - version "2.6.9" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" - integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" @@ -2094,22 +1716,6 @@ node-gyp@8.x: tar "^6.1.2" which "^2.0.2" -node-pre-gyp@0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz#c2fc383276b74c7ffa842925241553e8b40f1087" - integrity sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.3" - needle "^2.5.0" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - node-rsa@^1.0.8: version "1.1.1" resolved "https://registry.yarnpkg.com/node-rsa/-/node-rsa-1.1.1.tgz#efd9ad382097782f506153398496f79e4464434d" @@ -2118,28 +1724,20 @@ node-rsa@^1.0.8: asn1 "^0.2.4" nodemon@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.4.tgz#55b09319eb488d6394aa9818148c0c2d1c04c416" - integrity sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ== + version "2.0.22" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.22.tgz#182c45c3a78da486f673d6c1702e00728daf5258" + integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ== dependencies: - chokidar "^3.2.2" - debug "^3.2.6" + chokidar "^3.5.2" + debug "^3.2.7" ignore-by-default "^1.0.1" - minimatch "^3.0.4" - pstree.remy "^1.1.7" + minimatch "^3.1.2" + pstree.remy "^1.1.8" semver "^5.7.1" + simple-update-notifier "^1.0.7" supports-color "^5.5.0" touch "^3.1.0" - undefsafe "^2.0.2" - update-notifier "^4.0.0" - -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" + undefsafe "^2.0.5" nopt@^5.0.0: version "5.0.0" @@ -2148,54 +1746,11 @@ nopt@^5.0.0: dependencies: abbrev "1" -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= - dependencies: - abbrev "1" - 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-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - npmlog@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" @@ -2216,20 +1771,15 @@ npmlog@^6.0.0: gauge "^4.0.3" set-blocking "^2.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= - -object-assign@^4.1.0, object-assign@^4.1.1: +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-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-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== objection@3.0.1: version "3.0.1" @@ -2246,41 +1796,18 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" -on-headers@~1.0.2: - version "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== +on-headers@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" + integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.4.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" -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-tmpdir@^1.0.0: - 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.1.4: - 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-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -2298,7 +1825,7 @@ p-limit@^2.2.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 sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" @@ -2319,27 +1846,17 @@ p-map@^4.0.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 sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + 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== -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - 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" @@ -2352,7 +1869,7 @@ parseurl@~1.3.3: 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" @@ -2362,57 +1879,57 @@ 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-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.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== path@^0.12.7: version "0.12.7" resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" - integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= + integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q== dependencies: process "^0.11.1" util "^0.10.3" -pg-cloudflare@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" - integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== +pg-cloudflare@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz#a1f3d226bab2c45ae75ea54d65ec05ac6cfafbef" + integrity sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg== pg-connection-string@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== -pg-connection-string@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.7.0.tgz#f1d3489e427c62ece022dba98d5262efcb168b37" - integrity sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA== +pg-connection-string@^2.9.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.9.1.tgz#bb1fd0011e2eb76ac17360dc8fa183b2d3465238" + integrity sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w== pg-int8@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.7.0.tgz#d4d3c7ad640f8c6a2245adc369bafde4ebb8cbec" - integrity sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g== +pg-pool@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.10.1.tgz#481047c720be2d624792100cac1816f8850d31b2" + integrity sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg== -pg-protocol@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.7.0.tgz#ec037c87c20515372692edac8b63cf4405448a93" - integrity sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ== +pg-protocol@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.10.3.tgz#ac9e4778ad3f84d0c5670583bab976ea0a34f69f" + integrity sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ== -pg-types@^2.1.0: +pg-types@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== @@ -2424,19 +1941,19 @@ pg-types@^2.1.0: postgres-interval "^1.1.0" pg@^8.13.1: - version "8.13.1" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.13.1.tgz#6498d8b0a87ff76c2df7a32160309d3168c0c080" - integrity sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ== + version "8.16.3" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.16.3.tgz#160741d0b44fdf64680e45374b06d632e86c99fd" + integrity sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw== dependencies: - pg-connection-string "^2.7.0" - pg-pool "^3.7.0" - pg-protocol "^1.7.0" - pg-types "^2.1.0" - pgpass "1.x" + pg-connection-string "^2.9.1" + pg-pool "^3.10.1" + pg-protocol "^1.10.3" + pg-types "2.2.0" + pgpass "1.0.5" optionalDependencies: - pg-cloudflare "^1.1.1" + pg-cloudflare "^1.2.7" -pgpass@1.x: +pgpass@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== @@ -2444,19 +1961,19 @@ pgpass@1.x: split2 "^4.1.0" picomatch@^2.0.4, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pkg-conf@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" - integrity sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg= + integrity sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g== dependencies: find-up "^2.0.0" load-json-file "^4.0.0" @@ -2483,16 +2000,6 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - -printj@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" - integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -2501,7 +2008,7 @@ process-nextick-args@~2.0.0: process@^0.11.1: 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" @@ -2524,38 +2031,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -pstree.remy@^1.1.7: +pstree.remy@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -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== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -pupa@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" - integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== - dependencies: - escape-goat "^2.0.0" - -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: - side-channel "^1.0.4" - qs@6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" @@ -2566,7 +2046,7 @@ qs@6.13.0: querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== range-parser@~1.2.1: version "1.2.1" @@ -2583,20 +2063,10 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.7, rc@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.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.0, readable-stream@^2.0.5: + 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" @@ -2607,25 +2077,25 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6: util-deprecate "~1.0.1" readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - 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" -readdir-glob@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4" - integrity sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA== +readdir-glob@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584" + integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA== dependencies: - minimatch "^3.0.4" + minimatch "^5.1.0" -readdirp@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== +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: picomatch "^2.2.1" @@ -2636,24 +2106,10 @@ rechoir@^0.8.0: dependencies: resolve "^1.20.0" -registry-auth-token@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da" - integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w== - dependencies: - rc "^1.2.8" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - 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-from-string@^2.0.2: version "2.0.2" @@ -2671,33 +2127,19 @@ resolve-from@^5.0.0: integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.16.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== -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" - rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -2705,68 +2147,40 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -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.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, 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-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== + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -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== - -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - -semver@^5.3.0, semver@^5.7.1: +semver@^5.7.1: 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.2.0, semver@^6.3.0: +semver@^6.0.0: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.3.8: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" +semver@^7.3.5, semver@^7.5.4: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== -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 "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" +semver@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== send@0.19.0: version "0.19.0" @@ -2792,54 +2206,67 @@ seq-queue@^0.0.5: resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" integrity sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q== -serve-static@1.16.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.0.tgz#2bf4ed49f8af311b519c46f272bf6ac3baf38a92" - integrity sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA== +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.18.0" + send "0.19.0" -set-blocking@^2.0.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" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -side-channel@^1.0.4, side-channel@^1.0.6: - 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== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: - call-bind "^1.0.7" es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" + object-inspect "^1.13.3" -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" -signal-exit@^3.0.7: +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.0.6: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@^3.0.0, 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== @@ -2853,6 +2280,13 @@ signale@1.4.0: figures "^2.0.0" pkg-conf "^2.1.0" +simple-update-notifier@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" + integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== + dependencies: + semver "~7.0.0" + smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" @@ -2868,11 +2302,11 @@ socks-proxy-agent@^6.0.0: socks "^2.6.2" socks@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + version "2.8.7" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.7.tgz#e2fb1d9a603add75050a2067db8c381a0b5669ea" + integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A== dependencies: - ip "^2.0.0" + ip-address "^10.0.1" smart-buffer "^4.2.0" split2@^4.1.0: @@ -2880,11 +2314,6 @@ split2@^4.1.0: resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== -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= - sqlite3@5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.6.tgz#1d4fbc90fe4fbd51e952e0a90fd8f6c2b9098e97" @@ -2913,29 +2342,12 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -streamsearch@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" - integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -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= - 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": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: +"string-width@^1.0.2 || 2 || 3 || 4", 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== @@ -2944,24 +2356,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^3.0.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== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -2976,35 +2370,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -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= - 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= - dependencies: - ansi-regex "^3.0.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-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-ansi@^6.0.1: +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== @@ -3014,12 +2380,7 @@ strip-ansi@^6.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 sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -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 sha1-PFMZQukIwml8DsNEhYwobHygpgo= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" @@ -3029,9 +2390,9 @@ supports-color@^5.3.0, supports-color@^5.5.0: has-flag "^3.0.0" supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + 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" @@ -3051,27 +2412,14 @@ tar-stream@^2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^4.4.2: - version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" - integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== - dependencies: - chownr "^1.1.4" - fs-minipass "^1.2.7" - minipass "^2.9.0" - minizlib "^1.3.3" - mkdirp "^0.5.5" - safe-buffer "^5.2.1" - yallist "^3.1.1" - tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: - version "6.1.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" - integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^4.0.0" + minipass "^5.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" @@ -3084,7 +2432,7 @@ tarn@^3.0.2: temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== temp-write@^4.0.0: version "4.0.0" @@ -3097,21 +2445,11 @@ temp-write@^4.0.0: temp-dir "^1.0.0" uuid "^3.3.2" -term-size@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" - integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== - tildify@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - 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" @@ -3125,22 +2463,15 @@ toidentifier@1.0.1: integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== - dependencies: - nopt "~1.0.10" + version "3.1.1" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" + integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -3149,19 +2480,10 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -undefsafe@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae" - integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A== - dependencies: - debug "^2.2.0" +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== unique-filename@^1.1.1: version "1.1.1" @@ -3177,55 +2499,15 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - 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= - -update-notifier@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" - integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew== - dependencies: - boxen "^4.2.0" - chalk "^3.0.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.3.1" - is-npm "^4.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.0.0" - pupa "^2.0.1" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - -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== - dependencies: - punycode "^2.1.0" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 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= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util@^0.10.3: version "0.10.4" @@ -3237,7 +2519,7 @@ util@^0.10.3: 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.3.2: version "3.4.0" @@ -3247,7 +2529,7 @@ uuid@^3.3.2: vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== webidl-conversions@^3.0.0: version "3.0.1" @@ -3263,9 +2545,9 @@ whatwg-url@^5.0.0: webidl-conversions "^3.0.0" which-module@^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= + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which@^2.0.2: version "2.0.2" @@ -3274,13 +2556,6 @@ which@^2.0.2: 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== - dependencies: - string-width "^1.0.2 || 2" - wide-align@^1.1.2, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" @@ -3288,13 +2563,6 @@ wide-align@^1.1.2, wide-align@^1.1.5: dependencies: string-width "^1.0.2 || 2 || 3 || 4" -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -3307,22 +2575,7 @@ wrap-ansi@^6.2.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== xtend@^4.0.0: version "4.0.2" @@ -3330,14 +2583,9 @@ xtend@^4.0.0: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== - -yallist@^3.0.0, yallist@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== yallist@^4.0.0: version "4.0.0" @@ -3370,10 +2618,10 @@ yargs@^15.4.1: yargs-parser "^18.1.2" zip-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79" - integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A== + version "4.1.1" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.1.tgz#1337fe974dbaffd2fa9a1ba09662a66932bd7135" + integrity sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ== dependencies: - archiver-utils "^2.1.0" - compress-commons "^4.1.0" + archiver-utils "^3.0.4" + compress-commons "^4.1.2" readable-stream "^3.6.0" diff --git a/docker/rootfs/etc/nginx/conf.d/dev.conf b/docker/rootfs/etc/nginx/conf.d/dev.conf index edbdec8a..67efc0f8 100644 --- a/docker/rootfs/etc/nginx/conf.d/dev.conf +++ b/docker/rootfs/etc/nginx/conf.d/dev.conf @@ -12,6 +12,7 @@ server { location /api/ { add_header X-Served-By $host; + proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Forwarded-Scheme $scheme; proxy_set_header X-Forwarded-Proto $scheme; @@ -23,7 +24,14 @@ server { } location / { - index index.html; - try_files $uri $uri.html $uri/ /index.html; + add_header X-Served-By $host; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header X-Forwarded-Scheme $scheme; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_pass http://127.0.0.1:5173; } } diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/frontend/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/frontend/run index 4f203555..c8be37f9 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/frontend/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/frontend/run @@ -15,7 +15,7 @@ if [ "$DEVELOPMENT" = 'true' ]; then log_info 'Starting frontend ...' s6-setuidgid "$PUID:$PGID" yarn install - exec s6-setuidgid "$PUID:$PGID" yarn watch + exec s6-setuidgid "$PUID:$PGID" yarn dev else exit 0 fi diff --git a/frontend/.babelrc b/frontend/.babelrc deleted file mode 100644 index 54071ecd..00000000 --- a/frontend/.babelrc +++ /dev/null @@ -1,17 +0,0 @@ -{ - "presets": [ - [ - "env", - { - "targets": { - "browsers": [ - "Chrome >= 65" - ] - }, - "debug": false, - "modules": false, - "useBuiltIns": "usage" - } - ] - ] -} \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore index c8f4b4f9..8b7e5021 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -1,4 +1,22 @@ -dist +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + node_modules -webpack_stats.html -yarn-error.log +dist +dist-ssr +*.local + +# Editor directories and files +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/biome.json b/frontend/biome.json new file mode 100644 index 00000000..1c0d3cef --- /dev/null +++ b/frontend/biome.json @@ -0,0 +1,91 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.2.2/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false, + "includes": [ + "**/*.ts", + "**/*.tsx", + "**/*.js", + "**/*.jsx", + "!**/dist/**/*" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "tab", + "indentWidth": 4, + "lineWidth": 120, + "formatWithErrors": true + }, + "assist": { + "actions": { + "source": { + "organizeImports": { + "level": "on", + "options": { + "groups": [ + ":BUN:", + ":NODE:", + [ + "npm:*", + "npm:*/**" + ], + ":PACKAGE_WITH_PROTOCOL:", + ":URL:", + ":PACKAGE:", + [ + "/src/*", + "/src/**" + ], + [ + "/**" + ], + [ + "#*", + "#*/**" + ], + ":PATH:" + ] + } + } + } + } + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "useUniqueElementIds": "off" + }, + "suspicious": { + "noExplicitAny": "off" + }, + "performance": { + "noDelete": "off" + }, + "nursery": "off", + "a11y": { + "useSemanticElements": "off", + "useValidAnchor": "off" + }, + "style": { + "noParameterAssign": "error", + "useAsConstAssertion": "error", + "useDefaultParameterLast": "error", + "useEnumInitializers": "error", + "useSelfClosingElements": "error", + "useSingleVarDeclarator": "error", + "noUnusedTemplateLiteral": "error", + "useNumberNamespace": "error", + "noInferrableTypes": "error", + "noUselessElse": "error" + } + } + } +} diff --git a/frontend/check-locales.cjs b/frontend/check-locales.cjs new file mode 100755 index 00000000..6a91dcf3 --- /dev/null +++ b/frontend/check-locales.cjs @@ -0,0 +1,172 @@ +#!/usr/bin/env node + +// This file does a few things to ensure that the Locales are present and valid: +// - Ensures that the name of the locale exists in the language list +// - Ensures that each locale contains the translations used in the application +// - Ensures that there are no unused translations in the locale files +// - Also checks the error messages returned by the backend + +const allLocales = [ + ["en", "en-US"], + ["de", "de-DE"], + ["fa", "fa-IR"], +]; + +const ignoreUnused = [ + /^capability\..*$/, + /^status\..*$/, + /^type\..*$/, +]; + +const { spawnSync } = require("child_process"); +const fs = require("fs"); + +const tmp = require("tmp"); + +// Parse backend errors +const BACKEND_ERRORS_FILE = "../backend/internal/errors/errors.go"; +const BACKEND_ERRORS = []; +/* +try { + const backendErrorsContent = fs.readFileSync(BACKEND_ERRORS_FILE, "utf8"); + const backendErrorsContentRes = [ + ...backendErrorsContent.matchAll(/(?:errors|eris)\.New\("([^"]+)"\)/g), + ]; + backendErrorsContentRes.map((item) => { + BACKEND_ERRORS.push("error." + item[1]); + return null; + }); +} catch (err) { + console.log("\x1b[31m%s\x1b[0m", err); + process.exit(1); +} +*/ + +// get all translations used in frontend code +const tmpobj = tmp.fileSync({ postfix: ".json" }); +spawnSync("yarn", ["locale-extract", "--out-file", tmpobj.name]); + +const allLocalesInProject = require(tmpobj.name); + +// get list og language names and locales +const langList = require("./src/locale/src/lang-list.json"); + +// store a list of all validation errors +const allErrors = []; +const allWarnings = []; +const allKeys = []; + +const checkLangList = (fullCode) => { + const key = "locale-" + fullCode; + if (typeof langList[key] === "undefined") { + allErrors.push( + "ERROR: `" + key + "` language does not exist in lang-list.json", + ); + } +}; + +const compareLocale = (locale) => { + const projectLocaleKeys = Object.keys(allLocalesInProject); + // Check that locale contains the items used in the codebase + projectLocaleKeys.map((key) => { + if (typeof locale.data[key] === "undefined") { + allErrors.push( + "ERROR: `" + locale[0] + "` does not contain item: `" + key + "`", + ); + } + return null; + }); + // Check that locale contains all error.* items + BACKEND_ERRORS.forEach((key) => { + if (typeof locale.data[key] === "undefined") { + allErrors.push( + "ERROR: `" + locale[0] + "` does not contain item: `" + key + "`", + ); + } + return null; + }); + + // Check that locale does not contain items not used in the codebase + const localeKeys = Object.keys(locale.data); + localeKeys.map((key) => { + let ignored = false; + ignoreUnused.map((regex) => { + if (key.match(regex)) { + ignored = true; + } + return null; + }); + + if (!ignored && typeof allLocalesInProject[key] === "undefined") { + // ensure this key doesn't exist in the backend errors either + if (!BACKEND_ERRORS.includes(key)) { + allErrors.push( + "ERROR: `" + locale[0] + "` contains unused item: `" + key + "`", + ); + } + } + + // Add this key to allKeys + if (allKeys.indexOf(key) === -1) { + allKeys.push(key); + } + return null; + }); +}; + +// Checks for any keys missing from this locale, that +// have been defined in any other locales +const checkForMissing = (locale) => { + allKeys.forEach((key) => { + if (typeof locale.data[key] === "undefined") { + let ignored = false; + ignoreMissing.map((regex) => { + if (key.match(regex)) { + ignored = true; + } + return null; + }); + + if (!ignored) { + allWarnings.push( + "WARN: `" + locale[0] + "` does not contain item: `" + key + "`", + ); + } + } + return null; + }); +}; + +// Local all locale data +allLocales.map((locale, idx) => { + checkLangList(locale[1]); + allLocales[idx].data = require("./src/locale/src/" + locale[0] + ".json"); + return null; +}); + +// Verify all locale data +allLocales.map((locale) => { + compareLocale(locale); + checkForMissing(locale); + return null; +}); + +if (allErrors.length) { + allErrors.map((err) => { + console.log("\x1b[31m%s\x1b[0m", err); + return null; + }); +} +if (allWarnings.length) { + allWarnings.map((err) => { + console.log("\x1b[33m%s\x1b[0m", err); + return null; + }); +} + +if (allErrors.length) { + process.exit(1); +} + +console.log("\x1b[32m%s\x1b[0m", "Locale check passed"); +process.exit(0); diff --git a/frontend/fonts/feather b/frontend/fonts/feather deleted file mode 120000 index 440203ba..00000000 --- a/frontend/fonts/feather +++ /dev/null @@ -1 +0,0 @@ -../node_modules/tabler-ui/dist/assets/fonts/feather \ No newline at end of file diff --git a/frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700.woff b/frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700.woff deleted file mode 100644 index 96d8768ea9a10f004e2215a1a674287c8c7abfe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31740 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

TGGXM_YS43}>!PSEdK%(5yqV&zUQ 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 HGB5xD2KFTU diff --git a/frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700.woff2 b/frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700.woff2 deleted file mode 100644 index e97a22181cd141caea514e1b34fb802a571bec96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25348 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 Ll(-2zWncgRp9=Sv diff --git a/frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700italic.woff2 b/frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700italic.woff2 deleted file mode 100644 index 7c901cd8450cecf93767560eecf4a3dc6b0cefb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22240 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 diff --git a/frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-italic.woff b/frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-italic.woff deleted file mode 100644 index 99652481a07f237145d733e06e6b2c0b926dfafc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28744 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

ANqy%6DHrEcb1TxcHk~`QNwB|KlrI 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 MZt`;|nekN(0PyNa+W-In diff --git a/frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-regular.woff b/frontend/fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-regular.woff deleted file mode 100644 index 92c3260efb30d1389be052c361995a84c137c371..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32128 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 -<%- include partials/header.ejs %> - -

- -
- - -<%- include partials/footer.ejs %> diff --git a/frontend/html/login.ejs b/frontend/html/login.ejs deleted file mode 100644 index bc4b9a27..00000000 --- a/frontend/html/login.ejs +++ /dev/null @@ -1,9 +0,0 @@ -<% var title = 'Login – Nginx Proxy Manager' %> -<%- include partials/header.ejs %> - -
- -
- - -<%- include partials/footer.ejs %> diff --git a/frontend/html/partials/footer.ejs b/frontend/html/partials/footer.ejs deleted file mode 100644 index 7fb2bd61..00000000 --- a/frontend/html/partials/footer.ejs +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/frontend/html/partials/header.ejs b/frontend/html/partials/header.ejs deleted file mode 100644 index cabb9df2..00000000 --- a/frontend/html/partials/header.ejs +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - <%- title %> - - - - - - - - - - - - - - diff --git a/frontend/images b/frontend/images deleted file mode 120000 index 37c31854..00000000 --- a/frontend/images +++ /dev/null @@ -1 +0,0 @@ -./node_modules/tabler-ui/dist/assets/images \ No newline at end of file diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 00000000..80818044 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,44 @@ + + + + + + Nginx Proxy Manager + + + + + + + + + + + + + +
+ + + + diff --git a/frontend/js/app/api.js b/frontend/js/app/api.js deleted file mode 100644 index 6e33a6dc..00000000 --- a/frontend/js/app/api.js +++ /dev/null @@ -1,757 +0,0 @@ -const $ = require('jquery'); -const _ = require('underscore'); -const Tokens = require('./tokens'); - -/** - * @param {String} message - * @param {*} debug - * @param {Number} code - * @constructor - */ -const ApiError = function (message, debug, code) { - let temp = Error.call(this, message); - temp.name = this.name = 'ApiError'; - this.stack = temp.stack; - this.message = temp.message; - this.debug = debug; - this.code = code; -}; - -ApiError.prototype = Object.create(Error.prototype, { - constructor: { - value: ApiError, - writable: true, - configurable: true - } -}); - -/** - * - * @param {String} verb - * @param {String} path - * @param {Object} [data] - * @param {Object} [options] - * @returns {Promise} - */ -function fetch(verb, path, data, options) { - options = options || {}; - - return new Promise(function (resolve, reject) { - let api_url = '/api/'; - let url = api_url + path; - let token = Tokens.getTopToken(); - - if ((typeof options.contentType === 'undefined' || options.contentType.match(/json/im)) && typeof data === 'object') { - data = JSON.stringify(data); - } - - $.ajax({ - url: url, - data: typeof data === 'object' ? JSON.stringify(data) : data, - type: verb, - dataType: 'json', - contentType: options.contentType || 'application/json; charset=UTF-8', - processData: options.processData || true, - crossDomain: true, - timeout: options.timeout ? options.timeout : 180000, - xhrFields: { - withCredentials: true - }, - - beforeSend: function (xhr) { - xhr.setRequestHeader('Authorization', 'Bearer ' + (token ? token.t : null)); - }, - - success: function (data, textStatus, response) { - let total = response.getResponseHeader('X-Dataset-Total'); - if (total !== null) { - resolve({ - data: data, - pagination: { - total: parseInt(total, 10), - offset: parseInt(response.getResponseHeader('X-Dataset-Offset'), 10), - limit: parseInt(response.getResponseHeader('X-Dataset-Limit'), 10) - } - }); - } else { - resolve(response); - } - }, - - error: function (xhr, status, error_thrown) { - let code = 400; - - if (typeof xhr.responseJSON !== 'undefined' && typeof xhr.responseJSON.error !== 'undefined' && typeof xhr.responseJSON.error.message !== 'undefined') { - error_thrown = xhr.responseJSON.error.message; - code = xhr.responseJSON.error.code || 500; - } - - reject(new ApiError(error_thrown, xhr.responseText, code)); - } - }); - }); -} - -/** - * - * @param {Array} expand - * @returns {String} - */ -function makeExpansionString(expand) { - let items = []; - _.forEach(expand, function (exp) { - items.push(encodeURIComponent(exp)); - }); - - return items.join(','); -} - -/** - * @param {String} path - * @param {Array} [expand] - * @param {String} [query] - * @returns {Promise} - */ -function getAllObjects(path, expand, query) { - let params = []; - - if (typeof expand === 'object' && expand !== null && expand.length) { - params.push('expand=' + makeExpansionString(expand)); - } - - if (typeof query === 'string') { - params.push('query=' + query); - } - - return fetch('get', path + (params.length ? '?' + params.join('&') : '')); -} - -function FileUpload(path, fd) { - return new Promise((resolve, reject) => { - let xhr = new XMLHttpRequest(); - let token = Tokens.getTopToken(); - - xhr.open('POST', '/api/' + path); - xhr.overrideMimeType('text/plain'); - xhr.setRequestHeader('Authorization', 'Bearer ' + (token ? token.t : null)); - xhr.send(fd); - - xhr.onreadystatechange = function () { - if (this.readyState === XMLHttpRequest.DONE) { - if (xhr.status !== 200 && xhr.status !== 201) { - try { - reject(new Error('Upload failed: ' + JSON.parse(xhr.responseText).error.message)); - } catch (err) { - reject(new Error('Upload failed: ' + xhr.status)); - } - } else { - resolve(xhr.responseText); - } - } - }; - }); -} - -//ref : https://codepen.io/chrisdpratt/pen/RKxJNo -function DownloadFile(verb, path, filename) { - return new Promise(function (resolve, reject) { - let api_url = '/api/'; - let url = api_url + path; - let token = Tokens.getTopToken(); - - $.ajax({ - url: url, - type: verb, - crossDomain: true, - xhrFields: { - withCredentials: true, - responseType: 'blob' - }, - - beforeSend: function (xhr) { - xhr.setRequestHeader('Authorization', 'Bearer ' + (token ? token.t : null)); - }, - - success: function (data) { - var a = document.createElement('a'); - var url = window.URL.createObjectURL(data); - a.href = url; - a.download = filename; - document.body.append(a); - a.click(); - a.remove(); - window.URL.revokeObjectURL(url); - }, - - error: function (xhr, status, error_thrown) { - let code = 400; - - if (typeof xhr.responseJSON !== 'undefined' && typeof xhr.responseJSON.error !== 'undefined' && typeof xhr.responseJSON.error.message !== 'undefined') { - error_thrown = xhr.responseJSON.error.message; - code = xhr.responseJSON.error.code || 500; - } - - reject(new ApiError(error_thrown, xhr.responseText, code)); - } - }); - }); -} - -module.exports = { - status: function () { - return fetch('get', ''); - }, - - Tokens: { - - /** - * @param {String} identity - * @param {String} secret - * @param {Boolean} [wipe] Will wipe the stack before adding to it again if login was successful - * @returns {Promise} - */ - login: function (identity, secret, wipe) { - return fetch('post', 'tokens', {identity: identity, secret: secret}) - .then(response => { - if (response.token) { - if (wipe) { - Tokens.clearTokens(); - } - - // Set storage token - Tokens.addToken(response.token); - return response.token; - } else { - Tokens.clearTokens(); - throw(new Error('No token returned')); - } - }); - }, - - /** - * @returns {Promise} - */ - refresh: function () { - return fetch('get', 'tokens') - .then(response => { - if (response.token) { - Tokens.setCurrentToken(response.token); - return response.token; - } else { - Tokens.clearTokens(); - throw(new Error('No token returned')); - } - }); - } - }, - - Users: { - - /** - * @param {Number|String} user_id - * @param {Array} [expand] - * @returns {Promise} - */ - getById: function (user_id, expand) { - return fetch('get', 'users/' + user_id + (typeof expand === 'object' && expand.length ? '?expand=' + makeExpansionString(expand) : '')); - }, - - /** - * @param {Array} [expand] - * @param {String} [query] - * @returns {Promise} - */ - getAll: function (expand, query) { - return getAllObjects('users', expand, query); - }, - - /** - * @param {Object} data - * @returns {Promise} - */ - create: function (data) { - return fetch('post', 'users', data); - }, - - /** - * @param {Object} data - * @param {Number} data.id - * @returns {Promise} - */ - update: function (data) { - let id = data.id; - delete data.id; - return fetch('put', 'users/' + id, data); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - delete: function (id) { - return fetch('delete', 'users/' + id); - }, - - /** - * - * @param {Number} id - * @param {Object} auth - * @returns {Promise} - */ - setPassword: function (id, auth) { - return fetch('put', 'users/' + id + '/auth', auth); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - loginAs: function (id) { - return fetch('post', 'users/' + id + '/login'); - }, - - /** - * - * @param {Number} id - * @param {Object} perms - * @returns {Promise} - */ - setPermissions: function (id, perms) { - return fetch('put', 'users/' + id + '/permissions', perms); - } - }, - - Nginx: { - - ProxyHosts: { - /** - * @param {Array} [expand] - * @param {String} [query] - * @returns {Promise} - */ - getAll: function (expand, query) { - return getAllObjects('nginx/proxy-hosts', expand, query); - }, - - /** - * @param {Object} data - */ - create: function (data) { - return fetch('post', 'nginx/proxy-hosts', data); - }, - - /** - * @param {Object} data - * @param {Number} data.id - * @returns {Promise} - */ - update: function (data) { - let id = data.id; - delete data.id; - return fetch('put', 'nginx/proxy-hosts/' + id, data); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - delete: function (id) { - return fetch('delete', 'nginx/proxy-hosts/' + id); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - get: function (id) { - return fetch('get', 'nginx/proxy-hosts/' + id); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - enable: function (id) { - return fetch('post', 'nginx/proxy-hosts/' + id + '/enable'); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - disable: function (id) { - return fetch('post', 'nginx/proxy-hosts/' + id + '/disable'); - } - }, - - RedirectionHosts: { - /** - * @param {Array} [expand] - * @param {String} [query] - * @returns {Promise} - */ - getAll: function (expand, query) { - return getAllObjects('nginx/redirection-hosts', expand, query); - }, - - /** - * @param {Object} data - */ - create: function (data) { - return fetch('post', 'nginx/redirection-hosts', data); - }, - - /** - * @param {Object} data - * @param {Number} data.id - * @returns {Promise} - */ - update: function (data) { - let id = data.id; - delete data.id; - return fetch('put', 'nginx/redirection-hosts/' + id, data); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - delete: function (id) { - return fetch('delete', 'nginx/redirection-hosts/' + id); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - get: function (id) { - return fetch('get', 'nginx/redirection-hosts/' + id); - }, - - /** - * @param {Number} id - * @param {FormData} form_data - * @params {Promise} - */ - setCerts: function (id, form_data) { - return FileUpload('nginx/redirection-hosts/' + id + '/certificates', form_data); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - enable: function (id) { - return fetch('post', 'nginx/redirection-hosts/' + id + '/enable'); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - disable: function (id) { - return fetch('post', 'nginx/redirection-hosts/' + id + '/disable'); - } - }, - - Streams: { - /** - * @param {Array} [expand] - * @param {String} [query] - * @returns {Promise} - */ - getAll: function (expand, query) { - return getAllObjects('nginx/streams', expand, query); - }, - - /** - * @param {Object} data - */ - create: function (data) { - return fetch('post', 'nginx/streams', data); - }, - - /** - * @param {Object} data - * @param {Number} data.id - * @returns {Promise} - */ - update: function (data) { - let id = data.id; - delete data.id; - return fetch('put', 'nginx/streams/' + id, data); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - delete: function (id) { - return fetch('delete', 'nginx/streams/' + id); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - get: function (id) { - return fetch('get', 'nginx/streams/' + id); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - enable: function (id) { - return fetch('post', 'nginx/streams/' + id + '/enable'); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - disable: function (id) { - return fetch('post', 'nginx/streams/' + id + '/disable'); - } - }, - - DeadHosts: { - /** - * @param {Array} [expand] - * @param {String} [query] - * @returns {Promise} - */ - getAll: function (expand, query) { - return getAllObjects('nginx/dead-hosts', expand, query); - }, - - /** - * @param {Object} data - */ - create: function (data) { - return fetch('post', 'nginx/dead-hosts', data); - }, - - /** - * @param {Object} data - * @param {Number} data.id - * @returns {Promise} - */ - update: function (data) { - let id = data.id; - delete data.id; - return fetch('put', 'nginx/dead-hosts/' + id, data); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - delete: function (id) { - return fetch('delete', 'nginx/dead-hosts/' + id); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - get: function (id) { - return fetch('get', 'nginx/dead-hosts/' + id); - }, - - /** - * @param {Number} id - * @param {FormData} form_data - * @params {Promise} - */ - setCerts: function (id, form_data) { - return FileUpload('nginx/dead-hosts/' + id + '/certificates', form_data); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - enable: function (id) { - return fetch('post', 'nginx/dead-hosts/' + id + '/enable'); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - disable: function (id) { - return fetch('post', 'nginx/dead-hosts/' + id + '/disable'); - } - }, - - AccessLists: { - /** - * @param {Array} [expand] - * @param {String} [query] - * @returns {Promise} - */ - getAll: function (expand, query) { - return getAllObjects('nginx/access-lists', expand, query); - }, - - /** - * @param {Object} data - */ - create: function (data) { - return fetch('post', 'nginx/access-lists', data); - }, - - /** - * @param {Object} data - * @param {Number} data.id - * @returns {Promise} - */ - update: function (data) { - let id = data.id; - delete data.id; - return fetch('put', 'nginx/access-lists/' + id, data); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - delete: function (id) { - return fetch('delete', 'nginx/access-lists/' + id); - } - }, - - Certificates: { - /** - * @param {Array} [expand] - * @param {String} [query] - * @returns {Promise} - */ - getAll: function (expand, query) { - return getAllObjects('nginx/certificates', expand, query); - }, - - /** - * @param {Object} data - */ - create: function (data) { - - const timeout = 180000 + (data && data.meta && data.meta.propagation_seconds ? Number(data.meta.propagation_seconds) * 1000 : 0); - return fetch('post', 'nginx/certificates', data, {timeout}); - }, - - /** - * @param {Object} data - * @param {Number} data.id - * @returns {Promise} - */ - update: function (data) { - let id = data.id; - delete data.id; - return fetch('put', 'nginx/certificates/' + id, data); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - delete: function (id) { - return fetch('delete', 'nginx/certificates/' + id); - }, - - /** - * @param {Number} id - * @param {FormData} form_data - * @params {Promise} - */ - upload: function (id, form_data) { - return FileUpload('nginx/certificates/' + id + '/upload', form_data); - }, - - /** - * @param {FormData} form_data - * @params {Promise} - */ - validate: function (form_data) { - return FileUpload('nginx/certificates/validate', form_data); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - renew: function (id, timeout = 180000) { - return fetch('post', 'nginx/certificates/' + id + '/renew', undefined, {timeout}); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - testHttpChallenge: function (domains) { - return fetch('get', 'nginx/certificates/test-http?' + new URLSearchParams({ - domains: JSON.stringify(domains), - })); - }, - - /** - * @param {Number} id - * @returns {Promise} - */ - download: function (id) { - return DownloadFile('get', "nginx/certificates/" + id + "/download", "certificate.zip") - } - } - }, - - AuditLog: { - /** - * @param {Array} [expand] - * @param {String} [query] - * @returns {Promise} - */ - getAll: function (expand, query) { - return getAllObjects('audit-log', expand, query); - } - }, - - Reports: { - - /** - * @returns {Promise} - */ - getHostStats: function () { - return fetch('get', 'reports/hosts'); - } - }, - - Settings: { - - /** - * @param {String} setting_id - * @returns {Promise} - */ - getById: function (setting_id) { - return fetch('get', 'settings/' + setting_id); - }, - - /** - * @returns {Promise} - */ - getAll: function () { - return getAllObjects('settings'); - }, - - /** - * @param {Object} data - * @param {Number} data.id - * @returns {Promise} - */ - update: function (data) { - let id = data.id; - delete data.id; - return fetch('put', 'settings/' + id, data); - } - } -}; diff --git a/frontend/js/app/audit-log/list/item.ejs b/frontend/js/app/audit-log/list/item.ejs deleted file mode 100644 index 84743c8d..00000000 --- a/frontend/js/app/audit-log/list/item.ejs +++ /dev/null @@ -1,80 +0,0 @@ - -
- -
- - -
- <% if (user.is_deleted) { - %> - <%- user.name %> - <% - } else { - %> - <%- user.name %> - <% - } - %> -
- - -
- <% - var items = []; - switch (object_type) { - case 'proxy-host': - %> <% - items = meta.domain_names; - break; - case 'redirection-host': - %> <% - items = meta.domain_names; - break; - case 'stream': - %> <% - items.push(meta.incoming_port); - break; - case 'dead-host': - %> <% - items = meta.domain_names; - break; - case 'access-list': - %> <% - items.push(meta.name); - break; - case 'user': - %> <% - items.push(meta.name); - break; - case 'certificate': - %> <% - if (meta.provider === 'letsencrypt') { - items = meta.domain_names; - } else { - items.push(meta.nice_name); - } - break; - } - %> <%- i18n('audit-log', action, {name: i18n('audit-log', object_type)}) %> - — - <% - if (items && items.length) { - items.map(function(item) { - %> - <%- item %> - <% - }); - } else { - %> - #<%- object_id %> - <% - } - %> -
-
- <%- formatDbDate(created_on, 'Do MMMM YYYY, h:mm a') %> -
- - -
<%- i18n('audit-log', 'view-meta') %> - diff --git a/frontend/js/app/audit-log/list/item.js b/frontend/js/app/audit-log/list/item.js deleted file mode 100644 index 862ffc22..00000000 --- a/frontend/js/app/audit-log/list/item.js +++ /dev/null @@ -1,32 +0,0 @@ -const Mn = require('backbone.marionette'); -const Controller = require('../../controller'); -const template = require('./item.ejs'); - -module.exports = Mn.View.extend({ - template: template, - tagName: 'tr', - - ui: { - meta: 'a.meta' - }, - - events: { - 'click @ui.meta': function (e) { - e.preventDefault(); - Controller.showAuditMeta(this.model); - } - }, - - templateContext: { - more: function() { - switch (this.object_type) { - case 'redirection-host': - case 'stream': - case 'proxy-host': - return this.meta.domain_names.join(', '); - } - - return '#' + (this.object_id || '?'); - } - } -}); diff --git a/frontend/js/app/audit-log/list/main.ejs b/frontend/js/app/audit-log/list/main.ejs deleted file mode 100644 index ec3cf2a2..00000000 --- a/frontend/js/app/audit-log/list/main.ejs +++ /dev/null @@ -1,9 +0,0 @@ - -   - User - Event -   - - - - diff --git a/frontend/js/app/audit-log/list/main.js b/frontend/js/app/audit-log/list/main.js deleted file mode 100644 index 9d3e26fb..00000000 --- a/frontend/js/app/audit-log/list/main.js +++ /dev/null @@ -1,27 +0,0 @@ -const Mn = require('backbone.marionette'); -const ItemView = require('./item'); -const template = require('./main.ejs'); - -const TableBody = Mn.CollectionView.extend({ - tagName: 'tbody', - childView: ItemView -}); - -module.exports = Mn.View.extend({ - tagName: 'table', - className: 'table table-hover table-outline table-vcenter card-table', - template: template, - - regions: { - body: { - el: 'tbody', - replaceElement: true - } - }, - - onRender: function () { - this.showChildView('body', new TableBody({ - collection: this.collection - })); - } -}); diff --git a/frontend/js/app/audit-log/main.ejs b/frontend/js/app/audit-log/main.ejs deleted file mode 100644 index 8d182b59..00000000 --- a/frontend/js/app/audit-log/main.ejs +++ /dev/null @@ -1,25 +0,0 @@ -
-
-
-

<%- i18n('audit-log', 'title') %>

-
- -
-
-
-
-
-
- -
-
- -
-
diff --git a/frontend/js/app/audit-log/main.js b/frontend/js/app/audit-log/main.js deleted file mode 100644 index 0d03c5ca..00000000 --- a/frontend/js/app/audit-log/main.js +++ /dev/null @@ -1,82 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../main'); -const AuditLogModel = require('../../models/audit-log'); -const ListView = require('./list/main'); -const template = require('./main.ejs'); -const ErrorView = require('../error/main'); -const EmptyView = require('../empty/main'); - -module.exports = Mn.View.extend({ - id: 'audit-log', - template: template, - - ui: { - list_region: '.list-region', - dimmer: '.dimmer', - search: '.search-form', - query: 'input[name="source-query"]' - }, - - fetch: App.Api.AuditLog.getAll, - - showData: function(response) { - this.showChildView('list_region', new ListView({ - collection: new AuditLogModel.Collection(response) - })); - }, - - showError: function(err) { - this.showChildView('list_region', new ErrorView({ - code: err.code, - message: err.message, - retry: function () { - App.Controller.showAuditLog(); - } - })); - - console.error(err); - }, - - showEmpty: function() { - this.showChildView('list_region', new EmptyView({ - title: App.i18n('audit-log', 'empty'), - subtitle: App.i18n('audit-log', 'empty-subtitle') - })); - }, - - regions: { - list_region: '@ui.list_region' - }, - - events: { - 'submit @ui.search': function (e) { - e.preventDefault(); - let query = this.ui.query.val(); - - this.fetch(['user'], query) - .then(response => this.showData(response)) - .catch(err => { - this.showError(err); - }); - } - }, - - onRender: function () { - let view = this; - - view.fetch(['user']) - .then(response => { - if (!view.isDestroyed() && response && response.length) { - view.showData(response); - } else { - view.showEmpty(); - } - }) - .catch(err => { - view.showError(err); - }) - .then(() => { - view.ui.dimmer.removeClass('active'); - }); - } -}); diff --git a/frontend/js/app/audit-log/meta.ejs b/frontend/js/app/audit-log/meta.ejs deleted file mode 100644 index 98a2d973..00000000 --- a/frontend/js/app/audit-log/meta.ejs +++ /dev/null @@ -1,27 +0,0 @@ - diff --git a/frontend/js/app/audit-log/meta.js b/frontend/js/app/audit-log/meta.js deleted file mode 100644 index 815cdfac..00000000 --- a/frontend/js/app/audit-log/meta.js +++ /dev/null @@ -1,7 +0,0 @@ -const Mn = require('backbone.marionette'); -const template = require('./meta.ejs'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog wide' -}); diff --git a/frontend/js/app/cache.js b/frontend/js/app/cache.js deleted file mode 100644 index 6d1fbc4f..00000000 --- a/frontend/js/app/cache.js +++ /dev/null @@ -1,10 +0,0 @@ -const UserModel = require('../models/user'); - -let cache = { - User: new UserModel.Model(), - locale: 'en', - version: null -}; - -module.exports = cache; - diff --git a/frontend/js/app/controller.js b/frontend/js/app/controller.js deleted file mode 100644 index ebddd780..00000000 --- a/frontend/js/app/controller.js +++ /dev/null @@ -1,441 +0,0 @@ -const Backbone = require('backbone'); -const Cache = require('./cache'); -const Tokens = require('./tokens'); - -module.exports = { - - /** - * @param {String} route - * @param {Object} [options] - * @returns {Boolean} - */ - navigate: function (route, options) { - options = options || {}; - Backbone.history.navigate(route.toString(), options); - return true; - }, - - /** - * Login - */ - showLogin: function () { - window.location = '/login'; - }, - - /** - * Users - */ - showUsers: function () { - const controller = this; - if (Cache.User.isAdmin()) { - require(['./main', './users/main'], (App, View) => { - controller.navigate('/users'); - App.UI.showAppContent(new View()); - }); - } else { - this.showDashboard(); - } - }, - - /** - * User Form - * - * @param [model] - */ - showUserForm: function (model) { - if (Cache.User.isAdmin()) { - require(['./main', './user/form'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * User Permissions Form - * - * @param model - */ - showUserPermissions: function (model) { - if (Cache.User.isAdmin()) { - require(['./main', './user/permissions'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * User Password Form - * - * @param model - */ - showUserPasswordForm: function (model) { - if (Cache.User.isAdmin() || model.get('id') === Cache.User.get('id')) { - require(['./main', './user/password'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * User Delete Confirm - * - * @param model - */ - showUserDeleteConfirm: function (model) { - if (Cache.User.isAdmin() && model.get('id') !== Cache.User.get('id')) { - require(['./main', './user/delete'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Dashboard - */ - showDashboard: function () { - const controller = this; - require(['./main', './dashboard/main'], (App, View) => { - controller.navigate('/'); - App.UI.showAppContent(new View()); - }); - }, - - /** - * Nginx Proxy Hosts - */ - showNginxProxy: function () { - if (Cache.User.isAdmin() || Cache.User.canView('proxy_hosts')) { - const controller = this; - - require(['./main', './nginx/proxy/main'], (App, View) => { - controller.navigate('/nginx/proxy'); - App.UI.showAppContent(new View()); - }); - } - }, - - /** - * Nginx Proxy Host Form - * - * @param [model] - */ - showNginxProxyForm: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('proxy_hosts')) { - require(['./main', './nginx/proxy/form'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Proxy Host Delete Confirm - * - * @param model - */ - showNginxProxyDeleteConfirm: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('proxy_hosts')) { - require(['./main', './nginx/proxy/delete'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Nginx Redirection Hosts - */ - showNginxRedirection: function () { - if (Cache.User.isAdmin() || Cache.User.canView('redirection_hosts')) { - const controller = this; - require(['./main', './nginx/redirection/main'], (App, View) => { - controller.navigate('/nginx/redirection'); - App.UI.showAppContent(new View()); - }); - } - }, - - /** - * Nginx Redirection Host Form - * - * @param [model] - */ - showNginxRedirectionForm: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('redirection_hosts')) { - require(['./main', './nginx/redirection/form'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Proxy Redirection Delete Confirm - * - * @param model - */ - showNginxRedirectionDeleteConfirm: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('redirection_hosts')) { - require(['./main', './nginx/redirection/delete'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Nginx Stream Hosts - */ - showNginxStream: function () { - if (Cache.User.isAdmin() || Cache.User.canView('streams')) { - const controller = this; - require(['./main', './nginx/stream/main'], (App, View) => { - controller.navigate('/nginx/stream'); - App.UI.showAppContent(new View()); - }); - } - }, - - /** - * Stream Form - * - * @param [model] - */ - showNginxStreamForm: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('streams')) { - require(['./main', './nginx/stream/form'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Stream Delete Confirm - * - * @param model - */ - showNginxStreamDeleteConfirm: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('streams')) { - require(['./main', './nginx/stream/delete'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Nginx Dead Hosts - */ - showNginxDead: function () { - if (Cache.User.isAdmin() || Cache.User.canView('dead_hosts')) { - const controller = this; - require(['./main', './nginx/dead/main'], (App, View) => { - controller.navigate('/nginx/404'); - App.UI.showAppContent(new View()); - }); - } - }, - - /** - * Dead Host Form - * - * @param [model] - */ - showNginxDeadForm: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('dead_hosts')) { - require(['./main', './nginx/dead/form'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Dead Host Delete Confirm - * - * @param model - */ - showNginxDeadDeleteConfirm: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('dead_hosts')) { - require(['./main', './nginx/dead/delete'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Help Dialog - * - * @param {String} title - * @param {String} content - */ - showHelp: function (title, content) { - require(['./main', './help/main'], function (App, View) { - App.UI.showModalDialog(new View({title: title, content: content})); - }); - }, - - /** - * Nginx Access - */ - showNginxAccess: function () { - if (Cache.User.isAdmin() || Cache.User.canView('access_lists')) { - const controller = this; - require(['./main', './nginx/access/main'], (App, View) => { - controller.navigate('/nginx/access'); - App.UI.showAppContent(new View()); - }); - } - }, - - /** - * Nginx Access List Form - * - * @param [model] - */ - showNginxAccessListForm: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('access_lists')) { - require(['./main', './nginx/access/form'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Access List Delete Confirm - * - * @param model - */ - showNginxAccessListDeleteConfirm: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('access_lists')) { - require(['./main', './nginx/access/delete'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Nginx Certificates - */ - showNginxCertificates: function () { - if (Cache.User.isAdmin() || Cache.User.canView('certificates')) { - const controller = this; - require(['./main', './nginx/certificates/main'], (App, View) => { - controller.navigate('/nginx/certificates'); - App.UI.showAppContent(new View()); - }); - } - }, - - /** - * Nginx Certificate Form - * - * @param [model] - */ - showNginxCertificateForm: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('certificates')) { - require(['./main', './nginx/certificates/form'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Certificate Renew - * - * @param model - */ - showNginxCertificateRenew: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('certificates')) { - require(['./main', './nginx/certificates/renew'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Certificate Delete Confirm - * - * @param model - */ - showNginxCertificateDeleteConfirm: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('certificates')) { - require(['./main', './nginx/certificates/delete'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Certificate Test Reachability - * - * @param model - */ - showNginxCertificateTestReachability: function (model) { - if (Cache.User.isAdmin() || Cache.User.canManage('certificates')) { - require(['./main', './nginx/certificates/test'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Audit Log - */ - showAuditLog: function () { - const controller = this; - if (Cache.User.isAdmin()) { - require(['./main', './audit-log/main'], (App, View) => { - controller.navigate('/audit-log'); - App.UI.showAppContent(new View()); - }); - } else { - this.showDashboard(); - } - }, - - /** - * Audit Log Metadata - * - * @param model - */ - showAuditMeta: function (model) { - if (Cache.User.isAdmin()) { - require(['./main', './audit-log/meta'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - }, - - /** - * Settings - */ - showSettings: function () { - const controller = this; - if (Cache.User.isAdmin()) { - require(['./main', './settings/main'], (App, View) => { - controller.navigate('/settings'); - App.UI.showAppContent(new View()); - }); - } else { - this.showDashboard(); - } - }, - - /** - * Settings Item Form - * - * @param model - */ - showSettingForm: function (model) { - if (Cache.User.isAdmin()) { - if (model.get('id') === 'default-site') { - require(['./main', './settings/default-site/main'], function (App, View) { - App.UI.showModalDialog(new View({model: model})); - }); - } - } - }, - - /** - * Logout - */ - logout: function () { - Tokens.dropTopToken(); - this.showLogin(); - } -}; diff --git a/frontend/js/app/dashboard/main.ejs b/frontend/js/app/dashboard/main.ejs deleted file mode 100644 index c00aa6d0..00000000 --- a/frontend/js/app/dashboard/main.ejs +++ /dev/null @@ -1,67 +0,0 @@ - - -<% if (columns) { %> -
- <% if (canShow('proxy_hosts')) { %> - - <% } %> - - <% if (canShow('redirection_hosts')) { %> - - <% } %> - - <% if (canShow('streams')) { %> - - <% } %> - - <% if (canShow('dead_hosts')) { %> - - <% } %> -
-<% } %> diff --git a/frontend/js/app/dashboard/main.js b/frontend/js/app/dashboard/main.js deleted file mode 100644 index ba4a99a6..00000000 --- a/frontend/js/app/dashboard/main.js +++ /dev/null @@ -1,90 +0,0 @@ -const Mn = require('backbone.marionette'); -const Cache = require('../cache'); -const Controller = require('../controller'); -const Api = require('../api'); -const Helpers = require('../../lib/helpers'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - template: template, - id: 'dashboard', - columns: 0, - - stats: {}, - - ui: { - links: 'a' - }, - - events: { - 'click @ui.links': function (e) { - e.preventDefault(); - Controller.navigate($(e.currentTarget).attr('href'), true); - } - }, - - templateContext: function () { - const view = this; - - return { - getUserName: function () { - return Cache.User.get('nickname') || Cache.User.get('name'); - }, - - getHostStat: function (type) { - if (view.stats && typeof view.stats.hosts !== 'undefined' && typeof view.stats.hosts[type] !== 'undefined') { - return Helpers.niceNumber(view.stats.hosts[type]); - } - - return '-'; - }, - - canShow: function (perm) { - return Cache.User.isAdmin() || Cache.User.canView(perm); - }, - - columns: view.columns - }; - }, - - onRender: function () { - const view = this; - if (typeof view.stats.hosts === 'undefined') { - Api.Reports.getHostStats() - .then(response => { - if (!view.isDestroyed()) { - view.stats.hosts = response; - view.render(); - } - }) - .catch(err => { - console.log(err); - }); - } - }, - - /** - * @param {Object} [model] - */ - preRender: function (model) { - this.columns = 0; - - // calculate the available columns based on permissions for the objects - // and store as a variable - const perms = ['proxy_hosts', 'redirection_hosts', 'streams', 'dead_hosts']; - - perms.map(perm => { - this.columns += Cache.User.isAdmin() || Cache.User.canView(perm) ? 1 : 0; - }); - - // Prevent double rendering on initial calls - if (typeof model !== 'undefined') { - this.render(); - } - }, - - initialize: function () { - this.preRender(); - this.listenTo(Cache.User, 'change', this.preRender); - } -}); diff --git a/frontend/js/app/empty/main.ejs b/frontend/js/app/empty/main.ejs deleted file mode 100644 index 11633dfc..00000000 --- a/frontend/js/app/empty/main.ejs +++ /dev/null @@ -1,11 +0,0 @@ -<% if (title) { %> -

<%- title %>

-<% } - -if (subtitle) { %> -

<%- subtitle %>

-<% } - -if (link) { %> - <%- link %> -<% } %> diff --git a/frontend/js/app/empty/main.js b/frontend/js/app/empty/main.js deleted file mode 100644 index 74998d65..00000000 --- a/frontend/js/app/empty/main.js +++ /dev/null @@ -1,33 +0,0 @@ -const Mn = require('backbone.marionette'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - className: 'text-center m-7', - template: template, - - options: { - btn_color: 'teal' - }, - - ui: { - action: 'a' - }, - - events: { - 'click @ui.action': function (e) { - e.preventDefault(); - this.getOption('action')(); - } - }, - - templateContext: function () { - return { - title: this.getOption('title'), - subtitle: this.getOption('subtitle'), - link: this.getOption('link'), - action: typeof this.getOption('action') === 'function', - btn_color: this.getOption('btn_color') - }; - } - -}); diff --git a/frontend/js/app/error/main.ejs b/frontend/js/app/error/main.ejs deleted file mode 100644 index f7fd709b..00000000 --- a/frontend/js/app/error/main.ejs +++ /dev/null @@ -1,7 +0,0 @@ - -<%= code ? '' + code + ' — ' : '' %> -<%- message %> - -<% if (retry) { %> -

<%- i18n('str', 'try-again') %> -<% } %> diff --git a/frontend/js/app/error/main.js b/frontend/js/app/error/main.js deleted file mode 100644 index 6fa85fc8..00000000 --- a/frontend/js/app/error/main.js +++ /dev/null @@ -1,27 +0,0 @@ -const Mn = require('backbone.marionette'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - template: template, - className: 'alert alert-icon alert-warning m-5', - - ui: { - retry: 'a.retry' - }, - - events: { - 'click @ui.retry': function (e) { - e.preventDefault(); - this.getOption('retry')(); - } - }, - - templateContext: function () { - return { - message: this.getOption('message'), - code: this.getOption('code'), - retry: typeof this.getOption('retry') === 'function' - }; - } - -}); diff --git a/frontend/js/app/help/main.ejs b/frontend/js/app/help/main.ejs deleted file mode 100644 index 6fb79e66..00000000 --- a/frontend/js/app/help/main.ejs +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/frontend/js/app/help/main.js b/frontend/js/app/help/main.js deleted file mode 100644 index b0f54374..00000000 --- a/frontend/js/app/help/main.js +++ /dev/null @@ -1,16 +0,0 @@ -const Mn = require('backbone.marionette'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog wide', - - templateContext: function () { - let content = this.getOption('content').split("\n"); - - return { - title: this.getOption('title'), - content: '

' + content.join('

') + '

' - }; - } -}); diff --git a/frontend/js/app/i18n.js b/frontend/js/app/i18n.js deleted file mode 100644 index c63cdc07..00000000 --- a/frontend/js/app/i18n.js +++ /dev/null @@ -1,23 +0,0 @@ -const Cache = ('./cache'); -const messages = require('../i18n/messages.json'); - -/** - * @param {String} namespace - * @param {String} key - * @param {Object} [data] - */ -module.exports = function (namespace, key, data) { - let locale = Cache.locale; - // check that the locale exists - if (typeof messages[locale] === 'undefined') { - locale = 'en'; - } - - if (typeof messages[locale][namespace] !== 'undefined' && typeof messages[locale][namespace][key] !== 'undefined') { - return messages[locale][namespace][key](data); - } else if (locale !== 'en' && typeof messages['en'][namespace] !== 'undefined' && typeof messages['en'][namespace][key] !== 'undefined') { - return messages['en'][namespace][key](data); - } - - return '(MISSING: ' + namespace + '/' + key + ')'; -}; diff --git a/frontend/js/app/main.js b/frontend/js/app/main.js deleted file mode 100644 index e85b4f62..00000000 --- a/frontend/js/app/main.js +++ /dev/null @@ -1,155 +0,0 @@ -const _ = require('underscore'); -const Backbone = require('backbone'); -const Mn = require('../lib/marionette'); -const Cache = require('./cache'); -const Controller = require('./controller'); -const Router = require('./router'); -const Api = require('./api'); -const Tokens = require('./tokens'); -const UI = require('./ui/main'); -const i18n = require('./i18n'); - -const App = Mn.Application.extend({ - - Cache: Cache, - Api: Api, - UI: null, - i18n: i18n, - Controller: Controller, - - region: { - el: '#app', - replaceElement: true - }, - - onStart: function (app, options) { - console.log(i18n('main', 'welcome')); - - // Check if token is coming through - if (this.getParam('token')) { - Tokens.addToken(this.getParam('token')); - } - - // Check if we are still logged in by refreshing the token - Api.status() - .then(result => { - Cache.version = [result.version.major, result.version.minor, result.version.revision].join('.'); - }) - .then(Api.Tokens.refresh) - .then(this.bootstrap) - .then(() => { - console.info(i18n('main', 'logged-in', Cache.User.attributes)); - this.bootstrapTimer(); - this.refreshTokenTimer(); - - this.UI = new UI(); - this.UI.on('render', () => { - new Router(options); - Backbone.history.start({pushState: true}); - - // Ask the admin use to change their details - if (Cache.User.get('email') === 'admin@example.com') { - Controller.showUserForm(Cache.User); - } - }); - - this.getRegion().show(this.UI); - }) - .catch(err => { - console.warn('Not logged in:', err.message); - Controller.showLogin(); - }); - }, - - History: { - replace: function (data) { - window.history.replaceState(_.extend(window.history.state || {}, data), document.title); - }, - - get: function (attr) { - return window.history.state ? window.history.state[attr] : undefined; - } - }, - - getParam: function (name) { - name = name.replace(/[\[\]]/g, '\\$&'); - let url = window.location.href; - let regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'); - let results = regex.exec(url); - - if (!results) { - return null; - } - - if (!results[2]) { - return ''; - } - - return decodeURIComponent(results[2].replace(/\+/g, ' ')); - }, - - /** - * Get user and other base info to start prime the cache and the application - * - * @returns {Promise} - */ - bootstrap: function () { - return Api.Users.getById('me', ['permissions']) - .then(response => { - Cache.User.set(response); - Tokens.setCurrentName(response.nickname || response.name); - }); - }, - - /** - * Bootstraps the user from time to time - */ - bootstrapTimer: function () { - setTimeout(() => { - Api.status() - .then(result => { - let version = [result.version.major, result.version.minor, result.version.revision].join('.'); - if (version !== Cache.version) { - document.location.reload(); - } - }) - .then(this.bootstrap) - .then(() => { - this.bootstrapTimer(); - }) - .catch(err => { - if (err.message !== 'timeout' && err.code && err.code !== 400) { - console.log(err); - console.error(err.message); - console.info('Not logged in?'); - Controller.showLogin(); - } else { - this.bootstrapTimer(); - } - }); - }, 30 * 1000); // 30 seconds - }, - - refreshTokenTimer: function () { - setTimeout(() => { - return Api.Tokens.refresh() - .then(this.bootstrap) - .then(() => { - this.refreshTokenTimer(); - }) - .catch(err => { - if (err.message !== 'timeout' && err.code && err.code !== 400) { - console.log(err); - console.error(err.message); - console.info('Not logged in?'); - Controller.showLogin(); - } else { - this.refreshTokenTimer(); - } - }); - }, 10 * 60 * 1000); - } -}); - -const app = new App(); -module.exports = app; diff --git a/frontend/js/app/nginx/access/delete.ejs b/frontend/js/app/nginx/access/delete.ejs deleted file mode 100644 index 3833549a..00000000 --- a/frontend/js/app/nginx/access/delete.ejs +++ /dev/null @@ -1,23 +0,0 @@ - diff --git a/frontend/js/app/nginx/access/delete.js b/frontend/js/app/nginx/access/delete.js deleted file mode 100644 index 4af91ab1..00000000 --- a/frontend/js/app/nginx/access/delete.js +++ /dev/null @@ -1,32 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const template = require('./delete.ejs'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save' - }, - - events: { - - 'click @ui.save': function (e) { - e.preventDefault(); - - App.Api.Nginx.AccessLists.delete(this.model.get('id')) - .then(() => { - App.Controller.showNginxAccess(); - App.UI.closeModal(); - }) - .catch(err => { - alert(err.message); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - }); - } - } -}); diff --git a/frontend/js/app/nginx/access/form.ejs b/frontend/js/app/nginx/access/form.ejs deleted file mode 100644 index 79220b14..00000000 --- a/frontend/js/app/nginx/access/form.ejs +++ /dev/null @@ -1,108 +0,0 @@ - diff --git a/frontend/js/app/nginx/access/form.js b/frontend/js/app/nginx/access/form.js deleted file mode 100644 index bb075548..00000000 --- a/frontend/js/app/nginx/access/form.js +++ /dev/null @@ -1,153 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const AccessListModel = require('../../../models/access-list'); -const template = require('./form.ejs'); -const ItemView = require('./form/item'); -const ClientView = require('./form/client'); - -require('jquery-serializejson'); - -const ItemsView = Mn.CollectionView.extend({ - childView: ItemView -}); - -const ClientsView = Mn.CollectionView.extend({ - childView: ClientView -}); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - items_region: '.items', - clients_region: '.clients', - form: 'form', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save', - access_add: 'button.access_add', - auth_add: 'button.auth_add' - }, - - regions: { - items_region: '@ui.items_region', - clients_region: '@ui.clients_region' - }, - - events: { - 'click @ui.save': function (e) { - e.preventDefault(); - - if (!this.ui.form[0].checkValidity()) { - $('').hide().appendTo(this.ui.form).click().remove(); - return; - } - - let view = this; - let form_data = this.ui.form.serializeJSON(); - let items_data = []; - let clients_data = []; - - form_data.username.map(function (val, idx) { - if (val.trim().length) { - items_data.push({ - username: val.trim(), - password: form_data.password[idx] - }); - } - }); - - form_data.address.map(function (val, idx) { - if (val.trim().length) { - clients_data.push({ - address: val.trim(), - directive: form_data.directive[idx] - }) - } - }); - - if (!items_data.length && !clients_data.length) { - alert('You must specify at least 1 Authorization or Access rule'); - return; - } - - let data = { - name: form_data.name, - satisfy_any: !!form_data.satisfy_any, - pass_auth: !!form_data.pass_auth, - items: items_data, - clients: clients_data - }; - - console.log(data); - - let method = App.Api.Nginx.AccessLists.create; - let is_new = true; - - if (this.model.get('id')) { - // edit - is_new = false; - method = App.Api.Nginx.AccessLists.update; - data.id = this.model.get('id'); - } - - this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); - method(data) - .then(result => { - view.model.set(result); - - App.UI.closeModal(function () { - if (is_new) { - App.Controller.showNginxAccess(); - } - }); - }) - .catch(err => { - alert(err.message); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - }); - }, - 'click @ui.access_add': function (e) { - e.preventDefault(); - - let clients = this.model.get('clients'); - clients.push({}); - this.showChildView('clients_region', new ClientsView({ - collection: new Backbone.Collection(clients) - })); - }, - 'click @ui.auth_add': function (e) { - e.preventDefault(); - - let items = this.model.get('items'); - items.push({}); - this.showChildView('items_region', new ItemsView({ - collection: new Backbone.Collection(items) - })); - } - }, - - onRender: function () { - let items = this.model.get('items'); - let clients = this.model.get('clients'); - - // Ensure at least one field is shown initally - if (!items.length) items.push({}); - if (!clients.length) clients.push({}); - - this.showChildView('items_region', new ItemsView({ - collection: new Backbone.Collection(items) - })); - - this.showChildView('clients_region', new ClientsView({ - collection: new Backbone.Collection(clients) - })); - }, - - initialize: function (options) { - if (typeof options.model === 'undefined' || !options.model) { - this.model = new AccessListModel.Model(); - } - } -}); diff --git a/frontend/js/app/nginx/access/form/client.ejs b/frontend/js/app/nginx/access/form/client.ejs deleted file mode 100644 index 6b767b83..00000000 --- a/frontend/js/app/nginx/access/form/client.ejs +++ /dev/null @@ -1,13 +0,0 @@ -
-
- -
-
-
-
- -
-
diff --git a/frontend/js/app/nginx/access/form/client.js b/frontend/js/app/nginx/access/form/client.js deleted file mode 100644 index b4c00e2e..00000000 --- a/frontend/js/app/nginx/access/form/client.js +++ /dev/null @@ -1,7 +0,0 @@ -const Mn = require('backbone.marionette'); -const template = require('./client.ejs'); - -module.exports = Mn.View.extend({ - template: template, - className: 'row' -}); diff --git a/frontend/js/app/nginx/access/form/item.ejs b/frontend/js/app/nginx/access/form/item.ejs deleted file mode 100644 index c2435ecb..00000000 --- a/frontend/js/app/nginx/access/form/item.ejs +++ /dev/null @@ -1,10 +0,0 @@ -
-
- -
-
-
-
- -
-
diff --git a/frontend/js/app/nginx/access/form/item.js b/frontend/js/app/nginx/access/form/item.js deleted file mode 100644 index f15238dc..00000000 --- a/frontend/js/app/nginx/access/form/item.js +++ /dev/null @@ -1,7 +0,0 @@ -const Mn = require('backbone.marionette'); -const template = require('./item.ejs'); - -module.exports = Mn.View.extend({ - template: template, - className: 'row' -}); diff --git a/frontend/js/app/nginx/access/list/item.ejs b/frontend/js/app/nginx/access/list/item.ejs deleted file mode 100644 index fe043c98..00000000 --- a/frontend/js/app/nginx/access/list/item.ejs +++ /dev/null @@ -1,42 +0,0 @@ - -
- -
- - -
- <%- name %> -
-
- <%- i18n('str', 'created-on', {date: formatDbDate(created_on, 'Do MMMM YYYY')}) %> -
- - - <%- i18n('access-lists', 'item-count', {count: items.length || 0}) %> - - - <%- i18n('access-lists', 'client-count', {count: clients.length || 0}) %> - - - <% if (satisfy_any) { %> - <%- i18n('str', 'any') %> - <%} else { %> - <%- i18n('str', 'all') %> - <% } %> - - - <%- i18n('access-lists', 'proxy-host-count', {count: proxy_host_count}) %> - -<% if (canManage) { %> - - - -<% } %> diff --git a/frontend/js/app/nginx/access/list/item.js b/frontend/js/app/nginx/access/list/item.js deleted file mode 100644 index 4f68aead..00000000 --- a/frontend/js/app/nginx/access/list/item.js +++ /dev/null @@ -1,33 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../../main'); -const template = require('./item.ejs'); - -module.exports = Mn.View.extend({ - template: template, - tagName: 'tr', - - ui: { - edit: 'a.edit', - delete: 'a.delete' - }, - - events: { - 'click @ui.edit': function (e) { - e.preventDefault(); - App.Controller.showNginxAccessListForm(this.model); - }, - - 'click @ui.delete': function (e) { - e.preventDefault(); - App.Controller.showNginxAccessListDeleteConfirm(this.model); - } - }, - - templateContext: { - canManage: App.Cache.User.canManage('access_lists') - }, - - initialize: function () { - this.listenTo(this.model, 'change', this.render); - } -}); diff --git a/frontend/js/app/nginx/access/list/main.ejs b/frontend/js/app/nginx/access/list/main.ejs deleted file mode 100644 index 7988e0c2..00000000 --- a/frontend/js/app/nginx/access/list/main.ejs +++ /dev/null @@ -1,14 +0,0 @@ - -   - <%- i18n('str', 'name') %> - <%- i18n('access-lists', 'authorization') %> - <%- i18n('access-lists', 'access') %> - <%- i18n('access-lists', 'satisfy') %> - <%- i18n('proxy-hosts', 'title') %> - <% if (canManage) { %> -   - <% } %> - - - - diff --git a/frontend/js/app/nginx/access/list/main.js b/frontend/js/app/nginx/access/list/main.js deleted file mode 100644 index 577a77ef..00000000 --- a/frontend/js/app/nginx/access/list/main.js +++ /dev/null @@ -1,32 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../../main'); -const ItemView = require('./item'); -const template = require('./main.ejs'); - -const TableBody = Mn.CollectionView.extend({ - tagName: 'tbody', - childView: ItemView -}); - -module.exports = Mn.View.extend({ - tagName: 'table', - className: 'table table-hover table-outline table-vcenter card-table', - template: template, - - regions: { - body: { - el: 'tbody', - replaceElement: true - } - }, - - templateContext: { - canManage: App.Cache.User.canManage('access_lists') - }, - - onRender: function () { - this.showChildView('body', new TableBody({ - collection: this.collection - })); - } -}); diff --git a/frontend/js/app/nginx/access/main.ejs b/frontend/js/app/nginx/access/main.ejs deleted file mode 100644 index 97585936..00000000 --- a/frontend/js/app/nginx/access/main.ejs +++ /dev/null @@ -1,28 +0,0 @@ -
-
-
-

<%- i18n('access-lists', 'title') %>

-
- - - <% if (showAddButton) { %> - <%- i18n('access-lists', 'add') %> - <% } %> -
-
-
-
-
-
- -
-
-
-
diff --git a/frontend/js/app/nginx/access/main.js b/frontend/js/app/nginx/access/main.js deleted file mode 100644 index 513f5865..00000000 --- a/frontend/js/app/nginx/access/main.js +++ /dev/null @@ -1,108 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const AccessListModel = require('../../../models/access-list'); -const ListView = require('./list/main'); -const ErrorView = require('../../error/main'); -const EmptyView = require('../../empty/main'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - id: 'nginx-access', - template: template, - - ui: { - list_region: '.list-region', - add: '.add-item', - help: '.help', - dimmer: '.dimmer', - search: '.search-form', - query: 'input[name="source-query"]' - }, - - fetch: App.Api.Nginx.AccessLists.getAll, - - showData: function(response) { - this.showChildView('list_region', new ListView({ - collection: new AccessListModel.Collection(response) - })); - }, - - showError: function(err) { - this.showChildView('list_region', new ErrorView({ - code: err.code, - message: err.message, - retry: function () { - App.Controller.showNginxAccess(); - } - })); - - console.error(err); - }, - - showEmpty: function() { - let manage = App.Cache.User.canManage('access_lists'); - - this.showChildView('list_region', new EmptyView({ - title: App.i18n('access-lists', 'empty'), - subtitle: App.i18n('all-hosts', 'empty-subtitle', {manage: manage}), - link: manage ? App.i18n('access-lists', 'add') : null, - btn_color: 'teal', - permission: 'access_lists', - action: function () { - App.Controller.showNginxAccessListForm(); - } - })); - }, - - regions: { - list_region: '@ui.list_region' - }, - - events: { - 'click @ui.add': function (e) { - e.preventDefault(); - App.Controller.showNginxAccessListForm(); - }, - - 'click @ui.help': function (e) { - e.preventDefault(); - App.Controller.showHelp(App.i18n('access-lists', 'help-title'), App.i18n('access-lists', 'help-content')); - }, - - 'submit @ui.search': function (e) { - e.preventDefault(); - let query = this.ui.query.val(); - - this.fetch(['owner', 'items', 'clients'], query) - .then(response => this.showData(response)) - .catch(err => { - this.showError(err); - }); - } - }, - - templateContext: { - showAddButton: App.Cache.User.canManage('access_lists') - }, - - onRender: function () { - let view = this; - - view.fetch(['owner', 'items', 'clients']) - .then(response => { - if (!view.isDestroyed()) { - if (response && response.length) { - view.showData(response); - } else { - view.showEmpty(); - } - } - }) - .catch(err => { - view.showError(err); - }) - .then(() => { - view.ui.dimmer.removeClass('active'); - }); - } -}); diff --git a/frontend/js/app/nginx/certificates-list-item.ejs b/frontend/js/app/nginx/certificates-list-item.ejs deleted file mode 100644 index aa4b53ad..00000000 --- a/frontend/js/app/nginx/certificates-list-item.ejs +++ /dev/null @@ -1,18 +0,0 @@ -
- <% if (id === 'new') { %> -
- <%- i18n('all-hosts', 'new-cert') %> -
- <%- i18n('all-hosts', 'with-le') %> - <% } else if (id > 0) { %> -
- <%- provider === 'other' ? nice_name : domain_names.join(', ') %> -
- <%- i18n('ssl', provider) %> – Expires: <%- formatDbDate(expires_on, 'Do MMMM YYYY, h:mm a') %> - <% } else { %> -
- <%- i18n('all-hosts', 'none') %> -
- <%- i18n('all-hosts', 'no-ssl') %> - <% } %> -
diff --git a/frontend/js/app/nginx/certificates/delete.ejs b/frontend/js/app/nginx/certificates/delete.ejs deleted file mode 100644 index b4e06866..00000000 --- a/frontend/js/app/nginx/certificates/delete.ejs +++ /dev/null @@ -1,19 +0,0 @@ - diff --git a/frontend/js/app/nginx/certificates/delete.js b/frontend/js/app/nginx/certificates/delete.js deleted file mode 100644 index 89a2e5e8..00000000 --- a/frontend/js/app/nginx/certificates/delete.js +++ /dev/null @@ -1,34 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const template = require('./delete.ejs'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save' - }, - - events: { - 'click @ui.save': function (e) { - e.preventDefault(); - this.ui.save.addClass('btn-loading'); - this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); - - App.Api.Nginx.Certificates.delete(this.model.get('id')) - .then(() => { - App.Controller.showNginxCertificates(); - App.UI.closeModal(); - }) - .catch(err => { - alert(err.message); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - this.ui.save.removeClass('btn-loading'); - }); - } - } -}); diff --git a/frontend/js/app/nginx/certificates/form.ejs b/frontend/js/app/nginx/certificates/form.ejs deleted file mode 100644 index 6adb4b01..00000000 --- a/frontend/js/app/nginx/certificates/form.ejs +++ /dev/null @@ -1,185 +0,0 @@ - diff --git a/frontend/js/app/nginx/certificates/form.js b/frontend/js/app/nginx/certificates/form.js deleted file mode 100644 index cab09155..00000000 --- a/frontend/js/app/nginx/certificates/form.js +++ /dev/null @@ -1,294 +0,0 @@ -const _ = require('underscore'); -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const CertificateModel = require('../../../models/certificate'); -const template = require('./form.ejs'); -const i18n = require('../../i18n'); -const dns_providers = sortProvidersAlphabetically(require('../../../../../global/certbot-dns-plugins')); - -require('jquery-serializejson'); -require('selectize'); - -function sortProvidersAlphabetically(obj) { - return Object.entries(obj) - .sort((a,b) => a[1].name.toLowerCase() > b[1].name.toLowerCase()) - .reduce((result, entry) => { - result[entry[0]] = entry[1]; - return result; - }, {}); -} - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - max_file_size: 102400, - - ui: { - form: 'form', - loader_content: '.loader-content', - non_loader_content: '.non-loader-content', - le_error_info: '#le-error-info', - domain_names: 'input[name="domain_names"]', - test_domains_container: '.test-domains-container', - test_domains_button: '.test-domains', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save', - other_certificate: '#other_certificate', - other_certificate_label: '#other_certificate_label', - other_certificate_key: '#other_certificate_key', - dns_challenge_switch: 'input[name="meta[dns_challenge]"]', - dns_challenge_content: '.dns-challenge', - dns_provider: 'select[name="meta[dns_provider]"]', - credentials_file_content: '.credentials-file-content', - dns_provider_credentials: 'textarea[name="meta[dns_provider_credentials]"]', - propagation_seconds: 'input[name="meta[propagation_seconds]"]', - other_certificate_key_label: '#other_certificate_key_label', - other_intermediate_certificate: '#other_intermediate_certificate', - other_intermediate_certificate_label: '#other_intermediate_certificate_label' - }, - - events: { - 'change @ui.dns_challenge_switch': function () { - const checked = this.ui.dns_challenge_switch.prop('checked'); - if (checked) { - this.ui.dns_provider.prop('required', 'required'); - const selected_provider = this.ui.dns_provider[0].options[this.ui.dns_provider[0].selectedIndex].value; - if(selected_provider != '' && dns_providers[selected_provider].credentials !== false){ - this.ui.dns_provider_credentials.prop('required', 'required'); - } - this.ui.dns_challenge_content.show(); - this.ui.test_domains_container.hide(); - } else { - this.ui.dns_provider.prop('required', false); - this.ui.dns_provider_credentials.prop('required', false); - this.ui.dns_challenge_content.hide(); - this.ui.test_domains_container.show(); - } - }, - - 'change @ui.dns_provider': function () { - const selected_provider = this.ui.dns_provider[0].options[this.ui.dns_provider[0].selectedIndex].value; - if (selected_provider != '' && dns_providers[selected_provider].credentials !== false) { - this.ui.dns_provider_credentials.prop('required', 'required'); - this.ui.dns_provider_credentials[0].value = dns_providers[selected_provider].credentials; - this.ui.credentials_file_content.show(); - } else { - this.ui.dns_provider_credentials.prop('required', false); - this.ui.credentials_file_content.hide(); - } - }, - - 'click @ui.save': function (e) { - e.preventDefault(); - this.ui.le_error_info.hide(); - - if (!this.ui.form[0].checkValidity()) { - $('').hide().appendTo(this.ui.form).click().remove(); - $(this).removeClass('btn-loading'); - return; - } - - let data = this.ui.form.serializeJSON(); - data.provider = this.model.get('provider'); - let ssl_files = []; - - if (data.provider === 'letsencrypt') { - if (typeof data.meta === 'undefined') data.meta = {}; - - let domain_err = false; - if (!data.meta.dns_challenge) { - data.domain_names.split(',').map(function (name) { - if (name.match(/\*/im)) { - domain_err = true; - } - }); - } - - if (domain_err) { - alert(i18n('ssl', 'no-wildcard-without-dns')); - return; - } - - // Manipulate - data.meta.letsencrypt_agree = data.meta.letsencrypt_agree == 1; - data.meta.dns_challenge = data.meta.dns_challenge == 1; - - if(!data.meta.dns_challenge){ - data.meta.dns_provider = undefined; - data.meta.dns_provider_credentials = undefined; - data.meta.propagation_seconds = undefined; - } else { - if(data.meta.propagation_seconds === '') data.meta.propagation_seconds = undefined; - } - - if (typeof data.domain_names === 'string' && data.domain_names) { - data.domain_names = data.domain_names.split(','); - } - } else if (data.provider === 'other' && !this.model.hasSslFiles()) { - // check files are attached - if (!this.ui.other_certificate[0].files.length || !this.ui.other_certificate[0].files[0].size) { - alert('Certificate file is not attached'); - return; - } else { - if (this.ui.other_certificate[0].files[0].size > this.max_file_size) { - alert('Certificate file is too large (> 100kb)'); - return; - } - ssl_files.push({name: 'certificate', file: this.ui.other_certificate[0].files[0]}); - } - - if (!this.ui.other_certificate_key[0].files.length || !this.ui.other_certificate_key[0].files[0].size) { - alert('Certificate key file is not attached'); - return; - } else { - if (this.ui.other_certificate_key[0].files[0].size > this.max_file_size) { - alert('Certificate key file is too large (> 100kb)'); - return; - } - ssl_files.push({name: 'certificate_key', file: this.ui.other_certificate_key[0].files[0]}); - } - - if (this.ui.other_intermediate_certificate[0].files.length && this.ui.other_intermediate_certificate[0].files[0].size) { - if (this.ui.other_intermediate_certificate[0].files[0].size > this.max_file_size) { - alert('Intermediate Certificate file is too large (> 100kb)'); - return; - } - ssl_files.push({name: 'intermediate_certificate', file: this.ui.other_intermediate_certificate[0].files[0]}); - } - } - - this.ui.loader_content.show(); - this.ui.non_loader_content.hide(); - - // compile file data - let form_data = new FormData(); - if (data.provider === 'other' && ssl_files.length) { - ssl_files.map(function (file) { - form_data.append(file.name, file.file); - }); - } - - new Promise(resolve => { - if (data.provider === 'other') { - resolve(App.Api.Nginx.Certificates.validate(form_data)); - } else { - resolve(); - } - }) - .then(() => { - return App.Api.Nginx.Certificates.create(data); - }) - .then(result => { - this.model.set(result); - - // Now upload the certs if we need to - if (data.provider === 'other') { - return App.Api.Nginx.Certificates.upload(this.model.get('id'), form_data) - .then(result => { - this.model.set('meta', _.assign({}, this.model.get('meta'), result)); - }); - } - }) - .then(() => { - App.UI.closeModal(function () { - App.Controller.showNginxCertificates(); - }); - }) - .catch(err => { - let more_info = ''; - if (err.code === 500 && err.debug) { - try{ - more_info = JSON.parse(err.debug).debug.stack.join("\n"); - } catch(e) {} - } - this.ui.le_error_info[0].innerHTML = `${err.message}${more_info !== '' ? `
${more_info}
`:''}`; - this.ui.le_error_info.show(); - this.ui.le_error_info[0].scrollIntoView(); - this.ui.loader_content.hide(); - this.ui.non_loader_content.show(); - }); - }, - 'click @ui.test_domains_button': function (e) { - e.preventDefault(); - const domainNames = this.ui.domain_names[0].value.split(','); - if (domainNames && domainNames.length > 0) { - this.model.set('domain_names', domainNames); - this.model.set('back_to_add', true); - App.Controller.showNginxCertificateTestReachability(this.model); - } - }, - 'change @ui.domain_names': function(e){ - const domainNames = e.target.value.split(','); - if (domainNames && domainNames.length > 0) { - this.ui.test_domains_button.prop('disabled', false); - } else { - this.ui.test_domains_button.prop('disabled', true); - } - }, - 'change @ui.other_certificate_key': function(e){ - this.setFileName("other_certificate_key_label", e) - }, - 'change @ui.other_certificate': function(e){ - this.setFileName("other_certificate_label", e) - }, - 'change @ui.other_intermediate_certificate': function(e){ - this.setFileName("other_intermediate_certificate_label", e) - } - }, - setFileName(ui, e){ - this.getUI(ui).text(e.target.files[0].name) - }, - templateContext: { - getLetsencryptEmail: function () { - return typeof this.meta.letsencrypt_email !== 'undefined' ? this.meta.letsencrypt_email : App.Cache.User.get('email'); - }, - getLetsencryptAgree: function () { - return typeof this.meta.letsencrypt_agree !== 'undefined' ? this.meta.letsencrypt_agree : false; - }, - getUseDnsChallenge: function () { - return typeof this.meta.dns_challenge !== 'undefined' ? this.meta.dns_challenge : false; - }, - getDnsProvider: function () { - return typeof this.meta.dns_provider !== 'undefined' && this.meta.dns_provider != '' ? this.meta.dns_provider : null; - }, - getDnsProviderCredentials: function () { - return typeof this.meta.dns_provider_credentials !== 'undefined' ? this.meta.dns_provider_credentials : ''; - }, - getPropagationSeconds: function () { - return typeof this.meta.propagation_seconds !== 'undefined' ? this.meta.propagation_seconds : ''; - }, - dns_plugins: dns_providers, - }, - - onRender: function () { - this.ui.domain_names.selectize({ - delimiter: ',', - persist: false, - maxOptions: 100, - create: function (input) { - return { - value: input, - text: input - }; - }, - createFilter: /^(?:\*\.)?(?:[^.*]+\.?)+[^.]$/ - }); - this.ui.dns_challenge_content.hide(); - this.ui.credentials_file_content.hide(); - this.ui.loader_content.hide(); - this.ui.le_error_info.hide(); - if (this.ui.domain_names[0]) { - const domainNames = this.ui.domain_names[0].value.split(','); - if (!domainNames || domainNames.length === 0 || (domainNames.length === 1 && domainNames[0] === "")) { - this.ui.test_domains_button.prop('disabled', true); - } - } - }, - - initialize: function (options) { - if (typeof options.model === 'undefined' || !options.model) { - this.model = new CertificateModel.Model({provider: 'letsencrypt'}); - } - } -}); diff --git a/frontend/js/app/nginx/certificates/list/item.ejs b/frontend/js/app/nginx/certificates/list/item.ejs deleted file mode 100644 index 179a8195..00000000 --- a/frontend/js/app/nginx/certificates/list/item.ejs +++ /dev/null @@ -1,68 +0,0 @@ - -
- -
- - -
- <% - if (provider === 'letsencrypt') { - domain_names.map(function(host) { - if (host.indexOf('*') === -1) { - %> - <%- host %> - <% - } else { - %> - <%- host %> - <% - } - }); - } else { - %><%- nice_name %><% - } - %> -
-
- <%- i18n('str', 'created-on', {date: formatDbDate(created_on, 'Do MMMM YYYY')}) %> -
- - - <%- i18n('ssl', provider) %><% if (meta.dns_provider) { %> - <%- dns_providers[meta.dns_provider].name %><% } %> - - - <%- formatDbDate(expires_on, 'Do MMMM YYYY, h:mm a') %> - - - <% if (active_domain_names().length > 0) { %> - <%- i18n('certificates', 'in-use') %> - <% } else { %> - <%- i18n('certificates', 'inactive') %> - <% } %> - -<% if (canManage) { %> - - - -<% } %> \ No newline at end of file diff --git a/frontend/js/app/nginx/certificates/list/item.js b/frontend/js/app/nginx/certificates/list/item.js deleted file mode 100644 index b9a927ad..00000000 --- a/frontend/js/app/nginx/certificates/list/item.js +++ /dev/null @@ -1,68 +0,0 @@ -const Mn = require('backbone.marionette'); -const moment = require('moment'); -const App = require('../../../main'); -const template = require('./item.ejs'); -const dns_providers = require('../../../../../../global/certbot-dns-plugins'); - -module.exports = Mn.View.extend({ - template: template, - tagName: 'tr', - - ui: { - host_link: '.host-link', - renew: 'a.renew', - delete: 'a.delete', - download: 'a.download', - test: 'a.test' - }, - - events: { - 'click @ui.renew': function (e) { - e.preventDefault(); - App.Controller.showNginxCertificateRenew(this.model); - }, - - 'click @ui.delete': function (e) { - e.preventDefault(); - App.Controller.showNginxCertificateDeleteConfirm(this.model); - }, - - 'click @ui.host_link': function (e) { - e.preventDefault(); - let win = window.open($(e.currentTarget).attr('rel'), '_blank'); - win.focus(); - }, - - 'click @ui.download': function (e) { - e.preventDefault(); - App.Api.Nginx.Certificates.download(this.model.get('id')); - }, - - 'click @ui.test': function (e) { - e.preventDefault(); - App.Controller.showNginxCertificateTestReachability(this.model); - }, - }, - - templateContext: function () { - return { - canManage: App.Cache.User.canManage('certificates'), - isExpired: function () { - return moment(this.expires_on).isBefore(moment()); - }, - dns_providers: dns_providers, - active_domain_names: function () { - const { proxy_hosts = [], redirect_hosts = [], dead_hosts = [] } = this; - return [...proxy_hosts, ...redirect_hosts, ...dead_hosts].reduce((acc, host) => { - acc.push(...(host.domain_names || [])); - return acc; - }, []); - } - }; - }, - - - initialize: function () { - this.listenTo(this.model, 'change', this.render); - } -}); diff --git a/frontend/js/app/nginx/certificates/list/main.ejs b/frontend/js/app/nginx/certificates/list/main.ejs deleted file mode 100644 index 329b5843..00000000 --- a/frontend/js/app/nginx/certificates/list/main.ejs +++ /dev/null @@ -1,13 +0,0 @@ - -   - <%- i18n('str', 'name') %> - <%- i18n('all-hosts', 'cert-provider') %> - <%- i18n('str', 'expires') %> - <%- i18n('str', 'status') %> - <% if (canManage) { %> -   - <% } %> - - - - diff --git a/frontend/js/app/nginx/certificates/list/main.js b/frontend/js/app/nginx/certificates/list/main.js deleted file mode 100644 index d96b43e8..00000000 --- a/frontend/js/app/nginx/certificates/list/main.js +++ /dev/null @@ -1,32 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../../main'); -const ItemView = require('./item'); -const template = require('./main.ejs'); - -const TableBody = Mn.CollectionView.extend({ - tagName: 'tbody', - childView: ItemView -}); - -module.exports = Mn.View.extend({ - tagName: 'table', - className: 'table table-hover table-outline table-vcenter card-table', - template: template, - - regions: { - body: { - el: 'tbody', - replaceElement: true - } - }, - - templateContext: { - canManage: App.Cache.User.canManage('certificates') - }, - - onRender: function () { - this.showChildView('body', new TableBody({ - collection: this.collection - })); - } -}); diff --git a/frontend/js/app/nginx/certificates/main.ejs b/frontend/js/app/nginx/certificates/main.ejs deleted file mode 100644 index dbd6fa85..00000000 --- a/frontend/js/app/nginx/certificates/main.ejs +++ /dev/null @@ -1,36 +0,0 @@ -
-
-
-

<%- i18n('certificates', 'title') %>

-
- - - <% if (showAddButton) { %> - - <% } %> -
-
-
-
-
-
- -
-
-
-
diff --git a/frontend/js/app/nginx/certificates/main.js b/frontend/js/app/nginx/certificates/main.js deleted file mode 100644 index 3f9f022e..00000000 --- a/frontend/js/app/nginx/certificates/main.js +++ /dev/null @@ -1,109 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const CertificateModel = require('../../../models/certificate'); -const ListView = require('./list/main'); -const ErrorView = require('../../error/main'); -const EmptyView = require('../../empty/main'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - id: 'nginx-certificates', - template: template, - - ui: { - list_region: '.list-region', - add: '.add-item', - help: '.help', - dimmer: '.dimmer', - search: '.search-form', - query: 'input[name="source-query"]' - }, - - fetch: App.Api.Nginx.Certificates.getAll, - - showData: function(response) { - this.showChildView('list_region', new ListView({ - collection: new CertificateModel.Collection(response) - })); - }, - - showError: function(err) { - this.showChildView('list_region', new ErrorView({ - code: err.code, - message: err.message, - retry: function () { - App.Controller.showNginxCertificates(); - } - })); - - console.error(err); - }, - - showEmpty: function() { - let manage = App.Cache.User.canManage('certificates'); - - this.showChildView('list_region', new EmptyView({ - title: App.i18n('certificates', 'empty'), - subtitle: App.i18n('all-hosts', 'empty-subtitle', {manage: manage}), - link: manage ? App.i18n('certificates', 'add') : null, - btn_color: 'pink', - permission: 'certificates', - action: function () { - App.Controller.showNginxCertificateForm(); - } - })); - }, - - regions: { - list_region: '@ui.list_region' - }, - - events: { - 'click @ui.add': function (e) { - e.preventDefault(); - let model = new CertificateModel.Model({provider: $(e.currentTarget).data('cert')}); - App.Controller.showNginxCertificateForm(model); - }, - - 'click @ui.help': function (e) { - e.preventDefault(); - App.Controller.showHelp(App.i18n('certificates', 'help-title'), App.i18n('certificates', 'help-content')); - }, - - 'submit @ui.search': function (e) { - e.preventDefault(); - let query = this.ui.query.val(); - - this.fetch(['owner','proxy_hosts', 'dead_hosts', 'redirection_hosts'], query) - .then(response => this.showData(response)) - .catch(err => { - this.showError(err); - }); - } - }, - - templateContext: { - showAddButton: App.Cache.User.canManage('certificates') - }, - - onRender: function () { - let view = this; - - view.fetch(['owner','proxy_hosts', 'dead_hosts', 'redirection_hosts']) - .then(response => { - if (!view.isDestroyed()) { - if (response && response.length) { - view.showData(response); - } else { - view.showEmpty(); - } - } - }) - .catch(err => { - view.showError(err); - }) - .then(() => { - view.ui.dimmer.removeClass('active'); - }); - } -}); diff --git a/frontend/js/app/nginx/certificates/renew.ejs b/frontend/js/app/nginx/certificates/renew.ejs deleted file mode 100644 index 4af186d0..00000000 --- a/frontend/js/app/nginx/certificates/renew.ejs +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/frontend/js/app/nginx/certificates/renew.js b/frontend/js/app/nginx/certificates/renew.js deleted file mode 100644 index 73632881..00000000 --- a/frontend/js/app/nginx/certificates/renew.js +++ /dev/null @@ -1,31 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const template = require('./renew.ejs'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - waiting: '.waiting', - error: '.error', - close: 'button.cancel' - }, - - onRender: function () { - this.ui.error.hide(); - - App.Api.Nginx.Certificates.renew(this.model.get('id')) - .then((result) => { - this.model.set(result); - setTimeout(() => { - App.UI.closeModal(); - }, 1000); - }) - .catch((err) => { - this.ui.waiting.hide(); - this.ui.error.text(err.message).show(); - this.ui.close.prop('disabled', false); - }); - } -}); diff --git a/frontend/js/app/nginx/certificates/test.ejs b/frontend/js/app/nginx/certificates/test.ejs deleted file mode 100644 index 6661f625..00000000 --- a/frontend/js/app/nginx/certificates/test.ejs +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/frontend/js/app/nginx/certificates/test.js b/frontend/js/app/nginx/certificates/test.js deleted file mode 100644 index 0886d26f..00000000 --- a/frontend/js/app/nginx/certificates/test.js +++ /dev/null @@ -1,75 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const template = require('./test.ejs'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - waiting: '.waiting', - error: '.error', - success: '.success', - close: 'button.cancel' - }, - - events: { - 'click @ui.close': function (e) { - e.preventDefault(); - if (this.model.get('back_to_add')) { - App.Controller.showNginxCertificateForm(this.model); - } else { - App.UI.closeModal(); - } - }, - }, - - onRender: function () { - this.ui.error.hide(); - this.ui.success.hide(); - - App.Api.Nginx.Certificates.testHttpChallenge(this.model.get('domain_names')) - .then((result) => { - let allOk = true; - let text = ''; - - for (const domain in result) { - const status = result[domain]; - if (status === 'ok') { - text += `

${domain}: ${App.i18n('certificates', 'reachability-ok')}

`; - } else { - allOk = false; - if (status === 'no-host') { - text += `

${domain}: ${App.i18n('certificates', 'reachability-not-resolved')}

`; - } else if (status === 'failed') { - text += `

${domain}: ${App.i18n('certificates', 'reachability-failed-to-check')}

`; - } else if (status === '404') { - text += `

${domain}: ${App.i18n('certificates', 'reachability-404')}

`; - } else if (status === 'wrong-data') { - text += `

${domain}: ${App.i18n('certificates', 'reachability-wrong-data')}

`; - } else if (status.startsWith('other:')) { - const code = status.substring(6); - text += `

${domain}: ${App.i18n('certificates', 'reachability-other', {code})}

`; - } else { - // This should never happen - text += `

${domain}: ?

`; - } - } - } - - this.ui.waiting.hide(); - if (allOk) { - this.ui.success.html(text).show(); - } else { - this.ui.error.html(text).show(); - } - this.ui.close.prop('disabled', false); - }) - .catch((e) => { - console.error(e); - this.ui.waiting.hide(); - this.ui.error.text(App.i18n('certificates', 'reachability-failed-to-reach-api')).show(); - this.ui.close.prop('disabled', false); - }); - } -}); diff --git a/frontend/js/app/nginx/dead/delete.ejs b/frontend/js/app/nginx/dead/delete.ejs deleted file mode 100644 index 4bebb436..00000000 --- a/frontend/js/app/nginx/dead/delete.ejs +++ /dev/null @@ -1,23 +0,0 @@ - diff --git a/frontend/js/app/nginx/dead/delete.js b/frontend/js/app/nginx/dead/delete.js deleted file mode 100644 index d497d068..00000000 --- a/frontend/js/app/nginx/dead/delete.js +++ /dev/null @@ -1,32 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const template = require('./delete.ejs'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save' - }, - - events: { - - 'click @ui.save': function (e) { - e.preventDefault(); - - App.Api.Nginx.DeadHosts.delete(this.model.get('id')) - .then(() => { - App.Controller.showNginxDead(); - App.UI.closeModal(); - }) - .catch(err => { - alert(err.message); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - }); - } - } -}); diff --git a/frontend/js/app/nginx/dead/form.ejs b/frontend/js/app/nginx/dead/form.ejs deleted file mode 100644 index de3b87d8..00000000 --- a/frontend/js/app/nginx/dead/form.ejs +++ /dev/null @@ -1,206 +0,0 @@ - diff --git a/frontend/js/app/nginx/dead/form.js b/frontend/js/app/nginx/dead/form.js deleted file mode 100644 index a091717d..00000000 --- a/frontend/js/app/nginx/dead/form.js +++ /dev/null @@ -1,286 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const DeadHostModel = require('../../../models/dead-host'); -const template = require('./form.ejs'); -const certListItemTemplate = require('../certificates-list-item.ejs'); -const Helpers = require('../../../lib/helpers'); -const i18n = require('../../i18n'); -const dns_providers = require('../../../../../global/certbot-dns-plugins'); - -require('jquery-serializejson'); -require('selectize'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - domain_names: 'input[name="domain_names"]', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save', - le_error_info: '#le-error-info', - certificate_select: 'select[name="certificate_id"]', - ssl_forced: 'input[name="ssl_forced"]', - hsts_enabled: 'input[name="hsts_enabled"]', - hsts_subdomains: 'input[name="hsts_subdomains"]', - http2_support: 'input[name="http2_support"]', - dns_challenge_switch: 'input[name="meta[dns_challenge]"]', - dns_challenge_content: '.dns-challenge', - dns_provider: 'select[name="meta[dns_provider]"]', - credentials_file_content: '.credentials-file-content', - dns_provider_credentials: 'textarea[name="meta[dns_provider_credentials]"]', - propagation_seconds: 'input[name="meta[propagation_seconds]"]', - letsencrypt: '.letsencrypt' - }, - - events: { - 'change @ui.certificate_select': function () { - let id = this.ui.certificate_select.val(); - if (id === 'new') { - this.ui.letsencrypt.show().find('input').prop('disabled', false); - this.ui.dns_challenge_content.hide(); - } else { - this.ui.letsencrypt.hide().find('input').prop('disabled', true); - } - - - let enabled = id === 'new' || parseInt(id, 10) > 0; - - let inputs = this.ui.ssl_forced.add(this.ui.http2_support); - inputs - .prop('disabled', !enabled) - .parents('.form-group') - .css('opacity', enabled ? 1 : 0.5); - - if (!enabled) { - inputs.prop('checked', false); - } - - inputs.trigger('change'); - }, - - 'change @ui.ssl_forced': function () { - let checked = this.ui.ssl_forced.prop('checked'); - this.ui.hsts_enabled - .prop('disabled', !checked) - .parents('.form-group') - .css('opacity', checked ? 1 : 0.5); - - if (!checked) { - this.ui.hsts_enabled.prop('checked', false); - } - - this.ui.hsts_enabled.trigger('change'); - }, - - 'change @ui.hsts_enabled': function () { - let checked = this.ui.hsts_enabled.prop('checked'); - this.ui.hsts_subdomains - .prop('disabled', !checked) - .parents('.form-group') - .css('opacity', checked ? 1 : 0.5); - - if (!checked) { - this.ui.hsts_subdomains.prop('checked', false); - } - }, - - 'change @ui.dns_challenge_switch': function () { - const checked = this.ui.dns_challenge_switch.prop('checked'); - if (checked) { - this.ui.dns_provider.prop('required', 'required'); - const selected_provider = this.ui.dns_provider[0].options[this.ui.dns_provider[0].selectedIndex].value; - if(selected_provider != '' && dns_providers[selected_provider].credentials !== false){ - this.ui.dns_provider_credentials.prop('required', 'required'); - } - this.ui.dns_challenge_content.show(); - } else { - this.ui.dns_provider.prop('required', false); - this.ui.dns_provider_credentials.prop('required', false); - this.ui.dns_challenge_content.hide(); - } - }, - - 'change @ui.dns_provider': function () { - const selected_provider = this.ui.dns_provider[0].options[this.ui.dns_provider[0].selectedIndex].value; - if (selected_provider != '' && dns_providers[selected_provider].credentials !== false) { - this.ui.dns_provider_credentials.prop('required', 'required'); - this.ui.dns_provider_credentials[0].value = dns_providers[selected_provider].credentials; - this.ui.credentials_file_content.show(); - } else { - this.ui.dns_provider_credentials.prop('required', false); - this.ui.credentials_file_content.hide(); - } - }, - - 'click @ui.save': function (e) { - e.preventDefault(); - this.ui.le_error_info.hide(); - - if (!this.ui.form[0].checkValidity()) { - $('').hide().appendTo(this.ui.form).click().remove(); - return; - } - - let view = this; - let data = this.ui.form.serializeJSON(); - - // Manipulate - data.hsts_enabled = !!data.hsts_enabled; - data.hsts_subdomains = !!data.hsts_subdomains; - data.http2_support = !!data.http2_support; - data.ssl_forced = !!data.ssl_forced; - - if (typeof data.meta === 'undefined') data.meta = {}; - data.meta.letsencrypt_agree = data.meta.letsencrypt_agree == 1; - data.meta.dns_challenge = data.meta.dns_challenge == 1; - - if(!data.meta.dns_challenge){ - data.meta.dns_provider = undefined; - data.meta.dns_provider_credentials = undefined; - data.meta.propagation_seconds = undefined; - } else { - if(data.meta.propagation_seconds === '') data.meta.propagation_seconds = undefined; - } - - if (typeof data.domain_names === 'string' && data.domain_names) { - data.domain_names = data.domain_names.split(','); - } - - // Check for any domain names containing wildcards, which are not allowed with letsencrypt - if (data.certificate_id === 'new') { - let domain_err = false; - if (!data.meta.dns_challenge) { - data.domain_names.map(function (name) { - if (name.match(/\*/im)) { - domain_err = true; - } - }); - } - - if (domain_err) { - alert(i18n('ssl', 'no-wildcard-without-dns')); - return; - } - } else { - data.certificate_id = parseInt(data.certificate_id, 10); - } - - let method = App.Api.Nginx.DeadHosts.create; - let is_new = true; - - if (this.model.get('id')) { - // edit - is_new = false; - method = App.Api.Nginx.DeadHosts.update; - data.id = this.model.get('id'); - } - - this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); - this.ui.save.addClass('btn-loading'); - - method(data) - .then(result => { - view.model.set(result); - - App.UI.closeModal(function () { - if (is_new) { - App.Controller.showNginxDead(); - } - }); - }) - .catch(err => { - let more_info = ''; - if(err.code === 500 && err.debug){ - try{ - more_info = JSON.parse(err.debug).debug.stack.join("\n"); - } catch(e) {} - } - this.ui.le_error_info[0].innerHTML = `${err.message}${more_info !== '' ? `
${more_info}
`:''}`; - this.ui.le_error_info.show(); - this.ui.le_error_info[0].scrollIntoView(); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - this.ui.save.removeClass('btn-loading'); - }); - } - }, - - templateContext: { - getLetsencryptEmail: function () { - return App.Cache.User.get('email'); - }, - getUseDnsChallenge: function () { - return typeof this.meta.dns_challenge !== 'undefined' ? this.meta.dns_challenge : false; - }, - getDnsProvider: function () { - return typeof this.meta.dns_provider !== 'undefined' && this.meta.dns_provider != '' ? this.meta.dns_provider : null; - }, - getDnsProviderCredentials: function () { - return typeof this.meta.dns_provider_credentials !== 'undefined' ? this.meta.dns_provider_credentials : ''; - }, - getPropagationSeconds: function () { - return typeof this.meta.propagation_seconds !== 'undefined' ? this.meta.propagation_seconds : ''; - }, - dns_plugins: dns_providers, - }, - - onRender: function () { - let view = this; - - // Domain names - this.ui.domain_names.selectize({ - delimiter: ',', - persist: false, - maxOptions: 100, - create: function (input) { - return { - value: input, - text: input - }; - }, - createFilter: /^(?:\*\.)?(?:[^.*]+\.?)+[^.]$/ - }); - - // Certificates - this.ui.le_error_info.hide(); - this.ui.dns_challenge_content.hide(); - this.ui.credentials_file_content.hide(); - this.ui.letsencrypt.hide(); - this.ui.certificate_select.selectize({ - valueField: 'id', - labelField: 'nice_name', - searchField: ['nice_name', 'domain_names'], - create: false, - preload: true, - allowEmptyOption: true, - render: { - option: function (item) { - item.i18n = App.i18n; - item.formatDbDate = Helpers.formatDbDate; - return certListItemTemplate(item); - } - }, - load: function (query, callback) { - App.Api.Nginx.Certificates.getAll() - .then(rows => { - callback(rows); - }) - .catch(err => { - console.error(err); - callback(); - }); - }, - onLoad: function () { - view.ui.certificate_select[0].selectize.setValue(view.model.get('certificate_id')); - } - }); - }, - - initialize: function (options) { - if (typeof options.model === 'undefined' || !options.model) { - this.model = new DeadHostModel.Model(); - } - } -}); diff --git a/frontend/js/app/nginx/dead/list/item.ejs b/frontend/js/app/nginx/dead/list/item.ejs deleted file mode 100644 index dede3b63..00000000 --- a/frontend/js/app/nginx/dead/list/item.ejs +++ /dev/null @@ -1,54 +0,0 @@ - -
- -
- - -
- <% domain_names.map(function(host) { - if (host.indexOf('*') === -1) { - %> - <%- host %> - <% - } else { - %> - <%- host %> - <% - } - }); - %> -
-
- <%- i18n('str', 'created-on', {date: formatDbDate(created_on, 'Do MMMM YYYY')}) %> -
- - -
<%- certificate ? i18n('ssl', certificate.provider) : i18n('ssl', 'none') %>
- - - <% - var o = isOnline(); - if (!enabled) { %> - <%- i18n('str', 'disabled') %> - <% } else if (o === true) { %> - <%- i18n('str', 'online') %> - <% } else if (o === false) { %> - <%- i18n('str', 'offline') %> - <% } else { %> - <%- i18n('str', 'unknown') %> - <% } %> - -<% if (canManage) { %> - - - -<% } %> \ No newline at end of file diff --git a/frontend/js/app/nginx/dead/list/item.js b/frontend/js/app/nginx/dead/list/item.js deleted file mode 100644 index a477dbfa..00000000 --- a/frontend/js/app/nginx/dead/list/item.js +++ /dev/null @@ -1,61 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../../main'); -const template = require('./item.ejs'); - -module.exports = Mn.View.extend({ - template: template, - tagName: 'tr', - - ui: { - able: 'a.able', - edit: 'a.edit', - delete: 'a.delete', - host_link: '.host-link' - }, - - events: { - 'click @ui.able': function (e) { - e.preventDefault(); - let id = this.model.get('id'); - App.Api.Nginx.DeadHosts[this.model.get('enabled') ? 'disable' : 'enable'](id) - .then(() => { - return App.Api.Nginx.DeadHosts.get(id) - .then(row => { - this.model.set(row); - }); - }); - }, - - 'click @ui.edit': function (e) { - e.preventDefault(); - App.Controller.showNginxDeadForm(this.model); - }, - - 'click @ui.delete': function (e) { - e.preventDefault(); - App.Controller.showNginxDeadDeleteConfirm(this.model); - }, - - 'click @ui.host_link': function (e) { - e.preventDefault(); - let win = window.open($(e.currentTarget).attr('rel'), '_blank'); - win.focus(); - } - }, - - templateContext: { - canManage: App.Cache.User.canManage('dead_hosts'), - - isOnline: function () { - return typeof this.meta.nginx_online === 'undefined' ? null : this.meta.nginx_online; - }, - - getOfflineError: function () { - return this.meta.nginx_err || ''; - } - }, - - initialize: function () { - this.listenTo(this.model, 'change', this.render); - } -}); diff --git a/frontend/js/app/nginx/dead/list/main.ejs b/frontend/js/app/nginx/dead/list/main.ejs deleted file mode 100644 index e018a74b..00000000 --- a/frontend/js/app/nginx/dead/list/main.ejs +++ /dev/null @@ -1,12 +0,0 @@ - -   - <%- i18n('str', 'source') %> - <%- i18n('str', 'ssl') %> - <%- i18n('str', 'status') %> - <% if (canManage) { %> -   - <% } %> - - - - diff --git a/frontend/js/app/nginx/dead/list/main.js b/frontend/js/app/nginx/dead/list/main.js deleted file mode 100644 index 57931419..00000000 --- a/frontend/js/app/nginx/dead/list/main.js +++ /dev/null @@ -1,32 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../../main'); -const ItemView = require('./item'); -const template = require('./main.ejs'); - -const TableBody = Mn.CollectionView.extend({ - tagName: 'tbody', - childView: ItemView -}); - -module.exports = Mn.View.extend({ - tagName: 'table', - className: 'table table-hover table-outline table-vcenter card-table', - template: template, - - regions: { - body: { - el: 'tbody', - replaceElement: true - } - }, - - templateContext: { - canManage: App.Cache.User.canManage('dead_hosts') - }, - - onRender: function () { - this.showChildView('body', new TableBody({ - collection: this.collection - })); - } -}); diff --git a/frontend/js/app/nginx/dead/main.ejs b/frontend/js/app/nginx/dead/main.ejs deleted file mode 100644 index 4c5d1ad1..00000000 --- a/frontend/js/app/nginx/dead/main.ejs +++ /dev/null @@ -1,28 +0,0 @@ -
-
-
-

<%- i18n('dead-hosts', 'title') %>

-
- - - <% if (showAddButton) { %> - <%- i18n('dead-hosts', 'add') %> - <% } %> -
-
-
-
-
-
- -
-
-
-
diff --git a/frontend/js/app/nginx/dead/main.js b/frontend/js/app/nginx/dead/main.js deleted file mode 100644 index e4d0c010..00000000 --- a/frontend/js/app/nginx/dead/main.js +++ /dev/null @@ -1,108 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const DeadHostModel = require('../../../models/dead-host'); -const ListView = require('./list/main'); -const ErrorView = require('../../error/main'); -const EmptyView = require('../../empty/main'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - id: 'nginx-dead', - template: template, - - ui: { - list_region: '.list-region', - add: '.add-item', - help: '.help', - dimmer: '.dimmer', - search: '.search-form', - query: 'input[name="source-query"]' - }, - - fetch: App.Api.Nginx.DeadHosts.getAll, - - showData: function(response) { - this.showChildView('list_region', new ListView({ - collection: new DeadHostModel.Collection(response) - })); - }, - - showError: function(err) { - this.showChildView('list_region', new ErrorView({ - code: err.code, - message: err.message, - retry: function () { - App.Controller.showNginxDead(); - } - })); - - console.error(err); - }, - - showEmpty: function() { - let manage = App.Cache.User.canManage('dead_hosts'); - - this.showChildView('list_region', new EmptyView({ - title: App.i18n('dead-hosts', 'empty'), - subtitle: App.i18n('all-hosts', 'empty-subtitle', {manage: manage}), - link: manage ? App.i18n('dead-hosts', 'add') : null, - btn_color: 'danger', - permission: 'dead_hosts', - action: function () { - App.Controller.showNginxDeadForm(); - } - })); - }, - - regions: { - list_region: '@ui.list_region' - }, - - events: { - 'click @ui.add': function (e) { - e.preventDefault(); - App.Controller.showNginxDeadForm(); - }, - - 'click @ui.help': function (e) { - e.preventDefault(); - App.Controller.showHelp(App.i18n('dead-hosts', 'help-title'), App.i18n('dead-hosts', 'help-content')); - }, - - 'submit @ui.search': function (e) { - e.preventDefault(); - let query = this.ui.query.val(); - - this.fetch(['owner', 'certificate'], query) - .then(response => this.showData(response)) - .catch(err => { - this.showError(err); - }); - } - }, - - templateContext: { - showAddButton: App.Cache.User.canManage('dead_hosts') - }, - - onRender: function () { - let view = this; - - view.fetch(['owner', 'certificate']) - .then(response => { - if (!view.isDestroyed()) { - if (response && response.length) { - view.showData(response); - } else { - view.showEmpty(); - } - } - }) - .catch(err => { - view.showError(err); - }) - .then(() => { - view.ui.dimmer.removeClass('active'); - }); - } -}); diff --git a/frontend/js/app/nginx/proxy/access-list-item.ejs b/frontend/js/app/nginx/proxy/access-list-item.ejs deleted file mode 100644 index e5a7e116..00000000 --- a/frontend/js/app/nginx/proxy/access-list-item.ejs +++ /dev/null @@ -1,13 +0,0 @@ -
- <% if (id > 0) { %> -
- <%- name %> -
- <%- i18n('access-lists', 'item-count', {count: items.length || 0}) %>, <%- i18n('access-lists', 'client-count', {count: clients.length || 0}) %> – Created: <%- formatDbDate(created_on, 'Do MMMM YYYY, h:mm a') %> - <% } else { %> -
- <%- i18n('access-lists', 'public') %> -
- <%- i18n('access-lists', 'public-sub') %> - <% } %> -
diff --git a/frontend/js/app/nginx/proxy/delete.ejs b/frontend/js/app/nginx/proxy/delete.ejs deleted file mode 100644 index 74da297c..00000000 --- a/frontend/js/app/nginx/proxy/delete.ejs +++ /dev/null @@ -1,23 +0,0 @@ - diff --git a/frontend/js/app/nginx/proxy/delete.js b/frontend/js/app/nginx/proxy/delete.js deleted file mode 100644 index 63a8e020..00000000 --- a/frontend/js/app/nginx/proxy/delete.js +++ /dev/null @@ -1,32 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const template = require('./delete.ejs'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save' - }, - - events: { - - 'click @ui.save': function (e) { - e.preventDefault(); - - App.Api.Nginx.ProxyHosts.delete(this.model.get('id')) - .then(() => { - App.Controller.showNginxProxy(); - App.UI.closeModal(); - }) - .catch(err => { - alert(err.message); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - }); - } - } -}); diff --git a/frontend/js/app/nginx/proxy/form.ejs b/frontend/js/app/nginx/proxy/form.ejs deleted file mode 100644 index 8e7a2a2d..00000000 --- a/frontend/js/app/nginx/proxy/form.ejs +++ /dev/null @@ -1,281 +0,0 @@ - diff --git a/frontend/js/app/nginx/proxy/form.js b/frontend/js/app/nginx/proxy/form.js deleted file mode 100644 index 4437a6dd..00000000 --- a/frontend/js/app/nginx/proxy/form.js +++ /dev/null @@ -1,369 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const ProxyHostModel = require('../../../models/proxy-host'); -const ProxyLocationModel = require('../../../models/proxy-host-location'); -const template = require('./form.ejs'); -const certListItemTemplate = require('../certificates-list-item.ejs'); -const accessListItemTemplate = require('./access-list-item.ejs'); -const CustomLocation = require('./location'); -const Helpers = require('../../../lib/helpers'); -const i18n = require('../../i18n'); -const dns_providers = require('../../../../../global/certbot-dns-plugins'); - - -require('jquery-serializejson'); -require('selectize'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - locationsCollection: new ProxyLocationModel.Collection(), - - ui: { - form: 'form', - domain_names: 'input[name="domain_names"]', - forward_host: 'input[name="forward_host"]', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save', - add_location_btn: 'button.add_location', - locations_container: '.locations_container', - le_error_info: '#le-error-info', - certificate_select: 'select[name="certificate_id"]', - access_list_select: 'select[name="access_list_id"]', - ssl_forced: 'input[name="ssl_forced"]', - hsts_enabled: 'input[name="hsts_enabled"]', - hsts_subdomains: 'input[name="hsts_subdomains"]', - http2_support: 'input[name="http2_support"]', - dns_challenge_switch: 'input[name="meta[dns_challenge]"]', - dns_challenge_content: '.dns-challenge', - dns_provider: 'select[name="meta[dns_provider]"]', - credentials_file_content: '.credentials-file-content', - dns_provider_credentials: 'textarea[name="meta[dns_provider_credentials]"]', - propagation_seconds: 'input[name="meta[propagation_seconds]"]', - forward_scheme: 'select[name="forward_scheme"]', - letsencrypt: '.letsencrypt' - }, - - regions: { - locations_regions: '@ui.locations_container' - }, - - events: { - 'change @ui.certificate_select': function () { - let id = this.ui.certificate_select.val(); - if (id === 'new') { - this.ui.letsencrypt.show().find('input').prop('disabled', false); - this.ui.dns_challenge_content.hide(); - } else { - this.ui.letsencrypt.hide().find('input').prop('disabled', true); - } - - let enabled = id === 'new' || parseInt(id, 10) > 0; - - let inputs = this.ui.ssl_forced.add(this.ui.http2_support); - inputs - .prop('disabled', !enabled) - .parents('.form-group') - .css('opacity', enabled ? 1 : 0.5); - - if (!enabled) { - inputs.prop('checked', false); - } - - inputs.trigger('change'); - }, - - 'change @ui.ssl_forced': function () { - let checked = this.ui.ssl_forced.prop('checked'); - this.ui.hsts_enabled - .prop('disabled', !checked) - .parents('.form-group') - .css('opacity', checked ? 1 : 0.5); - - if (!checked) { - this.ui.hsts_enabled.prop('checked', false); - } - - this.ui.hsts_enabled.trigger('change'); - }, - - 'change @ui.hsts_enabled': function () { - let checked = this.ui.hsts_enabled.prop('checked'); - this.ui.hsts_subdomains - .prop('disabled', !checked) - .parents('.form-group') - .css('opacity', checked ? 1 : 0.5); - - if (!checked) { - this.ui.hsts_subdomains.prop('checked', false); - } - }, - - 'change @ui.dns_challenge_switch': function () { - const checked = this.ui.dns_challenge_switch.prop('checked'); - if (checked) { - this.ui.dns_provider.prop('required', 'required'); - const selected_provider = this.ui.dns_provider[0].options[this.ui.dns_provider[0].selectedIndex].value; - if(selected_provider != '' && dns_providers[selected_provider].credentials !== false){ - this.ui.dns_provider_credentials.prop('required', 'required'); - } - this.ui.dns_challenge_content.show(); - } else { - this.ui.dns_provider.prop('required', false); - this.ui.dns_provider_credentials.prop('required', false); - this.ui.dns_challenge_content.hide(); - } - }, - - 'change @ui.dns_provider': function () { - const selected_provider = this.ui.dns_provider[0].options[this.ui.dns_provider[0].selectedIndex].value; - if (selected_provider != '' && dns_providers[selected_provider].credentials !== false) { - this.ui.dns_provider_credentials.prop('required', 'required'); - this.ui.dns_provider_credentials[0].value = dns_providers[selected_provider].credentials; - this.ui.credentials_file_content.show(); - } else { - this.ui.dns_provider_credentials.prop('required', false); - this.ui.credentials_file_content.hide(); - } - }, - - 'click @ui.add_location_btn': function (e) { - e.preventDefault(); - - const model = new ProxyLocationModel.Model(); - this.locationsCollection.add(model); - }, - - 'click @ui.save': function (e) { - e.preventDefault(); - this.ui.le_error_info.hide(); - - if (!this.ui.form[0].checkValidity()) { - $('').hide().appendTo(this.ui.form).click().remove(); - return; - } - - let view = this; - let data = this.ui.form.serializeJSON(); - - // Add locations - data.locations = []; - this.locationsCollection.models.forEach((location) => { - data.locations.push(location.toJSON()); - }); - - // Serialize collects path from custom locations - // This field must be removed from root object - delete data.path; - - // Manipulate - data.forward_port = parseInt(data.forward_port, 10); - data.block_exploits = !!data.block_exploits; - data.caching_enabled = !!data.caching_enabled; - data.allow_websocket_upgrade = !!data.allow_websocket_upgrade; - data.http2_support = !!data.http2_support; - data.hsts_enabled = !!data.hsts_enabled; - data.hsts_subdomains = !!data.hsts_subdomains; - data.ssl_forced = !!data.ssl_forced; - - if (typeof data.meta === 'undefined') data.meta = {}; - data.meta.letsencrypt_agree = data.meta.letsencrypt_agree == 1; - data.meta.dns_challenge = data.meta.dns_challenge == 1; - - if(!data.meta.dns_challenge){ - data.meta.dns_provider = undefined; - data.meta.dns_provider_credentials = undefined; - data.meta.propagation_seconds = undefined; - } else { - if(data.meta.propagation_seconds === '') data.meta.propagation_seconds = undefined; - } - - if (typeof data.domain_names === 'string' && data.domain_names) { - data.domain_names = data.domain_names.split(','); - } - - // Check for any domain names containing wildcards, which are not allowed with letsencrypt - if (data.certificate_id === 'new') { - let domain_err = false; - if (!data.meta.dns_challenge) { - data.domain_names.map(function (name) { - if (name.match(/\*/im)) { - domain_err = true; - } - }); - } - - if (domain_err) { - alert(i18n('ssl', 'no-wildcard-without-dns')); - return; - } - } else { - data.certificate_id = parseInt(data.certificate_id, 10); - } - - let method = App.Api.Nginx.ProxyHosts.create; - let is_new = true; - - if (this.model.get('id')) { - // edit - is_new = false; - method = App.Api.Nginx.ProxyHosts.update; - data.id = this.model.get('id'); - } - - this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); - this.ui.save.addClass('btn-loading'); - - method(data) - .then(result => { - view.model.set(result); - - App.UI.closeModal(function () { - if (is_new) { - App.Controller.showNginxProxy(); - } - }); - }) - .catch(err => { - let more_info = ''; - if(err.code === 500 && err.debug){ - try{ - more_info = JSON.parse(err.debug).debug.stack.join("\n"); - } catch(e) {} - } - this.ui.le_error_info[0].innerHTML = `${err.message}${more_info !== '' ? `
${more_info}
`:''}`; - this.ui.le_error_info.show(); - this.ui.le_error_info[0].scrollIntoView(); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - this.ui.save.removeClass('btn-loading'); - }); - } - }, - - templateContext: { - getLetsencryptEmail: function () { - return App.Cache.User.get('email'); - }, - getUseDnsChallenge: function () { - return typeof this.meta.dns_challenge !== 'undefined' ? this.meta.dns_challenge : false; - }, - getDnsProvider: function () { - return typeof this.meta.dns_provider !== 'undefined' && this.meta.dns_provider != '' ? this.meta.dns_provider : null; - }, - getDnsProviderCredentials: function () { - return typeof this.meta.dns_provider_credentials !== 'undefined' ? this.meta.dns_provider_credentials : ''; - }, - getPropagationSeconds: function () { - return typeof this.meta.propagation_seconds !== 'undefined' ? this.meta.propagation_seconds : ''; - }, - dns_plugins: dns_providers, - }, - - onRender: function () { - let view = this; - - this.ui.ssl_forced.trigger('change'); - this.ui.hsts_enabled.trigger('change'); - - // Domain names - this.ui.domain_names.selectize({ - delimiter: ',', - persist: false, - maxOptions: 100, - create: function (input) { - return { - value: input, - text: input - }; - }, - createFilter: /^(?:\*\.)?(?:[^.*]+\.?)+[^.]$/ - }); - - // Access Lists - this.ui.access_list_select.selectize({ - valueField: 'id', - labelField: 'name', - searchField: ['name'], - create: false, - preload: true, - allowEmptyOption: true, - render: { - option: function (item) { - item.i18n = App.i18n; - item.formatDbDate = Helpers.formatDbDate; - return accessListItemTemplate(item); - } - }, - load: function (query, callback) { - App.Api.Nginx.AccessLists.getAll(['items', 'clients']) - .then(rows => { - callback(rows); - }) - .catch(err => { - console.error(err); - callback(); - }); - }, - onLoad: function () { - view.ui.access_list_select[0].selectize.setValue(view.model.get('access_list_id')); - } - }); - - // Certificates - this.ui.le_error_info.hide(); - this.ui.dns_challenge_content.hide(); - this.ui.credentials_file_content.hide(); - this.ui.letsencrypt.hide(); - this.ui.certificate_select.selectize({ - valueField: 'id', - labelField: 'nice_name', - searchField: ['nice_name', 'domain_names'], - create: false, - preload: true, - allowEmptyOption: true, - render: { - option: function (item) { - item.i18n = App.i18n; - item.formatDbDate = Helpers.formatDbDate; - return certListItemTemplate(item); - } - }, - load: function (query, callback) { - App.Api.Nginx.Certificates.getAll() - .then(rows => { - callback(rows); - }) - .catch(err => { - console.error(err); - callback(); - }); - }, - onLoad: function () { - view.ui.certificate_select[0].selectize.setValue(view.model.get('certificate_id')); - } - }); - }, - - initialize: function (options) { - if (typeof options.model === 'undefined' || !options.model) { - this.model = new ProxyHostModel.Model(); - } - - this.locationsCollection = new ProxyLocationModel.Collection(); - - // Custom locations - this.showChildView('locations_regions', new CustomLocation.LocationCollectionView({ - collection: this.locationsCollection - })); - - // Check wether there are any location defined - if (options.model && Array.isArray(options.model.attributes.locations)) { - options.model.attributes.locations.forEach((location) => { - let m = new ProxyLocationModel.Model(location); - this.locationsCollection.add(m); - }); - } - } -}); diff --git a/frontend/js/app/nginx/proxy/list/item.ejs b/frontend/js/app/nginx/proxy/list/item.ejs deleted file mode 100644 index 3eeaa6d2..00000000 --- a/frontend/js/app/nginx/proxy/list/item.ejs +++ /dev/null @@ -1,60 +0,0 @@ - -
- -
- - -
- <% domain_names.map(function(host) { - if (host.indexOf('*') === -1) { - %> - <%- host %> - <% - } else { - %> - <%- host %> - <% - } - }); - %> -
-
- <%- i18n('str', 'created-on', {date: formatDbDate(created_on, 'Do MMMM YYYY')}) %> -
- - -
<%- forward_scheme %>://<%- forward_host %>:<%- forward_port %>
- - -
<%- certificate && certificate_id ? i18n('ssl', certificate.provider) : i18n('ssl', 'none') %>
- - -
<%- access_list_id ? access_list.name : i18n('str', 'public') %>
- - - <% - var o = isOnline(); - if (!enabled) { %> - <%- i18n('str', 'disabled') %> - <% } else if (o === true) { %> - <%- i18n('str', 'online') %> - <% } else if (o === false) { %> - <%- i18n('str', 'offline') %> - <% } else { %> - <%- i18n('str', 'unknown') %> - <% } %> - -<% if (canManage) { %> - - - -<% } %> \ No newline at end of file diff --git a/frontend/js/app/nginx/proxy/list/item.js b/frontend/js/app/nginx/proxy/list/item.js deleted file mode 100644 index 37d199b4..00000000 --- a/frontend/js/app/nginx/proxy/list/item.js +++ /dev/null @@ -1,61 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../../main'); -const template = require('./item.ejs'); - -module.exports = Mn.View.extend({ - template: template, - tagName: 'tr', - - ui: { - able: 'a.able', - edit: 'a.edit', - delete: 'a.delete', - host_link: '.host-link' - }, - - events: { - 'click @ui.able': function (e) { - e.preventDefault(); - let id = this.model.get('id'); - App.Api.Nginx.ProxyHosts[this.model.get('enabled') ? 'disable' : 'enable'](id) - .then(() => { - return App.Api.Nginx.ProxyHosts.get(id) - .then(row => { - this.model.set(row); - }); - }); - }, - - 'click @ui.edit': function (e) { - e.preventDefault(); - App.Controller.showNginxProxyForm(this.model); - }, - - 'click @ui.delete': function (e) { - e.preventDefault(); - App.Controller.showNginxProxyDeleteConfirm(this.model); - }, - - 'click @ui.host_link': function (e) { - e.preventDefault(); - let win = window.open($(e.currentTarget).attr('rel'), '_blank'); - win.focus(); - } - }, - - templateContext: { - canManage: App.Cache.User.canManage('proxy_hosts'), - - isOnline: function () { - return typeof this.meta.nginx_online === 'undefined' ? null : this.meta.nginx_online; - }, - - getOfflineError: function () { - return this.meta.nginx_err || ''; - } - }, - - initialize: function () { - this.listenTo(this.model, 'change', this.render); - } -}); diff --git a/frontend/js/app/nginx/proxy/list/main.ejs b/frontend/js/app/nginx/proxy/list/main.ejs deleted file mode 100644 index 6de5b9c6..00000000 --- a/frontend/js/app/nginx/proxy/list/main.ejs +++ /dev/null @@ -1,14 +0,0 @@ - -   - <%- i18n('str', 'source') %> - <%- i18n('str', 'destination') %> - <%- i18n('str', 'ssl') %> - <%- i18n('str', 'access') %> - <%- i18n('str', 'status') %> - <% if (canManage) { %> -   - <% } %> - - - - diff --git a/frontend/js/app/nginx/proxy/list/main.js b/frontend/js/app/nginx/proxy/list/main.js deleted file mode 100644 index 09e984e6..00000000 --- a/frontend/js/app/nginx/proxy/list/main.js +++ /dev/null @@ -1,32 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../../main'); -const ItemView = require('./item'); -const template = require('./main.ejs'); - -const TableBody = Mn.CollectionView.extend({ - tagName: 'tbody', - childView: ItemView -}); - -module.exports = Mn.View.extend({ - tagName: 'table', - className: 'table table-hover table-outline table-vcenter card-table', - template: template, - - regions: { - body: { - el: 'tbody', - replaceElement: true - } - }, - - templateContext: { - canManage: App.Cache.User.canManage('proxy_hosts') - }, - - onRender: function () { - this.showChildView('body', new TableBody({ - collection: this.collection - })); - } -}); diff --git a/frontend/js/app/nginx/proxy/location-item.ejs b/frontend/js/app/nginx/proxy/location-item.ejs deleted file mode 100644 index 466cb9ba..00000000 --- a/frontend/js/app/nginx/proxy/location-item.ejs +++ /dev/null @@ -1,64 +0,0 @@ -
-
-
-
-
- -
-
-
- - location - - -
-
-
-
- -
-
-
-
-
-
-
- - -
-
-
-
- - - <%- i18n('proxy-hosts', 'custom-forward-host-help') %> -
-
-
-
- - -
-
-
-
-
-
- -
-
-
- - - <%- i18n('locations', 'delete') %> - -
-
diff --git a/frontend/js/app/nginx/proxy/location.js b/frontend/js/app/nginx/proxy/location.js deleted file mode 100644 index e9513a48..00000000 --- a/frontend/js/app/nginx/proxy/location.js +++ /dev/null @@ -1,54 +0,0 @@ -const locationItemTemplate = require('./location-item.ejs'); -const Mn = require('backbone.marionette'); -const App = require('../../main'); - -const LocationView = Mn.View.extend({ - template: locationItemTemplate, - className: 'location_block', - - ui: { - toggle: 'input[type="checkbox"]', - config: '.config', - delete: '.location-delete' - }, - - events: { - 'change @ui.toggle': function(el) { - if (el.target.checked) { - this.ui.config.show(); - } else { - this.ui.config.hide(); - } - }, - - 'change .model': function (e) { - const map = {}; - map[e.target.name] = e.target.value; - this.model.set(map); - }, - - 'click @ui.delete': function () { - this.model.destroy(); - } - }, - - onRender: function() { - $(this.ui.config).hide(); - }, - - templateContext: function() { - return { - i18n: App.i18n - } - } -}); - -const LocationCollectionView = Mn.CollectionView.extend({ - className: 'locations_container', - childView: LocationView -}); - -module.exports = { - LocationCollectionView, - LocationView -} \ No newline at end of file diff --git a/frontend/js/app/nginx/proxy/main.ejs b/frontend/js/app/nginx/proxy/main.ejs deleted file mode 100644 index 4ecb9036..00000000 --- a/frontend/js/app/nginx/proxy/main.ejs +++ /dev/null @@ -1,28 +0,0 @@ -
-
-
-

<%- i18n('proxy-hosts', 'title') %>

-
- - - <% if (showAddButton) { %> - <%- i18n('proxy-hosts', 'add') %> - <% } %> -
-
-
-
-
-
- -
-
-
-
diff --git a/frontend/js/app/nginx/proxy/main.js b/frontend/js/app/nginx/proxy/main.js deleted file mode 100644 index baf67101..00000000 --- a/frontend/js/app/nginx/proxy/main.js +++ /dev/null @@ -1,108 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const ProxyHostModel = require('../../../models/proxy-host'); -const ListView = require('./list/main'); -const ErrorView = require('../../error/main'); -const EmptyView = require('../../empty/main'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - id: 'nginx-proxy', - template: template, - - ui: { - list_region: '.list-region', - add: '.add-item', - help: '.help', - dimmer: '.dimmer', - search: '.search-form', - query: 'input[name="source-query"]' - }, - - fetch: App.Api.Nginx.ProxyHosts.getAll, - - showData: function(response) { - this.showChildView('list_region', new ListView({ - collection: new ProxyHostModel.Collection(response) - })); - }, - - showError: function(err) { - this.showChildView('list_region', new ErrorView({ - code: err.code, - message: err.message, - retry: function () { - App.Controller.showNginxProxy(); - } - })); - - console.error(err); - }, - - showEmpty: function() { - let manage = App.Cache.User.canManage('proxy_hosts'); - - this.showChildView('list_region', new EmptyView({ - title: App.i18n('proxy-hosts', 'empty'), - subtitle: App.i18n('all-hosts', 'empty-subtitle', {manage: manage}), - link: manage ? App.i18n('proxy-hosts', 'add') : null, - btn_color: 'success', - permission: 'proxy_hosts', - action: function () { - App.Controller.showNginxProxyForm(); - } - })); - }, - - regions: { - list_region: '@ui.list_region' - }, - - events: { - 'click @ui.add': function (e) { - e.preventDefault(); - App.Controller.showNginxProxyForm(); - }, - - 'click @ui.help': function (e) { - e.preventDefault(); - App.Controller.showHelp(App.i18n('proxy-hosts', 'help-title'), App.i18n('proxy-hosts', 'help-content')); - }, - - 'submit @ui.search': function (e) { - e.preventDefault(); - let query = this.ui.query.val(); - - this.fetch(['owner', 'access_list', 'certificate'], query) - .then(response => this.showData(response)) - .catch(err => { - this.showError(err); - }); - } - }, - - templateContext: { - showAddButton: App.Cache.User.canManage('proxy_hosts') - }, - - onRender: function () { - let view = this; - - view.fetch(['owner', 'access_list', 'certificate']) - .then(response => { - if (!view.isDestroyed()) { - if (response && response.length) { - view.showData(response); - } else { - view.showEmpty(); - } - } - }) - .catch(err => { - view.showError(err); - }) - .then(() => { - view.ui.dimmer.removeClass('active'); - }); - } -}); diff --git a/frontend/js/app/nginx/redirection/delete.ejs b/frontend/js/app/nginx/redirection/delete.ejs deleted file mode 100644 index 782d8435..00000000 --- a/frontend/js/app/nginx/redirection/delete.ejs +++ /dev/null @@ -1,23 +0,0 @@ - diff --git a/frontend/js/app/nginx/redirection/delete.js b/frontend/js/app/nginx/redirection/delete.js deleted file mode 100644 index 6d2862f6..00000000 --- a/frontend/js/app/nginx/redirection/delete.js +++ /dev/null @@ -1,32 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const template = require('./delete.ejs'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save' - }, - - events: { - - 'click @ui.save': function (e) { - e.preventDefault(); - - App.Api.Nginx.RedirectionHosts.delete(this.model.get('id')) - .then(() => { - App.Controller.showNginxRedirection(); - App.UI.closeModal(); - }) - .catch(err => { - alert(err.message); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - }); - } - } -}); diff --git a/frontend/js/app/nginx/redirection/form.ejs b/frontend/js/app/nginx/redirection/form.ejs deleted file mode 100644 index f32178bc..00000000 --- a/frontend/js/app/nginx/redirection/form.ejs +++ /dev/null @@ -1,253 +0,0 @@ - diff --git a/frontend/js/app/nginx/redirection/form.js b/frontend/js/app/nginx/redirection/form.js deleted file mode 100644 index 5d061ff7..00000000 --- a/frontend/js/app/nginx/redirection/form.js +++ /dev/null @@ -1,288 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const RedirectionHostModel = require('../../../models/redirection-host'); -const template = require('./form.ejs'); -const certListItemTemplate = require('../certificates-list-item.ejs'); -const Helpers = require('../../../lib/helpers'); -const i18n = require('../../i18n'); -const dns_providers = require('../../../../../global/certbot-dns-plugins'); - - -require('jquery-serializejson'); -require('selectize'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - domain_names: 'input[name="domain_names"]', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save', - le_error_info: '#le-error-info', - certificate_select: 'select[name="certificate_id"]', - ssl_forced: 'input[name="ssl_forced"]', - hsts_enabled: 'input[name="hsts_enabled"]', - hsts_subdomains: 'input[name="hsts_subdomains"]', - http2_support: 'input[name="http2_support"]', - dns_challenge_switch: 'input[name="meta[dns_challenge]"]', - dns_challenge_content: '.dns-challenge', - dns_provider: 'select[name="meta[dns_provider]"]', - credentials_file_content: '.credentials-file-content', - dns_provider_credentials: 'textarea[name="meta[dns_provider_credentials]"]', - propagation_seconds: 'input[name="meta[propagation_seconds]"]', - letsencrypt: '.letsencrypt' - }, - - events: { - 'change @ui.certificate_select': function () { - let id = this.ui.certificate_select.val(); - if (id === 'new') { - this.ui.letsencrypt.show().find('input').prop('disabled', false); - this.ui.dns_challenge_content.hide(); - } else { - this.ui.letsencrypt.hide().find('input').prop('disabled', true); - } - - let enabled = id === 'new' || parseInt(id, 10) > 0; - - let inputs = this.ui.ssl_forced.add(this.ui.http2_support); - inputs - .prop('disabled', !enabled) - .parents('.form-group') - .css('opacity', enabled ? 1 : 0.5); - - if (!enabled) { - inputs.prop('checked', false); - } - - inputs.trigger('change'); - }, - - 'change @ui.ssl_forced': function () { - let checked = this.ui.ssl_forced.prop('checked'); - this.ui.hsts_enabled - .prop('disabled', !checked) - .parents('.form-group') - .css('opacity', checked ? 1 : 0.5); - - if (!checked) { - this.ui.hsts_enabled.prop('checked', false); - } - - this.ui.hsts_enabled.trigger('change'); - }, - - 'change @ui.hsts_enabled': function () { - let checked = this.ui.hsts_enabled.prop('checked'); - this.ui.hsts_subdomains - .prop('disabled', !checked) - .parents('.form-group') - .css('opacity', checked ? 1 : 0.5); - - if (!checked) { - this.ui.hsts_subdomains.prop('checked', false); - } - }, - - 'change @ui.dns_challenge_switch': function () { - const checked = this.ui.dns_challenge_switch.prop('checked'); - if (checked) { - this.ui.dns_provider.prop('required', 'required'); - const selected_provider = this.ui.dns_provider[0].options[this.ui.dns_provider[0].selectedIndex].value; - if(selected_provider != '' && dns_providers[selected_provider].credentials !== false){ - this.ui.dns_provider_credentials.prop('required', 'required'); - } - this.ui.dns_challenge_content.show(); - } else { - this.ui.dns_provider.prop('required', false); - this.ui.dns_provider_credentials.prop('required', false); - this.ui.dns_challenge_content.hide(); - } - }, - - 'change @ui.dns_provider': function () { - const selected_provider = this.ui.dns_provider[0].options[this.ui.dns_provider[0].selectedIndex].value; - if (selected_provider != '' && dns_providers[selected_provider].credentials !== false) { - this.ui.dns_provider_credentials.prop('required', 'required'); - this.ui.dns_provider_credentials[0].value = dns_providers[selected_provider].credentials; - this.ui.credentials_file_content.show(); - } else { - this.ui.dns_provider_credentials.prop('required', false); - this.ui.credentials_file_content.hide(); - } - }, - - 'click @ui.save': function (e) { - e.preventDefault(); - this.ui.le_error_info.hide(); - - if (!this.ui.form[0].checkValidity()) { - $('').hide().appendTo(this.ui.form).click().remove(); - return; - } - - let view = this; - let data = this.ui.form.serializeJSON(); - - // Manipulate - data.block_exploits = !!data.block_exploits; - data.preserve_path = !!data.preserve_path; - data.http2_support = !!data.http2_support; - data.hsts_enabled = !!data.hsts_enabled; - data.hsts_subdomains = !!data.hsts_subdomains; - data.ssl_forced = !!data.ssl_forced; - - if (typeof data.meta === 'undefined') data.meta = {}; - data.meta.letsencrypt_agree = data.meta.letsencrypt_agree == 1; - data.meta.dns_challenge = data.meta.dns_challenge == 1; - - if(!data.meta.dns_challenge){ - data.meta.dns_provider = undefined; - data.meta.dns_provider_credentials = undefined; - data.meta.propagation_seconds = undefined; - } else { - if(data.meta.propagation_seconds === '') data.meta.propagation_seconds = undefined; - } - - if (typeof data.domain_names === 'string' && data.domain_names) { - data.domain_names = data.domain_names.split(','); - } - - // Check for any domain names containing wildcards, which are not allowed with letsencrypt - if (data.certificate_id === 'new') { - let domain_err = false; - if (!data.meta.dns_challenge) { - data.domain_names.map(function (name) { - if (name.match(/\*/im)) { - domain_err = true; - } - }); - } - - if (domain_err) { - alert(i18n('ssl', 'no-wildcard-without-dns')); - return; - } - } else { - data.certificate_id = parseInt(data.certificate_id, 10); - } - - let method = App.Api.Nginx.RedirectionHosts.create; - let is_new = true; - - if (this.model.get('id')) { - // edit - is_new = false; - method = App.Api.Nginx.RedirectionHosts.update; - data.id = this.model.get('id'); - } - - this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); - this.ui.save.addClass('btn-loading'); - - method(data) - .then(result => { - view.model.set(result); - - App.UI.closeModal(function () { - if (is_new) { - App.Controller.showNginxRedirection(); - } - }); - }) - .catch(err => { - let more_info = ''; - if(err.code === 500 && err.debug){ - try{ - more_info = JSON.parse(err.debug).debug.stack.join("\n"); - } catch(e) {} - } - this.ui.le_error_info[0].innerHTML = `${err.message}${more_info !== '' ? `
${more_info}
`:''}`; - this.ui.le_error_info.show(); - this.ui.le_error_info[0].scrollIntoView(); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - this.ui.save.removeClass('btn-loading'); - }); - } - }, - - templateContext: { - getLetsencryptEmail: function () { - return App.Cache.User.get('email'); - }, - getUseDnsChallenge: function () { - return typeof this.meta.dns_challenge !== 'undefined' ? this.meta.dns_challenge : false; - }, - getDnsProvider: function () { - return typeof this.meta.dns_provider !== 'undefined' && this.meta.dns_provider != '' ? this.meta.dns_provider : null; - }, - getDnsProviderCredentials: function () { - return typeof this.meta.dns_provider_credentials !== 'undefined' ? this.meta.dns_provider_credentials : ''; - }, - getPropagationSeconds: function () { - return typeof this.meta.propagation_seconds !== 'undefined' ? this.meta.propagation_seconds : ''; - }, - dns_plugins: dns_providers, - }, - - onRender: function () { - let view = this; - - // Domain names - this.ui.domain_names.selectize({ - delimiter: ',', - persist: false, - maxOptions: 100, - create: function (input) { - return { - value: input, - text: input - }; - }, - createFilter: /^(?:\*\.)?(?:[^.*]+\.?)+[^.]$/ - }); - - // Certificates - this.ui.le_error_info.hide(); - this.ui.dns_challenge_content.hide(); - this.ui.credentials_file_content.hide(); - this.ui.letsencrypt.hide(); - this.ui.certificate_select.selectize({ - valueField: 'id', - labelField: 'nice_name', - searchField: ['nice_name', 'domain_names'], - create: false, - preload: true, - allowEmptyOption: true, - render: { - option: function (item) { - item.i18n = App.i18n; - item.formatDbDate = Helpers.formatDbDate; - return certListItemTemplate(item); - } - }, - load: function (query, callback) { - App.Api.Nginx.Certificates.getAll() - .then(rows => { - callback(rows); - }) - .catch(err => { - console.error(err); - callback(); - }); - }, - onLoad: function () { - view.ui.certificate_select[0].selectize.setValue(view.model.get('certificate_id')); - } - }); - }, - - initialize: function (options) { - if (typeof options.model === 'undefined' || !options.model) { - this.model = new RedirectionHostModel.Model(); - } - } -}); diff --git a/frontend/js/app/nginx/redirection/list/item.ejs b/frontend/js/app/nginx/redirection/list/item.ejs deleted file mode 100644 index dff186fd..00000000 --- a/frontend/js/app/nginx/redirection/list/item.ejs +++ /dev/null @@ -1,63 +0,0 @@ - -
- -
- - -
- <% domain_names.map(function(host) { - if (host.indexOf('*') === -1) { - %> - <%- host %> - <% - } else { - %> - <%- host %> - <% - } - }); - %> -
-
- <%- i18n('str', 'created-on', {date: formatDbDate(created_on, 'Do MMMM YYYY')}) %> -
- - -
<%- forward_http_code %>
- - -
<%- forward_scheme == '$scheme' ? 'auto' : forward_scheme %>
- - -
<%- forward_domain_name %>
- - -
<%- certificate ? i18n('ssl', certificate.provider) : i18n('ssl', 'none') %>
- - - <% - var o = isOnline(); - if (!enabled) { %> - <%- i18n('str', 'disabled') %> - <% } else if (o === true) { %> - <%- i18n('str', 'online') %> - <% } else if (o === false) { %> - <%- i18n('str', 'offline') %> - <% } else { %> - <%- i18n('str', 'unknown') %> - <% } %> - -<% if (canManage) { %> - - - -<% } %> diff --git a/frontend/js/app/nginx/redirection/list/item.js b/frontend/js/app/nginx/redirection/list/item.js deleted file mode 100644 index 05adc251..00000000 --- a/frontend/js/app/nginx/redirection/list/item.js +++ /dev/null @@ -1,61 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../../main'); -const template = require('./item.ejs'); - -module.exports = Mn.View.extend({ - template: template, - tagName: 'tr', - - ui: { - able: 'a.able', - edit: 'a.edit', - delete: 'a.delete', - host_link: '.host-link' - }, - - events: { - 'click @ui.able': function (e) { - e.preventDefault(); - let id = this.model.get('id'); - App.Api.Nginx.RedirectionHosts[this.model.get('enabled') ? 'disable' : 'enable'](id) - .then(() => { - return App.Api.Nginx.RedirectionHosts.get(id) - .then(row => { - this.model.set(row); - }); - }); - }, - - 'click @ui.edit': function (e) { - e.preventDefault(); - App.Controller.showNginxRedirectionForm(this.model); - }, - - 'click @ui.delete': function (e) { - e.preventDefault(); - App.Controller.showNginxRedirectionDeleteConfirm(this.model); - }, - - 'click @ui.host_link': function (e) { - e.preventDefault(); - let win = window.open($(e.currentTarget).attr('rel'), '_blank'); - win.focus(); - } - }, - - templateContext: { - canManage: App.Cache.User.canManage('redirection_hosts'), - - isOnline: function () { - return typeof this.meta.nginx_online === 'undefined' ? null : this.meta.nginx_online; - }, - - getOfflineError: function () { - return this.meta.nginx_err || ''; - } - }, - - initialize: function () { - this.listenTo(this.model, 'change', this.render); - } -}); diff --git a/frontend/js/app/nginx/redirection/list/main.ejs b/frontend/js/app/nginx/redirection/list/main.ejs deleted file mode 100644 index 8b6930d6..00000000 --- a/frontend/js/app/nginx/redirection/list/main.ejs +++ /dev/null @@ -1,15 +0,0 @@ - -   - <%- i18n('str', 'source') %> - <%- i18n('redirection-hosts', 'forward-http-status-code') %> - <%- i18n('redirection-hosts', 'forward-scheme') %> - <%- i18n('str', 'destination') %> - <%- i18n('str', 'ssl') %> - <%- i18n('str', 'status') %> - <% if (canManage) { %> -   - <% } %> - - - - diff --git a/frontend/js/app/nginx/redirection/list/main.js b/frontend/js/app/nginx/redirection/list/main.js deleted file mode 100644 index d368cf6a..00000000 --- a/frontend/js/app/nginx/redirection/list/main.js +++ /dev/null @@ -1,32 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../../main'); -const ItemView = require('./item'); -const template = require('./main.ejs'); - -const TableBody = Mn.CollectionView.extend({ - tagName: 'tbody', - childView: ItemView -}); - -module.exports = Mn.View.extend({ - tagName: 'table', - className: 'table table-hover table-outline table-vcenter card-table', - template: template, - - regions: { - body: { - el: 'tbody', - replaceElement: true - } - }, - - templateContext: { - canManage: App.Cache.User.canManage('redirection_hosts') - }, - - onRender: function () { - this.showChildView('body', new TableBody({ - collection: this.collection - })); - } -}); diff --git a/frontend/js/app/nginx/redirection/main.ejs b/frontend/js/app/nginx/redirection/main.ejs deleted file mode 100644 index 87e28229..00000000 --- a/frontend/js/app/nginx/redirection/main.ejs +++ /dev/null @@ -1,28 +0,0 @@ -
-
-
-

<%- i18n('redirection-hosts', 'title') %>

-
- - - <% if (showAddButton) { %> - <%- i18n('redirection-hosts', 'add') %> - <% } %> -
-
-
-
-
-
- -
-
-
-
diff --git a/frontend/js/app/nginx/redirection/main.js b/frontend/js/app/nginx/redirection/main.js deleted file mode 100644 index 1f5351a7..00000000 --- a/frontend/js/app/nginx/redirection/main.js +++ /dev/null @@ -1,107 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const RedirectionHostModel = require('../../../models/redirection-host'); -const ListView = require('./list/main'); -const ErrorView = require('../../error/main'); -const EmptyView = require('../../empty/main'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - id: 'nginx-redirection', - template: template, - - ui: { - list_region: '.list-region', - add: '.add-item', - help: '.help', - dimmer: '.dimmer', - search: '.search-form', - query: 'input[name="source-query"]' - }, - - fetch: App.Api.Nginx.RedirectionHosts.getAll, - - showData: function(response) { - this.showChildView('list_region', new ListView({ - collection: new RedirectionHostModel.Collection(response) - })); - }, - - showError: function(err) { - this.showChildView('list_region', new ErrorView({ - code: err.code, - message: err.message, - retry: function () { - App.Controller.showNginxRedirection(); - } - })); - console.error(err); - }, - - showEmpty: function() { - let manage = App.Cache.User.canManage('redirection_hosts'); - - this.showChildView('list_region', new EmptyView({ - title: App.i18n('redirection-hosts', 'empty'), - subtitle: App.i18n('all-hosts', 'empty-subtitle', {manage: manage}), - link: manage ? App.i18n('redirection-hosts', 'add') : null, - btn_color: 'yellow', - permission: 'redirection_hosts', - action: function () { - App.Controller.showNginxRedirectionForm(); - } - })); - }, - - regions: { - list_region: '@ui.list_region' - }, - - events: { - 'click @ui.add': function (e) { - e.preventDefault(); - App.Controller.showNginxRedirectionForm(); - }, - - 'click @ui.help': function (e) { - e.preventDefault(); - App.Controller.showHelp(App.i18n('redirection-hosts', 'help-title'), App.i18n('redirection-hosts', 'help-content')); - }, - - 'submit @ui.search': function (e) { - e.preventDefault(); - let query = this.ui.query.val(); - - this.fetch(['owner', 'certificate'], query) - .then(response => this.showData(response)) - .catch(err => { - this.showError(err); - }); - } - }, - - templateContext: { - showAddButton: App.Cache.User.canManage('proxy_hosts') - }, - - onRender: function () { - let view = this; - - view.fetch(['owner', 'certificate']) - .then(response => { - if (!view.isDestroyed()) { - if (response && response.length) { - view.showData(response); - } else { - view.showEmpty(); - } - } - }) - .catch(err => { - view.showError(err); - }) - .then(() => { - view.ui.dimmer.removeClass('active'); - }); - } -}); diff --git a/frontend/js/app/nginx/stream/delete.ejs b/frontend/js/app/nginx/stream/delete.ejs deleted file mode 100644 index d7ba3a21..00000000 --- a/frontend/js/app/nginx/stream/delete.ejs +++ /dev/null @@ -1,19 +0,0 @@ - diff --git a/frontend/js/app/nginx/stream/delete.js b/frontend/js/app/nginx/stream/delete.js deleted file mode 100644 index 71eff18c..00000000 --- a/frontend/js/app/nginx/stream/delete.js +++ /dev/null @@ -1,32 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const template = require('./delete.ejs'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save' - }, - - events: { - - 'click @ui.save': function (e) { - e.preventDefault(); - - App.Api.Nginx.Streams.delete(this.model.get('id')) - .then(() => { - App.Controller.showNginxStream(); - App.UI.closeModal(); - }) - .catch(err => { - alert(err.message); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - }); - } - } -}); diff --git a/frontend/js/app/nginx/stream/form.ejs b/frontend/js/app/nginx/stream/form.ejs deleted file mode 100644 index 800945f3..00000000 --- a/frontend/js/app/nginx/stream/form.ejs +++ /dev/null @@ -1,194 +0,0 @@ - diff --git a/frontend/js/app/nginx/stream/form.js b/frontend/js/app/nginx/stream/form.js deleted file mode 100644 index cd012f9b..00000000 --- a/frontend/js/app/nginx/stream/form.js +++ /dev/null @@ -1,225 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const StreamModel = require('../../../models/stream'); -const template = require('./form.ejs'); -const dns_providers = require('../../../../../global/certbot-dns-plugins'); - -require('jquery-serializejson'); -require('jquery-mask-plugin'); -require('selectize'); -const Helpers = require("../../../lib/helpers"); -const certListItemTemplate = require("../certificates-list-item.ejs"); -const i18n = require("../../i18n"); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - forwarding_host: 'input[name="forwarding_host"]', - type_error: '.forward-type-error', - buttons: '.modal-footer button', - switches: '.custom-switch-input', - cancel: 'button.cancel', - save: 'button.save', - le_error_info: '#le-error-info', - certificate_select: 'select[name="certificate_id"]', - domain_names: 'input[name="domain_names"]', - dns_challenge_switch: 'input[name="meta[dns_challenge]"]', - dns_challenge_content: '.dns-challenge', - dns_provider: 'select[name="meta[dns_provider]"]', - credentials_file_content: '.credentials-file-content', - dns_provider_credentials: 'textarea[name="meta[dns_provider_credentials]"]', - propagation_seconds: 'input[name="meta[propagation_seconds]"]', - letsencrypt: '.letsencrypt' - }, - - events: { - 'change @ui.switches': function () { - this.ui.type_error.hide(); - }, - - 'click @ui.save': function (e) { - e.preventDefault(); - - if (!this.ui.form[0].checkValidity()) { - $('').hide().appendTo(this.ui.form).click().remove(); - return; - } - - let view = this; - let data = this.ui.form.serializeJSON(); - - if (!data.tcp_forwarding && !data.udp_forwarding) { - this.ui.type_error.show(); - return; - } - - // Manipulate - data.incoming_port = parseInt(data.incoming_port, 10); - data.forwarding_port = parseInt(data.forwarding_port, 10); - data.tcp_forwarding = !!data.tcp_forwarding; - data.udp_forwarding = !!data.udp_forwarding; - - if (typeof data.meta === 'undefined') data.meta = {}; - data.meta.letsencrypt_agree = data.meta.letsencrypt_agree == 1; - data.meta.dns_challenge = true; - - if (data.meta.propagation_seconds === '') data.meta.propagation_seconds = undefined; - - if (typeof data.domain_names === 'string' && data.domain_names) { - data.domain_names = data.domain_names.split(','); - } - - // Check for any domain names containing wildcards, which are not allowed with letsencrypt - if (data.certificate_id === 'new') { - let domain_err = false; - if (!data.meta.dns_challenge) { - data.domain_names.map(function (name) { - if (name.match(/\*/im)) { - domain_err = true; - } - }); - } - - if (domain_err) { - alert(i18n('ssl', 'no-wildcard-without-dns')); - return; - } - } else { - data.certificate_id = parseInt(data.certificate_id, 10); - } - - let method = App.Api.Nginx.Streams.create; - let is_new = true; - - if (this.model.get('id')) { - // edit - is_new = false; - method = App.Api.Nginx.Streams.update; - data.id = this.model.get('id'); - } - - this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); - method(data) - .then(result => { - view.model.set(result); - - App.UI.closeModal(function () { - if (is_new) { - App.Controller.showNginxStream(); - } - }); - }) - .catch(err => { - let more_info = ''; - if (err.code === 500 && err.debug) { - try { - more_info = JSON.parse(err.debug).debug.stack.join("\n"); - } catch (e) { - } - } - this.ui.le_error_info[0].innerHTML = `${err.message}${more_info !== '' ? `
${more_info}
` : ''}`; - this.ui.le_error_info.show(); - this.ui.le_error_info[0].scrollIntoView(); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - this.ui.save.removeClass('btn-loading'); - }); - }, - - 'change @ui.certificate_select': function () { - let id = this.ui.certificate_select.val(); - if (id === 'new') { - this.ui.letsencrypt.show().find('input').prop('disabled', false); - this.ui.domain_names.prop('required', 'required'); - - this.ui.dns_challenge_switch - .prop('disabled', true) - .parents('.form-group') - .css('opacity', 0.5); - - this.ui.dns_provider.prop('required', 'required'); - const selected_provider = this.ui.dns_provider[0].options[this.ui.dns_provider[0].selectedIndex].value; - if (selected_provider != '' && dns_providers[selected_provider].credentials !== false) { - this.ui.dns_provider_credentials.prop('required', 'required'); - } - this.ui.dns_challenge_content.show(); - } else { - this.ui.letsencrypt.hide().find('input').prop('disabled', true); - } - }, - - 'change @ui.dns_provider': function () { - const selected_provider = this.ui.dns_provider[0].options[this.ui.dns_provider[0].selectedIndex].value; - if (selected_provider != '' && dns_providers[selected_provider].credentials !== false) { - this.ui.dns_provider_credentials.prop('required', 'required'); - this.ui.dns_provider_credentials[0].value = dns_providers[selected_provider].credentials; - this.ui.credentials_file_content.show(); - } else { - this.ui.dns_provider_credentials.prop('required', false); - this.ui.credentials_file_content.hide(); - } - }, - }, - - templateContext: { - getLetsencryptEmail: function () { - return App.Cache.User.get('email'); - }, - getDnsProvider: function () { - return typeof this.meta.dns_provider !== 'undefined' && this.meta.dns_provider != '' ? this.meta.dns_provider : null; - }, - getDnsProviderCredentials: function () { - return typeof this.meta.dns_provider_credentials !== 'undefined' ? this.meta.dns_provider_credentials : ''; - }, - getPropagationSeconds: function () { - return typeof this.meta.propagation_seconds !== 'undefined' ? this.meta.propagation_seconds : ''; - }, - dns_plugins: dns_providers, - }, - - onRender: function () { - let view = this; - - // Certificates - this.ui.le_error_info.hide(); - this.ui.dns_challenge_content.hide(); - this.ui.credentials_file_content.hide(); - this.ui.letsencrypt.hide(); - this.ui.certificate_select.selectize({ - valueField: 'id', - labelField: 'nice_name', - searchField: ['nice_name', 'domain_names'], - create: false, - preload: true, - allowEmptyOption: true, - render: { - option: function (item) { - item.i18n = App.i18n; - item.formatDbDate = Helpers.formatDbDate; - return certListItemTemplate(item); - } - }, - load: function (query, callback) { - App.Api.Nginx.Certificates.getAll() - .then(rows => { - callback(rows); - }) - .catch(err => { - console.error(err); - callback(); - }); - }, - onLoad: function () { - view.ui.certificate_select[0].selectize.setValue(view.model.get('certificate_id')); - } - }); - }, - - initialize: function (options) { - if (typeof options.model === 'undefined' || !options.model) { - this.model = new StreamModel.Model(); - } - } -}); diff --git a/frontend/js/app/nginx/stream/list/item.ejs b/frontend/js/app/nginx/stream/list/item.ejs deleted file mode 100644 index 936247ef..00000000 --- a/frontend/js/app/nginx/stream/list/item.ejs +++ /dev/null @@ -1,59 +0,0 @@ - -
- -
- - -
- <%- incoming_port %> -
-
- <%- i18n('str', 'created-on', {date: formatDbDate(created_on, 'Do MMMM YYYY')}) %> -
- - -
<%- forwarding_host %>:<%- forwarding_port %>
- - -
- <% if (certificate) { %> - <%- i18n('streams', 'tcp+ssl') %> - <% } - else if (tcp_forwarding) { %> - <%- i18n('streams', 'tcp') %> - <% } - if (udp_forwarding) { %> - <%- i18n('streams', 'udp') %> - <% } %> -
- - -
<%- certificate && certificate_id ? i18n('ssl', certificate.provider) : i18n('all-hosts', 'none') %>
- - - <% - var o = isOnline(); - if (!enabled) { %> - <%- i18n('str', 'disabled') %> - <% } else if (o === true) { %> - <%- i18n('str', 'online') %> - <% } else if (o === false) { %> - <%- i18n('str', 'offline') %> - <% } else { %> - <%- i18n('str', 'unknown') %> - <% } %> - -<% if (canManage) { %> - - - -<% } %> \ No newline at end of file diff --git a/frontend/js/app/nginx/stream/list/item.js b/frontend/js/app/nginx/stream/list/item.js deleted file mode 100644 index a6892ee2..00000000 --- a/frontend/js/app/nginx/stream/list/item.js +++ /dev/null @@ -1,54 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../../main'); -const template = require('./item.ejs'); - -module.exports = Mn.View.extend({ - template: template, - tagName: 'tr', - - ui: { - able: 'a.able', - edit: 'a.edit', - delete: 'a.delete' - }, - - events: { - 'click @ui.able': function (e) { - e.preventDefault(); - let id = this.model.get('id'); - App.Api.Nginx.Streams[this.model.get('enabled') ? 'disable' : 'enable'](id) - .then(() => { - return App.Api.Nginx.Streams.get(id) - .then(row => { - this.model.set(row); - }); - }); - }, - - 'click @ui.edit': function (e) { - e.preventDefault(); - App.Controller.showNginxStreamForm(this.model); - }, - - 'click @ui.delete': function (e) { - e.preventDefault(); - App.Controller.showNginxStreamDeleteConfirm(this.model); - } - }, - - templateContext: { - canManage: App.Cache.User.canManage('streams'), - - isOnline: function () { - return typeof this.meta.nginx_online === 'undefined' ? null : this.meta.nginx_online; - }, - - getOfflineError: function () { - return this.meta.nginx_err || ''; - } - }, - - initialize: function () { - this.listenTo(this.model, 'change', this.render); - } -}); diff --git a/frontend/js/app/nginx/stream/list/main.ejs b/frontend/js/app/nginx/stream/list/main.ejs deleted file mode 100644 index 57ab6b2a..00000000 --- a/frontend/js/app/nginx/stream/list/main.ejs +++ /dev/null @@ -1,14 +0,0 @@ - -   - <%- i18n('streams', 'incoming-port') %> - <%- i18n('str', 'destination') %> - <%- i18n('streams', 'protocol') %> - <%- i18n('str', 'ssl') %> - <%- i18n('str', 'status') %> - <% if (canManage) { %> -   - <% } %> - - - - diff --git a/frontend/js/app/nginx/stream/list/main.js b/frontend/js/app/nginx/stream/list/main.js deleted file mode 100644 index 36be621d..00000000 --- a/frontend/js/app/nginx/stream/list/main.js +++ /dev/null @@ -1,32 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../../main'); -const ItemView = require('./item'); -const template = require('./main.ejs'); - -const TableBody = Mn.CollectionView.extend({ - tagName: 'tbody', - childView: ItemView -}); - -module.exports = Mn.View.extend({ - tagName: 'table', - className: 'table table-hover table-outline table-vcenter card-table', - template: template, - - regions: { - body: { - el: 'tbody', - replaceElement: true - } - }, - - templateContext: { - canManage: App.Cache.User.canManage('streams') - }, - - onRender: function () { - this.showChildView('body', new TableBody({ - collection: this.collection - })); - } -}); diff --git a/frontend/js/app/nginx/stream/main.ejs b/frontend/js/app/nginx/stream/main.ejs deleted file mode 100644 index 7dc0dbe8..00000000 --- a/frontend/js/app/nginx/stream/main.ejs +++ /dev/null @@ -1,28 +0,0 @@ -
-
-
-

<%- i18n('streams', 'title') %>

-
- - - <% if (showAddButton) { %> - <%- i18n('streams', 'add') %> - <% } %> -
-
-
-
-
-
- -
-
-
-
diff --git a/frontend/js/app/nginx/stream/main.js b/frontend/js/app/nginx/stream/main.js deleted file mode 100644 index 83bdc15e..00000000 --- a/frontend/js/app/nginx/stream/main.js +++ /dev/null @@ -1,108 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const StreamModel = require('../../../models/stream'); -const ListView = require('./list/main'); -const ErrorView = require('../../error/main'); -const EmptyView = require('../../empty/main'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - id: 'nginx-stream', - template: template, - - ui: { - list_region: '.list-region', - add: '.add-item', - help: '.help', - dimmer: '.dimmer', - search: '.search-form', - query: 'input[name="source-query"]' - }, - - fetch: App.Api.Nginx.Streams.getAll, - - showData: function(response) { - this.showChildView('list_region', new ListView({ - collection: new StreamModel.Collection(response) - })); - }, - - showError: function(err) { - this.showChildView('list_region', new ErrorView({ - code: err.code, - message: err.message, - retry: function () { - App.Controller.showNginxStream(); - } - })); - - console.error(err); - }, - - showEmpty: function() { - let manage = App.Cache.User.canManage('streams'); - - this.showChildView('list_region', new EmptyView({ - title: App.i18n('streams', 'empty'), - subtitle: App.i18n('all-hosts', 'empty-subtitle', {manage: manage}), - link: manage ? App.i18n('streams', 'add') : null, - btn_color: 'blue', - permission: 'streams', - action: function () { - App.Controller.showNginxStreamForm(); - } - })); - }, - - regions: { - list_region: '@ui.list_region' - }, - - events: { - 'click @ui.add': function (e) { - e.preventDefault(); - App.Controller.showNginxStreamForm(); - }, - - 'click @ui.help': function (e) { - e.preventDefault(); - App.Controller.showHelp(App.i18n('streams', 'help-title'), App.i18n('streams', 'help-content')); - }, - - 'submit @ui.search': function (e) { - e.preventDefault(); - let query = this.ui.query.val(); - - this.fetch(['owner'], query) - .then(response => this.showData(response)) - .catch(err => { - this.showError(err); - }); - } - }, - - templateContext: { - showAddButton: App.Cache.User.canManage('streams') - }, - - onRender: function () { - let view = this; - - view.fetch(['owner', 'certificate']) - .then(response => { - if (!view.isDestroyed()) { - if (response && response.length) { - view.showData(response); - } else { - view.showEmpty(); - } - } - }) - .catch(err => { - view.showError(err); - }) - .then(() => { - view.ui.dimmer.removeClass('active'); - }); - } -}); diff --git a/frontend/js/app/router.js b/frontend/js/app/router.js deleted file mode 100644 index a036bfc5..00000000 --- a/frontend/js/app/router.js +++ /dev/null @@ -1,19 +0,0 @@ -const AppRouter = require('marionette.approuter'); -const Controller = require('./controller'); - -module.exports = AppRouter.default.extend({ - controller: Controller, - appRoutes: { - users: 'showUsers', - logout: 'logout', - 'nginx/proxy': 'showNginxProxy', - 'nginx/redirection': 'showNginxRedirection', - 'nginx/404': 'showNginxDead', - 'nginx/stream': 'showNginxStream', - 'nginx/access': 'showNginxAccess', - 'nginx/certificates': 'showNginxCertificates', - 'audit-log': 'showAuditLog', - 'settings': 'showSettings', - '*default': 'showDashboard' - } -}); diff --git a/frontend/js/app/settings/default-site/main.ejs b/frontend/js/app/settings/default-site/main.ejs deleted file mode 100644 index d74ac0bd..00000000 --- a/frontend/js/app/settings/default-site/main.ejs +++ /dev/null @@ -1,57 +0,0 @@ - diff --git a/frontend/js/app/settings/default-site/main.js b/frontend/js/app/settings/default-site/main.js deleted file mode 100644 index 06a45b8b..00000000 --- a/frontend/js/app/settings/default-site/main.js +++ /dev/null @@ -1,69 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const template = require('./main.ejs'); - -require('jquery-serializejson'); -require('selectize'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save', - options: '.option-item', - value: 'input[name="value"]', - redirect: '.redirect-input', - html: '.html-content' - }, - - events: { - 'change @ui.value': function (e) { - let val = this.ui.value.filter(':checked').val(); - this.ui.options.hide(); - this.ui.options.filter('.option-' + val).show(); - }, - - 'click @ui.save': function (e) { - e.preventDefault(); - - let val = this.ui.value.filter(':checked').val(); - - // Clear redirect field before validation - if (val !== 'redirect') { - this.ui.redirect.val('').attr('required', false); - } else { - this.ui.redirect.attr('required', true); - } - - this.ui.html.attr('required', val === 'html'); - - if (!this.ui.form[0].checkValidity()) { - $('').hide().appendTo(this.ui.form).click().remove(); - return; - } - - let view = this; - let data = this.ui.form.serializeJSON(); - data.id = this.model.get('id'); - - this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); - App.Api.Settings.update(data) - .then(result => { - view.model.set(result); - App.UI.closeModal(); - }) - .catch(err => { - alert(err.message); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - }); - } - }, - - onRender: function () { - this.ui.value.trigger('change'); - } -}); diff --git a/frontend/js/app/settings/list/item.ejs b/frontend/js/app/settings/list/item.ejs deleted file mode 100644 index 1623c4dc..00000000 --- a/frontend/js/app/settings/list/item.ejs +++ /dev/null @@ -1,21 +0,0 @@ - -
<%- i18n('settings', 'default-site') %>
-
- <%- i18n('settings', 'default-site-description') %> -
- - -
- <% if (id === 'default-site') { %> - <%- i18n('settings', 'default-site-' + value) %> - <% } %> -
- - - - \ No newline at end of file diff --git a/frontend/js/app/settings/list/item.js b/frontend/js/app/settings/list/item.js deleted file mode 100644 index 03f9ac05..00000000 --- a/frontend/js/app/settings/list/item.js +++ /dev/null @@ -1,23 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const template = require('./item.ejs'); - -module.exports = Mn.View.extend({ - template: template, - tagName: 'tr', - - ui: { - edit: 'a.edit' - }, - - events: { - 'click @ui.edit': function (e) { - e.preventDefault(); - App.Controller.showSettingForm(this.model); - } - }, - - initialize: function () { - this.listenTo(this.model, 'change', this.render); - } -}); diff --git a/frontend/js/app/settings/list/main.ejs b/frontend/js/app/settings/list/main.ejs deleted file mode 100644 index c96e923a..00000000 --- a/frontend/js/app/settings/list/main.ejs +++ /dev/null @@ -1,8 +0,0 @@ - - <%- i18n('str', 'name') %> - <%- i18n('str', 'value') %> -   - - - - diff --git a/frontend/js/app/settings/list/main.js b/frontend/js/app/settings/list/main.js deleted file mode 100644 index 9d3e26fb..00000000 --- a/frontend/js/app/settings/list/main.js +++ /dev/null @@ -1,27 +0,0 @@ -const Mn = require('backbone.marionette'); -const ItemView = require('./item'); -const template = require('./main.ejs'); - -const TableBody = Mn.CollectionView.extend({ - tagName: 'tbody', - childView: ItemView -}); - -module.exports = Mn.View.extend({ - tagName: 'table', - className: 'table table-hover table-outline table-vcenter card-table', - template: template, - - regions: { - body: { - el: 'tbody', - replaceElement: true - } - }, - - onRender: function () { - this.showChildView('body', new TableBody({ - collection: this.collection - })); - } -}); diff --git a/frontend/js/app/settings/main.ejs b/frontend/js/app/settings/main.ejs deleted file mode 100644 index 2b02769f..00000000 --- a/frontend/js/app/settings/main.ejs +++ /dev/null @@ -1,14 +0,0 @@ -
-
-
-

<%- i18n('settings', 'title') %>

-
-
-
-
-
- -
-
-
-
diff --git a/frontend/js/app/settings/main.js b/frontend/js/app/settings/main.js deleted file mode 100644 index 96b2941f..00000000 --- a/frontend/js/app/settings/main.js +++ /dev/null @@ -1,48 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../main'); -const SettingModel = require('../../models/setting'); -const ListView = require('./list/main'); -const ErrorView = require('../error/main'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - id: 'settings', - template: template, - - ui: { - list_region: '.list-region', - add: '.add-item', - dimmer: '.dimmer' - }, - - regions: { - list_region: '@ui.list_region' - }, - - onRender: function () { - let view = this; - - App.Api.Settings.getAll() - .then(response => { - if (!view.isDestroyed() && response && response.length) { - view.showChildView('list_region', new ListView({ - collection: new SettingModel.Collection(response) - })); - } - }) - .catch(err => { - view.showChildView('list_region', new ErrorView({ - code: err.code, - message: err.message, - retry: function () { - App.Controller.showSettings(); - } - })); - - console.error(err); - }) - .then(() => { - view.ui.dimmer.removeClass('active'); - }); - } -}); diff --git a/frontend/js/app/tokens.js b/frontend/js/app/tokens.js deleted file mode 100644 index 4a56bcab..00000000 --- a/frontend/js/app/tokens.js +++ /dev/null @@ -1,126 +0,0 @@ -const STORAGE_NAME = 'nginx-proxy-manager-tokens'; - -/** - * @returns {Array} - */ -const getStorageTokens = function () { - let json = window.localStorage.getItem(STORAGE_NAME); - if (json) { - try { - return JSON.parse(json); - } catch (err) { - return []; - } - } - - return []; -}; - -/** - * @param {Array} tokens - */ -const setStorageTokens = function (tokens) { - window.localStorage.setItem(STORAGE_NAME, JSON.stringify(tokens)); -}; - -const Tokens = { - - /** - * @returns {Number} - */ - getTokenCount: () => { - return getStorageTokens().length; - }, - - /** - * @returns {Object} t,n - */ - getTopToken: () => { - let tokens = getStorageTokens(); - if (tokens && tokens.length) { - return tokens[0]; - } - - return null; - }, - - /** - * @returns {String} - */ - getNextTokenName: () => { - let tokens = getStorageTokens(); - if (tokens && tokens.length > 1 && typeof tokens[1] !== 'undefined' && typeof tokens[1].n !== 'undefined') { - return tokens[1].n; - } - - return null; - }, - - /** - * - * @param {String} token - * @param {String} [name] - * @returns {Number} - */ - addToken: (token, name) => { - // Get top token and if it's the same, ignore this call - let top = Tokens.getTopToken(); - if (!top || top.t !== token) { - let tokens = getStorageTokens(); - tokens.unshift({t: token, n: name || null}); - setStorageTokens(tokens); - } - - return Tokens.getTokenCount(); - }, - - /** - * @param {String} token - * @returns {Boolean} - */ - setCurrentToken: token => { - let tokens = getStorageTokens(); - if (tokens.length) { - tokens[0].t = token; - setStorageTokens(tokens); - return true; - } - - return false; - }, - - /** - * @param {String} name - * @returns {Boolean} - */ - setCurrentName: name => { - let tokens = getStorageTokens(); - if (tokens.length) { - tokens[0].n = name; - setStorageTokens(tokens); - return true; - } - - return false; - }, - - /** - * @returns {Number} - */ - dropTopToken: () => { - let tokens = getStorageTokens(); - tokens.shift(); - setStorageTokens(tokens); - return tokens.length; - }, - - /** - * - */ - clearTokens: () => { - window.localStorage.removeItem(STORAGE_NAME); - } - -}; - -module.exports = Tokens; diff --git a/frontend/js/app/ui/footer/main.ejs b/frontend/js/app/ui/footer/main.ejs deleted file mode 100644 index 99c2630a..00000000 --- a/frontend/js/app/ui/footer/main.ejs +++ /dev/null @@ -1,16 +0,0 @@ -
- -
- <%- i18n('main', 'version', {version: getVersion()}) %> - <%= i18n('footer', 'copy', {url: 'https://jc21.com?utm_source=nginx-proxy-manager'}) %> - <%= i18n('footer', 'theme', {url: 'https://tabler.github.io/?utm_source=nginx-proxy-manager'}) %> -
-
diff --git a/frontend/js/app/ui/footer/main.js b/frontend/js/app/ui/footer/main.js deleted file mode 100644 index 73f515e6..00000000 --- a/frontend/js/app/ui/footer/main.js +++ /dev/null @@ -1,14 +0,0 @@ -const Mn = require('backbone.marionette'); -const template = require('./main.ejs'); -const Cache = require('../../cache'); - -module.exports = Mn.View.extend({ - className: 'container', - template: template, - - templateContext: { - getVersion: function () { - return Cache.version || '0.0.0'; - } - } -}); diff --git a/frontend/js/app/ui/header/main.ejs b/frontend/js/app/ui/header/main.ejs deleted file mode 100644 index 18ed2b6a..00000000 --- a/frontend/js/app/ui/header/main.ejs +++ /dev/null @@ -1,34 +0,0 @@ - diff --git a/frontend/js/app/ui/header/main.js b/frontend/js/app/ui/header/main.js deleted file mode 100644 index 9779b45c..00000000 --- a/frontend/js/app/ui/header/main.js +++ /dev/null @@ -1,67 +0,0 @@ -const $ = require('jquery'); -const Mn = require('backbone.marionette'); -const i18n = require('../../i18n'); -const Cache = require('../../cache'); -const Controller = require('../../controller'); -const Tokens = require('../../tokens'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - id: 'header', - className: 'header', - template: template, - - ui: { - link: 'a', - details: 'a.edit-details', - password: 'a.change-password' - }, - - events: { - 'click @ui.details': function (e) { - e.preventDefault(); - Controller.showUserForm(Cache.User); - }, - - 'click @ui.password': function (e) { - e.preventDefault(); - Controller.showUserPasswordForm(Cache.User); - }, - - 'click @ui.link': function (e) { - e.preventDefault(); - let href = $(e.currentTarget).attr('href'); - - switch (href) { - case '/': - Controller.showDashboard(); - break; - case '/logout': - Controller.logout(); - break; - } - } - }, - - templateContext: { - getUserField: function (field, default_val) { - return Cache.User.get(field) || default_val; - }, - - getRole: function () { - return i18n('roles', Cache.User.isAdmin() ? 'admin' : 'user'); - }, - - getLogoutText: function () { - if (Tokens.getTokenCount() > 1) { - return i18n('main', 'sign-in-as', {name: Tokens.getNextTokenName()}); - } - - return i18n('str', 'sign-out'); - } - }, - - initialize: function () { - this.listenTo(Cache.User, 'change', this.render); - } -}); diff --git a/frontend/js/app/ui/main.ejs b/frontend/js/app/ui/main.ejs deleted file mode 100644 index b62c3acd..00000000 --- a/frontend/js/app/ui/main.ejs +++ /dev/null @@ -1,21 +0,0 @@ -
- -
-
- -
-
-
- -
- -
- - diff --git a/frontend/js/app/ui/main.js b/frontend/js/app/ui/main.js deleted file mode 100644 index c90c61d5..00000000 --- a/frontend/js/app/ui/main.js +++ /dev/null @@ -1,98 +0,0 @@ -const Mn = require('backbone.marionette'); -const template = require('./main.ejs'); -const HeaderView = require('./header/main'); -const MenuView = require('./menu/main'); -const FooterView = require('./footer/main'); -const Cache = require('../cache'); - -module.exports = Mn.View.extend({ - id: 'app', - className: 'page', - template: template, - modal_setup: false, - - modal: null, - - ui: { - modal: '#modal-dialog' - }, - - regions: { - header_region: { - el: '#header', - replaceElement: true - }, - menu_region: { - el: '#menu', - replaceElement: true - }, - footer_region: '.footer', - app_content_region: '#app-content', - modal_region: '#modal-dialog' - }, - - /** - * @param {Object} view - */ - showAppContent: function (view) { - this.showChildView('app_content_region', view); - }, - - /** - * @param {Object} view - * @param {Function} [show_callback] - * @param {Function} [shown_callback] - */ - showModalDialog: function (view, show_callback, shown_callback) { - this.showChildView('modal_region', view); - let modal = this.getRegion('modal_region').$el.modal('show'); - - modal.on('hidden.bs.modal', function (/*e*/) { - if (show_callback) { - modal.off('show.bs.modal', show_callback); - } - - if (shown_callback) { - modal.off('shown.bs.modal', shown_callback); - } - - modal.off('hidden.bs.modal'); - view.destroy(); - }); - - if (show_callback) { - modal.on('show.bs.modal', show_callback); - } - - if (shown_callback) { - modal.on('shown.bs.modal', shown_callback); - } - }, - - /** - * - * @param {Function} [hidden_callback] - */ - closeModal: function (hidden_callback) { - let modal = this.getRegion('modal_region').$el.modal('hide'); - - if (hidden_callback) { - modal.on('hidden.bs.modal', hidden_callback); - } - }, - - onRender: function () { - this.showChildView('header_region', new HeaderView({ - model: Cache.User - })); - - this.showChildView('menu_region', new MenuView()); - this.showChildView('footer_region', new FooterView()); - }, - - reset: function () { - this.getRegion('header_region').reset(); - this.getRegion('footer_region').reset(); - this.getRegion('modal_region').reset(); - } -}); diff --git a/frontend/js/app/ui/menu/main.ejs b/frontend/js/app/ui/menu/main.ejs deleted file mode 100644 index 671b4e3b..00000000 --- a/frontend/js/app/ui/menu/main.ejs +++ /dev/null @@ -1,52 +0,0 @@ -
-
-
- -
-
-
diff --git a/frontend/js/app/ui/menu/main.js b/frontend/js/app/ui/menu/main.js deleted file mode 100644 index dabe26d3..00000000 --- a/frontend/js/app/ui/menu/main.js +++ /dev/null @@ -1,39 +0,0 @@ -const $ = require('jquery'); -const Mn = require('backbone.marionette'); -const Controller = require('../../controller'); -const Cache = require('../../cache'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - id: 'menu', - className: 'header collapse d-lg-flex p-0', - template: template, - - ui: { - links: 'a' - }, - - events: { - 'click @ui.links': function (e) { - let href = $(e.currentTarget).attr('href'); - if (href !== '#') { - e.preventDefault(); - Controller.navigate(href, true); - } - } - }, - - templateContext: { - isAdmin: function () { - return Cache.User.isAdmin(); - }, - - canShow: function (perm) { - return Cache.User.isAdmin() || Cache.User.canView(perm); - } - }, - - initialize: function () { - this.listenTo(Cache.User, 'change', this.render); - } -}); diff --git a/frontend/js/app/user/delete.ejs b/frontend/js/app/user/delete.ejs deleted file mode 100644 index c10532ef..00000000 --- a/frontend/js/app/user/delete.ejs +++ /dev/null @@ -1,19 +0,0 @@ - diff --git a/frontend/js/app/user/delete.js b/frontend/js/app/user/delete.js deleted file mode 100644 index e8ed5c32..00000000 --- a/frontend/js/app/user/delete.js +++ /dev/null @@ -1,34 +0,0 @@ -const Mn = require('backbone.marionette'); -const template = require('./delete.ejs'); -const App = require('../main'); - -require('jquery-serializejson'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save' - }, - - events: { - - 'click @ui.save': function (e) { - e.preventDefault(); - - App.Api.Users.delete(this.model.get('id')) - .then(() => { - App.Controller.showUsers(); - App.UI.closeModal(); - }) - .catch(err => { - alert(err.message); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - }); - } - } -}); diff --git a/frontend/js/app/user/form.ejs b/frontend/js/app/user/form.ejs deleted file mode 100644 index 9ba84438..00000000 --- a/frontend/js/app/user/form.ejs +++ /dev/null @@ -1,58 +0,0 @@ - diff --git a/frontend/js/app/user/form.js b/frontend/js/app/user/form.js deleted file mode 100644 index 617a75fc..00000000 --- a/frontend/js/app/user/form.js +++ /dev/null @@ -1,108 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../main'); -const UserModel = require('../../models/user'); -const template = require('./form.ejs'); - -require('jquery-serializejson'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save', - error: '.secret-error' - }, - - events: { - - 'submit @ui.form': function (e) { - e.preventDefault(); - this.ui.error.hide(); - let view = this; - let data = this.ui.form.serializeJSON(); - - let show_password = this.model.get('email') === 'admin@example.com'; - - // admin@example.com is not allowed - if (data.email === 'admin@example.com') { - this.ui.error.text(App.i18n('users', 'default_error')).show(); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - return; - } - - // Manipulate - data.roles = []; - if ((this.model.get('id') === App.Cache.User.get('id') && this.model.isAdmin()) || (typeof data.is_admin !== 'undefined' && data.is_admin)) { - data.roles.push('admin'); - delete data.is_admin; - } - - data.is_disabled = typeof data.is_disabled !== 'undefined' ? !!data.is_disabled : false; - this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); - let method = App.Api.Users.create; - - if (this.model.get('id')) { - // edit - method = App.Api.Users.update; - data.id = this.model.get('id'); - } - - method(data) - .then(result => { - if (result.id === App.Cache.User.get('id')) { - App.Cache.User.set(result); - } - - if (view.model.get('id') !== App.Cache.User.get('id')) { - App.Controller.showUsers(); - } - - view.model.set(result); - App.UI.closeModal(function () { - if (method === App.Api.Users.create) { - // Show permissions dialog immediately - App.Controller.showUserPermissions(view.model); - } else if (show_password) { - App.Controller.showUserPasswordForm(view.model); - } - }); - }) - .catch(err => { - this.ui.error.text(err.message).show(); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - }); - } - }, - - templateContext: function () { - let view = this; - - return { - isSelf: function () { - return view.model.get('id') === App.Cache.User.get('id'); - }, - - isAdmin: function () { - return App.Cache.User.isAdmin(); - }, - - isAdminUser: function () { - return view.model.isAdmin(); - }, - - isDisabled: function () { - return view.model.isDisabled(); - } - }; - }, - - initialize: function (options) { - if (typeof options.model === 'undefined' || !options.model) { - this.model = new UserModel.Model(); - } - } -}); diff --git a/frontend/js/app/user/password.ejs b/frontend/js/app/user/password.ejs deleted file mode 100644 index a45cc7ed..00000000 --- a/frontend/js/app/user/password.ejs +++ /dev/null @@ -1,31 +0,0 @@ - diff --git a/frontend/js/app/user/password.js b/frontend/js/app/user/password.js deleted file mode 100644 index 84030750..00000000 --- a/frontend/js/app/user/password.js +++ /dev/null @@ -1,69 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../main'); -const template = require('./password.ejs'); - -require('jquery-serializejson'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save', - newSecretError: '.new-secret-error', - generalError: '#error-info', - }, - - events: { - 'click @ui.save': function (e) { - e.preventDefault(); - this.ui.newSecretError.hide(); - this.ui.generalError.hide(); - let form = this.ui.form.serializeJSON(); - - if (form.new_password1 !== form.new_password2) { - this.ui.newSecretError.text('Passwords do not match!').show(); - return; - } - - let data = { - type: 'password', - current: form.current_password, - secret: form.new_password1 - }; - - this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); - App.Api.Users.setPassword(this.model.get('id'), data) - .then(() => { - App.UI.closeModal(); - App.Controller.showUsers(); - }) - .catch(err => { - // Change error message to make it a little clearer - if (err.message === 'Invalid password') { - err.message = 'Current password is invalid'; - } - this.ui.generalError.text(err.message).show(); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - }); - } - }, - - isSelf: function () { - return App.Cache.User.get('id') === this.model.get('id'); - }, - - templateContext: function () { - return { - isSelf: this.isSelf.bind(this) - }; - }, - - onRender: function () { - this.ui.newSecretError.hide(); - this.ui.generalError.hide(); - }, -}); diff --git a/frontend/js/app/user/permissions.ejs b/frontend/js/app/user/permissions.ejs deleted file mode 100644 index b6161796..00000000 --- a/frontend/js/app/user/permissions.ejs +++ /dev/null @@ -1,68 +0,0 @@ - diff --git a/frontend/js/app/user/permissions.js b/frontend/js/app/user/permissions.js deleted file mode 100644 index af8049ce..00000000 --- a/frontend/js/app/user/permissions.js +++ /dev/null @@ -1,95 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../main'); -const UserModel = require('../../models/user'); -const template = require('./permissions.ejs'); - -require('jquery-serializejson'); - -module.exports = Mn.View.extend({ - template: template, - className: 'modal-dialog', - - ui: { - form: 'form', - buttons: '.modal-footer button', - cancel: 'button.cancel', - save: 'button.save', - error: '.secret-error' - }, - - events: { - - 'click @ui.save': function (e) { - e.preventDefault(); - - let view = this; - let data = this.ui.form.serializeJSON(); - - // Manipulate - if (view.model.isAdmin()) { - // Force some attributes for admin - data = _.assign({}, data, { - access_lists: 'manage', - dead_hosts: 'manage', - proxy_hosts: 'manage', - redirection_hosts: 'manage', - streams: 'manage', - certificates: 'manage' - }); - } - - this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); - - App.Api.Users.setPermissions(view.model.get('id'), data) - .then(() => { - if (view.model.get('id') === App.Cache.User.get('id')) { - App.Cache.User.set({permissions: data}); - } - - view.model.set({permissions: data}); - App.UI.closeModal(); - }) - .catch(err => { - this.ui.error.text(err.message).show(); - this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); - }); - } - }, - - templateContext: function () { - let perms = this.model.get('permissions'); - let is_admin = this.model.isAdmin(); - - return { - getPerm: function (key) { - if (perms !== null && typeof perms[key] !== 'undefined') { - return perms[key]; - } - - return null; - }, - - getPermProps: function (key, item, forced_admin) { - if (forced_admin && is_admin) { - return 'checked disabled'; - } else if (is_admin) { - return 'disabled'; - } else if (perms !== null && typeof perms[key] !== 'undefined' && perms[key] === item) { - return 'checked'; - } - - return ''; - }, - - isAdmin: function () { - return is_admin; - } - }; - }, - - initialize: function (options) { - if (typeof options.model === 'undefined' || !options.model) { - this.model = new UserModel.Model(); - } - } -}); diff --git a/frontend/js/app/users/list/item.ejs b/frontend/js/app/users/list/item.ejs deleted file mode 100644 index fab5585b..00000000 --- a/frontend/js/app/users/list/item.ejs +++ /dev/null @@ -1,45 +0,0 @@ - -
- -
- - -
<%- name %>
-
- <%- i18n('str', 'created-on', {date: formatDbDate(created_on, 'Do MMMM YYYY')}) %> -
- - -
<%- email %>
- - -
- <% - var r = []; - roles.map(function(role) { - if (role) { - r.push(i18n('roles', role)); - } - }); - %> - <%- r.join(', ') %> -
- - - - diff --git a/frontend/js/app/users/list/item.js b/frontend/js/app/users/list/item.js deleted file mode 100644 index 4645a5c4..00000000 --- a/frontend/js/app/users/list/item.js +++ /dev/null @@ -1,68 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../../main'); -const Tokens = require('../../tokens'); -const template = require('./item.ejs'); - -module.exports = Mn.View.extend({ - template: template, - tagName: 'tr', - - ui: { - edit: 'a.edit-user', - permissions: 'a.edit-permissions', - password: 'a.set-password', - login: 'a.login', - delete: 'a.delete-user' - }, - - events: { - 'click @ui.edit': function (e) { - e.preventDefault(); - App.Controller.showUserForm(this.model); - }, - - 'click @ui.permissions': function (e) { - e.preventDefault(); - App.Controller.showUserPermissions(this.model); - }, - - 'click @ui.password': function (e) { - e.preventDefault(); - App.Controller.showUserPasswordForm(this.model); - }, - - 'click @ui.delete': function (e) { - e.preventDefault(); - App.Controller.showUserDeleteConfirm(this.model); - }, - - 'click @ui.login': function (e) { - e.preventDefault(); - - if (App.Cache.User.get('id') !== this.model.get('id')) { - this.ui.login.prop('disabled', true).addClass('btn-disabled'); - - App.Api.Users.loginAs(this.model.get('id')) - .then(res => { - Tokens.addToken(res.token, res.user.nickname || res.user.name); - window.location = '/'; - window.location.reload(); - }) - .catch(err => { - alert(err.message); - this.ui.login.prop('disabled', false).removeClass('btn-disabled'); - }); - } - } - }, - - templateContext: { - isSelf: function () { - return App.Cache.User.get('id') === this.id; - } - }, - - initialize: function () { - this.listenTo(this.model, 'change', this.render); - } -}); diff --git a/frontend/js/app/users/list/main.ejs b/frontend/js/app/users/list/main.ejs deleted file mode 100644 index c85c9cb1..00000000 --- a/frontend/js/app/users/list/main.ejs +++ /dev/null @@ -1,10 +0,0 @@ - -   - <%- i18n('str', 'name') %> - <%- i18n('str', 'email') %> - <%- i18n('str', 'roles') %> -   - - - - diff --git a/frontend/js/app/users/list/main.js b/frontend/js/app/users/list/main.js deleted file mode 100644 index 9d3e26fb..00000000 --- a/frontend/js/app/users/list/main.js +++ /dev/null @@ -1,27 +0,0 @@ -const Mn = require('backbone.marionette'); -const ItemView = require('./item'); -const template = require('./main.ejs'); - -const TableBody = Mn.CollectionView.extend({ - tagName: 'tbody', - childView: ItemView -}); - -module.exports = Mn.View.extend({ - tagName: 'table', - className: 'table table-hover table-outline table-vcenter card-table', - template: template, - - regions: { - body: { - el: 'tbody', - replaceElement: true - } - }, - - onRender: function () { - this.showChildView('body', new TableBody({ - collection: this.collection - })); - } -}); diff --git a/frontend/js/app/users/main.ejs b/frontend/js/app/users/main.ejs deleted file mode 100644 index 892cb83f..00000000 --- a/frontend/js/app/users/main.ejs +++ /dev/null @@ -1,26 +0,0 @@ -
-
-
-

<%- i18n('users', 'title') %>

-
- - <%- i18n('users', 'add') %> -
-
-
-
-
-
- -
-
- -
-
diff --git a/frontend/js/app/users/main.js b/frontend/js/app/users/main.js deleted file mode 100644 index 42cb41ef..00000000 --- a/frontend/js/app/users/main.js +++ /dev/null @@ -1,78 +0,0 @@ -const Mn = require('backbone.marionette'); -const App = require('../main'); -const UserModel = require('../../models/user'); -const ListView = require('./list/main'); -const ErrorView = require('../error/main'); -const template = require('./main.ejs'); - -module.exports = Mn.View.extend({ - id: 'users', - template: template, - - ui: { - list_region: '.list-region', - add: '.add-item', - dimmer: '.dimmer', - search: '.search-form', - query: 'input[name="source-query"]' - }, - - fetch: App.Api.Users.getAll, - - showData: function(response) { - this.showChildView('list_region', new ListView({ - collection: new UserModel.Collection(response) - })); - }, - - showError: function(err) { - this.showChildView('list_region', new ErrorView({ - code: err.code, - message: err.message, - retry: function () { - App.Controller.showUsers(); - } - })); - - console.error(err); - }, - - regions: { - list_region: '@ui.list_region' - }, - - events: { - 'click @ui.add': function (e) { - e.preventDefault(); - App.Controller.showUserForm(new UserModel.Model()); - }, - - 'submit @ui.search': function (e) { - e.preventDefault(); - let query = this.ui.query.val(); - - this.fetch(['permissions'], query) - .then(response => this.showData(response)) - .catch(err => { - this.showError(err); - }); - } - }, - - onRender: function () { - let view = this; - - view.fetch(['permissions']) - .then(response => { - if (!view.isDestroyed() && response && response.length) { - view.showData(response); - } - }) - .catch(err => { - view.showError(err); - }) - .then(() => { - view.ui.dimmer.removeClass('active'); - }); - } -}); diff --git a/frontend/js/i18n/messages.json b/frontend/js/i18n/messages.json deleted file mode 100644 index d409942f..00000000 --- a/frontend/js/i18n/messages.json +++ /dev/null @@ -1,301 +0,0 @@ -{ - "en": { - "str": { - "email-address": "Email address", - "username": "Username", - "password": "Password", - "sign-in": "Sign in", - "sign-out": "Sign out", - "try-again": "Try again", - "name": "Name", - "email": "Email", - "roles": "Roles", - "created-on": "Created: {date}", - "save": "Save", - "cancel": "Cancel", - "close": "Close", - "enable": "Enable", - "disable": "Disable", - "sure": "Yes I'm Sure", - "disabled": "Disabled", - "choose-file": "Choose file", - "source": "Source", - "destination": "Destination", - "ssl": "SSL", - "access": "Access", - "public": "Public", - "edit": "Edit", - "delete": "Delete", - "logs": "Logs", - "status": "Status", - "online": "Online", - "offline": "Offline", - "unknown": "Unknown", - "expires": "Expires", - "value": "Value", - "please-wait": "Please wait...", - "all": "All", - "any": "Any" - }, - "login": { - "title": "Login to your account" - }, - "main": { - "app": "Nginx Proxy Manager", - "version": "v{version}", - "welcome": "Welcome to Nginx Proxy Manager", - "logged-in": "You are logged in as {name}", - "unknown-error": "Error loading stuff. Please reload the app.", - "unknown-user": "Unknown User", - "sign-in-as": "Sign back in as {name}" - }, - "roles": { - "title": "Roles", - "admin": "Administrator", - "user": "Apache Helicopter" - }, - "menu": { - "dashboard": "Dashboard", - "hosts": "Hosts" - }, - "footer": { - "fork-me": "Fork me on Github", - "copy": "© 2025 jc21.com.", - "theme": "Theme by Tabler" - }, - "dashboard": { - "title": "Hi {name}" - }, - "all-hosts": { - "empty-subtitle": "{manage, select, true{Why don't you create one?} other{And you don't have permission to create one.}}", - "details": "Details", - "enable-ssl": "Enable SSL", - "force-ssl": "Force SSL", - "http2-support": "HTTP/2 Support", - "domain-names": "Domain Names", - "cert-provider": "Certificate Provider", - "block-exploits": "Block Common Exploits", - "caching-enabled": "Cache Assets", - "ssl-certificate": "SSL Certificate", - "none": "None", - "new-cert": "Request a new SSL Certificate", - "with-le": "with Let's Encrypt", - "no-ssl": "This host will not use HTTPS", - "advanced": "Advanced", - "advanced-warning": "Enter your custom Nginx configuration here at your own risk!", - "advanced-config": "Custom Nginx Configuration", - "advanced-config-var-headline": "These proxy details are available as nginx variables:", - "advanced-config-header-info": "Please note, that any add_header or set_header directives added here will not be used by nginx. You will have to add a custom location '/' and add the header in the custom config there.", - "hsts-enabled": "HSTS Enabled", - "hsts-subdomains": "HSTS Subdomains", - "locations": "Custom locations" - }, - "locations": { - "new_location": "Add location", - "path": "/path", - "location_label": "Define location", - "delete": "Delete" - }, - "ssl": { - "letsencrypt": "Let's Encrypt", - "other": "Custom", - "none": "HTTP only", - "letsencrypt-email": "Email Address for Let's Encrypt", - "letsencrypt-agree": "I Agree to the Let's Encrypt Terms of Service", - "delete-ssl": "The SSL certificates attached will NOT be removed, they will need to be removed manually.", - "hosts-warning": "These domains must be already configured to point to this installation", - "no-wildcard-without-dns": "Cannot request Let's Encrypt Certificate for wildcard domains when not using DNS challenge", - "dns-challenge": "Use a DNS Challenge", - "certbot-warning": "This section requires some knowledge about Certbot and its DNS plugins. Please consult the respective plugins documentation.", - "dns-provider": "DNS Provider", - "please-choose": "Please Choose...", - "credentials-file-content": "Credentials File Content", - "credentials-file-content-info": "This plugin requires a configuration file containing an API token or other credentials to your provider", - "stored-as-plaintext-info": "This data will be stored as plaintext in the database and in a file!", - "propagation-seconds": "Propagation Seconds", - "propagation-seconds-info": "Leave empty to use the plugins default value. Number of seconds to wait for DNS propagation.", - "processing-info": "Processing... This might take a few minutes.", - "passphrase-protection-support-info": "Key files protected with a passphrase are not supported." - }, - "proxy-hosts": { - "title": "Proxy Hosts", - "empty": "There are no Proxy Hosts", - "add": "Add Proxy Host", - "form-title": "{id, select, undefined{New} other{Edit}} Proxy Host", - "forward-scheme": "Scheme", - "forward-host": "Forward Hostname / IP", - "forward-port": "Forward Port", - "delete": "Delete Proxy Host", - "delete-confirm": "Are you sure you want to delete the Proxy host for: {domains}?", - "help-title": "What is a Proxy Host?", - "help-content": "A Proxy Host is the incoming endpoint for a web service that you want to forward.\nIt provides optional SSL termination for your service that might not have SSL support built in.\nProxy Hosts are the most common use for the Nginx Proxy Manager.", - "access-list": "Access List", - "allow-websocket-upgrade": "Websockets Support", - "ignore-invalid-upstream-ssl": "Ignore Invalid SSL", - "custom-forward-host-help": "Add a path for sub-folder forwarding.\nExample: 203.0.113.25/path/", - "search": "Search Host…" - }, - "redirection-hosts": { - "title": "Redirection Hosts", - "empty": "There are no Redirection Hosts", - "add": "Add Redirection Host", - "form-title": "{id, select, undefined{New} other{Edit}} Redirection Host", - "forward-scheme": "Scheme", - "forward-http-status-code": "HTTP Code", - "forward-domain": "Forward Domain", - "preserve-path": "Preserve Path", - "delete": "Delete Redirection Host", - "delete-confirm": "Are you sure you want to delete the Redirection host for: {domains}?", - "help-title": "What is a Redirection Host?", - "help-content": "A Redirection Host will redirect requests from the incoming domain and push the viewer to another domain.\nThe most common reason to use this type of host is when your website changes domains but you still have search engine or referrer links pointing to the old domain.", - "search": "Search Host…" - }, - "dead-hosts": { - "title": "404 Hosts", - "empty": "There are no 404 Hosts", - "add": "Add 404 Host", - "form-title": "{id, select, undefined{New} other{Edit}} 404 Host", - "delete": "Delete 404 Host", - "delete-confirm": "Are you sure you want to delete this 404 Host?", - "help-title": "What is a 404 Host?", - "help-content": "A 404 Host is simply a host setup that shows a 404 page.\nThis can be useful when your domain is listed in search engines and you want to provide a nicer error page or specifically to tell the search indexers that the domain pages no longer exist.\nAnother benefit of having this host is to track the logs for hits to it and view the referrers.", - "search": "Search Host…" - }, - "streams": { - "title": "Streams", - "empty": "There are no Streams", - "add": "Add Stream", - "form-title": "{id, select, undefined{New} other{Edit}} Stream", - "incoming-port": "Incoming Port", - "forwarding-host": "Forward Host", - "forwarding-port": "Forward Port", - "tcp-forwarding": "TCP Forwarding", - "udp-forwarding": "UDP Forwarding", - "forward-type-error": "At least one type of protocol must be enabled", - "protocol": "Protocol", - "tcp": "TCP", - "udp": "UDP", - "delete": "Delete Stream", - "delete-confirm": "Are you sure you want to delete this Stream?", - "help-title": "What is a Stream?", - "help-content": "A relatively new feature for Nginx, a Stream will serve to forward TCP/UDP traffic directly to another computer on the network.\nIf you're running game servers, FTP or SSH servers this can come in handy.", - "search": "Search Incoming Port…", - "ssl-certificate": "SSL Certificate for TCP Forwarding", - "tcp+ssl": "TCP+SSL" - }, - "certificates": { - "title": "SSL Certificates", - "empty": "There are no SSL Certificates", - "add": "Add SSL Certificate", - "form-title": "Add {provider, select, letsencrypt{Let's Encrypt} other{Custom}} Certificate", - "delete": "Delete SSL Certificate", - "delete-confirm": "Are you sure you want to delete this SSL Certificate? Any hosts using it will need to be updated later.", - "help-title": "SSL Certificates", - "help-content": "SSL certificates (correctly known as TLS Certificates) are a form of encryption key which allows your site to be encrypted for the end user.\nNPM uses a service called Let's Encrypt to issue SSL certificates for free.\nIf you have any sort of personal information, passwords, or sensitive data behind NPM, it's probably a good idea to use a certificate.\nNPM also supports DNS authentication for if you're not running your site facing the internet, or if you just want a wildcard certificate.", - "other-certificate": "Certificate", - "other-certificate-key": "Certificate Key", - "other-intermediate-certificate": "Intermediate Certificate", - "force-renew": "Renew Now", - "test-reachability": "Test Server Reachability", - "reachability-title": "Test Server Reachability", - "reachability-info": "Test whether the domains are reachable from the public internet using Site24x7. This is not necessary when using the DNS Challenge.", - "reachability-failed-to-reach-api": "Communication with the API failed, is NPM running correctly?", - "reachability-failed-to-check": "Failed to check the reachability due to a communication error with site24x7.com.", - "reachability-ok": "Your server is reachable and creating certificates should be possible.", - "reachability-404": "There is a server found at this domain but it does not seem to be Nginx Proxy Manager. Please make sure your domain points to the IP where your NPM instance is running.", - "reachability-not-resolved": "There is no server available at this domain. Please make sure your domain exists and points to the IP where your NPM instance is running and if necessary port 80 is forwarded in your router.", - "reachability-wrong-data": "There is a server found at this domain but it returned an unexpected data. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.", - "reachability-other": "There is a server found at this domain but it returned an unexpected status code {code}. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.", - "download": "Download", - "renew-title": "Renew Let's Encrypt Certificate", - "search": "Search Certificate…", - "in-use" : "In use", - "inactive": "Inactive", - "active-domain_names": "Active domain names" - }, - "access-lists": { - "title": "Access Lists", - "empty": "There are no Access Lists", - "add": "Add Access List", - "form-title": "{id, select, undefined{New} other{Edit}} Access List", - "delete": "Delete Access List", - "delete-confirm": "Are you sure you want to delete this access list?", - "public": "Publicly Accessible", - "public-sub": "No Access Restrictions", - "help-title": "What is an Access List?", - "help-content": "Access Lists provide a blacklist or whitelist of specific client IP addresses along with authentication for the Proxy Hosts via Basic HTTP Authentication.\nYou can configure multiple client rules, usernames and passwords for a single Access List and then apply that to a Proxy Host.\nThis is most useful for forwarded web services that do not have authentication mechanisms built in or that you want to protect from access by unknown clients.", - "item-count": "{count} {count, select, 1{User} other{Users}}", - "client-count": "{count} {count, select, 1{Rule} other{Rules}}", - "proxy-host-count": "{count} {count, select, 1{Proxy Host} other{Proxy Hosts}}", - "delete-has-hosts": "This Access List is associated with {count} Proxy Hosts. They will become publicly available upon deletion.", - "details": "Details", - "authorization": "Authorization", - "access": "Access", - "satisfy": "Satisfy", - "satisfy-any": "Satisfy Any", - "pass-auth": "Pass Auth to Host", - "access-add": "Add", - "auth-add": "Add", - "search": "Search Access…" - }, - "users": { - "title": "Users", - "default_error": "Default email address must be changed", - "add": "Add User", - "nickname": "Nickname", - "full-name": "Full Name", - "edit-details": "Edit Details", - "change-password": "Change Password", - "edit-permissions": "Edit Permissions", - "sign-in-as": "Sign in as User", - "form-title": "{id, select, undefined{New} other{Edit}} User", - "delete": "Delete {name, select, undefined{User} other{{name}}}", - "delete-confirm": "Are you sure you want to delete {name}?", - "password-title": "Change Password{self, select, false{ for {name}} other{}}", - "current-password": "Current Password", - "new-password": "New Password", - "confirm-password": "Confirm Password", - "permissions-title": "Permissions for {name}", - "admin-perms": "This user is an Administrator and some items cannot be altered", - "perms-visibility": "Item Visibility", - "perms-visibility-user": "Created Items Only", - "perms-visibility-all": "All Items", - "perm-manage": "Manage", - "perm-view": "View Only", - "perm-hidden": "Hidden", - "search": "Search User…" - }, - "audit-log": { - "title": "Audit Log", - "empty": "There are no logs.", - "empty-subtitle": "As soon as you or another user changes something, history of those events will show up here.", - "proxy-host": "Proxy Host", - "redirection-host": "Redirection Host", - "dead-host": "404 Host", - "stream": "Stream", - "user": "User", - "certificate": "Certificate", - "access-list": "Access List", - "created": "Created {name}", - "updated": "Updated {name}", - "deleted": "Deleted {name}", - "enabled": "Enabled {name}", - "disabled": "Disabled {name}", - "renewed": "Renewed {name}", - "meta-title": "Details for Event", - "view-meta": "View Details", - "date": "Date", - "search": "Search Log…" - }, - "settings": { - "title": "Settings", - "default-site": "Default Site", - "default-site-description": "What to show when Nginx is hit with an unknown Host", - "default-site-congratulations": "Congratulations Page", - "default-site-404": "404 Page", - "default-site-444": "No Response (444)", - "default-site-html": "Custom Page", - "default-site-redirect": "Redirect" - } - } -} diff --git a/frontend/js/index.js b/frontend/js/index.js deleted file mode 100644 index 3d817d71..00000000 --- a/frontend/js/index.js +++ /dev/null @@ -1,119 +0,0 @@ -// This has to exist here so that Webpack picks it up -import '../scss/styles.scss'; - -window.tabler = { - colors: { - 'blue': '#467fcf', - 'blue-darkest': '#0e1929', - 'blue-darker': '#1c3353', - 'blue-dark': '#3866a6', - 'blue-light': '#7ea5dd', - 'blue-lighter': '#c8d9f1', - 'blue-lightest': '#edf2fa', - 'azure': '#45aaf2', - 'azure-darkest': '#0e2230', - 'azure-darker': '#1c4461', - 'azure-dark': '#3788c2', - 'azure-light': '#7dc4f6', - 'azure-lighter': '#c7e6fb', - 'azure-lightest': '#ecf7fe', - 'indigo': '#6574cd', - 'indigo-darkest': '#141729', - 'indigo-darker': '#282e52', - 'indigo-dark': '#515da4', - 'indigo-light': '#939edc', - 'indigo-lighter': '#d1d5f0', - 'indigo-lightest': '#f0f1fa', - 'purple': '#a55eea', - 'purple-darkest': '#21132f', - 'purple-darker': '#42265e', - 'purple-dark': '#844bbb', - 'purple-light': '#c08ef0', - 'purple-lighter': '#e4cff9', - 'purple-lightest': '#f6effd', - 'pink': '#f66d9b', - 'pink-darkest': '#31161f', - 'pink-darker': '#622c3e', - 'pink-dark': '#c5577c', - 'pink-light': '#f999b9', - 'pink-lighter': '#fcd3e1', - 'pink-lightest': '#fef0f5', - 'red': '#e74c3c', - 'red-darkest': '#2e0f0c', - 'red-darker': '#5c1e18', - 'red-dark': '#b93d30', - 'red-light': '#ee8277', - 'red-lighter': '#f8c9c5', - 'red-lightest': '#fdedec', - 'orange': '#fd9644', - 'orange-darkest': '#331e0e', - 'orange-darker': '#653c1b', - 'orange-dark': '#ca7836', - 'orange-light': '#feb67c', - 'orange-lighter': '#fee0c7', - 'orange-lightest': '#fff5ec', - 'yellow': '#f1c40f', - 'yellow-darkest': '#302703', - 'yellow-darker': '#604e06', - 'yellow-dark': '#c19d0c', - 'yellow-light': '#f5d657', - 'yellow-lighter': '#fbedb7', - 'yellow-lightest': '#fef9e7', - 'lime': '#7bd235', - 'lime-darkest': '#192a0b', - 'lime-darker': '#315415', - 'lime-dark': '#62a82a', - 'lime-light': '#a3e072', - 'lime-lighter': '#d7f2c2', - 'lime-lightest': '#f2fbeb', - 'green': '#5eba00', - 'green-darkest': '#132500', - 'green-darker': '#264a00', - 'green-dark': '#4b9500', - 'green-light': '#8ecf4d', - 'green-lighter': '#cfeab3', - 'green-lightest': '#eff8e6', - 'teal': '#2bcbba', - 'teal-darkest': '#092925', - 'teal-darker': '#11514a', - 'teal-dark': '#22a295', - 'teal-light': '#6bdbcf', - 'teal-lighter': '#bfefea', - 'teal-lightest': '#eafaf8', - 'cyan': '#17a2b8', - 'cyan-darkest': '#052025', - 'cyan-darker': '#09414a', - 'cyan-dark': '#128293', - 'cyan-light': '#5dbecd', - 'cyan-lighter': '#b9e3ea', - 'cyan-lightest': '#e8f6f8', - 'gray': '#868e96', - 'gray-darkest': '#1b1c1e', - 'gray-darker': '#36393c', - 'gray-light': '#aab0b6', - 'gray-lighter': '#dbdde0', - 'gray-lightest': '#f3f4f5', - 'gray-dark': '#343a40', - 'gray-dark-darkest': '#0a0c0d', - 'gray-dark-darker': '#15171a', - 'gray-dark-dark': '#2a2e33', - 'gray-dark-light': '#717579', - 'gray-dark-lighter': '#c2c4c6', - 'gray-dark-lightest': '#ebebec' - } -}; - -String.prototype.toHtmlEntities = function() { - return this.replace(/./gm, function(s) { - // return "&#" + s.charCodeAt(0) + ";"; - return (s.match(/[a-z0-9\s]+/i)) ? s : "&#" + s.charCodeAt(0) + ";"; - }); -}; - -require('tabler-core'); - -const App = require('./app/main'); - -$(document).ready(() => { - App.start(); -}); diff --git a/frontend/js/lib/helpers.js b/frontend/js/lib/helpers.js deleted file mode 100644 index 21ce7424..00000000 --- a/frontend/js/lib/helpers.js +++ /dev/null @@ -1,26 +0,0 @@ -const numeral = require('numeral'); -const moment = require('moment'); - -module.exports = { - - /** - * @param {Integer} number - * @returns {String} - */ - niceNumber: function (number) { - return numeral(number).format('0,0'); - }, - - /** - * @param {String|Number} date - * @param {String} format - * @returns {String} - */ - formatDbDate: function (date, format) { - if (typeof date === 'number') { - return moment.unix(date).format(format); - } - - return moment(date).format(format); - } -}; diff --git a/frontend/js/lib/marionette.js b/frontend/js/lib/marionette.js deleted file mode 100644 index c88368f8..00000000 --- a/frontend/js/lib/marionette.js +++ /dev/null @@ -1,15 +0,0 @@ -const _ = require('underscore'); -const Mn = require('backbone.marionette'); -const i18n = require('../app/i18n'); -const Helpers = require('./helpers'); -const TemplateCache = require('marionette.templatecache'); - -Mn.setRenderer(function (template, data, view) { - data = _.clone(data); - data.i18n = i18n; - data.formatDbDate = Helpers.formatDbDate; - - return TemplateCache.default.render.call(this, template, data, view); -}); - -module.exports = Mn; diff --git a/frontend/js/login.js b/frontend/js/login.js deleted file mode 100644 index 0094e2a2..00000000 --- a/frontend/js/login.js +++ /dev/null @@ -1,5 +0,0 @@ -const App = require('./login/main'); - -$(document).ready(() => { - App.start(); -}); diff --git a/frontend/js/login/main.js b/frontend/js/login/main.js deleted file mode 100644 index 03fdc7e5..00000000 --- a/frontend/js/login/main.js +++ /dev/null @@ -1,14 +0,0 @@ -const Mn = require('backbone.marionette'); -const LoginView = require('./ui/login'); - -const App = Mn.Application.extend({ - region: '#login', - UI: null, - - onStart: function (/*app, options*/) { - this.getRegion().show(new LoginView()); - } -}); - -const app = new App(); -module.exports = app; diff --git a/frontend/js/login/ui/login.ejs b/frontend/js/login/ui/login.ejs deleted file mode 100644 index 693bc050..00000000 --- a/frontend/js/login/ui/login.ejs +++ /dev/null @@ -1,37 +0,0 @@ -
-
- -
-
diff --git a/frontend/js/login/ui/login.js b/frontend/js/login/ui/login.js deleted file mode 100644 index 757eb4e3..00000000 --- a/frontend/js/login/ui/login.js +++ /dev/null @@ -1,42 +0,0 @@ -const $ = require('jquery'); -const Mn = require('backbone.marionette'); -const template = require('./login.ejs'); -const Api = require('../../app/api'); -const i18n = require('../../app/i18n'); - -module.exports = Mn.View.extend({ - template: template, - className: 'page-single', - - ui: { - form: 'form', - identity: 'input[name="identity"]', - secret: 'input[name="secret"]', - error: '.secret-error', - button: 'button' - }, - - events: { - 'submit @ui.form': function (e) { - e.preventDefault(); - this.ui.button.addClass('btn-loading').prop('disabled', true); - this.ui.error.hide(); - - Api.Tokens.login(this.ui.identity.val(), this.ui.secret.val(), true) - .then(() => { - window.location = '/'; - }) - .catch(err => { - this.ui.error.text(err.message).show(); - this.ui.button.removeClass('btn-loading').prop('disabled', false); - }); - } - }, - - templateContext: { - i18n: i18n, - getVersion: function () { - return $('#login').data('version'); - } - } -}); diff --git a/frontend/js/models/access-list.js b/frontend/js/models/access-list.js deleted file mode 100644 index 0c2c4abe..00000000 --- a/frontend/js/models/access-list.js +++ /dev/null @@ -1,25 +0,0 @@ -const Backbone = require('backbone'); - -const model = Backbone.Model.extend({ - idAttribute: 'id', - - defaults: function () { - return { - id: undefined, - created_on: null, - modified_on: null, - name: '', - items: [], - clients: [], - // The following are expansions: - owner: null - }; - } -}); - -module.exports = { - Model: model, - Collection: Backbone.Collection.extend({ - model: model - }) -}; diff --git a/frontend/js/models/audit-log.js b/frontend/js/models/audit-log.js deleted file mode 100644 index c929a0bd..00000000 --- a/frontend/js/models/audit-log.js +++ /dev/null @@ -1,18 +0,0 @@ -const Backbone = require('backbone'); - -const model = Backbone.Model.extend({ - idAttribute: 'id', - - defaults: function () { - return { - name: '' - }; - } -}); - -module.exports = { - Model: model, - Collection: Backbone.Collection.extend({ - model: model - }) -}; diff --git a/frontend/js/models/certificate.js b/frontend/js/models/certificate.js deleted file mode 100644 index c7d0b2d9..00000000 --- a/frontend/js/models/certificate.js +++ /dev/null @@ -1,38 +0,0 @@ -const Backbone = require('backbone'); - -const model = Backbone.Model.extend({ - idAttribute: 'id', - - defaults: function () { - return { - id: undefined, - created_on: null, - modified_on: null, - provider: '', - nice_name: '', - domain_names: [], - expires_on: null, - meta: {}, - // The following are expansions: - owner: null, - proxy_hosts: [], - redirection_hosts: [], - dead_hosts: [] - }; - }, - - /** - * @returns {Boolean} - */ - hasSslFiles: function () { - let meta = this.get('meta'); - return typeof meta['certificate'] !== 'undefined' && meta['certificate'] && typeof meta['certificate_key'] !== 'undefined' && meta['certificate_key']; - } -}); - -module.exports = { - Model: model, - Collection: Backbone.Collection.extend({ - model: model - }) -}; diff --git a/frontend/js/models/dead-host.js b/frontend/js/models/dead-host.js deleted file mode 100644 index 98ceef29..00000000 --- a/frontend/js/models/dead-host.js +++ /dev/null @@ -1,32 +0,0 @@ -const Backbone = require('backbone'); - -const model = Backbone.Model.extend({ - idAttribute: 'id', - - defaults: function () { - return { - id: undefined, - created_on: null, - modified_on: null, - domain_names: [], - certificate_id: 0, - ssl_forced: false, - http2_support: false, - hsts_enabled: false, - hsts_subdomains: false, - enabled: true, - meta: {}, - advanced_config: '', - // The following are expansions: - owner: null, - certificate: null - }; - } -}); - -module.exports = { - Model: model, - Collection: Backbone.Collection.extend({ - model: model - }) -}; diff --git a/frontend/js/models/proxy-host-location.js b/frontend/js/models/proxy-host-location.js deleted file mode 100644 index 2a35059f..00000000 --- a/frontend/js/models/proxy-host-location.js +++ /dev/null @@ -1,35 +0,0 @@ -const Backbone = require('backbone'); - -const model = Backbone.Model.extend({ - idAttribute: 'id', - - defaults: function() { - return { - opened: false, - path: '', - advanced_config: '', - forward_scheme: 'http', - forward_host: '', - forward_port: '80' - } - }, - - toJSON() { - const r = Object.assign({}, this.attributes); - delete r.opened; - return r; - }, - - toggleVisibility: function () { - this.save({ - opened: !this.get('opened') - }); - } -}) - -module.exports = { - Model: model, - Collection: Backbone.Collection.extend({ - model - }) -} \ No newline at end of file diff --git a/frontend/js/models/proxy-host.js b/frontend/js/models/proxy-host.js deleted file mode 100644 index b82d09fe..00000000 --- a/frontend/js/models/proxy-host.js +++ /dev/null @@ -1,40 +0,0 @@ -const Backbone = require('backbone'); - -const model = Backbone.Model.extend({ - idAttribute: 'id', - - defaults: function () { - return { - id: undefined, - created_on: null, - modified_on: null, - domain_names: [], - forward_scheme: 'http', - forward_host: '', - forward_port: null, - access_list_id: 0, - certificate_id: 0, - ssl_forced: false, - hsts_enabled: false, - hsts_subdomains: false, - caching_enabled: false, - allow_websocket_upgrade: false, - block_exploits: false, - http2_support: false, - advanced_config: '', - enabled: true, - meta: {}, - // The following are expansions: - owner: null, - access_list: null, - certificate: null - }; - } -}); - -module.exports = { - Model: model, - Collection: Backbone.Collection.extend({ - model: model - }) -}; diff --git a/frontend/js/models/redirection-host.js b/frontend/js/models/redirection-host.js deleted file mode 100644 index 1d0b0de2..00000000 --- a/frontend/js/models/redirection-host.js +++ /dev/null @@ -1,37 +0,0 @@ -const Backbone = require('backbone'); - -const model = Backbone.Model.extend({ - idAttribute: 'id', - - defaults: function () { - return { - id: undefined, - created_on: null, - modified_on: null, - domain_names: [], - forward_http_code: 0, - forward_scheme: null, - forward_domain_name: '', - preserve_path: true, - certificate_id: 0, - ssl_forced: false, - hsts_enabled: false, - hsts_subdomains: false, - block_exploits: false, - http2_support: false, - advanced_config: '', - enabled: true, - meta: {}, - // The following are expansions: - owner: null, - certificate: null - }; - } -}); - -module.exports = { - Model: model, - Collection: Backbone.Collection.extend({ - model: model - }) -}; diff --git a/frontend/js/models/setting.js b/frontend/js/models/setting.js deleted file mode 100644 index c70a4e9c..00000000 --- a/frontend/js/models/setting.js +++ /dev/null @@ -1,22 +0,0 @@ -const Backbone = require('backbone'); - -const model = Backbone.Model.extend({ - idAttribute: 'id', - - defaults: function () { - return { - id: undefined, - name: '', - description: '', - value: null, - meta: [] - }; - } -}); - -module.exports = { - Model: model, - Collection: Backbone.Collection.extend({ - model: model - }) -}; diff --git a/frontend/js/models/stream.js b/frontend/js/models/stream.js deleted file mode 100644 index 390c4fb0..00000000 --- a/frontend/js/models/stream.js +++ /dev/null @@ -1,32 +0,0 @@ -const Backbone = require('backbone'); - -const model = Backbone.Model.extend({ - idAttribute: 'id', - - defaults: function () { - return { - id: undefined, - created_on: null, - modified_on: null, - incoming_port: null, - forwarding_host: null, - forwarding_port: null, - tcp_forwarding: true, - udp_forwarding: false, - enabled: true, - meta: {}, - certificate_id: 0, - domain_names: [], - // The following are expansions: - owner: null, - certificate: null - }; - } -}); - -module.exports = { - Model: model, - Collection: Backbone.Collection.extend({ - model: model - }) -}; diff --git a/frontend/js/models/user.js b/frontend/js/models/user.js deleted file mode 100644 index a8e4ed9e..00000000 --- a/frontend/js/models/user.js +++ /dev/null @@ -1,54 +0,0 @@ -const _ = require('underscore'); -const Backbone = require('backbone'); - -const model = Backbone.Model.extend({ - idAttribute: 'id', - - defaults: function () { - return { - id: undefined, - name: '', - nickname: '', - email: '', - is_disabled: false, - roles: [], - permissions: null - }; - }, - - /** - * @returns {Boolean} - */ - isAdmin: function () { - return _.indexOf(this.get('roles'), 'admin') !== -1; - }, - - /** - * Checks if the perm has either `view` or `manage` value - * - * @param {String} item - * @returns {Boolean} - */ - canView: function (item) { - let permissions = this.get('permissions'); - return permissions !== null && typeof permissions[item] !== 'undefined' && ['view', 'manage'].indexOf(permissions[item]) !== -1; - }, - - /** - * Checks if the perm has `manage` value - * - * @param {String} item - * @returns {Boolean} - */ - canManage: function (item) { - let permissions = this.get('permissions'); - return permissions !== null && typeof permissions[item] !== 'undefined' && permissions[item] === 'manage'; - } -}); - -module.exports = { - Model: model, - Collection: Backbone.Collection.extend({ - model: model - }) -}; diff --git a/frontend/package.json b/frontend/package.json index 7347faa0..8117f959 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,47 +1,64 @@ { - "name": "nginx-proxy-manager", - "version": "0.0.0", - "description": "A beautiful interface for creating Nginx endpoints", - "main": "js/index.js", - "devDependencies": { - "@babel/core": "^7.9.0", - "babel-core": "^6.26.3", - "babel-loader": "^8.1.0", - "babel-preset-env": "^1.7.0", - "backbone": "^1.4.0", - "backbone.marionette": "^4.1.2", - "copy-webpack-plugin": "^5.1.1", - "css-loader": "^3.5.0", - "ejs-lint": "^1.0.1", - "ejs-loader": "^0.3.6", - "ejs-webpack-loader": "^2.2.2", - "file-loader": "^6.0.0", - "html-webpack-plugin": "^4.0.4", - "imports-loader": "^0.8.0", - "jquery": "^3.5.0", - "jquery-mask-plugin": "^1.14.16", - "jquery-serializejson": "^2.9.0", - "marionette.approuter": "^1.0.2", - "marionette.templatecache": "^1.0.0", - "messageformat": "^2.3.0", - "messageformat-loader": "^0.8.1", - "mini-css-extract-plugin": "^0.9.0", - "moment": "^2.30.1", - "sass": "^1.92.1", - "nodemon": "^2.0.2", - "numeral": "^2.0.6", - "sass-loader": "^10.0.0", - "style-loader": "^1.1.3", - "tabler-ui": "git+https://github.com/tabler/tabler.git#00f78ad823311bc3ad974ac3e5b0126198f0a813", - "underscore": "^1.12.1", - "webpack": "^4.42.1", - "webpack-cli": "^3.3.11", - "webpack-visualizer-plugin": "^0.1.11" - }, - "scripts": { - "build": "webpack --mode production", - "watch": "webpack --watch --mode development" - }, - "author": "Jamie Curnow ", - "license": "MIT" + "name": "nginx-proxy-manager", + "version": "2.0.0", + "type": "module", + "author": "Jamie Curnow ", + "license": "MIT", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "biome lint", + "preview": "vite preview", + "prettier": "biome format --write ./src", + "locale-extract": "formatjs extract 'src/**/*.tsx'", + "locale-compile": "formatjs compile-folder src/locale/src src/locale/lang", + "locale-sort": "./src/locale/scripts/locale-sort.sh", + "test": "vitest" + }, + "dependencies": { + "@tabler/core": "^1.4.0", + "@tabler/icons-react": "^3.35.0", + "@tanstack/react-query": "^5.89.0", + "@tanstack/react-table": "^8.21.3", + "@uiw/react-textarea-code-editor": "^3.1.1", + "classnames": "^2.5.1", + "country-flag-icons": "^1.5.20", + "date-fns": "^4.1.0", + "formik": "^2.4.6", + "generate-password-browser": "^1.1.0", + "humps": "^2.0.1", + "query-string": "^9.3.1", + "react": "^19.1.1", + "react-bootstrap": "^2.10.10", + "react-dom": "^19.1.1", + "react-intl": "^7.1.11", + "react-router-dom": "^7.9.1", + "react-select": "^5.10.2", + "react-toastify": "^11.0.5", + "rooks": "^9.3.0" + }, + "devDependencies": { + "@biomejs/biome": "^2.2.4", + "@formatjs/cli": "^6.7.2", + "@tanstack/react-query-devtools": "^5.89.0", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.8.0", + "@testing-library/react": "^16.3.0", + "@types/country-flag-icons": "^1.2.2", + "@types/humps": "^2.0.6", + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "@types/react-table": "^7.7.20", + "@vitejs/plugin-react": "^5.0.3", + "happy-dom": "^18.0.1", + "postcss": "^8.5.6", + "postcss-simple-vars": "^7.0.1", + "sass": "^1.93.0", + "tmp": "^0.2.5", + "typescript": "5.9.2", + "vite": "^7.1.6", + "vite-plugin-checker": "^0.10.3", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.2.4" + } } diff --git a/frontend/app-images/default-avatar.jpg b/frontend/public/images/default-avatar.jpg similarity index 100% rename from frontend/app-images/default-avatar.jpg rename to frontend/public/images/default-avatar.jpg diff --git a/frontend/app-images/favicons/android-chrome-192x192.png b/frontend/public/images/favicon/android-chrome-192x192.png similarity index 100% rename from frontend/app-images/favicons/android-chrome-192x192.png rename to frontend/public/images/favicon/android-chrome-192x192.png diff --git a/frontend/app-images/favicons/android-chrome-512x512.png b/frontend/public/images/favicon/android-chrome-512x512.png similarity index 100% rename from frontend/app-images/favicons/android-chrome-512x512.png rename to frontend/public/images/favicon/android-chrome-512x512.png diff --git a/frontend/app-images/favicons/apple-touch-icon.png b/frontend/public/images/favicon/apple-touch-icon.png similarity index 100% rename from frontend/app-images/favicons/apple-touch-icon.png rename to frontend/public/images/favicon/apple-touch-icon.png diff --git a/frontend/app-images/favicons/browserconfig.xml b/frontend/public/images/favicon/browserconfig.xml similarity index 100% rename from frontend/app-images/favicons/browserconfig.xml rename to frontend/public/images/favicon/browserconfig.xml diff --git a/frontend/app-images/favicons/favicon-16x16.png b/frontend/public/images/favicon/favicon-16x16.png similarity index 100% rename from frontend/app-images/favicons/favicon-16x16.png rename to frontend/public/images/favicon/favicon-16x16.png diff --git a/frontend/app-images/favicons/favicon-32x32.png b/frontend/public/images/favicon/favicon-32x32.png similarity index 100% rename from frontend/app-images/favicons/favicon-32x32.png rename to frontend/public/images/favicon/favicon-32x32.png diff --git a/frontend/app-images/favicons/favicon.ico b/frontend/public/images/favicon/favicon.ico similarity index 100% rename from frontend/app-images/favicons/favicon.ico rename to frontend/public/images/favicon/favicon.ico diff --git a/frontend/app-images/favicons/mstile-150x150.png b/frontend/public/images/favicon/mstile-150x150.png similarity index 100% rename from frontend/app-images/favicons/mstile-150x150.png rename to frontend/public/images/favicon/mstile-150x150.png diff --git a/frontend/app-images/favicons/safari-pinned-tab.svg b/frontend/public/images/favicon/safari-pinned-tab.svg similarity index 100% rename from frontend/app-images/favicons/safari-pinned-tab.svg rename to frontend/public/images/favicon/safari-pinned-tab.svg diff --git a/frontend/app-images/favicons/site.webmanifest b/frontend/public/images/favicon/site.webmanifest similarity index 100% rename from frontend/app-images/favicons/site.webmanifest rename to frontend/public/images/favicon/site.webmanifest diff --git a/frontend/app-images/logo-256.png b/frontend/public/images/logo-256.png similarity index 100% rename from frontend/app-images/logo-256.png rename to frontend/public/images/logo-256.png diff --git a/frontend/public/images/logo-bold-horizontal-grey.svg b/frontend/public/images/logo-bold-horizontal-grey.svg new file mode 100644 index 00000000..c87396f6 --- /dev/null +++ b/frontend/public/images/logo-bold-horizontal-grey.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/public/images/logo-no-text.svg b/frontend/public/images/logo-no-text.svg new file mode 100644 index 00000000..dc3c1163 --- /dev/null +++ b/frontend/public/images/logo-no-text.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/images/logo-text-horizontal-grey.png b/frontend/public/images/logo-text-horizontal-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..057a83d1b7a433e79f9d7b022488f29aee1c1e0c GIT binary patch literal 22203 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 L`njxgN@xNAgTP^N literal 0 HcmV?d00001 diff --git a/frontend/app-images/logo-text-vertical-grey.png b/frontend/public/images/logo-text-vertical-grey.png similarity index 100% rename from frontend/app-images/logo-text-vertical-grey.png rename to frontend/public/images/logo-text-vertical-grey.png diff --git a/frontend/public/images/unhealthy.svg b/frontend/public/images/unhealthy.svg new file mode 100644 index 00000000..6c39eeb1 --- /dev/null +++ b/frontend/public/images/unhealthy.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/scss/custom.scss b/frontend/scss/custom.scss deleted file mode 100644 index 4037dcf6..00000000 --- a/frontend/scss/custom.scss +++ /dev/null @@ -1,42 +0,0 @@ -$primary-color: #2bcbba; - -.loader { - color: $primary-color; -} - -a { - color: $primary-color; -} - -a:hover { - color: darken($primary-color, 10%); -} - -.dropdown-header { - padding-left: 1rem; -} - -.dropdown-item.active, .dropdown-item:active { - background-color: $primary-color; -} - -.custom-switch-input:checked ~ .custom-switch-indicator { - background: $primary-color; -} - -.min-100 { - min-height: 100px; -} - -.card-options .dropdown-menu a:not(.btn) { - margin-left: 0; -} - -.wrap { - display: flex; - flex-wrap: wrap; -} - -.col-login { - max-width: 48rem; -} \ No newline at end of file diff --git a/frontend/scss/fonts.scss b/frontend/scss/fonts.scss deleted file mode 100644 index f0ec1b73..00000000 --- a/frontend/scss/fonts.scss +++ /dev/null @@ -1,39 +0,0 @@ -/* source-sans-pro-regular - latin-ext_latin */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 400; - src: local(''), - url('../fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} - -/* source-sans-pro-italic - latin-ext_latin */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: italic; - font-weight: 400; - src: local(''), - url('../fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} - -/* source-sans-pro-700italic - latin-ext_latin */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: italic; - font-weight: 700; - src: local(''), - url('../fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} - -/* source-sans-pro-700 - latin-ext_latin */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 700; - src: local(''), - url('../fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('../fonts/source-sans-pro/source-sans-pro-v14-latin-ext_latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} diff --git a/frontend/scss/selectize.scss b/frontend/scss/selectize.scss deleted file mode 100644 index e12d5b69..00000000 --- a/frontend/scss/selectize.scss +++ /dev/null @@ -1,196 +0,0 @@ -.selectize-dropdown-header { - position: relative; - padding: 5px 8px; - background: #f8f8f8; - border-bottom: 1px solid #d0d0d0; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} - -.selectize-dropdown-header-close { - position: absolute; - top: 50%; - right: 8px; - margin-top: -12px; - font-size: 20px !important; - line-height: 20px; - color: #303030; - opacity: 0.4; -} - -.selectize-dropdown-header-close:hover { - color: #000000; -} - -.selectize-dropdown.plugin-optgroup_columns .optgroup { - float: left; - border-top: 0 none; - border-right: 1px solid #f2f2f2; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child { - border-right: 0 none; -} - -.selectize-dropdown.plugin-optgroup_columns .optgroup:before { - display: none; -} - -.selectize-dropdown.plugin-optgroup_columns .optgroup-header { - border-top: 0 none; -} - -.selectize-control.plugin-remove_button [data-value] { - position: relative; - padding-right: 24px !important; -} - -.selectize-control.plugin-remove_button [data-value] .remove { - position: absolute; - top: 0; - right: 0; - bottom: 0; - display: inline-block; - width: 17px; - padding: 2px 0 0 0; - font-size: 12px; - font-weight: bold; - color: inherit; - text-align: center; - text-decoration: none; - vertical-align: middle; - border-left: 1px solid #0073bb; - -webkit-border-radius: 0 2px 2px 0; - -moz-border-radius: 0 2px 2px 0; - border-radius: 0 2px 2px 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.selectize-control.plugin-remove_button [data-value] .remove:hover { - background: rgba(0, 0, 0, 0.05); -} - -.selectize-control.plugin-remove_button [data-value].active .remove { - border-left-color: #00578d; -} - -.selectize-control.plugin-remove_button .disabled [data-value] .remove:hover { - background: none; -} - -.selectize-control.plugin-remove_button .disabled [data-value] .remove { - border-left-color: #aaaaaa; -} - -.selectize-control { - position: relative; -} - -.selectize-dropdown { - font-family: inherit; - font-size: 13px; - -webkit-font-smoothing: inherit; - line-height: 18px; - color: #303030; -} - -.selectize-control.single { - display: inline-block; - cursor: text; - background: #ffffff; -} - -.selectize-dropdown { - position: absolute; - z-index: 10; - margin: -1px 0 0 0; - background: #ffffff; - border: 1px solid #d0d0d0; - border-top: 0 none; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.selectize-dropdown [data-selectable] { - overflow: hidden; - cursor: pointer; -} - -.selectize-dropdown [data-selectable] .highlight { - background: rgba(125, 168, 208, 0.2); - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; -} - -.selectize-dropdown [data-selectable], -.selectize-dropdown .optgroup-header { - padding: 5px 8px; -} - -.selectize-dropdown .optgroup:first-child .optgroup-header { - border-top: 0 none; -} - -.selectize-dropdown .optgroup-header { - color: #303030; - cursor: default; - background: #ffffff; -} - -.selectize-dropdown .active { - color: #495c68; - background-color: #f5fafd; -} - -.selectize-dropdown .active.create { - color: #495c68; -} - -.selectize-dropdown .create { - color: rgba(48, 48, 48, 0.5); -} - -.selectize-dropdown-content { - max-height: 200px; - overflow-x: hidden; - overflow-y: auto; - - .title { - font-weight: bold; - } - - .description { - padding-left: 16px; - } -} - -.selectize-dropdown .optgroup-header { - padding-top: 7px; - font-size: 0.85em; - font-weight: bold; -} - -.selectize-dropdown .optgroup { - border-top: 1px solid #f0f0f0; -} - -.selectize-dropdown .optgroup:first-child { - border-top: 0 none; -} - -.custom-select { - height: auto; -} diff --git a/frontend/scss/styles.scss b/frontend/scss/styles.scss deleted file mode 100644 index 52733097..00000000 --- a/frontend/scss/styles.scss +++ /dev/null @@ -1,17 +0,0 @@ -@import "~tabler-ui/dist/assets/css/dashboard"; -@import "tabler-extra"; -@import "fonts"; -@import "selectize"; -@import "custom"; - -/* Before any JS content is loaded */ -#app > .loader, #login > .loader, .container > .loader { - position: absolute; - left: 49%; - top: 40%; - display: block; -} - -.no-js-warning { - margin-top: 100px; -} diff --git a/frontend/scss/tabler-extra.scss b/frontend/scss/tabler-extra.scss deleted file mode 100644 index c56aedbc..00000000 --- a/frontend/scss/tabler-extra.scss +++ /dev/null @@ -1,171 +0,0 @@ -$teal: #2bcbba; -$yellow: #f1c40f; -$blue: #467fcf; -$pink: #f66d9b; - -.tag { - margin-bottom: .5em; - margin-right: .5em; -} - -.tag.hover-green:hover, .tag.hover-green:active, .tag.hover-green:focus { - background-color: #5eba00; - cursor: pointer; - color: #fff; -} - -.tag.hover-red:hover, .tag.hover-red:active, .tag.hover-red:focus { - background-color: #cd201f; - cursor: pointer; - color: #fff; -} - -/* For Card bodies where I don't want padding */ -.card-body.no-padding { - padding: 0; -} - -/* For some reason this class doesn't have 'display: flex' when it should. https://preview.tabler.io/docs/buttons.html#list-of-buttons */ -.btn-list { - display: flex; -} - -/* Teal Outline Buttons */ -.btn-outline-teal { - color: $teal; - background-color: transparent; - background-image: none; - border-color: $teal; -} - -.btn-outline-teal:hover { - color: #fff; - background-color: $teal; - border-color: $teal; -} - -.btn-outline-teal:not(:disabled):not(.disabled):active, .btn-outline-teal:not(:disabled):not(.disabled).active, .show > .btn-outline-teal.dropdown-toggle { - color: #fff; - background-color: $teal; - border-color: $teal; -} - -.tag.hover-teal:hover, .tag.hover-teal:active, .tag.hover-teal:focus { - background-color: $teal; - color: #fff; - cursor: pointer; -} - -/* Yellow Outline Buttons */ -.btn-outline-yellow { - color: $yellow; - background-color: transparent; - background-image: none; - border-color: $yellow; -} - -.btn-outline-yellow:hover { - color: #fff; - background-color: $yellow; - border-color: $yellow; -} - -.btn-outline-yellow:not(:disabled):not(.disabled):active, .btn-outline-yellow:not(:disabled):not(.disabled).active, .show > .btn-outline-yellow.dropdown-toggle { - color: #fff; - background-color: $yellow; - border-color: $yellow; -} - -.tag.hover-yellow:hover, .tag.hover-yellow:active, .tag.hover-yellow:focus { - background-color: $yellow; - cursor: pointer; - color: #fff; -} - -/* Blue Outline Buttons */ -.btn-outline-blue { - color: $blue; - background-color: transparent; - background-image: none; - border-color: $blue; -} - -.btn-outline-blue:hover { - color: #fff; - background-color: $blue; - border-color: $blue; -} - -.btn-outline-blue:not(:disabled):not(.disabled):active, .btn-outline-blue:not(:disabled):not(.disabled).active, .show > .btn-outline-blue.dropdown-toggle { - color: #fff; - background-color: $blue; - border-color: $blue; -} - -.tag.hover-blue:hover, .tag.hover-blue:active, .tag.hover-blue:focus { - background-color: $blue; - cursor: pointer; - color: #fff; -} - -/* Pink Outline Buttons */ -.btn-outline-pink { - color: $pink; - background-color: transparent; - background-image: none; - border-color: $pink; -} - -.btn-outline-pink:hover { - color: #fff; - background-color: $pink; - border-color: $pink; -} - -.btn-outline-pink:not(:disabled):not(.disabled):active, .btn-outline-pink:not(:disabled):not(.disabled).active, .show > .btn-outline-pink.dropdown-toggle { - color: #fff; - background-color: $pink; - border-color: $pink; -} - -.tag.hover-pink:hover, .tag.hover-pink:active, .tag.hover-pink:focus { - background-color: $pink; - cursor: pointer; -} - -/* dimmer */ - -.dimmer .loader { - margin-top: 50px; -} - -/* modal tabs */ - -.modal-body.has-tabs { - padding: 0; - - .nav-tabs { - margin: 0; - } - - .tab-content { - padding: 1rem; - } -} - -/* modal wide */ - -@media (min-width: 576px) { - .modal-dialog.wide { - max-width: 700px; - margin: 1.75rem auto; - } -} - - -/* Form mod */ - -textarea.form-control.text-monospace { - font-size: 12px; - font-family: monospace; -} diff --git a/frontend/src/App.css b/frontend/src/App.css new file mode 100644 index 00000000..1e642918 --- /dev/null +++ b/frontend/src/App.css @@ -0,0 +1,7 @@ +.modal-backdrop { + --tblr-backdrop-opacity: 0.8 !important; +} + +.domain-name { + font-family: monospace; +} diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 00000000..aa2fb873 --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,28 @@ +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; +import { RawIntlProvider } from "react-intl"; +import { AuthProvider, LocaleProvider, ThemeProvider } from "src/context"; +import { intl } from "src/locale"; +import Router from "src/Router.tsx"; + +// Create a client +const queryClient = new QueryClient(); + +function App() { + return ( + + + + + + + + + + + + + ); +} + +export default App; diff --git a/frontend/src/Router.tsx b/frontend/src/Router.tsx new file mode 100644 index 00000000..054b4400 --- /dev/null +++ b/frontend/src/Router.tsx @@ -0,0 +1,78 @@ +import { lazy, Suspense } from "react"; +import { BrowserRouter, Route, Routes } from "react-router-dom"; +import { + ErrorNotFound, + LoadingPage, + Page, + SiteContainer, + SiteFooter, + SiteHeader, + SiteMenu, + Unhealthy, +} from "src/components"; +import { useAuthState } from "src/context"; +import { useHealth } from "src/hooks"; + +const Dashboard = lazy(() => import("src/pages/Dashboard")); +const Login = lazy(() => import("src/pages/Login")); +const Settings = lazy(() => import("src/pages/Settings")); +const Certificates = lazy(() => import("src/pages/Certificates")); +const Access = lazy(() => import("src/pages/Access")); +const AuditLog = lazy(() => import("src/pages/AuditLog")); +const Users = lazy(() => import("src/pages/Users")); +const ProxyHosts = lazy(() => import("src/pages/Nginx/ProxyHosts")); +const RedirectionHosts = lazy(() => import("src/pages/Nginx/RedirectionHosts")); +const DeadHosts = lazy(() => import("src/pages/Nginx/DeadHosts")); +const Streams = lazy(() => import("src/pages/Nginx/Streams")); + +function Router() { + const health = useHealth(); + const { authenticated } = useAuthState(); + + if (health.isLoading) { + return ; + } + + if (health.isError || health.data?.status !== "OK") { + return ; + } + + if (!authenticated) { + return ( + }> + + + ); + } + + return ( + + +
+ + +
+ + }> + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + + +
+
+ ); +} + +export default Router; diff --git a/frontend/src/api/backend/base.ts b/frontend/src/api/backend/base.ts new file mode 100644 index 00000000..e15cd50e --- /dev/null +++ b/frontend/src/api/backend/base.ts @@ -0,0 +1,152 @@ +import { QueryClient } from "@tanstack/react-query"; +import { camelizeKeys, decamelize, decamelizeKeys } from "humps"; +import queryString, { type StringifiableRecord } from "query-string"; +import AuthStore from "src/modules/AuthStore"; + +const queryClient = new QueryClient(); +const contentTypeHeader = "Content-Type"; + +interface BuildUrlArgs { + url: string; + params?: StringifiableRecord; +} + +function decamelizeParams(params?: StringifiableRecord): StringifiableRecord | undefined { + if (!params) { + return undefined; + } + const result: StringifiableRecord = {}; + for (const [key, value] of Object.entries(params)) { + result[decamelize(key)] = value; + } + + return result; +} + +function buildUrl({ url, params }: BuildUrlArgs) { + const endpoint = url.replace(/^\/|\/$/g, ""); + const baseUrl = `/api/${endpoint}`; + const apiUrl = queryString.stringifyUrl({ + url: baseUrl, + query: decamelizeParams(params), + }); + return apiUrl; +} + +function buildAuthHeader(): Record | undefined { + if (AuthStore.token) { + return { Authorization: `Bearer ${AuthStore.token.token}` }; + } + return {}; +} + +function buildBody(data?: Record): string | undefined { + if (data) { + return JSON.stringify(decamelizeKeys(data)); + } +} + +async function processResponse(response: Response) { + const payload = await response.json(); + if (!response.ok) { + if (response.status === 401) { + // Force logout user and reload the page if Unauthorized + AuthStore.clear(); + queryClient.clear(); + window.location.reload(); + } + throw new Error( + typeof payload.error.messageI18n !== "undefined" ? payload.error.messageI18n : payload.error.message, + ); + } + return camelizeKeys(payload) as any; +} + +interface GetArgs { + url: string; + params?: queryString.StringifiableRecord; +} + +async function baseGet({ url, params }: GetArgs, abortController?: AbortController) { + const apiUrl = buildUrl({ url, params }); + const method = "GET"; + const headers = buildAuthHeader(); + const signal = abortController?.signal; + const response = await fetch(apiUrl, { method, headers, signal }); + return response; +} + +export async function get(args: GetArgs, abortController?: AbortController) { + return processResponse(await baseGet(args, abortController)); +} + +export async function download(args: GetArgs, abortController?: AbortController) { + return (await baseGet(args, abortController)).text(); +} + +interface PostArgs { + url: string; + params?: queryString.StringifiableRecord; + data?: any; +} + +export async function post({ url, params, data }: PostArgs, abortController?: AbortController) { + const apiUrl = buildUrl({ url, params }); + const method = "POST"; + + let headers = { + ...buildAuthHeader(), + }; + + let body: string | FormData | undefined; + // Check if the data is an instance of FormData + // If data is FormData, let the browser set the Content-Type header + if (data instanceof FormData) { + body = data; + } else { + // If data is JSON, set the Content-Type header to 'application/json' + headers = { + ...headers, + [contentTypeHeader]: "application/json", + }; + body = buildBody(data); + } + + const signal = abortController?.signal; + const response = await fetch(apiUrl, { method, headers, body, signal }); + return processResponse(response); +} + +interface PutArgs { + url: string; + params?: queryString.StringifiableRecord; + data?: Record; +} +export async function put({ url, params, data }: PutArgs, abortController?: AbortController) { + const apiUrl = buildUrl({ url, params }); + const method = "PUT"; + const headers = { + ...buildAuthHeader(), + [contentTypeHeader]: "application/json", + }; + const signal = abortController?.signal; + const body = buildBody(data); + const response = await fetch(apiUrl, { method, headers, body, signal }); + return processResponse(response); +} + +interface DeleteArgs { + url: string; + params?: queryString.StringifiableRecord; +} +export async function del({ url, params }: DeleteArgs, abortController?: AbortController) { + const apiUrl = buildUrl({ url, params }); + const method = "DELETE"; + const headers = { + ...buildAuthHeader(), + [contentTypeHeader]: "application/json", + }; + const signal = abortController?.signal; + const response = await fetch(apiUrl, { method, headers, signal }); + return processResponse(response); +} diff --git a/frontend/src/api/backend/createAccessList.ts b/frontend/src/api/backend/createAccessList.ts new file mode 100644 index 00000000..d90f7c97 --- /dev/null +++ b/frontend/src/api/backend/createAccessList.ts @@ -0,0 +1,13 @@ +import * as api from "./base"; +import type { AccessList } from "./models"; + +export async function createAccessList(item: AccessList, abortController?: AbortController): Promise { + return await api.post( + { + url: "/nginx/access-lists", + // todo: only use whitelist of fields for this data + data: item, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/createCertificate.ts b/frontend/src/api/backend/createCertificate.ts new file mode 100644 index 00000000..ba9655a3 --- /dev/null +++ b/frontend/src/api/backend/createCertificate.ts @@ -0,0 +1,13 @@ +import * as api from "./base"; +import type { Certificate } from "./models"; + +export async function createCertificate(item: Certificate, abortController?: AbortController): Promise { + return await api.post( + { + url: "/nginx/certificates", + // todo: only use whitelist of fields for this data + data: item, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/createDeadHost.ts b/frontend/src/api/backend/createDeadHost.ts new file mode 100644 index 00000000..ab090446 --- /dev/null +++ b/frontend/src/api/backend/createDeadHost.ts @@ -0,0 +1,13 @@ +import * as api from "./base"; +import type { DeadHost } from "./models"; + +export async function createDeadHost(item: DeadHost, abortController?: AbortController): Promise { + return await api.post( + { + url: "/nginx/dead-hosts", + // todo: only use whitelist of fields for this data + data: item, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/createProxyHost.ts b/frontend/src/api/backend/createProxyHost.ts new file mode 100644 index 00000000..6b548b87 --- /dev/null +++ b/frontend/src/api/backend/createProxyHost.ts @@ -0,0 +1,13 @@ +import * as api from "./base"; +import type { ProxyHost } from "./models"; + +export async function createProxyHost(item: ProxyHost, abortController?: AbortController): Promise { + return await api.post( + { + url: "/nginx/proxy-hosts", + // todo: only use whitelist of fields for this data + data: item, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/createRedirectionHost.ts b/frontend/src/api/backend/createRedirectionHost.ts new file mode 100644 index 00000000..ea73a226 --- /dev/null +++ b/frontend/src/api/backend/createRedirectionHost.ts @@ -0,0 +1,16 @@ +import * as api from "./base"; +import type { RedirectionHost } from "./models"; + +export async function createRedirectionHost( + item: RedirectionHost, + abortController?: AbortController, +): Promise { + return await api.post( + { + url: "/nginx/redirection-hosts", + // todo: only use whitelist of fields for this data + data: item, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/createStream.ts b/frontend/src/api/backend/createStream.ts new file mode 100644 index 00000000..c8a6cf1f --- /dev/null +++ b/frontend/src/api/backend/createStream.ts @@ -0,0 +1,13 @@ +import * as api from "./base"; +import type { Stream } from "./models"; + +export async function createStream(item: Stream, abortController?: AbortController): Promise { + return await api.post( + { + url: "/nginx/streams", + // todo: only use whitelist of fields for this data + data: item, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/createUser.ts b/frontend/src/api/backend/createUser.ts new file mode 100644 index 00000000..e6789d7f --- /dev/null +++ b/frontend/src/api/backend/createUser.ts @@ -0,0 +1,13 @@ +import * as api from "./base"; +import type { User } from "./models"; + +export async function createUser(item: User, abortController?: AbortController): Promise { + return await api.post( + { + url: "/users", + // todo: only use whitelist of fields for this data + data: item, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/deleteAccessList.ts b/frontend/src/api/backend/deleteAccessList.ts new file mode 100644 index 00000000..96b51dbf --- /dev/null +++ b/frontend/src/api/backend/deleteAccessList.ts @@ -0,0 +1,10 @@ +import * as api from "./base"; + +export async function deleteAccessList(id: number, abortController?: AbortController): Promise { + return await api.del( + { + url: `/nginx/access-lists/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/deleteCertificate.ts b/frontend/src/api/backend/deleteCertificate.ts new file mode 100644 index 00000000..97debf87 --- /dev/null +++ b/frontend/src/api/backend/deleteCertificate.ts @@ -0,0 +1,10 @@ +import * as api from "./base"; + +export async function deleteCertificate(id: number, abortController?: AbortController): Promise { + return await api.del( + { + url: `/nginx/certificates/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/deleteDeadHost.ts b/frontend/src/api/backend/deleteDeadHost.ts new file mode 100644 index 00000000..50ba6fa0 --- /dev/null +++ b/frontend/src/api/backend/deleteDeadHost.ts @@ -0,0 +1,10 @@ +import * as api from "./base"; + +export async function deleteDeadHost(id: number, abortController?: AbortController): Promise { + return await api.del( + { + url: `/nginx/dead-hosts/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/deleteProxyHost.ts b/frontend/src/api/backend/deleteProxyHost.ts new file mode 100644 index 00000000..f5ddc4d4 --- /dev/null +++ b/frontend/src/api/backend/deleteProxyHost.ts @@ -0,0 +1,10 @@ +import * as api from "./base"; + +export async function deleteProxyHost(id: number, abortController?: AbortController): Promise { + return await api.del( + { + url: `/nginx/proxy-hosts/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/deleteRedirectionHost.ts b/frontend/src/api/backend/deleteRedirectionHost.ts new file mode 100644 index 00000000..0fe5cc2d --- /dev/null +++ b/frontend/src/api/backend/deleteRedirectionHost.ts @@ -0,0 +1,10 @@ +import * as api from "./base"; + +export async function deleteRedirectionHost(id: number, abortController?: AbortController): Promise { + return await api.del( + { + url: `/nginx/redirection-hosts/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/deleteStream.ts b/frontend/src/api/backend/deleteStream.ts new file mode 100644 index 00000000..17871d13 --- /dev/null +++ b/frontend/src/api/backend/deleteStream.ts @@ -0,0 +1,10 @@ +import * as api from "./base"; + +export async function deleteStream(id: number, abortController?: AbortController): Promise { + return await api.del( + { + url: `/nginx/streams/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/deleteUser.ts b/frontend/src/api/backend/deleteUser.ts new file mode 100644 index 00000000..30faa701 --- /dev/null +++ b/frontend/src/api/backend/deleteUser.ts @@ -0,0 +1,10 @@ +import * as api from "./base"; + +export async function deleteUser(id: number, abortController?: AbortController): Promise { + return await api.del( + { + url: `/users/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/downloadCertificate.ts b/frontend/src/api/backend/downloadCertificate.ts new file mode 100644 index 00000000..aa980071 --- /dev/null +++ b/frontend/src/api/backend/downloadCertificate.ts @@ -0,0 +1,11 @@ +import * as api from "./base"; +import type { Binary } from "./responseTypes"; + +export async function downloadCertificate(id: number, abortController?: AbortController): Promise { + return await api.get( + { + url: `/nginx/certificates/${id}/download`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/getAccessList.ts b/frontend/src/api/backend/getAccessList.ts new file mode 100644 index 00000000..75fea51e --- /dev/null +++ b/frontend/src/api/backend/getAccessList.ts @@ -0,0 +1,11 @@ +import * as api from "./base"; +import type { AccessList } from "./models"; + +export async function getAccessList(id: number, abortController?: AbortController): Promise { + return await api.get( + { + url: `/nginx/access-lists/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/getAccessLists.ts b/frontend/src/api/backend/getAccessLists.ts new file mode 100644 index 00000000..96eaa91a --- /dev/null +++ b/frontend/src/api/backend/getAccessLists.ts @@ -0,0 +1,14 @@ +import * as api from "./base"; +import type { AccessList } from "./models"; + +export type AccessListExpansion = "owner" | "items" | "clients"; + +export async function getAccessLists(expand?: AccessListExpansion[], params = {}): Promise { + return await api.get({ + url: "/nginx/access-lists", + params: { + expand: expand?.join(","), + ...params, + }, + }); +} diff --git a/frontend/src/api/backend/getAuditLog.ts b/frontend/src/api/backend/getAuditLog.ts new file mode 100644 index 00000000..e798b8fb --- /dev/null +++ b/frontend/src/api/backend/getAuditLog.ts @@ -0,0 +1,12 @@ +import * as api from "./base"; +import type { AuditLog } from "./models"; + +export async function getAuditLog(expand?: string[], params = {}): Promise { + return await api.get({ + url: "/audit-log", + params: { + expand: expand?.join(","), + ...params, + }, + }); +} diff --git a/frontend/src/api/backend/getCertificate.ts b/frontend/src/api/backend/getCertificate.ts new file mode 100644 index 00000000..fc6a4c6d --- /dev/null +++ b/frontend/src/api/backend/getCertificate.ts @@ -0,0 +1,11 @@ +import * as api from "./base"; +import type { Certificate } from "./models"; + +export async function getCertificate(id: number, abortController?: AbortController): Promise { + return await api.get( + { + url: `/nginx/certificates/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/getCertificates.ts b/frontend/src/api/backend/getCertificates.ts new file mode 100644 index 00000000..15660b97 --- /dev/null +++ b/frontend/src/api/backend/getCertificates.ts @@ -0,0 +1,12 @@ +import * as api from "./base"; +import type { Certificate } from "./models"; + +export async function getCertificates(expand?: string[], params = {}): Promise { + return await api.get({ + url: "/nginx/certificates", + params: { + expand: expand?.join(","), + ...params, + }, + }); +} diff --git a/frontend/src/api/backend/getDeadHost.ts b/frontend/src/api/backend/getDeadHost.ts new file mode 100644 index 00000000..7759b094 --- /dev/null +++ b/frontend/src/api/backend/getDeadHost.ts @@ -0,0 +1,11 @@ +import * as api from "./base"; +import type { DeadHost } from "./models"; + +export async function getDeadHost(id: number, abortController?: AbortController): Promise { + return await api.get( + { + url: `/nginx/dead-hosts/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/getDeadHosts.ts b/frontend/src/api/backend/getDeadHosts.ts new file mode 100644 index 00000000..398221b6 --- /dev/null +++ b/frontend/src/api/backend/getDeadHosts.ts @@ -0,0 +1,14 @@ +import * as api from "./base"; +import type { DeadHost } from "./models"; + +export type DeadHostExpansion = "owner" | "certificate"; + +export async function getDeadHosts(expand?: DeadHostExpansion[], params = {}): Promise { + return await api.get({ + url: "/nginx/dead-hosts", + params: { + expand: expand?.join(","), + ...params, + }, + }); +} diff --git a/frontend/src/api/backend/getHealth.ts b/frontend/src/api/backend/getHealth.ts new file mode 100644 index 00000000..b423f5de --- /dev/null +++ b/frontend/src/api/backend/getHealth.ts @@ -0,0 +1,11 @@ +import * as api from "./base"; +import type { HealthResponse } from "./responseTypes"; + +export async function getHealth(abortController?: AbortController): Promise { + return await api.get( + { + url: "/", + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/getHostsReport.ts b/frontend/src/api/backend/getHostsReport.ts new file mode 100644 index 00000000..b396e291 --- /dev/null +++ b/frontend/src/api/backend/getHostsReport.ts @@ -0,0 +1,10 @@ +import * as api from "./base"; + +export async function getHostsReport(abortController?: AbortController): Promise> { + return await api.get( + { + url: "/reports/hosts", + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/getProxyHost.ts b/frontend/src/api/backend/getProxyHost.ts new file mode 100644 index 00000000..f51795ca --- /dev/null +++ b/frontend/src/api/backend/getProxyHost.ts @@ -0,0 +1,11 @@ +import * as api from "./base"; +import type { ProxyHost } from "./models"; + +export async function getProxyHost(id: number, abortController?: AbortController): Promise { + return await api.get( + { + url: `/nginx/proxy-hosts/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/getProxyHosts.ts b/frontend/src/api/backend/getProxyHosts.ts new file mode 100644 index 00000000..5db1779c --- /dev/null +++ b/frontend/src/api/backend/getProxyHosts.ts @@ -0,0 +1,14 @@ +import * as api from "./base"; +import type { ProxyHost } from "./models"; + +export type ProxyHostExpansion = "owner" | "access_list" | "certificate"; + +export async function getProxyHosts(expand?: ProxyHostExpansion[], params = {}): Promise { + return await api.get({ + url: "/nginx/proxy-hosts", + params: { + expand: expand?.join(","), + ...params, + }, + }); +} diff --git a/frontend/src/api/backend/getRedirectionHost.ts b/frontend/src/api/backend/getRedirectionHost.ts new file mode 100644 index 00000000..fa537130 --- /dev/null +++ b/frontend/src/api/backend/getRedirectionHost.ts @@ -0,0 +1,11 @@ +import * as api from "./base"; +import type { ProxyHost } from "./models"; + +export async function getRedirectionHost(id: number, abortController?: AbortController): Promise { + return await api.get( + { + url: `/nginx/redirection-hosts/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/getRedirectionHosts.ts b/frontend/src/api/backend/getRedirectionHosts.ts new file mode 100644 index 00000000..4e44c6ee --- /dev/null +++ b/frontend/src/api/backend/getRedirectionHosts.ts @@ -0,0 +1,16 @@ +import * as api from "./base"; +import type { RedirectionHost } from "./models"; + +export type RedirectionHostExpansion = "owner" | "certificate"; +export async function getRedirectionHosts( + expand?: RedirectionHostExpansion[], + params = {}, +): Promise { + return await api.get({ + url: "/nginx/redirection-hosts", + params: { + expand: expand?.join(","), + ...params, + }, + }); +} diff --git a/frontend/src/api/backend/getSetting.ts b/frontend/src/api/backend/getSetting.ts new file mode 100644 index 00000000..f04f7fad --- /dev/null +++ b/frontend/src/api/backend/getSetting.ts @@ -0,0 +1,11 @@ +import * as api from "./base"; +import type { Setting } from "./models"; + +export async function getSetting(id: string, abortController?: AbortController): Promise { + return await api.get( + { + url: `/settings/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/getSettings.ts b/frontend/src/api/backend/getSettings.ts new file mode 100644 index 00000000..b8e992c6 --- /dev/null +++ b/frontend/src/api/backend/getSettings.ts @@ -0,0 +1,12 @@ +import * as api from "./base"; +import type { Setting } from "./models"; + +export async function getSettings(expand?: string[], params = {}): Promise { + return await api.get({ + url: "/settings", + params: { + expand: expand?.join(","), + ...params, + }, + }); +} diff --git a/frontend/src/api/backend/getStream.ts b/frontend/src/api/backend/getStream.ts new file mode 100644 index 00000000..61927b68 --- /dev/null +++ b/frontend/src/api/backend/getStream.ts @@ -0,0 +1,11 @@ +import * as api from "./base"; +import type { Stream } from "./models"; + +export async function getStream(id: number, abortController?: AbortController): Promise { + return await api.get( + { + url: `/nginx/streams/${id}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/getStreams.ts b/frontend/src/api/backend/getStreams.ts new file mode 100644 index 00000000..8468a55d --- /dev/null +++ b/frontend/src/api/backend/getStreams.ts @@ -0,0 +1,14 @@ +import * as api from "./base"; +import type { Stream } from "./models"; + +export type StreamExpansion = "owner" | "certificate"; + +export async function getStreams(expand?: StreamExpansion[], params = {}): Promise { + return await api.get({ + url: "/nginx/streams", + params: { + expand: expand?.join(","), + ...params, + }, + }); +} diff --git a/frontend/src/api/backend/getToken.ts b/frontend/src/api/backend/getToken.ts new file mode 100644 index 00000000..be20e112 --- /dev/null +++ b/frontend/src/api/backend/getToken.ts @@ -0,0 +1,19 @@ +import * as api from "./base"; +import type { TokenResponse } from "./responseTypes"; + +interface Options { + payload: { + identity: string; + secret: string; + }; +} + +export async function getToken({ payload }: Options, abortController?: AbortController): Promise { + return await api.post( + { + url: "/tokens", + data: payload, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/getUser.ts b/frontend/src/api/backend/getUser.ts new file mode 100644 index 00000000..ae57783f --- /dev/null +++ b/frontend/src/api/backend/getUser.ts @@ -0,0 +1,10 @@ +import * as api from "./base"; +import type { User } from "./models"; + +export async function getUser(id: number | string = "me", params = {}): Promise { + const userId = id ? id : "me"; + return await api.get({ + url: `/users/${userId}`, + params, + }); +} diff --git a/frontend/src/api/backend/getUsers.ts b/frontend/src/api/backend/getUsers.ts new file mode 100644 index 00000000..a4a03f7c --- /dev/null +++ b/frontend/src/api/backend/getUsers.ts @@ -0,0 +1,14 @@ +import * as api from "./base"; +import type { User } from "./models"; + +export type UserExpansion = "permissions"; + +export async function getUsers(expand?: UserExpansion[], params = {}): Promise { + return await api.get({ + url: "/users", + params: { + expand: expand?.join(","), + ...params, + }, + }); +} diff --git a/frontend/src/api/backend/helpers.ts b/frontend/src/api/backend/helpers.ts new file mode 100644 index 00000000..8d977319 --- /dev/null +++ b/frontend/src/api/backend/helpers.ts @@ -0,0 +1,54 @@ +import { decamelize } from "humps"; + +/** + * This will convert a react-table sort object into + * a string that the backend api likes: + * name.asc,id.desc + */ +export function tableSortToAPI(sortBy: any): string | undefined { + if (sortBy?.length > 0) { + const strs: string[] = []; + sortBy.map((item: any) => { + strs.push(`${decamelize(item.id)}.${item.desc ? "desc" : "asc"}`); + return undefined; + }); + return strs.join(","); + } + return; +} + +/** + * This will convert a react-table filters object into + * a string that the backend api likes: + * name:contains=jam + */ +export function tableFiltersToAPI(filters: any[]): { [key: string]: string } { + const items: { [key: string]: string } = {}; + if (filters?.length > 0) { + filters.map((item: any) => { + items[`${decamelize(item.id)}:${item.value.modifier}`] = item.value.value; + return undefined; + }); + } + return items; +} + +/** + * Builds a filters object by removing entries with undefined, null, or empty string values. + * + */ +export function buildFilters(filters?: Record) { + if (!filters) { + return filters; + } + const result: Record = {}; + for (const key in filters) { + const value = filters[key]; + // If the value is undefined, null, or an empty string, skip it + if (value === undefined || value === null || value === "") { + continue; + } + result[key] = value.toString(); + } + return result; +} diff --git a/frontend/src/api/backend/index.ts b/frontend/src/api/backend/index.ts new file mode 100644 index 00000000..745ce3ce --- /dev/null +++ b/frontend/src/api/backend/index.ts @@ -0,0 +1,54 @@ +export * from "./createAccessList"; +export * from "./createCertificate"; +export * from "./createDeadHost"; +export * from "./createProxyHost"; +export * from "./createRedirectionHost"; +export * from "./createStream"; +export * from "./deleteAccessList"; +export * from "./deleteCertificate"; +export * from "./deleteDeadHost"; +export * from "./deleteProxyHost"; +export * from "./deleteRedirectionHost"; +export * from "./deleteStream"; +export * from "./deleteUser"; +export * from "./downloadCertificate"; +export * from "./getAccessList"; +export * from "./getAccessLists"; +export * from "./getAuditLog"; +export * from "./getCertificate"; +export * from "./getCertificates"; +export * from "./getDeadHost"; +export * from "./getDeadHosts"; +export * from "./getHealth"; +export * from "./getHostsReport"; +export * from "./getProxyHost"; +export * from "./getProxyHosts"; +export * from "./getRedirectionHost"; +export * from "./getRedirectionHosts"; +export * from "./getSetting"; +export * from "./getSettings"; +export * from "./getStream"; +export * from "./getStreams"; +export * from "./getToken"; +export * from "./getUser"; +export * from "./getUsers"; +export * from "./helpers"; +export * from "./models"; +export * from "./refreshToken"; +export * from "./renewCertificate"; +export * from "./responseTypes"; +export * from "./testHttpCertificate"; +export * from "./toggleDeadHost"; +export * from "./toggleProxyHost"; +export * from "./toggleRedirectionHost"; +export * from "./toggleStream"; +export * from "./updateAccessList"; +export * from "./updateAuth"; +export * from "./updateDeadHost"; +export * from "./updateProxyHost"; +export * from "./updateRedirectionHost"; +export * from "./updateSetting"; +export * from "./updateStream"; +export * from "./updateUser"; +export * from "./uploadCertificate"; +export * from "./validateCertificate"; diff --git a/frontend/src/api/backend/models.ts b/frontend/src/api/backend/models.ts new file mode 100644 index 00000000..4650849c --- /dev/null +++ b/frontend/src/api/backend/models.ts @@ -0,0 +1,193 @@ +export interface AppVersion { + major: number; + minor: number; + revision: number; +} + +export interface UserPermissions { + id: number; + createdOn: string; + modifiedOn: string; + userId: number; + visibility: string; + proxyHosts: string; + redirectionHosts: string; + deadHosts: string; + streams: string; + accessLists: string; + certificates: string; +} + +export interface User { + id: number; + createdOn: string; + modifiedOn: string; + isDisabled: boolean; + email: string; + name: string; + nickname: string; + avatar: string; + roles: string[]; + permissions?: UserPermissions; +} + +export interface AuditLog { + id: number; + createdOn: string; + modifiedOn: string; + userId: number; + objectType: string; + objectId: number; + action: string; + meta: Record; +} + +export interface AccessList { + id?: number; + createdOn?: string; + modifiedOn?: string; + ownerUserId: number; + name: string; + meta: Record; + satisfyAny: boolean; + passAuth: boolean; + proxyHostCount: number; + // Expansions: + owner?: User; + items?: AccessListItem[]; + clients?: AccessListClient[]; +} + +export interface AccessListItem { + id?: number; + createdOn?: string; + modifiedOn?: string; + accessListId?: number; + username: string; + password: string; + meta: Record; + hint: string; +} + +export type AccessListClient = { + id?: number; + createdOn?: string; + modifiedOn?: string; + accessListId?: number; + address: string; + directive: "allow" | "deny"; + meta: Record; +}; + +export interface Certificate { + id: number; + createdOn: string; + modifiedOn: string; + ownerUserId: number; + provider: string; + niceName: string; + domainNames: string[]; + expiresOn: string; + meta: Record; + owner?: User; + proxyHosts?: ProxyHost[]; + deadHosts?: DeadHost[]; + redirectionHosts?: RedirectionHost[]; +} + +export interface ProxyHost { + id: number; + createdOn: string; + modifiedOn: string; + ownerUserId: number; + domainNames: string[]; + forwardHost: string; + forwardPort: number; + accessListId: number; + certificateId: number; + sslForced: boolean; + cachingEnabled: boolean; + blockExploits: boolean; + advancedConfig: string; + meta: Record; + allowWebsocketUpgrade: boolean; + http2Support: boolean; + forwardScheme: string; + enabled: boolean; + locations: string[]; // todo: string or object? + hstsEnabled: boolean; + hstsSubdomains: boolean; + // Expansions: + owner?: User; + accessList?: AccessList; + certificate?: Certificate; +} + +export interface DeadHost { + id: number; + createdOn: string; + modifiedOn: string; + ownerUserId: number; + domainNames: string[]; + certificateId: number; + sslForced: boolean; + advancedConfig: string; + meta: Record; + http2Support: boolean; + enabled: boolean; + hstsEnabled: boolean; + hstsSubdomains: boolean; + // Expansions: + owner?: User; + certificate?: Certificate; +} + +export interface RedirectionHost { + id: number; + createdOn: string; + modifiedOn: string; + ownerUserId: number; + domainNames: string[]; + forwardDomainName: string; + preservePath: boolean; + certificateId: number; + sslForced: boolean; + blockExploits: boolean; + advancedConfig: string; + meta: Record; + http2Support: boolean; + forwardScheme: string; + forwardHttpCode: number; + enabled: boolean; + hstsEnabled: boolean; + hstsSubdomains: boolean; + // Expansions: + owner?: User; + certificate?: Certificate; +} + +export interface Stream { + id: number; + createdOn: string; + modifiedOn: string; + ownerUserId: number; + incomingPort: number; + forwardingHost: string; + forwardingPort: number; + tcpForwarding: boolean; + udpForwarding: boolean; + meta: Record; + enabled: boolean; + certificateId: number; + // Expansions: + owner?: User; + certificate?: Certificate; +} + +export interface Setting { + id: string; + name: string; + description: string; + value: string; + meta: Record; +} diff --git a/frontend/src/api/backend/refreshToken.ts b/frontend/src/api/backend/refreshToken.ts new file mode 100644 index 00000000..6502fdbe --- /dev/null +++ b/frontend/src/api/backend/refreshToken.ts @@ -0,0 +1,11 @@ +import * as api from "./base"; +import type { TokenResponse } from "./responseTypes"; + +export async function refreshToken(abortController?: AbortController): Promise { + return await api.get( + { + url: "/tokens", + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/renewCertificate.ts b/frontend/src/api/backend/renewCertificate.ts new file mode 100644 index 00000000..9eefff5d --- /dev/null +++ b/frontend/src/api/backend/renewCertificate.ts @@ -0,0 +1,11 @@ +import * as api from "./base"; +import type { Certificate } from "./models"; + +export async function renewCertificate(id: number, abortController?: AbortController): Promise { + return await api.post( + { + url: `/nginx/certificates/${id}/renew`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/responseTypes.ts b/frontend/src/api/backend/responseTypes.ts new file mode 100644 index 00000000..6e5e9abb --- /dev/null +++ b/frontend/src/api/backend/responseTypes.ts @@ -0,0 +1,18 @@ +import type { AppVersion } from "./models"; + +export interface HealthResponse { + status: string; + version: AppVersion; +} + +export interface TokenResponse { + expires: number; + token: string; +} + +export interface ValidatedCertificateResponse { + certificate: Record; + certificateKey: boolean; +} + +export type Binary = number & { readonly __brand: unique symbol }; diff --git a/frontend/src/api/backend/testHttpCertificate.ts b/frontend/src/api/backend/testHttpCertificate.ts new file mode 100644 index 00000000..c6e4eaf0 --- /dev/null +++ b/frontend/src/api/backend/testHttpCertificate.ts @@ -0,0 +1,16 @@ +import * as api from "./base"; + +export async function testHttpCertificate( + domains: string[], + abortController?: AbortController, +): Promise> { + return await api.get( + { + url: "/nginx/certificates/test-http", + params: { + domains: domains.join(","), + }, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/toggleDeadHost.ts b/frontend/src/api/backend/toggleDeadHost.ts new file mode 100644 index 00000000..967d65db --- /dev/null +++ b/frontend/src/api/backend/toggleDeadHost.ts @@ -0,0 +1,14 @@ +import * as api from "./base"; + +export async function toggleDeadHost( + id: number, + enabled: boolean, + abortController?: AbortController, +): Promise { + return await api.post( + { + url: `/nginx/dead-hosts/${id}/${enabled ? "enable" : "disable"}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/toggleProxyHost.ts b/frontend/src/api/backend/toggleProxyHost.ts new file mode 100644 index 00000000..2de3f2a5 --- /dev/null +++ b/frontend/src/api/backend/toggleProxyHost.ts @@ -0,0 +1,14 @@ +import * as api from "./base"; + +export async function toggleProxyHost( + id: number, + enabled: boolean, + abortController?: AbortController, +): Promise { + return await api.post( + { + url: `/nginx/proxy-hosts/${id}/${enabled ? "enable" : "disable"}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/toggleRedirectionHost.ts b/frontend/src/api/backend/toggleRedirectionHost.ts new file mode 100644 index 00000000..4f2fe41d --- /dev/null +++ b/frontend/src/api/backend/toggleRedirectionHost.ts @@ -0,0 +1,14 @@ +import * as api from "./base"; + +export async function toggleRedirectionHost( + id: number, + enabled: boolean, + abortController?: AbortController, +): Promise { + return await api.post( + { + url: `/nginx/redirection-hosts/${id}/${enabled ? "enable" : "disable"}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/toggleStream.ts b/frontend/src/api/backend/toggleStream.ts new file mode 100644 index 00000000..3f8e2e9e --- /dev/null +++ b/frontend/src/api/backend/toggleStream.ts @@ -0,0 +1,10 @@ +import * as api from "./base"; + +export async function toggleStream(id: number, enabled: boolean, abortController?: AbortController): Promise { + return await api.post( + { + url: `/nginx/streams/${id}/${enabled ? "enable" : "disable"}`, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/updateAccessList.ts b/frontend/src/api/backend/updateAccessList.ts new file mode 100644 index 00000000..cfae9389 --- /dev/null +++ b/frontend/src/api/backend/updateAccessList.ts @@ -0,0 +1,15 @@ +import * as api from "./base"; +import type { AccessList } from "./models"; + +export async function updateAccessList(item: AccessList, abortController?: AbortController): Promise { + // Remove readonly fields + const { id, createdOn: _, modifiedOn: __, ...data } = item; + + return await api.put( + { + url: `/nginx/access-lists/${id}`, + data: data, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/updateAuth.ts b/frontend/src/api/backend/updateAuth.ts new file mode 100644 index 00000000..c63dfeeb --- /dev/null +++ b/frontend/src/api/backend/updateAuth.ts @@ -0,0 +1,26 @@ +import * as api from "./base"; +import type { User } from "./models"; + +export async function updateAuth( + userId: number | "me", + newPassword: string, + current?: string, + abortController?: AbortController, +): Promise { + const data = { + type: "password", + current: current, + secret: newPassword, + }; + if (userId === "me") { + data.current = current; + } + + return await api.put( + { + url: `/users/${userId}/auth`, + data, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/updateDeadHost.ts b/frontend/src/api/backend/updateDeadHost.ts new file mode 100644 index 00000000..8afd44ab --- /dev/null +++ b/frontend/src/api/backend/updateDeadHost.ts @@ -0,0 +1,15 @@ +import * as api from "./base"; +import type { DeadHost } from "./models"; + +export async function updateDeadHost(item: DeadHost, abortController?: AbortController): Promise { + // Remove readonly fields + const { id, createdOn: _, modifiedOn: __, ...data } = item; + + return await api.put( + { + url: `/nginx/dead-hosts/${id}`, + data: data, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/updateProxyHost.ts b/frontend/src/api/backend/updateProxyHost.ts new file mode 100644 index 00000000..55cdc24c --- /dev/null +++ b/frontend/src/api/backend/updateProxyHost.ts @@ -0,0 +1,15 @@ +import * as api from "./base"; +import type { ProxyHost } from "./models"; + +export async function updateProxyHost(item: ProxyHost, abortController?: AbortController): Promise { + // Remove readonly fields + const { id, createdOn: _, modifiedOn: __, ...data } = item; + + return await api.put( + { + url: `/nginx/proxy-hosts/${id}`, + data: data, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/updateRedirectionHost.ts b/frontend/src/api/backend/updateRedirectionHost.ts new file mode 100644 index 00000000..e66aabb9 --- /dev/null +++ b/frontend/src/api/backend/updateRedirectionHost.ts @@ -0,0 +1,18 @@ +import * as api from "./base"; +import type { RedirectionHost } from "./models"; + +export async function updateRedirectionHost( + item: RedirectionHost, + abortController?: AbortController, +): Promise { + // Remove readonly fields + const { id, createdOn: _, modifiedOn: __, ...data } = item; + + return await api.put( + { + url: `/nginx/redirection-hosts/${id}`, + data: data, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/updateSetting.ts b/frontend/src/api/backend/updateSetting.ts new file mode 100644 index 00000000..e257528a --- /dev/null +++ b/frontend/src/api/backend/updateSetting.ts @@ -0,0 +1,15 @@ +import * as api from "./base"; +import type { Setting } from "./models"; + +export async function updateSetting(item: Setting, abortController?: AbortController): Promise { + // Remove readonly fields + const { id, ...data } = item; + + return await api.put( + { + url: `/settings/${id}`, + data: data, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/updateStream.ts b/frontend/src/api/backend/updateStream.ts new file mode 100644 index 00000000..18da6ff4 --- /dev/null +++ b/frontend/src/api/backend/updateStream.ts @@ -0,0 +1,15 @@ +import * as api from "./base"; +import type { Stream } from "./models"; + +export async function updateStream(item: Stream, abortController?: AbortController): Promise { + // Remove readonly fields + const { id, createdOn: _, modifiedOn: __, ...data } = item; + + return await api.put( + { + url: `/nginx/streams/${id}`, + data: data, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/updateUser.ts b/frontend/src/api/backend/updateUser.ts new file mode 100644 index 00000000..0df5c279 --- /dev/null +++ b/frontend/src/api/backend/updateUser.ts @@ -0,0 +1,15 @@ +import * as api from "./base"; +import type { User } from "./models"; + +export async function updateUser(item: User, abortController?: AbortController): Promise { + // Remove readonly fields + const { id, createdOn: _, modifiedOn: __, ...data } = item; + + return await api.put( + { + url: `/users/${id}`, + data: data, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/uploadCertificate.ts b/frontend/src/api/backend/uploadCertificate.ts new file mode 100644 index 00000000..6c920538 --- /dev/null +++ b/frontend/src/api/backend/uploadCertificate.ts @@ -0,0 +1,18 @@ +import * as api from "./base"; +import type { Certificate } from "./models"; + +export async function uploadCertificate( + id: number, + certificate: string, + certificateKey: string, + intermediateCertificate?: string, + abortController?: AbortController, +): Promise { + return await api.post( + { + url: `/nginx/certificates/${id}/upload`, + data: { certificate, certificateKey, intermediateCertificate }, + }, + abortController, + ); +} diff --git a/frontend/src/api/backend/validateCertificate.ts b/frontend/src/api/backend/validateCertificate.ts new file mode 100644 index 00000000..c4065076 --- /dev/null +++ b/frontend/src/api/backend/validateCertificate.ts @@ -0,0 +1,17 @@ +import * as api from "./base"; +import type { ValidatedCertificateResponse } from "./responseTypes"; + +export async function validateCertificate( + certificate: string, + certificateKey: string, + intermediateCertificate?: string, + abortController?: AbortController, +): Promise { + return await api.post( + { + url: "/nginx/certificates/validate", + data: { certificate, certificateKey, intermediateCertificate }, + }, + abortController, + ); +} diff --git a/frontend/src/components/Button.tsx b/frontend/src/components/Button.tsx new file mode 100644 index 00000000..6d02f931 --- /dev/null +++ b/frontend/src/components/Button.tsx @@ -0,0 +1,64 @@ +import cn from "classnames"; +import type { ReactNode } from "react"; + +interface Props { + children: ReactNode; + className?: string; + type?: "button" | "submit"; + actionType?: "primary" | "secondary" | "success" | "warning" | "danger" | "info" | "light" | "dark"; + variant?: "ghost" | "outline" | "pill" | "square" | "action"; + size?: "sm" | "md" | "lg" | "xl"; + fullWidth?: boolean; + isLoading?: boolean; + disabled?: boolean; + color?: + | "blue" + | "azure" + | "indigo" + | "purple" + | "pink" + | "red" + | "orange" + | "yellow" + | "lime" + | "green" + | "teal" + | "cyan"; + onClick?: () => void; +} +function Button({ + children, + className, + onClick, + type, + actionType, + variant, + size, + color, + fullWidth, + isLoading, + disabled, +}: Props) { + const myOnClick = () => { + !isLoading && onClick && onClick(); + }; + + const cns = cn( + "btn", + className, + actionType && `btn-${actionType}`, + variant && `btn-${variant}`, + size && `btn-${size}`, + color && `btn-${color}`, + fullWidth && "w-100", + isLoading && "btn-loading", + ); + + return ( + + ); +} + +export { Button }; diff --git a/frontend/src/components/ErrorNotFound.tsx b/frontend/src/components/ErrorNotFound.tsx new file mode 100644 index 00000000..ab864dad --- /dev/null +++ b/frontend/src/components/ErrorNotFound.tsx @@ -0,0 +1,23 @@ +import { intl } from "src/locale"; +import { useNavigate } from "react-router-dom"; +import { Button } from "src/components"; + +export function ErrorNotFound() { + const navigate = useNavigate(); + + return ( +
+
+

{intl.formatMessage({ id: "notfound.title" })}

+

+ {intl.formatMessage({ id: "notfound.text" })} +

+
+ +
+
+
+ ); +} diff --git a/frontend/src/components/Flag.tsx b/frontend/src/components/Flag.tsx new file mode 100644 index 00000000..420f6c8f --- /dev/null +++ b/frontend/src/components/Flag.tsx @@ -0,0 +1,24 @@ +import { IconWorld } from "@tabler/icons-react"; +import { hasFlag } from "country-flag-icons"; +// @ts-expect-error Creating a typing for a subfolder is not easily possible +import Flags from "country-flag-icons/react/3x2"; + +interface FlagProps { + className?: string; + countryCode: string; +} +function Flag({ className, countryCode }: FlagProps) { + countryCode = countryCode.toUpperCase(); + if (countryCode === "EN") { + return ; + } + + if (hasFlag(countryCode)) { + const FlagElement = Flags[countryCode] as any; + return ; + } + console.error(`No flag for country ${countryCode} found!`); + return null; +} + +export { Flag }; diff --git a/frontend/src/components/HasPermission.tsx b/frontend/src/components/HasPermission.tsx new file mode 100644 index 00000000..9b45e7f6 --- /dev/null +++ b/frontend/src/components/HasPermission.tsx @@ -0,0 +1,50 @@ +import type { ReactNode } from "react"; +import Alert from "react-bootstrap/Alert"; +import { useUser } from "src/hooks"; +import { intl } from "src/locale"; + +interface Props { + permission: string; + type: "manage" | "view"; + hideError?: boolean; + children?: ReactNode; +} +function HasPermission({ permission, type, children, hideError = false }: Props) { + const { data } = useUser("me"); + const perms = data?.permissions; + + let allowed = permission === ""; + const acceptable = ["manage", type]; + + switch (permission) { + case "admin": + allowed = data?.roles?.includes("admin") || false; + break; + case "proxyHosts": + allowed = acceptable.indexOf(perms?.proxyHosts || "") !== -1; + break; + case "redirectionHosts": + allowed = acceptable.indexOf(perms?.redirectionHosts || "") !== -1; + break; + case "deadHosts": + allowed = acceptable.indexOf(perms?.deadHosts || "") !== -1; + break; + case "streams": + allowed = acceptable.indexOf(perms?.streams || "") !== -1; + break; + case "accessLists": + allowed = acceptable.indexOf(perms?.accessLists || "") !== -1; + break; + case "certificates": + allowed = acceptable.indexOf(perms?.certificates || "") !== -1; + break; + } + + if (allowed) { + return <>{children}; + } + + return !hideError ? {intl.formatMessage({ id: "no-permission-error" })} : null; +} + +export { HasPermission }; diff --git a/frontend/src/components/LoadingPage.module.css b/frontend/src/components/LoadingPage.module.css new file mode 100644 index 00000000..7a13ded3 --- /dev/null +++ b/frontend/src/components/LoadingPage.module.css @@ -0,0 +1,3 @@ +.logo { + max-height: 100px; +} diff --git a/frontend/src/components/LoadingPage.tsx b/frontend/src/components/LoadingPage.tsx new file mode 100644 index 00000000..6be77ebb --- /dev/null +++ b/frontend/src/components/LoadingPage.tsx @@ -0,0 +1,27 @@ +import { Page } from "src/components"; +import { intl } from "src/locale"; +import styles from "./LoadingPage.module.css"; + +interface Props { + label?: string; + noLogo?: boolean; +} +export function LoadingPage({ label, noLogo }: Props) { + return ( + +
+
+ {noLogo ? null : ( +
+ +
+ )} +
{label || intl.formatMessage({ id: "loading" })}
+
+
+
+
+
+ + ); +} diff --git a/frontend/src/components/LocalePicker.module.css b/frontend/src/components/LocalePicker.module.css new file mode 100644 index 00000000..2233d2f8 --- /dev/null +++ b/frontend/src/components/LocalePicker.module.css @@ -0,0 +1,15 @@ +.darkBtn { + color: var(--tblr-light) !important; + &:hover { + border: var(--tblr-btn-border-width) solid transparent !important; + background: color-mix(in srgb, var(--tblr-btn-hover-bg) 10%, transparent) !important; + } +} + +.lightBtn { + color: var(--tblr-dark) !important; + &:hover { + border: var(--tblr-btn-border-width) solid transparent !important; + background: color-mix(in srgb, var(--tblr-btn-hover-bg) 10%, transparent) !important; + } +} diff --git a/frontend/src/components/LocalePicker.tsx b/frontend/src/components/LocalePicker.tsx new file mode 100644 index 00000000..ee4890cf --- /dev/null +++ b/frontend/src/components/LocalePicker.tsx @@ -0,0 +1,71 @@ +import cn from "classnames"; +import { Flag } from "src/components"; +import { useLocaleState } from "src/context"; +import { useTheme } from "src/hooks"; +import { changeLocale, getFlagCodeForLocale, intl, localeOptions } from "src/locale"; +import styles from "./LocalePicker.module.css"; + +function LocalePicker() { + const { locale, setLocale } = useLocaleState(); + const { getTheme } = useTheme(); + + const changeTo = (lang: string) => { + changeLocale(lang); + setLocale(lang); + location.reload(); + }; + + const classes = ["btn", "dropdown-toggle", "btn-sm"]; + let cns = cn(...classes, "btn-ghost-light", styles.lightBtn); + if (getTheme() === "dark") { + cns = cn(...classes, "btn-ghost-dark", styles.darkBtn); + } + + return ( + + ); + + //
+ // + // + // + // + // + // {localeOptions.map((item) => { + // return ( + // } + // onClick={() => changeTo(item[0])} + // key={`locale-${item[0]}`}> + // {intl.formatMessage({ id: `locale-${item[1]}` })} + // + // ); + // })} + // + // + // +} + +export { LocalePicker }; diff --git a/frontend/src/components/NavLink.tsx b/frontend/src/components/NavLink.tsx new file mode 100644 index 00000000..b6a414af --- /dev/null +++ b/frontend/src/components/NavLink.tsx @@ -0,0 +1,29 @@ +import { useNavigate } from "react-router-dom"; + +interface Props { + children: React.ReactNode; + to?: string; + isDropdownItem?: boolean; + onClick?: () => void; +} +export function NavLink({ children, to, isDropdownItem, onClick }: Props) { + const navigate = useNavigate(); + + return ( + { + e.preventDefault(); + if (onClick) { + onClick(); + } + if (to) { + navigate(to); + } + }} + > + {children} + + ); +} diff --git a/frontend/src/components/Page.module.css b/frontend/src/components/Page.module.css new file mode 100644 index 00000000..00086bba --- /dev/null +++ b/frontend/src/components/Page.module.css @@ -0,0 +1,5 @@ +.page { + display: grid; + grid-template-rows: auto 1fr auto; /* Header, Main Content, Footer */ + min-height: 100vh; +} diff --git a/frontend/src/components/Page.tsx b/frontend/src/components/Page.tsx new file mode 100644 index 00000000..a96a6b1f --- /dev/null +++ b/frontend/src/components/Page.tsx @@ -0,0 +1,10 @@ +import cn from "classnames"; +import styles from "./Page.module.css"; + +interface Props { + children: React.ReactNode; + className?: string; +} +export function Page({ children, className }: Props) { + return
{children}
; +} diff --git a/frontend/src/components/SiteContainer.tsx b/frontend/src/components/SiteContainer.tsx new file mode 100644 index 00000000..1722d88a --- /dev/null +++ b/frontend/src/components/SiteContainer.tsx @@ -0,0 +1,6 @@ +interface Props { + children: React.ReactNode; +} +export function SiteContainer({ children }: Props) { + return
{children}
; +} diff --git a/frontend/src/components/SiteFooter.tsx b/frontend/src/components/SiteFooter.tsx new file mode 100644 index 00000000..57bc8b74 --- /dev/null +++ b/frontend/src/components/SiteFooter.tsx @@ -0,0 +1,64 @@ +import { useHealth } from "src/hooks"; +import { intl } from "src/locale"; + +export function SiteFooter() { + const health = useHealth(); + + const getVersion = () => { + if (!health.data) { + return ""; + } + const v = health.data.version; + return `v${v.major}.${v.minor}.${v.revision}`; + }; + + return ( + + ); +} diff --git a/frontend/src/components/SiteHeader.module.css b/frontend/src/components/SiteHeader.module.css new file mode 100644 index 00000000..a88f81c9 --- /dev/null +++ b/frontend/src/components/SiteHeader.module.css @@ -0,0 +1,8 @@ +.logo { + font-size: 1.1rem; + font-weight: 500; + + img { + margin-right: 0.8rem; + } +} diff --git a/frontend/src/components/SiteHeader.tsx b/frontend/src/components/SiteHeader.tsx new file mode 100644 index 00000000..f3491fc3 --- /dev/null +++ b/frontend/src/components/SiteHeader.tsx @@ -0,0 +1,119 @@ +import { IconLock, IconLogout, IconUser } from "@tabler/icons-react"; +import { useState } from "react"; +import { LocalePicker, ThemeSwitcher } from "src/components"; +import { useAuthState } from "src/context"; +import { useUser } from "src/hooks"; +import { intl } from "src/locale"; +import { ChangePasswordModal, UserModal } from "src/modals"; +import styles from "./SiteHeader.module.css"; + +export function SiteHeader() { + const { data: currentUser } = useUser("me"); + const isAdmin = currentUser?.roles.includes("admin"); + const { logout } = useAuthState(); + const [showProfileEdit, setShowProfileEdit] = useState(false); + const [showChangePassword, setShowChangePassword] = useState(false); + + return ( +
+
+ ); +} diff --git a/frontend/src/components/SiteMenu.tsx b/frontend/src/components/SiteMenu.tsx new file mode 100644 index 00000000..1ceb8145 --- /dev/null +++ b/frontend/src/components/SiteMenu.tsx @@ -0,0 +1,195 @@ +import { + IconBook, + IconDeviceDesktop, + IconHome, + IconLock, + IconSettings, + IconShield, + IconUser, +} from "@tabler/icons-react"; +import cn from "classnames"; +import React from "react"; +import { HasPermission, NavLink } from "src/components"; +import { intl } from "src/locale"; + +interface MenuItem { + label: string; + icon?: React.ElementType; + to?: string; + items?: MenuItem[]; + permission?: string; + permissionType?: "view" | "manage"; +} + +const menuItems: MenuItem[] = [ + { + to: "/", + icon: IconHome, + label: "dashboard.title", + }, + { + icon: IconDeviceDesktop, + label: "hosts.title", + items: [ + { + to: "/nginx/proxy", + label: "proxy-hosts.title", + permission: "proxyHosts", + permissionType: "view", + }, + { + to: "/nginx/redirection", + label: "redirection-hosts.title", + permission: "redirectionHosts", + permissionType: "view", + }, + { + to: "/nginx/stream", + label: "streams.title", + permission: "streams", + permissionType: "view", + }, + { + to: "/nginx/404", + label: "dead-hosts.title", + permission: "deadHosts", + permissionType: "view", + }, + ], + }, + { + to: "/access", + icon: IconLock, + label: "access.title", + permission: "accessLists", + permissionType: "view", + }, + { + to: "/certificates", + icon: IconShield, + label: "certificates.title", + permission: "certificates", + permissionType: "view", + }, + { + to: "/users", + icon: IconUser, + label: "users.title", + permission: "admin", + }, + { + to: "/audit-log", + icon: IconBook, + label: "auditlog.title", + permission: "admin", + }, + { + to: "/settings", + icon: IconSettings, + label: "settings.title", + permission: "admin", + }, +]; + +const getMenuItem = (item: MenuItem, onClick?: () => void) => { + if (item.items && item.items.length > 0) { + return getMenuDropown(item, onClick); + } + + return ( + +
  • + + + {item.icon && React.createElement(item.icon, { height: 24, width: 24 })} + + {intl.formatMessage({ id: item.label })} + +
  • +
    + ); +}; + +const getMenuDropown = (item: MenuItem, onClick?: () => void) => { + const cns = cn("nav-item", "dropdown"); + return ( + +
  • + +
    + {item.items?.map((subitem, idx) => { + return ( + + + {intl.formatMessage({ id: subitem.label })} + + + ); + })} +
    +
  • +
    + ); +}; + +export function SiteMenu() { + // This is hacky AF. But that's the price of using a non-react UI kit. + const closeMenus = () => { + const navMenus = document.querySelectorAll(".nav-item.dropdown"); + navMenus.forEach((menu) => { + menu.classList.remove("show"); + const dropdown = menu.querySelector(".dropdown-menu"); + if (dropdown) { + dropdown.classList.remove("show"); + } + }); + }; + + return ( +
    +
    +
    +
    +
    +
    +
      + {menuItems.length > 0 && + menuItems.map((item) => { + return getMenuItem(item, closeMenus); + })} +
    +
    +
    +
    +
    +
    +
    + ); +} diff --git a/frontend/src/components/Table/EmptyRow.tsx b/frontend/src/components/Table/EmptyRow.tsx new file mode 100644 index 00000000..2daee952 --- /dev/null +++ b/frontend/src/components/Table/EmptyRow.tsx @@ -0,0 +1,16 @@ +import type { Table as ReactTable } from "@tanstack/react-table"; + +interface Props { + tableInstance: ReactTable; +} +function EmptyRow({ tableInstance }: Props) { + return ( + + +

    There are no items

    + + + ); +} + +export { EmptyRow }; diff --git a/frontend/src/components/Table/Formatter/CertificateFormatter.tsx b/frontend/src/components/Table/Formatter/CertificateFormatter.tsx new file mode 100644 index 00000000..daa4b471 --- /dev/null +++ b/frontend/src/components/Table/Formatter/CertificateFormatter.tsx @@ -0,0 +1,13 @@ +import type { Certificate } from "src/api/backend"; +import { intl } from "src/locale"; + +interface Props { + certificate?: Certificate; +} +export function CertificateFormatter({ certificate }: Props) { + if (certificate) { + return intl.formatMessage({ id: "lets-encrypt" }); + } + + return intl.formatMessage({ id: "http-only" }); +} diff --git a/frontend/src/components/Table/Formatter/DomainsFormatter.tsx b/frontend/src/components/Table/Formatter/DomainsFormatter.tsx new file mode 100644 index 00000000..5ab339f2 --- /dev/null +++ b/frontend/src/components/Table/Formatter/DomainsFormatter.tsx @@ -0,0 +1,25 @@ +import { intlFormat, parseISO } from "date-fns"; +import { intl } from "src/locale"; + +interface Props { + domains: string[]; + createdOn?: string; +} +export function DomainsFormatter({ domains, createdOn }: Props) { + return ( +
    +
    + {domains.map((domain: string) => ( + + {domain} + + ))} +
    + {createdOn ? ( +
    + {intl.formatMessage({ id: "created-on" }, { date: intlFormat(parseISO(createdOn)) })} +
    + ) : null} +
    + ); +} diff --git a/frontend/src/components/Table/Formatter/GravatarFormatter.tsx b/frontend/src/components/Table/Formatter/GravatarFormatter.tsx new file mode 100644 index 00000000..9b7bed95 --- /dev/null +++ b/frontend/src/components/Table/Formatter/GravatarFormatter.tsx @@ -0,0 +1,17 @@ +interface Props { + url: string; + name?: string; +} +export function GravatarFormatter({ url, name }: Props) { + return ( +
    + +
    + ); +} diff --git a/frontend/src/components/Table/Formatter/StatusFormatter.tsx b/frontend/src/components/Table/Formatter/StatusFormatter.tsx new file mode 100644 index 00000000..3ea1f5c7 --- /dev/null +++ b/frontend/src/components/Table/Formatter/StatusFormatter.tsx @@ -0,0 +1,11 @@ +import { intl } from "src/locale"; + +interface Props { + enabled: boolean; +} +export function StatusFormatter({ enabled }: Props) { + if (enabled) { + return {intl.formatMessage({ id: "online" })}; + } + return {intl.formatMessage({ id: "offline" })}; +} diff --git a/frontend/src/components/Table/Formatter/ValueWithDateFormatter.tsx b/frontend/src/components/Table/Formatter/ValueWithDateFormatter.tsx new file mode 100644 index 00000000..0754c633 --- /dev/null +++ b/frontend/src/components/Table/Formatter/ValueWithDateFormatter.tsx @@ -0,0 +1,21 @@ +import { intlFormat, parseISO } from "date-fns"; +import { intl } from "src/locale"; + +interface Props { + value: string; + createdOn?: string; +} +export function ValueWithDateFormatter({ value, createdOn }: Props) { + return ( +
    +
    +
    {value}
    +
    + {createdOn ? ( +
    + {intl.formatMessage({ id: "created-on" }, { date: intlFormat(parseISO(createdOn)) })} +
    + ) : null} +
    + ); +} diff --git a/frontend/src/components/Table/Formatter/index.ts b/frontend/src/components/Table/Formatter/index.ts new file mode 100644 index 00000000..2d67aa2e --- /dev/null +++ b/frontend/src/components/Table/Formatter/index.ts @@ -0,0 +1,5 @@ +export * from "./CertificateFormatter"; +export * from "./DomainsFormatter"; +export * from "./GravatarFormatter"; +export * from "./StatusFormatter"; +export * from "./ValueWithDateFormatter"; diff --git a/frontend/src/components/Table/TableBody.tsx b/frontend/src/components/Table/TableBody.tsx new file mode 100644 index 00000000..a4b16242 --- /dev/null +++ b/frontend/src/components/Table/TableBody.tsx @@ -0,0 +1,39 @@ +import { flexRender } from "@tanstack/react-table"; +import type { TableLayoutProps } from "src/components"; +import { EmptyRow } from "./EmptyRow"; + +function TableBody(props: TableLayoutProps) { + const { tableInstance, extraStyles, emptyState } = props; + const rows = tableInstance.getRowModel().rows; + + if (rows.length === 0) { + return emptyState ? ( + emptyState + ) : ( + + + + ); + } + + return ( + + {rows.map((row: any) => { + return ( + + {row.getVisibleCells().map((cell: any) => { + const { className } = (cell.column.columnDef.meta as any) ?? {}; + return ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ); + })} + + ); + })} + + ); +} + +export { TableBody }; diff --git a/frontend/src/components/Table/TableHeader.tsx b/frontend/src/components/Table/TableHeader.tsx new file mode 100644 index 00000000..bf627ce9 --- /dev/null +++ b/frontend/src/components/Table/TableHeader.tsx @@ -0,0 +1,26 @@ +import type { TableLayoutProps } from "src/components"; + +function TableHeader(props: TableLayoutProps) { + const { tableInstance } = props; + const headerGroups = tableInstance.getHeaderGroups(); + + return ( + + {headerGroups.map((headerGroup: any) => ( + + {headerGroup.headers.map((header: any) => { + const { column } = header; + const { className } = (column.columnDef.meta as any) ?? {}; + return ( + + {typeof column.columnDef.header === "string" ? `${column.columnDef.header}` : null} + + ); + })} + + ))} + + ); +} + +export { TableHeader }; diff --git a/frontend/src/components/Table/TableHelpers.ts b/frontend/src/components/Table/TableHelpers.ts new file mode 100644 index 00000000..0df329c8 --- /dev/null +++ b/frontend/src/components/Table/TableHelpers.ts @@ -0,0 +1,64 @@ +export interface TablePagination { + limit: number; + offset: number; + total: number; +} + +export interface TableSortBy { + id: string; + desc: boolean; +} + +export interface TableFilter { + id: string; + value: any; +} + +const tableEvents = { + FILTERS_CHANGED: "FILTERS_CHANGED", + PAGE_CHANGED: "PAGE_CHANGED", + PAGE_SIZE_CHANGED: "PAGE_SIZE_CHANGED", + TOTAL_COUNT_CHANGED: "TOTAL_COUNT_CHANGED", + SORT_CHANGED: "SORT_CHANGED", +}; + +const tableEventReducer = (state: any, { type, payload }: any) => { + let offset = state.offset; + switch (type) { + case tableEvents.PAGE_CHANGED: + return { + ...state, + offset: payload * state.limit, + }; + case tableEvents.PAGE_SIZE_CHANGED: + return { + ...state, + limit: payload, + }; + case tableEvents.TOTAL_COUNT_CHANGED: + return { + ...state, + total: payload, + }; + case tableEvents.SORT_CHANGED: + return { + ...state, + sortBy: payload, + }; + case tableEvents.FILTERS_CHANGED: + if (state.filters !== payload) { + // this actually was a legit change + // sets to page 1 when filter is modified + offset = 0; + } + return { + ...state, + filters: payload, + offset, + }; + default: + throw new Error(`Unhandled action type: ${type}`); + } +}; + +export { tableEvents, tableEventReducer }; diff --git a/frontend/src/components/Table/TableLayout.tsx b/frontend/src/components/Table/TableLayout.tsx new file mode 100644 index 00000000..c23f50b3 --- /dev/null +++ b/frontend/src/components/Table/TableLayout.tsx @@ -0,0 +1,22 @@ +import type { Table as ReactTable } from "@tanstack/react-table"; +import { TableBody } from "./TableBody"; +import { TableHeader } from "./TableHeader"; + +interface TableLayoutProps { + tableInstance: ReactTable; + emptyState?: React.ReactNode; + extraStyles?: { + row: (rowData: TFields) => any | undefined; + }; +} +function TableLayout(props: TableLayoutProps) { + const hasRows = props.tableInstance.getRowModel().rows.length > 0; + return ( + + {hasRows ? : null} + +
    + ); +} + +export { TableLayout, type TableLayoutProps }; diff --git a/frontend/src/components/Table/index.ts b/frontend/src/components/Table/index.ts new file mode 100644 index 00000000..d471d45d --- /dev/null +++ b/frontend/src/components/Table/index.ts @@ -0,0 +1,4 @@ +export * from "./Formatter"; +export * from "./TableHeader"; +export * from "./TableHelpers"; +export * from "./TableLayout"; diff --git a/frontend/src/components/ThemeSwitcher.module.css b/frontend/src/components/ThemeSwitcher.module.css new file mode 100644 index 00000000..2233d2f8 --- /dev/null +++ b/frontend/src/components/ThemeSwitcher.module.css @@ -0,0 +1,15 @@ +.darkBtn { + color: var(--tblr-light) !important; + &:hover { + border: var(--tblr-btn-border-width) solid transparent !important; + background: color-mix(in srgb, var(--tblr-btn-hover-bg) 10%, transparent) !important; + } +} + +.lightBtn { + color: var(--tblr-dark) !important; + &:hover { + border: var(--tblr-btn-border-width) solid transparent !important; + background: color-mix(in srgb, var(--tblr-btn-hover-bg) 10%, transparent) !important; + } +} diff --git a/frontend/src/components/ThemeSwitcher.tsx b/frontend/src/components/ThemeSwitcher.tsx new file mode 100644 index 00000000..9cb66978 --- /dev/null +++ b/frontend/src/components/ThemeSwitcher.tsx @@ -0,0 +1,41 @@ +import { IconMoon, IconSun } from "@tabler/icons-react"; +import cn from "classnames"; +import { Button } from "src/components"; +import { useTheme } from "src/hooks"; +import styles from "./ThemeSwitcher.module.css"; + +interface Props { + className?: string; +} +function ThemeSwitcher({ className }: Props) { + const { setTheme } = useTheme(); + + return ( +
    + + +
    + ); +} + +export { ThemeSwitcher }; diff --git a/frontend/src/components/Unhealthy.tsx b/frontend/src/components/Unhealthy.tsx new file mode 100644 index 00000000..d4b6e33c --- /dev/null +++ b/frontend/src/components/Unhealthy.tsx @@ -0,0 +1,17 @@ +import { Page } from "src/components"; + +export function Unhealthy() { + return ( + +
    +
    +
    + +
    +

    The API is not healthy.

    +

    We'll keep checking and hope to be back soon!

    +
    +
    +
    + ); +} diff --git a/frontend/src/components/index.ts b/frontend/src/components/index.ts new file mode 100644 index 00000000..66e12a74 --- /dev/null +++ b/frontend/src/components/index.ts @@ -0,0 +1,15 @@ +export * from "./Button"; +export * from "./ErrorNotFound"; +export * from "./Flag"; +export * from "./HasPermission"; +export * from "./LoadingPage"; +export * from "./LocalePicker"; +export * from "./NavLink"; +export * from "./Page"; +export * from "./SiteContainer"; +export * from "./SiteFooter"; +export * from "./SiteHeader"; +export * from "./SiteMenu"; +export * from "./Table"; +export * from "./ThemeSwitcher"; +export * from "./Unhealthy"; diff --git a/frontend/src/context/AuthContext.tsx b/frontend/src/context/AuthContext.tsx new file mode 100644 index 00000000..f940722e --- /dev/null +++ b/frontend/src/context/AuthContext.tsx @@ -0,0 +1,72 @@ +import { useQueryClient } from "@tanstack/react-query"; +import { createContext, type ReactNode, useContext, useState } from "react"; +import { useIntervalWhen } from "rooks"; +import { getToken, refreshToken, type TokenResponse } from "src/api/backend"; +import AuthStore from "src/modules/AuthStore"; + +// Context +export interface AuthContextType { + authenticated: boolean; + login: (username: string, password: string) => Promise; + logout: () => void; + token?: string; +} + +const initalValue = null; +const AuthContext = createContext(initalValue); + +// Provider +interface Props { + children?: ReactNode; + tokenRefreshInterval?: number; +} +function AuthProvider({ children, tokenRefreshInterval = 5 * 60 * 1000 }: Props) { + const queryClient = useQueryClient(); + const [authenticated, setAuthenticated] = useState(AuthStore.hasActiveToken()); + + const handleTokenUpdate = (response: TokenResponse) => { + AuthStore.set(response); + setAuthenticated(true); + }; + + const login = async (identity: string, secret: string) => { + const response = await getToken({ payload: { identity, secret } }); + handleTokenUpdate(response); + }; + + const logout = () => { + AuthStore.clear(); + setAuthenticated(false); + queryClient.clear(); + }; + + const refresh = async () => { + const response = await refreshToken(); + handleTokenUpdate(response); + }; + + useIntervalWhen( + () => { + if (authenticated) { + refresh(); + } + }, + tokenRefreshInterval, + true, + ); + + const value = { authenticated, login, logout }; + + return {children}; +} + +function useAuthState() { + const context = useContext(AuthContext); + if (!context) { + throw new Error("useAuthState must be used within a AuthProvider"); + } + return context; +} + +export { AuthProvider, useAuthState }; +export default AuthContext; diff --git a/frontend/src/context/LocaleContext.tsx b/frontend/src/context/LocaleContext.tsx new file mode 100644 index 00000000..ca30a5f3 --- /dev/null +++ b/frontend/src/context/LocaleContext.tsx @@ -0,0 +1,38 @@ +import { createContext, type ReactNode, useContext, useState } from "react"; +import { getLocale } from "src/locale"; + +// Context +export interface LocaleContextType { + setLocale: (locale: string) => void; + locale?: string; +} + +const initalValue = null; +const LocaleContext = createContext(initalValue); + +// Provider +interface Props { + children?: ReactNode; +} +function LocaleProvider({ children }: Props) { + const [locale, setLocaleValue] = useState(getLocale()); + + const setLocale = async (locale: string) => { + setLocaleValue(locale); + }; + + const value = { locale, setLocale }; + + return {children}; +} + +function useLocaleState() { + const context = useContext(LocaleContext); + if (!context) { + throw new Error("useLocaleState must be used within a LocaleProvider"); + } + return context; +} + +export { LocaleProvider, useLocaleState }; +export default LocaleContext; diff --git a/frontend/src/context/ThemeContext.tsx b/frontend/src/context/ThemeContext.tsx new file mode 100644 index 00000000..648d9856 --- /dev/null +++ b/frontend/src/context/ThemeContext.tsx @@ -0,0 +1,68 @@ +import type React from "react"; +import { createContext, type ReactNode, useContext, useEffect, useState } from "react"; + +const StorageKey = "tabler-theme"; +export const Light = "light"; +export const Dark = "dark"; + +// Define theme types +export type Theme = "light" | "dark"; + +interface ThemeContextType { + theme: Theme; + toggleTheme: () => void; + setTheme: (theme: Theme) => void; + getTheme: () => Theme; +} + +const ThemeContext = createContext(undefined); + +interface ThemeProviderProps { + children: ReactNode; +} + +const getBrowserDefault = (): Theme => { + if (window.matchMedia("(prefers-color-scheme: dark)").matches) { + return Dark; + } + return Light; +}; + +export const ThemeProvider: React.FC = ({ children }) => { + const [theme, setThemeState] = useState(() => { + // Try to read theme from localStorage or use 'light' as default + if (typeof window !== "undefined") { + const stored = localStorage.getItem(StorageKey) as Theme | null; + return stored || getBrowserDefault(); + } + return getBrowserDefault(); + }); + + useEffect(() => { + document.body.dataset.theme = theme; + localStorage.setItem(StorageKey, theme); + }, [theme]); + + const toggleTheme = () => { + setThemeState((prev) => (prev === Light ? Dark : Light)); + }; + + const setTheme = (newTheme: Theme) => { + setThemeState(newTheme); + }; + + const getTheme = () => { + return theme; + } + + document.documentElement.setAttribute("data-bs-theme", theme); + return {children}; +}; + +export function useTheme(): ThemeContextType { + const context = useContext(ThemeContext); + if (!context) { + throw new Error("useTheme must be used within a ThemeProvider"); + } + return context; +} diff --git a/frontend/src/context/index.ts b/frontend/src/context/index.ts new file mode 100644 index 00000000..a24e0657 --- /dev/null +++ b/frontend/src/context/index.ts @@ -0,0 +1,3 @@ +export * from "./AuthContext"; +export * from "./LocaleContext"; +export * from "./ThemeContext"; diff --git a/frontend/src/declarations.d.ts b/frontend/src/declarations.d.ts new file mode 100644 index 00000000..18f423bf --- /dev/null +++ b/frontend/src/declarations.d.ts @@ -0,0 +1 @@ +declare module "*.md"; diff --git a/frontend/src/hooks/index.ts b/frontend/src/hooks/index.ts new file mode 100644 index 00000000..2c9b4921 --- /dev/null +++ b/frontend/src/hooks/index.ts @@ -0,0 +1,10 @@ +export * from "./useAccessLists"; +export * from "./useDeadHosts"; +export * from "./useHealth"; +export * from "./useHostReport"; +export * from "./useProxyHosts"; +export * from "./useRedirectionHosts"; +export * from "./useStreams"; +export * from "./useTheme"; +export * from "./useUser"; +export * from "./useUsers"; diff --git a/frontend/src/hooks/useAccessLists.ts b/frontend/src/hooks/useAccessLists.ts new file mode 100644 index 00000000..cb052f68 --- /dev/null +++ b/frontend/src/hooks/useAccessLists.ts @@ -0,0 +1,17 @@ +import { useQuery } from "@tanstack/react-query"; +import { type AccessList, type AccessListExpansion, getAccessLists } from "src/api/backend"; + +const fetchAccessLists = (expand?: AccessListExpansion[]) => { + return getAccessLists(expand); +}; + +const useAccessLists = (expand?: AccessListExpansion[], options = {}) => { + return useQuery({ + queryKey: ["access-lists", { expand }], + queryFn: () => fetchAccessLists(expand), + staleTime: 60 * 1000, + ...options, + }); +}; + +export { fetchAccessLists, useAccessLists }; diff --git a/frontend/src/hooks/useDeadHosts.ts b/frontend/src/hooks/useDeadHosts.ts new file mode 100644 index 00000000..f08ed0ee --- /dev/null +++ b/frontend/src/hooks/useDeadHosts.ts @@ -0,0 +1,17 @@ +import { useQuery } from "@tanstack/react-query"; +import { type DeadHost, type DeadHostExpansion, getDeadHosts } from "src/api/backend"; + +const fetchDeadHosts = (expand?: DeadHostExpansion[]) => { + return getDeadHosts(expand); +}; + +const useDeadHosts = (expand?: DeadHostExpansion[], options = {}) => { + return useQuery({ + queryKey: ["dead-hosts", { expand }], + queryFn: () => fetchDeadHosts(expand), + staleTime: 60 * 1000, + ...options, + }); +}; + +export { fetchDeadHosts, useDeadHosts }; diff --git a/frontend/src/hooks/useHealth.ts b/frontend/src/hooks/useHealth.ts new file mode 100644 index 00000000..6a261c95 --- /dev/null +++ b/frontend/src/hooks/useHealth.ts @@ -0,0 +1,18 @@ +import { useQuery } from "@tanstack/react-query"; +import { getHealth, type HealthResponse } from "src/api/backend"; + +const fetchHealth = () => getHealth(); + +const useHealth = (options = {}) => { + return useQuery({ + queryKey: ["health"], + queryFn: fetchHealth, + refetchOnWindowFocus: false, + retry: 5, + refetchInterval: 15 * 1000, // 15 seconds + staleTime: 14 * 1000, // 14 seconds + ...options, + }); +}; + +export { fetchHealth, useHealth }; diff --git a/frontend/src/hooks/useHostReport.ts b/frontend/src/hooks/useHostReport.ts new file mode 100644 index 00000000..c54096d2 --- /dev/null +++ b/frontend/src/hooks/useHostReport.ts @@ -0,0 +1,18 @@ +import { useQuery } from "@tanstack/react-query"; +import { getHostsReport } from "src/api/backend"; + +const fetchHostReport = () => getHostsReport(); + +const useHostReport = (options = {}) => { + return useQuery, Error>({ + queryKey: ["host-report"], + queryFn: fetchHostReport, + refetchOnWindowFocus: false, + retry: 5, + refetchInterval: 15 * 1000, // 15 seconds + staleTime: 14 * 1000, // 14 seconds + ...options, + }); +}; + +export { fetchHostReport, useHostReport }; diff --git a/frontend/src/hooks/useProxyHosts.ts b/frontend/src/hooks/useProxyHosts.ts new file mode 100644 index 00000000..86366fef --- /dev/null +++ b/frontend/src/hooks/useProxyHosts.ts @@ -0,0 +1,17 @@ +import { useQuery } from "@tanstack/react-query"; +import { getProxyHosts, type ProxyHost, type ProxyHostExpansion } from "src/api/backend"; + +const fetchProxyHosts = (expand?: ProxyHostExpansion[]) => { + return getProxyHosts(expand); +}; + +const useProxyHosts = (expand?: ProxyHostExpansion[], options = {}) => { + return useQuery({ + queryKey: ["proxy-hosts", { expand }], + queryFn: () => fetchProxyHosts(expand), + staleTime: 60 * 1000, + ...options, + }); +}; + +export { fetchProxyHosts, useProxyHosts }; diff --git a/frontend/src/hooks/useRedirectionHosts.ts b/frontend/src/hooks/useRedirectionHosts.ts new file mode 100644 index 00000000..03a66238 --- /dev/null +++ b/frontend/src/hooks/useRedirectionHosts.ts @@ -0,0 +1,17 @@ +import { useQuery } from "@tanstack/react-query"; +import { getRedirectionHosts, type RedirectionHost, type RedirectionHostExpansion } from "src/api/backend"; + +const fetchRedirectionHosts = (expand?: RedirectionHostExpansion[]) => { + return getRedirectionHosts(expand); +}; + +const useRedirectionHosts = (expand?: RedirectionHostExpansion[], options = {}) => { + return useQuery({ + queryKey: ["redirection-hosts", { expand }], + queryFn: () => fetchRedirectionHosts(expand), + staleTime: 60 * 1000, + ...options, + }); +}; + +export { fetchRedirectionHosts, useRedirectionHosts }; diff --git a/frontend/src/hooks/useStreams.ts b/frontend/src/hooks/useStreams.ts new file mode 100644 index 00000000..8612050d --- /dev/null +++ b/frontend/src/hooks/useStreams.ts @@ -0,0 +1,17 @@ +import { useQuery } from "@tanstack/react-query"; +import { getStreams, type Stream, type StreamExpansion } from "src/api/backend"; + +const fetchStreams = (expand?: StreamExpansion[]) => { + return getStreams(expand); +}; + +const useStreams = (expand?: StreamExpansion[], options = {}) => { + return useQuery({ + queryKey: ["streams", { expand }], + queryFn: () => fetchStreams(expand), + staleTime: 60 * 1000, + ...options, + }); +}; + +export { fetchStreams, useStreams }; diff --git a/frontend/src/hooks/useTheme.ts b/frontend/src/hooks/useTheme.ts new file mode 100644 index 00000000..941c0626 --- /dev/null +++ b/frontend/src/hooks/useTheme.ts @@ -0,0 +1,8 @@ +import { Dark, Light, useTheme as useThemeContext } from "src/context"; + +// Simple hook wrapper for clarity and scalability +const useTheme = () => { + return useThemeContext(); +}; + +export { useTheme, Dark, Light }; diff --git a/frontend/src/hooks/useUser.ts b/frontend/src/hooks/useUser.ts new file mode 100644 index 00000000..180032c2 --- /dev/null +++ b/frontend/src/hooks/useUser.ts @@ -0,0 +1,37 @@ +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { getUser, type User, updateUser } from "src/api/backend"; + +const fetchUser = (id: number | string) => { + return getUser(id, { expand: "permissions" }); +}; + +const useUser = (id: string | number, options = {}) => { + return useQuery({ + queryKey: ["user", id], + queryFn: () => fetchUser(id), + staleTime: 60 * 1000, // 1 minute + ...options, + }); +}; + +const useSetUser = () => { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (values: User) => updateUser(values), + onMutate: (values: User) => { + const previousObject = queryClient.getQueryData(["user", values.id]); + queryClient.setQueryData(["user", values.id], (old: User) => ({ + ...old, + ...values, + })); + return () => queryClient.setQueryData(["user", values.id], previousObject); + }, + onError: (_, __, rollback: any) => rollback(), + onSuccess: async ({ id }: User) => { + queryClient.invalidateQueries({ queryKey: ["user", id] }); + queryClient.invalidateQueries({ queryKey: ["users"] }); + }, + }); +}; + +export { useUser, useSetUser }; diff --git a/frontend/src/hooks/useUsers.ts b/frontend/src/hooks/useUsers.ts new file mode 100644 index 00000000..8c4d802f --- /dev/null +++ b/frontend/src/hooks/useUsers.ts @@ -0,0 +1,17 @@ +import { useQuery } from "@tanstack/react-query"; +import { getUsers, type User, type UserExpansion } from "src/api/backend"; + +const fetchUsers = (expand?: UserExpansion[]) => { + return getUsers(expand); +}; + +const useUsers = (expand?: UserExpansion[], options = {}) => { + return useQuery({ + queryKey: ["users", { expand }], + queryFn: () => fetchUsers(expand), + staleTime: 60 * 1000, + ...options, + }); +}; + +export { fetchUsers, useUsers }; diff --git a/frontend/src/locale/IntlProvider.tsx b/frontend/src/locale/IntlProvider.tsx new file mode 100644 index 00000000..ee256859 --- /dev/null +++ b/frontend/src/locale/IntlProvider.tsx @@ -0,0 +1,64 @@ +import { createIntl, createIntlCache } from "react-intl"; +import langDe from "./lang/de.json"; +import langEn from "./lang/en.json"; +import langFa from "./lang/fa.json"; +import langList from "./lang/lang-list.json"; + +// first item of each array should be the language code, +// not the country code +// Remember when adding to this list, also update check-locales.js script +const localeOptions = [ + ["en", "en-US"], + ["de", "de-DE"], + ["fa", "fa-IR"], +]; + +const loadMessages = (locale?: string): typeof langList & typeof langEn => { + const thisLocale = locale || "en"; + switch (thisLocale.slice(0, 2)) { + case "de": + return Object.assign({}, langList, langEn, langDe); + case "fa": + return Object.assign({}, langList, langEn, langFa); + default: + return Object.assign({}, langList, langEn); + } +}; + +const getFlagCodeForLocale = (locale?: string) => { + switch (locale) { + case "de-DE": + case "de": + return "DE"; + case "fa-IR": + case "fa": + return "IR"; + default: + return "EN"; + } +}; + +const getLocale = (short = false) => { + let loc = window.localStorage.getItem("locale"); + if (!loc) { + loc = document.documentElement.lang; + } + if (short) { + return loc.slice(0, 2); + } + return loc; +}; + +const cache = createIntlCache(); + +const initialMessages = loadMessages(getLocale()); +let intl = createIntl({ locale: getLocale(), messages: initialMessages }, cache); + +const changeLocale = (locale: string): void => { + const messages = loadMessages(locale); + intl = createIntl({ locale, messages }, cache); + window.localStorage.setItem("locale", locale); + document.documentElement.lang = locale; +}; + +export { localeOptions, getFlagCodeForLocale, getLocale, createIntl, changeLocale, intl }; diff --git a/frontend/src/locale/README.md b/frontend/src/locale/README.md new file mode 100644 index 00000000..94275c8f --- /dev/null +++ b/frontend/src/locale/README.md @@ -0,0 +1,23 @@ +# Internationalisation support + +## Adding new translations + +Modify the files in the `src` folder. Follow the conventions already there. + + +## After making changes + +You will need to run `yarn locale-compile` in this frontend folder for +the new translations to be compiled into the `lang` folder. + +When running in dev mode, this should automatically happen within Vite. + + +## Checking for missing translations in other languages + +Run `node check-locales.cjs` in this frontend folder. + + +## Adding new languages + +todo diff --git a/frontend/src/locale/index.ts b/frontend/src/locale/index.ts new file mode 100644 index 00000000..c6dca46d --- /dev/null +++ b/frontend/src/locale/index.ts @@ -0,0 +1 @@ +export * from "./IntlProvider"; diff --git a/frontend/src/locale/lang/de.json b/frontend/src/locale/lang/de.json new file mode 100644 index 00000000..bb89fd18 --- /dev/null +++ b/frontend/src/locale/lang/de.json @@ -0,0 +1,3 @@ +{ + "dashboard.title": "Armaturenbrett" +} \ No newline at end of file diff --git a/frontend/src/locale/lang/en.json b/frontend/src/locale/lang/en.json new file mode 100644 index 00000000..eae027b8 --- /dev/null +++ b/frontend/src/locale/lang/en.json @@ -0,0 +1,92 @@ +{ + "access.access-count": "{count} Rules", + "access.actions-title": "Access List #{id}", + "access.add": "Add Access List", + "access.auth-count": "{count} Users", + "access.empty": "There are no Access Lists", + "access.satisfy-all": "All", + "access.satisfy-any": "Any", + "access.title": "Access", + "action.delete": "Delete", + "action.disable": "Disable", + "action.edit": "Edit", + "action.enable": "Enable", + "action.permissions": "Permissions", + "administrator": "Administrator", + "auditlog.title": "Audit Log", + "cancel": "Cancel", + "certificates.title": "SSL Certificates", + "column.access": "Access", + "column.authorization": "Authorization", + "column.destination": "Destination", + "column.email": "Email", + "column.http-code": "Access", + "column.incoming-port": "Incoming Port", + "column.name": "Name", + "column.protocol": "Protocol", + "column.roles": "Roles", + "column.satisfy": "Satisfy", + "column.scheme": "Scheme", + "column.source": "Source", + "column.ssl": "SSL", + "column.status": "Status", + "created-on": "Created: {date}", + "dashboard.title": "Dashboard", + "dead-hosts.actions-title": "404 Host #{id}", + "dead-hosts.add": "Add 404 Host", + "dead-hosts.count": "{count} 404 Hosts", + "dead-hosts.empty": "There are no 404 Hosts", + "dead-hosts.title": "404 Hosts", + "email-address": "Email address", + "empty-subtitle": "Why don't you create one?", + "error.invalid-auth": "Invalid email or password", + "error.passwords-must-match": "Passwords must match", + "footer.github-fork": "Fork me on Github", + "hosts.title": "Hosts", + "http-only": "HTTP Only", + "lets-encrypt": "Let's Encrypt", + "loading": "Loading…", + "login.title": "Login to your account", + "no-permission-error": "You do not have access to view this.", + "notfound.action": "Take me home", + "notfound.text": "We are sorry but the page you are looking for was not found", + "notfound.title": "Oops… You just found an error page", + "offline": "Offline", + "online": "Online", + "password": "Password", + "proxy-hosts.actions-title": "Proxy Host #{id}", + "proxy-hosts.add": "Add Proxy Host", + "proxy-hosts.count": "{count} Proxy Hosts", + "proxy-hosts.empty": "There are no Proxy Hosts", + "proxy-hosts.title": "Proxy Hosts", + "redirection-hosts.actions-title": "Redirection Host #{id}", + "redirection-hosts.add": "Add Redirection Host", + "redirection-hosts.count": "{count} Redirection Hosts", + "redirection-hosts.empty": "There are no Redirection Hosts", + "redirection-hosts.title": "Redirection Hosts", + "save": "Save", + "settings.title": "Settings", + "sign-in": "Sign in", + "standard-user": "Apache Helicopter", + "streams.actions-title": "Stream #{id}", + "streams.add": "Add Stream", + "streams.count": "{count} Streams", + "streams.empty": "There are no Streams", + "streams.tcp": "TCP", + "streams.title": "Streams", + "streams.udp": "UDP", + "user.change-password": "Change Password", + "user.confirm-password": "Confirm Password", + "user.current-password": "Current Password", + "user.edit": "Edit User", + "user.edit-profile": "Edit Profile", + "user.full-name": "Full Name", + "user.logout": "Logout", + "user.new-password": "New Password", + "user.nickname": "Nickname", + "user.switch-dark": "Switch to Dark mode", + "user.switch-light": "Switch to Light mode", + "users.actions-title": "User #{id}", + "users.add": "Add User", + "users.title": "Users" +} \ No newline at end of file diff --git a/frontend/src/locale/lang/fa.json b/frontend/src/locale/lang/fa.json new file mode 100644 index 00000000..77cecfad --- /dev/null +++ b/frontend/src/locale/lang/fa.json @@ -0,0 +1,3 @@ +{ + "dashboard.title": "داشبورد" +} \ No newline at end of file diff --git a/frontend/src/locale/lang/lang-list.json b/frontend/src/locale/lang/lang-list.json new file mode 100644 index 00000000..1d6bed3a --- /dev/null +++ b/frontend/src/locale/lang/lang-list.json @@ -0,0 +1,5 @@ +{ + "locale-de-DE": "Deutsch", + "locale-en-US": "English", + "locale-fa-IR": "فارسی" +} \ No newline at end of file diff --git a/frontend/src/locale/src/de.json b/frontend/src/locale/src/de.json new file mode 100644 index 00000000..2b2ab546 --- /dev/null +++ b/frontend/src/locale/src/de.json @@ -0,0 +1,5 @@ +{ + "dashboard.title": { + "defaultMessage": "Armaturenbrett" + } +} diff --git a/frontend/src/locale/src/en.json b/frontend/src/locale/src/en.json new file mode 100644 index 00000000..b3e881de --- /dev/null +++ b/frontend/src/locale/src/en.json @@ -0,0 +1,272 @@ +{ + "access.actions-title": { + "defaultMessage": "Access List #{id}" + }, + "access.access-count": { + "defaultMessage": "{count} Rules" + }, + "access.add": { + "defaultMessage": "Add Access List" + }, + "access.auth-count": { + "defaultMessage": "{count} Users" + }, + "access.empty": { + "defaultMessage": "There are no Access Lists" + }, + "access.satisfy-all": { + "defaultMessage": "All" + }, + "access.satisfy-any": { + "defaultMessage": "Any" + }, + "access.title": { + "defaultMessage": "Access" + }, + "action.delete": { + "defaultMessage": "Delete" + }, + "action.disable": { + "defaultMessage": "Disable" + }, + "action.enable": { + "defaultMessage": "Enable" + }, + "action.edit": { + "defaultMessage": "Edit" + }, + "action.permissions": { + "defaultMessage": "Permissions" + }, + "administrator": { + "defaultMessage": "Administrator" + }, + "auditlog.title": { + "defaultMessage": "Audit Log" + }, + "cancel": { + "defaultMessage": "Cancel" + }, + "certificates.title": { + "defaultMessage": "SSL Certificates" + }, + "created-on": { + "defaultMessage": "Created: {date}" + }, + "column.access": { + "defaultMessage": "Access" + }, + "column.authorization": { + "defaultMessage": "Authorization" + }, + "column.destination": { + "defaultMessage": "Destination" + }, + "column.email": { + "defaultMessage": "Email" + }, + "column.http-code": { + "defaultMessage": "Access" + }, + "column.incoming-port": { + "defaultMessage": "Incoming Port" + }, + "column.name": { + "defaultMessage": "Name" + }, + "column.protocol": { + "defaultMessage": "Protocol" + }, + "column.roles": { + "defaultMessage": "Roles" + }, + "column.satisfy": { + "defaultMessage": "Satisfy" + }, + "column.scheme": { + "defaultMessage": "Scheme" + }, + "column.status": { + "defaultMessage": "Status" + }, + "column.ssl": { + "defaultMessage": "SSL" + }, + "column.source": { + "defaultMessage": "Source" + }, + "dashboard.title": { + "defaultMessage": "Dashboard" + }, + "dead-hosts.actions-title": { + "defaultMessage": "404 Host #{id}" + }, + "dead-hosts.add": { + "defaultMessage": "Add 404 Host" + }, + "dead-hosts.count": { + "defaultMessage": "{count} 404 Hosts" + }, + "dead-hosts.empty": { + "defaultMessage": "There are no 404 Hosts" + }, + "dead-hosts.title": { + "defaultMessage": "404 Hosts" + }, + "email-address": { + "defaultMessage": "Email address" + }, + "error.passwords-must-match": { + "defaultMessage": "Passwords must match" + }, + "error.invalid-auth": { + "defaultMessage": "Invalid email or password" + }, + "footer.github-fork": { + "defaultMessage": "Fork me on Github" + }, + "empty-subtitle": { + "defaultMessage": "Why don't you create one?" + }, + "hosts.title": { + "defaultMessage": "Hosts" + }, + "http-only": { + "defaultMessage": "HTTP Only" + }, + "lets-encrypt": { + "defaultMessage": "Let's Encrypt" + }, + "loading": { + "defaultMessage": "Loading…" + }, + "login.title": { + "defaultMessage": "Login to your account" + }, + "no-permission-error": { + "defaultMessage": "You do not have access to view this." + }, + "notfound.action": { + "defaultMessage": "Take me home" + }, + "notfound.text": { + "defaultMessage": "We are sorry but the page you are looking for was not found" + }, + "notfound.title": { + "defaultMessage": "Oops… You just found an error page" + }, + "offline": { + "defaultMessage": "Offline" + }, + "online": { + "defaultMessage": "Online" + }, + "password": { + "defaultMessage": "Password" + }, + "proxy-hosts.actions-title": { + "defaultMessage": "Proxy Host #{id}" + }, + "proxy-hosts.add": { + "defaultMessage": "Add Proxy Host" + }, + "proxy-hosts.count": { + "defaultMessage": "{count} Proxy Hosts" + }, + "proxy-hosts.empty": { + "defaultMessage": "There are no Proxy Hosts" + }, + "proxy-hosts.title": { + "defaultMessage": "Proxy Hosts" + }, + "redirection-hosts.actions-title": { + "defaultMessage": "Redirection Host #{id}" + }, + "redirection-hosts.add": { + "defaultMessage": "Add Redirection Host" + }, + "redirection-hosts.count": { + "defaultMessage": "{count} Redirection Hosts" + }, + "redirection-hosts.empty": { + "defaultMessage": "There are no Redirection Hosts" + }, + "redirection-hosts.title": { + "defaultMessage": "Redirection Hosts" + }, + "save": { + "defaultMessage": "Save" + }, + "settings.title": { + "defaultMessage": "Settings" + }, + "sign-in": { + "defaultMessage": "Sign in" + }, + "standard-user": { + "defaultMessage": "Apache Helicopter" + }, + "streams.actions-title": { + "defaultMessage": "Stream #{id}" + }, + "streams.add": { + "defaultMessage": "Add Stream" + }, + "streams.count": { + "defaultMessage": "{count} Streams" + }, + "streams.empty": { + "defaultMessage": "There are no Streams" + }, + "streams.tcp": { + "defaultMessage": "TCP" + }, + "streams.title": { + "defaultMessage": "Streams" + }, + "streams.udp": { + "defaultMessage": "UDP" + }, + "user.change-password": { + "defaultMessage": "Change Password" + }, + "user.confirm-password": { + "defaultMessage": "Confirm Password" + }, + "user.current-password": { + "defaultMessage": "Current Password" + }, + "user.edit": { + "defaultMessage": "Edit User" + }, + "user.edit-profile": { + "defaultMessage": "Edit Profile" + }, + "user.full-name": { + "defaultMessage": "Full Name" + }, + "user.logout": { + "defaultMessage": "Logout" + }, + "user.new-password": { + "defaultMessage": "New Password" + }, + "user.nickname": { + "defaultMessage": "Nickname" + }, + "user.switch-dark": { + "defaultMessage": "Switch to Dark mode" + }, + "user.switch-light": { + "defaultMessage": "Switch to Light mode" + }, + "users.actions-title": { + "defaultMessage": "User #{id}" + }, + "users.add": { + "defaultMessage": "Add User" + }, + "users.title": { + "defaultMessage": "Users" + } +} diff --git a/frontend/src/locale/src/fa.json b/frontend/src/locale/src/fa.json new file mode 100644 index 00000000..03679a36 --- /dev/null +++ b/frontend/src/locale/src/fa.json @@ -0,0 +1,5 @@ +{ + "dashboard.title": { + "defaultMessage": "داشبورد" + } +} diff --git a/frontend/src/locale/src/lang-list.json b/frontend/src/locale/src/lang-list.json new file mode 100644 index 00000000..cdd95d05 --- /dev/null +++ b/frontend/src/locale/src/lang-list.json @@ -0,0 +1,11 @@ +{ + "locale-de-DE": { + "defaultMessage": "Deutsch" + }, + "locale-en-US": { + "defaultMessage": "English" + }, + "locale-fa-IR": { + "defaultMessage": "فارسی" + } +} diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx new file mode 100644 index 00000000..62c1c481 --- /dev/null +++ b/frontend/src/main.tsx @@ -0,0 +1,13 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "src/App.tsx"; + +import "@tabler/core/dist/css/tabler.min.css"; +import "@tabler/core/dist/js/tabler.min.js"; +import "./App.css"; + +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + + + , +); diff --git a/frontend/src/modals/ChangePasswordModal.tsx b/frontend/src/modals/ChangePasswordModal.tsx new file mode 100644 index 00000000..811674df --- /dev/null +++ b/frontend/src/modals/ChangePasswordModal.tsx @@ -0,0 +1,153 @@ +import { Field, Form, Formik } from "formik"; +import { useState } from "react"; +import { Alert } from "react-bootstrap"; +import Modal from "react-bootstrap/Modal"; +import { updateAuth } from "src/api/backend"; +import { Button } from "src/components"; +import { intl } from "src/locale"; +import { validateString } from "src/modules/Validations"; + +interface Props { + userId: number | "me"; + onClose: () => void; +} +export function ChangePasswordModal({ userId, onClose }: Props) { + const [error, setError] = useState(null); + + const onSubmit = async (values: any, { setSubmitting }: any) => { + if (values.new !== values.confirm) { + setError(intl.formatMessage({ id: "error.passwords-must-match" })); + setSubmitting(false); + return; + } + setError(null); + try { + await updateAuth(userId, values.new, values.current); + onClose(); + } catch (err: any) { + setError(intl.formatMessage({ id: err.message })); + } + setSubmitting(false); + }; + + return ( + + + {({ isSubmitting }) => ( +
    + + {intl.formatMessage({ id: "user.change-password" })} + + + setError(null)} dismissible> + {error} + +
    + + {({ field, form }: any) => ( +
    + + + {form.errors.name ? ( +
    + {form.errors.current && form.touched.current + ? form.errors.current + : null} +
    + ) : null} +
    + )} +
    +
    +
    + + {({ field, form }: any) => ( +
    + + + {form.errors.new ? ( +
    + {form.errors.new && form.touched.new ? form.errors.new : null} +
    + ) : null} +
    + )} +
    +
    +
    + + {({ field, form }: any) => ( +
    + + {form.errors.confirm ? ( +
    + {form.errors.confirm && form.touched.confirm + ? form.errors.confirm + : null} +
    + ) : null} + +
    + )} +
    +
    +
    + + + + +
    + )} +
    +
    + ); +} diff --git a/frontend/src/modals/UserModal.tsx b/frontend/src/modals/UserModal.tsx new file mode 100644 index 00000000..0f25817a --- /dev/null +++ b/frontend/src/modals/UserModal.tsx @@ -0,0 +1,213 @@ +import { Field, Form, Formik } from "formik"; +import { useState } from "react"; +import { Alert } from "react-bootstrap"; +import Modal from "react-bootstrap/Modal"; +import { Button } from "src/components"; +import { useSetUser, useUser } from "src/hooks"; +import { intl } from "src/locale"; +import { validateEmail, validateString } from "src/modules/Validations"; + +interface Props { + userId: number | "me"; + onClose: () => void; +} +export function UserModal({ userId, onClose }: Props) { + const { data } = useUser(userId); + const { data: currentUser } = useUser("me"); + const { mutate: setUser } = useSetUser(); + const [error, setError] = useState(null); + + const onSubmit = async (values: any, { setSubmitting }: any) => { + setError(null); + const { ...payload } = { + id: userId, + roles: [], + ...values, + }; + + console.log("values", values); + + if (data?.id === currentUser?.id) { + // Prevent user from locking themselves out + delete payload.isDisabled; + delete payload.roles; + } else if (payload.isAdmin) { + payload.roles = ["admin"]; + } + + // this isn't a real field, just for the form + delete payload.isAdmin; + + setUser(payload, { + onError: (err: any) => setError(err.message), + onSuccess: () => onClose(), + onSettled: () => setSubmitting(false), + }); + }; + + return ( + + + {({ isSubmitting }) => ( +
    + + {intl.formatMessage({ id: "user.edit" })} + + + setError(null)} dismissible> + {error} + +
    +
    +
    + + {({ field, form }: any) => ( +
    + + + {form.errors.name ? ( +
    + {form.errors.name && form.touched.name + ? form.errors.name + : null} +
    + ) : null} +
    + )} +
    +
    +
    +
    +
    + + {({ field, form }: any) => ( +
    + + + {form.errors.nickname ? ( +
    + {form.errors.nickname && form.touched.nickname + ? form.errors.nickname + : null} +
    + ) : null} +
    + )} +
    +
    +
    +
    +
    + + {({ field, form }: any) => ( +
    + + + {form.errors.email ? ( +
    + {form.errors.email && form.touched.email ? form.errors.email : null} +
    + ) : null} +
    + )} +
    +
    + {currentUser && data && currentUser?.id !== data?.id ? ( +
    +

    Properties

    + +
    +
    + +
    +
    + +
    +
    +
    + ) : null} +
    + + + + +
    + )} +
    +
    + ); +} diff --git a/frontend/src/modals/index.ts b/frontend/src/modals/index.ts new file mode 100644 index 00000000..c581bcdf --- /dev/null +++ b/frontend/src/modals/index.ts @@ -0,0 +1,2 @@ +export * from "./ChangePasswordModal"; +export * from "./UserModal"; diff --git a/frontend/src/modules/AuthStore.ts b/frontend/src/modules/AuthStore.ts new file mode 100644 index 00000000..90cee8e4 --- /dev/null +++ b/frontend/src/modules/AuthStore.ts @@ -0,0 +1,89 @@ +import { getUnixTime, parseISO } from "date-fns"; +import type { TokenResponse } from "src/api/backend"; + +export const TOKEN_KEY = "authentications"; + +export class AuthStore { + // Get all tokens from stack + get tokens() { + const t = localStorage.getItem(TOKEN_KEY); + let tokens = []; + if (t !== null) { + try { + tokens = JSON.parse(t); + } catch (e) { + console.error("Failed to parse tokens from localStorage", e); + } + } + return tokens; + } + + // Get last token from stack + get token() { + const t = this.tokens; + if (t.length) { + return t[t.length - 1]; + } + return null; + } + + // Get expires from last token + get expires() { + const t = this.token; + if (t && typeof t.expires !== "undefined") { + const expires = Number(t.expires); + if (expires && !Number.isNaN(expires)) { + return expires; + } + } + return null; + } + + // Filter out invalid tokens and return true if we find one that is valid + // hasActiveToken() { + // const t = this.tokens; + // return t.length > 0; + // } + hasActiveToken() { + const t = this.tokens; + if (!t.length) { + return false; + } + + const now = Math.round(Date.now() / 1000); + const oneMinuteBuffer = 60; + for (let i = t.length - 1; i >= 0; i--) { + const dte = getUnixTime(parseISO(t[i].expires)); + const valid = dte - oneMinuteBuffer > now; + if (valid) { + return true; + } + this.drop(); + } + return false; + } + + // Set a single token on the stack + set({ token, expires }: TokenResponse) { + localStorage.setItem(TOKEN_KEY, JSON.stringify([{ token, expires }])); + } + + // Add a token to the stack + add({ token, expires }: TokenResponse) { + const t = this.tokens; + t.push({ token, expires }); + localStorage.setItem(TOKEN_KEY, JSON.stringify(t)); + } + + // Drop a token from the stack + drop() { + const t = this.tokens; + localStorage.setItem(TOKEN_KEY, JSON.stringify(t.splice(-1, 1))); + } + + clear() { + localStorage.removeItem(TOKEN_KEY); + } +} + +export default new AuthStore(); diff --git a/frontend/src/modules/Validations.tsx b/frontend/src/modules/Validations.tsx new file mode 100644 index 00000000..c3574c01 --- /dev/null +++ b/frontend/src/modules/Validations.tsx @@ -0,0 +1,51 @@ +const validateString = (minLength = 0, maxLength = 0) => { + if (minLength <= 0 && maxLength <= 0) { + // this doesn't require translation + console.error("validateString() must be called with a min or max or both values in order to work!"); + } + + return (value: string): string | undefined => { + if (minLength && (typeof value === "undefined" || !value.length)) { + return "This is required"; + } + if (minLength && value.length < minLength) { + return `Minimum length is ${minLength} character${minLength === 1 ? "" : "s"}`; + } + if (maxLength && (typeof value === "undefined" || value.length > maxLength)) { + return `Maximum length is ${maxLength} character${maxLength === 1 ? "" : "s"}`; + } + }; +}; + +const validateNumber = (min = -1, max = -1) => { + if (min === -1 && max === -1) { + // this doesn't require translation + console.error("validateNumber() must be called with a min or max or both values in order to work!"); + } + + return (value: string): string | undefined => { + const int: number = +value; + if (min > -1 && !int) { + return "This is required"; + } + if (min > -1 && int < min) { + return `Minimum is ${min}`; + } + if (max > -1 && int > max) { + return `Maximum is ${max}`; + } + }; +}; + +const validateEmail = () => { + return (value: string): string | undefined => { + if (!value.length) { + return "This is required"; + } + if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(value)) { + return "Invalid email address"; + } + }; +}; + +export { validateEmail, validateNumber, validateString }; diff --git a/frontend/src/pages/Access/Empty.tsx b/frontend/src/pages/Access/Empty.tsx new file mode 100644 index 00000000..06445fc6 --- /dev/null +++ b/frontend/src/pages/Access/Empty.tsx @@ -0,0 +1,20 @@ +import type { Table as ReactTable } from "@tanstack/react-table"; +import { Button } from "src/components"; +import { intl } from "src/locale"; + +interface Props { + tableInstance: ReactTable; +} +export default function Empty({ tableInstance }: Props) { + return ( + + +
    +

    {intl.formatMessage({ id: "access.empty" })}

    +

    {intl.formatMessage({ id: "empty-subtitle" })}

    + +
    + + + ); +} diff --git a/frontend/src/pages/Access/Table.tsx b/frontend/src/pages/Access/Table.tsx new file mode 100644 index 00000000..8fbf1c2a --- /dev/null +++ b/frontend/src/pages/Access/Table.tsx @@ -0,0 +1,123 @@ +import { IconDotsVertical, IconEdit, IconTrash } from "@tabler/icons-react"; +import { createColumnHelper, getCoreRowModel, useReactTable } from "@tanstack/react-table"; +import { useMemo } from "react"; +import type { AccessList } from "src/api/backend"; +import { GravatarFormatter, ValueWithDateFormatter } from "src/components"; +import { TableLayout } from "src/components/Table/TableLayout"; +import { intl } from "src/locale"; +import Empty from "./Empty"; + +interface Props { + data: AccessList[]; + isFetching?: boolean; +} +export default function Table({ data, isFetching }: Props) { + const columnHelper = createColumnHelper(); + const columns = useMemo( + () => [ + columnHelper.accessor((row: any) => row.owner, { + id: "owner", + cell: (info: any) => { + const value = info.getValue(); + return ; + }, + meta: { + className: "w-1", + }, + }), + columnHelper.accessor((row: any) => row, { + id: "name", + header: intl.formatMessage({ id: "column.name" }), + cell: (info: any) => { + const value = info.getValue(); + // Bit of a hack to reuse the DomainsFormatter component + return ; + }, + }), + columnHelper.accessor((row: any) => row.items, { + id: "items", + header: intl.formatMessage({ id: "column.authorization" }), + cell: (info: any) => { + const value = info.getValue(); + return intl.formatMessage({ id: "access.auth-count" }, { count: value.length }); + }, + }), + columnHelper.accessor((row: any) => row.clients, { + id: "clients", + header: intl.formatMessage({ id: "column.access" }), + cell: (info: any) => { + const value = info.getValue(); + return intl.formatMessage({ id: "access.access-count" }, { count: value.length }); + }, + }), + columnHelper.accessor((row: any) => row.satisfyAny, { + id: "satisfyAny", + header: intl.formatMessage({ id: "column.satisfy" }), + cell: (info: any) => { + const t = info.getValue() ? "access.satisfy-any" : "access.satisfy-all"; + return intl.formatMessage({ id: t }); + }, + }), + columnHelper.accessor((row: any) => row.proxyHostCount, { + id: "proxyHostCount", + header: intl.formatMessage({ id: "proxy-hosts.title" }), + cell: (info: any) => { + return intl.formatMessage({ id: "proxy-hosts.count" }, { count: info.getValue() }); + }, + }), + columnHelper.display({ + id: "id", // todo: not needed for a display? + cell: (info: any) => { + return ( + + +
    + + {intl.formatMessage( + { + id: "access.actions-title", + }, + { id: info.row.original.id }, + )} + + + + {intl.formatMessage({ id: "action.edit" })} + + + + ); + }, + meta: { + className: "text-end w-1", + }, + }), + ], + [columnHelper], + ); + + const tableInstance = useReactTable({ + columns, + data, + getCoreRowModel: getCoreRowModel(), + rowCount: data.length, + meta: { + isFetching, + }, + enableSortingRemoval: false, + }); + + return } />; +} diff --git a/frontend/src/pages/Access/TableWrapper.tsx b/frontend/src/pages/Access/TableWrapper.tsx new file mode 100644 index 00000000..71af23d7 --- /dev/null +++ b/frontend/src/pages/Access/TableWrapper.tsx @@ -0,0 +1,52 @@ +import { IconSearch } from "@tabler/icons-react"; +import Alert from "react-bootstrap/Alert"; +import { Button, LoadingPage } from "src/components"; +import { useAccessLists } from "src/hooks"; +import { intl } from "src/locale"; +import Table from "./Table"; + +export default function TableWrapper() { + const { isFetching, isLoading, isError, error, data } = useAccessLists(["owner", "items", "clients"]); + + if (isLoading) { + return ; + } + + if (isError) { + return {error?.message || "Unknown error"}; + } + + return ( +
    +
    +
    +
    +
    +
    +

    {intl.formatMessage({ id: "access.title" })}

    +
    +
    +
    +
    + + + + +
    + +
    +
    +
    +
    + + + + ); +} diff --git a/frontend/src/pages/Access/index.tsx b/frontend/src/pages/Access/index.tsx new file mode 100644 index 00000000..2708f85f --- /dev/null +++ b/frontend/src/pages/Access/index.tsx @@ -0,0 +1,12 @@ +import { HasPermission } from "src/components"; +import TableWrapper from "./TableWrapper"; + +const Access = () => { + return ( + + + + ); +}; + +export default Access; diff --git a/frontend/src/pages/AuditLog/AuditTable.tsx b/frontend/src/pages/AuditLog/AuditTable.tsx new file mode 100644 index 00000000..018078b7 --- /dev/null +++ b/frontend/src/pages/AuditLog/AuditTable.tsx @@ -0,0 +1,128 @@ +import { IconDotsVertical, IconEdit, IconPower, IconSearch, IconTrash } from "@tabler/icons-react"; +import { intl } from "src/locale"; + +export default function AuditTable() { + return ( +
    +
    +
    +
    +
    +
    +

    {intl.formatMessage({ id: "auditlog.title" })}

    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    + blog.jc21.com +
    +
    Created: 20th September 2024
    +
    +
    http://172.17.0.1:3001Let's EncryptPublic + Online + + + +
    + Proxy Host #2 + + + Edit + + + + Disable + + + +
    +
    +
    +
    +
    + ); +} diff --git a/frontend/src/pages/AuditLog/index.tsx b/frontend/src/pages/AuditLog/index.tsx new file mode 100644 index 00000000..3680ecfb --- /dev/null +++ b/frontend/src/pages/AuditLog/index.tsx @@ -0,0 +1,12 @@ +import { HasPermission } from "src/components"; +import AuditTable from "./AuditTable"; + +const AuditLog = () => { + return ( + + + + ); +}; + +export default AuditLog; diff --git a/frontend/src/pages/Certificates/CertificateTable.tsx b/frontend/src/pages/Certificates/CertificateTable.tsx new file mode 100644 index 00000000..df607d13 --- /dev/null +++ b/frontend/src/pages/Certificates/CertificateTable.tsx @@ -0,0 +1,132 @@ +import { IconDotsVertical, IconEdit, IconPower, IconSearch, IconTrash } from "@tabler/icons-react"; +import { Button } from "src/components"; +import { intl } from "src/locale"; + +export default function CertificateTable() { + return ( +
    +
    +
    +
    +
    +
    +

    {intl.formatMessage({ id: "certificates.title" })}

    +
    +
    +
    +
    + + + + +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    + blog.jc21.com +
    +
    Created: 20th September 2024
    +
    +
    http://172.17.0.1:3001Let's EncryptPublic + Online + + + +
    + Proxy Host #2 + + + Edit + + + + Disable + + + +
    +
    +
    +
    +
    + ); +} diff --git a/frontend/src/pages/Certificates/index.tsx b/frontend/src/pages/Certificates/index.tsx new file mode 100644 index 00000000..b4dca48c --- /dev/null +++ b/frontend/src/pages/Certificates/index.tsx @@ -0,0 +1,12 @@ +import { HasPermission } from "src/components"; +import CertificateTable from "./CertificateTable"; + +const Certificates = () => { + return ( + + + + ); +}; + +export default Certificates; diff --git a/frontend/src/pages/Dashboard/index.tsx b/frontend/src/pages/Dashboard/index.tsx new file mode 100644 index 00000000..78e2072d --- /dev/null +++ b/frontend/src/pages/Dashboard/index.tsx @@ -0,0 +1,145 @@ +import { IconArrowsCross, IconBolt, IconBoltOff, IconDisc } from "@tabler/icons-react"; +import { useNavigate } from "react-router-dom"; +import { useHostReport } from "src/hooks"; +import { intl } from "src/locale"; + +const Dashboard = () => { + const { data: hostReport } = useHostReport(); + const navigate = useNavigate(); + + return ( +
    +

    {intl.formatMessage({ id: "dashboard.title" })}

    + +
    +				{`Todo:
    +
    +- modal dialgs for everything
    +- Tables
    +- check mobile
    +- fix bad jwt not refreshing entire page
    +- add help docs for host types
    +- show user as disabled on user table
    +
    +More for api, then implement here:
    +- Properly implement refresh tokens
    +- don't create default user, instead use the is_setup from v3
    +  - also remove the initial user/pass env vars
    +  - update docs for this
    +- Add error message_18n for all backend errors
    +- minor: certificates expand with hosts needs to omit 'is_deleted'
    +`}
    +			
    +
    + ); +}; + +export default Dashboard; diff --git a/frontend/src/pages/Login/index.module.css b/frontend/src/pages/Login/index.module.css new file mode 100644 index 00000000..16f8477c --- /dev/null +++ b/frontend/src/pages/Login/index.module.css @@ -0,0 +1,10 @@ +.logo { + width: 200px; +} + +.helperBtns { + position: absolute; + top: 10px; + right: 10px; + z-index: 1000; +} diff --git a/frontend/src/pages/Login/index.tsx b/frontend/src/pages/Login/index.tsx new file mode 100644 index 00000000..2bc8490c --- /dev/null +++ b/frontend/src/pages/Login/index.tsx @@ -0,0 +1,126 @@ +import cn from "classnames"; +import { Field, Form, Formik } from "formik"; +import { useEffect, useRef, useState } from "react"; +import Alert from "react-bootstrap/Alert"; +import { Button, LocalePicker, Page, ThemeSwitcher } from "src/components"; +import { useAuthState } from "src/context"; +import { useHealth } from "src/hooks"; +import { intl } from "src/locale"; +import { validateEmail, validateString } from "src/modules/Validations"; +import styles from "./index.module.css"; + +export default function Login() { + const emailRef = useRef(null); + const [formErr, setFormErr] = useState(""); + const { login } = useAuthState(); + + const onSubmit = async (values: any, { setSubmitting }: any) => { + setFormErr(""); + try { + await login(values.email, values.password); + } catch (err) { + if (err instanceof Error) { + setFormErr(err.message); + } + } + setSubmitting(false); + }; + + useEffect(() => { + // @ts-expect-error ts-migrate(2531) FIXME: Object is possibly 'null'. + emailRef.current.focus(); + }, []); + + const health = useHealth(); + + const getVersion = () => { + if (!health.data) { + return ""; + } + const v = health.data.version; + return `v${v.major}.${v.minor}.${v.revision}`; + }; + + return ( + +
    + + +
    +
    +
    + Nginx Proxy Manager +
    +
    +
    +

    {intl.formatMessage({ id: "login.title" })}

    + {formErr !== "" && {formErr}} + + {({ isSubmitting }) => ( +
    +
    + + {({ field, form }: any) => ( + + )} + +
    +
    + + {({ field, form }: any) => ( + <> + + + )} + +
    +
    + +
    +
    + )} +
    +
    +
    +
    {getVersion()}
    +
    +
    + ); +} diff --git a/frontend/src/pages/Nginx/DeadHosts/Empty.tsx b/frontend/src/pages/Nginx/DeadHosts/Empty.tsx new file mode 100644 index 00000000..48865c88 --- /dev/null +++ b/frontend/src/pages/Nginx/DeadHosts/Empty.tsx @@ -0,0 +1,20 @@ +import type { Table as ReactTable } from "@tanstack/react-table"; +import { Button } from "src/components"; +import { intl } from "src/locale"; + +interface Props { + tableInstance: ReactTable; +} +export default function Empty({ tableInstance }: Props) { + return ( + + +
    +

    {intl.formatMessage({ id: "dead-hosts.empty" })}

    +

    {intl.formatMessage({ id: "empty-subtitle" })}

    + +
    + + + ); +} diff --git a/frontend/src/pages/Nginx/DeadHosts/Table.tsx b/frontend/src/pages/Nginx/DeadHosts/Table.tsx new file mode 100644 index 00000000..d9531956 --- /dev/null +++ b/frontend/src/pages/Nginx/DeadHosts/Table.tsx @@ -0,0 +1,109 @@ +import { IconDotsVertical, IconEdit, IconPower, IconTrash } from "@tabler/icons-react"; +import { createColumnHelper, getCoreRowModel, useReactTable } from "@tanstack/react-table"; +import { useMemo } from "react"; +import type { DeadHost } from "src/api/backend"; +import { CertificateFormatter, DomainsFormatter, GravatarFormatter, StatusFormatter } from "src/components"; +import { TableLayout } from "src/components/Table/TableLayout"; +import { intl } from "src/locale"; +import Empty from "./Empty"; + +interface Props { + data: DeadHost[]; + isFetching?: boolean; +} +export default function Table({ data, isFetching }: Props) { + const columnHelper = createColumnHelper(); + const columns = useMemo( + () => [ + columnHelper.accessor((row: any) => row.owner, { + id: "owner", + cell: (info: any) => { + const value = info.getValue(); + return ; + }, + meta: { + className: "w-1", + }, + }), + columnHelper.accessor((row: any) => row, { + id: "domainNames", + header: intl.formatMessage({ id: "column.source" }), + cell: (info: any) => { + const value = info.getValue(); + return ; + }, + }), + columnHelper.accessor((row: any) => row.certificate, { + id: "certificate", + header: intl.formatMessage({ id: "column.ssl" }), + cell: (info: any) => { + return ; + }, + }), + columnHelper.accessor((row: any) => row.enabled, { + id: "enabled", + header: intl.formatMessage({ id: "column.status" }), + cell: (info: any) => { + return ; + }, + }), + columnHelper.display({ + id: "id", // todo: not needed for a display? + cell: (info: any) => { + return ( + + +
    + + {intl.formatMessage( + { + id: "dead-hosts.actions-title", + }, + { id: info.row.original.id }, + )} + + + + {intl.formatMessage({ id: "action.edit" })} + + + + {intl.formatMessage({ id: "action.disable" })} + + + + ); + }, + meta: { + className: "text-end w-1", + }, + }), + ], + [columnHelper], + ); + + const tableInstance = useReactTable({ + columns, + data, + getCoreRowModel: getCoreRowModel(), + rowCount: data.length, + meta: { + isFetching, + }, + enableSortingRemoval: false, + }); + + return } />; +} diff --git a/frontend/src/pages/Nginx/DeadHosts/TableWrapper.tsx b/frontend/src/pages/Nginx/DeadHosts/TableWrapper.tsx new file mode 100644 index 00000000..5badc3b1 --- /dev/null +++ b/frontend/src/pages/Nginx/DeadHosts/TableWrapper.tsx @@ -0,0 +1,52 @@ +import { IconSearch } from "@tabler/icons-react"; +import Alert from "react-bootstrap/Alert"; +import { Button, LoadingPage } from "src/components"; +import { useDeadHosts } from "src/hooks"; +import { intl } from "src/locale"; +import Table from "./Table"; + +export default function TableWrapper() { + const { isFetching, isLoading, isError, error, data } = useDeadHosts(["owner", "certificate"]); + + if (isLoading) { + return ; + } + + if (isError) { + return {error?.message || "Unknown error"}; + } + + return ( +
    +
    +
    +
    +
    +
    +

    {intl.formatMessage({ id: "dead-hosts.title" })}

    +
    +
    +
    +
    + + + + +
    + +
    +
    +
    +
    + + + + ); +} diff --git a/frontend/src/pages/Nginx/DeadHosts/index.tsx b/frontend/src/pages/Nginx/DeadHosts/index.tsx new file mode 100644 index 00000000..94e0ab68 --- /dev/null +++ b/frontend/src/pages/Nginx/DeadHosts/index.tsx @@ -0,0 +1,12 @@ +import { HasPermission } from "src/components"; +import TableWrapper from "./TableWrapper"; + +const DeadHosts = () => { + return ( + + + + ); +}; + +export default DeadHosts; diff --git a/frontend/src/pages/Nginx/ProxyHosts/Empty.tsx b/frontend/src/pages/Nginx/ProxyHosts/Empty.tsx new file mode 100644 index 00000000..edfb8f8e --- /dev/null +++ b/frontend/src/pages/Nginx/ProxyHosts/Empty.tsx @@ -0,0 +1,25 @@ +import type { Table as ReactTable } from "@tanstack/react-table"; +import { Button } from "src/components"; +import { intl } from "src/locale"; + +/** + * This component should never render as there should always be 1 user minimum, + * but I'm keeping it for consistency. + */ + +interface Props { + tableInstance: ReactTable; +} +export default function Empty({ tableInstance }: Props) { + return ( + + + + ); +} diff --git a/frontend/src/pages/Nginx/ProxyHosts/Table.tsx b/frontend/src/pages/Nginx/ProxyHosts/Table.tsx new file mode 100644 index 00000000..bf423fc1 --- /dev/null +++ b/frontend/src/pages/Nginx/ProxyHosts/Table.tsx @@ -0,0 +1,125 @@ +import { IconDotsVertical, IconEdit, IconPower, IconTrash } from "@tabler/icons-react"; +import { createColumnHelper, getCoreRowModel, useReactTable } from "@tanstack/react-table"; +import { useMemo } from "react"; +import type { ProxyHost } from "src/api/backend"; +import { CertificateFormatter, DomainsFormatter, GravatarFormatter, StatusFormatter } from "src/components"; +import { TableLayout } from "src/components/Table/TableLayout"; +import { intl } from "src/locale"; +import Empty from "./Empty"; + +interface Props { + data: ProxyHost[]; + isFetching?: boolean; +} +export default function Table({ data, isFetching }: Props) { + const columnHelper = createColumnHelper(); + const columns = useMemo( + () => [ + columnHelper.accessor((row: any) => row.owner, { + id: "owner", + cell: (info: any) => { + const value = info.getValue(); + return ; + }, + meta: { + className: "w-1", + }, + }), + columnHelper.accessor((row: any) => row, { + id: "domainNames", + header: intl.formatMessage({ id: "column.source" }), + cell: (info: any) => { + const value = info.getValue(); + return ; + }, + }), + columnHelper.accessor((row: any) => row, { + id: "forwardHost", + header: intl.formatMessage({ id: "column.destination" }), + cell: (info: any) => { + const value = info.getValue(); + return `${value.forwardHost}:${value.forwardPort}`; + }, + }), + columnHelper.accessor((row: any) => row.certificate, { + id: "certificate", + header: intl.formatMessage({ id: "column.ssl" }), + cell: (info: any) => { + return ; + }, + }), + // TODO: formatter for access list + columnHelper.accessor((row: any) => row.access, { + id: "accessList", + header: intl.formatMessage({ id: "column.access" }), + cell: (info: any) => { + return info.getValue(); + }, + }), + columnHelper.accessor((row: any) => row.enabled, { + id: "enabled", + header: intl.formatMessage({ id: "column.status" }), + cell: (info: any) => { + return ; + }, + }), + columnHelper.display({ + id: "id", // todo: not needed for a display? + cell: (info: any) => { + return ( + + +
    + + {intl.formatMessage( + { + id: "proxy-hosts.actions-title", + }, + { id: info.row.original.id }, + )} + + + + {intl.formatMessage({ id: "action.edit" })} + + + + {intl.formatMessage({ id: "action.disable" })} + + + + ); + }, + meta: { + className: "text-end w-1", + }, + }), + ], + [columnHelper], + ); + + const tableInstance = useReactTable({ + columns, + data, + getCoreRowModel: getCoreRowModel(), + rowCount: data.length, + meta: { + isFetching, + }, + enableSortingRemoval: false, + }); + + return } />; +} diff --git a/frontend/src/pages/Nginx/ProxyHosts/TableWrapper.tsx b/frontend/src/pages/Nginx/ProxyHosts/TableWrapper.tsx new file mode 100644 index 00000000..a297200d --- /dev/null +++ b/frontend/src/pages/Nginx/ProxyHosts/TableWrapper.tsx @@ -0,0 +1,52 @@ +import { IconSearch } from "@tabler/icons-react"; +import Alert from "react-bootstrap/Alert"; +import { Button, LoadingPage } from "src/components"; +import { useProxyHosts } from "src/hooks"; +import { intl } from "src/locale"; +import Table from "./Table"; + +export default function TableWrapper() { + const { isFetching, isLoading, isError, error, data } = useProxyHosts(["owner", "access_list", "certificate"]); + + if (isLoading) { + return ; + } + + if (isError) { + return {error?.message || "Unknown error"}; + } + + return ( +
    +
    +
    +
    +
    +
    +

    {intl.formatMessage({ id: "proxy-hosts.title" })}

    +
    +
    +
    +
    + + + + +
    + +
    +
    +
    +
    +
    +
    +

    {intl.formatMessage({ id: "proxy-hosts.empty" })}

    +

    {intl.formatMessage({ id: "empty-subtitle" })}

    + +
    +
    + + + ); +} diff --git a/frontend/src/pages/Nginx/ProxyHosts/index.tsx b/frontend/src/pages/Nginx/ProxyHosts/index.tsx new file mode 100644 index 00000000..aa0e4774 --- /dev/null +++ b/frontend/src/pages/Nginx/ProxyHosts/index.tsx @@ -0,0 +1,12 @@ +import { HasPermission } from "src/components"; +import TableWrapper from "./TableWrapper"; + +const ProxyHosts = () => { + return ( + + + + ); +}; + +export default ProxyHosts; diff --git a/frontend/src/pages/Nginx/RedirectionHosts/Empty.tsx b/frontend/src/pages/Nginx/RedirectionHosts/Empty.tsx new file mode 100644 index 00000000..f0d0ee8a --- /dev/null +++ b/frontend/src/pages/Nginx/RedirectionHosts/Empty.tsx @@ -0,0 +1,20 @@ +import type { Table as ReactTable } from "@tanstack/react-table"; +import { Button } from "src/components"; +import { intl } from "src/locale"; + +interface Props { + tableInstance: ReactTable; +} +export default function Empty({ tableInstance }: Props) { + return ( + + + + ); +} diff --git a/frontend/src/pages/Nginx/RedirectionHosts/Table.tsx b/frontend/src/pages/Nginx/RedirectionHosts/Table.tsx new file mode 100644 index 00000000..aec651fb --- /dev/null +++ b/frontend/src/pages/Nginx/RedirectionHosts/Table.tsx @@ -0,0 +1,130 @@ +import { IconDotsVertical, IconEdit, IconPower, IconTrash } from "@tabler/icons-react"; +import { createColumnHelper, getCoreRowModel, useReactTable } from "@tanstack/react-table"; +import { useMemo } from "react"; +import type { RedirectionHost } from "src/api/backend"; +import { CertificateFormatter, DomainsFormatter, GravatarFormatter, StatusFormatter } from "src/components"; +import { TableLayout } from "src/components/Table/TableLayout"; +import { intl } from "src/locale"; +import Empty from "./Empty"; + +interface Props { + data: RedirectionHost[]; + isFetching?: boolean; +} +export default function Table({ data, isFetching }: Props) { + const columnHelper = createColumnHelper(); + const columns = useMemo( + () => [ + columnHelper.accessor((row: any) => row.owner, { + id: "owner", + cell: (info: any) => { + const value = info.getValue(); + return ; + }, + meta: { + className: "w-1", + }, + }), + columnHelper.accessor((row: any) => row, { + id: "domainNames", + header: intl.formatMessage({ id: "column.source" }), + cell: (info: any) => { + const value = info.getValue(); + return ; + }, + }), + columnHelper.accessor((row: any) => row.forwardHttpCode, { + id: "forwardHttpCode", + header: intl.formatMessage({ id: "column.http-code" }), + cell: (info: any) => { + return info.getValue(); + }, + }), + columnHelper.accessor((row: any) => row.forwardScheme, { + id: "forwardScheme", + header: intl.formatMessage({ id: "column.scheme" }), + cell: (info: any) => { + return info.getValue().toUpperCase(); + }, + }), + columnHelper.accessor((row: any) => row.forwardDomainName, { + id: "forwardDomainName", + header: intl.formatMessage({ id: "column.destination" }), + cell: (info: any) => { + return info.getValue(); + }, + }), + columnHelper.accessor((row: any) => row.certificate, { + id: "certificate", + header: intl.formatMessage({ id: "column.ssl" }), + cell: (info: any) => { + return ; + }, + }), + columnHelper.accessor((row: any) => row.enabled, { + id: "enabled", + header: intl.formatMessage({ id: "column.status" }), + cell: (info: any) => { + return ; + }, + }), + columnHelper.display({ + id: "id", // todo: not needed for a display? + cell: (info: any) => { + return ( + + +
    + + {intl.formatMessage( + { + id: "redirection-hosts.actions-title", + }, + { id: info.row.original.id }, + )} + + + + {intl.formatMessage({ id: "action.edit" })} + + + + {intl.formatMessage({ id: "action.disable" })} + + + + ); + }, + meta: { + className: "text-end w-1", + }, + }), + ], + [columnHelper], + ); + + const tableInstance = useReactTable({ + columns, + data, + getCoreRowModel: getCoreRowModel(), + rowCount: data.length, + meta: { + isFetching, + }, + enableSortingRemoval: false, + }); + + return } />; +} diff --git a/frontend/src/pages/Nginx/RedirectionHosts/TableWrapper.tsx b/frontend/src/pages/Nginx/RedirectionHosts/TableWrapper.tsx new file mode 100644 index 00000000..5dccd82a --- /dev/null +++ b/frontend/src/pages/Nginx/RedirectionHosts/TableWrapper.tsx @@ -0,0 +1,52 @@ +import { IconSearch } from "@tabler/icons-react"; +import Alert from "react-bootstrap/Alert"; +import { Button, LoadingPage } from "src/components"; +import { useRedirectionHosts } from "src/hooks"; +import { intl } from "src/locale"; +import Table from "./Table"; + +export default function TableWrapper() { + const { isFetching, isLoading, isError, error, data } = useRedirectionHosts(["owner", "certificate"]); + + if (isLoading) { + return ; + } + + if (isError) { + return {error?.message || "Unknown error"}; + } + + return ( +
    +
    +
    +
    +
    +
    +

    {intl.formatMessage({ id: "redirection-hosts.title" })}

    +
    +
    +
    +
    + + + + +
    + +
    +
    +
    +
    +
    +
    +

    {intl.formatMessage({ id: "redirection-hosts.empty" })}

    +

    {intl.formatMessage({ id: "empty-subtitle" })}

    + +
    +
    + + + ); +} diff --git a/frontend/src/pages/Nginx/RedirectionHosts/index.tsx b/frontend/src/pages/Nginx/RedirectionHosts/index.tsx new file mode 100644 index 00000000..bc636b35 --- /dev/null +++ b/frontend/src/pages/Nginx/RedirectionHosts/index.tsx @@ -0,0 +1,12 @@ +import { HasPermission } from "src/components"; +import TableWrapper from "./TableWrapper"; + +const RedirectionHosts = () => { + return ( + + + + ); +}; + +export default RedirectionHosts; diff --git a/frontend/src/pages/Nginx/Streams/Empty.tsx b/frontend/src/pages/Nginx/Streams/Empty.tsx new file mode 100644 index 00000000..5ee73015 --- /dev/null +++ b/frontend/src/pages/Nginx/Streams/Empty.tsx @@ -0,0 +1,20 @@ +import type { Table as ReactTable } from "@tanstack/react-table"; +import { Button } from "src/components"; +import { intl } from "src/locale"; + +interface Props { + tableInstance: ReactTable; +} +export default function Empty({ tableInstance }: Props) { + return ( + + + + ); +} diff --git a/frontend/src/pages/Nginx/Streams/Table.tsx b/frontend/src/pages/Nginx/Streams/Table.tsx new file mode 100644 index 00000000..49d007d9 --- /dev/null +++ b/frontend/src/pages/Nginx/Streams/Table.tsx @@ -0,0 +1,139 @@ +import { IconDotsVertical, IconEdit, IconPower, IconTrash } from "@tabler/icons-react"; +import { createColumnHelper, getCoreRowModel, useReactTable } from "@tanstack/react-table"; +import { useMemo } from "react"; +import type { Stream } from "src/api/backend"; +import { CertificateFormatter, DomainsFormatter, GravatarFormatter, StatusFormatter } from "src/components"; +import { TableLayout } from "src/components/Table/TableLayout"; +import { intl } from "src/locale"; +import Empty from "./Empty"; + +interface Props { + data: Stream[]; + isFetching?: boolean; +} +export default function Table({ data, isFetching }: Props) { + const columnHelper = createColumnHelper(); + const columns = useMemo( + () => [ + columnHelper.accessor((row: any) => row.owner, { + id: "owner", + cell: (info: any) => { + const value = info.getValue(); + return ; + }, + meta: { + className: "w-1", + }, + }), + columnHelper.accessor((row: any) => row, { + id: "incomingPort", + header: intl.formatMessage({ id: "column.incoming-port" }), + cell: (info: any) => { + const value = info.getValue(); + // Bit of a hack to reuse the DomainsFormatter component + return ; + }, + }), + columnHelper.accessor((row: any) => row, { + id: "forwardHttpCode", + header: intl.formatMessage({ id: "column.destination" }), + cell: (info: any) => { + const value = info.getValue(); + return `${value.forwardingHost}:${value.forwardingPort}`; + }, + }), + columnHelper.accessor((row: any) => row, { + id: "tcpForwarding", + header: intl.formatMessage({ id: "column.protocol" }), + cell: (info: any) => { + const value = info.getValue(); + return ( + <> + {value.tcpForwarding ? ( + + {intl.formatMessage({ id: "streams.tcp" })} + + ) : null} + {value.udpForwarding ? ( + + {intl.formatMessage({ id: "streams.udp" })} + + ) : null} + + ); + }, + }), + columnHelper.accessor((row: any) => row.certificate, { + id: "certificate", + header: intl.formatMessage({ id: "column.ssl" }), + cell: (info: any) => { + return ; + }, + }), + columnHelper.accessor((row: any) => row.enabled, { + id: "enabled", + header: intl.formatMessage({ id: "column.status" }), + cell: (info: any) => { + return ; + }, + }), + columnHelper.display({ + id: "id", // todo: not needed for a display? + cell: (info: any) => { + return ( + + +
    + + {intl.formatMessage( + { + id: "streams.actions-title", + }, + { id: info.row.original.id }, + )} + + + + {intl.formatMessage({ id: "action.edit" })} + + + + {intl.formatMessage({ id: "action.disable" })} + + + + ); + }, + meta: { + className: "text-end w-1", + }, + }), + ], + [columnHelper], + ); + + const tableInstance = useReactTable({ + columns, + data, + getCoreRowModel: getCoreRowModel(), + rowCount: data.length, + meta: { + isFetching, + }, + enableSortingRemoval: false, + }); + + return } />; +} diff --git a/frontend/src/pages/Nginx/Streams/TableWrapper.tsx b/frontend/src/pages/Nginx/Streams/TableWrapper.tsx new file mode 100644 index 00000000..7b6f8d50 --- /dev/null +++ b/frontend/src/pages/Nginx/Streams/TableWrapper.tsx @@ -0,0 +1,52 @@ +import { IconSearch } from "@tabler/icons-react"; +import Alert from "react-bootstrap/Alert"; +import { Button, LoadingPage } from "src/components"; +import { useStreams } from "src/hooks"; +import { intl } from "src/locale"; +import Table from "./Table"; + +export default function TableWrapper() { + const { isFetching, isLoading, isError, error, data } = useStreams(["owner", "certificate"]); + + if (isLoading) { + return ; + } + + if (isError) { + return {error?.message || "Unknown error"}; + } + + return ( +
    +
    +
    +
    +
    +
    +

    {intl.formatMessage({ id: "streams.title" })}

    +
    +
    +
    +
    + + + + +
    + +
    +
    +
    +
    +
    +
    +

    {intl.formatMessage({ id: "streams.empty" })}

    +

    {intl.formatMessage({ id: "empty-subtitle" })}

    + +
    +
    + + + ); +} diff --git a/frontend/src/pages/Nginx/Streams/index.tsx b/frontend/src/pages/Nginx/Streams/index.tsx new file mode 100644 index 00000000..ab3f8fc6 --- /dev/null +++ b/frontend/src/pages/Nginx/Streams/index.tsx @@ -0,0 +1,12 @@ +import { HasPermission } from "src/components"; +import TableWrapper from "./TableWrapper"; + +const Streams = () => { + return ( + + + + ); +}; + +export default Streams; diff --git a/frontend/src/pages/Settings/SettingTable.tsx b/frontend/src/pages/Settings/SettingTable.tsx new file mode 100644 index 00000000..0cba2d58 --- /dev/null +++ b/frontend/src/pages/Settings/SettingTable.tsx @@ -0,0 +1,111 @@ +import { IconDotsVertical, IconEdit, IconPower, IconTrash } from "@tabler/icons-react"; +import { intl } from "src/locale"; + +export default function AuditTable() { + return ( +
    +
    +
    +
    +
    +

    {intl.formatMessage({ id: "settings.title" })}

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    + blog.jc21.com +
    +
    Created: 20th September 2024
    +
    +
    http://172.17.0.1:3001Let's EncryptPublic + Online + + + +
    + Proxy Host #2 + + + Edit + + + + Disable + + + +
    +
    +
    +
    +
    + ); +} diff --git a/frontend/src/pages/Settings/index.tsx b/frontend/src/pages/Settings/index.tsx new file mode 100644 index 00000000..bb2e84e2 --- /dev/null +++ b/frontend/src/pages/Settings/index.tsx @@ -0,0 +1,12 @@ +import { HasPermission } from "src/components"; +import SettingTable from "./SettingTable"; + +const Settings = () => { + return ( + + + + ); +}; + +export default Settings; diff --git a/frontend/src/pages/Users/Empty.tsx b/frontend/src/pages/Users/Empty.tsx new file mode 100644 index 00000000..162e7094 --- /dev/null +++ b/frontend/src/pages/Users/Empty.tsx @@ -0,0 +1,20 @@ +import type { Table as ReactTable } from "@tanstack/react-table"; +import { Button } from "src/components"; +import { intl } from "src/locale"; + +interface Props { + tableInstance: ReactTable; +} +export default function Empty({ tableInstance }: Props) { + return ( + + +
    +

    {intl.formatMessage({ id: "proxy-hosts.empty" })}

    +

    {intl.formatMessage({ id: "empty-subtitle" })}

    + +
    + + + ); +} diff --git a/frontend/src/pages/Users/Table.tsx b/frontend/src/pages/Users/Table.tsx new file mode 100644 index 00000000..6f09892d --- /dev/null +++ b/frontend/src/pages/Users/Table.tsx @@ -0,0 +1,128 @@ +import { IconDotsVertical, IconEdit, IconLock, IconShield, IconTrash } from "@tabler/icons-react"; +import { createColumnHelper, getCoreRowModel, useReactTable } from "@tanstack/react-table"; +import { useMemo } from "react"; +import type { User } from "src/api/backend"; +import { GravatarFormatter, ValueWithDateFormatter } from "src/components"; +import { TableLayout } from "src/components/Table/TableLayout"; +import { intl } from "src/locale"; +import Empty from "./Empty"; + +interface Props { + data: User[]; + isFetching?: boolean; + currentUserId?: number; + onEditUser?: (id: number) => void; +} +export default function Table({ data, isFetching, currentUserId, onEditUser }: Props) { + const columnHelper = createColumnHelper(); + const columns = useMemo( + () => [ + columnHelper.accessor((row: any) => row, { + id: "avatar", + cell: (info: any) => { + const value = info.getValue(); + return ; + }, + meta: { + className: "w-1", + }, + }), + columnHelper.accessor((row: any) => row, { + id: "name", + header: intl.formatMessage({ id: "column.name" }), + cell: (info: any) => { + const value = info.getValue(); + // Hack to reuse domains formatter + return ; + }, + }), + columnHelper.accessor((row: any) => row.email, { + id: "email", + header: intl.formatMessage({ id: "column.email" }), + cell: (info: any) => { + return info.getValue(); + }, + }), + // TODO: formatter for roles + columnHelper.accessor((row: any) => row.roles, { + id: "roles", + header: intl.formatMessage({ id: "column.roles" }), + cell: (info: any) => { + return JSON.stringify(info.getValue()); + }, + }), + columnHelper.display({ + id: "id", // todo: not needed for a display? + cell: (info: any) => { + return ( + + +
    + + {intl.formatMessage( + { + id: "users.actions-title", + }, + { id: info.row.original.id }, + )} + + { + e.preventDefault(); + onEditUser?.(info.row.original.id); + }} + > + + {intl.formatMessage({ id: "user.edit" })} + + + + {intl.formatMessage({ id: "action.permissions" })} + + + + {intl.formatMessage({ id: "user.change-password" })} + + {currentUserId !== info.row.original.id ? ( + <> + + + ); + }, + meta: { + className: "text-end w-1", + }, + }), + ], + [columnHelper, currentUserId, onEditUser], + ); + + const tableInstance = useReactTable({ + columns, + data, + getCoreRowModel: getCoreRowModel(), + rowCount: data.length, + meta: { + isFetching, + }, + enableSortingRemoval: false, + }); + + return } />; +} diff --git a/frontend/src/pages/Users/TableWrapper.tsx b/frontend/src/pages/Users/TableWrapper.tsx new file mode 100644 index 00000000..4ec62e1e --- /dev/null +++ b/frontend/src/pages/Users/TableWrapper.tsx @@ -0,0 +1,62 @@ +import { IconSearch } from "@tabler/icons-react"; +import { useState } from "react"; +import Alert from "react-bootstrap/Alert"; +import { Button, LoadingPage } from "src/components"; +import { useUser, useUsers } from "src/hooks"; +import { intl } from "src/locale"; +import { UserModal } from "src/modals"; +import Table from "./Table"; + +export default function TableWrapper() { + const [editUserId, setEditUserId] = useState(0); + const { isFetching, isLoading, isError, error, data } = useUsers(["permissions"]); + const { data: currentUser } = useUser("me"); + + if (isLoading) { + return ; + } + + if (isError) { + return {error?.message || "Unknown error"}; + } + + return ( +
    +
    +
    +
    +
    +
    +

    {intl.formatMessage({ id: "users.title" })}

    +
    +
    +
    +
    + + + + +
    + +
    +
    +
    +
    + setEditUserId(id)} + /> + {editUserId ? setEditUserId(0)} /> : null} + + + ); +} diff --git a/frontend/src/pages/Users/index.tsx b/frontend/src/pages/Users/index.tsx new file mode 100644 index 00000000..64e8e6d7 --- /dev/null +++ b/frontend/src/pages/Users/index.tsx @@ -0,0 +1,12 @@ +import { HasPermission } from "src/components"; +import TableWrapper from "./TableWrapper"; + +const Users = () => { + return ( + + + + ); +}; + +export default Users; diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/frontend/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 00000000..fb86d45b --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,43 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], + "module": "ESNext", + "skipLibCheck": true, + "baseUrl": ".", + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "paths": { + "src/*": [ + "./src/*" + ], + "test/*": [ + "./test/*" + ] + } + }, + "include": [ + "src", + "test" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json new file mode 100644 index 00000000..eca66688 --- /dev/null +++ b/frontend/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 00000000..d2bded43 --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,44 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; +import checker from "vite-plugin-checker"; +import tsconfigPaths from "vite-tsconfig-paths"; +import "vitest/config"; +import { execFile } from "node:child_process"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + { + name: "trigger-script-on-reload", + configureServer(server) { + server.watcher.on("change", (file) => { + if (file.includes("locale/src")) { + console.log(`File changed: ${file}, running locale-compile script...`); + execFile("yarn", ["locale-compile"], (error, stdout, _stderr) => { + if (error) { + throw error; + } + console.log(stdout); + }); + } + }); + }, + }, + react(), + checker({ + // e.g. use TypeScript check + typescript: true, + }), + tsconfigPaths(), + ], + server: { + host: true, + port: 5173, + strictPort: true, + allowedHosts: true, + }, + test: { + environment: "happy-dom", + setupFiles: ["./vitest-setup.js"], + }, +}); diff --git a/frontend/vitest-setup.js b/frontend/vitest-setup.js new file mode 100644 index 00000000..f149f27a --- /dev/null +++ b/frontend/vitest-setup.js @@ -0,0 +1 @@ +import "@testing-library/jest-dom/vitest"; diff --git a/frontend/webpack.config.js b/frontend/webpack.config.js deleted file mode 100644 index 05350a47..00000000 --- a/frontend/webpack.config.js +++ /dev/null @@ -1,144 +0,0 @@ -const path = require('path'); -const webpack = require('webpack'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const Visualizer = require('webpack-visualizer-plugin'); -const CopyWebpackPlugin = require('copy-webpack-plugin'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const PACKAGE = require('./package.json'); - -module.exports = { - entry: { - main: './js/index.js', - login: './js/login.js' - }, - output: { - path: path.resolve(__dirname, 'dist'), - filename: `js/[name].bundle.js?v=${PACKAGE.version}`, - chunkFilename: `js/[name].bundle.[id].js?v=${PACKAGE.version}`, - publicPath: '/' - }, - resolve: { - alias: { - 'tabler-core': 'tabler-ui/dist/assets/js/core', - 'bootstrap': 'tabler-ui/dist/assets/js/vendors/bootstrap.bundle.min', - 'sparkline': 'tabler-ui/dist/assets/js/vendors/jquery.sparkline.min', - 'selectize': 'tabler-ui/dist/assets/js/vendors/selectize.min', - 'tablesorter': 'tabler-ui/dist/assets/js/vendors/jquery.tablesorter.min', - 'vector-map': 'tabler-ui/dist/assets/js/vendors/jquery-jvectormap-2.0.3.min', - 'vector-map-de': 'tabler-ui/dist/assets/js/vendors/jquery-jvectormap-de-merc', - 'vector-map-world': 'tabler-ui/dist/assets/js/vendors/jquery-jvectormap-world-mill', - 'circle-progress': 'tabler-ui/dist/assets/js/vendors/circle-progress.min', - 'c3': 'tabler-ui/dist/assets/js/vendors/chart.bundle.min' - } - }, - module: { - rules: [ - // Shims for tabler-ui - { - test: /assets\/js\/core/, - loader: 'imports-loader?bootstrap' - }, - { - test: /jquery-jvectormap-de-merc/, - loader: 'imports-loader?vector-map' - }, - { - test: /jquery-jvectormap-world-mill/, - loader: 'imports-loader?vector-map' - }, - - // other: - { - type: 'javascript/auto', // <= Set the module.type explicitly - test: /\bmessages\.json$/, - loader: 'messageformat-loader', - options: { - biDiSupport: false, - disablePluralKeyChecks: false, - formatters: null, - intlSupport: false, - locale: ['en'], - strictNumberSign: false - } - }, - { - test: /\.js$/, - exclude: /node_modules/, - use: { - loader: 'babel-loader' - } - }, - { - test: /\.ejs$/, - loader: 'ejs-loader' - }, - { - test: /\.scss$/, - use: [ - MiniCssExtractPlugin.loader, - 'css-loader', - 'sass-loader' - ] - }, - { - test: /.*tabler.*\.(jpe?g|gif|png|svg|eot|woff|ttf)$/, - use: [ - { - loader: 'file-loader', - options: { - outputPath: 'assets/tabler-ui/' - } - } - ] - }, - { - test: /source-sans-pro.*\.(woff(2)?)(\?v=\d+\.\d+\.\d+)?$/, - use: [ - { - loader: 'file-loader', - options: { - name: '[name].[ext]', - outputPath: 'assets/' - } - } - ] - } - ] - }, - plugins: [ - new webpack.ProvidePlugin({ - $: 'jquery', - jQuery: 'jquery', - _: 'underscore' - }), - new HtmlWebpackPlugin({ - template: '!!ejs-webpack-loader!html/index.ejs', - filename: 'index.html', - inject: false, - templateParameters: { - version: PACKAGE.version - } - }), - new HtmlWebpackPlugin({ - template: '!!ejs-webpack-loader!html/login.ejs', - filename: 'login.html', - inject: false, - templateParameters: { - version: PACKAGE.version - } - }), - new MiniCssExtractPlugin({ - filename: 'css/[name].css', - chunkFilename: 'css/[id].css' - }), - new Visualizer({ - filename: '../webpack_stats.html' - }), - new CopyWebpackPlugin([{ - from: 'app-images', - to: 'images', - toType: 'dir', - context: '/app/frontend' - }]) - ] -}; diff --git a/frontend/yarn.lock b/frontend/yarn.lock index d1522dbe..0c9abba8 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2,305 +2,590 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== +"@adobe/css-tools@^4.4.0": + version "4.4.4" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.4.tgz#2856c55443d3d461693f32d2b96fb6ea92e1ffa9" + integrity sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg== + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== - dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - -"@babel/core@^7.9.0": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643" - integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.1" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.0" - "@babel/types" "^7.11.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" - integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== - dependencies: - "@babel/types" "^7.11.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== - dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@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.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-member-expression-to-functions@^7.10.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" - integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-module-imports@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-module-transforms@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" - integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/template" "^7.10.4" - "@babel/types" "^7.11.0" - lodash "^4.17.19" - -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-replace-supers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" - integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-simple-access@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" - integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== - dependencies: - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== - dependencies: - "@babel/types" "^7.11.0" - -"@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.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@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/helpers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" - integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== - dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - chalk "^2.0.0" + "@babel/helper-validator-identifier" "^7.27.1" js-tokens "^4.0.0" + picocolors "^1.1.1" -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== +"@babel/compat-data@^7.27.2": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790" + integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== + +"@babel/core@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.4.tgz#12a550b8794452df4c8b084f95003bce1742d496" + integrity sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA== dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.10.4", "@babel/parser@^7.11.1": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.2.tgz#0882ab8a455df3065ea2dcb4c753b2460a24bead" - integrity sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw== - -"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== - -"@babel/template@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/template@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@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.23.0" - "@babel/types" "^7.23.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.3" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.28.3" + "@babel/helpers" "^7.28.4" + "@babel/parser" "^7.28.4" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.4" + "@babel/types" "^7.28.4" + "@jridgewell/remapping" "^2.3.5" + convert-source-map "^2.0.0" debug "^4.1.0" - globals "^11.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" -"@babel/types@^7.10.4", "@babel/types@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" - integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== +"@babel/generator@^7.28.3": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.3.tgz#9626c1741c650cbac39121694a0f2d7451b8ef3e" + integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" + "@babel/parser" "^7.28.3" + "@babel/types" "^7.28.2" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== +"@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.28.3": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" + integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.28.3" + +"@babel/helper-plugin-utils@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" + integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== + dependencies: + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.4" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.2", "@babel/parser@^7.28.3": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.3.tgz#d2d25b814621bca5fe9d172bc93792547e7a2a71" + integrity sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA== + dependencies: + "@babel/types" "^7.28.2" + +"@babel/parser@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.4.tgz#da25d4643532890932cc03f7705fe19637e03fa8" + integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== + dependencies: + "@babel/types" "^7.28.4" + +"@babel/plugin-transform-react-jsx-self@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" + integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-jsx-source@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" + integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/runtime@^7.12.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.4.tgz#a70226016fabe25c5783b2f22d3e1c9bc5ca3326" + integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ== + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.24.7", "@babel/runtime@^7.26.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.3.tgz#75c5034b55ba868121668be5d5bb31cc64e6e61a" + integrity sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA== + +"@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3": + version "7.28.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.3.tgz#6911a10795d2cce43ec6a28cffc440cca2593434" + integrity sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.3" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.3" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.2" + debug "^4.3.1" + +"@babel/traverse@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.4.tgz#8d456101b96ab175d487249f60680221692b958b" + integrity sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.3" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.4" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.4" + debug "^4.3.1" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.28.2": + version "7.28.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" + integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@babel/types@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a" + integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@biomejs/biome@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-2.2.4.tgz#184e4b83f89bd0d4151682a5aa3840df37748e17" + integrity sha512-TBHU5bUy/Ok6m8c0y3pZiuO/BZoY/OcGxoLlrfQof5s8ISVwbVBdFINPQZyFfKwil8XibYWb7JMwnT8wT4WVPg== + optionalDependencies: + "@biomejs/cli-darwin-arm64" "2.2.4" + "@biomejs/cli-darwin-x64" "2.2.4" + "@biomejs/cli-linux-arm64" "2.2.4" + "@biomejs/cli-linux-arm64-musl" "2.2.4" + "@biomejs/cli-linux-x64" "2.2.4" + "@biomejs/cli-linux-x64-musl" "2.2.4" + "@biomejs/cli-win32-arm64" "2.2.4" + "@biomejs/cli-win32-x64" "2.2.4" + +"@biomejs/cli-darwin-arm64@2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.4.tgz#9b50620c93501e370b7e6d5a8445f117f9946a0c" + integrity sha512-RJe2uiyaloN4hne4d2+qVj3d3gFJFbmrr5PYtkkjei1O9c+BjGXgpUPVbi8Pl8syumhzJjFsSIYkcLt2VlVLMA== + +"@biomejs/cli-darwin-x64@2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.4.tgz#343620c884fc8141155d114430e80e4eacfddc9e" + integrity sha512-cFsdB4ePanVWfTnPVaUX+yr8qV8ifxjBKMkZwN7gKb20qXPxd/PmwqUH8mY5wnM9+U0QwM76CxFyBRJhC9tQwg== + +"@biomejs/cli-linux-arm64-musl@2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.4.tgz#cabcdadce2bc88b697f4063374224266c6f8b6e5" + integrity sha512-7TNPkMQEWfjvJDaZRSkDCPT/2r5ESFPKx+TEev+I2BXDGIjfCZk2+b88FOhnJNHtksbOZv8ZWnxrA5gyTYhSsQ== + +"@biomejs/cli-linux-arm64@2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.4.tgz#55620f8f088145e62e1158eb85c568554d0c8673" + integrity sha512-M/Iz48p4NAzMXOuH+tsn5BvG/Jb07KOMTdSVwJpicmhN309BeEyRyQX+n1XDF0JVSlu28+hiTQ2L4rZPvu7nMw== + +"@biomejs/cli-linux-x64-musl@2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.4.tgz#6bfaea72505afdbda66a66c998d2d169a8b55f90" + integrity sha512-m41nFDS0ksXK2gwXL6W6yZTYPMH0LughqbsxInSKetoH6morVj43szqKx79Iudkp8WRT5SxSh7qVb8KCUiewGg== + +"@biomejs/cli-linux-x64@2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.4.tgz#8c1ed61dcafb8a5939346c714ec122651f57e1db" + integrity sha512-orr3nnf2Dpb2ssl6aihQtvcKtLySLta4E2UcXdp7+RTa7mfJjBgIsbS0B9GC8gVu0hjOu021aU8b3/I1tn+pVQ== + +"@biomejs/cli-win32-arm64@2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.4.tgz#b2528f6c436e753d6083d7779f0662e08786cedb" + integrity sha512-NXnfTeKHDFUWfxAefa57DiGmu9VyKi0cDqFpdI+1hJWQjGJhJutHPX0b5m+eXvTKOaf+brU+P0JrQAZMb5yYaQ== + +"@biomejs/cli-win32-x64@2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.4.tgz#c8e21413120fe073fa49b78fdd987022941ff66f" + integrity sha512-3Y4V4zVRarVh/B/eSHczR4LYoSVyv3Dfuvm3cWs5w/HScccS0+Wt/lHOcDTRYeHjQmMYVC3rIRWqyN2EI52+zg== + +"@emotion/babel-plugin@^11.13.5": + version "11.13.5" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz#eab8d65dbded74e0ecfd28dc218e75607c4e7bc0" + integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/serialize" "^1.3.3" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" + +"@emotion/cache@^11.14.0", "@emotion/cache@^11.4.0": + version "11.14.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.14.0.tgz#ee44b26986eeb93c8be82bb92f1f7a9b21b2ed76" + integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA== + dependencies: + "@emotion/memoize" "^0.9.0" + "@emotion/sheet" "^1.4.0" + "@emotion/utils" "^1.4.2" + "@emotion/weak-memoize" "^0.4.0" + stylis "4.2.0" + +"@emotion/hash@^0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" + integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== + +"@emotion/memoize@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102" + integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== + +"@emotion/react@^11.8.1": + version "11.14.0" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.14.0.tgz#cfaae35ebc67dd9ef4ea2e9acc6cd29e157dd05d" + integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.13.5" + "@emotion/cache" "^11.14.0" + "@emotion/serialize" "^1.3.3" + "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0" + "@emotion/utils" "^1.4.2" + "@emotion/weak-memoize" "^0.4.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.3.tgz#d291531005f17d704d0463a032fe679f376509e8" + integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA== + dependencies: + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/unitless" "^0.10.0" + "@emotion/utils" "^1.4.2" + csstype "^3.0.2" + +"@emotion/sheet@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c" + integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== + +"@emotion/unitless@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745" + integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== + +"@emotion/use-insertion-effect-with-fallbacks@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz#8a8cb77b590e09affb960f4ff1e9a89e532738bf" + integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg== + +"@emotion/utils@^1.4.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.2.tgz#6df6c45881fcb1c412d6688a311a98b7f59c1b52" + integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA== + +"@emotion/weak-memoize@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6" + integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== + +"@esbuild/aix-ppc64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz#bef96351f16520055c947aba28802eede3c9e9a9" + integrity sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA== + +"@esbuild/android-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz#d2e70be7d51a529425422091e0dcb90374c1546c" + integrity sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg== + +"@esbuild/android-arm@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.9.tgz#d2a753fe2a4c73b79437d0ba1480e2d760097419" + integrity sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ== + +"@esbuild/android-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.9.tgz#5278836e3c7ae75761626962f902a0d55352e683" + integrity sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw== + +"@esbuild/darwin-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz#f1513eaf9ec8fa15dcaf4c341b0f005d3e8b47ae" + integrity sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg== + +"@esbuild/darwin-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz#e27dbc3b507b3a1cea3b9280a04b8b6b725f82be" + integrity sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ== + +"@esbuild/freebsd-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz#364e3e5b7a1fd45d92be08c6cc5d890ca75908ca" + integrity sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q== + +"@esbuild/freebsd-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz#7c869b45faeb3df668e19ace07335a0711ec56ab" + integrity sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg== + +"@esbuild/linux-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz#48d42861758c940b61abea43ba9a29b186d6cb8b" + integrity sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw== + +"@esbuild/linux-arm@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz#6ce4b9cabf148274101701d112b89dc67cc52f37" + integrity sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw== + +"@esbuild/linux-ia32@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz#207e54899b79cac9c26c323fc1caa32e3143f1c4" + integrity sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A== + +"@esbuild/linux-loong64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz#0ba48a127159a8f6abb5827f21198b999ffd1fc0" + integrity sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ== + +"@esbuild/linux-mips64el@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz#a4d4cc693d185f66a6afde94f772b38ce5d64eb5" + integrity sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA== + +"@esbuild/linux-ppc64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz#0f5805c1c6d6435a1dafdc043cb07a19050357db" + integrity sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w== + +"@esbuild/linux-riscv64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz#6776edece0f8fca79f3386398b5183ff2a827547" + integrity sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg== + +"@esbuild/linux-s390x@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz#3f6f29ef036938447c2218d309dc875225861830" + integrity sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA== + +"@esbuild/linux-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz#831fe0b0e1a80a8b8391224ea2377d5520e1527f" + integrity sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg== + +"@esbuild/netbsd-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz#06f99d7eebe035fbbe43de01c9d7e98d2a0aa548" + integrity sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q== + +"@esbuild/netbsd-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz#db99858e6bed6e73911f92a88e4edd3a8c429a52" + integrity sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g== + +"@esbuild/openbsd-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz#afb886c867e36f9d86bb21e878e1185f5d5a0935" + integrity sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ== + +"@esbuild/openbsd-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz#30855c9f8381fac6a0ef5b5f31ac6e7108a66ecf" + integrity sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA== + +"@esbuild/openharmony-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz#2f2144af31e67adc2a8e3705c20c2bd97bd88314" + integrity sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg== + +"@esbuild/sunos-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz#69b99a9b5bd226c9eb9c6a73f990fddd497d732e" + integrity sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw== + +"@esbuild/win32-arm64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz#d789330a712af916c88325f4ffe465f885719c6b" + integrity sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ== + +"@esbuild/win32-ia32@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz#52fc735406bd49688253e74e4e837ac2ba0789e3" + integrity sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww== + +"@esbuild/win32-x64@0.25.9": + version "0.25.9" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz#585624dc829cfb6e7c0aa6c3ca7d7e6daa87e34f" + integrity sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ== + +"@floating-ui/core@^1.7.3": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.3.tgz#462d722f001e23e46d86fd2bd0d21b7693ccb8b7" + integrity sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w== + dependencies: + "@floating-ui/utils" "^0.2.10" + +"@floating-ui/dom@^1.0.1": + version "1.7.4" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.4.tgz#ee667549998745c9c3e3e84683b909c31d6c9a77" + integrity sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA== + dependencies: + "@floating-ui/core" "^1.7.3" + "@floating-ui/utils" "^0.2.10" + +"@floating-ui/utils@^0.2.10": + version "0.2.10" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.10.tgz#a2a1e3812d14525f725d011a73eceb41fef5bc1c" + integrity sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ== + +"@formatjs/cli@^6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-6.7.2.tgz#8d1a3225dee98cadbc5331b1971f1b79dead4253" + integrity sha512-714/ifbtq7CmOtcLVGjYZp5EX0vKclQt3XZ+4Oiz0lhrHWU1ObFTtX9sLS9dADGta1pgDtS4+A3YpjWMY26Spg== + +"@formatjs/ecma402-abstract@2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.4.tgz#e90c5a846ba2b33d92bc400fdd709da588280fbc" + integrity sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA== + dependencies: + "@formatjs/fast-memoize" "2.2.7" + "@formatjs/intl-localematcher" "0.6.1" + decimal.js "^10.4.3" + tslib "^2.8.0" + +"@formatjs/fast-memoize@2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz#707f9ddaeb522a32f6715bb7950b0831f4cc7b15" + integrity sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ== + dependencies: + tslib "^2.8.0" + +"@formatjs/icu-messageformat-parser@2.11.2": + version "2.11.2" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.2.tgz#85aea211bea40aa81ee1d44ac7accc3cf5500a73" + integrity sha512-AfiMi5NOSo2TQImsYAg8UYddsNJ/vUEv/HaNqiFjnI3ZFfWihUtD5QtuX6kHl8+H+d3qvnE/3HZrfzgdWpsLNA== + dependencies: + "@formatjs/ecma402-abstract" "2.3.4" + "@formatjs/icu-skeleton-parser" "1.8.14" + tslib "^2.8.0" + +"@formatjs/icu-skeleton-parser@1.8.14": + version "1.8.14" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.14.tgz#b9581d00363908efb29817fdffc32b79f41dabe5" + integrity sha512-i4q4V4qslThK4Ig8SxyD76cp3+QJ3sAqr7f6q9VVfeGtxG9OhiAk3y9XF6Q41OymsKzsGQ6OQQoJNY4/lI8TcQ== + dependencies: + "@formatjs/ecma402-abstract" "2.3.4" + tslib "^2.8.0" + +"@formatjs/intl-localematcher@0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.6.1.tgz#25dc30675320bf65a9d7f73876fc1e4064c0e299" + integrity sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg== + dependencies: + tslib "^2.8.0" + +"@formatjs/intl@3.1.6": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-3.1.6.tgz#4c7fec6f082628cfa80871fbe7f9bc2644300e3b" + integrity sha512-tDkXnA4qpIFcDWac8CyVJq6oW8DR7W44QDUBsfXWIIJD/FYYen0QoH46W7XsVMFfPOVKkvbufjboZrrWbEfmww== + dependencies: + "@formatjs/ecma402-abstract" "2.3.4" + "@formatjs/fast-memoize" "2.2.7" + "@formatjs/icu-messageformat-parser" "2.11.2" + intl-messageformat "10.7.16" + tslib "^2.8.0" + +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + 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== -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== -"@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.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.30" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz#4a76c4daeee5df09f5d3940e087442fb36ce2b99" + integrity sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== - dependencies: - "@nodelib/fs.stat" "2.0.3" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== - dependencies: - "@nodelib/fs.scandir" "2.1.3" - fastq "^1.6.0" - "@parcel/watcher-android-arm64@2.5.1": version "2.5.1" resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" @@ -390,1184 +675,561 @@ "@parcel/watcher-win32-ia32" "2.5.1" "@parcel/watcher-win32-x64" "2.5.1" -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@types/anymatch@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" - integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== - -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/html-minifier-terser@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz#551a4589b6ee2cc9c1dff08056128aec29b94880" - integrity sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA== - -"@types/json-schema@^7.0.4": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== - -"@types/json-schema@^7.0.8": - 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/node@*": - version "14.0.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1" - integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g== - -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== - -"@types/tapable@*", "@types/tapable@^1.0.5": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" - integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== - -"@types/uglify-js@*": - version "3.9.3" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.3.tgz#d94ed608e295bc5424c9600e6b8565407b6b4b6b" - integrity sha512-KswB5C7Kwduwjj04Ykz+AjvPcfgv/37Za24O2EDzYNbwyzOo8+ydtvzUfZ5UMguiVu29Gx44l1A6VsPPcmYu9w== - dependencies: - source-map "^0.6.1" - -"@types/webpack-sources@*": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-1.4.2.tgz#5d3d4dea04008a779a90135ff96fb5c0c9e6292c" - integrity sha512-77T++JyKow4BQB/m9O96n9d/UUHWLQHlcqXb9Vsf4F1+wKNrrlWNFPDLKNT92RJnCSL6CieTc+NDXtCVZswdTw== - dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.7.3" - -"@types/webpack@^4.41.8": - version "4.41.21" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.21.tgz#cc685b332c33f153bb2f5fc1fa3ac8adeb592dee" - integrity sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA== - dependencies: - "@types/anymatch" "*" - "@types/node" "*" - "@types/tapable" "*" - "@types/uglify-js" "*" - "@types/webpack-sources" "*" - source-map "^0.6.0" - -"@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== - dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.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== - -"@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== - -"@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== - -"@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== - dependencies: - "@webassemblyjs/wast-printer" "1.9.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== - -"@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== - dependencies: - "@webassemblyjs/ast" "1.9.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== - -"@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== - 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" - -"@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== - dependencies: - "@xtuc/ieee754" "^1.2.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== - dependencies: - "@xtuc/long" "4.2.2" - -"@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== - -"@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== - 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" - -"@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== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - -"@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== - 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" - -"@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" - -"@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== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@xtuc/long" "4.2.2" - -"@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== - -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== - -acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== - -acorn-node@^1.2.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" - integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== - dependencies: - acorn "^7.0.0" - acorn-walk "^7.0.0" - xtend "^4.0.2" - -acorn-walk@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^5.2.1: - version "5.7.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== - -acorn@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== - -acorn@^7.0.0, acorn@^7.1.1: - version "7.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" - integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== - -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== - -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, 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@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2: - version "6.12.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" - integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== - 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@^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" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= - -ansi-align@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== - dependencies: - string-width "^3.0.0" - -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== - -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== - dependencies: - type-fest "^0.11.0" - -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= - -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== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -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= - -ansi-styles@^3.2.0, 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" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - -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== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -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= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -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= - -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= - 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= - -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= - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -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== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -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== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -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= - -ast-types@0.9.6: - version "0.9.6" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" - integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -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== - -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= - -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== - -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-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.26.0, babel-core@^6.26.3: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-loader@^8.1.0: - 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-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - -"backbone.marionette@^4.0.0, 4.0.0-beta.1": - version "4.0.0-beta.1" - resolved "https://registry.yarnpkg.com/backbone.marionette/-/backbone.marionette-4.0.0-beta.1.tgz#793528fc5c60620200e2440e6dcd04ba16c3aab3" - integrity sha1-eTUo/FxgYgIA4kQObc0EuhbDqrM= - dependencies: - backbone.radio "^2.0.0" - -backbone.marionette@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/backbone.marionette/-/backbone.marionette-4.1.2.tgz#55de74363219f6d5c343dab5bff6aeb20fc44419" - integrity sha512-T8wWxZZnuYjylONTnWZsGsgXtdx2ZrE38pZWJI9LmPqzYK5j0T8uduapFO7OEpsW5rtdbBgwof30xhzAkbb5eQ== - dependencies: - backbone.radio "^2.0.0" - -backbone.radio@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/backbone.radio/-/backbone.radio-2.0.0.tgz#bbe8672b373e313f99f36d2fbcf583fe77d04f42" - integrity sha1-u+hnKzc+MT+Z820vvPWD/nfQT0I= - -backbone@^1.4.0: +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@react-aria/ssr@^3.5.0": + version "3.9.10" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.10.tgz#7fdc09e811944ce0df1d7e713de1449abd7435e6" + integrity sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ== + dependencies: + "@swc/helpers" "^0.5.0" + +"@restart/hooks@^0.4.9": + version "0.4.16" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.16.tgz#95ae8ac1cc7e2bd4fed5e39800ff85604c6d59fb" + integrity sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w== + dependencies: + dequal "^2.0.3" + +"@restart/hooks@^0.5.0": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.5.1.tgz#6776b3859e33aea72b23b81fc47021edf17fd247" + integrity sha512-EMoH04NHS1pbn07iLTjIjgttuqb7qu4+/EyhAx27MHpoENcB2ZdSsLTNxmKD+WEPnZigo62Qc8zjGnNxoSE/5Q== + dependencies: + dequal "^2.0.3" + +"@restart/ui@^1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.9.4.tgz#9d61f56f2647f5ab8a33d87b278b9ce183511a26" + integrity sha512-N4C7haUc3vn4LTwVUPlkJN8Ach/+yIMvRuTVIhjilNHqegY60SGLrzud6errOMNJwSnmYFnt1J0H/k8FE3A4KA== + dependencies: + "@babel/runtime" "^7.26.0" + "@popperjs/core" "^2.11.8" + "@react-aria/ssr" "^3.5.0" + "@restart/hooks" "^0.5.0" + "@types/warning" "^3.0.3" + dequal "^2.0.3" + dom-helpers "^5.2.0" + uncontrollable "^8.0.4" + warning "^4.0.3" + +"@rolldown/pluginutils@1.0.0-beta.35": + version "1.0.0-beta.35" + resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.35.tgz#1a477e7742b154b67519d40e4fc17485de338e7a" + integrity sha512-slYrCpoxJUqzFDDNlvrOYRazQUNRvWPjXA17dAOISY3rDMxX6k8K4cj2H+hEYMHF81HO3uNd5rHVigAWRM5dSg== + +"@rollup/rollup-android-arm-eabi@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz#939c1be9625d428d8513e4ab60d406fe8db23718" + integrity sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ== + +"@rollup/rollup-android-arm64@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz#b74005775903f7a8f4e363d2840c1dcef3776ff3" + integrity sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw== + +"@rollup/rollup-darwin-arm64@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz#8c04603cdcf1ec0cd6b27152b3827e49295f2962" + integrity sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg== + +"@rollup/rollup-darwin-x64@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz#19ec976f1cc663def2692cd7ffb32981f2b0b733" + integrity sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw== + +"@rollup/rollup-freebsd-arm64@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz#a96b4ad8346229f6fcbd9d57f1c53040b037c2da" + integrity sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ== + +"@rollup/rollup-freebsd-x64@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz#fa565a282bc57967ee6668607b181678bdd74e4a" + integrity sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA== + +"@rollup/rollup-linux-arm-gnueabihf@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz#dfc88f7295e1f98d77f25296be787e8a5d6ced75" + integrity sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w== + +"@rollup/rollup-linux-arm-musleabihf@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz#32cd70c87455ca031f0361090cf17da5a2ef66d5" + integrity sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg== + +"@rollup/rollup-linux-arm64-gnu@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz#0e7e1fe7241e3384f6c6b4ccdbcfa8ad8c78b869" + integrity sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g== + +"@rollup/rollup-linux-arm64-musl@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz#5d421f2f3e4a84786c4dfd9ce97e595c9b59e7f4" + integrity sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ== + +"@rollup/rollup-linux-loongarch64-gnu@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz#a0fb5c7d0e88319e18acfd9436f19ee39354b027" + integrity sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ== + +"@rollup/rollup-linux-ppc64-gnu@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz#a65b598af12f25210c3295da551a6e3616ea488d" + integrity sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg== + +"@rollup/rollup-linux-riscv64-gnu@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz#10ba776214ae2857c5bf4389690dabb2fbaf7d98" + integrity sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA== + +"@rollup/rollup-linux-riscv64-musl@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz#c2a46cbaa329d5f21e5808f5a66bb9c78cf68aac" + integrity sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ== + +"@rollup/rollup-linux-s390x-gnu@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz#a07447be069d64462e30c66611be20c4513963ed" + integrity sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ== + +"@rollup/rollup-linux-x64-gnu@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz#8887c58bd51242754ae9c56947d6e883332dcc74" + integrity sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA== + +"@rollup/rollup-linux-x64-musl@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz#6403fda72a2b3b9fbbeeff93d14f1c45ef9775f3" + integrity sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw== + +"@rollup/rollup-openharmony-arm64@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz#52809afccaff47e731b965a0c16e5686be819d5f" + integrity sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q== + +"@rollup/rollup-win32-arm64-msvc@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz#23fe00ddbb40b27a3889bc1e99e6310d97353ad5" + integrity sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg== + +"@rollup/rollup-win32-ia32-msvc@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz#520b588076b593413d919912d69dfd5728a1f305" + integrity sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw== + +"@rollup/rollup-win32-x64-msvc@4.50.0": + version "4.50.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz#d81efe6a12060c7feddf9805e2a94c3ab0679f48" + integrity sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg== + +"@swc/helpers@^0.5.0": + version "0.5.17" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.17.tgz#5a7be95ac0f0bf186e7e6e890e7a6f6cda6ce971" + integrity sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A== + dependencies: + tslib "^2.8.0" + +"@tabler/core@^1.4.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12" - integrity sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ== + resolved "https://registry.yarnpkg.com/@tabler/core/-/core-1.4.0.tgz#9e011289d92cf6120655793cef6576fd67eb07f3" + integrity sha512-5BigzOlbOH9N0Is4u0rYNRCiwtnUXWO57K9zwuscygcicAa8UV9MGaS4zTgQsZEtZ9tsNANhN/YD8gCBGKYCiw== dependencies: - underscore ">=1.8.3" + "@popperjs/core" "^2.11.8" + bootstrap "5.3.7" -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= - -base62@^1.1.0: - version "1.2.8" - resolved "https://registry.yarnpkg.com/base62/-/base62-1.2.8.tgz#1264cb0fb848d875792877479dbe8bae6bae3428" - integrity sha512-V6YHUbjLxN1ymqNLb1DPHoU1CpfdL7d2YTIp5W3U4hhoG4hhxNmsFDs66M9EXxBiSEke5Bt5dwdfMwwZF70iLA== - -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== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== +"@tabler/icons-react@^3.35.0": + version "3.35.0" + resolved "https://registry.yarnpkg.com/@tabler/icons-react/-/icons-react-3.35.0.tgz#27f295f36b42f8dc2e7841dd651c8905d0097818" + integrity sha512-XG7t2DYf3DyHT5jxFNp5xyLVbL4hMJYJhiSdHADzAjLRYfL7AnjlRfiHDHeXxkb2N103rEIvTsBRazxXtAUz2g== dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" + "@tabler/icons" "3.35.0" -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== +"@tabler/icons@3.35.0": + version "3.35.0" + resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-3.35.0.tgz#6f35247e41baba2a1b0f4dff048bb1335d6c1075" + integrity sha512-yYXe+gJ56xlZFiXwV9zVoe3FWCGuZ/D7/G4ZIlDtGxSx5CGQK110wrnT29gUj52kEZoxqF7oURTk97GQxELOFQ== -big.js@^5.2.2: +"@tanstack/query-core@5.89.0": + version "5.89.0" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.89.0.tgz#67862fa9aa036942b1906bc51385115a2bbec45a" + integrity sha512-joFV1MuPhSLsKfTzwjmPDrp8ENfZ9N23ymFu07nLfn3JCkSHy0CFgsyhHTJOmWaumC/WiNIKM0EJyduCF/Ih/Q== + +"@tanstack/query-devtools@5.87.3": + version "5.87.3" + resolved "https://registry.yarnpkg.com/@tanstack/query-devtools/-/query-devtools-5.87.3.tgz#0cfff30823f837d6b9ead08f8d1b16459203fdb2" + integrity sha512-LkzxzSr2HS1ALHTgDmJH5eGAVsSQiuwz//VhFW5OqNk0OQ+Fsqba0Tsf+NzWRtXYvpgUqwQr4b2zdFZwxHcGvg== + +"@tanstack/react-query-devtools@^5.89.0": + version "5.89.0" + resolved "https://registry.yarnpkg.com/@tanstack/react-query-devtools/-/react-query-devtools-5.89.0.tgz#ca9cc274cbec7c1479ab67335282a06b4566d164" + integrity sha512-Syc4UjZeIJCkXCRGyQcWwlnv89JNb98MMg/DAkFCV3rwOcknj98+nG3Nm6xLXM6ne9sK6RZeDJMPLKZUh6NUGA== + dependencies: + "@tanstack/query-devtools" "5.87.3" + +"@tanstack/react-query@^5.89.0": + version "5.89.0" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.89.0.tgz#ae295ced60d1aee555337a572ad4045e2af3d00a" + integrity sha512-SXbtWSTSRXyBOe80mszPxpEbaN4XPRUp/i0EfQK1uyj3KCk/c8FuPJNIRwzOVe/OU3rzxrYtiNabsAmk1l714A== + dependencies: + "@tanstack/query-core" "5.89.0" + +"@tanstack/react-table@^8.21.3": + version "8.21.3" + resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.21.3.tgz#2c38c747a5731c1a07174fda764b9c2b1fb5e91b" + integrity sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww== + dependencies: + "@tanstack/table-core" "8.21.3" + +"@tanstack/table-core@8.21.3": + version "8.21.3" + resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.21.3.tgz#2977727d8fc8dfa079112d9f4d4c019110f1732c" + integrity sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg== + +"@testing-library/dom@^10.4.1": + version "10.4.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.1.tgz#d444f8a889e9a46e9a3b4f3b88e0fcb3efb6cf95" + integrity sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.3.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + picocolors "1.1.1" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^6.8.0": + version "6.8.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.8.0.tgz#697db9424f0d21d8216f1958fa0b1b69b5f43923" + integrity sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ== + dependencies: + "@adobe/css-tools" "^4.4.0" + aria-query "^5.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.6.3" + picocolors "^1.1.1" + redent "^3.0.0" + +"@testing-library/react@^16.3.0": + version "16.3.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.3.0.tgz#3a85bb9bdebf180cd76dba16454e242564d598a6" + integrity sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw== + dependencies: + "@babel/runtime" "^7.12.5" + +"@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== + +"@types/babel__core@^7.20.5": + 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.27.0" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== + 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@*": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" + integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== + dependencies: + "@babel/types" "^7.28.2" + +"@types/chai@^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== - -binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== - -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== + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.2.tgz#6f14cea18180ffc4416bc0fd12be05fdd73bdd6b" + integrity sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== dependencies: - file-uri-to-path "1.0.0" + "@types/deep-eql" "*" -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== +"@types/country-flag-icons@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/country-flag-icons/-/country-flag-icons-1.2.2.tgz#8f51089cab857f0f700feabd38b3960d006d64f2" + integrity sha512-CefEn/J336TBDp7NX8JqzlDtCBOsm8M3r1Li0gEOt0HOMHF1XemNyrx9lSHjsafcb1yYWybU0N8ZAXuyCaND0w== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== -bn.js@^5.0.0, bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +"@types/estree@1.0.8", "@types/estree@^1.0.0": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== -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= - -bootstrap@^4.0.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.1.tgz#f7322c7dd3e6376d430efc0c3f57e4d8005eb5b2" - integrity sha512-bxUooHBSbvefnIZfjD0LE8nfdPKrtiFy2sgrxQwUZ0UpFzpjVbVMUxaGIoo9XWT4B2LG1HX6UQg0UMOakT0prQ== - -boxen@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" - integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== +"@types/hast@^2.0.0": + version "2.3.10" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== dependencies: - ansi-align "^3.0.0" - camelcase "^5.3.1" - chalk "^3.0.0" - cli-boxes "^2.2.0" - string-width "^4.1.0" - term-size "^2.1.0" - type-fest "^0.8.1" - widest-line "^3.1.0" + "@types/unist" "^2" -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== +"@types/hast@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" + "@types/unist" "*" -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.7" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz#306e3a3a73828522efa1341159da4846e7573a6c" + integrity sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g== dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" + hoist-non-react-statics "^3.3.0" -braces@^3.0.1, braces@~3.0.2: +"@types/humps@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/humps/-/humps-2.0.6.tgz#a358688fe092e40b5f50261e0a55e2fa6d68cabe" + integrity sha512-Fagm1/a/1J9gDKzGdtlPmmTN5eSw/aaTzHtj740oSfo+MODsSY2WglxMmhTdOglC8nxqUhGGQ+5HfVtBvxo3Kg== + +"@types/mdast@^4.0.0": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" + integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== + dependencies: + "@types/unist" "*" + +"@types/node@^20.0.0": + version "20.19.11" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.11.tgz#728cab53092bd5f143beed7fbba7ba99de3c16c4" + integrity sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow== + dependencies: + undici-types "~6.21.0" + +"@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/prismjs@^1.0.0": + version "1.26.5" + resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.5.tgz#72499abbb4c4ec9982446509d2f14fb8483869d6" + integrity sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ== + +"@types/prop-types@^15.7.12": + version "15.7.15" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" + integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== + +"@types/react-dom@^19.1.9": + version "19.1.9" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.1.9.tgz#5ab695fce1e804184767932365ae6569c11b4b4b" + integrity sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ== + +"@types/react-table@^7.7.20": + version "7.7.20" + resolved "https://registry.yarnpkg.com/@types/react-table/-/react-table-7.7.20.tgz#2f68e70ca7a703ad8011a8da55c38482f0eb4314" + integrity sha512-ahMp4pmjVlnExxNwxyaDrFgmKxSbPwU23sGQw2gJK4EhCvnvmib2s/O/+y1dfV57dXOwpr2plfyBol+vEHbi2w== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.4.0", "@types/react-transition-group@^4.4.6": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" + integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== + +"@types/react@*", "@types/react@16 || 17 || 18 || 19", "@types/react@>=16.9.11": + version "19.1.12" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.12.tgz#7bfaa76aabbb0b4fe0493c21a3a7a93d33e8937b" + integrity sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w== + dependencies: + csstype "^3.0.2" + +"@types/react@^19.1.13": + version "19.1.13" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.13.tgz#fc650ffa680d739a25a530f5d7ebe00cdd771883" + integrity sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ== + dependencies: + csstype "^3.0.2" + +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + +"@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== + +"@types/warning@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.3.tgz#d1884c8cc4a426d1ac117ca2611bf333834c6798" + integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q== + +"@types/whatwg-mimetype@^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== + resolved "https://registry.yarnpkg.com/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz#e5e06dcd3e92d4e622ef0129637707d66c28d6a4" + integrity sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA== + +"@uiw/react-textarea-code-editor@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@uiw/react-textarea-code-editor/-/react-textarea-code-editor-3.1.1.tgz#8ca1b706a3081a51c68bc0df91c9c3cdadd9944e" + integrity sha512-AERRbp/d85vWR+UPgsB5hEgerNXuyszdmhWl2fV2H2jN63jgOobwEnjIpb76Vwy8SaGa/AdehaoJX2XZgNXtJA== dependencies: - fill-range "^7.0.1" + "@babel/runtime" "^7.18.6" + rehype "~13.0.0" + rehype-prism-plus "2.0.0" + +"@ungap/structured-clone@^1.0.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + +"@vitejs/plugin-react@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-5.0.3.tgz#182ea45406d89e55b4e35c92a4a8c2c8388726c8" + integrity sha512-PFVHhosKkofGH0Yzrw1BipSedTH68BFF8ZWy1kfUpCtJcouXXY0+racG8sExw7hw0HoX36813ga5o3LTWZ4FUg== + dependencies: + "@babel/core" "^7.28.4" + "@babel/plugin-transform-react-jsx-self" "^7.27.1" + "@babel/plugin-transform-react-jsx-source" "^7.27.1" + "@rolldown/pluginutils" "1.0.0-beta.35" + "@types/babel__core" "^7.20.5" + react-refresh "^0.17.0" + +"@vitest/expect@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.2.4.tgz#8362124cd811a5ee11c5768207b9df53d34f2433" + integrity sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== + dependencies: + "@types/chai" "^5.2.2" + "@vitest/spy" "3.2.4" + "@vitest/utils" "3.2.4" + chai "^5.2.0" + tinyrainbow "^2.0.0" + +"@vitest/mocker@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-3.2.4.tgz#4471c4efbd62db0d4fa203e65cc6b058a85cabd3" + integrity sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ== + dependencies: + "@vitest/spy" "3.2.4" + estree-walker "^3.0.3" + magic-string "^0.30.17" + +"@vitest/pretty-format@3.2.4", "@vitest/pretty-format@^3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.2.4.tgz#3c102f79e82b204a26c7a5921bf47d534919d3b4" + integrity sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA== + dependencies: + tinyrainbow "^2.0.0" + +"@vitest/runner@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-3.2.4.tgz#5ce0274f24a971f6500f6fc166d53d8382430766" + integrity sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ== + dependencies: + "@vitest/utils" "3.2.4" + pathe "^2.0.3" + strip-literal "^3.0.0" + +"@vitest/snapshot@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-3.2.4.tgz#40a8bc0346ac0aee923c0eefc2dc005d90bc987c" + integrity sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ== + dependencies: + "@vitest/pretty-format" "3.2.4" + magic-string "^0.30.17" + pathe "^2.0.3" + +"@vitest/spy@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.2.4.tgz#cc18f26f40f3f028da6620046881f4e4518c2599" + integrity sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw== + dependencies: + tinyspy "^4.0.3" + +"@vitest/utils@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.2.4.tgz#c0813bc42d99527fb8c5b138c7a88516bca46fea" + integrity sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== + dependencies: + "@vitest/pretty-format" "3.2.4" + loupe "^3.1.4" + tinyrainbow "^2.0.0" + +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-regex@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.0.tgz#2f302e7550431b1b7762705fffb52cf1ffa20447" + integrity sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg== + +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== + +aria-query@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +aria-query@^5.0.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" + integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== + +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + +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" + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bootstrap@5.3.7: + version "5.3.7" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.7.tgz#8640065036124d961d885d80b5945745e1154d90" + integrity sha512-7KgiD8UHjfcPBHEpDNg+zGz8L3LqR3GVwqZiBRFX04a1BCArZOz1r2kjly2HQ0WokqTO0v1nF+QAt8dsW4lKlw== braces@^3.0.3: version "3.0.3" @@ -1576,1424 +1238,307 @@ braces@^3.0.3: dependencies: fill-range "^7.1.1" -brorand@^1.0.1, brorand@^1.1.0: - 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== +browserslist@^4.24.0: + version "4.25.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.4.tgz#ebdd0e1d1cf3911834bab3a6cd7b917d9babf5af" + integrity sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg== 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" + caniuse-lite "^1.0.30001737" + electron-to-chromium "^1.5.211" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" -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== +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" + base64-js "^1.3.1" + ieee754 "^1.2.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== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -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= - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-rsa@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" - integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== - dependencies: - bn.js "^5.2.1" - browserify-rsa "^4.1.0" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.4" - inherits "^2.0.4" - parse-asn1 "^5.1.6" - readable-stream "^3.6.2" - safe-buffer "^5.2.1" - -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" - -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - -buffer-from@^1.0.0: - 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-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= - -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== - 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= - -cacache@^12.0.2, cacache@^12.0.3: - 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" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.3, call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== 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== -camel-case@3.0.x: +caniuse-lite@^1.0.30001737: + version "1.0.30001739" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz#b34ce2d56bfc22f4352b2af0144102d623a124f4" + integrity sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chai@^5.2.0: + version "5.3.3" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz#dd3da955e270916a4bd3f625f4b919996ada7e06" + integrity sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" - integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= - dependencies: - no-case "^2.2.0" - upper-case "^1.1.1" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== -camel-case@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547" - integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q== - dependencies: - pascal-case "^3.1.1" - tslib "^1.10.0" +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== -camelcase@^5.0.0, 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== +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== -caniuse-lite@^1.0.30000844: - version "1.0.30001111" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001111.tgz#dd0ce822c70eb6c7c068e4a55c22e19ec1501298" - integrity sha512-xnDje2wchd/8mlJu8sXvWxOGvMgv+uT3iZ3bkIAynKOzToCssWCmkz/ZIkQBs/2pUB4uwnJKVORWQ31UkbVjOg== - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.1.0, 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: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -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@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - 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" - -chokidar@^3.2.2, chokidar@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" - integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.4.0" - optionalDependencies: - fsevents "~2.1.2" - -chokidar@^4.0.0: +chokidar@^4.0.0, chokidar@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== dependencies: readdirp "^4.0.1" -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +classnames@^2.3.2, classnames@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== -chrome-trace-event@^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" +clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== -ci-info@^2.0.0: +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +convert-source-map@^1.5.0: + 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/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.6.tgz#8fe672437d01cd6c4561af5334e0cc50ff1955f7" - integrity sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw== - dependencies: - inherits "^2.0.4" - safe-buffer "^5.2.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-css@4.2.x, clean-css@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" - integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== - dependencies: - source-map "~0.6.0" - -cli-boxes@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" - integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -clone-response@^1.0.2: +cookie@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610" + integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: - mimic-response "^1.0.0" + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" -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= +country-flag-icons@^1.5.20: + version "1.5.20" + resolved "https://registry.yarnpkg.com/country-flag-icons/-/country-flag-icons-1.5.20.tgz#a373b13f2b2899a2ef85a4b6fb6a80b8f38f9a01" + integrity sha512-ldchBFYlw2dXXGXO6q/xCYaFiiK/eg5qSctBRDzUTDvHqAdIMOVTj1sp0OWVo7g6h+RURTjlu+5BhtGwIbe9tg== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +date-fns@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-4.1.0.tgz#64b3d83fff5aa80438f5b1a633c2e83b8a1c2d14" + integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg== + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" + ms "^2.1.3" -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" +decimal.js@^10.4.3: + version "10.6.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" + integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== -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= - -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== - -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, commander@^2.5.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@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -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== - -common-prefix@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/common-prefix/-/common-prefix-1.1.0.tgz#e3a5ea7fafaefc7eb84e760523e1afb985f90f00" - integrity sha1-46Xqf6+u/H64TnYFI+GvuYX5DwA= - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -commoner@^0.10.1: - version "0.10.8" - resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" - integrity sha1-NPw2cs0kOT6LtH5wyqApOBH08sU= - dependencies: - commander "^2.5.0" - detective "^4.3.1" - glob "^5.0.15" - graceful-fs "^4.1.2" - iconv-lite "^0.4.5" - mkdirp "^0.5.0" - private "^0.1.6" - q "^1.1.2" - recast "^0.11.17" - -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== - -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= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - -console-browserify@^1.1.0: +decode-named-character-reference@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -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= - -convert-source-map@^1.5.1, 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== + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz#25c32ae6dd5e21889549d40f676030e9514cc0ed" + integrity sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q== dependencies: - safe-buffer "~5.1.1" + character-entities "^2.0.0" -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" +decode-uri-component@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.4.1.tgz#2ac4859663c704be22bf7db760a1494a49ab2cc5" + integrity sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ== -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= +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== -copy-webpack-plugin@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88" - integrity sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg== - dependencies: - cacache "^12.0.3" - find-cache-dir "^2.1.0" - glob-parent "^3.1.0" - globby "^7.1.1" - is-glob "^4.0.1" - loader-utils "^1.2.3" - minimatch "^3.0.4" - normalize-path "^3.0.0" - p-limit "^2.2.1" - schema-utils "^1.0.0" - serialize-javascript "^2.1.2" - webpack-log "^2.0.0" +deepmerge@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" + integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= - -core-js@^2.4.0, core-js@^2.5.0: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== - -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= - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hash@~1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" - integrity sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - ripemd160 "^2.0.0" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.7: - 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== - 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" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - 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" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-loader@^3.5.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" - integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== - 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.32" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.2.0" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^2.7.0" - semver "^6.3.0" - -css-select@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - -css-what@2.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" - integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== - -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== - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -d3@^3.5.6: - version "3.5.17" - resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" - integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g= - -debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, 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.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^4.0.1, debug@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize@^1.0.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -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== - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -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: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -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== - dependencies: - object-keys "^1.0.12" - -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= - 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= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - -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" - -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-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" +dequal@^2.0.0, dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== -detective@^4.3.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" - integrity sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig== - dependencies: - acorn "^5.2.1" - defined "^1.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== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== - dependencies: - path-type "^3.0.0" - -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: - path-type "^4.0.0" - -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: - esutils "^2.0.2" - -dom-converter@^0.2: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -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== - dependencies: - domelementtype "^2.0.1" - 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, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -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== - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -dot-case@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" - integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA== - dependencies: - no-case "^3.0.3" - tslib "^1.10.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== - dependencies: - is-obj "^2.0.0" - -dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - -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== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ejs-include-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ejs-include-regex/-/ejs-include-regex-1.0.0.tgz#e2f71575cbfd551ac800b2474c1f62a38e70093a" - integrity sha1-4vcVdcv9VRrIALJHTB9io45wCTo= - -ejs-lint@^1.0.1: +devlop@^1.0.0, devlop@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/ejs-lint/-/ejs-lint-1.1.0.tgz#f3fd7b164fde618bcefb8e5ece8f9ac206739ce0" - integrity sha512-SnOxzUtJug5C92wtFTZ+Zyb+eoqOlN+WyqDk6HDSXgY5FseDgm8MhZ/r70nkzrh0AMPpifzebep3gGILzAlQNg== + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== dependencies: - chalk "^4.0.0" - ejs "3.0.1" - ejs-include-regex "^1.0.0" - globby "^11.0.0" - read-input "^0.3.1" - rewire "^5.0.0" - syntax-error "^1.1.6" - yargs "^15.0.0" + dequal "^2.0.0" -ejs-loader@^0.3.6: - version "0.3.7" - resolved "https://registry.yarnpkg.com/ejs-loader/-/ejs-loader-0.3.7.tgz#82d3cd0a3d3f64d519332b95f9b8a7897c9fcaf4" - integrity sha512-K1HBDWXQZkcIAnP5h65kWsD7o7NABvHswOH49rVHX7POGaTM2kYQfkFZVn4ZQeiRnzqbtf07LxSitOVRdR98GA== +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-accessibility-api@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== + +dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: - loader-utils "^0.2.7" - lodash "^4.17.15" + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" -ejs-webpack-loader@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ejs-webpack-loader/-/ejs-webpack-loader-2.2.2.tgz#0536acdd79ba4cdbefb4248fcbe7441e264955d7" - integrity sha512-fuZ5djtVnvoMv4xlyQs3sh9JfIh167iPg7Q1ABFdQIbPHqRgeRWQCvodGybQhiRRCUIeqH9HPtfB8hJimPSPbA== +electron-to-chromium@^1.5.211: + version "1.5.213" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.213.tgz#f434187f227fb7e67bfcf8243b959cf3ce14013e" + integrity sha512-xr9eRzSLNa4neDO0xVFrkXu3vyIzG4Ay08dApecw42Z1NbmCt+keEpXdvlYGVe0wtvY5dhW0Ay0lY0IOfsCg0Q== + +entities@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" + integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== + +error-ex@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" + integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== dependencies: - ejs "^2.0.0" - html-minifier "^3" - loader-utils "^0.2.7" - merge "^1.2.0" - uglify-js "~2.6.1" + is-arrayish "^0.2.1" -ejs@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.0.1.tgz#30c8f6ee9948502cc32e85c37a3f8b39b5a614a5" - integrity sha512-cuIMtJwxvzumSAkqaaoGY/L6Fc/t6YvoP9/VIaK0V/CyqKLEQ8sqODmYfy/cjXEdZ9+OOL8TecbJu+1RsofGDw== +es-module-lexer@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== -ejs@^2.0.0: - version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== +esbuild@^0.25.0: + version "0.25.9" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.9.tgz#15ab8e39ae6cdc64c24ff8a2c0aef5b3fd9fa976" + integrity sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.9" + "@esbuild/android-arm" "0.25.9" + "@esbuild/android-arm64" "0.25.9" + "@esbuild/android-x64" "0.25.9" + "@esbuild/darwin-arm64" "0.25.9" + "@esbuild/darwin-x64" "0.25.9" + "@esbuild/freebsd-arm64" "0.25.9" + "@esbuild/freebsd-x64" "0.25.9" + "@esbuild/linux-arm" "0.25.9" + "@esbuild/linux-arm64" "0.25.9" + "@esbuild/linux-ia32" "0.25.9" + "@esbuild/linux-loong64" "0.25.9" + "@esbuild/linux-mips64el" "0.25.9" + "@esbuild/linux-ppc64" "0.25.9" + "@esbuild/linux-riscv64" "0.25.9" + "@esbuild/linux-s390x" "0.25.9" + "@esbuild/linux-x64" "0.25.9" + "@esbuild/netbsd-arm64" "0.25.9" + "@esbuild/netbsd-x64" "0.25.9" + "@esbuild/openbsd-arm64" "0.25.9" + "@esbuild/openbsd-x64" "0.25.9" + "@esbuild/openharmony-arm64" "0.25.9" + "@esbuild/sunos-x64" "0.25.9" + "@esbuild/win32-arm64" "0.25.9" + "@esbuild/win32-ia32" "0.25.9" + "@esbuild/win32-x64" "0.25.9" -electron-to-chromium@^1.3.47: - version "1.3.522" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.522.tgz#4a6485ad187ffd31913bba0747d0e36405f405d6" - integrity sha512-67V62Z4CFOiAtox+o+tosGfVk0QX4DJgH609tjT8QymbJZVAI/jWnAthnr8c5hnRNziIRwkc9EMQYejiVz3/9Q== - -elliptic@^6.5.3, elliptic@^6.5.4: - version "6.6.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" - integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -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== - -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@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -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.1, enhanced-resolve@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" - integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -entities@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -entities@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" - integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== - -envify@^3.0.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/envify/-/envify-3.4.1.tgz#d7122329e8df1688ba771b12501917c9ce5cbce8" - integrity sha1-1xIjKejfFoi6dxsSUBkXyc5cvOg= - dependencies: - jstransform "^11.0.3" - through "~2.3.4" - -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" - -es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -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-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== - -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= - -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== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" - integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.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@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - -esprima-fb@^15001.1.0-dev-harmony-fb: - version "15001.1.0-dev-harmony-fb" - resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz#30a947303c6b8d5e955bee2b99b1d233206a6901" - integrity sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esprima@~3.1.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= - -esquery@^1.0.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== - dependencies: - estraverse "^5.1.0" - -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== - dependencies: - estraverse "^4.1.0" - -estraverse@^4.1.0, 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: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -events@^3.0.0: +escalade@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -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== +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== + +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" + "@types/estree" "^1.0.0" -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= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +expect-type@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.2.tgz#c030a329fb61184126c8447585bc75a7ec6fbff3" + integrity sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA== -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= - dependencies: - homedir-polyfill "^1.0.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= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: +extend@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" + 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" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -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@^3.1.1: - version "3.2.4" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" - integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" - merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" - -fast-json-stable-stringify@^2.0.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== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fastq@^1.6.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" - integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== - dependencies: - reusify "^1.0.4" - -fbjs@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.6.1.tgz#9636b7705f5ba9684d44b72f78321254afc860f7" - integrity sha1-lja3cF9bqWhNRLcveDISVK/IYPc= - dependencies: - core-js "^1.0.0" - loose-envify "^1.0.0" - promise "^7.0.3" - ua-parser-js "^0.7.9" - whatwg-fetch "^0.9.0" - -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -file-loader@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f" - integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== - dependencies: - loader-utils "^2.0.0" - schema-utils "^2.6.5" - -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== - -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= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -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" +fdir@^6.4.4, fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== fill-range@^7.1.1: version "7.1.1" @@ -3002,441 +1547,66 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -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== +filter-obj@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-5.1.0.tgz#5bd89676000a713d7db2e197f660274428e524ed" + integrity sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng== + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +formik@^2.4.6: + version "2.4.6" + resolved "https://registry.yarnpkg.com/formik/-/formik-2.4.6.tgz#4da75ca80f1a827ab35b08fd98d5a76e928c9686" + integrity sha512-A+2EI7U7aG296q2TLGvNapDNTZp1khVt5Vk0Q/fyfSROss0V/V6+txt2aJnwEos44IxTCW/LYAi/zgWzlevj+g== dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" + "@types/hoist-non-react-statics" "^3.3.1" + deepmerge "^2.1.1" + hoist-non-react-statics "^3.3.0" + lodash "^4.17.21" + lodash-es "^4.17.21" + react-fast-compare "^2.0.1" + tiny-warning "^1.0.2" + tslib "^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== - dependencies: - locate-path "^3.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== - dependencies: - 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== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -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" - -for-each@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" - integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== - dependencies: - is-callable "^1.2.7" - -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= - -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= - dependencies: - map-cache "^0.2.2" - -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-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.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.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -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.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 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== -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -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== - -get-caller-file@^2.0.1: - 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-intrinsic@^1.2.4, get-intrinsic@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== - dependencies: - pump "^3.0.0" - -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= - -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= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== - dependencies: - is-glob "^4.0.1" - -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" - integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== - dependencies: - ini "^1.3.5" - -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-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-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" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -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@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - -globby@^11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -globby@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" - integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= - dependencies: - array-union "^1.0.1" - dir-glob "^2.0.0" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -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= - dependencies: - ansi-regex "^2.0.0" - -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= - -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-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-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-symbols@^1.0.3, has-symbols@^1.1.0: +generate-password-browser@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -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== + resolved "https://registry.yarnpkg.com/generate-password-browser/-/generate-password-browser-1.1.0.tgz#ec1661d0f3ce0b36e2ffdf6099578725a43d12e9" + integrity sha512-qsQve0rVbCqGqAfKgZwjxKUfI1d1nyd22dz+kE8gn1iw1LxGkR+Slsl79XXfm2wxuK27IkopTs5KXcOEQnhg0w== dependencies: - has-symbols "^1.0.3" + buffer "^6.0.3" + randombytes "^2.0.5" -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= +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== + +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +happy-dom@^18.0.1: + version "18.0.1" + resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-18.0.1.tgz#8f8a2199462842deb675f54e405af55f3b674540" + integrity sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA== dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -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= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.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= - -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= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -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@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" - integrity sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw== - dependencies: - inherits "^2.0.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -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== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" + "@types/node" "^20.0.0" + "@types/whatwg-mimetype" "^3.0.2" + whatwg-mimetype "^3.0.0" hasown@^2.0.2: version "2.0.2" @@ -3445,382 +1615,190 @@ hasown@^2.0.2: dependencies: function-bind "^1.1.2" -he@1.2.x, he@^1.2.0: - 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.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= +hast-util-from-html@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz#485c74785358beb80c4ba6346299311ac4c49c82" + integrity sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw== dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" + "@types/hast" "^3.0.0" + devlop "^1.1.0" + hast-util-from-parse5 "^8.0.0" + parse5 "^7.0.0" + vfile "^6.0.0" + vfile-message "^4.0.0" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= +hast-util-from-parse5@^8.0.0: + version "8.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz#830a35022fff28c3fea3697a98c2f4cc6b835a2e" + integrity sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg== dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^9.0.0" + property-information "^7.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" + web-namespaces "^2.0.0" -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== +hast-util-parse-selector@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" + integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== dependencies: - parse-passwd "^1.0.0" + "@types/hast" "^2.0.0" -html-minifier-terser@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" - integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== dependencies: - camel-case "^4.1.1" - clean-css "^4.2.3" - commander "^4.1.1" - he "^1.2.0" - param-case "^3.0.3" - relateurl "^0.2.7" - terser "^4.6.3" + "@types/hast" "^3.0.0" -html-minifier@^3: - 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== +hast-util-to-html@^9.0.0: + version "9.0.5" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz#ccc673a55bb8e85775b08ac28380f72d47167005" + integrity sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw== 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" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-whitespace "^3.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" -html-webpack-plugin@^4.0.4: - version "4.3.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz#53bf8f6d696c4637d5b656d3d9863d89ce8174fd" - integrity sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w== +hast-util-to-string@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz#a4f15e682849326dd211c97129c94b0c3e76527c" + integrity sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A== dependencies: - "@types/html-minifier-terser" "^5.0.0" - "@types/tapable" "^1.0.5" - "@types/webpack" "^4.41.8" - html-minifier-terser "^5.0.1" - loader-utils "^1.2.3" - lodash "^4.17.15" - pretty-error "^2.1.1" - tapable "^1.1.3" - util.promisify "1.0.0" + "@types/hast" "^3.0.0" -htmlparser2@^3.3.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" + "@types/hast" "^3.0.0" -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -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= - -iconv-lite@^0.4.24, iconv-lite@^0.4.5: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== +hastscript@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" + integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== dependencies: - safer-buffer ">= 2.1.2 < 3" + "@types/hast" "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^3.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" -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== +hastscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-9.0.1.tgz#dbc84bef6051d40084342c229c451cd9dc567dff" + integrity sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w== dependencies: - postcss "^7.0.14" + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^4.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.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== +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= +humps@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/humps/-/humps-2.0.1.tgz#dd02ea6081bd0568dc5d073184463957ba9ef9aa" + integrity sha512-E0eIbrFWUhwfXJmsbdjRQFQPrl5pTEoKlz163j1mTqqUnU9PgR4AgB8AIITzuB3vLBdxZXyZ9TDIrwB2OASz4g== -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== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== immutable@^5.0.2: version "5.1.3" resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.3.tgz#e6486694c8b76c37c063cca92399fa64098634d4" integrity sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg== -import-fresh@^3.0.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: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= +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== -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== +intl-messageformat@10.7.16: + version "10.7.16" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.7.16.tgz#d909f9f9f4ab857fbe681d559b958dd4dd9f665a" + integrity sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug== dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" + "@formatjs/ecma402-abstract" "2.3.4" + "@formatjs/fast-memoize" "2.2.7" + "@formatjs/icu-messageformat-parser" "2.11.2" + tslib "^2.8.0" -imports-loader@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.8.0.tgz#030ea51b8ca05977c40a3abfd9b4088fe0be9a69" - integrity sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ== - dependencies: - loader-utils "^1.0.2" - source-map "^0.6.1" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -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= - -infer-owner@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, 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= - -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== - -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -interpret@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -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== dependencies: loose-envify "^1.0.0" -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-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== dependencies: - kind-of "^3.0.2" + is-alphabetical "^2.0.0" + is-decimal "^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-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: - kind-of "^6.0.0" + hasown "^2.0.2" -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= - dependencies: - binary-extensions "^1.0.0" +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== -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-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.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== - -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-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.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= - dependencies: - kind-of "^3.0.2" - -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== - dependencies: - kind-of "^6.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-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== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -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== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -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= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: +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== - -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= - -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-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= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-glob@^4.0.3: version "4.0.3" @@ -3829,361 +1807,77 @@ is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" -is-installed-globally@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== - dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" - -is-npm@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" - integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== - -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= - dependencies: - kind-of "^3.0.2" +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== 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-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-path-inside@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== - dependencies: - has-symbols "^1.0.1" - -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== - dependencies: - has-symbols "^1.0.1" - -is-typed-array@^1.1.14: - version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" - integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== - dependencies: - which-typed-array "^1.1.16" - -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-windows@^1.0.1, 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== - -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= - -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - -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= - -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= - -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= - 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= - -jquery-mask-plugin@^1.14.16: - version "1.14.16" - resolved "https://registry.yarnpkg.com/jquery-mask-plugin/-/jquery-mask-plugin-1.14.16.tgz#9ebb55947d984da5aade45315b2fe6b113e28aae" - integrity sha512-reywdHlYEkPbzWjTpcc1fk9XQ3PLvO5dzEAVqy8zI7NTF22tB1HbeU3iboZTLdkBEPaWAqeI2HtEjsGQ4roZKw== - -jquery-serializejson@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/jquery-serializejson/-/jquery-serializejson-2.9.0.tgz#03e3764e3a4b42c1c5aae9f93d7f19320c5f35a6" - integrity sha512-xR7rjl0tRKIVioV5lOkOSv7K8BHMvGzYzC7Ech1iAYuZiYf0ksEpLC8OqjA5VApXf/qn/49O9hTmW70+/EA0vA== - -jquery@^3.5.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" - integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== "js-tokens@^3.0.0 || ^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-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= +js-tokens@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" + integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== -js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - -json-parse-better-errors@^1.0.2: - 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-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-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json5@^0.5.0, json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - -json5@^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== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== - dependencies: - minimist "^1.2.5" - -jstransform@^11.0.3: - version "11.0.3" - resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-11.0.3.tgz#09a78993e0ae4d4ef4487f6155a91f6190cb4223" - integrity sha1-CaeJk+CuTU70SH9hVakfYZDLQiM= - dependencies: - base62 "^1.1.0" - commoner "^0.10.1" - esprima-fb "^15001.1.0-dev-harmony-fb" - object-assign "^2.0.0" - source-map "^0.4.2" - -keyv@^3.0.0: +jsesc@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== -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= - dependencies: - is-buffer "^1.1.5" +json-parse-even-better-errors@^2.3.0: + 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== -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= - dependencies: - is-buffer "^1.1.5" +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== -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== +lines-and-columns@^1.1.6: + 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== -kind-of@^6.0.0, kind-of@^6.0.2: - 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== +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== -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== +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== -latest-version@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -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-utils@^0.2.7: - version "0.2.17" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" - integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" - -loader-utils@^1.0.2, 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== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loader-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - 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== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4: +lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= - -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.4.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== dependencies: js-tokens "^3.0.0 || ^4.0.0" -lower-case@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= - -lower-case@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" - integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== - dependencies: - tslib "^1.10.0" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +loupe@^3.1.0, loupe@^3.1.4: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76" + integrity sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== lru-cache@^5.1.1: version "5.1.1" @@ -4192,154 +1886,69 @@ 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== +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== + +magic-string@^0.30.17: + version "0.30.18" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.18.tgz#905bfbbc6aa5692703a93db26a9edcaa0007d2bb" + integrity sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ== dependencies: - pify "^4.0.1" - semver "^5.6.0" + "@jridgewell/sourcemap-codec" "^1.5.5" -make-dir@^3.0.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== +mdast-util-to-hast@^13.0.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" + integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== dependencies: - semver "^6.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" -make-plural@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-4.3.0.tgz#f23de08efdb0cac2e0c9ba9f315b0dff6b4c2735" - integrity sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA== - optionalDependencies: - minimist "^1.2.0" +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== -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= - -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= +micromark-util-character@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== dependencies: - object-visit "^1.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -marionette.approuter@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/marionette.approuter/-/marionette.approuter-1.0.2.tgz#bd45b801762fea4ec5caa9505640413596cc432c" - integrity sha512-XjcKb1Y6KROCmdZxO/rtOdRhd3Hfrs+7zWjtfiuCFS3VZa2IQjNgKUuIGmaKDZte2AmKRRMaPvXMh22nKYFh8A== - -marionette.templatecache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/marionette.templatecache/-/marionette.templatecache-1.0.0.tgz#579b9a53b1b6428f8f0a0071cff2175a2d71e65b" - integrity sha1-V5uaU7G2Qo+PCgBxz/IXWi1x5ls= - dependencies: - backbone.marionette "^4.0.0, 4.0.0-beta.1" - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -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" - -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" - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -merge@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - -messageformat-convert@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/messageformat-convert/-/messageformat-convert-0.3.1.tgz#03b5453ee87e66da6eef1670ce0caf997ee64e51" - integrity sha512-fpNfsvFNj5VCAMN0Hpu9D4zhnGkEHL3cILJBAOydkzzdyrSoFlYIHAPRWRajOcHDgYXt+g0NIEzq0bfW3sd5Bw== - dependencies: - common-prefix "1.1.0" - make-plural "^4.3.0" - -messageformat-formatters@^2.0.1: +micromark-util-encode@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz#0492c1402a48775f751c9b17c0354e92be012b08" - integrity sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg== + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== -messageformat-loader@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/messageformat-loader/-/messageformat-loader-0.8.1.tgz#709a8f38e36257b19a9492dbfdbc743c03351fa0" - integrity sha512-hk721fJttjqoIfW6cMcLjFPsJ7C2bL9lj7Jy2btfWf7zsu6gWlLFeTKIUfi7S1v4U1gP4dkzHa1giYsAwD+aVA== +micromark-util-sanitize-uri@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== dependencies: - loader-utils "^1.2.3" - messageformat-convert "^0.3.1" - yaml "^1.6.0" + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" -messageformat-parser@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/messageformat-parser/-/messageformat-parser-4.1.3.tgz#b824787f57fcda7d50769f5b63e8d4fda68f5b9e" - integrity sha512-2fU3XDCanRqeOCkn7R5zW5VQHWf+T3hH65SzuqRvjatBK7r4uyFa5mEX+k6F9Bd04LVM5G4/BHBTUJsOdW7uyg== +micromark-util-symbol@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== -messageformat@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-2.3.0.tgz#de263c49029d5eae65d7ee25e0754f57f425ad91" - integrity sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w== - dependencies: - make-plural "^4.3.0" - messageformat-formatters "^2.0.1" - messageformat-parser "^4.1.2" - -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" +micromark-util-types@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz#f00225f5f5a0ebc3254f96c36b6605c4b393908e" + integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== micromatch@^4.0.5: version "4.0.8" @@ -4349,438 +1958,43 @@ micromatch@^4.0.5: braces "^3.0.3" picomatch "^2.3.1" -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== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -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== - -mimic-response@^1.0.0, mimic-response@^1.0.1: +min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -mini-css-extract-plugin@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" - integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A== - dependencies: - loader-utils "^1.1.0" - normalize-url "1.9.1" - schema-utils "^1.0.0" - webpack-sources "^1.1.0" +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -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== - -minimalistic-crypto-utils@^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= - -"minimatch@2 || 3", minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -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" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -moment@^2.30.1: - version "2.30.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" - integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== - -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= - 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" - -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.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nan@^2.12.1: - version "2.14.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" - integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -neo-async@^2.5.0, neo-async@^2.6.1, 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== - -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== - -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: - lower-case "^1.1.1" - -no-case@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" - integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== - dependencies: - lower-case "^2.0.1" - tslib "^1.10.0" +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== node-addon-api@^7.0.0: version "7.1.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== -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== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +npm-run-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-6.0.0.tgz#25cfdc4eae04976f3349c0b1afc089052c362537" + integrity sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA== 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" + path-key "^4.0.0" + unicorn-magic "^0.3.0" -nodemon@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.4.tgz#55b09319eb488d6394aa9818148c0c2d1c04c416" - integrity sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ== - dependencies: - chokidar "^3.2.2" - debug "^3.2.6" - ignore-by-default "^1.0.1" - minimatch "^3.0.4" - pstree.remy "^1.1.7" - semver "^5.7.1" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.2" - update-notifier "^4.0.0" - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= - dependencies: - abbrev "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= - dependencies: - remove-trailing-separator "^1.0.1" - -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-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= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -normalize-url@^4.1.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" - integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== - -nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - -numeral@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" - integrity sha1-StCAk21EPCVhrtnyGX7//iX05QY= - -object-assign@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" - integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +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= - -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= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== - -object-keys@^1.0.11, object-keys@^1.0.12, 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== - -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= - 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== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -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= - dependencies: - isobject "^3.0.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.1.tgz#5c8016847b0d67fcedb7eef254751cfcdc7e9418" - integrity sha512-ZpZpjcJeugQfWsfyQlshVoowIIQ1qBGSVll4rfDq6JJVO//fesjoX808hXWfBjY+ROZgpKDI5TRSRBSoJiZ8eg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.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= - -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-tmpdir@^1.0.1, 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= - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1: - 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== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -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== - -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.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== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -param-case@2.1.x: - version "2.1.1" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" - integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= - dependencies: - no-case "^2.2.0" - -param-case@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238" - integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA== - dependencies: - dot-case "^3.0.3" - tslib "^1.10.0" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== parent-module@^1.0.0: version "1.0.1" @@ -4789,733 +2003,402 @@ 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== +parse-entities@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== 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" + "@types/unist" "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" -parse-asn1@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== +parse-json@^5.0.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: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" -parse-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= +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== -pascal-case@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" - integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA== +parse5@^7.0.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" + integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== dependencies: - no-case "^3.0.3" - tslib "^1.10.0" + entities "^6.0.0" -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== - -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@^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= - -path-exists@^4.0.0: +path-key@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-parse@^1.0.6: +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-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: - 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.1.3" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.3.tgz#8be674d591d65658113424592a95d1517318dd4b" - integrity sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA== - dependencies: - create-hash "~1.1.3" - create-hmac "^1.1.7" - ripemd160 "=2.0.1" - safe-buffer "^5.2.1" - sha.js "^2.4.11" - to-buffer "^1.2.0" +pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +pathval@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" + integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@1.1.1, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -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== - -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== - dependencies: - find-up "^3.0.0" - -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= - -possible-typed-array-names@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" - integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== - -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== - dependencies: - postcss "^7.0.5" - -postcss-modules-local-by-default@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== - dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^2.2.0: - 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== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - -postcss-modules-values@^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-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== - dependencies: - cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-value-parser@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" - integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== - -postcss@^7.0.14, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.36" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" - integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -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= - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - -pretty-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" - integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= - dependencies: - renderkid "^2.0.1" - utila "~0.4" - -private@^0.1.6, 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== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -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= - -promise@^7.0.3: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -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= - -pstree.remy@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -public-encrypt@^4.0.0: +picomatch@^4.0.2, picomatch@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + +postcss-simple-vars@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-simple-vars/-/postcss-simple-vars-7.0.1.tgz#836b3097a54dcd13dbd3c36a5dbdd512fad2954c" + integrity sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A== + +postcss@^8.5.6: + version "8.5.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== 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" + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" -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== +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: - end-of-stream "^1.1.0" - once "^1.3.1" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" -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== +prop-types-extra@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" + integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" + react-is "^16.3.2" + warning "^4.0.0" -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== +prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= +property-information@^6.0.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= +property-information@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.1.0.tgz#b622e8646e02b580205415586b40804d3e8bfd5d" + integrity sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ== -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -pupa@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" - integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== +query-string@^9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-9.3.1.tgz#d0c93e6c7fb7c17bdf04aa09e382114580ede270" + integrity sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw== dependencies: - escape-goat "^2.0.0" + decode-uri-component "^0.4.1" + filter-obj "^5.1.0" + split-on-first "^3.0.0" -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -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= +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" + performance-now "^2.1.0" -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= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: +randombytes@^2.0.5: 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== +react-bootstrap@^2.10.10: + version "2.10.10" + resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.10.10.tgz#be0b0d951a69987152d75c0e6986c80425efdf21" + integrity sha512-gMckKUqn8aK/vCnfwoBpBVFUGT9SVQxwsYrp9yDHt0arXMamxALerliKBxr1TPbntirK/HGrUAHYbAeQTa9GHQ== dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" + "@babel/runtime" "^7.24.7" + "@restart/hooks" "^0.4.9" + "@restart/ui" "^1.9.4" + "@types/prop-types" "^15.7.12" + "@types/react-transition-group" "^4.4.6" + classnames "^2.3.2" + dom-helpers "^5.2.1" + invariant "^2.2.4" + prop-types "^15.8.1" + prop-types-extra "^1.1.0" + react-transition-group "^4.4.5" + uncontrollable "^7.2.1" + warning "^4.0.3" -rc@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== +react-dom@^19.1.1: + version "19.1.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.1.1.tgz#2daa9ff7f3ae384aeb30e76d5ee38c046dc89893" + integrity sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw== dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" + scheduler "^0.26.0" -react-dom@^0.14.0: - version "0.14.9" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-0.14.9.tgz#05064a3dcf0fb1880a3b2bfc9d58c55d8d9f6293" - integrity sha1-BQZKPc8PsYgKOyv8nVjFXY2fYpM= +react-fast-compare@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" + integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== -react@^0.14.0: - version "0.14.9" - resolved "https://registry.yarnpkg.com/react/-/react-0.14.9.tgz#9110a6497c49d44ba1c0edd317aec29c2e0d91d1" - integrity sha1-kRCmSXxJ1EuhwO3TF67CnC4NkdE= +react-intl@^7.1.11: + version "7.1.11" + resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-7.1.11.tgz#6155602c46621ad9b67dd31750d00908e1e0b516" + integrity sha512-tnVoRCWvW5Ie2ikYSdPF7z3+880yCe/9xPmitFeRPw3RYDcCfR4m8ZYa4MBq19W4adt9Z+PQA4FaMBCJ7E+HCQ== dependencies: - envify "^3.0.0" - fbjs "^0.6.1" + "@formatjs/ecma402-abstract" "2.3.4" + "@formatjs/icu-messageformat-parser" "2.11.2" + "@formatjs/intl" "3.1.6" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/react" "16 || 17 || 18 || 19" + hoist-non-react-statics "^3.3.2" + intl-messageformat "10.7.16" + tslib "^2.8.0" -read-input@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/read-input/-/read-input-0.3.1.tgz#5b3169308013464ffda6ec92e58d2d3cea948df1" - integrity sha1-WzFpMIATRk/9puyS5Y0tPOqUjfE= +react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, 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== +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-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-refresh@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53" + integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== + +react-router-dom@^7.9.1: + version "7.9.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.9.1.tgz#48044923701773da6362f9003ec46f308f293f15" + integrity sha512-U9WBQssBE9B1vmRjo9qTM7YRzfZ3lUxESIZnsf4VjR/lXYz9MHjvOxHzr/aUm4efpktbVOrF09rL/y4VHa8RMw== dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" + react-router "7.9.1" -readable-stream@^3.1.1, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +react-router@7.9.1: + version "7.9.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.9.1.tgz#b227410c31f24dd416c939ca5d0f8d5c8a1404d4" + integrity sha512-pfAByjcTpX55mqSDGwGnY9vDCpxqBLASg0BMNAuMmpSGESo/TaOUG6BllhAtAkCGx8Rnohik/XtaqiYUJtgW2g== dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" + cookie "^1.0.1" + set-cookie-parser "^2.6.0" -readable-stream@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== +react-select@^5.10.2: + version "5.10.2" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.10.2.tgz#8dffc69dfd7d74684d9613e6eb27204e3b99e127" + integrity sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ== dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" + "@babel/runtime" "^7.12.0" + "@emotion/cache" "^11.4.0" + "@emotion/react" "^11.8.1" + "@floating-ui/dom" "^1.0.1" + "@types/react-transition-group" "^4.4.0" + memoize-one "^6.0.0" + prop-types "^15.6.0" + react-transition-group "^4.3.0" + use-isomorphic-layout-effect "^1.2.0" -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== +react-toastify@^11.0.5: + version "11.0.5" + resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-11.0.5.tgz#ce4c42d10eeb433988ab2264d3e445c4e9d13313" + integrity sha512-EpqHBGvnSTtHYhCPLxML05NLY2ZX0JURbAdNYa6BUkk+amz4wbKBQvoKQAB0ardvSarUBuY4Q4s1sluAzZwkmA== dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" + clsx "^2.1.1" + +react-transition-group@^4.3.0, react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^19.1.1: + version "19.1.1" + resolved "https://registry.yarnpkg.com/react/-/react-19.1.1.tgz#06d9149ec5e083a67f9a1e39ce97b06a03b644af" + integrity sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ== readdirp@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== -readdirp@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== - dependencies: - picomatch "^2.2.1" - -recast@^0.11.17: - version "0.11.23" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" - integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= - dependencies: - ast-types "0.9.6" - esprima "~3.1.0" - private "~0.1.5" - source-map "~0.5.0" - -regenerate@^1.2.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" - integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -registry-auth-token@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da" - integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w== - dependencies: - rc "^1.2.8" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= - dependencies: - jsesc "~0.5.0" - -relateurl@0.2.x, relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= - -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= - -renderkid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" - integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== - dependencies: - css-select "^1.1.0" - dom-converter "^0.2" - htmlparser2 "^3.3.0" - strip-ansi "^3.0.0" - utila "^0.4.0" - -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== - -repeat-string@^1.5.2, 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" - -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= - -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== - -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" - -resolve-from@^3.0.0: +redent@^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/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +refractor@^4.8.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-4.9.0.tgz#2e1c7af0157230cdd2f9086660912eadc5f68323" + integrity sha512-nEG1SPXFoGGx+dcjftjv8cAjEusIh6ED1xhf5DG3C0x/k+rmZ2duKnc3QLpt6qeHv5fPb8uwN3VWN2BT7fr3Og== + dependencies: + "@types/hast" "^2.0.0" + "@types/prismjs" "^1.0.0" + hastscript "^7.0.0" + parse-entities "^4.0.0" + +rehype-parse@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-9.0.1.tgz#9993bda129acc64c417a9d3654a7be38b2a94c20" + integrity sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag== + dependencies: + "@types/hast" "^3.0.0" + hast-util-from-html "^2.0.0" + unified "^11.0.0" + +rehype-prism-plus@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/rehype-prism-plus/-/rehype-prism-plus-2.0.0.tgz#75b1e2d0dd7496125987a1732cb7d560de02a0fd" + integrity sha512-FeM/9V2N7EvDZVdR2dqhAzlw5YI49m9Tgn7ZrYJeYHIahM6gcXpH0K1y2gNnKanZCydOMluJvX2cB9z3lhY8XQ== + dependencies: + hast-util-to-string "^3.0.0" + parse-numeric-range "^1.3.0" + refractor "^4.8.0" + rehype-parse "^9.0.0" + unist-util-filter "^5.0.0" + unist-util-visit "^5.0.0" + +rehype-stringify@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-10.0.1.tgz#2ec1ebc56c6aba07905d3b4470bdf0f684f30b75" + integrity sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-to-html "^9.0.0" + unified "^11.0.0" + +rehype@~13.0.0: + version "13.0.2" + resolved "https://registry.yarnpkg.com/rehype/-/rehype-13.0.2.tgz#ab0b3ac26573d7b265a0099feffad450e4cf1952" + integrity sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A== + dependencies: + "@types/hast" "^3.0.0" + rehype-parse "^9.0.0" + rehype-stringify "^10.0.0" + unified "^11.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-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= - -resolve@^1.3.2: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== +resolve@^1.19.0: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: - path-parse "^1.0.6" + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= +rollup@^4.43.0: + version "4.50.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.50.0.tgz#6f237f598b7163ede33ce827af8534c929aaa186" + integrity sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw== dependencies: - lowercase-keys "^1.0.0" + "@types/estree" "1.0.8" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.50.0" + "@rollup/rollup-android-arm64" "4.50.0" + "@rollup/rollup-darwin-arm64" "4.50.0" + "@rollup/rollup-darwin-x64" "4.50.0" + "@rollup/rollup-freebsd-arm64" "4.50.0" + "@rollup/rollup-freebsd-x64" "4.50.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.50.0" + "@rollup/rollup-linux-arm-musleabihf" "4.50.0" + "@rollup/rollup-linux-arm64-gnu" "4.50.0" + "@rollup/rollup-linux-arm64-musl" "4.50.0" + "@rollup/rollup-linux-loongarch64-gnu" "4.50.0" + "@rollup/rollup-linux-ppc64-gnu" "4.50.0" + "@rollup/rollup-linux-riscv64-gnu" "4.50.0" + "@rollup/rollup-linux-riscv64-musl" "4.50.0" + "@rollup/rollup-linux-s390x-gnu" "4.50.0" + "@rollup/rollup-linux-x64-gnu" "4.50.0" + "@rollup/rollup-linux-x64-musl" "4.50.0" + "@rollup/rollup-openharmony-arm64" "4.50.0" + "@rollup/rollup-win32-arm64-msvc" "4.50.0" + "@rollup/rollup-win32-ia32-msvc" "4.50.0" + "@rollup/rollup-win32-x64-msvc" "4.50.0" + fsevents "~2.3.2" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== +rooks@^9.3.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/rooks/-/rooks-9.3.0.tgz#7a3eb44192b7d5b1321acdf15fafdee37987c348" + integrity sha512-ez9ReItW+a/GXsA92Lfh5KWTjhbzlp354KOlC5oh9RHVD5fs/GaWwBq72F2xkDXVblgCgFs0Nel1hxojtszhgw== dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" + fast-deep-equal "^3.1.3" + lodash.debounce "^4.0.8" + raf "^3.4.1" + use-sync-external-store "^1.4.0" -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== - -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== - -rewire@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/rewire/-/rewire-5.0.0.tgz#c4e6558206863758f6234d8f11321793ada2dbff" - integrity sha512-1zfitNyp9RH5UDyGGLe9/1N0bMlPQ0WrX0Tmg11kMHBpqwPJI4gfPpP7YngFyLbFmhXh19SToAG0sKKEFcOIJA== - dependencies: - eslint "^6.8.0" - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= - dependencies: - align-text "^0.1.1" - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -rimraf@^2.5.4, rimraf@^2.6.3: - 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.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" - integrity sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w== - dependencies: - hash-base "^2.0.0" - inherits "^2.0.1" - -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== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-async@^2.4.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.1.9" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== - -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= - dependencies: - aproba "^1.1.1" - -rxjs@^6.6.0: - version "6.6.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" - integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== - dependencies: - tslib "^1.9.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, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@^5.1.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-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-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= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sass-loader@^10.0.0: - version "10.5.2" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.5.2.tgz#1ca30534fff296417b853c7597ca3b0bbe8c37d0" - integrity sha512-vMUoSNOUKJILHpcNCCyD23X34gve1TS7Rjd9uXHeKqhvBG39x6XbswFDtpbTElj6XdMFezoWhkh5vtKudf2cgQ== - dependencies: - klona "^2.0.4" - loader-utils "^2.0.0" - neo-async "^2.6.2" - schema-utils "^3.0.0" - semver "^7.3.2" - -sass@^1.92.1: - version "1.92.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.92.1.tgz#07fb1fec5647d7b712685d1090628bf52456fe86" - integrity sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ== +sass@^1.93.0: + version "1.93.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.93.0.tgz#8252f61405be295f4755d1ed5df48bf118587aa5" + integrity sha512-CQi5/AzCwiubU3dSqRDJ93RfOfg/hhpW1l6wCIvolmehfwgCI35R/0QDs1+R+Ygrl8jFawwwIojE2w47/mf94A== dependencies: chokidar "^4.0.0" immutable "^5.0.2" @@ -5523,553 +2406,150 @@ sass@^1.92.1: optionalDependencies: "@parcel/watcher" "^2.4.1" -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== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" +scheduler@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" + integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== -schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^3.0.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" - -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - -semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: - 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.1.2, semver@^6.2.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@^7.3.2: - version "7.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== +set-cookie-parser@^2.6.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943" + integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== -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@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" - integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== - dependencies: - randombytes "^2.1.0" - -set-blocking@^2.0.0: +siginfo@^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= + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -set-function-length@^1.2.2: - 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-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.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= - -sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: - version "2.4.12" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f" - integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== - dependencies: - inherits "^2.0.4" - safe-buffer "^5.2.1" - to-buffer "^1.2.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= - dependencies: - shebang-regex "^1.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= - -signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - -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@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -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= - dependencies: - is-plain-obj "^1.0.0" - -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@>=0.6.2 <2.0.0", source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - -source-map-support@~0.5.12: - 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: - 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= - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1: +source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -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== - -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -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" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -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= - -ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== - dependencies: - figgy-pudding "^3.5.1" - -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= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stream-browserify@^2.0.1: +space-separated-tokens@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +split-on-first@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-3.0.0.tgz#f04959c9ea8101b9b0bbf35a61b9ebea784a23e7" + integrity sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA== + +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +std-env@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" + integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== + +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" -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" - -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== - 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= - -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== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string_decoder@^1.0.0, 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== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.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-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-json-comments@^3.0.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 sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -style-loader@^1.1.3: - version "1.2.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" - integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== - dependencies: - loader-utils "^2.0.0" - schema-utils "^2.6.6" - -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= - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.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== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: +strip-ansi@^7.1.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: - has-flag "^4.0.0" + ansi-regex "^6.0.1" -syntax-error@^1.1.6: - version "1.4.0" - resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" - integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: - acorn-node "^1.2.0" + min-indent "^1.0.0" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== +strip-literal@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-3.0.0.tgz#ce9c452a91a0af2876ed1ae4e583539a353df3fc" + integrity sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA== dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" + js-tokens "^9.0.1" -"tabler-ui@git+https://github.com/tabler/tabler.git#00f78ad823311bc3ad974ac3e5b0126198f0a813": - version "0.0.31" - resolved "git+https://github.com/tabler/tabler.git#00f78ad823311bc3ad974ac3e5b0126198f0a813" - dependencies: - bootstrap "^4.0.0" +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== -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== - -term-size@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" - integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== - -terser-webpack-plugin@^1.4.3: - version "1.4.4" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f" - integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^3.1.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser@^4.1.2, terser@^4.6.3: - version "4.8.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" - integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -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== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@^2.3.6, through@~2.3.4: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -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" - -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" - -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= - -to-buffer@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.1.tgz#2ce650cdb262e9112a18e65dc29dcb513c8155e0" - integrity sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ== - dependencies: - isarray "^2.0.5" - safe-buffer "^5.2.1" - typed-array-buffer "^1.0.3" - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - -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= - -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= - dependencies: - kind-of "^3.0.2" - -to-readable-stream@^1.0.0: +supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -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= +tiny-invariant@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + +tiny-warning@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinyglobby@^0.2.14: + version "0.2.14" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" + integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" + fdir "^6.4.4" + picomatch "^4.0.2" + +tinyglobby@^0.2.15: + version "0.2.15" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + +tinypool@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" + integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== + +tinyrainbow@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" + integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== + +tinyspy@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-4.0.3.tgz#d1d0f0602f4c15f1aae083a34d6d0df3363b1b52" + integrity sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A== + +tmp@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" + integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== to-regex-range@^5.0.1: version "5.0.1" @@ -6078,537 +2558,291 @@ to-regex-range@^5.0.1: 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" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + +tsconfck@^3.0.3: + version "3.1.6" + resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.1.6.tgz#da1f0b10d82237ac23422374b3fce1edb23c3ead" + integrity sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w== + +tslib@^2.0.0, tslib@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +typescript@5.9.2: + version "5.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.2.tgz#d93450cddec5154a2d5cabe3b8102b83316fb2a6" + integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== + +uncontrollable@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" + integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" + "@babel/runtime" "^7.6.3" + "@types/react" ">=16.9.11" + invariant "^2.2.4" + react-lifecycles-compat "^3.0.4" -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== +uncontrollable@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-8.0.4.tgz#a0a8307f638795162fafd0550f4a1efa0f8c5eb6" + integrity sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ== + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + +unicorn-magic@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104" + integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== + +unified@^11.0.0: + version "11.0.5" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" + integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== dependencies: - nopt "~1.0.10" + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - -tslib@^1.10.0, tslib@^1.9.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== - -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= - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= +unist-util-filter@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/unist-util-filter/-/unist-util-filter-5.0.1.tgz#f9f3a0bdee007e040964c274dda27bac663d0a39" + integrity sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw== dependencies: - prelude-ls "~1.1.2" + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typed-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" - integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-typed-array "^1.1.14" + "@types/unist" "^3.0.0" -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== dependencies: - is-typedarray "^1.0.0" + "@types/unist" "^3.0.0" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -ua-parser-js@^0.7.9: - version "0.7.33" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" - integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== - -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" - -uglify-js@~2.6.1: - version "2.6.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.6.4.tgz#65ea2fb3059c9394692f15fed87c2b36c16b9adf" - integrity sha1-ZeovswWck5RpLxX+2HwrNsFrmt8= - dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= - -undefsafe@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae" - integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A== - dependencies: - debug "^2.2.0" - -underscore@>=1.8.3, underscore@^1.12.1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" - integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - 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= - -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== - dependencies: - unique-slug "^2.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" - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -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= - 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== - -update-notifier@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" - integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew== - dependencies: - boxen "^4.2.0" - chalk "^3.0.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.3.1" - is-npm "^4.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.0.0" - pupa "^2.0.1" - semver-diff "^3.1.1" - xdg-basedir "^4.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 sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= - -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== - 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= - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.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.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -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= - dependencies: - inherits "2.0.1" - -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" - -utila@^0.4.0, utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= - -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== - -v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== - -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== - -watchpack-chokidar2@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" - integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== - dependencies: - chokidar "^2.1.8" - -watchpack@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" - integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== - dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.0" - -webpack-cli@^3.3.11: - version "3.3.12" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" - integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== - dependencies: - chalk "^2.4.2" - cross-spawn "^6.0.5" - enhanced-resolve "^4.1.1" - findup-sync "^3.0.0" - global-modules "^2.0.0" - import-local "^2.0.0" - interpret "^1.4.0" - loader-utils "^1.4.0" - supports-color "^6.1.0" - v8-compile-cache "^2.1.1" - yargs "^13.3.2" - -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" - -webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack-visualizer-plugin@^0.1.11: - version "0.1.11" - resolved "https://registry.yarnpkg.com/webpack-visualizer-plugin/-/webpack-visualizer-plugin-0.1.11.tgz#b8770ad86b4f652612c68b1b782253faf9f8a34e" - integrity sha1-uHcK2GtPZSYSxosbeCJT+vn4o04= - dependencies: - d3 "^3.5.6" - mkdirp "^0.5.1" - react "^0.14.0" - react-dom "^0.14.0" - -webpack@^4.42.1: - version "4.44.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.1.tgz#17e69fff9f321b8f117d1fda714edfc0b939cc21" - integrity sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ== - 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.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.3.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.7.4" - webpack-sources "^1.4.1" - -whatwg-fetch@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz#0e3684c6cb9995b43efc9df03e4c365d95fd9cc0" - integrity sha1-DjaExsuZlbQ+/J3wPkw2XZX9nMA= - -which-module@^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= - -which-typed-array@^1.1.16: - version "1.1.19" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" - integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - for-each "^0.3.5" - get-proto "^1.0.1" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - -which@^1.2.14, 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" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= - -word-wrap@~1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" - integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= - -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== - dependencies: - errno "~0.1.7" - -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== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - 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= - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -xdg-basedir@^4.0.0: +unist-util-stringify-position@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" -xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" -y18n@^4.0.0: +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +use-isomorphic-layout-effect@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz#2f11a525628f56424521c748feabc2ffcc962fce" + integrity sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA== + +use-sync-external-store@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz#55122e2a3edd2a6c106174c27485e0fd59bcfca0" + integrity sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A== + +vfile-location@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.3.tgz#cb9eacd20f2b6426d19451e0eafa3d0a846225c3" + integrity sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg== + dependencies: + "@types/unist" "^3.0.0" + vfile "^6.0.0" + +vfile-message@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.3.tgz#87b44dddd7b70f0641c2e3ed0864ba73e2ea8df4" + integrity sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" + integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== + dependencies: + "@types/unist" "^3.0.0" + vfile-message "^4.0.0" + +vite-node@3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.2.4.tgz#f3676d94c4af1e76898c162c92728bca65f7bb07" + integrity sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg== + dependencies: + cac "^6.7.14" + debug "^4.4.1" + es-module-lexer "^1.7.0" + pathe "^2.0.3" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + +vite-plugin-checker@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/vite-plugin-checker/-/vite-plugin-checker-0.10.3.tgz#ddc609aebe098b23aea685daba5548bea75adf80" + integrity sha512-f4sekUcDPF+T+GdbbE8idb1i2YplBAoH+SfRS0e/WRBWb2rYb1Jf5Pimll0Rj+3JgIYWwG2K5LtBPCXxoibkLg== + dependencies: + "@babel/code-frame" "^7.27.1" + chokidar "^4.0.3" + npm-run-path "^6.0.0" + picocolors "^1.1.1" + picomatch "^4.0.3" + strip-ansi "^7.1.0" + tiny-invariant "^1.3.3" + tinyglobby "^0.2.14" + vscode-uri "^3.1.0" + +vite-tsconfig-paths@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz#d9a71106a7ff2c1c840c6f1708042f76a9212ed4" + integrity sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w== + dependencies: + debug "^4.1.1" + globrex "^0.1.2" + tsconfck "^3.0.3" + +"vite@^5.0.0 || ^6.0.0 || ^7.0.0-0": + version "7.1.4" + resolved "https://registry.yarnpkg.com/vite/-/vite-7.1.4.tgz#354944affb55e1aff0157406b74e0d0a3232df9a" + integrity sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw== + dependencies: + esbuild "^0.25.0" + fdir "^6.5.0" + picomatch "^4.0.3" + postcss "^8.5.6" + rollup "^4.43.0" + tinyglobby "^0.2.14" + optionalDependencies: + fsevents "~2.3.3" + +vite@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/vite/-/vite-7.1.6.tgz#336806d29983135677f498a05efb0fd46c5eef2d" + integrity sha512-SRYIB8t/isTwNn8vMB3MR6E+EQZM/WG1aKmmIUCfDXfVvKfc20ZpamngWHKzAmmu9ppsgxsg4b2I7c90JZudIQ== + dependencies: + esbuild "^0.25.0" + fdir "^6.5.0" + picomatch "^4.0.3" + postcss "^8.5.6" + rollup "^4.43.0" + tinyglobby "^0.2.15" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-3.2.4.tgz#0637b903ad79d1539a25bc34c0ed54b5c67702ea" + integrity sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A== + dependencies: + "@types/chai" "^5.2.2" + "@vitest/expect" "3.2.4" + "@vitest/mocker" "3.2.4" + "@vitest/pretty-format" "^3.2.4" + "@vitest/runner" "3.2.4" + "@vitest/snapshot" "3.2.4" + "@vitest/spy" "3.2.4" + "@vitest/utils" "3.2.4" + chai "^5.2.0" + debug "^4.4.1" + expect-type "^1.2.1" + magic-string "^0.30.17" + pathe "^2.0.3" + picomatch "^4.0.2" + std-env "^3.9.0" + tinybench "^2.9.0" + tinyexec "^0.3.2" + tinyglobby "^0.2.14" + tinypool "^1.1.1" + tinyrainbow "^2.0.0" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + vite-node "3.2.4" + why-is-node-running "^2.3.0" + +vscode-uri@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.1.0.tgz#dd09ec5a66a38b5c3fffc774015713496d14e09c" + integrity sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== + +warning@^4.0.0, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + +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== + +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yaml@^1.6.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" - integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^13.1.2: - 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@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - 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.2" - -yargs@^15.0.0: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" +zwitch@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/scripts/ci/frontend-build b/scripts/ci/frontend-build index 9bcf1a7e..e1d92923 100755 --- a/scripts/ci/frontend-build +++ b/scripts/ci/frontend-build @@ -17,7 +17,7 @@ if hash docker 2>/dev/null; then -v "$(pwd)/frontend:/app/frontend" \ -v "$(pwd)/global:/app/global" \ -w /app/frontend "${DOCKER_IMAGE}" \ - sh -c "yarn install && yarn build && chown -R $(id -u):$(id -g) /app/frontend" + sh -c "yarn install && yarn lint && yarn build && chown -R $(id -u):$(id -g) /app/frontend" echo -e "${BLUE}❯ ${GREEN}Building Frontend Complete${RESET}" else