diff --git a/.github/workflows/javascript-formatting.yml b/.github/workflows/javascript-formatting.yml
index 35f528a77..e780ed6ab 100644
--- a/.github/workflows/javascript-formatting.yml
+++ b/.github/workflows/javascript-formatting.yml
@@ -67,3 +67,30 @@ jobs:
- name: Lint
run: npm run lint
+
+ unused-code:
+ name: Test for unused code
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ working-directory: ./web
+
+ steps:
+ - id: skip_check
+ uses: fkirc/skip-duplicate-actions@v5
+ with:
+ concurrent_skipping: 'same_content_newer'
+
+ - name: Checkout
+ uses: actions/checkout@v3
+ with:
+ # Make sure the actual branch is checked out when running on pull requests
+ ref: ${{ github.event.pull_request.head.ref }}
+ repository: ${{ github.event.pull_request.head.repo.full_name }}
+ fetch-depth: 0
+
+ - name: Install Dependencies
+ run: npm install
+
+ - name: Check for unused JS code and dependencies
+ run: npx knip --include dependencies,files,exports
diff --git a/web/.eslintrc.js b/web/.eslintrc.js
index 820f8641c..425655d84 100644
--- a/web/.eslintrc.js
+++ b/web/.eslintrc.js
@@ -19,7 +19,7 @@ module.exports = {
ecmaVersion: 12,
sourceType: 'module',
},
- plugins: ['react', 'prettier', '@typescript-eslint'],
+ plugins: ['react', 'prettier', '@typescript-eslint', 'import'],
ignorePatterns: ['!./storybook/**'],
rules: {
'prettier/prettier': 'error',
@@ -75,6 +75,7 @@ module.exports = {
peerDependencies: true,
},
],
+ 'import/no-unused-modules': [1, { unusedExports: true }],
},
settings: {
'import/resolver': {
diff --git a/web/.knip.json b/web/.knip.json
new file mode 100644
index 000000000..575982d7a
--- /dev/null
+++ b/web/.knip.json
@@ -0,0 +1,72 @@
+{
+ "ignore": [
+ "**/.eslintrc.js",
+ ".storybook/**",
+ "**/*config.?s",
+ "**/*mock.?s",
+ "**/*fixture.?s",
+ "next-env.d.ts",
+ "public/**"
+ ],
+ "ignoreDependencies": [
+ "@fontsource/inter",
+ "@fontsource/poppins",
+ "@next/bundle-analyzer",
+ "autoprefixer",
+ "webpack-deadcode-plugin",
+ "yaml",
+ "postcss-flexbugs-fixes",
+ "sharp",
+ "next-with-less",
+ "next-pwa",
+ "workbox-precaching",
+ "workbox-window",
+ "@storybook/addon-a11y",
+ "@storybook/addon-docs",
+ "@storybook/addon-essentials",
+ "@storybook/addon-links",
+ "@storybook/addon-postcss",
+ "@storybook/addon-viewport",
+ "@storybook/builder-webpack5",
+ "@storybook/cli",
+ "@storybook/manager-webpack5",
+ "@storybook/mdx2-csf",
+ "@storybook/preset-scss",
+ "@mdx-js/react",
+ "@storybook/testing-library",
+ "@svgr/webpack",
+ "@types/jest",
+ "@types/markdown-it",
+ "@types/prop-types",
+ "@typescript-eslint/eslint-plugin",
+ "@typescript-eslint/parser",
+ "babel-loader",
+ "chromatic",
+ "css-loader",
+ "cypress",
+ "eslint-config-airbnb",
+ "eslint-config-next",
+ "eslint-config-prettier",
+ "eslint-plugin-import",
+ "eslint-plugin-jsx-a11y",
+ "eslint-plugin-prettier",
+ "eslint-plugin-react",
+ "eslint-plugin-react-hooks",
+ "eslint-plugin-storybook",
+ "handlebars",
+ "html-webpack-plugin",
+ "install",
+ "less",
+ "less-loader",
+ "mdx-mermaid",
+ "mermaid",
+ "prettier",
+ "sass-loader",
+ "sb",
+ "storybook-addon-designs",
+ "storybook-addon-fetch-mock",
+ "storybook-preset-less",
+ "style-loader",
+ "ts-jest"
+ ]
+}
\ No newline at end of file
diff --git a/web/components/admin/EditYPDetails.tsx b/web/components/admin/EditYPDetails.tsx
deleted file mode 100644
index d3381a773..000000000
--- a/web/components/admin/EditYPDetails.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-// Note: references to "yp" in the app are likely related to Owncast Directory
-import React, { useState, useContext, useEffect, FC } from 'react';
-import { Typography } from 'antd';
-
-import { ToggleSwitch } from './ToggleSwitch';
-import { ServerStatusContext } from '../../utils/server-status-context';
-import { FIELD_PROPS_NSFW, FIELD_PROPS_YP } from '../../utils/config-constants';
-
-const { Title } = Typography;
-
-// eslint-disable-next-line import/prefer-default-export
-export const EditYPDetails: FC = () => {
- const [formDataValues, setFormDataValues] = useState(null);
-
- const serverStatusData = useContext(ServerStatusContext);
- const { serverConfig } = serverStatusData || {};
-
- const { yp, instanceDetails } = serverConfig;
- const { nsfw } = instanceDetails;
- const { enabled, instanceUrl } = yp;
-
- useEffect(() => {
- setFormDataValues({
- ...yp,
- enabled,
- nsfw,
- });
- }, [yp, instanceDetails]);
-
- const hasInstanceUrl = instanceUrl !== '';
- if (!formDataValues) {
- return null;
- }
- return (
-
-
- Owncast Directory Settings
-
-
-
- Would you like to appear in the{' '}
-
- Owncast Directory
-
- ?
-
-
-
-
- NOTE: You will need to have a URL specified in the Instance URL
field to be
- able to use this.
-
-
-
-
-
-
-
-
- );
-};
diff --git a/web/components/admin/InfoTip.tsx b/web/components/admin/InfoTip.tsx
deleted file mode 100644
index bd006c61c..000000000
--- a/web/components/admin/InfoTip.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import { Tooltip } from 'antd';
-import dynamic from 'next/dynamic';
-import { FC } from 'react';
-
-// Lazy loaded components
-
-const InfoCircleOutlined = dynamic(() => import('@ant-design/icons/InfoCircleOutlined'), {
- ssr: false,
-});
-
-export type InfoTipProps = {
- tip: string | null;
-};
-
-export const InfoTip: FC = ({ tip }) => {
- if (tip === '' || tip === null) {
- return null;
- }
-
- return (
-
-
-
-
-
- );
-};
diff --git a/web/components/admin/KeyValueTable.tsx b/web/components/admin/KeyValueTable.tsx
deleted file mode 100644
index 33d7b2208..000000000
--- a/web/components/admin/KeyValueTable.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { Table, Typography } from 'antd';
-import { FC } from 'react';
-
-const { Title } = Typography;
-
-export type KeyValueTableProps = {
- title: string;
- data: any;
-};
-
-export const KeyValueTable: FC = ({ title, data }) => {
- const columns = [
- {
- title: 'Name',
- dataIndex: 'name',
- key: 'name',
- },
- {
- title: 'Value',
- dataIndex: 'value',
- key: 'value',
- },
- ];
-
- return (
- <>
- {title}
-
- >
- );
-};
diff --git a/web/components/admin/Offline.tsx b/web/components/admin/Offline.tsx
index b79cd895e..905259fce 100644
--- a/web/components/admin/Offline.tsx
+++ b/web/components/admin/Offline.tsx
@@ -174,4 +174,3 @@ export const Offline: FC = ({ logs = [], config }) => {
>
);
};
-export default Offline;
diff --git a/web/components/admin/TextField.tsx b/web/components/admin/TextField.tsx
index a971574fc..38b80191c 100644
--- a/web/components/admin/TextField.tsx
+++ b/web/components/admin/TextField.tsx
@@ -212,7 +212,6 @@ export const TextField: FC = ({
);
};
-export default TextField;
TextField.defaultProps = {
className: '',
diff --git a/web/components/admin/TextFieldWithSubmit.tsx b/web/components/admin/TextFieldWithSubmit.tsx
index facc2ebae..c74234b3a 100644
--- a/web/components/admin/TextFieldWithSubmit.tsx
+++ b/web/components/admin/TextFieldWithSubmit.tsx
@@ -14,9 +14,6 @@ import { ServerStatusContext } from '../../utils/server-status-context';
import { FormStatusIndicator } from './FormStatusIndicator';
import { TextField, TextFieldProps } from './TextField';
-export const TEXTFIELD_TYPE_TEXT = 'default';
-export const TEXTFIELD_TYPE_PASSWORD = 'password'; // Input.Password
-export const TEXTFIELD_TYPE_NUMBER = 'numeric';
export const TEXTFIELD_TYPE_TEXTAREA = 'textarea';
export const TEXTFIELD_TYPE_URL = 'url';
diff --git a/web/components/admin/ToggleSwitch.tsx b/web/components/admin/ToggleSwitch.tsx
index 943e5075d..792c97545 100644
--- a/web/components/admin/ToggleSwitch.tsx
+++ b/web/components/admin/ToggleSwitch.tsx
@@ -106,7 +106,6 @@ export const ToggleSwitch: FC = ({
);
};
-export default ToggleSwitch;
ToggleSwitch.defaultProps = {
apiPath: '',
diff --git a/web/components/admin/ViewerTable.tsx b/web/components/admin/ViewerTable.tsx
index 37abb2fa6..6e79b8292 100644
--- a/web/components/admin/ViewerTable.tsx
+++ b/web/components/admin/ViewerTable.tsx
@@ -1,15 +1,10 @@
import { Table } from 'antd';
-import format from 'date-fns/format';
import { SortOrder } from 'antd/lib/table/interface';
import { formatDistanceToNow } from 'date-fns';
import { FC } from 'react';
import { User } from '../../types/chat';
import { formatUAstring } from '../../utils/format';
-export function formatDisplayDate(date: string | Date) {
- return format(new Date(date), 'MMM d H:mma');
-}
-
export type ViewerTableProps = {
data: User[];
};
diff --git a/web/components/admin/config/general/EditSocialLinks.tsx b/web/components/admin/config/general/EditSocialLinks.tsx
index 09c4a2462..ad000b86d 100644
--- a/web/components/admin/config/general/EditSocialLinks.tsx
+++ b/web/components/admin/config/general/EditSocialLinks.tsx
@@ -214,7 +214,7 @@ export default function EditSocialLinks() {
title: 'Social Link',
dataIndex: '',
key: 'combo',
- render: (data, record) => {
+ render: (_, record) => {
const { platform, url } = record;
const platformInfo = isPredefinedSocial(platform);
@@ -251,7 +251,7 @@ export default function EditSocialLinks() {
title: '',
dataIndex: '',
key: 'edit',
- render: (data, record, index) => (
+ render: (_, _record, index) => (
);
};
-export default Statusbar;
Statusbar.defaultProps = {
lastConnectTime: null,
diff --git a/web/components/video/OwncastPlayer/OwncastPlayer.tsx b/web/components/video/OwncastPlayer/OwncastPlayer.tsx
index a0adb245e..d0daa9520 100644
--- a/web/components/video/OwncastPlayer/OwncastPlayer.tsx
+++ b/web/components/video/OwncastPlayer/OwncastPlayer.tsx
@@ -9,7 +9,7 @@ import { VideoPoster } from '../VideoPoster/VideoPoster';
import { getLocalStorage, setLocalStorage } from '../../../utils/localStorage';
import { isVideoPlayingAtom, clockSkewAtom } from '../../stores/ClientConfigStore';
import PlaybackMetrics from '../metrics/playback';
-import createVideoSettingsMenuButton from '../settings-menu';
+import { createVideoSettingsMenuButton } from '../settings-menu';
import LatencyCompensator from '../latencyCompensator';
import styles from './OwncastPlayer.module.scss';
import { VideoSettingsServiceContext } from '../../../services/video-settings-service';
diff --git a/web/components/video/VideoJS/VideoJS.tsx b/web/components/video/VideoJS/VideoJS.tsx
index 2515696bf..d40347f7d 100644
--- a/web/components/video/VideoJS/VideoJS.tsx
+++ b/web/components/video/VideoJS/VideoJS.tsx
@@ -58,5 +58,3 @@ export const VideoJS: FC = ({ options, onReady }) => {
);
};
-
-export default VideoJS;
diff --git a/web/components/video/settings-menu.ts b/web/components/video/settings-menu.ts
index 7456619eb..0cdca45dd 100644
--- a/web/components/video/settings-menu.ts
+++ b/web/components/video/settings-menu.ts
@@ -111,5 +111,3 @@ export function createVideoSettingsMenuButton(player, videojs, qualities, latenc
// eslint-disable-next-line consistent-return
return menuButton;
}
-
-export default createVideoSettingsMenuButton;
diff --git a/web/next.config.js b/web/next.config.js
index af95b9f4a..0b4b56333 100644
--- a/web/next.config.js
+++ b/web/next.config.js
@@ -2,6 +2,7 @@ const withLess = require('next-with-less');
const withBundleAnalyzer = require('@next/bundle-analyzer')({
enabled: process.env.ANALYZE === 'true',
});
+const DeadCodePlugin = require('webpack-deadcode-plugin');
const runtimeCaching = require('next-pwa/cache');
@@ -39,6 +40,19 @@ module.exports = withPWA(
use: ['@svgr/webpack'],
});
+ config.plugins.push(
+ new DeadCodePlugin({
+ detectUnusedFiles: false,
+ patterns: ['**/*.(js|jsx|tsx|css)'],
+ exclude: [
+ '**/*.(stories|spec).(js|jsx|tsx)',
+ 'node_modules/**/*',
+ 'storybook-static/**/*',
+ 'out/**/*',
+ ],
+ }),
+ );
+
return config;
},
async rewrites() {
diff --git a/web/package-lock.json b/web/package-lock.json
index 3e42ace33..3f42e2f5c 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -21,31 +21,25 @@
"@uiw/react-codemirror": "4.19.16",
"@xstate/react": "3.2.2",
"antd": "4.24.10",
- "autoprefixer": "10.4.14",
+ "autoprefixer": "^10.4.14",
"chart.js": "^4.2.0",
"classnames": "2.3.2",
"date-fns": "^2.29.3",
"interweave": "^13.0.0",
"interweave-autolink": "^5.1.0",
- "linkifyjs": "^4.1.0",
"lodash": "4.17.21",
"next": "13.3.0",
"next-pwa": "^5.6.0",
"next-with-less": "2.0.5",
- "next-with-workbox": "^3.0.5",
"picmo": "5.8.4",
"postcss-flexbugs-fixes": "5.0.2",
- "prop-types": "15.8.1",
"react": "18.2.0",
"react-chartjs-2": "^5.2.0",
- "react-chartkick": "^0.5.3",
- "react-crossfade-img": "1.0.0",
"react-dom": "18.2.0",
"react-error-boundary": "^4.0.0",
"react-hotkeys-hook": "4.4.0",
"react-linkify": "1.0.0-alpha",
"react-markdown": "8.0.7",
- "react-use": "^17.4.0",
"react-virtuoso": "4.3.6",
"recoil": "0.7.7",
"sharp": "0.32.1",
@@ -53,6 +47,7 @@
"slate-react": "0.94.2",
"ua-parser-js": "1.0.35",
"video.js": "^8.3.0",
+ "webpack-deadcode-plugin": "^0.1.17",
"workbox-precaching": "^6.5.4",
"workbox-window": "^6.5.4",
"xstate": "4.37.2",
@@ -96,7 +91,7 @@
"eslint-config-airbnb": "19.0.4",
"eslint-config-next": "13.3.0",
"eslint-config-prettier": "8.8.0",
- "eslint-plugin-import": "2.27.5",
+ "eslint-plugin-import": "^2.27.5",
"eslint-plugin-jsx-a11y": "6.7.1",
"eslint-plugin-prettier": "4.2.1",
"eslint-plugin-react": "7.32.2",
@@ -105,6 +100,7 @@
"handlebars": "^4.7.7",
"html-webpack-plugin": "5.5.1",
"install": "^0.13.0",
+ "knip": "^2.11.0",
"less": "4.1.3",
"less-loader": "11.1.0",
"mdx-mermaid": "^1.3.2",
@@ -2597,6 +2593,96 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true
},
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
+ "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -4453,6 +4539,104 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
+ "node_modules/@npmcli/map-workspaces": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz",
+ "integrity": "sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==",
+ "dev": true,
+ "dependencies": {
+ "@npmcli/name-from-folder": "^2.0.0",
+ "glob": "^10.2.2",
+ "minimatch": "^9.0.0",
+ "read-package-json-fast": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@npmcli/map-workspaces/node_modules/foreground-child": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@npmcli/map-workspaces/node_modules/glob": {
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz",
+ "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.0.3",
+ "minimatch": "^9.0.1",
+ "minipass": "^5.0.0 || ^6.0.2",
+ "path-scurry": "^1.7.0"
+ },
+ "bin": {
+ "glob": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@npmcli/map-workspaces/node_modules/minimatch": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+ "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@npmcli/map-workspaces/node_modules/minipass": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz",
+ "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/@npmcli/map-workspaces/node_modules/signal-exit": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz",
+ "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/@npmcli/move-file": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
@@ -4479,6 +4663,25 @@
"node": ">=10"
}
},
+ "node_modules/@npmcli/name-from-folder": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz",
+ "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==",
+ "dev": true,
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/@pkgr/utils": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.0.tgz",
@@ -4663,6 +4866,14 @@
"rollup": "^1.20.0 || ^2.0.0"
}
},
+ "node_modules/@rollup/plugin-replace/node_modules/magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
"node_modules/@rollup/pluginutils": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
@@ -4796,6 +5007,47 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
+ "node_modules/@snyk/github-codeowners": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@snyk/github-codeowners/-/github-codeowners-1.1.0.tgz",
+ "integrity": "sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^4.1.1",
+ "ignore": "^5.1.8",
+ "p-map": "^4.0.0"
+ },
+ "bin": {
+ "github-codeowners": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=8.10"
+ }
+ },
+ "node_modules/@snyk/github-codeowners/node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@snyk/github-codeowners/node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@snyk/graphlib": {
"version": "2.1.9-patch.3",
"resolved": "https://registry.npmjs.org/@snyk/graphlib/-/graphlib-2.1.9-patch.3.tgz",
@@ -12585,6 +12837,14 @@
"string.prototype.matchall": "^4.0.6"
}
},
+ "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
"node_modules/@svgr/babel-plugin-add-jsx-attribute": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-7.0.0.tgz",
@@ -13264,11 +13524,6 @@
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
"dev": true
},
- "node_modules/@types/js-cookie": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz",
- "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA=="
- },
"node_modules/@types/json-schema": {
"version": "7.0.11",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
@@ -14272,11 +14527,6 @@
"node": ">=10.0.0"
}
},
- "node_modules/@xobotyi/scrollbar-width": {
- "version": "1.9.5",
- "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz",
- "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ=="
- },
"node_modules/@xstate/react": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@xstate/react/-/react-3.2.2.tgz",
@@ -15059,6 +15309,12 @@
"deep-equal": "^2.0.5"
}
},
+ "node_modules/arity-n": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz",
+ "integrity": "sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==",
+ "dev": true
+ },
"node_modules/arr-diff": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
@@ -15133,6 +15389,27 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/array-last": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
+ "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-last/node_modules/is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/array-tree-filter": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz",
@@ -16091,6 +16368,15 @@
"@babel/core": "^7.0.0"
}
},
+ "node_modules/babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true,
+ "bin": {
+ "babylon": "bin/babylon.js"
+ }
+ },
"node_modules/bail": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
@@ -16155,6 +16441,47 @@
}
]
},
+ "node_modules/bash-parser": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/bash-parser/-/bash-parser-0.5.0.tgz",
+ "integrity": "sha512-AQR43o4W4sj4Jf+oy4cFtGgyBps4B+MYnJg6Xds8VVC7yomFtQekhOORQNHfQ8D6YJ0XENykr3TpxMn3rUtgeg==",
+ "dev": true,
+ "dependencies": {
+ "array-last": "^1.1.1",
+ "babylon": "^6.9.1",
+ "compose-function": "^3.0.3",
+ "curry": "^1.2.0",
+ "deep-freeze": "0.0.1",
+ "filter-iterator": "0.0.1",
+ "filter-obj": "^1.1.0",
+ "has-own-property": "^0.1.0",
+ "identity-function": "^1.0.0",
+ "iterable-lookahead": "^1.0.0",
+ "iterable-transform-replace": "^1.1.1",
+ "magic-string": "^0.16.0",
+ "map-iterable": "^1.0.1",
+ "map-obj": "^2.0.0",
+ "object-pairs": "^0.1.0",
+ "object-values": "^1.0.0",
+ "reverse-arguments": "^1.0.0",
+ "shell-quote-word": "^1.0.1",
+ "to-pascal-case": "^1.0.0",
+ "transform-spread-iterable": "^1.1.0",
+ "unescape-js": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/bash-parser/node_modules/map-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
+ "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/batch-processor": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz",
@@ -16224,16 +16551,6 @@
"node": ">=8"
}
},
- "node_modules/bindings": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
- "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "file-uri-to-path": "1.0.0"
- }
- },
"node_modules/binjumper": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/binjumper/-/binjumper-0.1.4.tgz",
@@ -17155,26 +17472,6 @@
"pnpm": ">=7"
}
},
- "node_modules/chartjs-adapter-date-fns": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chartjs-adapter-date-fns/-/chartjs-adapter-date-fns-3.0.0.tgz",
- "integrity": "sha512-Rs3iEB3Q5pJ973J93OBTpnP7qoGwvq3nUnoMdtxO+9aoJof7UFcRbWcIDteXuYd1fgAvct/32T9qaLyLuZVwCg==",
- "optional": true,
- "peerDependencies": {
- "chart.js": ">=2.8.0",
- "date-fns": ">=2.0.0"
- }
- },
- "node_modules/chartkick": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/chartkick/-/chartkick-4.2.0.tgz",
- "integrity": "sha512-7yYZyxeFhOh/LA7gc1VwDFgc6t4ZM9RrbBjgb4dJoFukk2+94QkK0yulYI2OUH1cjcfrf1qmj04FkjZx7kZDeg==",
- "optionalDependencies": {
- "chart.js": ">=3.0.2",
- "chartjs-adapter-date-fns": ">=2.0.0",
- "date-fns": ">=2.0.0"
- }
- },
"node_modules/check-more-types": {
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
@@ -17509,6 +17806,16 @@
"node": ">=12"
}
},
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
"node_modules/clone-deep": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
@@ -17718,6 +18025,15 @@
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
"dev": true
},
+ "node_modules/compose-function": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz",
+ "integrity": "sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==",
+ "dev": true,
+ "dependencies": {
+ "arity-n": "^1.0.4"
+ }
+ },
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -18521,14 +18837,6 @@
"node": ">=8"
}
},
- "node_modules/css-in-js-utils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz",
- "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==",
- "dependencies": {
- "hyphenate-style-name": "^1.0.3"
- }
- },
"node_modules/css-loader": {
"version": "6.7.3",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz",
@@ -18604,18 +18912,6 @@
"url": "https://github.com/sponsors/fb55"
}
},
- "node_modules/css-tree": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
- "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
- "dependencies": {
- "mdn-data": "2.0.14",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
"node_modules/css-what": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
@@ -18691,6 +18987,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/curry": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/curry/-/curry-1.2.0.tgz",
+ "integrity": "sha512-PAdmqPH2DUYTCc/aknv6RxRxmqdRHclvbz+wP8t1Xpg2Nu13qg+oLb6/5iFoDmf4dbmC9loYoy9PwwGbFt/AqA==",
+ "dev": true
+ },
"node_modules/cyclist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
@@ -19504,6 +19806,12 @@
"node": ">=4.0.0"
}
},
+ "node_modules/deep-freeze": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz",
+ "integrity": "sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==",
+ "dev": true
+ },
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -19717,6 +20025,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "clone": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/defer-to-connect": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
@@ -20277,6 +20598,24 @@
"safe-buffer": "~5.1.0"
}
},
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/easy-table": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.2.0.tgz",
+ "integrity": "sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "optionalDependencies": {
+ "wcwidth": "^1.0.1"
+ }
+ },
"node_modules/ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -20485,6 +20824,7 @@
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
"integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+ "dev": true,
"dependencies": {
"stackframe": "^1.3.4"
}
@@ -22071,21 +22411,6 @@
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
"dev": true
},
- "node_modules/fast-loops": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz",
- "integrity": "sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g=="
- },
- "node_modules/fast-shallow-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz",
- "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw=="
- },
- "node_modules/fastest-stable-stringify": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz",
- "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q=="
- },
"node_modules/fastq": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
@@ -22260,13 +22585,6 @@
"node": ">=12"
}
},
- "node_modules/file-uri-to-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
- "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
- "dev": true,
- "optional": true
- },
"node_modules/filelist": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
@@ -22305,6 +22623,21 @@
"node": ">=8"
}
},
+ "node_modules/filter-iterator": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/filter-iterator/-/filter-iterator-0.0.1.tgz",
+ "integrity": "sha512-v4lhL7Qa8XpbW3LN46CEnmhGk3eHZwxfNl5at20aEkreesht4YKb/Ba3BUIbnPhAC/r3dmu7ABaGk6MAvh2alA==",
+ "dev": true
+ },
+ "node_modules/filter-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
+ "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/finalhandler": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
@@ -22922,19 +23255,6 @@
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
},
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -23383,6 +23703,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/has-own-property": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-own-property/-/has-own-property-0.1.0.tgz",
+ "integrity": "sha512-14qdBKoonU99XDhWcFKZTShK+QV47qU97u8zzoVo9cL5TZ3BmBHXogItSt9qJjR0KUMFRhcCW8uGIGl8nkl7Aw==",
+ "dev": true
+ },
"node_modules/has-property-descriptors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
@@ -24019,11 +24345,6 @@
"node": ">=8.12.0"
}
},
- "node_modules/hyphenate-style-name": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
- "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
- },
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -24053,6 +24374,12 @@
"resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
"integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="
},
+ "node_modules/identity-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/identity-function/-/identity-function-1.0.0.tgz",
+ "integrity": "sha512-kNrgUK0qI+9qLTBidsH85HjDLpZfrrS0ElquKKe/fJFdB3D7VeKdXXEvOPDUHSHOzdZKCAAaQIWWyp0l2yq6pw==",
+ "dev": true
+ },
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@@ -24293,15 +24620,6 @@
"resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
"integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
},
- "node_modules/inline-style-prefixer": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz",
- "integrity": "sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==",
- "dependencies": {
- "css-in-js-utils": "^3.1.0",
- "fast-loops": "^1.1.3"
- }
- },
"node_modules/install": {
"version": "0.13.0",
"resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz",
@@ -24784,6 +25102,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-iterable": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-iterable/-/is-iterable-1.1.1.tgz",
+ "integrity": "sha512-EdOZCr0NsGE00Pot+x1ZFx9MJK3C6wy91geZpXwvwexDLJvA4nzYyZf7r+EIwSeVsOLDdBz7ATg9NqKTzuNYuQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
"node_modules/is-map": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
@@ -25290,6 +25617,24 @@
"node": ">=8"
}
},
+ "node_modules/iterable-lookahead": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/iterable-lookahead/-/iterable-lookahead-1.0.0.tgz",
+ "integrity": "sha512-hJnEP2Xk4+44DDwJqUQGdXal5VbyeWLaPyDl2AQc242Zr7iqz4DgpQOrEzglWVMGHMDCkguLHEKxd1+rOsmgSQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/iterable-transform-replace": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/iterable-transform-replace/-/iterable-transform-replace-1.2.0.tgz",
+ "integrity": "sha512-AVCCj7CTUifWQ0ubraDgx5/e6tOWaL5qh/C8BDTjH0GuhNyFMCSsSmDtYpa4Y3ReAAQNSjUWfQ+ojhmjX10pdQ==",
+ "dev": true,
+ "dependencies": {
+ "curry": "^1.2.0"
+ }
+ },
"node_modules/iterate-iterator": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz",
@@ -25312,6 +25657,24 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/jackspeak": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz",
+ "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
"node_modules/jake": {
"version": "10.8.6",
"resolved": "https://registry.npmjs.org/jake/-/jake-10.8.6.tgz",
@@ -28318,10 +28681,14 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/js-cookie": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
- "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
+ "node_modules/jiti": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz",
+ "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
},
"node_modules/js-sdsl": {
"version": "4.4.0",
@@ -28823,6 +29190,123 @@
"node": ">= 8"
}
},
+ "node_modules/knip": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/knip/-/knip-2.11.0.tgz",
+ "integrity": "sha512-hpnSXW3fbQQBB6QD/6qo/3npJ4Pwsk7HKCye2rwnf/FD7qrXWWgSW/ZqLr6BIzR+R0GcKkNfaLINY4tF31t4mw==",
+ "dev": true,
+ "dependencies": {
+ "@npmcli/map-workspaces": "^3.0.4",
+ "@snyk/github-codeowners": "^1.1.0",
+ "bash-parser": "^0.5.0",
+ "chalk": "^5.2.0",
+ "easy-table": "^1.2.0",
+ "fast-glob": "^3.2.12",
+ "globby": "^13.1.3",
+ "jiti": "1.18.2",
+ "js-yaml": "^4.1.0",
+ "micromatch": "^4.0.5",
+ "minimist": "^1.2.8",
+ "pretty-ms": "^8.0.0",
+ "strip-json-comments": "^5.0.0",
+ "summary": "^2.1.0",
+ "typescript": "^5.0.2",
+ "zod": "^3.20.6",
+ "zod-validation-error": "1.3.0"
+ },
+ "bin": {
+ "knip": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=16.17.0 <17 || >=18.6.0"
+ }
+ },
+ "node_modules/knip/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/knip/node_modules/chalk": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
+ "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/knip/node_modules/globby": {
+ "version": "13.1.4",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz",
+ "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==",
+ "dev": true,
+ "dependencies": {
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.11",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/knip/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/knip/node_modules/slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/knip/node_modules/strip-json-comments": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz",
+ "integrity": "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/knip/node_modules/typescript": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz",
+ "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
"node_modules/language-subtag-registry": {
"version": "0.3.22",
"resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
@@ -28962,11 +29446,6 @@
"uc.micro": "^1.0.1"
}
},
- "node_modules/linkifyjs": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.1.tgz",
- "integrity": "sha512-zFN/CTVmbcVef+WaDXT63dNzzkfRBKT1j464NJQkV7iSgJU0sLBus9W0HBwnXK13/hf168pbrx/V/bjEHOXNHA=="
- },
"node_modules/listr2": {
"version": "3.14.0",
"resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
@@ -29541,11 +30020,12 @@
}
},
"node_modules/magic-string": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
- "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.16.0.tgz",
+ "integrity": "sha512-c4BEos3y6G2qO0B9X7K0FVLOPT9uGrjYwYRLFmDqyl5YMboUviyecnXWp94fJTSMwPw2/sf+CEYt5AGpmklkkQ==",
+ "dev": true,
"dependencies": {
- "sourcemap-codec": "^1.4.8"
+ "vlq": "^0.2.1"
}
},
"node_modules/make-dir": {
@@ -29615,6 +30095,19 @@
"node": ">=0.10.0"
}
},
+ "node_modules/map-iterable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-iterable/-/map-iterable-1.0.1.tgz",
+ "integrity": "sha512-siKFftph+ka2jWt8faiOWFzKP+eEuXrHuhYBitssJ5zJm209FCw5JBnaNLDiaCCb/CYZmxprdM6P7p16nA6YRA==",
+ "dev": true,
+ "dependencies": {
+ "curry": "^1.2.0",
+ "is-iterable": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/map-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
@@ -30092,11 +30585,6 @@
"url": "https://opencollective.com/unified"
}
},
- "node_modules/mdn-data": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
- "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
- },
"node_modules/mdurl": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
@@ -31437,32 +31925,6 @@
"npm": ">=5"
}
},
- "node_modules/nan": {
- "version": "2.17.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
- "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
- "dev": true,
- "optional": true
- },
- "node_modules/nano-css": {
- "version": "5.3.5",
- "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.5.tgz",
- "integrity": "sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==",
- "dependencies": {
- "css-tree": "^1.1.2",
- "csstype": "^3.0.6",
- "fastest-stable-stringify": "^2.0.2",
- "inline-style-prefixer": "^6.0.0",
- "rtl-css-js": "^1.14.0",
- "sourcemap-codec": "^1.4.8",
- "stacktrace-js": "^2.0.2",
- "stylis": "^4.0.6"
- },
- "peerDependencies": {
- "react": "*",
- "react-dom": "*"
- }
- },
"node_modules/nanoid": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
@@ -31782,60 +32244,6 @@
"next": ">= 11.0.1"
}
},
- "node_modules/next-with-workbox": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/next-with-workbox/-/next-with-workbox-3.0.5.tgz",
- "integrity": "sha512-IsCIrYCLtuF4HQaIQKudn9KaCUvvSNByp9v2YiLnSPmxQJ9SymeynDsyQU22m6WXBpi4nr1gCViSZmk5CSHB/A==",
- "dependencies": {
- "clean-webpack-plugin": "^4.0.0",
- "glob": "^8.0.3",
- "workbox-webpack-plugin": "^6.5.3"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "next": ">=10",
- "workbox-window": ">=5"
- }
- },
- "node_modules/next-with-workbox/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/next-with-workbox/node_modules/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/next-with-workbox/node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/next/node_modules/postcss": {
"version": "8.4.14",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
@@ -32266,6 +32674,15 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/npm-normalize-package-bin": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz",
+ "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==",
+ "dev": true,
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/npm-run-path": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
@@ -35597,6 +36014,21 @@
"node": ">= 0.4"
}
},
+ "node_modules/object-pairs": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-pairs/-/object-pairs-0.1.0.tgz",
+ "integrity": "sha512-3ECr6K831I4xX/Mduxr9UC+HPOz/d6WKKYj9p4cmC8Lg8p7g8gitzsxNX5IWlSIgFWN/a4JgrJaoAMKn20oKwA==",
+ "dev": true
+ },
+ "node_modules/object-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/object-values/-/object-values-1.0.0.tgz",
+ "integrity": "sha512-+8hwcz/JnQ9EpLIXzN0Rs7DLsBpJNT/xYehtB/jU93tHYr5BFEO8E+JGQNOSqE7opVzz5cGksKFHt7uUJVLSjQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/object-visit": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
@@ -36321,6 +36753,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/parse-ms": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz",
+ "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/parse-node-version": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
@@ -36420,6 +36864,40 @@
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
+ "node_modules/path-scurry": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz",
+ "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^9.1.1",
+ "minipass": "^5.0.0 || ^6.0.2"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz",
+ "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==",
+ "dev": true,
+ "engines": {
+ "node": "14 || >=16.14"
+ }
+ },
+ "node_modules/path-scurry/node_modules/minipass": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz",
+ "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
"node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
@@ -36928,6 +37406,21 @@
"node": ">= 0.8"
}
},
+ "node_modules/pretty-ms": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz",
+ "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==",
+ "dev": true,
+ "dependencies": {
+ "parse-ms": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/private": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
@@ -38072,27 +38565,6 @@
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
- "node_modules/react-chartkick": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/react-chartkick/-/react-chartkick-0.5.3.tgz",
- "integrity": "sha512-HOAONZ8PunkemVpAXzbDz8eOSpyY1H5MARRvPsF8ZVWmiVMkDsJeo12PcLuBiZzVhQ1FCL4sABV9AyfbO5coUA==",
- "dependencies": {
- "chartkick": "^4.0.0"
- },
- "peerDependencies": {
- "react": "*",
- "react-dom": "*"
- }
- },
- "node_modules/react-crossfade-img": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/react-crossfade-img/-/react-crossfade-img-1.0.0.tgz",
- "integrity": "sha512-7RG0rvTBA/K7EWcDPzIwEqUzJgoX3+YvrGghxxoqT3xG8onyzVUNenG2WCQ/hzdhT2mIU8e7UD5C0GKS/iyMww==",
- "peerDependencies": {
- "react": ">=16.8.0",
- "react-dom": ">=16.8.0"
- }
- },
"node_modules/react-docgen": {
"version": "5.4.3",
"resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-5.4.3.tgz",
@@ -38394,40 +38866,6 @@
"throttle-debounce": "^3.0.1"
}
},
- "node_modules/react-universal-interface": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz",
- "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==",
- "peerDependencies": {
- "react": "*",
- "tslib": "*"
- }
- },
- "node_modules/react-use": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.4.0.tgz",
- "integrity": "sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==",
- "dependencies": {
- "@types/js-cookie": "^2.2.6",
- "@xobotyi/scrollbar-width": "^1.9.5",
- "copy-to-clipboard": "^3.3.1",
- "fast-deep-equal": "^3.1.3",
- "fast-shallow-equal": "^1.0.0",
- "js-cookie": "^2.2.1",
- "nano-css": "^5.3.1",
- "react-universal-interface": "^0.6.2",
- "resize-observer-polyfill": "^1.5.1",
- "screenfull": "^5.1.0",
- "set-harmonic-interval": "^1.0.1",
- "throttle-debounce": "^3.0.1",
- "ts-easing": "^0.2.0",
- "tslib": "^2.1.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
- }
- },
"node_modules/react-virtuoso": {
"version": "4.3.6",
"resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.3.6.tgz",
@@ -38440,6 +38878,28 @@
"react-dom": ">=16 || >=17 || >= 18"
}
},
+ "node_modules/read-package-json-fast": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz",
+ "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==",
+ "dev": true,
+ "dependencies": {
+ "json-parse-even-better-errors": "^3.0.0",
+ "npm-normalize-package-bin": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz",
+ "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==",
+ "dev": true,
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/read-pkg": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
@@ -39372,6 +39832,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/reverse-arguments": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/reverse-arguments/-/reverse-arguments-1.0.0.tgz",
+ "integrity": "sha512-/x8uIPdTafBqakK0TmPNJzgkLP+3H+yxpUJhCQHsLBg1rYEVNR2D8BRYNWQhVBjyOd7oo1dZRVzIkwMY2oqfYQ==",
+ "dev": true
+ },
"node_modules/rfdc": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
@@ -39487,14 +39953,6 @@
"node": "6.* || >= 7.*"
}
},
- "node_modules/rtl-css-js": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz",
- "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==",
- "dependencies": {
- "@babel/runtime": "^7.1.2"
- }
- },
"node_modules/run-applescript": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz",
@@ -40086,17 +40544,6 @@
"url": "https://opencollective.com/webpack"
}
},
- "node_modules/screenfull": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz",
- "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==",
- "engines": {
- "node": ">=0.10.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/scroll-into-view-if-needed": {
"version": "2.2.31",
"resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
@@ -40238,14 +40685,6 @@
"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
"dev": true
},
- "node_modules/set-harmonic-interval": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz",
- "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==",
- "engines": {
- "node": ">=6.9"
- }
- },
"node_modules/set-value": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
@@ -40396,6 +40835,12 @@
"node": ">=8"
}
},
+ "node_modules/shell-quote-word": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/shell-quote-word/-/shell-quote-word-1.0.1.tgz",
+ "integrity": "sha512-lT297f1WLAdq0A4O+AknIFRP6kkiI3s8C913eJ0XqBxJbZPGWUNkRQk2u8zk4bEAjUJ5i+fSLwB6z1HzeT+DEg==",
+ "dev": true
+ },
"node_modules/shelljs": {
"version": "0.8.5",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
@@ -41111,14 +41556,6 @@
"deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
"dev": true
},
- "node_modules/stack-generator": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz",
- "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==",
- "dependencies": {
- "stackframe": "^1.3.4"
- }
- },
"node_modules/stack-utils": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
@@ -41143,34 +41580,8 @@
"node_modules/stackframe": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
- "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="
- },
- "node_modules/stacktrace-gps": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz",
- "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==",
- "dependencies": {
- "source-map": "0.5.6",
- "stackframe": "^1.3.4"
- }
- },
- "node_modules/stacktrace-gps/node_modules/source-map": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
- "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/stacktrace-js": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz",
- "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==",
- "dependencies": {
- "error-stack-parser": "^2.0.6",
- "stack-generator": "^2.0.5",
- "stacktrace-gps": "^3.0.4"
- }
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
+ "dev": true
},
"node_modules/state-toggle": {
"version": "1.0.3",
@@ -41567,12 +41978,39 @@
"node": ">=8"
}
},
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
"node_modules/string-width/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
+ "node_modules/string.fromcodepoint": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz",
+ "integrity": "sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==",
+ "dev": true
+ },
"node_modules/string.prototype.matchall": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
@@ -41724,6 +42162,19 @@
"node": ">=8"
}
},
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-bom": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
@@ -41955,7 +42406,14 @@
"node_modules/stylis": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
- "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
+ "dev": true
+ },
+ "node_modules/summary": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/summary/-/summary-2.1.0.tgz",
+ "integrity": "sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==",
+ "dev": true
},
"node_modules/supports-color": {
"version": "5.5.0",
@@ -42433,6 +42891,7 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz",
"integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==",
+ "dev": true,
"engines": {
"node": ">=10"
}
@@ -42569,6 +43028,12 @@
"node": ">=4"
}
},
+ "node_modules/to-no-case": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz",
+ "integrity": "sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==",
+ "dev": true
+ },
"node_modules/to-object-path": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
@@ -42599,6 +43064,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/to-pascal-case": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-pascal-case/-/to-pascal-case-1.0.0.tgz",
+ "integrity": "sha512-QGMWHqM6xPrcQW57S23c5/3BbYb0Tbe9p+ur98ckRnGDwD4wbbtDiYI38CfmMKNB5Iv0REjs5SNDntTwvDxzZA==",
+ "dev": true,
+ "dependencies": {
+ "to-space-case": "^1.0.0"
+ }
+ },
"node_modules/to-readable-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
@@ -42634,6 +43108,15 @@
"node": ">=8.0"
}
},
+ "node_modules/to-space-case": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-1.0.0.tgz",
+ "integrity": "sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA==",
+ "dev": true,
+ "dependencies": {
+ "to-no-case": "^1.0.0"
+ }
+ },
"node_modules/toggle-selection": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
@@ -42675,6 +43158,15 @@
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
"dev": true
},
+ "node_modules/transform-spread-iterable": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/transform-spread-iterable/-/transform-spread-iterable-1.4.1.tgz",
+ "integrity": "sha512-/GnF26X3zC8wfWyRzvuXX/Vb31TrU3Rwipmr4MC5hTi6X/yOXxXUSw4+pcHmKJ2+0KRrcS21YWZw77ukhVJBdQ==",
+ "dev": true,
+ "dependencies": {
+ "curry": "^1.2.0"
+ }
+ },
"node_modules/treeify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz",
@@ -42739,11 +43231,6 @@
"node": ">=6.10"
}
},
- "node_modules/ts-easing": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
- "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
- },
"node_modules/ts-jest": {
"version": "29.1.0",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz",
@@ -43150,6 +43637,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/unescape-js": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/unescape-js/-/unescape-js-1.1.4.tgz",
+ "integrity": "sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g==",
+ "dev": true,
+ "dependencies": {
+ "string.fromcodepoint": "^0.2.1"
+ }
+ },
"node_modules/unfetch": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz",
@@ -44052,6 +44548,12 @@
"global": "^4.3.1"
}
},
+ "node_modules/vlq": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
+ "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
+ "dev": true
+ },
"node_modules/vm-browserify": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
@@ -44216,25 +44718,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/watchpack-chokidar2/node_modules/fsevents": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
- "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
- "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "dependencies": {
- "bindings": "^1.5.0",
- "nan": "^2.12.1"
- },
- "engines": {
- "node": ">= 4.0"
- }
- },
"node_modules/watchpack-chokidar2/node_modules/glob-parent": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
@@ -44402,6 +44885,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
"node_modules/web-namespaces": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz",
@@ -44603,6 +45096,82 @@
}
}
},
+ "node_modules/webpack-deadcode-plugin": {
+ "version": "0.1.17",
+ "resolved": "https://registry.npmjs.org/webpack-deadcode-plugin/-/webpack-deadcode-plugin-0.1.17.tgz",
+ "integrity": "sha512-m57+nCO3wYa/QEJiJNUTE2OpRZj6DY6dbf4G4h9rFyNiq0g1XBH05O09UAJoXyqedv7Dfvqp+YeratTDRuqQuA==",
+ "dependencies": {
+ "chalk": "^3.0.0",
+ "fast-glob": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=6.11.5"
+ },
+ "peerDependencies": {
+ "webpack": "> 3"
+ }
+ },
+ "node_modules/webpack-deadcode-plugin/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/webpack-deadcode-plugin/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/webpack-deadcode-plugin/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/webpack-deadcode-plugin/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/webpack-deadcode-plugin/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/webpack-deadcode-plugin/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/webpack-dev-middleware": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.3.0.tgz",
@@ -45131,6 +45700,57 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
"node_modules/wrap-ansi/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -45313,6 +45933,27 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/zod": {
+ "version": "3.21.4",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz",
+ "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-validation-error": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-1.3.0.tgz",
+ "integrity": "sha512-4WoQnuWnj06kwKR4A+cykRxFmy+CTvwMQO5ogTXLiVx1AuvYYmMjixh7sbkSsQTr1Fvtss6d5kVz8PGeMPUQjQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "zod": "^3.18.0"
+ }
+ },
"node_modules/zwitch": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
diff --git a/web/package.json b/web/package.json
index be8fe7d1b..20dd47f3c 100644
--- a/web/package.json
+++ b/web/package.json
@@ -26,31 +26,25 @@
"@uiw/react-codemirror": "4.19.16",
"@xstate/react": "3.2.2",
"antd": "4.24.10",
- "autoprefixer": "10.4.14",
+ "autoprefixer": "^10.4.14",
"chart.js": "^4.2.0",
"classnames": "2.3.2",
"date-fns": "^2.29.3",
"interweave": "^13.0.0",
"interweave-autolink": "^5.1.0",
- "linkifyjs": "^4.1.0",
"lodash": "4.17.21",
"next": "13.3.0",
"next-pwa": "^5.6.0",
"next-with-less": "2.0.5",
- "next-with-workbox": "^3.0.5",
"picmo": "5.8.4",
"postcss-flexbugs-fixes": "5.0.2",
- "prop-types": "15.8.1",
"react": "18.2.0",
"react-chartjs-2": "^5.2.0",
- "react-chartkick": "^0.5.3",
- "react-crossfade-img": "1.0.0",
"react-dom": "18.2.0",
"react-error-boundary": "^4.0.0",
"react-hotkeys-hook": "4.4.0",
"react-linkify": "1.0.0-alpha",
"react-markdown": "8.0.7",
- "react-use": "^17.4.0",
"react-virtuoso": "4.3.6",
"recoil": "0.7.7",
"sharp": "0.32.1",
@@ -58,6 +52,7 @@
"slate-react": "0.94.2",
"ua-parser-js": "1.0.35",
"video.js": "^8.3.0",
+ "webpack-deadcode-plugin": "^0.1.17",
"workbox-precaching": "^6.5.4",
"workbox-window": "^6.5.4",
"xstate": "4.37.2",
@@ -101,7 +96,7 @@
"eslint-config-airbnb": "19.0.4",
"eslint-config-next": "13.3.0",
"eslint-config-prettier": "8.8.0",
- "eslint-plugin-import": "2.27.5",
+ "eslint-plugin-import": "^2.27.5",
"eslint-plugin-jsx-a11y": "6.7.1",
"eslint-plugin-prettier": "4.2.1",
"eslint-plugin-react": "7.32.2",
@@ -110,6 +105,7 @@
"handlebars": "^4.7.7",
"html-webpack-plugin": "5.5.1",
"install": "^0.13.0",
+ "knip": "^2.11.0",
"less": "4.1.3",
"less-loader": "11.1.0",
"mdx-mermaid": "^1.3.2",
diff --git a/web/pages/admin/access-tokens.tsx b/web/pages/admin/access-tokens.tsx
index f12b3f56c..2ba93afa8 100644
--- a/web/pages/admin/access-tokens.tsx
+++ b/web/pages/admin/access-tokens.tsx
@@ -189,7 +189,7 @@ const AccessTokens = () => {
{
title: '',
key: 'delete',
- render: (text, record) => (
+ render: (_, record) => (
handleDeleteToken(record.accessToken)} icon={} />
diff --git a/web/pages/admin/actions.tsx b/web/pages/admin/actions.tsx
index 305268d41..135d48ce7 100644
--- a/web/pages/admin/actions.tsx
+++ b/web/pages/admin/actions.tsx
@@ -256,7 +256,7 @@ const Actions = () => {
});
}
- async function handleDelete(action, index) {
+ async function handleDelete(index) {
const actionsData = [...actions];
actionsData.splice(index, 1);
@@ -269,7 +269,7 @@ const Actions = () => {
}
async function handleSave(
- oldAction: ExternalAction | null,
+ _oldAction: ExternalAction | null,
oldActionIndex: number,
url: string,
html: string,
@@ -353,9 +353,9 @@ const Actions = () => {
{
title: '',
key: 'delete-edit',
- render: (text, record, index) => (
+ render: (_, record, index) => (
- handleDelete(record, index)} icon={} />
+ handleDelete(index)} icon={} />
handleEdit(record, index)} icon={} />
),
@@ -374,7 +374,7 @@ const Actions = () => {
title: 'URL / Embed',
key: 'url',
dataIndex: 'url',
- render: (text, record) => (record.html ? 'HTML embed' : record.url),
+ render: (_, record) => (record.html ? 'HTML embed' : record.url),
},
{
title: 'Icon',
diff --git a/web/pages/admin/chat/emojis.tsx b/web/pages/admin/chat/emojis.tsx
index 8d9012920..b014a9539 100644
--- a/web/pages/admin/chat/emojis.tsx
+++ b/web/pages/admin/chat/emojis.tsx
@@ -12,9 +12,10 @@ import {
STATUS_SUCCESS,
} from '../../../utils/input-statuses';
import { RESET_TIMEOUT } from '../../../utils/config-constants';
-import { URL_CUSTOM_EMOJIS } from '../../../utils/constants';
import { AdminLayout } from '../../../components/layouts/AdminLayout';
+const URL_CUSTOM_EMOJIS = `/api/emoji`;
+
const { Meta } = Card;
// Lazy loaded components
diff --git a/web/pages/admin/config-notify.tsx b/web/pages/admin/config-notify.tsx
index 8b67fecaf..3e68d10d1 100644
--- a/web/pages/admin/config-notify.tsx
+++ b/web/pages/admin/config-notify.tsx
@@ -2,9 +2,9 @@ import { Alert, Button, Col, Row, Typography } from 'antd';
import React, { ReactElement, useContext, useEffect, useState } from 'react';
import Link from 'next/link';
-import Discord from '../../components/admin/notification/discord';
-import Browser from '../../components/admin/notification/browser';
-import Federation from '../../components/admin/notification/federation';
+import { DiscordNotify as Discord } from '../../components/admin/notification/discord';
+import { BrowserNotify as Browser } from '../../components/admin/notification/browser';
+import { FediverseNotify as Federation } from '../../components/admin/notification/federation';
import {
TextFieldWithSubmit,
TEXTFIELD_TYPE_URL,
diff --git a/web/pages/admin/webhooks.tsx b/web/pages/admin/webhooks.tsx
index 2f9f57225..19a997fc7 100644
--- a/web/pages/admin/webhooks.tsx
+++ b/web/pages/admin/webhooks.tsx
@@ -195,7 +195,7 @@ const Webhooks = () => {
{
title: '',
key: 'delete',
- render: (text, record) => (
+ render: (_, record) => (
handleDelete(record.id)} icon={} />
diff --git a/web/services/notifications-service.ts b/web/services/notifications-service.ts
index 31513481f..ed7a7da1f 100644
--- a/web/services/notifications-service.ts
+++ b/web/services/notifications-service.ts
@@ -13,10 +13,6 @@ export async function saveNotificationRegistration(channel, destination, accessT
await fetch(`${URL_REGISTER_NOTIFICATION}?accessToken=${accessToken}`, options);
}
-export function isPushNotificationSupported() {
- return 'serviceWorker' in navigator && 'PushManager' in window;
-}
-
function urlBase64ToUint8Array(base64String: string) {
const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
diff --git a/web/tests/streamkeys.test.ts b/web/tests/streamkeys.test.ts
index 44cb1452e..076184307 100644
--- a/web/tests/streamkeys.test.ts
+++ b/web/tests/streamkeys.test.ts
@@ -1,4 +1,5 @@
import { generateRndKey } from '../components/admin/config/server/StreamKeys';
+
describe('generateRndKey', () => {
test('should generate a key that matches the regular expression', () => {
const key = generateRndKey();
diff --git a/web/tsconfig.json b/web/tsconfig.json
index b8d597880..c04074448 100644
--- a/web/tsconfig.json
+++ b/web/tsconfig.json
@@ -13,8 +13,10 @@
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
- "incremental": true
+ "incremental": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
},
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "utils/constants.js"],
"exclude": ["node_modules"]
}
diff --git a/web/utils/alert-message-context.tsx b/web/utils/alert-message-context.tsx
index 4ffb55884..8a1f6ff59 100644
--- a/web/utils/alert-message-context.tsx
+++ b/web/utils/alert-message-context.tsx
@@ -2,8 +2,7 @@ import React, { useState, FC, ReactElement } from 'react';
export const AlertMessageContext = React.createContext({
message: null,
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- setMessage: (text?: string) => null,
+ setMessage: (_text?: string) => null,
});
export type AlertMessageProviderProps = {
diff --git a/web/utils/apis.ts b/web/utils/apis.ts
index b18148eb5..99878b69e 100644
--- a/web/utils/apis.ts
+++ b/web/utils/apis.ts
@@ -10,12 +10,6 @@ export const FETCH_INTERVAL = 15000;
// Current inbound broadcaster info
export const STATUS = `${API_LOCATION}status`;
-// Disconnect inbound stream
-export const DISCONNECT = `${API_LOCATION}disconnect`;
-
-// Change the current streaming key in memory
-export const STREAMKEY_CHANGE = `${API_LOCATION}changekey`;
-
// Current server config
export const SERVER_CONFIG = `${API_LOCATION}serverconfig`;
@@ -91,9 +85,6 @@ export const CREATE_WEBHOOK = `${API_LOCATION}webhooks/create`;
// hard coded social icons list
export const SOCIAL_PLATFORMS_LIST = `${NEXT_PUBLIC_API_HOST}api/socialplatforms`;
-// set external action links
-export const EXTERNAL_ACTIONS = `${API_LOCATION}api/externalactions`;
-
// send a message to the fediverse
export const FEDERATION_MESSAGE_SEND = `${API_LOCATION}federation/send`;
@@ -119,8 +110,6 @@ export const UPDATE_STREAM_KEYS = `${API_LOCATION}config/streamkeys`;
export const API_YP_RESET = `${API_LOCATION}yp/reset`;
-export const TEMP_UPDATER_API = LOGS_ALL;
-
const GITHUB_RELEASE_URL = 'https://api.github.com/repos/owncast/owncast/releases/latest';
interface FetchOptions {
diff --git a/web/utils/config-constants.tsx b/web/utils/config-constants.tsx
index d3ce12aef..e0ef3dc23 100644
--- a/web/utils/config-constants.tsx
+++ b/web/utils/config-constants.tsx
@@ -3,7 +3,7 @@ import { fetchData, SERVER_CONFIG_UPDATE_URL } from './apis';
import { ApiPostArgs, VideoVariant, SocialHandle } from '../types/config-section';
import { DEFAULT_TEXTFIELD_URL_PATTERN } from './validators';
-export const TEXT_MAXLENGTH = 255;
+const TEXT_MAXLENGTH = 255;
export const RESET_TIMEOUT = 3000;
@@ -11,41 +11,42 @@ export const RESET_TIMEOUT = 3000;
export const API_CUSTOM_CONTENT = '/pagecontent';
export const API_CUSTOM_CSS_STYLES = '/customstyles';
export const API_CUSTOM_JAVASCRIPT = '/customjavascript';
-export const API_FFMPEG = '/ffmpegpath';
-export const API_INSTANCE_URL = '/serverurl';
-export const API_LOGO = '/logo';
-export const API_NSFW_SWITCH = '/nsfw';
-export const API_RTMP_PORT = '/rtmpserverport';
export const API_S3_INFO = '/s3';
-export const API_SERVER_SUMMARY = '/serversummary';
-export const API_SERVER_WELCOME_MESSAGE = '/welcomemessage';
export const API_SERVER_OFFLINE_MESSAGE = '/offlinemessage';
-export const API_SERVER_NAME = '/name';
export const API_SOCIAL_HANDLES = '/socialhandles';
-export const API_STREAM_KEY = '/adminpass';
-export const API_STREAM_TITLE = '/streamtitle';
-export const API_TAGS = '/tags';
-export const API_USERNAME = '/name';
export const API_VIDEO_SEGMENTS = '/video/streamlatencylevel';
export const API_VIDEO_VARIANTS = '/video/streamoutputvariants';
-export const API_WEB_PORT = '/webserverport';
export const API_YP_SWITCH = '/directoryenabled';
-export const API_HIDE_VIEWER_COUNT = '/hideviewercount';
-export const API_CHAT_DISABLE = '/chat/disable';
-export const API_CHAT_JOIN_MESSAGES_ENABLED = '/chat/joinmessagesenabled';
-export const API_CHAT_ESTABLISHED_MODE = '/chat/establishedusermode';
export const API_CHAT_FORBIDDEN_USERNAMES = '/chat/forbiddenusernames';
export const API_CHAT_SUGGESTED_USERNAMES = '/chat/suggestedusernames';
export const API_EXTERNAL_ACTIONS = '/externalactions';
export const API_VIDEO_CODEC = '/video/codec';
-export const API_SOCKET_HOST_OVERRIDE = '/sockethostoverride';
+
+const API_FFMPEG = '/ffmpegpath';
+const API_INSTANCE_URL = '/serverurl';
+const API_LOGO = '/logo';
+const API_NSFW_SWITCH = '/nsfw';
+const API_RTMP_PORT = '/rtmpserverport';
+const API_SERVER_SUMMARY = '/serversummary';
+const API_SERVER_WELCOME_MESSAGE = '/welcomemessage';
+const API_SERVER_NAME = '/name';
+const API_STREAM_KEY = '/adminpass';
+const API_STREAM_TITLE = '/streamtitle';
+const API_TAGS = '/tags';
+const API_WEB_PORT = '/webserverport';
+const API_HIDE_VIEWER_COUNT = '/hideviewercount';
+const API_CHAT_DISABLE = '/chat/disable';
+const API_CHAT_JOIN_MESSAGES_ENABLED = '/chat/joinmessagesenabled';
+const API_CHAT_ESTABLISHED_MODE = '/chat/establishedusermode';
+
+const API_SOCKET_HOST_OVERRIDE = '/sockethostoverride';
// Federation
-export const API_FEDERATION_ENABLED = '/federation/enable';
-export const API_FEDERATION_PRIVATE = '/federation/private';
-export const API_FEDERATION_USERNAME = '/federation/username';
-export const API_FEDERATION_GOLIVE_MESSAGE = '/federation/livemessage';
-export const API_FEDERATION_SHOW_ENGAGEMENT = '/federation/showengagement';
+const API_FEDERATION_ENABLED = '/federation/enable';
+const API_FEDERATION_PRIVATE = '/federation/private';
+const API_FEDERATION_USERNAME = '/federation/username';
+const API_FEDERATION_GOLIVE_MESSAGE = '/federation/livemessage';
+const API_FEDERATION_SHOW_ENGAGEMENT = '/federation/showengagement';
export const API_FEDERATION_BLOCKED_DOMAINS = '/federation/blockdomains';
const TEXTFIELD_TYPE_URL = 'url';
@@ -467,10 +468,6 @@ export const DEFAULT_SOCIAL_HANDLE: SocialHandle = {
export const OTHER_SOCIAL_HANDLE_OPTION = 'OTHER_SOCIAL_HANDLE_OPTION';
-export const TEXTFIELD_PROPS_S3_COMMON = {
- maxLength: 255,
-};
-
export const S3_TEXT_FIELDS_INFO = {
accessKey: {
fieldName: 'accessKey',
diff --git a/web/utils/constants.js b/web/utils/constants.js
index b2642ffcd..043a45097 100644
--- a/web/utils/constants.js
+++ b/web/utils/constants.js
@@ -1,78 +1 @@
-// misc constants used throughout the app
-
-export const URL_STATUS = `/api/status`;
-export const URL_CHAT_HISTORY = `/api/chat`;
-export const URL_CUSTOM_EMOJIS = `/api/emoji`;
-export const URL_CONFIG = `/api/config`;
-export const URL_VIEWER_PING = `/api/ping`;
-
-// inline moderation actions
-export const URL_HIDE_MESSAGE = `/api/chat/messagevisibility`;
-export const URL_BAN_USER = `/api/chat/users/setenabled`;
-
-// TODO: This directory is customizable in the config. So we should expose this via the config API.
-export const URL_STREAM = `/hls/stream.m3u8`;
-// export const URL_WEBSOCKET = `${location.protocol === 'https:' ? 'wss' : 'ws'}://${
-// location.host
-// }/ws`;
-export const URL_CHAT_REGISTRATION = `/api/chat/register`;
-export const URL_FOLLOWERS = `/api/followers`;
-export const URL_PLAYBACK_METRICS = `/api/metrics/playback`;
-
-export const URL_REGISTER_NOTIFICATION = `/api/notifications/register`;
-export const URL_REGISTER_EMAIL_NOTIFICATION = `/api/notifications/register/email`;
-export const URL_CHAT_INDIEAUTH_BEGIN = `/api/auth/indieauth`;
-
-export const TIMER_STATUS_UPDATE = 5000; // ms
-export const TIMER_DISABLE_CHAT_AFTER_OFFLINE = 5 * 60 * 1000; // 5 mins
-export const TIMER_STREAM_DURATION_COUNTER = 1000;
-export const TEMP_IMAGE =
- 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
-
-export const OWNCAST_LOGO_LOCAL = '/img/logo.svg';
-
-export const MESSAGE_OFFLINE = 'Stream is offline.';
-export const MESSAGE_ONLINE = 'Stream is online.';
-
-export const URL_OWNCAST = 'https://owncast.online'; // used in footer
-export const PLAYER_VOLUME = 'owncast_volume';
-
-export const KEY_ACCESS_TOKEN = 'owncast_access_token';
-export const KEY_EMBED_CHAT_ACCESS_TOKEN = 'owncast_embed_chat_access_token';
-export const KEY_USERNAME = 'owncast_username';
-export const KEY_CUSTOM_USERNAME_SET = 'owncast_custom_username_set';
-export const KEY_CHAT_DISPLAYED = 'owncast_chat';
-export const KEY_CHAT_FIRST_MESSAGE_SENT = 'owncast_first_message_sent';
-export const CHAT_INITIAL_PLACEHOLDER_TEXT = 'Type here to chat, no account necessary.';
-export const CHAT_PLACEHOLDER_TEXT = 'Message';
-export const CHAT_PLACEHOLDER_OFFLINE = 'Chat is offline.';
-export const CHAT_MAX_MESSAGE_LENGTH = 500;
-export const EST_SOCKET_PAYLOAD_BUFFER = 512;
-export const CHAT_CHAR_COUNT_BUFFER = 20;
-export const CHAT_OK_KEYCODES = [
- 'ArrowLeft',
- 'ArrowUp',
- 'ArrowRight',
- 'ArrowDown',
- 'Shift',
- 'Meta',
- 'Alt',
- 'Delete',
- 'Backspace',
-];
-export const CHAT_KEY_MODIFIERS = ['Control', 'Shift', 'Meta', 'Alt'];
-export const MESSAGE_JUMPTOBOTTOM_BUFFER = 500;
-
-// app styling
-export const WIDTH_SINGLE_COL = 780;
-export const HEIGHT_SHORT_WIDE = 500;
-export const ORIENTATION_PORTRAIT = 'portrait';
-export const ORIENTATION_LANDSCAPE = 'landscape';
-
-// localstorage keys
-export const HAS_DISPLAYED_NOTIFICATION_MODAL_KEY = 'HAS_DISPLAYED_NOTIFICATION_MODAL';
-export const USER_VISIT_COUNT_KEY = 'USER_VISIT_COUNT';
-export const USER_DISMISSED_ANNOYING_NOTIFICATION_POPUP_KEY =
- 'USER_DISMISSED_ANNOYING_NOTIFICATION_POPUP_KEY';
-
export const DYNAMIC_PADDING_VALUE = '320px';
diff --git a/web/utils/format.ts b/web/utils/format.ts
index a69427af0..5dcadb382 100644
--- a/web/utils/format.ts
+++ b/web/utils/format.ts
@@ -20,7 +20,7 @@ export function isEmptyObject(obj) {
return !obj || (Object.keys(obj).length === 0 && obj.constructor === Object);
}
-export function padLeft(text, pad, size) {
+function padLeft(text, pad, size) {
return String(pad.repeat(size) + text).slice(-size);
}
@@ -42,13 +42,6 @@ export function parseSecondsToDurationString(seconds = 0) {
return daysString + hoursString + minString + secsString;
}
-export function makeAndStringFromArray(arr: string[]): string {
- if (arr.length === 1) return arr[0];
- const firsts = arr.slice(0, arr.length - 1);
- const last = arr[arr.length - 1];
- return `${firsts.join(', ')} and ${last}`;
-}
-
export function formatUAstring(uaString: string) {
const parser = UAParser(uaString);
const { device, os, browser } = parser;
diff --git a/web/utils/helpers.js b/web/utils/helpers.js
index d6354139c..bc89c25be 100644
--- a/web/utils/helpers.js
+++ b/web/utils/helpers.js
@@ -1,8 +1,3 @@
-// convert newlines to
s
-export function addNewlines(str) {
- return str.replace(/(?:\r\n|\r|\n)/g, '
');
-}
-
export function pluralize(string, count) {
if (count === 1) {
return string;
@@ -10,149 +5,11 @@ export function pluralize(string, count) {
return `${string}s`;
}
-// Trying to determine if browser is mobile/tablet.
-// Source: https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent
-export function hasTouchScreen() {
- let hasTouch = false;
- if ('maxTouchPoints' in navigator) {
- hasTouch = navigator.maxTouchPoints > 0;
- } else if ('msMaxTouchPoints' in navigator) {
- hasTouch = navigator.msMaxTouchPoints > 0;
- } else {
- const mQ = window.matchMedia && matchMedia('(pointer:coarse)');
- if (mQ && mQ.media === '(pointer:coarse)') {
- hasTouch = !!mQ.matches;
- } else if ('orientation' in window) {
- hasTouch = true; // deprecated, but good fallback
- } else {
- // Only as a last resort, fall back to user agent sniffing
- hasTouch = navigator.userAgentData.mobile;
- }
- }
- return hasTouch;
-}
-
-export function padLeft(text, pad, size) {
- return String(pad.repeat(size) + text).slice(-size);
-}
-
-export function parseSecondsToDurationString(seconds = 0) {
- const finiteSeconds = Number.isFinite(+seconds) ? Math.abs(seconds) : 0;
-
- const days = Math.floor(finiteSeconds / 86400);
- const daysString = days > 0 ? `${days} day${days > 1 ? 's' : ''} ` : '';
-
- const hours = Math.floor((finiteSeconds / 3600) % 24);
- const hoursString = hours || days ? padLeft(`${hours}:`, '0', 3) : '';
-
- const mins = Math.floor((finiteSeconds / 60) % 60);
- const minString = padLeft(`${mins}:`, '0', 3);
-
- const secs = Math.floor(finiteSeconds % 60);
- const secsString = padLeft(`${secs}`, '0', 2);
-
- return daysString + hoursString + minString + secsString;
-}
-
-export function setVHvar() {
- const vh = window.innerHeight * 0.01;
- // Then we set the value in the --vh custom property to the root of the document
- document.documentElement.style.setProperty('--vh', `${vh}px`);
-}
-
-export function doesObjectSupportFunction(object, functionName) {
- return typeof object[functionName] === 'function';
-}
-
-// return a string of css classes
-export function classNames(json) {
- const classes = [];
-
- Object.entries(json).map(item => {
- const [key, value] = item;
- if (value) {
- classes.push(key);
- }
- return null;
- });
- return classes.join(' ');
-}
-
-// taken from
-// https://medium.com/@TCAS3/debounce-deep-dive-javascript-es6-e6f8d983b7a1
-export function debounce(fn, time) {
- let timeout;
-
- return function () {
- // eslint-disable-next-line prefer-rest-params
- const functionCall = () => fn.apply(this, arguments);
-
- clearTimeout(timeout);
- timeout = setTimeout(functionCall, time);
- };
-}
-
export function getDiffInDaysFromNow(timestamp) {
const time = typeof timestamp === 'string' ? new Date(timestamp) : timestamp;
return (new Date() - time) / (24 * 3600 * 1000);
}
-// "Last live today at [time]" or "last live [date]"
-export function makeLastOnlineString(timestamp) {
- if (!timestamp) {
- return '';
- }
- let string = '';
- const time = new Date(timestamp);
- const comparisonDate = new Date(time).setHours(0, 0, 0, 0);
-
- if (comparisonDate === new Date().setHours(0, 0, 0, 0)) {
- const atTime = time.toLocaleTimeString([], {
- hour: '2-digit',
- minute: '2-digit',
- });
- string = `Today ${atTime}`;
- } else {
- string = time.toLocaleDateString();
- }
-
- return `Last live: ${string}`;
-}
-
-// Routing & Tabs
-export const ROUTE_RECORDINGS = 'recordings';
-export const ROUTE_SCHEDULE = 'schedule';
-// looks for `/recording|schedule/id` pattern to determine what to display from the tab view
-export function checkUrlPathForDisplay() {
- const pathTest = [ROUTE_RECORDINGS, ROUTE_SCHEDULE];
- const pathParts = window.location.pathname.split('/');
-
- if (pathParts.length >= 2) {
- const part = pathParts[1].toLowerCase();
- if (pathTest.includes(part)) {
- return {
- section: part,
- sectionId: pathParts[2] || '',
- };
- }
- }
- return null;
-}
-
-export function paginateArray(items, page, perPage) {
- const offset = perPage * (page - 1);
- const totalPages = Math.ceil(items.length / perPage);
- const paginatedItems = items.slice(offset, perPage * page);
-
- return {
- previousPage: page - 1 ? page - 1 : null,
- nextPage: totalPages > page ? page + 1 : null,
- total: items.length,
- totalPages,
- items: paginatedItems,
- };
-}
-
// Take a nested object of state metadata and merge it into
// a single flattened node.
export function mergeMeta(meta) {
diff --git a/web/utils/hook-windowresize.tsx b/web/utils/hook-windowresize.tsx
deleted file mode 100644
index 422b95c0d..000000000
--- a/web/utils/hook-windowresize.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import { useState, useEffect } from 'react';
-
-export default function useWindowSize() {
- // Initialize state with undefined width/height so server and client renders match
- // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/
- const [windowSize, setWindowSize] = useState({
- width: undefined,
- height: undefined,
- });
-
- useEffect(() => {
- // Handler to call on window resize
- function handleResize() {
- // Set window width/height to state
- setWindowSize({
- width: window.innerWidth,
- height: window.innerHeight,
- });
- }
-
- // Add event listener
- window.addEventListener('resize', handleResize);
-
- // Call handler right away so state gets updated with initial window size
- handleResize();
-
- // Remove event listener on cleanup
- return () => window.removeEventListener('resize', handleResize);
- }, []); // Empty array ensures that effect is only run on mount
-
- return windowSize;
-}
diff --git a/web/utils/input-statuses.tsx b/web/utils/input-statuses.tsx
index 283523c3b..8dc642571 100644
--- a/web/utils/input-statuses.tsx
+++ b/web/utils/input-statuses.tsx
@@ -18,14 +18,13 @@ const WarningOutlined = dynamic(() => import('@ant-design/icons/WarningOutlined'
ssr: false,
});
-export const STATUS_RESET_TIMEOUT = 3000;
-
export const STATUS_ERROR = 'error';
-export const STATUS_INVALID = 'invalid';
export const STATUS_PROCESSING = 'proessing';
export const STATUS_SUCCESS = 'success';
export const STATUS_WARNING = 'warning';
+const STATUS_INVALID = 'invalid';
+
export type InputStatusTypes = 'error' | 'invalid' | 'proessing' | 'success' | 'warning';
export interface StatusState {
@@ -37,7 +36,7 @@ interface InputStates {
[key: string]: StatusState;
}
-export const INPUT_STATES: InputStates = {
+const INPUT_STATES: InputStates = {
[STATUS_SUCCESS]: {
type: STATUS_SUCCESS,
icon: ,
diff --git a/web/utils/localStorage.ts b/web/utils/localStorage.ts
index 1de8e4c3d..831fc7101 100644
--- a/web/utils/localStorage.ts
+++ b/web/utils/localStorage.ts
@@ -7,7 +7,9 @@ export const LOCAL_STORAGE_KEYS = {
export function getLocalStorage(key) {
try {
return localStorage.getItem(key);
- } catch (e) {}
+ } catch (e) {
+ console.error(e);
+ }
return null;
}
@@ -19,31 +21,8 @@ export function setLocalStorage(key, value) {
localStorage.removeItem(key);
}
return true;
- } catch (e) {}
+ } catch (e) {
+ console.error(e);
+ }
return false;
}
-
-export function clearLocalStorage(key) {
- localStorage.removeItem(key);
-}
-
-// jump down to the max height of a div, with a slight delay
-export function jumpToBottom(element, behavior) {
- if (!element) return;
-
- if (!behavior) {
- behavior = document.visibilityState === 'visible' ? 'smooth' : 'instant';
- }
-
- setTimeout(
- () => {
- element.scrollTo({
- top: element.scrollHeight,
- left: 0,
- behavior,
- });
- },
- 50,
- element,
- );
-}
diff --git a/web/utils/server-status-context.tsx b/web/utils/server-status-context.tsx
index ffd73e955..70328f919 100644
--- a/web/utils/server-status-context.tsx
+++ b/web/utils/server-status-context.tsx
@@ -6,7 +6,7 @@ import { STATUS, fetchData, FETCH_INTERVAL, SERVER_CONFIG } from './apis';
import { ConfigDetails, UpdateArgs } from '../types/config-section';
import { DEFAULT_VARIANT_STATE } from './config-constants';
-export const initialServerConfigState: ConfigDetails = {
+const initialServerConfigState: ConfigDetails = {
streamKeys: [],
streamKeyOverridden: false,
adminPassword: '',
@@ -102,7 +102,7 @@ export const ServerStatusContext = React.createContext({
serverConfig: initialServerConfigState,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
- setFieldInConfigState: (args: UpdateArgs) => null,
+ setFieldInConfigState: (_args: UpdateArgs) => null,
});
export type ServerStatusProviderProps = {