diff --git a/.gitignore b/.gitignore
index 74d544686..02a3dabd2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -54,3 +54,9 @@ apps/promisetracker/public/data/**
storybook-static
mongo-keyfile
+
+#Google credentials
+credentials.json
+
+# Sentry Config File
+.sentryclirc
diff --git a/Dockerfile.vpnmanager b/Dockerfile.vpnmanager
new file mode 100644
index 000000000..31ba72d4c
--- /dev/null
+++ b/Dockerfile.vpnmanager
@@ -0,0 +1,68 @@
+FROM node:18-alpine as node-alpine
+
+# Always install security updated e.g. https://pythonspeed.com/articles/security-updates-in-docker/
+# Update local cache so that other stages don't need to update cache
+RUN apk update \
+ && apk upgrade
+
+
+FROM node-alpine as base
+
+RUN apk add --no-cache libc6-compat
+
+ARG PNPM_VERSION=8.5.0
+
+RUN corepack enable && corepack prepare pnpm@${PNPM_VERSION} --activate
+
+WORKDIR /workspace
+
+COPY pnpm-lock.yaml .
+
+RUN pnpm fetch
+
+
+FROM base as builder
+
+
+WORKDIR /workspace
+
+COPY *.yaml *.json ./
+COPY packages ./packages
+COPY apps/vpnmanager ./apps/vpnmanager
+
+# Use virtual store: https://pnpm.io/cli/fetch#usage-scenario
+RUN pnpm install --recursive --offline --frozen-lockfile
+
+# NOTE: ARG values are only available **after** ARG statement & hence we need
+# to separate NEXT_PUBLIC_APP_URL and PAYLOAD_PUBLIC_APP_URL into
+# multiple ARG statements so that PAYLOAD can use the value defined
+# in NEXT.
+ARG PORT=3000 \
+ # Sentry config for source maps upload (needed at build time only)
+ SENTRY_AUTH_TOKEN="" \
+ SENTRY_ENV="local" \
+ SENTRY_ORG="" \
+ SENTRY_PROJECT="" \
+ SENTRY_DSN=""
+RUN pnpm build --filter=vpnmanager
+
+FROM builder as runner
+
+RUN rm -rf /var/cache/apk/*
+
+ARG PORT \
+ SENTRY_ENV
+
+ENV NODE_ENV=production \
+ PORT=${PORT} \
+ SENTRY_ENV=${SENTRY_ENV} \
+ SENTRY_DSN=${SENTRY_DSN} \
+ SENTRY_ORG=${SENTRY_ORG} \
+ SENTRY_PROJECT=${SENTRY_PROJECT} \
+ SENTRY_AUTH_TOKEN=${SENTRY_AUTH_TOKEN}
+
+WORKDIR /workspace/apps/vpnmanager
+
+EXPOSE ${PORT}
+
+CMD [ "pnpm", "run", "start" ]
diff --git a/Makefile b/Makefile
index 84ddc764d..1c3ba1c13 100644
--- a/Makefile
+++ b/Makefile
@@ -1,10 +1,13 @@
# Makefile
-.PHONY: charterafrica mongodb mongodb-keyfile
+.PHONY: charterafrica mongodb mongodb-keyfile vpnmanager
charterafrica:
docker compose --env-file apps/charterafrica/.env.local up charterafrica --build -d
+vpnmanager:
+ docker compose --env-file apps/vpnmanager/.env.local up vpnmanager --build -d
+
mongodb:
docker compose --env-file apps/charterafrica/.env.local up --wait mongodb
diff --git a/apps/vpnmanager/.env.template b/apps/vpnmanager/.env.template
new file mode 100644
index 000000000..91538d77e
--- /dev/null
+++ b/apps/vpnmanager/.env.template
@@ -0,0 +1,6 @@
+NEXT_APP_GOOGLE_CREDENTIALS=/path/to/credentials.json
+NEXT_APP_GOOGLE_SHEET_ID=
+NEXT_APP_GOOGLE_SHEET_RANGE=New Hires!A:Z
+NEXT_APP_VPN_API_URL=
+SENTRY_AUTH_TOKEN=
+SENTRY_DSN=
diff --git a/apps/vpnmanager/README.md b/apps/vpnmanager/README.md
new file mode 100644
index 000000000..d2a5df1fc
--- /dev/null
+++ b/apps/vpnmanager/README.md
@@ -0,0 +1,45 @@
+# VPN Manager
+
+This is the cfa Outline VPN Manager
+
+### Development
+
+## Getting Started
+
+First create `.env.local` file in the root directory of the project.
+
+```bash
+cp env.template .env.local
+```
+
+and modify the `.env.local` file according to your needs.
+
+#### Note
+
+The default `.env` file is for the 'Publicly' visible environment variables.
+
+## Script
+
+```bash
+ pnpm process-new-hires
+```
+
+## Web
+
+Run the development server:
+
+```bash
+pnpm dev
+```
+
+### Deployment.
+
+```bash
+ docker-compose up --build vpnmanager
+```
+
+or
+
+```bash
+make vpnmanager
+```
diff --git a/apps/vpnmanager/next-env.d.ts b/apps/vpnmanager/next-env.d.ts
new file mode 100644
index 000000000..4f11a03dc
--- /dev/null
+++ b/apps/vpnmanager/next-env.d.ts
@@ -0,0 +1,5 @@
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/apps/vpnmanager/next.config.mjs b/apps/vpnmanager/next.config.mjs
new file mode 100644
index 000000000..ea793582e
--- /dev/null
+++ b/apps/vpnmanager/next.config.mjs
@@ -0,0 +1,38 @@
+import { withSentryConfig } from "@sentry/nextjs";
+
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ transpilePackages: ["@commons-ui/core", "@commons-ui/next"],
+ eslint: {
+ ignoreDuringBuilds: true,
+ },
+ webpack: (config) => {
+ config.module.rules.push(
+ {
+ test: /\.svg$/i,
+ type: "asset",
+ resourceQuery: /url/, // *.svg?url
+ },
+ {
+ test: /\.svg$/i,
+ issuer: /\.[jt]sx?$/,
+ resourceQuery: { not: [/url/] }, // exclude react component if *.svg?url
+ use: ["@svgr/webpack"],
+ },
+ {
+ test: /\.md$/,
+ loader: "frontmatter-markdown-loader",
+ },
+ );
+ config.experiments = { ...config.experiments, topLevelAwait: true }; // eslint-disable-line no-param-reassign
+ return config;
+ },
+};
+
+export default withSentryConfig(nextConfig, {
+ silent: true,
+ hideSourceMaps: true,
+ org: process.env.SENTRY_ORG,
+ authToken: process.env.SENTRY_AUTH_TOKEN,
+ project: process.env.SENTRY_PROJECT,
+});
diff --git a/apps/vpnmanager/package.json b/apps/vpnmanager/package.json
new file mode 100644
index 000000000..573837c07
--- /dev/null
+++ b/apps/vpnmanager/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "vpnmanager",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "pnpm run build-ts && next build",
+ "start": "next start",
+ "build-ts": "tsc --project tsconfig.server.json && tsc-alias -p tsconfig.server.json",
+ "process-new-hires": "node dist/src/lib/processNewHires.js"
+ },
+ "dependencies": {
+ "@babel/core": "^7.23.6",
+ "@babel/preset-react": "^7.23.3",
+ "@commons-ui/core": "workspace:*",
+ "@commons-ui/next": "workspace:*",
+ "@emotion/cache": "^11.11.0",
+ "@emotion/react": "^11.11.1",
+ "@emotion/server": "^11.11.0",
+ "@emotion/styled": "^11.11.0",
+ "@mui/material": "^5.14.20",
+ "@mui/utils": "^5.14.20",
+ "@sentry/nextjs": "^7.105.0",
+ "@svgr/webpack": "^8.1.0",
+ "@types/jest": "^29.5.12",
+ "googleapis": "^133.0.0",
+ "jest": "^29.7.0",
+ "next": "14.1.3",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "tsc-alias": "^1.8.8",
+ "tsconfig-paths": "^4.2.0"
+ },
+ "devDependencies": {
+ "@commons-ui/testing-library": "workspace:*",
+ "@types/node": "^20",
+ "@types/react": "^18",
+ "@types/react-dom": "^18",
+ "eslint": "^8.55.0",
+ "eslint-config-commons-ui": "workspace:*",
+ "eslint-import-resolver-webpack": "^0.13.8",
+ "eslint-plugin-import": "^2.29.0",
+ "typescript": "^5"
+ }
+}
diff --git a/apps/vpnmanager/public/android-chrome-192x192.png b/apps/vpnmanager/public/android-chrome-192x192.png
new file mode 100644
index 000000000..b6b1c195a
Binary files /dev/null and b/apps/vpnmanager/public/android-chrome-192x192.png differ
diff --git a/apps/vpnmanager/public/android-chrome-512x512.png b/apps/vpnmanager/public/android-chrome-512x512.png
new file mode 100644
index 000000000..994c5f68a
Binary files /dev/null and b/apps/vpnmanager/public/android-chrome-512x512.png differ
diff --git a/apps/vpnmanager/public/apple-touch-icon.png b/apps/vpnmanager/public/apple-touch-icon.png
new file mode 100644
index 000000000..bc086d518
Binary files /dev/null and b/apps/vpnmanager/public/apple-touch-icon.png differ
diff --git a/apps/vpnmanager/public/browserconfig.xml b/apps/vpnmanager/public/browserconfig.xml
new file mode 100644
index 000000000..f9c2e67fe
--- /dev/null
+++ b/apps/vpnmanager/public/browserconfig.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ #2b5797
+
+
+
diff --git a/apps/vpnmanager/public/favicon-16x16.png b/apps/vpnmanager/public/favicon-16x16.png
new file mode 100644
index 000000000..aeecce01f
Binary files /dev/null and b/apps/vpnmanager/public/favicon-16x16.png differ
diff --git a/apps/vpnmanager/public/favicon-32x32.png b/apps/vpnmanager/public/favicon-32x32.png
new file mode 100644
index 000000000..3dd2a39a8
Binary files /dev/null and b/apps/vpnmanager/public/favicon-32x32.png differ
diff --git a/apps/vpnmanager/public/favicon.ico b/apps/vpnmanager/public/favicon.ico
new file mode 100644
index 000000000..886942077
Binary files /dev/null and b/apps/vpnmanager/public/favicon.ico differ
diff --git a/apps/vpnmanager/public/mstile-150x150.png b/apps/vpnmanager/public/mstile-150x150.png
new file mode 100644
index 000000000..f47cd2c07
Binary files /dev/null and b/apps/vpnmanager/public/mstile-150x150.png differ
diff --git a/apps/vpnmanager/public/safari-pinned-tab.svg b/apps/vpnmanager/public/safari-pinned-tab.svg
new file mode 100644
index 000000000..dcae051b6
--- /dev/null
+++ b/apps/vpnmanager/public/safari-pinned-tab.svg
@@ -0,0 +1,46 @@
+
+
+
diff --git a/apps/vpnmanager/public/site.webmanifest b/apps/vpnmanager/public/site.webmanifest
new file mode 100644
index 000000000..96ca8fa01
--- /dev/null
+++ b/apps/vpnmanager/public/site.webmanifest
@@ -0,0 +1,19 @@
+{
+ "name": "Code for Africa",
+ "short_name": "CfA",
+ "icons": [
+ {
+ "src": "/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
+}
diff --git a/apps/vpnmanager/sentry.client.config.ts b/apps/vpnmanager/sentry.client.config.ts
new file mode 100644
index 000000000..d4ca649c7
--- /dev/null
+++ b/apps/vpnmanager/sentry.client.config.ts
@@ -0,0 +1,16 @@
+import * as Sentry from "@sentry/nextjs";
+
+Sentry.init({
+ dsn: process.env.SENTRY_DSN,
+ tracesSampleRate: 1,
+ environment: process.env.SENTRY_ENV,
+ debug: false,
+ replaysOnErrorSampleRate: 1.0,
+ replaysSessionSampleRate: 0.1,
+ integrations: [
+ Sentry.replayIntegration({
+ maskAllText: true,
+ blockAllMedia: true,
+ }),
+ ],
+});
diff --git a/apps/vpnmanager/sentry.edge.config.ts b/apps/vpnmanager/sentry.edge.config.ts
new file mode 100644
index 000000000..458a9f886
--- /dev/null
+++ b/apps/vpnmanager/sentry.edge.config.ts
@@ -0,0 +1,8 @@
+import * as Sentry from "@sentry/nextjs";
+
+Sentry.init({
+ dsn: process.env.SENTRY_DSN,
+ environment: process.env.SENTRY_ENV,
+ tracesSampleRate: 1,
+ debug: false,
+});
diff --git a/apps/vpnmanager/sentry.server.config.ts b/apps/vpnmanager/sentry.server.config.ts
new file mode 100644
index 000000000..458a9f886
--- /dev/null
+++ b/apps/vpnmanager/sentry.server.config.ts
@@ -0,0 +1,8 @@
+import * as Sentry from "@sentry/nextjs";
+
+Sentry.init({
+ dsn: process.env.SENTRY_DSN,
+ environment: process.env.SENTRY_ENV,
+ tracesSampleRate: 1,
+ debug: false,
+});
diff --git a/apps/vpnmanager/src/assets/icons/Type=github, Size=24, Color=CurrentColor.svg b/apps/vpnmanager/src/assets/icons/Type=github, Size=24, Color=CurrentColor.svg
new file mode 100644
index 000000000..33fc4f5fb
--- /dev/null
+++ b/apps/vpnmanager/src/assets/icons/Type=github, Size=24, Color=CurrentColor.svg
@@ -0,0 +1,10 @@
+
diff --git a/apps/vpnmanager/src/assets/icons/Type=x, Size=24, Color=CurrentColor.svg b/apps/vpnmanager/src/assets/icons/Type=x, Size=24, Color=CurrentColor.svg
new file mode 100644
index 000000000..93fbad2f7
--- /dev/null
+++ b/apps/vpnmanager/src/assets/icons/Type=x, Size=24, Color=CurrentColor.svg
@@ -0,0 +1,4 @@
+
diff --git a/apps/vpnmanager/src/assets/icons/menu-icon.svg b/apps/vpnmanager/src/assets/icons/menu-icon.svg
new file mode 100644
index 000000000..2a4912de7
--- /dev/null
+++ b/apps/vpnmanager/src/assets/icons/menu-icon.svg
@@ -0,0 +1,5 @@
+
diff --git a/apps/vpnmanager/src/components/DesktopNavBar/DesktopNavBar.tsx b/apps/vpnmanager/src/components/DesktopNavBar/DesktopNavBar.tsx
new file mode 100644
index 000000000..4346ab9e7
--- /dev/null
+++ b/apps/vpnmanager/src/components/DesktopNavBar/DesktopNavBar.tsx
@@ -0,0 +1,57 @@
+import React, { FC } from "react";
+
+import NavBarNavList from "@/vpnmanager/components/NavBarNavList";
+import NextImageButton from "@/vpnmanager/components/NextImageButton";
+import { Box, Grid, Grid2Props } from "@mui/material";
+
+interface SocialLinks {
+ platform: string;
+ url: string;
+}
+
+interface Menu {
+ label: string;
+ href: string;
+}
+interface Props extends Grid2Props {
+ logo: any;
+ menus: Menu[];
+ socialLinks: SocialLinks[];
+}
+const DesktopNavBar: FC = React.forwardRef(
+ function DesktopNavBar(props, ref) {
+ const { logo, menus, socialLinks, sx } = props;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+ },
+);
+
+export default DesktopNavBar;
diff --git a/apps/vpnmanager/src/components/DesktopNavBar/index.ts b/apps/vpnmanager/src/components/DesktopNavBar/index.ts
new file mode 100644
index 000000000..3919164ee
--- /dev/null
+++ b/apps/vpnmanager/src/components/DesktopNavBar/index.ts
@@ -0,0 +1,3 @@
+import DesktopNavBar from "./DesktopNavBar";
+
+export default DesktopNavBar;
diff --git a/apps/vpnmanager/src/components/MobileNavBar/MobileNavBar.tsx b/apps/vpnmanager/src/components/MobileNavBar/MobileNavBar.tsx
new file mode 100644
index 000000000..147c844b9
--- /dev/null
+++ b/apps/vpnmanager/src/components/MobileNavBar/MobileNavBar.tsx
@@ -0,0 +1,141 @@
+import React, { FC, ForwardedRef } from "react";
+
+import menuIcon from "@/vpnmanager/assets/icons/menu-icon.svg";
+import CloseIcon from "@/vpnmanager/assets/icons/Type=x, Size=24, Color=CurrentColor.svg";
+import NavBarNavList from "@/vpnmanager/components/NavBarNavList";
+import NextImageButton from "@/vpnmanager/components/NextImageButton";
+import {
+ Dialog,
+ DialogContent,
+ Grid,
+ Grid2Props,
+ IconButton,
+ Slide,
+ SlideProps,
+ SvgIcon,
+} from "@mui/material";
+import { styled } from "@mui/material/styles";
+
+interface SocialLinks {
+ platform: string;
+ url: string;
+}
+
+interface Menu {
+ label: string;
+ href: string;
+}
+interface Props extends Grid2Props {
+ logo: any;
+ menus: Menu[];
+ socialLinks: SocialLinks[];
+}
+
+const DialogContainer = styled(Dialog)(({ theme: { palette, spacing } }) => ({
+ "& .MuiDialog-container": {
+ height: "100%",
+ },
+ "& .MuiBackdrop-root": {
+ background: "transparent",
+ },
+ "& .MuiDialogContent-root": {
+ padding: spacing(5),
+ color: palette.text.secondary,
+ background: palette.primary.main,
+ },
+}));
+
+const Transition: FC = React.forwardRef(function Transition(
+ { children, ...props },
+ ref,
+) {
+ return (
+
+ {children}
+
+ );
+});
+
+const MobileNavBar: FC = React.forwardRef(function MobileNavBar(
+ props,
+ ref: ForwardedRef,
+) {
+ const { logo, menus, socialLinks, sx } = props;
+ const [open, setOpen] = React.useState(false);
+
+ const handleClickOpen = () => {
+ setOpen(true);
+ };
+ const handleClose = () => {
+ setOpen(false);
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+});
+
+export default MobileNavBar;
diff --git a/apps/vpnmanager/src/components/MobileNavBar/index.ts b/apps/vpnmanager/src/components/MobileNavBar/index.ts
new file mode 100644
index 000000000..b19184643
--- /dev/null
+++ b/apps/vpnmanager/src/components/MobileNavBar/index.ts
@@ -0,0 +1,3 @@
+import MobileNavBar from "./MobileNavBar";
+
+export default MobileNavBar;
diff --git a/apps/vpnmanager/src/components/NavBar/NavBar.tsx b/apps/vpnmanager/src/components/NavBar/NavBar.tsx
new file mode 100644
index 000000000..a120d8bc4
--- /dev/null
+++ b/apps/vpnmanager/src/components/NavBar/NavBar.tsx
@@ -0,0 +1,46 @@
+import React from "react";
+
+import DesktopNavBar from "@/vpnmanager/components/DesktopNavBar";
+import MobileNavBar from "@/vpnmanager/components/MobileNavBar";
+import { NavBar as NavigationBar, Section } from "@commons-ui/core";
+
+interface SocialLinks {
+ platform: string;
+ url: string;
+}
+
+interface Menu {
+ label: string;
+ href: string;
+}
+interface Props {
+ logo: any;
+ menus: Menu[];
+ socialLinks: SocialLinks[];
+}
+function NavBar({ logo, menus, socialLinks }: Props) {
+ return (
+
+
+
+ );
+}
+
+export default NavBar;
diff --git a/apps/vpnmanager/src/components/NavBar/index.ts b/apps/vpnmanager/src/components/NavBar/index.ts
new file mode 100644
index 000000000..085b6b525
--- /dev/null
+++ b/apps/vpnmanager/src/components/NavBar/index.ts
@@ -0,0 +1,3 @@
+import NavBar from "./NavBar";
+
+export default NavBar;
diff --git a/apps/vpnmanager/src/components/NavBarNavList/NavBarNavList.tsx b/apps/vpnmanager/src/components/NavBarNavList/NavBarNavList.tsx
new file mode 100644
index 000000000..7f5983949
--- /dev/null
+++ b/apps/vpnmanager/src/components/NavBarNavList/NavBarNavList.tsx
@@ -0,0 +1,103 @@
+import React, { ElementType, FC } from "react";
+
+import GitHubIcon from "@/vpnmanager/assets/icons/Type=github, Size=24, Color=CurrentColor.svg";
+import NavListItem from "@/vpnmanager/components/NavListItem";
+import { NavList } from "@commons-ui/core";
+import { Link } from "@commons-ui/next";
+import { LinkProps, SvgIcon } from "@mui/material";
+
+const platformToIconMap: {
+ [key: string]: ElementType;
+} = {
+ Github: GitHubIcon,
+};
+
+interface NavListItemProps extends LinkProps {}
+
+interface SocialLinks {
+ platform: string;
+ url: string;
+}
+
+interface Menu {
+ label: string;
+ href: string;
+}
+
+interface Props {
+ NavListItemProps?: NavListItemProps;
+ direction?: string;
+ menus?: Menu[];
+ socialLinks?: SocialLinks[];
+}
+
+const NavBarNavList: FC = React.forwardRef(
+ function NavBarNavList(props, ref) {
+ const { NavListItemProps, direction, menus, socialLinks, ...other } = props;
+
+ if (!menus?.length) {
+ return null;
+ }
+ return (
+
+ {menus.map((item) => (
+
+
+ {item.label}
+
+
+ ))}
+ {socialLinks?.map(({ platform, url }) => {
+ const Icon = platformToIconMap[platform];
+ if (!Icon) {
+ return null;
+ }
+ return (
+
+
+
+
+
+ );
+ })}
+
+ );
+ },
+);
+
+export default NavBarNavList;
diff --git a/apps/vpnmanager/src/components/NavBarNavList/index.ts b/apps/vpnmanager/src/components/NavBarNavList/index.ts
new file mode 100644
index 000000000..f261c9be0
--- /dev/null
+++ b/apps/vpnmanager/src/components/NavBarNavList/index.ts
@@ -0,0 +1,3 @@
+import NavBarNavList from "./NavBarNavList";
+
+export default NavBarNavList;
diff --git a/apps/vpnmanager/src/components/NavListItem/NavListItem.tsx b/apps/vpnmanager/src/components/NavListItem/NavListItem.tsx
new file mode 100644
index 000000000..5cde403fc
--- /dev/null
+++ b/apps/vpnmanager/src/components/NavListItem/NavListItem.tsx
@@ -0,0 +1,19 @@
+import { styled, SxProps } from "@mui/material/styles";
+import React, { FC, ForwardedRef, HTMLAttributes } from "react";
+
+const NavListItemRoot = styled("li")({
+ listStyle: "none",
+});
+
+interface Props extends HTMLAttributes {
+ sx?: SxProps;
+}
+
+const NavListItem: FC = React.forwardRef(function NavListItem(
+ props,
+ ref: ForwardedRef,
+) {
+ return ;
+});
+
+export default NavListItem;
diff --git a/apps/vpnmanager/src/components/NavListItem/index.ts b/apps/vpnmanager/src/components/NavListItem/index.ts
new file mode 100644
index 000000000..abc33a899
--- /dev/null
+++ b/apps/vpnmanager/src/components/NavListItem/index.ts
@@ -0,0 +1,3 @@
+import NavListItem from "./NavListItem";
+
+export default NavListItem;
diff --git a/apps/vpnmanager/src/components/NextImageButton/NextImageButton.tsx b/apps/vpnmanager/src/components/NextImageButton/NextImageButton.tsx
new file mode 100644
index 000000000..e118ada07
--- /dev/null
+++ b/apps/vpnmanager/src/components/NextImageButton/NextImageButton.tsx
@@ -0,0 +1,40 @@
+import { ImageButton } from "@commons-ui/core";
+import { Link } from "@commons-ui/next";
+import Image from "next/image";
+import React, { FC } from "react";
+
+interface Props {
+ src?: string;
+ href?: string;
+ alt: string;
+ width?: number;
+ height?: number;
+ priority?: boolean;
+ onClick?: () => void;
+}
+
+const NextImageButton: FC = React.forwardRef(function Logo(props, ref) {
+ const { alt, height, href, priority, src, width, ...other } = props;
+
+ if (!src) {
+ return null;
+ }
+ return (
+
+
+
+ );
+});
+
+export default NextImageButton;
diff --git a/apps/vpnmanager/src/components/NextImageButton/index.ts b/apps/vpnmanager/src/components/NextImageButton/index.ts
new file mode 100644
index 000000000..9e6d32a68
--- /dev/null
+++ b/apps/vpnmanager/src/components/NextImageButton/index.ts
@@ -0,0 +1,3 @@
+import NextImageButton from "./NextImageButton";
+
+export default NextImageButton;
diff --git a/apps/vpnmanager/src/components/Page/Page.tsx b/apps/vpnmanager/src/components/Page/Page.tsx
new file mode 100644
index 000000000..578741907
--- /dev/null
+++ b/apps/vpnmanager/src/components/Page/Page.tsx
@@ -0,0 +1,39 @@
+import React from "react";
+
+import NavBar from "@/vpnmanager/components/NavBar";
+
+interface SocialLinks {
+ platform: string;
+ url: string;
+}
+
+interface Menu {
+ label: string;
+ href: string;
+}
+
+interface Menu {
+ label: string;
+ href: string;
+}
+
+interface Navbar {
+ logo: any;
+ menus: Menu[];
+ socialLinks: SocialLinks[];
+}
+
+interface Props {
+ children?: React.ReactNode;
+ navbar?: Navbar;
+}
+function Page({ children, navbar }: Props) {
+ return (
+ <>
+ {navbar ? : null}
+ {children ? {children} : null}
+ >
+ );
+}
+
+export default Page;
diff --git a/apps/vpnmanager/src/components/Page/index.ts b/apps/vpnmanager/src/components/Page/index.ts
new file mode 100644
index 000000000..39d0be934
--- /dev/null
+++ b/apps/vpnmanager/src/components/Page/index.ts
@@ -0,0 +1,3 @@
+import Page from "./Page";
+
+export default Page;
diff --git a/apps/vpnmanager/src/lib/data/spreadsheet.ts b/apps/vpnmanager/src/lib/data/spreadsheet.ts
new file mode 100644
index 000000000..1c02307bb
--- /dev/null
+++ b/apps/vpnmanager/src/lib/data/spreadsheet.ts
@@ -0,0 +1,59 @@
+import { google } from "googleapis";
+
+import { SheetRow } from "@/vpnmanager/types";
+import { toCamelCase } from "@/vpnmanager/utils";
+
+function gSheet() {
+ const auth = new google.auth.GoogleAuth({
+ keyFile: process.env.NEXT_APP_GOOGLE_CREDENTIALS,
+ scopes: ["https://www.googleapis.com/auth/spreadsheets.readonly"],
+ });
+ return google.sheets({ version: "v4", auth });
+}
+
+async function list(
+ spreadsheetId?: string,
+ range?: string,
+): Promise {
+ if (!spreadsheetId || !range) {
+ return [];
+ }
+ const sheets = gSheet();
+ const response = await sheets.spreadsheets.values.get({
+ spreadsheetId,
+ range,
+ });
+
+ const rows = response.data.values;
+ if (!rows || !rows?.length) {
+ return [];
+ }
+ const titles = rows[0];
+
+ const data = rows.slice(1).map((row: any) => {
+ return titles.reduce((acc, curr, index) => {
+ const key = toCamelCase(curr);
+ const value = row[index];
+ return {
+ ...acc,
+ [key]: value,
+ };
+ }, {});
+ });
+
+ return data;
+}
+
+async function newHires() {
+ const spreadsheetId = process.env.NEXT_APP_GOOGLE_SHEET_ID;
+ const range = process.env.NEXT_APP_GOOGLE_SHEET_RANGE;
+ const data = await list(spreadsheetId, range);
+ return data.filter(
+ (row: SheetRow) => row.emailAddress && row.keySent !== "Yes",
+ );
+}
+
+export default {
+ list,
+ newHires,
+};
diff --git a/apps/vpnmanager/src/lib/processNewHires.ts b/apps/vpnmanager/src/lib/processNewHires.ts
new file mode 100644
index 000000000..4db039a2c
--- /dev/null
+++ b/apps/vpnmanager/src/lib/processNewHires.ts
@@ -0,0 +1,17 @@
+import { SheetRow } from "@/vpnmanager/types";
+import * as Sentry from "@sentry/nextjs";
+
+import spreadsheet from "./data/spreadsheet";
+
+export async function processEmployee(item: SheetRow) {
+ // Capture to test that it works
+ Sentry.captureException(item);
+}
+
+export async function processNewHires() {
+ const newHires = await spreadsheet.newHires();
+ const promises = newHires.map((item) => processEmployee(item));
+ Promise.allSettled(promises);
+}
+
+processNewHires();
diff --git a/apps/vpnmanager/src/pages/_app.tsx b/apps/vpnmanager/src/pages/_app.tsx
new file mode 100644
index 000000000..4f06c88d3
--- /dev/null
+++ b/apps/vpnmanager/src/pages/_app.tsx
@@ -0,0 +1,37 @@
+import React, { ReactNode } from "react";
+
+import { AppProps } from "next/app";
+import Head from "next/head";
+
+import Page from "@/vpnmanager/components/Page";
+import theme from "@/vpnmanager/theme";
+import createEmotionCache from "@/vpnmanager/utils/createEmotionCache";
+import { CacheProvider } from "@emotion/react";
+import { CssBaseline, ThemeProvider } from "@mui/material";
+
+const clientSideEmotionCache = createEmotionCache();
+
+function getDefaultLayout(page: ReactNode, pageProps: any) {
+ return {page};
+}
+
+function MyApp(props: AppProps | any) {
+ const { Component, emotionCache = clientSideEmotionCache, pageProps } = props;
+ const getLayout = Component.getLayout || getDefaultLayout;
+
+ return (
+ <>
+
+
+
+
+
+
+ {getLayout(, pageProps)}
+
+
+ >
+ );
+}
+
+export default MyApp;
diff --git a/apps/vpnmanager/src/pages/_document.tsx b/apps/vpnmanager/src/pages/_document.tsx
new file mode 100644
index 000000000..d996f2c88
--- /dev/null
+++ b/apps/vpnmanager/src/pages/_document.tsx
@@ -0,0 +1,105 @@
+import React from "react";
+
+import Document, { Head, Html, Main, NextScript } from "next/document";
+
+import createEmotionCache from "@/vpnmanager/utils/createEmotionCache";
+import createEmotionServer from "@emotion/server/create-instance";
+
+class MyDocument extends Document {
+ render() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ {this.props.emotionStyleTags}
+
+
+
+
+
+
+ );
+ }
+}
+
+// `getInitialProps` belongs to `_document` (instead of `_app`),
+// it's compatible with static-site generation (SSG).
+MyDocument.getInitialProps = async (ctx) => {
+ // Resolution order
+ //
+ // On the server:
+ // 1. app.getInitialProps
+ // 2. page.getInitialProps
+ // 3. document.getInitialProps
+ // 4. app.render
+ // 5. page.render
+ // 6. document.render
+ //
+ // On the server with error:
+ // 1. document.getInitialProps
+ // 2. app.render
+ // 3. page.render
+ // 4. document.render
+ //
+ // On the client
+ // 1. app.getInitialProps
+ // 2. page.getInitialProps
+ // 3. app.render
+ // 4. page.render
+
+ const originalRenderPage = ctx.renderPage;
+
+ // You can consider sharing the same Emotion cache between all the SSR requests to speed up performance.
+ // However, be aware that it can have global side effects.
+ const cache = createEmotionCache();
+ const { extractCriticalToChunks } = createEmotionServer(cache);
+
+ ctx.renderPage = () =>
+ originalRenderPage({
+ enhanceApp: (App: any) =>
+ function EnhanceApp(props) {
+ return ;
+ },
+ });
+
+ const initialProps = await Document.getInitialProps(ctx);
+ // This is important. It prevents Emotion to render invalid HTML.
+ // See https://github.com/mui/material-ui/issues/26561#issuecomment-855286153
+ const emotionStyles = extractCriticalToChunks(initialProps.html);
+ const emotionStyleTags = emotionStyles.styles.map((style: any) => (
+
+ ));
+
+ return {
+ ...initialProps,
+ emotionStyleTags,
+ };
+};
+
+export default MyDocument;
diff --git a/apps/vpnmanager/src/pages/index.tsx b/apps/vpnmanager/src/pages/index.tsx
new file mode 100644
index 000000000..9555f3bb2
--- /dev/null
+++ b/apps/vpnmanager/src/pages/index.tsx
@@ -0,0 +1,36 @@
+export default function Home() {
+ return null;
+}
+
+export async function getStaticProps() {
+ return {
+ props: {
+ navbar: {
+ logo: {
+ alt: "CfA logo",
+ prefix: "media",
+ filename: "cfa-logo.svg",
+ mimeType: "image/svg+xml",
+ filesize: 6029,
+ width: 136,
+ height: 61,
+ url: "https://cfa.dev.codeforafrica.org/media/cfa-logo.svg",
+ src: "https://cfa.dev.codeforafrica.org/media/cfa-logo.svg",
+ },
+ menus: [
+ {
+ label: "Our Work",
+ href: "/",
+ },
+ ],
+ socialLinks: [
+ {
+ platform: "Github",
+ url: "https://github.com/CodeForAfrica",
+ id: "651e89dec938b817cab85676",
+ },
+ ],
+ },
+ },
+ };
+}
diff --git a/apps/vpnmanager/src/theme/index.ts b/apps/vpnmanager/src/theme/index.ts
new file mode 100644
index 000000000..440ffaf56
--- /dev/null
+++ b/apps/vpnmanager/src/theme/index.ts
@@ -0,0 +1,563 @@
+import { Merriweather, Open_Sans } from "next/font/google";
+
+import { createTheme, ThemeOptions } from "@mui/material";
+import { deepmerge } from "@mui/utils";
+
+const openSans = Open_Sans({
+ weight: ["300", "400", "600", "700"],
+ subsets: ["latin"],
+});
+
+const merriWeather = Merriweather({
+ weight: ["300", "400", "700"],
+ subsets: ["latin"],
+});
+const FONT_FAMILY_PRIMARY = openSans.style.fontFamily;
+const FONT_FAMILY_SECONDARY = merriWeather.style.fontFamily;
+
+const palette = {
+ mode: "light",
+ primary: { main: "#1020E1", light: "#EFF0FD", dark: "#08125C" }, // blues
+ secondary: { main: "#000000", light: "#7F7272" },
+ error: { main: "#EF4444" },
+ grey: { main: "#B4ABAB", light: "#E3DFDF" },
+ text: { primary: "#000000", secondary: "#FFFFFF" },
+ divider: "#DAD5D5",
+ background: { main: "#F6F5F5" },
+ action: { hoverOpacity: 0, focusOpacity: 0 },
+ highlight: { main: "#ED1C24" },
+};
+
+const breakpoints = {
+ values: {
+ xs: 0,
+ sm: 768,
+ md: 1152,
+ lg: 1440,
+ xl: 1920,
+ },
+};
+
+const theme = createTheme({
+ palette,
+ breakpoints,
+ contentWidths: {
+ values: {
+ sm: 728,
+ md: 1024,
+ lg: 1144,
+ xl: 1144,
+ },
+ unit: "px",
+ },
+ typography: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ display1: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 300,
+ lineHeight: 72 / 72,
+ },
+ display2: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 700,
+ lineHeight: 72 / 60,
+ letterSpacing: "-0.04em",
+ },
+ h1: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 700,
+ letterSpacing: "-0.04em",
+ },
+ h2: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 700,
+ letterSpacing: "-0.04em",
+ },
+ h3: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 700,
+ letterSpacing: "-0.02em",
+ },
+ h4: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 700,
+ letterSpacing: "-0.02em",
+ },
+ h5: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 700,
+ letterSpacing: "-0.02em",
+ },
+ h6: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 700,
+ letterSpacing: "-0.02em",
+ },
+ subheading: {
+ fontFamily: FONT_FAMILY_SECONDARY,
+ fontStyle: "normal",
+ fontWeight: 300,
+ },
+ subtitle1: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 400,
+ },
+ subtitle2: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 400,
+ },
+ body1: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 400,
+ },
+ body2: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 400,
+ },
+ body3: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 400,
+ },
+ button: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 600,
+ },
+ caption: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 400,
+ lineHeight: 14 / 12,
+ },
+ footer: {
+ fontFamily: FONT_FAMILY_PRIMARY,
+ fontStyle: "normal",
+ fontWeight: 400,
+ lineHeight: 14 / 12,
+ letterSpacing: "0.02rem",
+ },
+ } as any,
+ components: {
+ MuiButtonBase: {
+ defaultProps: {
+ disableRipple: true,
+ },
+ styleOverrides: {
+ root: {
+ borderRadius: 0,
+ },
+ },
+ },
+ MuiButton: {
+ styleOverrides: {
+ root: {
+ borderRadius: 0,
+ boxShadow: "none",
+ "&:hover": {
+ boxShadow: "none",
+ },
+ },
+ containedPrimary: {
+ border: `1px solid ${palette.primary.main}`,
+ "&:hover": {
+ backgroundColor: palette.text.secondary,
+ color: palette.primary.main,
+ },
+ },
+ sizeSmall: {
+ padding: "8px 16px",
+ },
+ sizeMedium: {
+ padding: "12px 18px",
+ },
+ sizeLarge: {
+ padding: 24,
+ },
+ },
+ variants: [
+ {
+ props: { variant: "contained-reverse", color: "primary" },
+ style: {
+ backgroundColor: palette.text.secondary,
+ border: `1px solid ${palette.primary.main}`,
+ color: palette.primary.main,
+ "&:hover": {
+ backgroundColor: palette.primary.main,
+ border: `1px solid ${palette.text.secondary}`,
+ color: palette.text.secondary,
+ },
+ },
+ },
+ ],
+ },
+ MuiChip: {
+ styleOverrides: {
+ root: ({ ownerState }: any) => ({
+ borderRadius: 3,
+ padding: 0,
+ "&.MuiChip-clickable": {
+ "&:hover": {
+ backgroundColor: palette.background.main,
+ ...(ownerState.variant === "filled" &&
+ ownerState.color === "primary" && {
+ backgroundColor: "#E0E2FC",
+ }),
+ },
+ },
+ }),
+ filled: ({ ownerState }: any) => ({
+ border: `1px solid ${palette.background.main}`,
+ backgroundColor: palette.background.main,
+ color: palette.secondary.light,
+ ...(ownerState.color === "primary" && {
+ border: `1px solid ${palette.primary.main}`,
+ backgroundColor: "#E0E2FC",
+ color: palette.primary.main,
+ }),
+ }),
+ label: {
+ paddingLeft: 8,
+ paddingRight: 8,
+ },
+ },
+ },
+ },
+} as any) as any;
+
+// deepmerge font-size so that we don't overide other settings such as
+// font-family set above
+const { pxToRem } = theme.typography;
+deepmerge(
+ theme.typography,
+ {
+ display1: {
+ fontSize: pxToRem(72),
+ },
+ display2: {
+ fontSize: pxToRem(60),
+ },
+ h1: {
+ fontSize: pxToRem(34),
+ lineHeight: 40 / 34,
+ [theme.breakpoints.up("md")]: {
+ fontSize: pxToRem(48),
+ lineHeight: 56 / 48,
+ },
+ },
+ h2: {
+ fontSize: pxToRem(33),
+ lineHeight: 40 / 33,
+ [theme.breakpoints.up("md")]: {
+ fontSize: pxToRem(39),
+ lineHeight: 47 / 39,
+ },
+ },
+ h3: {
+ fontSize: pxToRem(28),
+ lineHeight: 34 / 28,
+ [theme.breakpoints.up("md")]: {
+ fontSize: pxToRem(33),
+ lineHeight: 40 / 33,
+ },
+ },
+ h3Light: {
+ ...theme.typography.h3,
+ fontSize: pxToRem(28),
+ fontWeight: 300,
+ lineHeight: 34 / 28,
+ [theme.breakpoints.up("md")]: {
+ fontSize: pxToRem(28),
+ lineHeight: 34 / 28,
+ },
+ },
+ h4: {
+ fontSize: pxToRem(23),
+ lineHeight: 28 / 23,
+ [theme.breakpoints.up("md")]: {
+ fontSize: pxToRem(28),
+ lineHeight: 34 / 28,
+ },
+ },
+ h5: {
+ fontSize: pxToRem(23),
+ lineHeight: 28 / 23,
+ },
+ h5ExtraBold: {
+ ...theme.typography.h5,
+ fontSize: pxToRem(23),
+ fontWeight: 700,
+ lineHeight: 28 / 23,
+ textTransform: "uppercase",
+ },
+ h5Small: {
+ ...theme.typography.h5,
+ fontSize: pxToRem(19),
+ lineHeight: 23 / 19,
+ },
+ h5SemiBold: {
+ ...theme.typography.h5,
+ fontSize: pxToRem(23),
+ fontWeight: 300,
+ lineHeight: 28 / 23,
+ },
+ h6: {
+ fontSize: pxToRem(16),
+ lineHeight: 19 / 16,
+ [theme.breakpoints.up("md")]: {
+ fontSize: pxToRem(19),
+ lineHeight: 23 / 19,
+ },
+ },
+ subheading: {
+ fontSize: pxToRem(18),
+ lineHeight: 28 / 18,
+ [theme.breakpoints.up("md")]: {
+ fontSize: pxToRem(20),
+ lineHeight: 30 / 20,
+ },
+ },
+ subheadingSemiBold: {
+ ...theme.typography.subheading,
+ fontSize: pxToRem(20),
+ fontWeight: 600,
+ lineHeight: 28 / 20,
+ },
+ subheadingUnderline: {
+ ...theme.typography.subheading,
+ fontSize: pxToRem(20),
+ lineHeight: 28 / 20,
+ textDecoration: "underline",
+ },
+ subtitle1: {
+ fontSize: pxToRem(16),
+ lineHeight: 26 / 16,
+ [theme.breakpoints.up("md")]: {
+ fontSize: pxToRem(18),
+ lineHeight: 28 / 18,
+ },
+ },
+ subtitle2: {
+ fontSize: pxToRem(14),
+ lineHeight: 23 / 14,
+ [theme.breakpoints.up("md")]: {
+ fontSize: pxToRem(16),
+ lineHeight: 26 / 16,
+ },
+ },
+ body1: {
+ fontSize: pxToRem(14),
+ lineHeight: 23 / 14,
+ marginTop: pxToRem(28),
+ "&:first-of-type": {
+ marginTop: 0,
+ },
+ },
+ body1SemiBold: {
+ ...theme.typography.body1,
+ fontSize: pxToRem(14),
+ fontWeight: 600,
+ lineHeight: 17 / 14,
+ },
+ body1Underline: {
+ ...theme.typography.body1,
+ fontSize: pxToRem(14),
+ lineHeight: 17 / 14,
+ },
+ body2: {
+ fontSize: pxToRem(16),
+ lineHeight: 26 / 16,
+ marginTop: pxToRem(28),
+ "&:first-of-type": {
+ marginTop: 0,
+ },
+ },
+ body2SemiBold: {
+ ...theme.typography.body2,
+ fontSize: pxToRem(16),
+ fontWeight: 600,
+ lineHeight: 19 / 16,
+ },
+ body2Underline: {
+ ...theme.typography.body2,
+ fontSize: pxToRem(16),
+ lineHeight: 19 / 16,
+ textDecoration: "underline",
+ },
+ body3: {
+ fontSize: pxToRem(18),
+ lineHeight: 28 / 18,
+ },
+ body3SemiBold: {
+ ...theme.typography.body3,
+ fontSize: pxToRem(18),
+ fontWeight: 600,
+ lineHeight: 24 / 18,
+ },
+ body3Underline: {
+ ...theme.typography.body3,
+ fontSize: pxToRem(18),
+ lineHeight: 24 / 18,
+ textDecoration: "underline",
+ },
+ button: {
+ fontSize: pxToRem(16),
+ lineHeight: 19 / 16,
+ // 10% of 16px = 1.6px
+ letterSpacing: pxToRem(0.16),
+ },
+ caption: {
+ fontSize: pxToRem(12),
+ },
+ captionCap: {
+ ...theme.typography.caption,
+ fontSize: pxToRem(12),
+ fontWeight: 600,
+ textTransform: "uppercase",
+ },
+ footer: {
+ fontSize: pxToRem(12),
+ },
+ footerSemiBold: {
+ ...theme.typography.footer,
+ fontWeight: 600,
+ fontSize: pxToRem(10),
+ lineHeight: 12 / 10,
+ },
+ footerCap: {
+ ...theme.typography.footer,
+ fontWeight: 700,
+ fontSize: pxToRem(10),
+ lineHeight: 14 / 10,
+ letterSpacing: "0.08rem",
+ textTransform: "uppercase",
+ },
+ } as any,
+ { clone: false },
+);
+
+deepmerge(
+ theme.components,
+ {
+ MuiCssBaseline: {
+ styleOverrides: `
+ blockquote {
+ background-color: ${palette.background.main};
+ font-size: ${pxToRem(16)};
+ line-height: ${26 / 16};
+ margin: 20px 0;
+ padding: 20px;
+ }
+ h4 {
+ font-size: ${pxToRem(23)};
+ line-height: ${28 / 23};
+ margin: 40px 0;
+ },
+ figure {
+ margin: 20px 0;
+ }
+ figcaption {
+ color: ${palette.primary.main};
+ margin-top: 20px;
+ text-align: center;
+ font-size: ${pxToRem(12)};
+ },
+ img {
+ height: auto;
+ object-fit: contain;
+ width: 100%;
+ }
+ hr {
+ border-bottom-width: thin;
+ border-color: ${palette.divider};
+ border-style: solid;
+ border-top: 0;
+ margin: 30px 0;
+ }
+ p, li {
+ font-size: ${pxToRem(16)};
+ line-height: ${26 / 16};
+ }
+ p {
+ margin: 30px 0;
+ }
+ p:first-of-type {
+ margin-top: 0;
+ }
+ p:last-of-type {
+ margin-bottom: 0;
+ }
+ @media (min-width: 1152px) {
+ blockquote {
+ padding: 50px 55.5px;
+ margin: 40px 0;
+ }
+ figure {
+ margin: 40px 0;
+ }
+ p, li {
+ font-size: ${pxToRem(18)};
+ line-height: ${28 / 18};
+ }
+ }
+ `,
+ },
+ MuiButton: {
+ styleOverrides: {
+ sizeSmall: {
+ ...theme.typography.button,
+ },
+ sizeLarge: {
+ ...theme.typography.button,
+ },
+ },
+ },
+ MuiInputLabel: {
+ styleOverrides: {
+ root: {
+ ...theme.typography.body2,
+ },
+ sizeSmall: {
+ ...theme.typography.body1,
+ },
+ },
+ },
+ MuiOutlinedInput: {
+ styleOverrides: {
+ input: {
+ ...theme.typography.body2,
+ height: 26,
+ padding: "12px 12px",
+ "&::placeholder": {
+ color: "#D0CBCB",
+ opacity: 1.0,
+ WebkitTextFillColor: "#D0CBCB",
+ },
+ },
+ inputSizeSmall: {
+ ...theme.typography.body1,
+ height: 23,
+ padding: "6.5px 12px",
+ },
+ sizeSmall: {
+ paddingRight: 10,
+ },
+ },
+ },
+ } as ThemeOptions,
+ { clone: false },
+);
+
+export default theme;
diff --git a/apps/vpnmanager/src/types.d.ts b/apps/vpnmanager/src/types.d.ts
new file mode 100644
index 000000000..15ec3fb97
--- /dev/null
+++ b/apps/vpnmanager/src/types.d.ts
@@ -0,0 +1,41 @@
+export interface OutlineOptions {
+ apiUrl: string;
+ fingerprint?: string;
+}
+
+export interface OutlineUser {
+ id: string;
+ name: string;
+ password: string;
+ port: number;
+ method: string;
+ accessUrl: string;
+}
+
+export interface OutlineServer {
+ name: string;
+ serverId: string;
+ metricsEnabled: boolean;
+ createdTimestampMs: number;
+ version: string;
+ portForNewAcccessKeys: number;
+ hostnameForNewAccessKeys: string;
+}
+
+export interface OutlineDataUsageByUser {
+ bytesTransferredByUserId: { [userId: string]: number };
+}
+
+export interface OutlineServerMetrics {
+ metricsEnabled: boolean;
+}
+
+export interface SheetRow {
+ emailAddressCreated: string;
+ emailAddress: string;
+ name: string;
+ outlineKeyCreated: string;
+ startDate: string;
+ endDate: string;
+ keySent: "Yes" | "No";
+}
diff --git a/apps/vpnmanager/src/utils/createEmotionCache.ts b/apps/vpnmanager/src/utils/createEmotionCache.ts
new file mode 100644
index 000000000..44efbcf7a
--- /dev/null
+++ b/apps/vpnmanager/src/utils/createEmotionCache.ts
@@ -0,0 +1,20 @@
+/* eslint-env browser */
+import createCache from "@emotion/cache";
+
+const isBrowser = typeof document !== "undefined";
+
+// On the client side, Create a meta tag at the top of the and set it as insertionPoint.
+// This assures that MUI styles are loaded first.
+// It allows developers to easily override MUI styles with other styling solutions, like CSS modules.
+export default function createEmotionCache() {
+ let insertionPoint;
+
+ if (isBrowser) {
+ const emotionInsertionPoint = document.querySelector(
+ 'meta[name="emotion-insertion-point"]',
+ );
+ insertionPoint = emotionInsertionPoint ?? undefined;
+ }
+
+ return createCache({ key: "mui-style", insertionPoint } as any);
+}
diff --git a/apps/vpnmanager/src/utils/index.ts b/apps/vpnmanager/src/utils/index.ts
new file mode 100644
index 000000000..513aefc31
--- /dev/null
+++ b/apps/vpnmanager/src/utils/index.ts
@@ -0,0 +1,4 @@
+import fetchJson from "./fetchJson";
+import toCamelCase from "./wordToCamelCase";
+
+export { fetchJson, toCamelCase };
diff --git a/apps/vpnmanager/src/utils/wordToCamelCase.ts b/apps/vpnmanager/src/utils/wordToCamelCase.ts
new file mode 100644
index 000000000..6d430a405
--- /dev/null
+++ b/apps/vpnmanager/src/utils/wordToCamelCase.ts
@@ -0,0 +1,12 @@
+export default function toCamelCase(str: string) {
+ return str
+ .split(" ")
+ .map((word: string, index: number) => {
+ if (index === 0) {
+ return word.toLowerCase();
+ } else {
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
+ }
+ })
+ .join("");
+}
diff --git a/apps/vpnmanager/tsconfig.json b/apps/vpnmanager/tsconfig.json
new file mode 100644
index 000000000..fcd18efee
--- /dev/null
+++ b/apps/vpnmanager/tsconfig.json
@@ -0,0 +1,28 @@
+{
+ "compilerOptions": {
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "paths": {
+ "@/vpnmanager/*": ["./src/*"],
+ "@/commons-ui/core/*": ["../../packages/commons-ui-core/src/*"],
+ "@/commons-ui/next/*": ["../../packages/commons-ui-next/src/*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules"]
+}
diff --git a/apps/vpnmanager/tsconfig.server.json b/apps/vpnmanager/tsconfig.server.json
new file mode 100644
index 000000000..4c04df5be
--- /dev/null
+++ b/apps/vpnmanager/tsconfig.server.json
@@ -0,0 +1,12 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "target": "ES2015",
+ "noEmit": false,
+ "module": "CommonJS",
+ "jsx": "react",
+ "outDir": "./dist",
+ "rootDir": "./"
+ },
+ "include": ["src/lib/**/*.ts", "src/utils/**/*.ts"]
+}
diff --git a/apps/vpnmanager/types.d.ts b/apps/vpnmanager/types.d.ts
new file mode 100644
index 000000000..5003d75a1
--- /dev/null
+++ b/apps/vpnmanager/types.d.ts
@@ -0,0 +1,4 @@
+declare module "@/vpnmanager";
+declare module "@commons-ui/core";
+declare module "@commons-ui/next";
+declare module "@commons-ui/testing-library";
diff --git a/docker-compose.yml b/docker-compose.yml
index 29a280c6b..add6a16e9 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -50,6 +50,17 @@ services:
retries: 30
command:
["--replSet", "rs0", "--bind_ip_all", "--keyFile", "/etc/mongo-keyfile"]
-
+ vpnmanager:
+ build:
+ context: .
+ dockerfile: Dockerfile.vpnmanager
+ args:
+ SENTRY_ORG: ${SENTRY_ORG}
+ SENTRY_PROJECT: ${SENTRY_PROJECT}
+ SENTRY_DSN: ${SENTRY_DSN}
+ environment:
+ - NODE_ENV=production
+ ports:
+ - ${VPN_MANAGER_PORT:-3000}:3000
volumes:
db_data:
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index be395a06b..13b915136 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,9 +1,5 @@
lockfileVersion: "6.0"
-settings:
- autoInstallPeers: true
- excludeLinksFromLockfile: false
-
overrides:
sharp: ^0.33.0
@@ -941,7 +937,98 @@ importers:
version: 5.3.3
webpack:
specifier: ^5.89.0
- version: 5.89.0
+ version: 5.89.0(@swc/core@1.3.78)(webpack-cli@4.10.0)
+
+ apps/vpnmanager:
+ dependencies:
+ "@babel/core":
+ specifier: ^7.23.6
+ version: 7.23.6
+ "@babel/preset-react":
+ specifier: ^7.23.3
+ version: 7.23.3(@babel/core@7.23.6)
+ "@commons-ui/core":
+ specifier: workspace:*
+ version: link:../../packages/commons-ui-core
+ "@commons-ui/next":
+ specifier: workspace:*
+ version: link:../../packages/commons-ui-next
+ "@emotion/cache":
+ specifier: ^11.11.0
+ version: 11.11.0
+ "@emotion/react":
+ specifier: ^11.11.1
+ version: 11.11.1(@types/react@18.2.45)(react@18.2.0)
+ "@emotion/server":
+ specifier: ^11.11.0
+ version: 11.11.0
+ "@emotion/styled":
+ specifier: ^11.11.0
+ version: 11.11.0(@emotion/react@11.11.1)(@types/react@18.2.45)(react@18.2.0)
+ "@mui/material":
+ specifier: ^5.14.20
+ version: 5.15.0(@emotion/react@11.11.1)(@emotion/styled@11.11.0)(@types/react@18.2.45)(react-dom@18.2.0)(react@18.2.0)
+ "@mui/utils":
+ specifier: ^5.14.20
+ version: 5.15.0(@types/react@18.2.45)(react@18.2.0)
+ "@sentry/nextjs":
+ specifier: ^7.105.0
+ version: 7.106.1(next@14.1.3)(react@18.2.0)(webpack@5.89.0)
+ "@svgr/webpack":
+ specifier: ^8.1.0
+ version: 8.1.0(typescript@5.0.2)
+ "@types/jest":
+ specifier: ^29.5.12
+ version: 29.5.12
+ googleapis:
+ specifier: ^133.0.0
+ version: 133.0.0
+ jest:
+ specifier: ^29.7.0
+ version: 29.7.0(@types/node@18.19.3)(ts-node@10.9.2)
+ next:
+ specifier: 14.1.3
+ version: 14.1.3(@babel/core@7.23.6)(react-dom@18.2.0)(react@18.2.0)
+ react:
+ specifier: ^18.2.0
+ version: 18.2.0
+ react-dom:
+ specifier: ^18.2.0
+ version: 18.2.0(react@18.2.0)
+ tsc-alias:
+ specifier: ^1.8.8
+ version: 1.8.8
+ tsconfig-paths:
+ specifier: ^4.2.0
+ version: 4.2.0
+ devDependencies:
+ "@commons-ui/testing-library":
+ specifier: workspace:*
+ version: link:../../packages/commons-ui-testing-library
+ "@types/node":
+ specifier: ^20
+ version: 20.0.0
+ "@types/react":
+ specifier: ^18
+ version: 18.2.45
+ "@types/react-dom":
+ specifier: ^18
+ version: 18.2.17
+ eslint:
+ specifier: ^8.55.0
+ version: 8.55.0
+ eslint-config-commons-ui:
+ specifier: workspace:*
+ version: link:../../packages/eslint-config-commons-ui
+ eslint-import-resolver-webpack:
+ specifier: ^0.13.8
+ version: 0.13.8(eslint-plugin-import@2.29.0)(webpack@5.89.0)
+ eslint-plugin-import:
+ specifier: ^2.29.0
+ version: 2.29.0(eslint-import-resolver-webpack@0.13.8)(eslint@8.55.0)
+ typescript:
+ specifier: ^5
+ version: 5.0.2
packages/commons-ui-core:
dependencies:
@@ -1011,7 +1098,7 @@ importers:
version: 5.3.3
webpack:
specifier: ^5.89.0
- version: 5.89.0
+ version: 5.89.0(@swc/core@1.3.78)(webpack-cli@4.10.0)
packages/commons-ui-next:
dependencies:
@@ -1069,7 +1156,7 @@ importers:
version: 5.3.3
webpack:
specifier: ^5.89.0
- version: 5.89.0
+ version: 5.89.0(@swc/core@1.3.78)(webpack-cli@4.10.0)
packages/commons-ui-testing-library:
dependencies:
@@ -1136,7 +1223,7 @@ importers:
version: 5.3.3
webpack:
specifier: ^5.89.0
- version: 5.89.0
+ version: 5.89.0(@swc/core@1.3.78)(webpack-cli@4.10.0)
packages/eslint-config-commons-ui:
dependencies:
@@ -2301,7 +2388,6 @@ packages:
engines: { node: ">=6.9.0" }
dependencies:
"@babel/types": 7.23.6
- dev: true
/@babel/helper-compilation-targets@7.23.6:
resolution:
@@ -2335,7 +2421,6 @@ packages:
"@babel/helper-skip-transparent-expression-wrappers": 7.22.5
"@babel/helper-split-export-declaration": 7.22.6
semver: 6.3.1
- dev: true
/@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.6):
resolution:
@@ -2350,7 +2435,6 @@ packages:
"@babel/helper-annotate-as-pure": 7.22.5
regexpu-core: 5.3.2
semver: 6.3.1
- dev: true
/@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.6):
resolution:
@@ -2368,7 +2452,6 @@ packages:
resolve: 1.22.8
transitivePeerDependencies:
- supports-color
- dev: true
/@babel/helper-environment-visitor@7.22.20:
resolution:
@@ -2404,7 +2487,6 @@ packages:
engines: { node: ">=6.9.0" }
dependencies:
"@babel/types": 7.23.6
- dev: true
/@babel/helper-module-imports@7.22.15:
resolution:
@@ -2439,7 +2521,6 @@ packages:
engines: { node: ">=6.9.0" }
dependencies:
"@babel/types": 7.23.6
- dev: true
/@babel/helper-plugin-utils@7.22.5:
resolution:
@@ -2461,7 +2542,6 @@ packages:
"@babel/helper-annotate-as-pure": 7.22.5
"@babel/helper-environment-visitor": 7.22.20
"@babel/helper-wrap-function": 7.22.20
- dev: true
/@babel/helper-replace-supers@7.22.20(@babel/core@7.23.6):
resolution:
@@ -2476,7 +2556,6 @@ packages:
"@babel/helper-environment-visitor": 7.22.20
"@babel/helper-member-expression-to-functions": 7.23.0
"@babel/helper-optimise-call-expression": 7.22.5
- dev: true
/@babel/helper-simple-access@7.22.5:
resolution:
@@ -2495,7 +2574,6 @@ packages:
engines: { node: ">=6.9.0" }
dependencies:
"@babel/types": 7.23.6
- dev: true
/@babel/helper-split-export-declaration@7.22.6:
resolution:
@@ -2537,7 +2615,6 @@ packages:
"@babel/helper-function-name": 7.23.0
"@babel/template": 7.22.15
"@babel/types": 7.23.6
- dev: true
/@babel/helpers@7.23.6:
resolution:
@@ -2584,7 +2661,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.6):
resolution:
@@ -2599,7 +2675,6 @@ packages:
"@babel/helper-plugin-utils": 7.22.5
"@babel/helper-skip-transparent-expression-wrappers": 7.22.5
"@babel/plugin-transform-optional-chaining": 7.23.4(@babel/core@7.23.6)
- dev: true
/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3(@babel/core@7.23.6):
resolution:
@@ -2613,7 +2688,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-environment-visitor": 7.22.20
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6):
resolution:
@@ -2625,7 +2699,6 @@ packages:
"@babel/core": ^7.0.0-0
dependencies:
"@babel/core": 7.23.6
- dev: true
/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.6):
resolution:
@@ -2671,7 +2744,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.6):
resolution:
@@ -2683,7 +2755,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.6):
resolution:
@@ -2695,7 +2766,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.6):
resolution:
@@ -2721,7 +2791,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.6):
resolution:
@@ -2734,7 +2803,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.6):
resolution:
@@ -2847,7 +2915,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.6):
resolution:
@@ -2885,7 +2952,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.6):
resolution:
@@ -2898,7 +2964,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.23.6):
resolution:
@@ -2914,7 +2979,6 @@ packages:
"@babel/helper-plugin-utils": 7.22.5
"@babel/helper-remap-async-to-generator": 7.22.20(@babel/core@7.23.6)
"@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.6):
resolution:
@@ -2929,7 +2993,6 @@ packages:
"@babel/helper-module-imports": 7.22.15
"@babel/helper-plugin-utils": 7.22.5
"@babel/helper-remap-async-to-generator": 7.22.20(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.6):
resolution:
@@ -2942,7 +3005,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.6):
resolution:
@@ -2955,7 +3017,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.6):
resolution:
@@ -2969,7 +3030,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-create-class-features-plugin": 7.23.6(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.6):
resolution:
@@ -2984,7 +3044,6 @@ packages:
"@babel/helper-create-class-features-plugin": 7.23.6(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
"@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.6):
resolution:
@@ -3005,7 +3064,6 @@ packages:
"@babel/helper-replace-supers": 7.22.20(@babel/core@7.23.6)
"@babel/helper-split-export-declaration": 7.22.6
globals: 11.12.0
- dev: true
/@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3019,7 +3077,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
"@babel/template": 7.22.15
- dev: true
/@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3032,7 +3089,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3046,7 +3102,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3059,7 +3114,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.6):
resolution:
@@ -3073,7 +3127,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
"@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3087,7 +3140,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-builder-binary-assignment-operator-visitor": 7.22.15
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.6):
resolution:
@@ -3101,7 +3153,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
"@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3129,7 +3180,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
"@babel/helper-skip-transparent-expression-wrappers": 7.22.5
- dev: true
/@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3144,7 +3194,6 @@ packages:
"@babel/helper-compilation-targets": 7.23.6
"@babel/helper-function-name": 7.23.0
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.6):
resolution:
@@ -3158,7 +3207,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
"@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3171,7 +3219,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.6):
resolution:
@@ -3185,7 +3232,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
"@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3198,7 +3244,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3212,7 +3257,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3227,7 +3271,6 @@ packages:
"@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
"@babel/helper-simple-access": 7.22.5
- dev: true
/@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3243,7 +3286,6 @@ packages:
"@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
"@babel/helper-validator-identifier": 7.22.20
- dev: true
/@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3257,7 +3299,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.6):
resolution:
@@ -3271,7 +3312,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3284,7 +3324,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.6):
resolution:
@@ -3298,7 +3337,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
"@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.6):
resolution:
@@ -3312,7 +3350,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
"@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.6):
resolution:
@@ -3329,7 +3366,6 @@ packages:
"@babel/helper-plugin-utils": 7.22.5
"@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.23.6)
"@babel/plugin-transform-parameters": 7.23.3(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3343,7 +3379,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
"@babel/helper-replace-supers": 7.22.20(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.6):
resolution:
@@ -3357,7 +3392,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
"@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.6):
resolution:
@@ -3372,7 +3406,6 @@ packages:
"@babel/helper-plugin-utils": 7.22.5
"@babel/helper-skip-transparent-expression-wrappers": 7.22.5
"@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3385,7 +3418,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3399,7 +3431,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-create-class-features-plugin": 7.23.6(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.6):
resolution:
@@ -3415,7 +3446,6 @@ packages:
"@babel/helper-create-class-features-plugin": 7.23.6(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
"@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3428,7 +3458,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-react-constant-elements@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3441,7 +3470,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3508,7 +3536,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
regenerator-transform: 0.15.2
- dev: true
/@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3521,7 +3548,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-runtime@7.23.6(@babel/core@7.23.6):
resolution:
@@ -3554,7 +3580,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3568,7 +3593,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
"@babel/helper-skip-transparent-expression-wrappers": 7.22.5
- dev: true
/@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3581,7 +3605,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3594,7 +3617,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3607,7 +3629,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.6):
resolution:
@@ -3623,7 +3644,6 @@ packages:
"@babel/helper-create-class-features-plugin": 7.23.6(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
"@babel/plugin-syntax-typescript": 7.23.3(@babel/core@7.23.6)
- dev: true
/@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3636,7 +3656,6 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3650,7 +3669,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3664,7 +3682,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3678,7 +3695,6 @@ packages:
"@babel/core": 7.23.6
"@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6)
"@babel/helper-plugin-utils": 7.22.5
- dev: true
/@babel/preset-env@7.23.6(@babel/core@7.23.6):
resolution:
@@ -3772,7 +3788,6 @@ packages:
semver: 6.3.1
transitivePeerDependencies:
- supports-color
- dev: true
/@babel/preset-flow@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3801,7 +3816,6 @@ packages:
"@babel/helper-plugin-utils": 7.22.5
"@babel/types": 7.23.6
esutils: 2.0.3
- dev: true
/@babel/preset-react@7.23.3(@babel/core@7.23.6):
resolution:
@@ -3835,7 +3849,6 @@ packages:
"@babel/plugin-syntax-jsx": 7.23.3(@babel/core@7.23.6)
"@babel/plugin-transform-modules-commonjs": 7.23.3(@babel/core@7.23.6)
"@babel/plugin-transform-typescript": 7.23.6(@babel/core@7.23.6)
- dev: true
/@babel/register@7.22.15(@babel/core@7.23.6):
resolution:
@@ -3859,7 +3872,6 @@ packages:
{
integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==,
}
- dev: true
/@babel/runtime@7.0.0:
resolution:
@@ -6527,7 +6539,7 @@ packages:
engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 }
dependencies:
"@jest/types": 29.6.3
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
chalk: 4.1.2
jest-message-util: 29.7.0
jest-util: 29.7.0
@@ -6550,14 +6562,14 @@ packages:
"@jest/test-result": 29.7.0
"@jest/transform": 29.7.0
"@jest/types": 29.6.3
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
ansi-escapes: 4.3.2
chalk: 4.1.2
ci-info: 3.9.0
exit: 0.1.2
graceful-fs: 4.2.11
jest-changed-files: 29.7.0
- jest-config: 29.7.0(@types/node@18.19.3)(ts-node@10.9.2)
+ jest-config: 29.7.0(@types/node@20.0.0)(ts-node@10.9.2)
jest-haste-map: 29.7.0
jest-message-util: 29.7.0
jest-regex-util: 29.6.3
@@ -6587,7 +6599,7 @@ packages:
dependencies:
"@jest/fake-timers": 29.7.0
"@jest/types": 29.6.3
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
jest-mock: 29.7.0
/@jest/expect-utils@29.7.0:
@@ -6620,7 +6632,7 @@ packages:
dependencies:
"@jest/types": 29.6.3
"@sinonjs/fake-timers": 10.3.0
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
jest-message-util: 29.7.0
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -6657,7 +6669,7 @@ packages:
"@jest/transform": 29.7.0
"@jest/types": 29.6.3
"@jridgewell/trace-mapping": 0.3.20
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
chalk: 4.1.2
collect-v8-coverage: 1.0.2
exit: 0.1.2
@@ -6756,7 +6768,7 @@ packages:
dependencies:
"@types/istanbul-lib-coverage": 2.0.6
"@types/istanbul-reports": 3.0.4
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
"@types/yargs": 16.0.9
chalk: 4.1.2
dev: true
@@ -6771,7 +6783,7 @@ packages:
"@jest/schemas": 29.6.3
"@types/istanbul-lib-coverage": 2.0.6
"@types/istanbul-reports": 3.0.4
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
"@types/yargs": 17.0.32
chalk: 4.1.2
@@ -7263,6 +7275,13 @@ packages:
integrity: sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==,
}
+ /@next/env@14.1.3:
+ resolution:
+ {
+ integrity: sha512-VhgXTvrgeBRxNPjyfBsDIMvgsKDxjlpw4IAUsHCX8Gjl1vtHUYRT3+xfQ/wwvLPDd/6kqfLqk9Pt4+7gysuCKQ==,
+ }
+ dev: false
+
/@next/eslint-plugin-next@14.0.4:
resolution:
{
@@ -7283,6 +7302,18 @@ packages:
requiresBuild: true
optional: true
+ /@next/swc-darwin-arm64@14.1.3:
+ resolution:
+ {
+ integrity: sha512-LALu0yIBPRiG9ANrD5ncB3pjpO0Gli9ZLhxdOu6ZUNf3x1r3ea1rd9Q+4xxUkGrUXLqKVK9/lDkpYIJaCJ6AHQ==,
+ }
+ engines: { node: ">= 10" }
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
/@next/swc-darwin-x64@14.0.4:
resolution:
{
@@ -7294,6 +7325,18 @@ packages:
requiresBuild: true
optional: true
+ /@next/swc-darwin-x64@14.1.3:
+ resolution:
+ {
+ integrity: sha512-E/9WQeXxkqw2dfcn5UcjApFgUq73jqNKaE5bysDm58hEUdUGedVrnRhblhJM7HbCZNhtVl0j+6TXsK0PuzXTCg==,
+ }
+ engines: { node: ">= 10" }
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
/@next/swc-linux-arm64-gnu@14.0.4:
resolution:
{
@@ -7305,6 +7348,18 @@ packages:
requiresBuild: true
optional: true
+ /@next/swc-linux-arm64-gnu@14.1.3:
+ resolution:
+ {
+ integrity: sha512-USArX9B+3rZSXYLFvgy0NVWQgqh6LHWDmMt38O4lmiJNQcwazeI6xRvSsliDLKt+78KChVacNiwvOMbl6g6BBw==,
+ }
+ engines: { node: ">= 10" }
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
/@next/swc-linux-arm64-musl@14.0.4:
resolution:
{
@@ -7316,6 +7371,18 @@ packages:
requiresBuild: true
optional: true
+ /@next/swc-linux-arm64-musl@14.1.3:
+ resolution:
+ {
+ integrity: sha512-esk1RkRBLSIEp1qaQXv1+s6ZdYzuVCnDAZySpa62iFTMGTisCyNQmqyCTL9P+cLJ4N9FKCI3ojtSfsyPHJDQNw==,
+ }
+ engines: { node: ">= 10" }
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
/@next/swc-linux-x64-gnu@14.0.4:
resolution:
{
@@ -7327,6 +7394,18 @@ packages:
requiresBuild: true
optional: true
+ /@next/swc-linux-x64-gnu@14.1.3:
+ resolution:
+ {
+ integrity: sha512-8uOgRlYEYiKo0L8YGeS+3TudHVDWDjPVDUcST+z+dUzgBbTEwSSIaSgF/vkcC1T/iwl4QX9iuUyUdQEl0Kxalg==,
+ }
+ engines: { node: ">= 10" }
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
/@next/swc-linux-x64-musl@14.0.4:
resolution:
{
@@ -7338,6 +7417,18 @@ packages:
requiresBuild: true
optional: true
+ /@next/swc-linux-x64-musl@14.1.3:
+ resolution:
+ {
+ integrity: sha512-DX2zqz05ziElLoxskgHasaJBREC5Y9TJcbR2LYqu4r7naff25B4iXkfXWfcp69uD75/0URmmoSgT8JclJtrBoQ==,
+ }
+ engines: { node: ">= 10" }
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
/@next/swc-win32-arm64-msvc@14.0.4:
resolution:
{
@@ -7349,6 +7440,18 @@ packages:
requiresBuild: true
optional: true
+ /@next/swc-win32-arm64-msvc@14.1.3:
+ resolution:
+ {
+ integrity: sha512-HjssFsCdsD4GHstXSQxsi2l70F/5FsRTRQp8xNgmQs15SxUfUJRvSI9qKny/jLkY3gLgiCR3+6A7wzzK0DBlfA==,
+ }
+ engines: { node: ">= 10" }
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
/@next/swc-win32-ia32-msvc@14.0.4:
resolution:
{
@@ -7360,6 +7463,18 @@ packages:
requiresBuild: true
optional: true
+ /@next/swc-win32-ia32-msvc@14.1.3:
+ resolution:
+ {
+ integrity: sha512-DRuxD5axfDM1/Ue4VahwSxl1O5rn61hX8/sF0HY8y0iCbpqdxw3rB3QasdHn/LJ6Wb2y5DoWzXcz3L1Cr+Thrw==,
+ }
+ engines: { node: ">= 10" }
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
/@next/swc-win32-x64-msvc@14.0.4:
resolution:
{
@@ -7371,6 +7486,18 @@ packages:
requiresBuild: true
optional: true
+ /@next/swc-win32-x64-msvc@14.1.3:
+ resolution:
+ {
+ integrity: sha512-uC2DaDoWH7h1P/aJ4Fok3Xiw6P0Lo4ez7NbowW2VGNXw/Xv6tOuLUcxhBYZxsSUJtpeknCi8/fvnSpyCFp4Rcg==,
+ }
+ engines: { node: ">= 10" }
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
/@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1:
resolution:
{
@@ -7611,11 +7738,11 @@ packages:
postcss-loader: 6.2.1(postcss@8.4.31)(webpack@5.89.0)
postcss-preset-env: 9.0.0(postcss@8.4.31)
process: 0.11.10
- sass-loader: 12.6.0(webpack@5.89.0)
+ sass-loader: 12.6.0(sass@1.69.5)(webpack@5.89.0)
style-loader: 2.0.0(webpack@5.89.0)
swc-loader: 0.2.3(@swc/core@1.3.100)(webpack@5.89.0)
swc-minify-webpack-plugin: 2.1.1(@swc/core@1.3.100)(webpack@5.89.0)
- terser-webpack-plugin: 5.3.9(@swc/core@1.3.100)(webpack@5.89.0)
+ terser-webpack-plugin: 5.3.9(@swc/core@1.3.100)(esbuild@0.18.20)(webpack@5.89.0)
url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0)
webpack: 5.89.0(@swc/core@1.3.100)(webpack-cli@4.10.0)
webpack-bundle-analyzer: 4.10.1
@@ -8724,6 +8851,18 @@ packages:
"@sendgrid/helpers": 6.5.5
dev: false
+ /@sentry-internal/feedback@7.106.1:
+ resolution:
+ {
+ integrity: sha512-udYR7rQnnQJ0q4PP3R7lTFx7cUz3SB4ghm8T/fJzdItrk+Puv6y8VqI19SFfDgvwgStInEzE5yys6SUQcXLBtA==,
+ }
+ engines: { node: ">=12" }
+ dependencies:
+ "@sentry/core": 7.106.1
+ "@sentry/types": 7.106.1
+ "@sentry/utils": 7.106.1
+ dev: false
+
/@sentry-internal/feedback@7.86.0:
resolution:
{
@@ -8736,6 +8875,31 @@ packages:
"@sentry/utils": 7.86.0
dev: false
+ /@sentry-internal/replay-canvas@7.106.1:
+ resolution:
+ {
+ integrity: sha512-r+nhLrQuTQih93gZ08F6MLdmaoBy/bQFcVt/2ZVqe1SkDY+MxRlXxq8ydo3FfgEjMRHdody3yT1dj6E174h23w==,
+ }
+ engines: { node: ">=12" }
+ dependencies:
+ "@sentry/core": 7.106.1
+ "@sentry/replay": 7.106.1
+ "@sentry/types": 7.106.1
+ "@sentry/utils": 7.106.1
+ dev: false
+
+ /@sentry-internal/tracing@7.106.1:
+ resolution:
+ {
+ integrity: sha512-Ui9zSmW88jTdmNnNBLYYpNoAi31esX5/auysC3v7+SpwxIsC3AGLFvXs4EPziyz8d0F62Ji0fNQZ96ui4fO6BQ==,
+ }
+ engines: { node: ">=8" }
+ dependencies:
+ "@sentry/core": 7.106.1
+ "@sentry/types": 7.106.1
+ "@sentry/utils": 7.106.1
+ dev: false
+
/@sentry-internal/tracing@7.86.0:
resolution:
{
@@ -8748,6 +8912,22 @@ packages:
"@sentry/utils": 7.86.0
dev: false
+ /@sentry/browser@7.106.1:
+ resolution:
+ {
+ integrity: sha512-+Yp7OUx78ZwFFYfIvOKZGjMPW7Ds3zZSO8dsMxvDRzkA9NyyAmYMZ/dNTcsGb+PssgkCasF2XA07f6WgkNW92A==,
+ }
+ engines: { node: ">=8" }
+ dependencies:
+ "@sentry-internal/feedback": 7.106.1
+ "@sentry-internal/replay-canvas": 7.106.1
+ "@sentry-internal/tracing": 7.106.1
+ "@sentry/core": 7.106.1
+ "@sentry/replay": 7.106.1
+ "@sentry/types": 7.106.1
+ "@sentry/utils": 7.106.1
+ dev: false
+
/@sentry/browser@7.86.0:
resolution:
{
@@ -8783,6 +8963,17 @@ packages:
- supports-color
dev: false
+ /@sentry/core@7.106.1:
+ resolution:
+ {
+ integrity: sha512-cwCd66wkbutXCI8j14JLkyod9RHtqSNfzGpx/ieBE+N786jX+Yj1DiaZJ6ZYjKQpnToipFnacEakCd9Vc9oePA==,
+ }
+ engines: { node: ">=8" }
+ dependencies:
+ "@sentry/types": 7.106.1
+ "@sentry/utils": 7.106.1
+ dev: false
+
/@sentry/core@7.86.0:
resolution:
{
@@ -8794,6 +8985,19 @@ packages:
"@sentry/utils": 7.86.0
dev: false
+ /@sentry/integrations@7.106.1:
+ resolution:
+ {
+ integrity: sha512-2wIDaHGWE5QOnTAkQe5itH32K3gcZ5rluAWxcq+hG+xZd7JA6EDGnDEMHieGweFbkYazBteSE8qaxjDUAGYYJA==,
+ }
+ engines: { node: ">=8" }
+ dependencies:
+ "@sentry/core": 7.106.1
+ "@sentry/types": 7.106.1
+ "@sentry/utils": 7.106.1
+ localforage: 1.10.0
+ dev: false
+
/@sentry/integrations@7.86.0:
resolution:
{
@@ -8807,6 +9011,41 @@ packages:
localforage: 1.10.0
dev: false
+ /@sentry/nextjs@7.106.1(next@14.1.3)(react@18.2.0)(webpack@5.89.0):
+ resolution:
+ {
+ integrity: sha512-ozv1S7kUhSy4RXRRefcmo5Eo1bBo0acE5dnPZSHRfOnvvbTXxJDqseyvKmh+e4d81+2LHKOlvenT8y6Bw4flkQ==,
+ }
+ engines: { node: ">=8" }
+ peerDependencies:
+ next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 || ^14.0
+ react: 16.x || 17.x || 18.x
+ webpack: ">= 4.0.0"
+ peerDependenciesMeta:
+ webpack:
+ optional: true
+ dependencies:
+ "@rollup/plugin-commonjs": 24.0.0(rollup@2.78.0)
+ "@sentry/core": 7.106.1
+ "@sentry/integrations": 7.106.1
+ "@sentry/node": 7.106.1
+ "@sentry/react": 7.106.1(react@18.2.0)
+ "@sentry/types": 7.106.1
+ "@sentry/utils": 7.106.1
+ "@sentry/vercel-edge": 7.106.1
+ "@sentry/webpack-plugin": 1.21.0
+ chalk: 3.0.0
+ next: 14.1.3(@babel/core@7.23.6)(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ resolve: 1.22.8
+ rollup: 2.78.0
+ stacktrace-parser: 0.1.10
+ webpack: 5.89.0(@swc/core@1.3.78)(webpack-cli@4.10.0)
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
/@sentry/nextjs@7.86.0(next@14.0.4)(react@18.2.0)(webpack@5.89.0):
resolution:
{
@@ -8842,6 +9081,19 @@ packages:
- supports-color
dev: false
+ /@sentry/node@7.106.1:
+ resolution:
+ {
+ integrity: sha512-KB2Lkb9WqocD/gbKIZCk2mQQmx+G3khI9ChJUw6GJzd5mvdQ5xxr4/yQKIHR6L9z3oGWBno9/Xc8Aw9s3ZwGwQ==,
+ }
+ engines: { node: ">=8" }
+ dependencies:
+ "@sentry-internal/tracing": 7.106.1
+ "@sentry/core": 7.106.1
+ "@sentry/types": 7.106.1
+ "@sentry/utils": 7.106.1
+ dev: false
+
/@sentry/node@7.86.0:
resolution:
{
@@ -8858,6 +9110,23 @@ packages:
- supports-color
dev: false
+ /@sentry/react@7.106.1(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-XcvjXGist0vLapzxZxdbPSdLC4drhGOETtlA/kO+KrIKqlqRKuYw+kieU+YeyF9A/L8uSVvbj9rpjl5WVUTdIw==,
+ }
+ engines: { node: ">=8" }
+ peerDependencies:
+ react: 15.x || 16.x || 17.x || 18.x
+ dependencies:
+ "@sentry/browser": 7.106.1
+ "@sentry/core": 7.106.1
+ "@sentry/types": 7.106.1
+ "@sentry/utils": 7.106.1
+ hoist-non-react-statics: 3.3.2
+ react: 18.2.0
+ dev: false
+
/@sentry/react@7.86.0(react@18.2.0):
resolution:
{
@@ -8874,6 +9143,19 @@ packages:
react: 18.2.0
dev: false
+ /@sentry/replay@7.106.1:
+ resolution:
+ {
+ integrity: sha512-UnuY6bj7v7CVv3T1sbLHjLutSG4hzcQQj6CjEB2NUpM+QAIguFrwAcYG4U42iNg4Qeg5q4kHi1rPpdpvh6unSA==,
+ }
+ engines: { node: ">=12" }
+ dependencies:
+ "@sentry-internal/tracing": 7.106.1
+ "@sentry/core": 7.106.1
+ "@sentry/types": 7.106.1
+ "@sentry/utils": 7.106.1
+ dev: false
+
/@sentry/replay@7.86.0:
resolution:
{
@@ -8887,6 +9169,14 @@ packages:
"@sentry/utils": 7.86.0
dev: false
+ /@sentry/types@7.106.1:
+ resolution:
+ {
+ integrity: sha512-g3OcyAHGugBwkQP4fZYCCZqF2ng9K7yQc9FVngKq/y7PwHm84epXdYYGDGgfQOIC1d5/GMaPxmzI5IIrZexzkg==,
+ }
+ engines: { node: ">=8" }
+ dev: false
+
/@sentry/types@7.86.0:
resolution:
{
@@ -8895,6 +9185,16 @@ packages:
engines: { node: ">=8" }
dev: false
+ /@sentry/utils@7.106.1:
+ resolution:
+ {
+ integrity: sha512-NIeuvB9MeDwrObbi6W5xRrNTcQj8klVvwWWYQB0zotY/LDjyl+c+cZzUshFOxBTp9ljVnYzWqZ7J8x/i4baj7w==,
+ }
+ engines: { node: ">=8" }
+ dependencies:
+ "@sentry/types": 7.106.1
+ dev: false
+
/@sentry/utils@7.86.0:
resolution:
{
@@ -8905,6 +9205,19 @@ packages:
"@sentry/types": 7.86.0
dev: false
+ /@sentry/vercel-edge@7.106.1:
+ resolution:
+ {
+ integrity: sha512-UnVb8mZ0DSwrTEbwOrgePQJqKAqC0hyCyfzp6BNAQZ0NstOvvp8g2/E5Xb1s+RO0ZW1oImTJn3oDKBAi8xhTfQ==,
+ }
+ engines: { node: ">=8" }
+ dependencies:
+ "@sentry-internal/tracing": 7.106.1
+ "@sentry/core": 7.106.1
+ "@sentry/types": 7.106.1
+ "@sentry/utils": 7.106.1
+ dev: false
+
/@sentry/vercel-edge@7.86.0:
resolution:
{
@@ -10319,7 +10632,7 @@ packages:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
resolve-url-loader: 5.0.0
- sass-loader: 12.6.0(webpack@5.89.0)
+ sass-loader: 12.6.0(sass@1.69.5)(webpack@5.89.0)
semver: 7.5.4
sharp: 0.33.2
style-loader: 3.3.3(webpack@5.89.0)
@@ -10604,7 +10917,6 @@ packages:
"@babel/core": ^7.0.0-0
dependencies:
"@babel/core": 7.23.6
- dev: true
/@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.6):
resolution:
@@ -10616,7 +10928,6 @@ packages:
"@babel/core": ^7.0.0-0
dependencies:
"@babel/core": 7.23.6
- dev: true
/@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.6):
resolution:
@@ -10628,7 +10939,6 @@ packages:
"@babel/core": ^7.0.0-0
dependencies:
"@babel/core": 7.23.6
- dev: true
/@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.23.6):
resolution:
@@ -10640,7 +10950,6 @@ packages:
"@babel/core": ^7.0.0-0
dependencies:
"@babel/core": 7.23.6
- dev: true
/@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.23.6):
resolution:
@@ -10652,7 +10961,6 @@ packages:
"@babel/core": ^7.0.0-0
dependencies:
"@babel/core": 7.23.6
- dev: true
/@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.23.6):
resolution:
@@ -10664,7 +10972,6 @@ packages:
"@babel/core": ^7.0.0-0
dependencies:
"@babel/core": 7.23.6
- dev: true
/@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.23.6):
resolution:
@@ -10676,7 +10983,6 @@ packages:
"@babel/core": ^7.0.0-0
dependencies:
"@babel/core": 7.23.6
- dev: true
/@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.23.6):
resolution:
@@ -10688,7 +10994,6 @@ packages:
"@babel/core": ^7.0.0-0
dependencies:
"@babel/core": 7.23.6
- dev: true
/@svgr/babel-preset@8.1.0(@babel/core@7.23.6):
resolution:
@@ -10708,7 +11013,22 @@ packages:
"@svgr/babel-plugin-svg-em-dimensions": 8.0.0(@babel/core@7.23.6)
"@svgr/babel-plugin-transform-react-native-svg": 8.1.0(@babel/core@7.23.6)
"@svgr/babel-plugin-transform-svg-component": 8.0.0(@babel/core@7.23.6)
- dev: true
+
+ /@svgr/core@8.1.0(typescript@5.0.2):
+ resolution:
+ {
+ integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==,
+ }
+ engines: { node: ">=14" }
+ dependencies:
+ "@babel/core": 7.23.6
+ "@svgr/babel-preset": 8.1.0(@babel/core@7.23.6)
+ camelcase: 6.3.0
+ cosmiconfig: 8.3.6(typescript@5.0.2)
+ snake-case: 3.0.4
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
/@svgr/core@8.1.0(typescript@5.3.3):
resolution:
@@ -10736,7 +11056,6 @@ packages:
dependencies:
"@babel/types": 7.23.6
entities: 4.5.0
- dev: true
/@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0):
resolution:
@@ -10749,12 +11068,28 @@ packages:
dependencies:
"@babel/core": 7.23.6
"@svgr/babel-preset": 8.1.0(@babel/core@7.23.6)
- "@svgr/core": 8.1.0(typescript@5.3.3)
+ "@svgr/core": 8.1.0(typescript@5.0.2)
"@svgr/hast-util-to-babel-ast": 8.0.0
svg-parser: 2.0.4
transitivePeerDependencies:
- supports-color
- dev: true
+
+ /@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0)(typescript@5.0.2):
+ resolution:
+ {
+ integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==,
+ }
+ engines: { node: ">=14" }
+ peerDependencies:
+ "@svgr/core": "*"
+ dependencies:
+ "@svgr/core": 8.1.0(typescript@5.0.2)
+ cosmiconfig: 8.3.6(typescript@5.0.2)
+ deepmerge: 4.3.1
+ svgo: 3.1.0
+ transitivePeerDependencies:
+ - typescript
+ dev: false
/@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0)(typescript@5.3.3):
resolution:
@@ -10765,13 +11100,33 @@ packages:
peerDependencies:
"@svgr/core": "*"
dependencies:
- "@svgr/core": 8.1.0(typescript@5.3.3)
- cosmiconfig: 8.3.6(typescript@5.3.3)
- deepmerge: 4.3.1
- svgo: 3.1.0
+ "@svgr/core": 8.1.0(typescript@5.3.3)
+ cosmiconfig: 8.3.6(typescript@5.3.3)
+ deepmerge: 4.3.1
+ svgo: 3.1.0
+ transitivePeerDependencies:
+ - typescript
+ dev: true
+
+ /@svgr/webpack@8.1.0(typescript@5.0.2):
+ resolution:
+ {
+ integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==,
+ }
+ engines: { node: ">=14" }
+ dependencies:
+ "@babel/core": 7.23.6
+ "@babel/plugin-transform-react-constant-elements": 7.23.3(@babel/core@7.23.6)
+ "@babel/preset-env": 7.23.6(@babel/core@7.23.6)
+ "@babel/preset-react": 7.23.3(@babel/core@7.23.6)
+ "@babel/preset-typescript": 7.23.3(@babel/core@7.23.6)
+ "@svgr/core": 8.1.0(typescript@5.0.2)
+ "@svgr/plugin-jsx": 8.1.0(@svgr/core@8.1.0)
+ "@svgr/plugin-svgo": 8.1.0(@svgr/core@8.1.0)(typescript@5.0.2)
transitivePeerDependencies:
+ - supports-color
- typescript
- dev: true
+ dev: false
/@svgr/webpack@8.1.0(typescript@5.3.3):
resolution:
@@ -11420,7 +11775,7 @@ packages:
}
dependencies:
"@types/connect": 3.4.38
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
dev: true
/@types/caseless@0.12.5:
@@ -11436,7 +11791,7 @@ packages:
integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==,
}
dependencies:
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
dev: true
/@types/cross-spawn@6.0.6:
@@ -11445,7 +11800,7 @@ packages:
integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==,
}
dependencies:
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
dev: true
/@types/d3-array@3.2.1:
@@ -11642,7 +11997,7 @@ packages:
integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==,
}
dependencies:
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
"@types/qs": 6.9.10
"@types/range-parser": 1.2.7
"@types/send": 0.17.4
@@ -11681,7 +12036,7 @@ packages:
}
dependencies:
"@types/minimatch": 5.1.2
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
dev: false
/@types/graceful-fs@4.1.9:
@@ -11690,7 +12045,7 @@ packages:
integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==,
}
dependencies:
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
/@types/hoist-non-react-statics@3.3.5:
resolution:
@@ -11744,13 +12099,23 @@ packages:
dependencies:
"@types/istanbul-lib-report": 3.0.3
+ /@types/jest@29.5.12:
+ resolution:
+ {
+ integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==,
+ }
+ dependencies:
+ expect: 29.7.0
+ pretty-format: 29.7.0
+ dev: false
+
/@types/jsdom@20.0.1:
resolution:
{
integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==,
}
dependencies:
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
"@types/tough-cookie": 4.0.5
parse5: 7.1.2
dev: false
@@ -11839,7 +12204,7 @@ packages:
integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==,
}
dependencies:
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
form-data: 4.0.0
dev: true
@@ -11865,6 +12230,12 @@ packages:
dependencies:
undici-types: 5.26.5
+ /@types/node@20.0.0:
+ resolution:
+ {
+ integrity: sha512-cD2uPTDnQQCVpmRefonO98/PPijuOnnEy5oytWJFPY1N9aJCz2wJ5kSGWO+zJoed2cY2JxQh6yBuUq4vIn61hw==,
+ }
+
/@types/normalize-package-data@2.4.4:
resolution:
{
@@ -11919,7 +12290,6 @@ packages:
}
dependencies:
"@types/react": 18.2.45
- dev: false
/@types/react-lifecycles-compat@3.0.4:
resolution:
@@ -11955,7 +12325,7 @@ packages:
}
dependencies:
"@types/caseless": 0.12.5
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
"@types/tough-cookie": 4.0.5
form-data: 2.5.1
dev: false
@@ -11986,7 +12356,7 @@ packages:
}
dependencies:
"@types/mime": 1.3.5
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
dev: true
/@types/serve-static@1.15.5:
@@ -11997,7 +12367,7 @@ packages:
dependencies:
"@types/http-errors": 2.0.4
"@types/mime": 3.0.4
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
dev: true
/@types/sharp@0.31.1:
@@ -12006,7 +12376,7 @@ packages:
integrity: sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==,
}
dependencies:
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
dev: false
/@types/stack-utils@2.0.3:
@@ -12057,7 +12427,7 @@ packages:
integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==,
}
dependencies:
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
"@types/webidl-conversions": 7.0.3
dev: false
@@ -13181,7 +13551,7 @@ packages:
postcss: ^8.1.0
dependencies:
browserslist: 4.22.2
- caniuse-lite: 1.0.30001568
+ caniuse-lite: 1.0.30001596
fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.0.0
@@ -13200,7 +13570,7 @@ packages:
postcss: ^8.1.0
dependencies:
browserslist: 4.22.2
- caniuse-lite: 1.0.30001568
+ caniuse-lite: 1.0.30001596
fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.0.0
@@ -13385,7 +13755,6 @@ packages:
semver: 6.3.1
transitivePeerDependencies:
- supports-color
- dev: true
/babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.6):
resolution:
@@ -13400,7 +13769,6 @@ packages:
core-js-compat: 3.34.0
transitivePeerDependencies:
- supports-color
- dev: true
/babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.6):
resolution:
@@ -13414,7 +13782,6 @@ packages:
"@babel/helper-define-polyfill-provider": 0.4.4(@babel/core@7.23.6)
transitivePeerDependencies:
- supports-color
- dev: true
/babel-plugin-transform-imports@2.0.0:
resolution:
@@ -13515,6 +13882,13 @@ packages:
integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==,
}
+ /bignumber.js@9.1.2:
+ resolution:
+ {
+ integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==,
+ }
+ dev: false
+
/binary-extensions@2.2.0:
resolution:
{
@@ -13775,7 +14149,7 @@ packages:
engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 }
hasBin: true
dependencies:
- caniuse-lite: 1.0.30001568
+ caniuse-lite: 1.0.30001596
electron-to-chromium: 1.4.611
node-releases: 2.0.14
update-browserslist-db: 1.0.13(browserslist@4.22.2)
@@ -14020,7 +14394,7 @@ packages:
}
dependencies:
browserslist: 4.22.2
- caniuse-lite: 1.0.30001568
+ caniuse-lite: 1.0.30001596
lodash.memoize: 4.1.2
lodash.uniq: 4.5.0
dev: false
@@ -14031,6 +14405,12 @@ packages:
integrity: sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==,
}
+ /caniuse-lite@1.0.30001596:
+ resolution:
+ {
+ integrity: sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==,
+ }
+
/case-sensitive-paths-webpack-plugin@2.4.0:
resolution:
{
@@ -14673,7 +15053,6 @@ packages:
}
dependencies:
browserslist: 4.22.2
- dev: true
/core-js-pure@3.34.0:
resolution:
@@ -14709,6 +15088,24 @@ packages:
path-type: 4.0.0
yaml: 1.10.2
+ /cosmiconfig@8.3.6(typescript@5.0.2):
+ resolution:
+ {
+ integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==,
+ }
+ engines: { node: ">=14" }
+ peerDependencies:
+ typescript: ">=4.9.5"
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ typescript: 5.0.2
+
/cosmiconfig@8.3.6(typescript@5.3.3):
resolution:
{
@@ -16907,7 +17304,7 @@ packages:
lodash: 4.17.21
resolve: 2.0.0-next.5
semver: 5.7.2
- webpack: 5.89.0(@swc/core@1.3.100)(webpack-cli@4.10.0)
+ webpack: 5.89.0(@swc/core@1.3.78)(webpack-cli@4.10.0)
transitivePeerDependencies:
- supports-color
@@ -18321,6 +18718,36 @@ packages:
integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==,
}
+ /gaxios@6.3.0:
+ resolution:
+ {
+ integrity: sha512-p+ggrQw3fBwH2F5N/PAI4k/G/y1art5OxKpb2J2chwNNHM4hHuAOtivjPuirMF4KNKwTTUal/lPfL2+7h2mEcg==,
+ }
+ engines: { node: ">=14" }
+ dependencies:
+ extend: 3.0.2
+ https-proxy-agent: 7.0.2
+ is-stream: 2.0.1
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /gcp-metadata@6.1.0:
+ resolution:
+ {
+ integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==,
+ }
+ engines: { node: ">=14" }
+ dependencies:
+ gaxios: 6.3.0
+ json-bigint: 1.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
/gensync@1.0.0-beta.2:
resolution:
{
@@ -18637,6 +19064,56 @@ packages:
merge2: 1.4.1
slash: 3.0.0
+ /google-auth-library@9.6.3:
+ resolution:
+ {
+ integrity: sha512-4CacM29MLC2eT9Cey5GDVK4Q8t+MMp8+OEdOaqD9MG6b0dOyLORaaeJMPQ7EESVgm/+z5EKYyFLxgzBJlJgyHQ==,
+ }
+ engines: { node: ">=14" }
+ dependencies:
+ base64-js: 1.5.1
+ ecdsa-sig-formatter: 1.0.11
+ gaxios: 6.3.0
+ gcp-metadata: 6.1.0
+ gtoken: 7.1.0
+ jws: 4.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /googleapis-common@7.0.1:
+ resolution:
+ {
+ integrity: sha512-mgt5zsd7zj5t5QXvDanjWguMdHAcJmmDrF9RkInCecNsyV7S7YtGqm5v2IWONNID88osb7zmx5FtrAP12JfD0w==,
+ }
+ engines: { node: ">=14.0.0" }
+ dependencies:
+ extend: 3.0.2
+ gaxios: 6.3.0
+ google-auth-library: 9.6.3
+ qs: 6.11.2
+ url-template: 2.0.8
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /googleapis@133.0.0:
+ resolution:
+ {
+ integrity: sha512-6xyc49j+x7N4smawJs/q1i7mbSkt6SYUWWd9RbsmmDW7gRv+mhwZ4xT+XkPihZcNyo/diF//543WZq4szdS74w==,
+ }
+ engines: { node: ">=14.0.0" }
+ dependencies:
+ google-auth-library: 9.6.3
+ googleapis-common: 7.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
/gopd@1.0.1:
resolution:
{
@@ -18812,6 +19289,20 @@ packages:
strip-bom-string: 1.0.0
dev: false
+ /gtoken@7.1.0:
+ resolution:
+ {
+ integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==,
+ }
+ engines: { node: ">=14.0.0" }
+ dependencies:
+ gaxios: 6.3.0
+ jws: 4.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
/gunzip-maybe@1.4.2:
resolution:
{
@@ -19446,7 +19937,6 @@ packages:
{
integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==,
}
- dev: false
/import-fresh@3.3.0:
resolution:
@@ -20326,7 +20816,7 @@ packages:
"@jest/expect": 29.7.0
"@jest/test-result": 29.7.0
"@jest/types": 29.6.3
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
chalk: 4.1.2
co: 4.6.0
dedent: 1.5.1
@@ -20419,6 +20909,49 @@ packages:
- babel-plugin-macros
- supports-color
+ /jest-config@29.7.0(@types/node@20.0.0)(ts-node@10.9.2):
+ resolution:
+ {
+ integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==,
+ }
+ engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 }
+ peerDependencies:
+ "@types/node": "*"
+ ts-node: ">=9.0.0"
+ peerDependenciesMeta:
+ "@types/node":
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ "@babel/core": 7.23.6
+ "@jest/test-sequencer": 29.7.0
+ "@jest/types": 29.6.3
+ "@types/node": 20.0.0
+ babel-jest: 29.7.0(@babel/core@7.23.6)
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ deepmerge: 4.3.1
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ jest-circus: 29.7.0
+ jest-environment-node: 29.7.0
+ jest-get-type: 29.6.3
+ jest-regex-util: 29.6.3
+ jest-resolve: 29.7.0
+ jest-runner: 29.7.0
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ micromatch: 4.0.5
+ parse-json: 5.2.0
+ pretty-format: 29.7.0
+ slash: 3.0.0
+ strip-json-comments: 3.1.1
+ ts-node: 10.9.2(@swc/core@1.3.100)(@types/node@18.19.3)(typescript@5.3.3)
+ transitivePeerDependencies:
+ - babel-plugin-macros
+ - supports-color
+
/jest-diff@29.7.0:
resolution:
{
@@ -20469,7 +21002,7 @@ packages:
"@jest/fake-timers": 29.7.0
"@jest/types": 29.6.3
"@types/jsdom": 20.0.1
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
jest-mock: 29.7.0
jest-util: 29.7.0
jsdom: 20.0.3
@@ -20489,7 +21022,7 @@ packages:
"@jest/environment": 29.7.0
"@jest/fake-timers": 29.7.0
"@jest/types": 29.6.3
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
jest-mock: 29.7.0
jest-util: 29.7.0
@@ -20509,7 +21042,7 @@ packages:
dependencies:
"@jest/types": 29.6.3
"@types/graceful-fs": 4.1.9
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
anymatch: 3.1.3
fb-watchman: 2.0.2
graceful-fs: 4.2.11
@@ -20568,7 +21101,7 @@ packages:
engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 }
dependencies:
"@jest/types": 27.5.1
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
dev: true
/jest-mock@29.7.0:
@@ -20579,7 +21112,7 @@ packages:
engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 }
dependencies:
"@jest/types": 29.6.3
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
jest-util: 29.7.0
/jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
@@ -20644,7 +21177,7 @@ packages:
"@jest/test-result": 29.7.0
"@jest/transform": 29.7.0
"@jest/types": 29.6.3
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
chalk: 4.1.2
emittery: 0.13.1
graceful-fs: 4.2.11
@@ -20677,7 +21210,7 @@ packages:
"@jest/test-result": 29.7.0
"@jest/transform": 29.7.0
"@jest/types": 29.6.3
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
chalk: 4.1.2
cjs-module-lexer: 1.2.3
collect-v8-coverage: 1.0.2
@@ -20733,7 +21266,7 @@ packages:
engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 }
dependencies:
"@jest/types": 29.6.3
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
chalk: 4.1.2
ci-info: 3.9.0
graceful-fs: 4.2.11
@@ -20762,7 +21295,7 @@ packages:
dependencies:
"@jest/test-result": 29.7.0
"@jest/types": 29.6.3
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
ansi-escapes: 4.3.2
chalk: 4.1.2
emittery: 0.13.1
@@ -20776,7 +21309,7 @@ packages:
}
engines: { node: ">= 10.13.0" }
dependencies:
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
merge-stream: 2.0.0
supports-color: 8.1.1
@@ -20787,7 +21320,7 @@ packages:
}
engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 }
dependencies:
- "@types/node": 18.19.3
+ "@types/node": 20.0.0
jest-util: 29.7.0
merge-stream: 2.0.0
supports-color: 8.1.1
@@ -21056,7 +21589,6 @@ packages:
integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==,
}
hasBin: true
- dev: true
/jsesc@2.5.2:
resolution:
@@ -21066,6 +21598,15 @@ packages:
engines: { node: ">=4" }
hasBin: true
+ /json-bigint@1.0.0:
+ resolution:
+ {
+ integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==,
+ }
+ dependencies:
+ bignumber.js: 9.1.2
+ dev: false
+
/json-buffer@3.0.1:
resolution:
{
@@ -21365,6 +21906,17 @@ packages:
safe-buffer: 5.2.1
dev: false
+ /jwa@2.0.0:
+ resolution:
+ {
+ integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==,
+ }
+ dependencies:
+ buffer-equal-constant-time: 1.0.1
+ ecdsa-sig-formatter: 1.0.11
+ safe-buffer: 5.2.1
+ dev: false
+
/jws@3.2.2:
resolution:
{
@@ -21375,6 +21927,16 @@ packages:
safe-buffer: 5.2.1
dev: false
+ /jws@4.0.0:
+ resolution:
+ {
+ integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==,
+ }
+ dependencies:
+ jwa: 2.0.0
+ safe-buffer: 5.2.1
+ dev: false
+
/jwt-decode@3.1.2:
resolution:
{
@@ -21675,7 +22237,6 @@ packages:
{
integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==,
}
- dev: true
/lodash.get@4.4.2:
resolution:
@@ -22721,6 +23282,14 @@ packages:
global: 4.4.0
dev: false
+ /mylas@2.1.13:
+ resolution:
+ {
+ integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==,
+ }
+ engines: { node: ">=12.0.0" }
+ dev: false
+
/mz@2.7.0:
resolution:
{
@@ -22894,6 +23463,48 @@ packages:
- "@babel/core"
- babel-plugin-macros
+ /next@14.1.3(@babel/core@7.23.6)(react-dom@18.2.0)(react@18.2.0):
+ resolution:
+ {
+ integrity: sha512-oexgMV2MapI0UIWiXKkixF8J8ORxpy64OuJ/J9oVUmIthXOUCcuVEZX+dtpgq7wIfIqtBwQsKEDXejcjTsan9g==,
+ }
+ engines: { node: ">=18.17.0" }
+ hasBin: true
+ peerDependencies:
+ "@opentelemetry/api": ^1.1.0
+ react: ^18.2.0
+ react-dom: ^18.2.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ "@opentelemetry/api":
+ optional: true
+ sass:
+ optional: true
+ dependencies:
+ "@next/env": 14.1.3
+ "@swc/helpers": 0.5.2
+ busboy: 1.6.0
+ caniuse-lite: 1.0.30001596
+ graceful-fs: 4.2.11
+ postcss: 8.4.31
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ styled-jsx: 5.1.1(@babel/core@7.23.6)(react@18.2.0)
+ optionalDependencies:
+ "@next/swc-darwin-arm64": 14.1.3
+ "@next/swc-darwin-x64": 14.1.3
+ "@next/swc-linux-arm64-gnu": 14.1.3
+ "@next/swc-linux-arm64-musl": 14.1.3
+ "@next/swc-linux-x64-gnu": 14.1.3
+ "@next/swc-linux-x64-musl": 14.1.3
+ "@next/swc-win32-arm64-msvc": 14.1.3
+ "@next/swc-win32-ia32-msvc": 14.1.3
+ "@next/swc-win32-x64-msvc": 14.1.3
+ transitivePeerDependencies:
+ - "@babel/core"
+ - babel-plugin-macros
+ dev: false
+
/no-case@3.0.4:
resolution:
{
@@ -23899,7 +24510,7 @@ packages:
style-loader: 2.0.0(webpack@5.89.0)
swc-loader: 0.2.3(@swc/core@1.3.78)(webpack@5.89.0)
swc-minify-webpack-plugin: 2.1.1(@swc/core@1.3.78)(webpack@5.89.0)
- terser-webpack-plugin: 5.3.9(@swc/core@1.3.78)(webpack@5.89.0)
+ terser-webpack-plugin: 5.3.9(@swc/core@1.3.100)(esbuild@0.18.20)(webpack@5.89.0)
ts-essentials: 7.0.3(typescript@5.3.3)
url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0)
use-context-selector: 1.4.1(react-dom@18.2.0)(react@18.2.0)(scheduler@0.23.0)
@@ -24027,7 +24638,7 @@ packages:
scmp: 2.1.0
sharp: 0.33.2
swc-loader: 0.2.3(@swc/core@1.3.76)(webpack@5.89.0)
- terser-webpack-plugin: 5.3.9(@swc/core@1.3.76)(webpack@5.89.0)
+ terser-webpack-plugin: 5.3.9(@swc/core@1.3.100)(esbuild@0.18.20)(webpack@5.89.0)
ts-essentials: 7.0.3(typescript@5.3.3)
use-context-selector: 1.4.1(react-dom@18.2.0)(react@18.2.0)(scheduler@0.23.0)
uuid: 9.0.1
@@ -24339,6 +24950,16 @@ packages:
fsevents: 2.3.2
dev: true
+ /plimit-lit@1.6.1:
+ resolution:
+ {
+ integrity: sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==,
+ }
+ engines: { node: ">=12" }
+ dependencies:
+ queue-lit: 1.5.2
+ dev: false
+
/pluralize@8.0.0:
resolution:
{
@@ -26057,6 +26678,14 @@ packages:
}
dev: false
+ /queue-lit@1.5.2:
+ resolution:
+ {
+ integrity: sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==,
+ }
+ engines: { node: ">=12" }
+ dev: false
+
/queue-microtask@1.2.3:
resolution:
{
@@ -26998,14 +27627,12 @@ packages:
engines: { node: ">=4" }
dependencies:
regenerate: 1.4.2
- dev: true
/regenerate@1.4.2:
resolution:
{
integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==,
}
- dev: true
/regenerator-runtime@0.12.1:
resolution:
@@ -27027,7 +27654,6 @@ packages:
}
dependencies:
"@babel/runtime": 7.23.6
- dev: true
/regex-parser@2.2.11:
resolution:
@@ -27060,7 +27686,6 @@ packages:
regjsparser: 0.9.1
unicode-match-property-ecmascript: 2.0.0
unicode-match-property-value-ecmascript: 2.1.0
- dev: true
/regjsparser@0.9.1:
resolution:
@@ -27070,7 +27695,6 @@ packages:
hasBin: true
dependencies:
jsesc: 0.5.0
- dev: true
/relateurl@0.2.7:
resolution:
@@ -27531,33 +28155,6 @@ packages:
neo-async: 2.6.2
sass: 1.69.5
webpack: 5.89.0(@swc/core@1.3.78)(webpack-cli@4.10.0)
- dev: false
-
- /sass-loader@12.6.0(webpack@5.89.0):
- resolution:
- {
- integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==,
- }
- engines: { node: ">= 12.13.0" }
- peerDependencies:
- fibers: ">= 3.1.0"
- node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
- sass: ^1.3.0
- sass-embedded: "*"
- webpack: ^5.0.0
- peerDependenciesMeta:
- fibers:
- optional: true
- node-sass:
- optional: true
- sass:
- optional: true
- sass-embedded:
- optional: true
- dependencies:
- klona: 2.0.6
- neo-async: 2.6.2
- webpack: 5.89.0(@swc/core@1.3.100)(webpack-cli@4.10.0)
/sass@1.69.4:
resolution:
@@ -27583,7 +28180,6 @@ packages:
chokidar: 3.5.3
immutable: 4.3.4
source-map-js: 1.0.2
- dev: false
/sax@1.2.1:
resolution:
@@ -28140,7 +28736,6 @@ packages:
dependencies:
dot-case: 3.0.4
tslib: 2.6.2
- dev: true
/socks@2.7.1:
resolution:
@@ -28783,7 +29378,6 @@ packages:
{
integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==,
}
- dev: true
/svg-url-loader@8.0.0(webpack@5.89.0):
resolution:
@@ -29061,143 +29655,6 @@ packages:
serialize-javascript: 6.0.1
terser: 5.26.0
webpack: 5.89.0(@swc/core@1.3.100)(esbuild@0.18.20)
- dev: true
-
- /terser-webpack-plugin@5.3.9(@swc/core@1.3.100)(webpack@5.89.0):
- resolution:
- {
- integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==,
- }
- engines: { node: ">= 10.13.0" }
- peerDependencies:
- "@swc/core": "*"
- esbuild: "*"
- uglify-js: "*"
- webpack: ^5.1.0
- peerDependenciesMeta:
- "@swc/core":
- optional: true
- esbuild:
- optional: true
- uglify-js:
- optional: true
- dependencies:
- "@jridgewell/trace-mapping": 0.3.20
- "@swc/core": 1.3.100
- jest-worker: 27.5.1
- schema-utils: 3.3.0
- serialize-javascript: 6.0.1
- terser: 5.26.0
- webpack: 5.89.0(@swc/core@1.3.100)(webpack-cli@4.10.0)
-
- /terser-webpack-plugin@5.3.9(@swc/core@1.3.76)(webpack@5.89.0):
- resolution:
- {
- integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==,
- }
- engines: { node: ">= 10.13.0" }
- peerDependencies:
- "@swc/core": "*"
- esbuild: "*"
- uglify-js: "*"
- webpack: ^5.1.0
- peerDependenciesMeta:
- "@swc/core":
- optional: true
- esbuild:
- optional: true
- uglify-js:
- optional: true
- dependencies:
- "@jridgewell/trace-mapping": 0.3.20
- "@swc/core": 1.3.76
- jest-worker: 27.5.1
- schema-utils: 3.3.0
- serialize-javascript: 6.0.1
- terser: 5.26.0
- webpack: 5.89.0(@swc/core@1.3.100)(webpack-cli@4.10.0)
- dev: false
-
- /terser-webpack-plugin@5.3.9(@swc/core@1.3.78)(webpack@5.89.0):
- resolution:
- {
- integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==,
- }
- engines: { node: ">= 10.13.0" }
- peerDependencies:
- "@swc/core": "*"
- esbuild: "*"
- uglify-js: "*"
- webpack: ^5.1.0
- peerDependenciesMeta:
- "@swc/core":
- optional: true
- esbuild:
- optional: true
- uglify-js:
- optional: true
- dependencies:
- "@jridgewell/trace-mapping": 0.3.20
- "@swc/core": 1.3.78
- jest-worker: 27.5.1
- schema-utils: 3.3.0
- serialize-javascript: 6.0.1
- terser: 5.26.0
- webpack: 5.89.0(@swc/core@1.3.78)(webpack-cli@4.10.0)
-
- /terser-webpack-plugin@5.3.9(esbuild@0.18.20)(webpack@5.89.0):
- resolution:
- {
- integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==,
- }
- engines: { node: ">= 10.13.0" }
- peerDependencies:
- "@swc/core": "*"
- esbuild: "*"
- uglify-js: "*"
- webpack: ^5.1.0
- peerDependenciesMeta:
- "@swc/core":
- optional: true
- esbuild:
- optional: true
- uglify-js:
- optional: true
- dependencies:
- "@jridgewell/trace-mapping": 0.3.20
- esbuild: 0.18.20
- jest-worker: 27.5.1
- schema-utils: 3.3.0
- serialize-javascript: 6.0.1
- terser: 5.26.0
- webpack: 5.89.0(esbuild@0.18.20)
-
- /terser-webpack-plugin@5.3.9(webpack@5.89.0):
- resolution:
- {
- integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==,
- }
- engines: { node: ">= 10.13.0" }
- peerDependencies:
- "@swc/core": "*"
- esbuild: "*"
- uglify-js: "*"
- webpack: ^5.1.0
- peerDependenciesMeta:
- "@swc/core":
- optional: true
- esbuild:
- optional: true
- uglify-js:
- optional: true
- dependencies:
- "@jridgewell/trace-mapping": 0.3.20
- jest-worker: 27.5.1
- schema-utils: 3.3.0
- serialize-javascript: 6.0.1
- terser: 5.26.0
- webpack: 5.89.0
- dev: true
/terser@5.26.0:
resolution:
@@ -29620,6 +30077,21 @@ packages:
typescript: 5.3.3
dev: true
+ /tsc-alias@1.8.8:
+ resolution:
+ {
+ integrity: sha512-OYUOd2wl0H858NvABWr/BoSKNERw3N9GTi3rHPK8Iv4O1UyUXIrTTOAZNHsjlVpXFOhpJBVARI1s+rzwLivN3Q==,
+ }
+ hasBin: true
+ dependencies:
+ chokidar: 3.5.3
+ commander: 9.5.0
+ globby: 11.1.0
+ mylas: 2.1.13
+ normalize-path: 3.0.0
+ plimit-lit: 1.6.1
+ dev: false
+
/tsconfig-paths-webpack-plugin@4.1.0:
resolution:
{
@@ -29653,7 +30125,6 @@ packages:
json5: 2.2.3
minimist: 1.2.8
strip-bom: 3.0.0
- dev: true
/tslib@1.14.1:
resolution:
@@ -29972,6 +30443,14 @@ packages:
}
dev: true
+ /typescript@5.0.2:
+ resolution:
+ {
+ integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==,
+ }
+ engines: { node: ">=12.20" }
+ hasBin: true
+
/typescript@5.3.3:
resolution:
{
@@ -30014,7 +30493,6 @@ packages:
integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==,
}
engines: { node: ">=4" }
- dev: true
/unicode-match-property-ecmascript@2.0.0:
resolution:
@@ -30025,7 +30503,6 @@ packages:
dependencies:
unicode-canonical-property-names-ecmascript: 2.0.0
unicode-property-aliases-ecmascript: 2.1.0
- dev: true
/unicode-match-property-value-ecmascript@2.1.0:
resolution:
@@ -30033,7 +30510,6 @@ packages:
integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==,
}
engines: { node: ">=4" }
- dev: true
/unicode-property-aliases-ecmascript@2.1.0:
resolution:
@@ -30041,7 +30517,6 @@ packages:
integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==,
}
engines: { node: ">=4" }
- dev: true
/unique-string@2.0.0:
resolution:
@@ -30190,6 +30665,13 @@ packages:
requires-port: 1.0.0
dev: false
+ /url-template@2.0.8:
+ resolution:
+ {
+ integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==,
+ }
+ dev: false
+
/url-toolkit@2.2.5:
resolution:
{
@@ -31747,49 +32229,6 @@ packages:
}
dev: true
- /webpack@5.89.0:
- resolution:
- {
- integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==,
- }
- engines: { node: ">=10.13.0" }
- hasBin: true
- peerDependencies:
- webpack-cli: "*"
- peerDependenciesMeta:
- webpack-cli:
- optional: true
- dependencies:
- "@types/eslint-scope": 3.7.7
- "@types/estree": 1.0.5
- "@webassemblyjs/ast": 1.11.6
- "@webassemblyjs/wasm-edit": 1.11.6
- "@webassemblyjs/wasm-parser": 1.11.6
- acorn: 8.11.2
- acorn-import-assertions: 1.9.0(acorn@8.11.2)
- browserslist: 4.22.2
- chrome-trace-event: 1.0.3
- enhanced-resolve: 5.15.0
- es-module-lexer: 1.4.1
- eslint-scope: 5.1.1
- events: 3.3.0
- glob-to-regexp: 0.4.1
- graceful-fs: 4.2.11
- json-parse-even-better-errors: 2.3.1
- loader-runner: 4.3.0
- mime-types: 2.1.35
- neo-async: 2.6.2
- schema-utils: 3.3.0
- tapable: 2.2.1
- terser-webpack-plugin: 5.3.9(webpack@5.89.0)
- watchpack: 2.4.0
- webpack-sources: 3.2.3
- transitivePeerDependencies:
- - "@swc/core"
- - esbuild
- - uglify-js
- dev: true
-
/webpack@5.89.0(@swc/core@1.3.100)(esbuild@0.18.20):
resolution:
{
@@ -31831,7 +32270,6 @@ packages:
- "@swc/core"
- esbuild
- uglify-js
- dev: true
/webpack@5.89.0(@swc/core@1.3.100)(webpack-cli@4.10.0):
resolution:
@@ -31867,7 +32305,7 @@ packages:
neo-async: 2.6.2
schema-utils: 3.3.0
tapable: 2.2.1
- terser-webpack-plugin: 5.3.9(@swc/core@1.3.100)(webpack@5.89.0)
+ terser-webpack-plugin: 5.3.9(@swc/core@1.3.100)(esbuild@0.18.20)(webpack@5.89.0)
watchpack: 2.4.0
webpack-cli: 4.10.0(webpack-bundle-analyzer@4.10.1)(webpack@5.89.0)
webpack-sources: 3.2.3
@@ -31910,7 +32348,7 @@ packages:
neo-async: 2.6.2
schema-utils: 3.3.0
tapable: 2.2.1
- terser-webpack-plugin: 5.3.9(@swc/core@1.3.78)(webpack@5.89.0)
+ terser-webpack-plugin: 5.3.9(@swc/core@1.3.100)(esbuild@0.18.20)(webpack@5.89.0)
watchpack: 2.4.0
webpack-cli: 4.10.0(webpack-bundle-analyzer@4.10.1)(webpack@5.89.0)
webpack-sources: 3.2.3
@@ -31953,7 +32391,7 @@ packages:
neo-async: 2.6.2
schema-utils: 3.3.0
tapable: 2.2.1
- terser-webpack-plugin: 5.3.9(esbuild@0.18.20)(webpack@5.89.0)
+ terser-webpack-plugin: 5.3.9(@swc/core@1.3.100)(esbuild@0.18.20)(webpack@5.89.0)
watchpack: 2.4.0
webpack-sources: 3.2.3
transitivePeerDependencies:
@@ -32525,3 +32963,7 @@ packages:
{
integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==,
}
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false