diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 100% rename from .eslintrc.js rename to .eslintrc.cjs diff --git a/.lintstagedrc.bak b/.lintstagedrc.bak index 6de8a64b..33269023 100644 --- a/.lintstagedrc.bak +++ b/.lintstagedrc.bak @@ -1,6 +1,6 @@ { - "*.{js,ts,tsx,json,scss,css,html}": "prettier --write", + "*.{js,mjs,ts,tsx,json,scss,css,html}": "prettier --write", "package.json": "sort-package-json", "*.{scss,css}": "stylelint", - "*.{ts,tsx,js}": "eslint --fix" + "*.{ts,tsx,js,mjs}": "eslint --fix" } diff --git a/api/image.mjs b/api/image.mjs deleted file mode 100644 index 6311d618..00000000 --- a/api/image.mjs +++ /dev/null @@ -1,24 +0,0 @@ -import fetch from 'node-fetch' - -export default async function handler(req, res) { - const imageUrl = req.query.url - - if (!imageUrl) { - return res.status(400).send('Missing URL parameter') - } - - try { - const imageRes = await fetch(imageUrl) - - if (!imageRes.ok) { - return res.status(404).send('Image not found') - } - - res.setHeader('Content-Type', imageRes.headers.get('content-type')) - - imageRes.body.pipe(res) - } catch (err) { - console.error(err) - return res.status(404).send('Error') - } -} diff --git a/api/ssr.mjs b/api/ssr.mjs index 4a9d60d0..0d471d1f 100644 --- a/api/ssr.mjs +++ b/api/ssr.mjs @@ -1,13 +1,13 @@ -import { renderPage } from 'vite-plugin-ssr/server' +import { renderPage } from 'vike/server' export default async function handler(req, res) { const { url, cookies } = req const pageContext = await renderPage({ urlOriginal: url, cookies }) - const { httpResponse, errorWhileRendering } = pageContext + const { httpResponse, errorWhileRendering, is404 } = pageContext - if (errorWhileRendering) { + if (errorWhileRendering && !is404) { console.error(errorWhileRendering) res.statusCode = 500 res.end() diff --git a/package-lock.json b/package-lock.json index de732482..764b2f8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,16 +15,15 @@ "idb": "7.1.1", "intl-messageformat": "10.5.3", "just-throttle": "4.2.0", - "mailgun.js": "8.2.1", - "node-fetch": "3.3.1" + "mailgun.js": "8.2.1" }, "devDependencies": { "@babel/core": "7.21.8", - "@graphql-codegen/cli": "3.2.2", - "@graphql-codegen/typescript": "3.0.4", - "@graphql-codegen/typescript-operations": "3.0.4", - "@graphql-codegen/typescript-urql": "3.7.3", - "@graphql-codegen/urql-introspection": "2.2.1", + "@graphql-codegen/cli": "5.0.0", + "@graphql-codegen/typescript": "4.0.1", + "@graphql-codegen/typescript-operations": "4.0.1", + "@graphql-codegen/typescript-urql": "4.0.0", + "@graphql-codegen/urql-introspection": "3.0.0", "@graphql-tools/url-loader": "7.17.18", "@graphql-typed-document-node/core": "3.2.0", "@hocuspocus/provider": "2.0.6", @@ -69,27 +68,27 @@ "@tiptap/extension-text": "2.0.3", "@tiptap/extension-underline": "2.0.3", "@tiptap/extension-youtube": "2.0.3", - "@types/js-cookie": "3.0.4", - "@types/node": "20.1.1", - "@typescript-eslint/eslint-plugin": "6.7.3", - "@typescript-eslint/parser": "6.7.3", + "@types/js-cookie": "3.0.5", + "@types/node": "20.8.10", + "@typescript-eslint/eslint-plugin": "6.9.1", + "@typescript-eslint/parser": "6.9.1", "@urql/core": "3.2.2", "@urql/devtools": "2.0.3", - "babel-preset-solid": "1.7.4", + "babel-preset-solid": "1.8.4", "bootstrap": "5.3.2", "clsx": "2.0.0", "cross-env": "7.0.3", "debounce": "1.2.1", - "eslint": "8.50.0", + "eslint": "8.53.0", "eslint-config-stylelint": "20.0.0", "eslint-import-resolver-typescript": "3.6.1", - "eslint-plugin-import": "2.28.1", - "eslint-plugin-jest": "27.4.0", - "eslint-plugin-jsx-a11y": "6.7.1", + "eslint-plugin-import": "2.29.0", + "eslint-plugin-jest": "27.6.0", + "eslint-plugin-jsx-a11y": "6.8.0", "eslint-plugin-promise": "6.1.1", "eslint-plugin-solid": "0.13.0", - "eslint-plugin-sonarjs": "0.21.0", - "eslint-plugin-unicorn": "48.0.1", + "eslint-plugin-sonarjs": "0.23.0", + "eslint-plugin-unicorn": "49.0.0", "fast-deep-equal": "3.1.3", "graphql": "16.6.0", "graphql-tag": "2.12.6", @@ -100,7 +99,7 @@ "javascript-time-ago": "2.5.9", "jest": "29.7.0", "js-cookie": "3.0.5", - "lint-staged": "14.0.1", + "lint-staged": "15.0.2", "loglevel": "1.8.1", "loglevel-plugin-prefix": "0.8.4", "markdown-it": "13.0.1", @@ -110,30 +109,30 @@ "markdown-it-replace-link": "1.2.0", "nanostores": "0.7.4", "prettier": "3.0.3", - "prettier-eslint": "15.0.1", + "prettier-eslint": "16.1.2", "prosemirror-history": "1.3.0", "prosemirror-trailing-node": "2.0.3", "prosemirror-view": "1.30.2", "rollup": "3.21.6", - "sass": "1.68.0", - "solid-js": "1.7.5", + "sass": "1.69.5", + "solid-js": "1.8.5", "solid-popper": "0.3.0", "solid-tiptap": "0.6.0", - "solid-transition-group": "0.2.2", + "solid-transition-group": "0.2.3", "sort-package-json": "2.6.0", - "stylelint": "15.10.3", - "stylelint-config-standard-scss": "11.0.0", + "stylelint": "15.11.0", + "stylelint-config-standard-scss": "11.1.0", "stylelint-order": "6.0.3", - "stylelint-scss": "5.2.1", + "stylelint-scss": "5.3.0", "swiper": "9.4.1", "typescript": "5.2.2", "typograf": "7.1.0", "uniqolor": "1.1.0", - "vite": "4.3.9", + "vike": "0.4.144", + "vite": "4.5.0", "vite-plugin-mkcert": "1.16.0", "vite-plugin-sass-dts": "1.3.11", - "vite-plugin-solid": "2.7.0", - "vite-plugin-ssr": "0.4.123", + "vite-plugin-solid": "2.7.2", "y-prosemirror": "1.2.1", "yjs": "13.6.0" } @@ -459,12 +458,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -583,9 +582,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -731,9 +730,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -872,9 +871,9 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1410,19 +1409,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/generator": "^7.23.3", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1431,9 +1430,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -1468,6 +1467,12 @@ "integrity": "sha512-Lt/W5JsA75hcDJ2cOAlE4TqSMl6c9K+rXGRo/cU2fApnmhbRcNdkR4UHQDAwtWfZyUKWaxdwSui+jp+74J1pZg==", "dev": true }, + "node_modules/@brillout/require-shim": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@brillout/require-shim/-/require-shim-0.1.2.tgz", + "integrity": "sha512-3I4LRHnVZXoSAsEoni5mosq9l6eiJED58d9V954W4CIZ88AUfYBanWGBGbJG3NztaRTpFHEA6wB3Hn93BmmJdg==", + "dev": true + }, "node_modules/@brillout/vite-plugin-import-build": { "version": "0.2.20", "resolved": "https://registry.npmjs.org/@brillout/vite-plugin-import-build/-/vite-plugin-import-build-0.2.20.tgz", @@ -1940,9 +1945,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -1990,9 +1995,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2043,33 +2048,32 @@ } }, "node_modules/@graphql-codegen/cli": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-3.2.2.tgz", - "integrity": "sha512-u+dm/SW1heLnUL4Tyf5Uv0AxOFhTCmUPHKwRLq2yE8MPhv7+Ti4vxxUP/XGoaMNRuHlN37wLI7tpFLV1Hhm22Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-5.0.0.tgz", + "integrity": "sha512-A7J7+be/a6e+/ul2KI5sfJlpoqeqwX8EzktaKCeduyVKgOLA6W5t+NUGf6QumBDXU8PEOqXk3o3F+RAwCWOiqA==", "dev": true, "dependencies": { "@babel/generator": "^7.18.13", "@babel/template": "^7.18.10", "@babel/types": "^7.18.13", - "@graphql-codegen/core": "^3.1.0", - "@graphql-codegen/plugin-helpers": "^4.1.0", - "@graphql-tools/apollo-engine-loader": "^7.3.6", - "@graphql-tools/code-file-loader": "^7.3.17", - "@graphql-tools/git-loader": "^7.2.13", - "@graphql-tools/github-loader": "^7.3.20", - "@graphql-tools/graphql-file-loader": "^7.5.0", - "@graphql-tools/json-file-loader": "^7.4.1", - "@graphql-tools/load": "^7.8.0", - "@graphql-tools/prisma-loader": "^7.2.49", - "@graphql-tools/url-loader": "^7.13.2", - "@graphql-tools/utils": "^9.0.0", - "@parcel/watcher": "^2.1.0", + "@graphql-codegen/core": "^4.0.0", + "@graphql-codegen/plugin-helpers": "^5.0.1", + "@graphql-tools/apollo-engine-loader": "^8.0.0", + "@graphql-tools/code-file-loader": "^8.0.0", + "@graphql-tools/git-loader": "^8.0.0", + "@graphql-tools/github-loader": "^8.0.0", + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.0.0", + "@graphql-tools/prisma-loader": "^8.0.0", + "@graphql-tools/url-loader": "^8.0.0", + "@graphql-tools/utils": "^10.0.0", "@whatwg-node/fetch": "^0.8.0", "chalk": "^4.1.0", - "cosmiconfig": "^7.0.0", + "cosmiconfig": "^8.1.3", "debounce": "^1.2.0", "detect-indent": "^6.0.0", - "graphql-config": "^4.5.0", + "graphql-config": "^5.0.2", "inquirer": "^8.0.0", "is-glob": "^4.0.1", "jiti": "^1.17.1", @@ -2081,7 +2085,7 @@ "string-env-interpolation": "^1.0.1", "ts-log": "^2.2.3", "tslib": "^2.4.0", - "yaml": "^1.10.0", + "yaml": "^2.3.1", "yargs": "^17.0.0" }, "bin": { @@ -2091,7 +2095,279 @@ "graphql-codegen-esm": "esm/bin.js" }, "peerDependencies": { + "@parcel/watcher": "^2.1.0", "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/batch-execute": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.2.tgz", + "integrity": "sha512-Y2uwdZI6ZnatopD/SYfZ1eGuQFI7OU2KGZ2/B/7G9ISmgMl5K+ZZWz/PfIEXeiHirIDhyk54s4uka5rj2xwKqQ==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.5", + "dataloader": "^2.2.2", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/delegate": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.0.3.tgz", + "integrity": "sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw==", + "dev": true, + "dependencies": { + "@graphql-tools/batch-execute": "^9.0.1", + "@graphql-tools/executor": "^1.0.0", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.5", + "dataloader": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/executor": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.2.0.tgz", + "integrity": "sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "@graphql-typed-document-node/core": "3.2.0", + "@repeaterjs/repeater": "^3.0.4", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/executor-graphql-ws": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.1.0.tgz", + "integrity": "sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.2", + "@types/ws": "^8.0.0", + "graphql-ws": "^5.14.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/executor-http": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.0.3.tgz", + "integrity": "sha512-5WZIMBevRaxMabZ8U2Ty0dTUPy/PpeYSlMNEmC/YJjKKykgSfc/AwSejx2sE4FFKZ0I2kxRKRenyoWMHRAV49Q==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.2", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/fetch": "^0.9.0", + "extract-files": "^11.0.0", + "meros": "^1.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/fetch": { + "version": "0.9.14", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.14.tgz", + "integrity": "sha512-wurZC82zzZwXRDSW0OS9l141DynaJQh7Yt0FD1xZ8niX7/Et/7RoiLiltbVU1fSF1RR9z6ndEaTUQBAmddTm1w==", + "dev": true, + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.0", + "urlpattern-polyfill": "^9.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/executor-legacy-ws": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.4.tgz", + "integrity": "sha512-b7aGuRekZDS+m3af3BIvMKxu15bmVPMt5eGQVuP2v5pxmbaPTh+iv5mx9b3Plt32z5Ke5tycBnNm5urSFtW8ng==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "@types/ws": "^8.0.0", + "isomorphic-ws": "5.0.0", + "tslib": "^2.4.0", + "ws": "8.14.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/merge": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.0.tgz", + "integrity": "sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/schema": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.0.tgz", + "integrity": "sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg==", + "dev": true, + "dependencies": { + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/url-loader": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.0.tgz", + "integrity": "sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA==", + "dev": true, + "dependencies": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/delegate": "^10.0.0", + "@graphql-tools/executor-graphql-ws": "^1.0.0", + "@graphql-tools/executor-http": "^1.0.0", + "@graphql-tools/executor-legacy-ws": "^1.0.0", + "@graphql-tools/utils": "^10.0.0", + "@graphql-tools/wrap": "^10.0.0", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.9.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.11", + "ws": "^8.12.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/fetch": { + "version": "0.9.14", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.14.tgz", + "integrity": "sha512-wurZC82zzZwXRDSW0OS9l141DynaJQh7Yt0FD1xZ8niX7/Et/7RoiLiltbVU1fSF1RR9z6ndEaTUQBAmddTm1w==", + "dev": true, + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.0", + "urlpattern-polyfill": "^9.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/wrap": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.1.tgz", + "integrity": "sha512-Cw6hVrKGM2OKBXeuAGltgy4tzuqQE0Nt7t/uAqnuokSXZhMHXJUb124Bnvxc2gPZn5chfJSDafDe4Cp8ZAVJgg==", + "dev": true, + "dependencies": { + "@graphql-tools/delegate": "^10.0.3", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.0.tgz", + "integrity": "sha512-q76lDAafvHNGWedNAVHrz/EyYTS8qwRLcwne8SJQdRN5P3HydxU6XROFvJfTML6KZXQX2FDdGY4/SnaNyd7M0Q==", + "dev": true, + "dependencies": { + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "fast-url-parser": "^1.1.3", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@graphql-codegen/cli/node_modules/ansi-styles": { @@ -2143,6 +2419,18 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/@graphql-codegen/cli/node_modules/graphql-ws": { + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.14.2.tgz", + "integrity": "sha512-LycmCwhZ+Op2GlHz4BZDsUYHKRiiUz+3r9wbhBATMETNlORQJAaFlAgTFoeRh6xQoQegwYwIylVD1Qns9/DA3w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": ">=0.11 <=16" + } + }, "node_modules/@graphql-codegen/cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2164,21 +2452,79 @@ "node": ">=8" } }, + "node_modules/@graphql-codegen/cli/node_modules/urlpattern-polyfill": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz", + "integrity": "sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==", + "dev": true + }, "node_modules/@graphql-codegen/core": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-3.1.0.tgz", - "integrity": "sha512-DH1/yaR7oJE6/B+c6ZF2Tbdh7LixF1K8L+8BoSubjNyQ8pNwR4a70mvc1sv6H7qgp6y1bPQ9tKE+aazRRshysw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-4.0.0.tgz", + "integrity": "sha512-JAGRn49lEtSsZVxeIlFVIRxts2lWObR+OQo7V2LHDJ7ohYYw3ilv7nJ8pf8P4GTg/w6ptcYdSdVVdkI8kUHB/Q==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^4.1.0", - "@graphql-tools/schema": "^9.0.0", - "@graphql-tools/utils": "^9.1.1", + "@graphql-codegen/plugin-helpers": "^5.0.0", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.0", "tslib": "~2.5.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, + "node_modules/@graphql-codegen/core/node_modules/@graphql-tools/merge": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.0.tgz", + "integrity": "sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/core/node_modules/@graphql-tools/schema": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.0.tgz", + "integrity": "sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg==", + "dev": true, + "dependencies": { + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/core/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-codegen/core/node_modules/tslib": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", @@ -2186,12 +2532,12 @@ "dev": true }, "node_modules/@graphql-codegen/plugin-helpers": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-4.2.0.tgz", - "integrity": "sha512-THFTCfg+46PXlXobYJ/OoCX6pzjI+9woQqCjdyKtgoI0tn3Xq2HUUCiidndxUpEYVrXb5pRiRXb7b/ZbMQqD0A==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.0.1.tgz", + "integrity": "sha512-6L5sb9D8wptZhnhLLBcheSPU7Tg//DGWgc5tQBWX46KYTOTQHGqDpv50FxAJJOyFVJrveN9otWk9UT9/yfY4ww==", "dev": true, "dependencies": { - "@graphql-tools/utils": "^9.0.0", + "@graphql-tools/utils": "^10.0.0", "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", @@ -2202,6 +2548,24 @@ "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, + "node_modules/@graphql-codegen/plugin-helpers/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-codegen/plugin-helpers/node_modules/tslib": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", @@ -2209,19 +2573,37 @@ "dev": true }, "node_modules/@graphql-codegen/schema-ast": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-3.0.1.tgz", - "integrity": "sha512-rTKTi4XiW4QFZnrEqetpiYEWVsOFNoiR/v3rY9mFSttXFbIwNXPme32EspTiGWmEEdHY8UuTDtZN3vEcs/31zw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-4.0.0.tgz", + "integrity": "sha512-WIzkJFa9Gz28FITAPILbt+7A8+yzOyd1NxgwFh7ie+EmO9a5zQK6UQ3U/BviirguXCYnn+AR4dXsoDrSrtRA1g==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^4.1.0", - "@graphql-tools/utils": "^9.0.0", + "@graphql-codegen/plugin-helpers": "^5.0.0", + "@graphql-tools/utils": "^10.0.0", "tslib": "~2.5.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, + "node_modules/@graphql-codegen/schema-ast/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-codegen/schema-ast/node_modules/tslib": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", @@ -2229,14 +2611,14 @@ "dev": true }, "node_modules/@graphql-codegen/typescript": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-3.0.4.tgz", - "integrity": "sha512-x4O47447DZrWNtE/l5CU9QzzW4m1RbmCEdijlA3s2flG/y1Ckqdemob4CWfilSm5/tZ3w1junVDY616RDTSvZw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-4.0.1.tgz", + "integrity": "sha512-3YziQ21dCVdnHb+Us1uDb3pA6eG5Chjv0uTK+bt9dXeMlwYBU8MbtzvQTo4qvzWVC1AxSOKj0rgfNu1xCXqJyA==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^4.2.0", - "@graphql-codegen/schema-ast": "^3.0.1", - "@graphql-codegen/visitor-plugin-common": "3.1.1", + "@graphql-codegen/plugin-helpers": "^5.0.0", + "@graphql-codegen/schema-ast": "^4.0.0", + "@graphql-codegen/visitor-plugin-common": "4.0.1", "auto-bind": "~4.0.0", "tslib": "~2.5.0" }, @@ -2245,14 +2627,14 @@ } }, "node_modules/@graphql-codegen/typescript-operations": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-3.0.4.tgz", - "integrity": "sha512-6yE2OL2+WJ1vd5MwFEGXpaxsFGzjAGUytPVHDML3Bi3TwP1F3lnQlIko4untwvHW0JhZEGQ7Ck30H9HjcxpdKA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-4.0.1.tgz", + "integrity": "sha512-GpUWWdBVUec/Zqo23aFLBMrXYxN2irypHqDcKjN78JclDPdreasAEPcIpMfqf4MClvpmvDLy4ql+djVAwmkjbw==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^4.2.0", - "@graphql-codegen/typescript": "^3.0.4", - "@graphql-codegen/visitor-plugin-common": "3.1.1", + "@graphql-codegen/plugin-helpers": "^5.0.0", + "@graphql-codegen/typescript": "^4.0.1", + "@graphql-codegen/visitor-plugin-common": "4.0.1", "auto-bind": "~4.0.0", "tslib": "~2.5.0" }, @@ -2267,15 +2649,18 @@ "dev": true }, "node_modules/@graphql-codegen/typescript-urql": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-urql/-/typescript-urql-3.7.3.tgz", - "integrity": "sha512-ndb3C/IZeLaZXI24OEQZnJ7OgzZJvBdw1xnU/ohL6/lMcC5xQgxHBpqM10MZgfTc9l9Ip7qZVCVQk3I4cvcGrA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-urql/-/typescript-urql-4.0.0.tgz", + "integrity": "sha512-l15f44zxU5r1yiIpzLzgDQf2JLmTT+ZrFv7D4kQVAAXquPRN+Bdei1V9VAcatISb5bcHNxmdrXIRMtWKPwVwTg==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^2.7.2", + "@graphql-codegen/plugin-helpers": "^3.0.0", "@graphql-codegen/visitor-plugin-common": "2.13.1", "auto-bind": "~4.0.0", - "tslib": "~2.4.0" + "tslib": "~2.6.0" + }, + "engines": { + "node": ">= 16.0.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", @@ -2283,13 +2668,13 @@ } }, "node_modules/@graphql-codegen/typescript-urql/node_modules/@graphql-codegen/plugin-helpers": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.7.2.tgz", - "integrity": "sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", + "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "dev": true, "dependencies": { - "@graphql-tools/utils": "^8.8.0", - "change-case-all": "1.0.14", + "@graphql-tools/utils": "^9.0.0", + "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", @@ -2299,6 +2684,37 @@ "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, + "node_modules/@graphql-codegen/typescript-urql/node_modules/@graphql-codegen/plugin-helpers/node_modules/@graphql-tools/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-urql/node_modules/@graphql-codegen/plugin-helpers/node_modules/change-case-all": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", + "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", + "dev": true, + "dependencies": { + "change-case": "^4.1.2", + "is-lower-case": "^2.0.2", + "is-upper-case": "^2.0.2", + "lower-case": "^2.0.2", + "lower-case-first": "^2.0.2", + "sponge-case": "^1.0.1", + "swap-case": "^2.0.2", + "title-case": "^3.0.3", + "upper-case": "^2.0.2", + "upper-case-first": "^2.0.2" + } + }, "node_modules/@graphql-codegen/typescript-urql/node_modules/@graphql-codegen/visitor-plugin-common": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.1.tgz", @@ -2320,6 +2736,23 @@ "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, + "node_modules/@graphql-codegen/typescript-urql/node_modules/@graphql-codegen/visitor-plugin-common/node_modules/@graphql-codegen/plugin-helpers": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.7.2.tgz", + "integrity": "sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^8.8.0", + "change-case-all": "1.0.14", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "lodash": "~4.17.0", + "tslib": "~2.4.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, "node_modules/@graphql-codegen/typescript-urql/node_modules/@graphql-tools/utils": { "version": "8.13.1", "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz", @@ -2363,27 +2796,30 @@ "dev": true }, "node_modules/@graphql-codegen/urql-introspection": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/urql-introspection/-/urql-introspection-2.2.1.tgz", - "integrity": "sha512-/KjHSf4dQNoYZZ+G10b3lbw304ik9xHzRf/syNvoYehmwdYE5J7RnO1v1Cz78LDm2NEdsFas6vJHi0sJd/pOHg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/urql-introspection/-/urql-introspection-3.0.0.tgz", + "integrity": "sha512-DBYfG3CO3G6MTzp+/FaXuxYS6cFSkpDMwxXKoJVqKR0jIGd/ev3Gh1pTgqxndcBu8oV9xjiaBQglKCge0EqLpQ==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^2.6.2", + "@graphql-codegen/plugin-helpers": "^3.0.0", "@urql/introspection": "^0.3.2", - "tslib": "~2.4.0" + "tslib": "~2.6.0" + }, + "engines": { + "node": ">= 16.0.0" }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "node_modules/@graphql-codegen/urql-introspection/node_modules/@graphql-codegen/plugin-helpers": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.7.2.tgz", - "integrity": "sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", + "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", "dev": true, "dependencies": { - "@graphql-tools/utils": "^8.8.0", - "change-case-all": "1.0.14", + "@graphql-tools/utils": "^9.0.0", + "change-case-all": "1.0.15", "common-tags": "1.8.2", "import-from": "4.0.0", "lodash": "~4.17.0", @@ -2393,52 +2829,22 @@ "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/@graphql-codegen/urql-introspection/node_modules/@graphql-tools/utils": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz", - "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==", - "dev": true, - "dependencies": { - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-codegen/urql-introspection/node_modules/change-case-all": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.14.tgz", - "integrity": "sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA==", - "dev": true, - "dependencies": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/@graphql-codegen/urql-introspection/node_modules/tslib": { + "node_modules/@graphql-codegen/urql-introspection/node_modules/@graphql-codegen/plugin-helpers/node_modules/tslib": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, "node_modules/@graphql-codegen/visitor-plugin-common": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-3.1.1.tgz", - "integrity": "sha512-uAfp+zu/009R3HUAuTK2AamR1bxIltM6rrYYI6EXSmkM3rFtFsLTuJhjUDj98HcUCszJZrADppz8KKLGRUVlNg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-4.0.1.tgz", + "integrity": "sha512-Bi/1z0nHg4QMsAqAJhds+ForyLtk7A3HQOlkrZNm3xEkY7lcBzPtiOTLBtvziwopBsXUxqeSwVjOOFPLS5Yw1Q==", "dev": true, "dependencies": { - "@graphql-codegen/plugin-helpers": "^4.2.0", - "@graphql-tools/optimize": "^1.3.0", - "@graphql-tools/relay-operation-optimizer": "^6.5.0", - "@graphql-tools/utils": "^9.0.0", + "@graphql-codegen/plugin-helpers": "^5.0.0", + "@graphql-tools/optimize": "^2.0.0", + "@graphql-tools/relay-operation-optimizer": "^7.0.0", + "@graphql-tools/utils": "^10.0.0", "auto-bind": "~4.0.0", "change-case-all": "1.0.15", "dependency-graph": "^0.11.0", @@ -2450,6 +2856,56 @@ "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, + "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/@graphql-tools/optimize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", + "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.0.tgz", + "integrity": "sha512-UNlJi5y3JylhVWU4MBpL0Hun4Q7IoJwv9xYtmAz+CgRa066szzY7dcuPfxrA7cIGgG/Q6TVsKsYaiF4OHPs1Fw==", + "dev": true, + "dependencies": { + "@ardatan/relay-compiler": "12.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/tslib": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", @@ -2457,20 +2913,85 @@ "dev": true }, "node_modules/@graphql-tools/apollo-engine-loader": { - "version": "7.3.26", - "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-7.3.26.tgz", - "integrity": "sha512-h1vfhdJFjnCYn9b5EY1Z91JTF0KB3hHVJNQIsiUV2mpQXZdeOXQoaWeYEKaiI5R6kwBw5PP9B0fv3jfUIG8LyQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.0.tgz", + "integrity": "sha512-axQTbN5+Yxs1rJ6cWQBOfw3AEeC+fvIuZSfJLPLLvFJLj4pUm9fhxey/g6oQZAAQJqKPfw+tLDUQvnfvRK8Kmg==", "dev": true, "dependencies": { "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/utils": "^9.2.1", - "@whatwg-node/fetch": "^0.8.0", + "@graphql-tools/utils": "^10.0.0", + "@whatwg-node/fetch": "^0.9.0", "tslib": "^2.4.0" }, + "engines": { + "node": ">=16.0.0" + }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/fetch": { + "version": "0.9.14", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.14.tgz", + "integrity": "sha512-wurZC82zzZwXRDSW0OS9l141DynaJQh7Yt0FD1xZ8niX7/Et/7RoiLiltbVU1fSF1RR9z6ndEaTUQBAmddTm1w==", + "dev": true, + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.0", + "urlpattern-polyfill": "^9.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.0.tgz", + "integrity": "sha512-q76lDAafvHNGWedNAVHrz/EyYTS8qwRLcwne8SJQdRN5P3HydxU6XROFvJfTML6KZXQX2FDdGY4/SnaNyd7M0Q==", + "dev": true, + "dependencies": { + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "fast-url-parser": "^1.1.3", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/urlpattern-polyfill": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz", + "integrity": "sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==", + "dev": true + }, "node_modules/@graphql-tools/batch-execute": { "version": "8.5.22", "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.22.tgz", @@ -2487,17 +3008,38 @@ } }, "node_modules/@graphql-tools/code-file-loader": { - "version": "7.3.23", - "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-7.3.23.tgz", - "integrity": "sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.0.3.tgz", + "integrity": "sha512-gVnnlWs0Ua+5FkuHHEriFUOI3OIbHv6DS1utxf28n6NkfGMJldC4j0xlJRY0LS6dWK34IGYgD4HelKYz2l8KiA==", "dev": true, "dependencies": { - "@graphql-tools/graphql-tag-pluck": "7.5.2", - "@graphql-tools/utils": "^9.2.1", + "@graphql-tools/graphql-tag-pluck": "8.1.0", + "@graphql-tools/utils": "^10.0.0", "globby": "^11.0.3", "tslib": "^2.4.0", "unixify": "^1.0.0" }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/code-file-loader/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } @@ -2632,113 +3174,396 @@ } }, "node_modules/@graphql-tools/git-loader": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-7.3.0.tgz", - "integrity": "sha512-gcGAK+u16eHkwsMYqqghZbmDquh8QaO24Scsxq+cVR+vx1ekRlsEiXvu+yXVDbZdcJ6PBIbeLcQbEu+xhDLmvQ==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.3.tgz", + "integrity": "sha512-Iz9KbRUAkuOe8JGTS0qssyJ+D5Snle17W+z9anwWrLFrkBhHrRFUy5AdjZqgJuhls0x30QkZBnnCtnHDBdQ4nA==", "dev": true, "dependencies": { - "@graphql-tools/graphql-tag-pluck": "7.5.2", - "@graphql-tools/utils": "^9.2.1", + "@graphql-tools/graphql-tag-pluck": "8.1.0", + "@graphql-tools/utils": "^10.0.0", "is-glob": "4.0.3", "micromatch": "^4.0.4", "tslib": "^2.4.0", "unixify": "^1.0.0" }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/git-loader/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-tools/github-loader": { - "version": "7.3.28", - "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-7.3.28.tgz", - "integrity": "sha512-OK92Lf9pmxPQvjUNv05b3tnVhw0JRfPqOf15jZjyQ8BfdEUrJoP32b4dRQQem/wyRL24KY4wOfArJNqzpsbwCA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-8.0.0.tgz", + "integrity": "sha512-VuroArWKcG4yaOWzV0r19ElVIV6iH6UKDQn1MXemND0xu5TzrFme0kf3U9o0YwNo0kUYEk9CyFM0BYg4he17FA==", "dev": true, "dependencies": { "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/executor-http": "^0.1.9", - "@graphql-tools/graphql-tag-pluck": "^7.4.6", - "@graphql-tools/utils": "^9.2.1", - "@whatwg-node/fetch": "^0.8.0", + "@graphql-tools/executor-http": "^1.0.0", + "@graphql-tools/graphql-tag-pluck": "^8.0.0", + "@graphql-tools/utils": "^10.0.0", + "@whatwg-node/fetch": "^0.9.0", "tslib": "^2.4.0", "value-or-promise": "^1.0.12" }, + "engines": { + "node": ">=16.0.0" + }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/graphql-file-loader": { - "version": "7.5.17", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.5.17.tgz", - "integrity": "sha512-hVwwxPf41zOYgm4gdaZILCYnKB9Zap7Ys9OhY1hbwuAuC4MMNY9GpUjoTU3CQc3zUiPoYStyRtUGkHSJZ3HxBw==", + "node_modules/@graphql-tools/github-loader/node_modules/@graphql-tools/executor-http": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.0.3.tgz", + "integrity": "sha512-5WZIMBevRaxMabZ8U2Ty0dTUPy/PpeYSlMNEmC/YJjKKykgSfc/AwSejx2sE4FFKZ0I2kxRKRenyoWMHRAV49Q==", "dev": true, "dependencies": { - "@graphql-tools/import": "6.7.18", - "@graphql-tools/utils": "^9.2.1", + "@graphql-tools/utils": "^10.0.2", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/fetch": "^0.9.0", + "extract-files": "^11.0.0", + "meros": "^1.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/fetch": { + "version": "0.9.14", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.14.tgz", + "integrity": "sha512-wurZC82zzZwXRDSW0OS9l141DynaJQh7Yt0FD1xZ8niX7/Et/7RoiLiltbVU1fSF1RR9z6ndEaTUQBAmddTm1w==", + "dev": true, + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.0", + "urlpattern-polyfill": "^9.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.0.tgz", + "integrity": "sha512-q76lDAafvHNGWedNAVHrz/EyYTS8qwRLcwne8SJQdRN5P3HydxU6XROFvJfTML6KZXQX2FDdGY4/SnaNyd7M0Q==", + "dev": true, + "dependencies": { + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "fast-url-parser": "^1.1.3", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/urlpattern-polyfill": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz", + "integrity": "sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==", + "dev": true + }, + "node_modules/@graphql-tools/graphql-file-loader": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.0.tgz", + "integrity": "sha512-wRXj9Z1IFL3+zJG1HWEY0S4TXal7+s1vVhbZva96MSp0kbb/3JBF7j0cnJ44Eq0ClccMgGCDFqPFXty4JlpaPg==", + "dev": true, + "dependencies": { + "@graphql-tools/import": "7.0.0", + "@graphql-tools/utils": "^10.0.0", "globby": "^11.0.3", "tslib": "^2.4.0", "unixify": "^1.0.0" }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-file-loader/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-tools/graphql-tag-pluck": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.5.2.tgz", - "integrity": "sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.1.0.tgz", + "integrity": "sha512-kt5l6H/7QxQcIaewInTcune6NpATojdFEW98/8xWcgmy7dgXx5vU9e0AicFZIH+ewGyZzTpwFqO2RI03roxj2w==", "dev": true, "dependencies": { + "@babel/core": "^7.22.9", "@babel/parser": "^7.16.8", "@babel/plugin-syntax-import-assertions": "^7.20.0", "@babel/traverse": "^7.16.8", "@babel/types": "^7.16.8", - "@graphql-tools/utils": "^9.2.1", + "@graphql-tools/utils": "^10.0.0", "tslib": "^2.4.0" }, + "engines": { + "node": ">=16.0.0" + }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/import": { - "version": "6.7.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-6.7.18.tgz", - "integrity": "sha512-XQDdyZTp+FYmT7as3xRWH/x8dx0QZA2WZqfMF5EWb36a0PiH7WwlRQYIdyYXj8YCLpiWkeBXgBRHmMnwEYR8iQ==", + "node_modules/@graphql-tools/graphql-tag-pluck/node_modules/@babel/core": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", "dev": true, "dependencies": { - "@graphql-tools/utils": "^9.2.1", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@graphql-tools/import": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.0.0.tgz", + "integrity": "sha512-NVZiTO8o1GZs6OXzNfjB+5CtQtqsZZpQOq+Uu0w57kdUkT4RlQKlwhT8T81arEsbV55KpzkpFsOZP7J1wdmhBw==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", "resolve-from": "5.0.0", "tslib": "^2.4.0" }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/import/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-tools/json-file-loader": { - "version": "7.4.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-7.4.18.tgz", - "integrity": "sha512-AJ1b6Y1wiVgkwsxT5dELXhIVUPs/u3VZ8/0/oOtpcoyO/vAeM5rOvvWegzicOOnQw8G45fgBRMkkRfeuwVt6+w==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.0.tgz", + "integrity": "sha512-ki6EF/mobBWJjAAC84xNrFMhNfnUFD6Y0rQMGXekrUgY0NdeYXHU0ZUgHzC9O5+55FslqUmAUHABePDHTyZsLg==", "dev": true, "dependencies": { - "@graphql-tools/utils": "^9.2.1", + "@graphql-tools/utils": "^10.0.0", "globby": "^11.0.3", "tslib": "^2.4.0", "unixify": "^1.0.0" }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/json-file-loader/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/@graphql-tools/load": { - "version": "7.8.14", - "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-7.8.14.tgz", - "integrity": "sha512-ASQvP+snHMYm+FhIaLxxFgVdRaM0vrN9wW2BKInQpktwWTXVyk+yP5nQUCEGmn0RTdlPKrffBaigxepkEAJPrg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.0.0.tgz", + "integrity": "sha512-Cy874bQJH0FP2Az7ELPM49iDzOljQmK1PPH6IuxsWzLSTxwTqd8dXA09dcVZrI7/LsN26heTY2R8q2aiiv0GxQ==", "dev": true, "dependencies": { - "@graphql-tools/schema": "^9.0.18", - "@graphql-tools/utils": "^9.2.1", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.0", "p-limit": "3.1.0", "tslib": "^2.4.0" }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load/node_modules/@graphql-tools/merge": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.0.tgz", + "integrity": "sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load/node_modules/@graphql-tools/schema": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.0.tgz", + "integrity": "sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg==", + "dev": true, + "dependencies": { + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } @@ -2769,23 +3594,23 @@ } }, "node_modules/@graphql-tools/prisma-loader": { - "version": "7.2.72", - "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-7.2.72.tgz", - "integrity": "sha512-0a7uV7Fky6yDqd0tI9+XMuvgIo6GAqiVzzzFV4OSLry4AwiQlI3igYseBV7ZVOGhedOTqj/URxjpiv07hRcwag==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-8.0.2.tgz", + "integrity": "sha512-8d28bIB0bZ9Bj0UOz9sHagVPW+6AHeqvGljjERtwCnWl8OCQw2c2pNboYXISLYUG5ub76r4lDciLLTU+Ks7Q0w==", "dev": true, "dependencies": { - "@graphql-tools/url-loader": "^7.17.18", - "@graphql-tools/utils": "^9.2.1", + "@graphql-tools/url-loader": "^8.0.0", + "@graphql-tools/utils": "^10.0.8", "@types/js-yaml": "^4.0.0", "@types/json-stable-stringify": "^1.0.32", - "@whatwg-node/fetch": "^0.8.2", + "@whatwg-node/fetch": "^0.9.0", "chalk": "^4.1.0", "debug": "^4.3.1", "dotenv": "^16.0.0", "graphql-request": "^6.0.0", - "http-proxy-agent": "^6.0.0", - "https-proxy-agent": "^6.0.0", - "jose": "^4.11.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "jose": "^5.0.0", "js-yaml": "^4.0.0", "json-stable-stringify": "^1.0.1", "lodash": "^4.17.20", @@ -2793,10 +3618,266 @@ "tslib": "^2.4.0", "yaml-ast-parser": "^0.0.43" }, + "engines": { + "node": ">=16.0.0" + }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/batch-execute": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.2.tgz", + "integrity": "sha512-Y2uwdZI6ZnatopD/SYfZ1eGuQFI7OU2KGZ2/B/7G9ISmgMl5K+ZZWz/PfIEXeiHirIDhyk54s4uka5rj2xwKqQ==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.5", + "dataloader": "^2.2.2", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/delegate": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.0.3.tgz", + "integrity": "sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw==", + "dev": true, + "dependencies": { + "@graphql-tools/batch-execute": "^9.0.1", + "@graphql-tools/executor": "^1.0.0", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.5", + "dataloader": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/executor": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.2.0.tgz", + "integrity": "sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "@graphql-typed-document-node/core": "3.2.0", + "@repeaterjs/repeater": "^3.0.4", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/executor-graphql-ws": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.1.0.tgz", + "integrity": "sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.2", + "@types/ws": "^8.0.0", + "graphql-ws": "^5.14.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/executor-http": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.0.3.tgz", + "integrity": "sha512-5WZIMBevRaxMabZ8U2Ty0dTUPy/PpeYSlMNEmC/YJjKKykgSfc/AwSejx2sE4FFKZ0I2kxRKRenyoWMHRAV49Q==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.2", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/fetch": "^0.9.0", + "extract-files": "^11.0.0", + "meros": "^1.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/executor-legacy-ws": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.4.tgz", + "integrity": "sha512-b7aGuRekZDS+m3af3BIvMKxu15bmVPMt5eGQVuP2v5pxmbaPTh+iv5mx9b3Plt32z5Ke5tycBnNm5urSFtW8ng==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "@types/ws": "^8.0.0", + "isomorphic-ws": "5.0.0", + "tslib": "^2.4.0", + "ws": "8.14.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/merge": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.0.tgz", + "integrity": "sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/schema": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.0.tgz", + "integrity": "sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg==", + "dev": true, + "dependencies": { + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/url-loader": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.0.tgz", + "integrity": "sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA==", + "dev": true, + "dependencies": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/delegate": "^10.0.0", + "@graphql-tools/executor-graphql-ws": "^1.0.0", + "@graphql-tools/executor-http": "^1.0.0", + "@graphql-tools/executor-legacy-ws": "^1.0.0", + "@graphql-tools/utils": "^10.0.0", + "@graphql-tools/wrap": "^10.0.0", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.9.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.11", + "ws": "^8.12.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/wrap": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.1.tgz", + "integrity": "sha512-Cw6hVrKGM2OKBXeuAGltgy4tzuqQE0Nt7t/uAqnuokSXZhMHXJUb124Bnvxc2gPZn5chfJSDafDe4Cp8ZAVJgg==", + "dev": true, + "dependencies": { + "@graphql-tools/delegate": "^10.0.3", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/fetch": { + "version": "0.9.14", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.14.tgz", + "integrity": "sha512-wurZC82zzZwXRDSW0OS9l141DynaJQh7Yt0FD1xZ8niX7/Et/7RoiLiltbVU1fSF1RR9z6ndEaTUQBAmddTm1w==", + "dev": true, + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.0", + "urlpattern-polyfill": "^9.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.0.tgz", + "integrity": "sha512-q76lDAafvHNGWedNAVHrz/EyYTS8qwRLcwne8SJQdRN5P3HydxU6XROFvJfTML6KZXQX2FDdGY4/SnaNyd7M0Q==", + "dev": true, + "dependencies": { + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "fast-url-parser": "^1.1.3", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@graphql-tools/prisma-loader/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -2846,6 +3927,18 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/@graphql-tools/prisma-loader/node_modules/graphql-ws": { + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.14.2.tgz", + "integrity": "sha512-LycmCwhZ+Op2GlHz4BZDsUYHKRiiUz+3r9wbhBATMETNlORQJAaFlAgTFoeRh6xQoQegwYwIylVD1Qns9/DA3w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": ">=0.11 <=16" + } + }, "node_modules/@graphql-tools/prisma-loader/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2867,6 +3960,12 @@ "node": ">=8" } }, + "node_modules/@graphql-tools/prisma-loader/node_modules/urlpattern-polyfill": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz", + "integrity": "sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==", + "dev": true + }, "node_modules/@graphql-tools/relay-operation-optimizer": { "version": "6.5.18", "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.18.tgz", @@ -3005,12 +4104,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -3032,9 +4131,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -4226,6 +5325,8 @@ "integrity": "sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==", "dev": true, "hasInstallScript": true, + "optional": true, + "peer": true, "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", @@ -4266,6 +5367,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -4286,6 +5388,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -4306,6 +5409,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -4326,6 +5430,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -4346,6 +5451,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -4366,6 +5472,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -4386,6 +5493,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -4406,6 +5514,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -4426,6 +5535,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -4446,6 +5556,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -4466,6 +5577,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -4486,6 +5598,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -5373,22 +6486,6 @@ "@babel/types": "^7.20.7" } }, - "node_modules/@types/eslint": { - "version": "8.44.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", - "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", - "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", - "dev": true - }, "node_modules/@types/graceful-fs": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", @@ -5423,15 +6520,15 @@ } }, "node_modules/@types/js-cookie": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.4.tgz", - "integrity": "sha512-vMMnFF+H5KYqdd/myCzq6wLDlPpteJK+jGFgBus3Da7lw+YsDmx2C8feGTzY2M3Fo823yON+HC2CL240j4OV+w==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-dtLshqoiGRDHbHueIT9sjkd2F4tW1qPSX2xKAQK8p1e6pM+Z913GM1shv7dOqqasEMYbC5zEaClJomQe8OtQLA==", "dev": true }, "node_modules/@types/js-yaml": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.8.tgz", - "integrity": "sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", "dev": true }, "node_modules/@types/json-schema": { @@ -5441,9 +6538,9 @@ "dev": true }, "node_modules/@types/json-stable-stringify": { - "version": "1.0.35", - "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.35.tgz", - "integrity": "sha512-zlCWqsRBI0+ANN7dzGeDFJ4CHaVFTLqBNRS11GjR2mHCW6XxNtnMxhQzBKMzfsnjI8oI+kWq2vBwinyQpZVSsg==", + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.36.tgz", + "integrity": "sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw==", "dev": true }, "node_modules/@types/json5": { @@ -5459,10 +6556,13 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.1.tgz", - "integrity": "sha512-uKBEevTNb+l6/aCQaKVnUModfEMjAl98lw2Si9P5y4hLu9tm6AlX2ZIoXZX6Wh9lJueYPrGPKk5WMCNHg/u6/A==", - "dev": true + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/normalize-package-data": { "version": "2.4.3", @@ -5482,18 +6582,6 @@ "integrity": "sha512-qZqHmdGEALeSATMB1djT1S5szv6Wtpb7DKpHrt2XG4iyKlV7C2Xk8GmDXr1KXakOqUfX6ohw7ceruYt4NVmB1Q==", "dev": true }, - "node_modules/@types/parse-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", - "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, "node_modules/@types/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", @@ -5537,16 +6625,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.3.tgz", - "integrity": "sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", + "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.3", - "@typescript-eslint/type-utils": "6.7.3", - "@typescript-eslint/utils": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/type-utils": "6.9.1", + "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -5605,15 +6693,15 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.3.tgz", - "integrity": "sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", + "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.7.3", - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/typescript-estree": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4" }, "engines": { @@ -5633,13 +6721,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", - "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", + "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3" + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -5650,13 +6738,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.3.tgz", - "integrity": "sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", + "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.3", - "@typescript-eslint/utils": "6.7.3", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/utils": "6.9.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -5677,9 +6765,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", - "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", + "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -5690,13 +6778,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", - "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", + "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5750,17 +6838,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.3.tgz", - "integrity": "sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", + "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.3", - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", "semver": "^7.5.4" }, "engines": { @@ -5808,12 +6896,12 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", - "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", + "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/types": "6.9.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -5824,6 +6912,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@urql/core": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@urql/core/-/core-3.2.2.tgz", @@ -6172,9 +7266,9 @@ } }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, "node_modules/astral-regex": { @@ -6192,6 +7286,15 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -6222,9 +7325,9 @@ } }, "node_modules/axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "dev": true, "engines": { "node": ">=4" @@ -6410,9 +7513,9 @@ } }, "node_modules/babel-plugin-jsx-dom-expressions": { - "version": "0.36.18", - "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.36.18.tgz", - "integrity": "sha512-8K0CHgzNMB0+1OC+GQf1O49Nc6DfHAoWDjY4YTW3W/3il5KrDKAj65723oPmya68kKKOkqDKuz+Zh1u7VFHthw==", + "version": "0.37.8", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.37.8.tgz", + "integrity": "sha512-nVHH6g7541aaAQJAsyWHvjH7GCXZ+8tuF3Qu4y9W9aKwonRbcJL+yyMatDJLvjC54iIuGowiiZM6Rm3AVJczGg==", "dev": true, "dependencies": { "@babel/helper-module-imports": "7.18.6", @@ -6521,12 +7624,12 @@ } }, "node_modules/babel-preset-solid": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.7.4.tgz", - "integrity": "sha512-0mbHNYkbOVYhH6L95VlHVkBEVQjOXSzUqLDiFxUcsg/tU4yTM/qx7FI8C+kmos9LHckQBSm3wtwoe1BZLNJR1w==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.8.4.tgz", + "integrity": "sha512-TfI09EOFHsbhVqoM+svop3zY4zOUIBlZsGU16Rgd4NsYVXw6lv2VEn7dmlpczMMQy0IeO3PFiXlMQZWutB+uAQ==", "dev": true, "dependencies": { - "babel-plugin-jsx-dom-expressions": "^0.36.10" + "babel-plugin-jsx-dom-expressions": "^0.37.8" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -7245,9 +8348,9 @@ } }, "node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "engines": { "node": ">=16" @@ -7295,19 +8398,29 @@ "dev": true }, "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/create-jest": { @@ -7455,6 +8568,18 @@ } } }, + "node_modules/cross-inspect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.0.tgz", + "integrity": "sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -7521,14 +8646,6 @@ "integrity": "sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==", "dev": true }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "engines": { - "node": ">= 12" - } - }, "node_modules/dataloader": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.2.tgz", @@ -7734,6 +8851,8 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, + "optional": true, + "peer": true, "bin": { "detect-libc": "bin/detect-libc.js" }, @@ -8037,11 +9156,27 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-module-lexer": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.10.5.tgz", - "integrity": "sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==", - "dev": true + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } }, "node_modules/es-set-tostringtag": { "version": "2.0.1", @@ -8139,18 +9274,19 @@ } }, "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -8318,26 +9454,26 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", + "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -8370,9 +9506,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "27.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.4.0.tgz", - "integrity": "sha512-ukVeKmMPAUA5SWjHenvyyXnirKfHKMdOsTZdn5tZx5EW05HGVQwBohigjFZGGj3zuv1cV6hc82FvWv6LdIbkgg==", + "version": "27.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz", + "integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.10.0" @@ -8550,27 +9686,27 @@ "dev": true }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", "dev": true, "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" @@ -8693,9 +9829,9 @@ } }, "node_modules/eslint-plugin-sonarjs": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.21.0.tgz", - "integrity": "sha512-oezUDfFT5S6j3rQheZ4DLPrbetPmMS7zHIKWGHr0CM3g5JgyZroz1FpIKa4jV83NsGpmgIeagpokWDKIJzRQmw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.23.0.tgz", + "integrity": "sha512-z44T3PBf9W7qQ/aR+NmofOTyg6HLhSEZOPD4zhStqBpLoMp8GYhFksuUBnCxbnf1nfISpKBVkQhiBLFI/F4Wlg==", "dev": true, "engines": { "node": ">=14" @@ -8705,12 +9841,12 @@ } }, "node_modules/eslint-plugin-unicorn": { - "version": "48.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-48.0.1.tgz", - "integrity": "sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==", + "version": "49.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-49.0.0.tgz", + "integrity": "sha512-0fHEa/8Pih5cmzFW5L7xMEfUTvI9WKeQtjmKpTUmY+BiFCDxkxrTdnURJOHKykhtwIeyYsxnecbGvDCml++z4Q==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "@eslint-community/eslint-utils": "^4.4.0", "ci-info": "^3.8.0", "clean-regexp": "^1.0.0", @@ -8718,7 +9854,6 @@ "indent-string": "^4.0.0", "is-builtin-module": "^3.2.1", "jsesc": "^3.0.2", - "lodash": "^4.17.21", "pluralize": "^8.0.0", "read-pkg-up": "^7.0.1", "regexp-tree": "^0.1.27", @@ -8733,7 +9868,7 @@ "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" }, "peerDependencies": { - "eslint": ">=8.44.0" + "eslint": ">=8.52.0" } }, "node_modules/eslint-plugin-unicorn/node_modules/jsesc": { @@ -9188,28 +10323,6 @@ "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", "dev": true }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -9356,17 +10469,6 @@ "node": ">= 6" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/front-matter": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", @@ -9731,25 +10833,25 @@ } }, "node_modules/graphql-config": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-4.5.0.tgz", - "integrity": "sha512-x6D0/cftpLUJ0Ch1e5sj1TZn6Wcxx4oMfmhaG9shM0DKajA9iR+j1z86GSTQ19fShbGvrSSvbIQsHku6aQ6BBw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-5.0.3.tgz", + "integrity": "sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ==", "dev": true, "dependencies": { - "@graphql-tools/graphql-file-loader": "^7.3.7", - "@graphql-tools/json-file-loader": "^7.3.7", - "@graphql-tools/load": "^7.5.5", - "@graphql-tools/merge": "^8.2.6", - "@graphql-tools/url-loader": "^7.9.7", - "@graphql-tools/utils": "^9.0.0", - "cosmiconfig": "8.0.0", - "jiti": "1.17.1", - "minimatch": "4.2.3", - "string-env-interpolation": "1.0.1", + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.0.0", + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/url-loader": "^8.0.0", + "@graphql-tools/utils": "^10.0.0", + "cosmiconfig": "^8.1.0", + "jiti": "^1.18.2", + "minimatch": "^4.2.3", + "string-env-interpolation": "^1.0.1", "tslib": "^2.4.0" }, "engines": { - "node": ">= 10.0.0" + "node": ">= 16.0.0" }, "peerDependencies": { "cosmiconfig-toml-loader": "^1.0.0", @@ -9761,28 +10863,269 @@ } } }, - "node_modules/graphql-config/node_modules/cosmiconfig": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", - "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", + "node_modules/graphql-config/node_modules/@graphql-tools/batch-execute": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.2.tgz", + "integrity": "sha512-Y2uwdZI6ZnatopD/SYfZ1eGuQFI7OU2KGZ2/B/7G9ISmgMl5K+ZZWz/PfIEXeiHirIDhyk54s4uka5rj2xwKqQ==", "dev": true, "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" + "@graphql-tools/utils": "^10.0.5", + "dataloader": "^2.2.2", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" }, "engines": { - "node": ">=14" + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/graphql-config/node_modules/jiti": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.17.1.tgz", - "integrity": "sha512-NZIITw8uZQFuzQimqjUxIrIcEdxYDFIe/0xYfIlVXTkiBjjyBEvgasj5bb0/cHtPRD/NziPbT312sFrkI5ALpw==", + "node_modules/graphql-config/node_modules/@graphql-tools/delegate": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.0.3.tgz", + "integrity": "sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw==", "dev": true, - "bin": { - "jiti": "bin/jiti.js" + "dependencies": { + "@graphql-tools/batch-execute": "^9.0.1", + "@graphql-tools/executor": "^1.0.0", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.5", + "dataloader": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/executor": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.2.0.tgz", + "integrity": "sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "@graphql-typed-document-node/core": "3.2.0", + "@repeaterjs/repeater": "^3.0.4", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/executor-graphql-ws": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.1.0.tgz", + "integrity": "sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.2", + "@types/ws": "^8.0.0", + "graphql-ws": "^5.14.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "ws": "^8.13.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/executor-http": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.0.3.tgz", + "integrity": "sha512-5WZIMBevRaxMabZ8U2Ty0dTUPy/PpeYSlMNEmC/YJjKKykgSfc/AwSejx2sE4FFKZ0I2kxRKRenyoWMHRAV49Q==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.2", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/fetch": "^0.9.0", + "extract-files": "^11.0.0", + "meros": "^1.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/executor-legacy-ws": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.4.tgz", + "integrity": "sha512-b7aGuRekZDS+m3af3BIvMKxu15bmVPMt5eGQVuP2v5pxmbaPTh+iv5mx9b3Plt32z5Ke5tycBnNm5urSFtW8ng==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "@types/ws": "^8.0.0", + "isomorphic-ws": "5.0.0", + "tslib": "^2.4.0", + "ws": "8.14.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/merge": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.0.tgz", + "integrity": "sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/schema": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.0.tgz", + "integrity": "sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg==", + "dev": true, + "dependencies": { + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/url-loader": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.0.tgz", + "integrity": "sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA==", + "dev": true, + "dependencies": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/delegate": "^10.0.0", + "@graphql-tools/executor-graphql-ws": "^1.0.0", + "@graphql-tools/executor-http": "^1.0.0", + "@graphql-tools/executor-legacy-ws": "^1.0.0", + "@graphql-tools/utils": "^10.0.0", + "@graphql-tools/wrap": "^10.0.0", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.9.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.11", + "ws": "^8.12.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/utils": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.8.tgz", + "integrity": "sha512-yjyA8ycSa1WRlJqyX/aLqXeE5DvF/H02+zXMUFnCzIDrj0UvLMUrxhmVFnMK0Q2n3bh4uuTeY3621m5za9ovXw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "cross-inspect": "1.0.0", + "dset": "^3.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/wrap": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.1.tgz", + "integrity": "sha512-Cw6hVrKGM2OKBXeuAGltgy4tzuqQE0Nt7t/uAqnuokSXZhMHXJUb124Bnvxc2gPZn5chfJSDafDe4Cp8ZAVJgg==", + "dev": true, + "dependencies": { + "@graphql-tools/delegate": "^10.0.3", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@whatwg-node/events": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", + "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/graphql-config/node_modules/@whatwg-node/fetch": { + "version": "0.9.14", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.14.tgz", + "integrity": "sha512-wurZC82zzZwXRDSW0OS9l141DynaJQh7Yt0FD1xZ8niX7/Et/7RoiLiltbVU1fSF1RR9z6ndEaTUQBAmddTm1w==", + "dev": true, + "dependencies": { + "@whatwg-node/node-fetch": "^0.5.0", + "urlpattern-polyfill": "^9.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/graphql-config/node_modules/@whatwg-node/node-fetch": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.0.tgz", + "integrity": "sha512-q76lDAafvHNGWedNAVHrz/EyYTS8qwRLcwne8SJQdRN5P3HydxU6XROFvJfTML6KZXQX2FDdGY4/SnaNyd7M0Q==", + "dev": true, + "dependencies": { + "@whatwg-node/events": "^0.1.0", + "busboy": "^1.6.0", + "fast-querystring": "^1.1.1", + "fast-url-parser": "^1.1.3", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/graphql-config/node_modules/graphql-ws": { + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.14.2.tgz", + "integrity": "sha512-LycmCwhZ+Op2GlHz4BZDsUYHKRiiUz+3r9wbhBATMETNlORQJAaFlAgTFoeRh6xQoQegwYwIylVD1Qns9/DA3w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": ">=0.11 <=16" } }, "node_modules/graphql-config/node_modules/minimatch": { @@ -9797,6 +11140,12 @@ "node": ">=10" } }, + "node_modules/graphql-config/node_modules/urlpattern-polyfill": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz", + "integrity": "sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==", + "dev": true + }, "node_modules/graphql-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-6.1.0.tgz", @@ -9945,6 +11294,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -10028,9 +11389,9 @@ } }, "node_modules/http-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-6.1.1.tgz", - "integrity": "sha512-JRCz+4Whs6yrrIoIlrH+ZTmhrRwtMnmOHsHn8GFEn9O2sVfSE+DAZ3oyyGIKF8tjJEeSJmP89j7aTjVsSqsU0g==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dev": true, "dependencies": { "agent-base": "^7.1.0", @@ -10041,9 +11402,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-6.2.1.tgz", - "integrity": "sha512-ONsE3+yfZF2caH5+bJlcddtWqNI3Gvs5A38+ngvljxaBiRXRswym2c7yf8UAeFpRFKjFNHIFEHqR/OLAWJzyiA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", "dev": true, "dependencies": { "agent-base": "^7.0.2", @@ -10785,6 +12146,21 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -10853,12 +12229,12 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10900,6 +12276,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -10918,6 +12306,21 @@ "node": ">=6" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -10960,6 +12363,15 @@ "tslib": "^2.0.3" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -11057,6 +12469,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -11159,6 +12580,15 @@ "tslib": "^2.0.3" } }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -11171,6 +12601,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-what": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.15.tgz", @@ -11352,6 +12795,19 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -13036,9 +14492,9 @@ } }, "node_modules/jose": { - "version": "4.15.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz", - "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.1.0.tgz", + "integrity": "sha512-H+RVqxA6apaJ0rcQYupKYhos7uosAiF42gUcWZiwhICWMphDULFj/CRr1R0tV/JCv9DEeJaSyYYpc9luHHNT4g==", "dev": true, "funding": { "url": "https://github.com/sponsors/panva" @@ -13243,12 +14699,15 @@ "dev": true }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/leven": { @@ -13324,27 +14783,27 @@ "dev": true }, "node_modules/lint-staged": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz", - "integrity": "sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.2.tgz", + "integrity": "sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==", "dev": true, "dependencies": { "chalk": "5.3.0", - "commander": "11.0.0", + "commander": "11.1.0", "debug": "4.3.4", - "execa": "7.2.0", + "execa": "8.0.1", "lilconfig": "2.1.0", - "listr2": "6.6.1", + "listr2": "7.0.2", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.1" + "yaml": "2.3.3" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=18.12.0" }, "funding": { "url": "https://opencollective.com/lint-staged" @@ -13433,35 +14892,47 @@ } }, "node_modules/lint-staged/node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "node": ">=16.17" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/lint-staged/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "engines": { - "node": ">=14.18.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" } }, "node_modules/lint-staged/node_modules/is-fullwidth-code-point": { @@ -13489,9 +14960,9 @@ } }, "node_modules/lint-staged/node_modules/listr2": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", + "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", "dev": true, "dependencies": { "cli-truncate": "^3.1.0", @@ -13503,14 +14974,6 @@ }, "engines": { "node": ">=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } } }, "node_modules/lint-staged/node_modules/log-update": { @@ -13626,6 +15089,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lint-staged/node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/lint-staged/node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", @@ -13716,9 +15197,9 @@ } }, "node_modules/lint-staged/node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", + "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", "dev": true, "engines": { "node": ">= 14" @@ -14625,42 +16106,9 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==", - "dev": true - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", - "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } + "dev": true, + "optional": true, + "peer": true }, "node_modules/node-int64": { "version": "0.4.0", @@ -15457,211 +16905,28 @@ } }, "node_modules/prettier-eslint": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-15.0.1.tgz", - "integrity": "sha512-mGOWVHixSvpZWARqSDXbdtTL54mMBxc5oQYQ6RAqy8jecuNJBgN3t9E5a81G66F8x8fsKNiR1HWaBV66MJDOpg==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.1.2.tgz", + "integrity": "sha512-mGFGZQbAh11FSnwW3H1zngzQYR2QMmHO8vdfgnAuzOFhnDeUZHYtwpqQvOMOMT0k818Dr1X+J4a/sVE0r34RKQ==", "dev": true, "dependencies": { - "@types/eslint": "^8.4.2", - "@types/prettier": "^2.6.0", - "@typescript-eslint/parser": "^5.10.0", + "@typescript-eslint/parser": "^6.7.5", "common-tags": "^1.4.0", "dlv": "^1.1.0", "eslint": "^8.7.0", "indent-string": "^4.0.0", "lodash.merge": "^4.6.0", "loglevel-colored-level-prefix": "^1.0.0", - "prettier": "^2.5.1", - "pretty-format": "^23.0.1", + "prettier": "^3.0.1", + "pretty-format": "^29.7.0", "require-relative": "^0.8.7", - "typescript": "^4.5.4", - "vue-eslint-parser": "^8.0.1" + "typescript": "^5.2.2", + "vue-eslint-parser": "^9.1.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=16.10.0" } }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/prettier-eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/prettier-eslint/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/prettier-eslint/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prettier-eslint/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-eslint/node_modules/pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - } - }, - "node_modules/prettier-eslint/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prettier-eslint/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/prettier-eslint/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -16195,6 +17460,26 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", @@ -16550,9 +17835,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.68.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.68.0.tgz", - "integrity": "sha512-Lmj9lM/fef0nQswm1J2HJcEsBUba4wgNx2fea6yJHODREoMFnwRpZydBnX/RjyXw2REIwdkbqE4hrTo4qfDBUA==", + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -16610,9 +17895,9 @@ } }, "node_modules/seroval": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-0.5.1.tgz", - "integrity": "sha512-ZfhQVB59hmIauJG5Ydynupy8KHyr5imGNtdDhbZG68Ufh1Ynkv9KOYOAABf71oVbQxJ8VkWnMHAjEHE7fWkH5g==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-0.12.3.tgz", + "integrity": "sha512-5WDeMpv7rmEylsypRj1iwRVHE/QLsMLiZ+9savlNNQEVdgGia1iRMb7qyaAagY0wu/7+QTe6d2wldk/lgaLb6g==", "dev": true, "engines": { "node": ">=10" @@ -16787,13 +18072,13 @@ } }, "node_modules/solid-js": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.7.5.tgz", - "integrity": "sha512-GfJ8na1e9FG1oAF5xC24BM+ATLym0sfH+ZblkbBFpueYdq3fWAoA5Ve+jGeIeLI7jmMGfa0rUaKruszNm2sH8w==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.5.tgz", + "integrity": "sha512-xvtJvzJzWbsn35oKFhW9kNwaxG1Z/YLMsDp4tLVcYZTMPzvzQ8vEZuyDQ6nt7xDArVgZJ7TUFrJUwrui/oq53A==", "dev": true, "dependencies": { "csstype": "^3.1.0", - "seroval": "^0.5.0" + "seroval": "^0.12.0" } }, "node_modules/solid-popper": { @@ -16838,13 +18123,17 @@ } }, "node_modules/solid-transition-group": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/solid-transition-group/-/solid-transition-group-0.2.2.tgz", - "integrity": "sha512-6nB90UM2PB6VsIo/UCkmZmlIJb9mnmP7QPGrePqQJWtpUiRs5PbhkB8fvdyv9g/RPHWYpdJhQgxL6n++WmTt5A==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/solid-transition-group/-/solid-transition-group-0.2.3.tgz", + "integrity": "sha512-iB72c9N5Kz9ykRqIXl0lQohOau4t0dhel9kjwFvx81UZJbVwaChMuBuyhiZmK24b8aKEK0w3uFM96ZxzcyZGdg==", "dev": true, "dependencies": { - "@solid-primitives/refs": "^1.0.1", - "@solid-primitives/transition-group": "^1.0.1" + "@solid-primitives/refs": "^1.0.5", + "@solid-primitives/transition-group": "^1.0.2" + }, + "engines": { + "node": ">=18.0.0", + "pnpm": ">=8.6.0" }, "peerDependencies": { "solid-js": "^1.6.12" @@ -17209,9 +18498,9 @@ } }, "node_modules/stylelint": { - "version": "15.10.3", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.3.tgz", - "integrity": "sha512-aBQMMxYvFzJJwkmg+BUUg3YfPyeuCuKo2f+LOw7yYbU8AZMblibwzp9OV4srHVeQldxvSFdz0/Xu8blq2AesiA==", + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz", + "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==", "dev": true, "dependencies": { "@csstools/css-parser-algorithms": "^2.3.1", @@ -17221,12 +18510,12 @@ "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^8.2.0", - "css-functions-list": "^3.2.0", + "css-functions-list": "^3.2.1", "css-tree": "^2.3.1", "debug": "^4.3.4", "fast-glob": "^3.3.1", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^7.0.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", @@ -17235,13 +18524,13 @@ "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.28.0", + "known-css-properties": "^0.29.0", "mathml-tag-names": "^2.1.3", "meow": "^10.1.5", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.27", + "postcss": "^8.4.28", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", "postcss-selector-parser": "^6.0.13", @@ -17279,14 +18568,14 @@ } }, "node_modules/stylelint-config-recommended-scss": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-13.0.0.tgz", - "integrity": "sha512-7AmMIsHTsuwUQm7I+DD5BGeIgCvqYZ4BpeYJJpb1cUXQwrJAKjA+GBotFZgUEGP8lAM+wmd91ovzOi8xfAyWEw==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-13.1.0.tgz", + "integrity": "sha512-8L5nDfd+YH6AOoBGKmhH8pLWF1dpfY816JtGMePcBqqSsLU+Ysawx44fQSlMOJ2xTfI9yTGpup5JU77c17w1Ww==", "dev": true, "dependencies": { - "postcss-scss": "^4.0.7", + "postcss-scss": "^4.0.9", "stylelint-config-recommended": "^13.0.0", - "stylelint-scss": "^5.1.0" + "stylelint-scss": "^5.3.0" }, "peerDependencies": { "postcss": "^8.3.3", @@ -17314,12 +18603,12 @@ } }, "node_modules/stylelint-config-standard-scss": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-11.0.0.tgz", - "integrity": "sha512-fGE79NBOLg09a9afqGH/guJulRULCaQWWv4cv1v2bMX92B+fGb0y56WqIguwvFcliPmmUXiAhKrrnXilIeXoHA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-11.1.0.tgz", + "integrity": "sha512-5gnBgeNTgRVdchMwiFQPuBOtj9QefYtfXiddrOMJA2pI22zxt6ddI2s+e5Oh7/6QYl7QLJujGnaUR5YyGq72ow==", "dev": true, "dependencies": { - "stylelint-config-recommended-scss": "^13.0.0", + "stylelint-config-recommended-scss": "^13.1.0", "stylelint-config-standard": "^34.0.0" }, "peerDependencies": { @@ -17346,9 +18635,9 @@ } }, "node_modules/stylelint-scss": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.2.1.tgz", - "integrity": "sha512-ZoTJUM85/qqpQHfEppjW/St//8s6p9Qsg8deWlYlr56F9iUgC9vXeIDQvH4odkRRJLTLFQzYMALSOFCQ3MDkgw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.3.0.tgz", + "integrity": "sha512-Sc7S1uWqStMc99NREsHNxpxHHFRvjo2pWILNl/UCwWO8PxhODK8qbJH0GHWIALxl6BD5rwJL4cSm4jk36hi6fg==", "dev": true, "dependencies": { "known-css-properties": "^0.28.0", @@ -17373,30 +18662,16 @@ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true }, - "node_modules/stylelint/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.1.tgz", + "integrity": "sha512-uLfFktPmRetVCbHe5UPuekWrQ6hENufnA46qEGbfACkK5drjTTdQYUragRgMjHldcbYG+nslUerqMPjbBSHXjQ==", "dev": true, "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "flat-cache": "^3.1.1" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=12.0.0" } }, "node_modules/stylelint/node_modules/is-plain-object": { @@ -17409,9 +18684,9 @@ } }, "node_modules/stylelint/node_modules/known-css-properties": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.28.0.tgz", - "integrity": "sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", "dev": true }, "node_modules/stylelint/node_modules/signal-exit": { @@ -18000,6 +19275,12 @@ "node": ">=0.10.0" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/uniqolor": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/uniqolor/-/uniqolor-1.1.0.tgz", @@ -18173,15 +19454,66 @@ "node": ">=12" } }, - "node_modules/vite": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", - "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "node_modules/vike": { + "version": "0.4.144", + "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.144.tgz", + "integrity": "sha512-smvBXv33IhP5FHOvoBYZuir/Zip93AoBGqiIdmWHva1RYeQDFlXQMbs/YZ5HqFc7OrL8cL3K7iUsEC6t/pF+/Q==", "dev": true, "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.23", - "rollup": "^3.21.0" + "@brillout/import": "0.2.3", + "@brillout/json-serializer": "^0.5.6", + "@brillout/picocolors": "^1.0.9", + "@brillout/require-shim": "^0.1.2", + "@brillout/vite-plugin-import-build": "^0.2.20", + "acorn": "^8.8.2", + "cac": "^6.7.14", + "es-module-lexer": "^1.3.0", + "esbuild": "^0.17.18", + "fast-glob": "^3.2.12", + "sirv": "^2.0.2", + "source-map-support": "^0.5.21" + }, + "bin": { + "vike": "node/cli/bin-entry.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "react-streaming": ">=0.3.5", + "vite": ">=3.1.0" + }, + "peerDependenciesMeta": { + "react-streaming": { + "optional": true + } + } + }, + "node_modules/vike/node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "node_modules/vike/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" }, "bin": { "vite": "bin/vite.js" @@ -18189,12 +19521,16 @@ "engines": { "node": "^14.18.0 || >=16.0.0" }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", @@ -18207,6 +19543,9 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -18258,55 +19597,463 @@ } }, "node_modules/vite-plugin-solid": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.7.0.tgz", - "integrity": "sha512-avp/Jl5zOp/Itfo67xtDB2O61U7idviaIp4mLsjhCa13PjKNasz+IID0jYTyqUp9SFx6/PmBr6v4KgDppqompg==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.7.2.tgz", + "integrity": "sha512-GV2SMLAibOoXe76i02AsjAg7sbm/0lngBlERvJKVN67HOrJsHcWgkt0R6sfGLDJuFkv2aBe14Zm4vJcNME+7zw==", "dev": true, "dependencies": { - "@babel/core": "^7.20.5", - "@babel/preset-typescript": "^7.18.6", - "@types/babel__core": "^7.1.20", - "babel-preset-solid": "^1.7.2", - "merge-anything": "^5.1.4", - "solid-refresh": "^0.5.0", - "vitefu": "^0.2.3" + "@babel/core": "^7.23.0", + "@babel/preset-typescript": "^7.23.0", + "@types/babel__core": "^7.20.2", + "babel-preset-solid": "^1.8.0", + "merge-anything": "^5.1.7", + "solid-refresh": "^0.5.3", + "vitefu": "^0.2.4" }, "peerDependencies": { "solid-js": "^1.7.2", "vite": "^3.0.0 || ^4.0.0" } }, - "node_modules/vite-plugin-ssr": { - "version": "0.4.123", - "resolved": "https://registry.npmjs.org/vite-plugin-ssr/-/vite-plugin-ssr-0.4.123.tgz", - "integrity": "sha512-lIHmvsS7xINxk8AiMn9O9q6dTeLDay0q3iRCMZd4MlzhyMcEUUuEYyx/vWevXIO7+CTt5cOVcTsojeAU+eUMNw==", + "node_modules/vite-plugin-solid/node_modules/@babel/core": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", "dev": true, "dependencies": { - "@brillout/import": "0.2.3", - "@brillout/json-serializer": "^0.5.3", - "@brillout/picocolors": "^1.0.4", - "@brillout/vite-plugin-import-build": "^0.2.16", - "acorn": "^8.0.0", - "cac": "^6.0.0", - "es-module-lexer": "^0.10.0", - "esbuild": "^0.17.0", - "fast-glob": "^3.0.0", - "sirv": "^2.0.0" - }, - "bin": { - "vite-plugin-ssr": "node/cli/bin-entry.js" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { - "node": ">=12.19.0" + "node": ">=6.9.0" }, - "peerDependencies": { - "react-streaming": ">=0.3.5", - "vite": ">=3.1.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/vite-plugin-solid/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, - "peerDependenciesMeta": { - "react-streaming": { - "optional": true - } + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, "node_modules/vitefu": { @@ -18324,21 +20071,21 @@ } }, "node_modules/vue-eslint-parser": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", - "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz", + "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==", "dev": true, "dependencies": { - "debug": "^4.3.2", - "eslint-scope": "^7.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.0.0", + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", "lodash": "^4.17.21", - "semver": "^7.3.5" + "semver": "^7.3.6" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^14.17.0 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" @@ -18409,6 +20156,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true, "engines": { "node": ">= 8" } @@ -18473,6 +20221,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", @@ -18657,12 +20446,12 @@ "dev": true }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/yaml-ast-parser": { diff --git a/package.json b/package.json index 4daeecd0..76afa070 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.8.0", "private": true, "license": "MIT", + "type": "module", "scripts": { "build": "vite build", "check": "npm run lint && npm run typecheck", @@ -35,16 +36,15 @@ "idb": "7.1.1", "intl-messageformat": "10.5.3", "just-throttle": "4.2.0", - "mailgun.js": "8.2.1", - "node-fetch": "3.3.1" + "mailgun.js": "8.2.1" }, "devDependencies": { "@babel/core": "7.21.8", - "@graphql-codegen/cli": "3.2.2", - "@graphql-codegen/typescript": "3.0.4", - "@graphql-codegen/typescript-operations": "3.0.4", - "@graphql-codegen/typescript-urql": "3.7.3", - "@graphql-codegen/urql-introspection": "2.2.1", + "@graphql-codegen/cli": "5.0.0", + "@graphql-codegen/typescript": "4.0.1", + "@graphql-codegen/typescript-operations": "4.0.1", + "@graphql-codegen/typescript-urql": "4.0.0", + "@graphql-codegen/urql-introspection": "3.0.0", "@graphql-tools/url-loader": "7.17.18", "@graphql-typed-document-node/core": "3.2.0", "@hocuspocus/provider": "2.0.6", @@ -89,27 +89,27 @@ "@tiptap/extension-text": "2.0.3", "@tiptap/extension-underline": "2.0.3", "@tiptap/extension-youtube": "2.0.3", - "@types/js-cookie": "3.0.4", - "@types/node": "20.1.1", - "@typescript-eslint/eslint-plugin": "6.7.3", - "@typescript-eslint/parser": "6.7.3", + "@types/js-cookie": "3.0.5", + "@types/node": "20.8.10", + "@typescript-eslint/eslint-plugin": "6.9.1", + "@typescript-eslint/parser": "6.9.1", "@urql/core": "3.2.2", "@urql/devtools": "2.0.3", - "babel-preset-solid": "1.7.4", + "babel-preset-solid": "1.8.4", "bootstrap": "5.3.2", "clsx": "2.0.0", "cross-env": "7.0.3", "debounce": "1.2.1", - "eslint": "8.50.0", + "eslint": "8.53.0", "eslint-config-stylelint": "20.0.0", "eslint-import-resolver-typescript": "3.6.1", - "eslint-plugin-import": "2.28.1", - "eslint-plugin-jest": "27.4.0", - "eslint-plugin-jsx-a11y": "6.7.1", + "eslint-plugin-import": "2.29.0", + "eslint-plugin-jest": "27.6.0", + "eslint-plugin-jsx-a11y": "6.8.0", "eslint-plugin-promise": "6.1.1", "eslint-plugin-solid": "0.13.0", - "eslint-plugin-sonarjs": "0.21.0", - "eslint-plugin-unicorn": "48.0.1", + "eslint-plugin-sonarjs": "0.23.0", + "eslint-plugin-unicorn": "49.0.0", "fast-deep-equal": "3.1.3", "graphql": "16.6.0", "graphql-tag": "2.12.6", @@ -120,7 +120,7 @@ "javascript-time-ago": "2.5.9", "jest": "29.7.0", "js-cookie": "3.0.5", - "lint-staged": "14.0.1", + "lint-staged": "15.0.2", "loglevel": "1.8.1", "loglevel-plugin-prefix": "0.8.4", "markdown-it": "13.0.1", @@ -130,30 +130,30 @@ "markdown-it-replace-link": "1.2.0", "nanostores": "0.7.4", "prettier": "3.0.3", - "prettier-eslint": "15.0.1", + "prettier-eslint": "16.1.2", "prosemirror-history": "1.3.0", "prosemirror-trailing-node": "2.0.3", "prosemirror-view": "1.30.2", "rollup": "3.21.6", - "sass": "1.68.0", - "solid-js": "1.7.5", + "sass": "1.69.5", + "solid-js": "1.8.5", "solid-popper": "0.3.0", "solid-tiptap": "0.6.0", - "solid-transition-group": "0.2.2", + "solid-transition-group": "0.2.3", "sort-package-json": "2.6.0", - "stylelint": "15.10.3", - "stylelint-config-standard-scss": "11.0.0", + "stylelint": "15.11.0", + "stylelint-config-standard-scss": "11.1.0", "stylelint-order": "6.0.3", - "stylelint-scss": "5.2.1", + "stylelint-scss": "5.3.0", "swiper": "9.4.1", "typescript": "5.2.2", "typograf": "7.1.0", "uniqolor": "1.1.0", - "vite": "4.3.9", + "vike": "0.4.144", + "vite": "4.5.0", "vite-plugin-mkcert": "1.16.0", "vite-plugin-sass-dts": "1.3.11", - "vite-plugin-solid": "2.7.0", - "vite-plugin-ssr": "0.4.123", + "vite-plugin-solid": "2.7.2", "y-prosemirror": "1.2.1", "yjs": "13.6.0" }, diff --git a/public/icons/check-success.svg b/public/icons/check-success.svg new file mode 100644 index 00000000..61549770 --- /dev/null +++ b/public/icons/check-success.svg @@ -0,0 +1,4 @@ + + + diff --git a/public/icons/social-facebook.svg b/public/icons/social-facebook.svg new file mode 100644 index 00000000..10e45710 --- /dev/null +++ b/public/icons/social-facebook.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/social-instagram.svg b/public/icons/social-instagram.svg new file mode 100644 index 00000000..05db9472 --- /dev/null +++ b/public/icons/social-instagram.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/social-linkedin.svg b/public/icons/social-linkedin.svg new file mode 100644 index 00000000..d0bb452e --- /dev/null +++ b/public/icons/social-linkedin.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/icons/social-telegram.svg b/public/icons/social-telegram.svg new file mode 100644 index 00000000..420cb810 --- /dev/null +++ b/public/icons/social-telegram.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/social-twitter.svg b/public/icons/social-twitter.svg new file mode 100644 index 00000000..341b6bdf --- /dev/null +++ b/public/icons/social-twitter.svg @@ -0,0 +1,4 @@ + + + diff --git a/public/icons/social-vk.svg b/public/icons/social-vk.svg new file mode 100644 index 00000000..37b3ea78 --- /dev/null +++ b/public/icons/social-vk.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/user-image-black.svg b/public/icons/user-image-black.svg new file mode 100644 index 00000000..2b7b10ef --- /dev/null +++ b/public/icons/user-image-black.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/icons/user-image-gray.svg b/public/icons/user-image-gray.svg new file mode 100644 index 00000000..a70784ec --- /dev/null +++ b/public/icons/user-image-gray.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index cad81887..d6eb744b 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -1,5 +1,4 @@ { - "...subscribing": "...subscribing", "About": "About", "About the project": "About the project", "Add a few topics so that the reader knows what your content is about and can find it on pages of topics that interest them. Topics can be swapped, the first topic becomes the title": "Add a few topics so that the reader knows what your content is about and can find it on pages of topics that interest them. Topics can be swapped, the first topic becomes the title", @@ -90,16 +89,19 @@ "Create gallery": "Create gallery", "Create post": "Create post", "Create video": "Create video", + "Culture": "Culture", "Date of Birth": "Date of Birth", "Decline": "Decline", "Delete": "Delete", "Delete cover": "Delete cover", + "Delete userpic": "Delete userpic", "Description": "Description", "Discours": "Discours", "Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects": "Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects.
We are convinced that one voice is good, but many is better. We create the most amazing stories together", "Discours is created with our common effort": "Discours exists because of our common effort", "Discussing": "Discussing", "Discussion rules": "Discussion rules", + "Discussion rules in social networks": "Discussion rules", "Discussions": "Discussions", "Dogma": "Dogma", "Draft successfully deleted": "Draft successfully deleted", @@ -120,6 +122,7 @@ "Enter your new password": "Enter your new password", "Error": "Error", "Everything is ok, please give us your email address": "It's okay, just enter your email address to receive a password reset link.", + "Experience": "Experience", "FAQ": "Tips and suggestions", "Favorite": "Favorites", "Favorite topics": "Favorite topics", @@ -148,6 +151,7 @@ "Help to edit": "Help to edit", "Here you can customize your profile the way you want.": "Here you can customize your profile the way you want.", "Here you can manage all your Discourse subscriptions": "Here you can manage all your Discourse subscriptions", + "Here you can upload your photo": "Here you can upload your photo", "Hide table of contents": "Hide table of contents", "Highlight": "Highlight", "Hooray! Welcome!": "Hooray! Welcome!", @@ -168,6 +172,7 @@ "Independant magazine with an open horizontal cooperation about culture, science and society": "Independant magazine with an open horizontal cooperation about culture, science and society", "Insert footnote": "Insert footnote", "Insert video link": "Insert video link", + "Interview": "Interview", "Introduce": "Introduction", "Invalid email": "Check if your email is correct", "Invalid image URL": "Invalid image URL", @@ -182,6 +187,7 @@ "Join the global community of authors!": "Join the global community of authors from all over the world!", "Just start typing...": "Just start typing...", "Knowledge base": "Knowledge base", + "Language": "Language", "Last rev.": "Посл. изм.", "Let's log in": "Let's log in", "Link copied": "Link copied", @@ -195,6 +201,7 @@ "Manifest": "Manifest", "Manifesto": "Manifesto", "Many files, choose only one": "Many files, choose only one", + "Mark as read": "Mark as read", "Material card": "Material card", "Message": "Message", "More": "More", @@ -227,6 +234,7 @@ "Our regular contributor": "Our regular contributor", "Paragraphs": "Абзацев", "Participating": "Participating", + "Participation": "Participation", "Partners": "Partners", "Password": "Password", "Password again": "Password again", @@ -245,6 +253,8 @@ "Please enter password": "Please enter a password", "Please enter password again": "Please enter password again", "Please, confirm email": "Please confirm email", + "Podcasts": "Podcasts", + "Poetry": "Poetry", "Popular": "Popular", "Popular authors": "Popular authors", "Principles": "Community principles", @@ -264,6 +274,7 @@ "Remove link": "Remove link", "Reply": "Reply", "Report": "Complain", + "Reports": "Reports", "Required": "Required", "Resend code": "Send confirmation", "Restore password": "Restore password", @@ -287,31 +298,36 @@ "Show table of contents": "Show table of contents", "Slug": "Slug", "Social networks": "Social networks", + "Society": "Society", "Something went wrong, check email and password": "Something went wrong. Check your email and password", "Something went wrong, please try again": "Something went wrong, please try again", "Song lyrics": "Song lyrics...", "Song title": "Song title", "Sorry, this address is already taken, please choose another one.": "Sorry, this address is already taken, please choose another one", + "Special Projects": "Special Projects", "Special projects": "Special projects", "Specify the source and the name of the author": "Specify the source and the name of the author", "Start conversation": "Start a conversation", "Subsccriptions": "Subscriptions", "Subscribe": "Subscribe", + "Subscribe to the best publications newsletter": "Subscribe to the best publications newsletter", "Subscribe us": "Subscribe us", "Subscribe what you like to tune your personal feed": "Subscribe to topics that interest you to customize your personal feed and get instant updates on new posts and discussions", "Subscribe who you like to tune your personal feed": "Subscribe to authors you're interested in to customize your personal feed and get instant updates on new posts and discussions", - "SubscriberWithCount": "{count, plural, =0 {no followers} one {{count} follower} other {{count} followers}", + "SubscriberWithCount": "{count, plural, =0 {no followers} one {{count} follower} other {{count} followers}}", "Subscription": "Subscription", - "SubscriptionWithCount": "{count, plural, =0 {no subscriptions} one {{count} subscription} other {{count} subscriptions}", + "SubscriptionWithCount": "{count, plural, =0 {no subscriptions} one {{count} subscription} other {{count} subscriptions}}", "Subscriptions": "Subscriptions", "Substrate": "Substrate", "Success": "Success", "Successfully authorized": "Authorization successful", "Suggest an idea": "Suggest an idea", + "Support the project": "Support the project", "Support us": "Help the magazine", "Terms of use": "Site rules", "Text checking": "Text checking", "Thank you": "Thank you", + "Theory": "Theory", "There are unsaved changes in your profile settings. Are you sure you want to leave the page without saving?": "There are unsaved changes in your profile settings. Are you sure you want to leave the page without saving?", "There are unsaved changes in your publishing settings. Are you sure you want to leave the page without saving?": "There are unsaved changes in your publishing settings. Are you sure you want to leave the page without saving?", "This comment has not yet been rated": "This comment has not yet been rated", @@ -339,6 +355,7 @@ "Unnamed draft": "Unnamed draft", "Upload": "Upload", "Upload error": "Upload error", + "Upload userpic": "Upload userpic", "Upload video": "Upload video", "Uploading image": "Uploading image", "Username": "Username", @@ -375,7 +392,6 @@ "You've reached a non-existed page": "You've reached a non-existed page", "Your email": "Your email", "Your name will appear on your profile page and as your signature in publications, comments and responses.": "Your name will appear on your profile page and as your signature in publications, comments and responses", - "accomplices": "accomplices", "actions": "actions", "add link": "add link", "all topics": "all topics", @@ -399,7 +415,6 @@ "feed": "feed", "follower": "follower", "followersWithCount": "{count} {count, plural, one {follower} other {followers}}", - "general feed": "general tape", "header 1": "header 1", "header 2": "header 2", "header 3": "header 3", @@ -426,6 +441,7 @@ "subscriber": "subscriber", "subscriber_rp": "subscriber", "subscribers": "subscribers", + "subscribing...": "subscribing...", "subscription": "subscription", "subscription_rp": "subscription", "subscriptions": "subscriptions", @@ -435,5 +451,6 @@ "user already exist": "user already exists", "video": "video", "view": "view", + "viewsWithCount": "{count} {count, plural, one {view} other {views}}", "yesterday": "yesterday" } diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index 07af69c1..3640e6a3 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -1,9 +1,7 @@ { - "...subscribing": "...подписываем", "A short introduction to keep the reader interested": "Добавьте вступление, чтобы заинтересовать читателя", "About": "О себе", "About the project": "О проекте", - "Accomplices": "Соучастники", "Add a few topics so that the reader knows what your content is about and can find it on pages of topics that interest them. Topics can be swapped, the first topic becomes the title": "Добавьте несколько тем, чтобы читатель знал, о чем ваш материал, и мог найти его на страницах интересных ему тем. Темы можно менять местами, первая тема становится заглавной", "Add a link or click plus to embed media": "Добавьте ссылку или нажмите плюс для вставки медиа", "Add an embed widget": "Добавить embed-виджет", @@ -94,16 +92,19 @@ "Create gallery": "Создать галерею", "Create post": "Создать публикацию", "Create video": "Создать видео", + "Culture": "Культура", "Date of Birth": "Дата рождения", "Decline": "Отмена", "Delete": "Удалить", "Delete cover": "Удалить обложку", + "Delete userpic": "Удалить аватар", "Description": "Описание", "Discours": "Дискурс", "Discours is an intellectual environment, a web space and tools that allows authors to collaborate with readers and come together to co-create publications and media projects": "Дискурс — это интеллектуальная среда, веб-пространство и инструменты, которые позволяют авторам сотрудничать с читателями и объединяться для совместного создания публикаций и медиапроектов.
Мы убеждены, один голос хорошо, а много — лучше. Самые потрясающиe истории мы создаём вместе.", "Discours is created with our common effort": "Дискурс существует благодаря нашему общему вкладу", "Discussing": "Обсуждаемое", - "Discussion rules": "Правила сообществ самиздата в соцсетях", + "Discussion rules": "Правила дискуссий", + "Discussion rules in social networks": "Правила сообществ самиздата в соцсетях", "Discussions": "Дискуссии", "Dogma": "Догма", "Draft successfully deleted": "Черновик успешно удален", @@ -125,6 +126,7 @@ "Enter your new password": "Введите новый пароль", "Error": "Ошибка", "Everything is ok, please give us your email address": "Ничего страшного, просто укажите свою почту, чтобы получить ссылку для сброса пароля.", + "Experience": "Личный опыт", "FAQ": "Советы и предложения", "Favorite": "Избранное", "Favorite topics": "Избранные темы", @@ -156,6 +158,7 @@ "Help to edit": "Помочь редактировать", "Here you can customize your profile the way you want.": "Здесь можно настроить свой профиль так, как вы хотите.", "Here you can manage all your Discourse subscriptions": "Здесь можно управлять всеми своими подписками на Дискурсе", + "Here you can upload your photo": "Здесь вы можете загрузить свою фотографию", "Hide table of contents": "Скрыть главление", "Highlight": "Подсветка", "Hooray! Welcome!": "Ура! Добро пожаловать!", @@ -176,6 +179,7 @@ "Independant magazine with an open horizontal cooperation about culture, science and society": "Независимый журнал с открытой горизонтальной редакцией о культуре, науке и обществе", "Insert footnote": "Вставить сноску", "Insert video link": "Вставить ссылку на видео", + "Interview": "Интервью", "Introduce": "Представление", "Invalid email": "Проверьте правильность ввода почты", "Invalid image URL": "Некорректная ссылка на изображение", @@ -192,6 +196,7 @@ "Just start typing...": "Просто начните печатать...", "Karma": "Карма", "Knowledge base": "База знаний", + "Language": "Язык", "Last rev.": "Посл. изм.", "Let's log in": "Давайте авторизуемся", "Link copied": "Ссылка скопирована", @@ -205,6 +210,7 @@ "Manifest": "Манифест", "Manifesto": "Манифест", "Many files, choose only one": "Много файлов, выберете один", + "Mark as read": "Отметить прочитанным", "Material card": "Карточка материала", "Message": "Написать", "More": "Ещё", @@ -238,6 +244,7 @@ "Our regular contributor": "Наш постоянный автор", "Paragraphs": "Абзацев", "Participating": "Участвовать", + "Participation": "Соучастие", "Partners": "Партнёры", "Password": "Пароль", "Password again": "Пароль ещё раз", @@ -256,6 +263,8 @@ "Please enter password": "Пожалуйста, введите пароль", "Please enter password again": "Пожалуйста, введите пароль ещё рез", "Please, confirm email": "Пожалуйста, подтвердите электронную почту", + "Podcasts": "Подкасты", + "Poetry": "Поэзия", "Popular": "Популярное", "Popular authors": "Популярные авторы", "Preview": "Предпросмотр", @@ -280,6 +289,7 @@ "Remove link": "Убрать ссылку", "Reply": "Ответить", "Report": "Пожаловаться", + "Reports": "Репортажи", "Required": "Поле обязательно для заполнения", "Resend code": "Выслать подтверждение", "Restore password": "Восстановить пароль", @@ -305,17 +315,20 @@ "Show table of contents": "Показать главление", "Slug": "Постоянная ссылка", "Social networks": "Социальные сети", + "Society": "Общество", "Something went wrong, check email and password": "Что-то пошло не так. Проверьте адрес электронной почты и пароль", "Something went wrong, please try again": "Что-то пошло не так, попробуйте еще раз", "Song lyrics": "Текст песни...", "Song title": "Название песни", "Sorry, this address is already taken, please choose another one.": "Увы, этот адрес уже занят, выберите другой", + "Special Projects": "Спецпроекты", "Special projects": "Спецпроекты", "Specify the source and the name of the author": "Укажите источник и имя автора", "Start conversation": "Начать беседу", "Subheader": "Подзаголовок", "Subscribe": "Подписаться", "Subscribe to comments": "Подписаться на комментарии", + "Subscribe to the best publications newsletter": "Подпишитесь на рассылку лучших публикаций", "Subscribe us": "Подпишитесь на нас", "Subscribe what you like to tune your personal feed": "Подпишитесь на интересующие вас темы, чтобы настроить вашу персональную ленту и моментально узнавать о новых публикациях и обсуждениях", "Subscribe who you like to tune your personal feed": "Подпишитесь на интересующих вас авторов, чтобы настроить вашу персональную ленту и моментально узнавать о новых публикациях и обсуждениях", @@ -327,10 +340,12 @@ "Success": "Успешно", "Successfully authorized": "Авторизация успешна", "Suggest an idea": "Предложить идею", + "Support the project": "Поддержать проект", "Support us": "Помочь журналу", "Terms of use": "Правила сайта", "Text checking": "Проверка текста", "Thank you": "Благодарности", + "Theory": "Теории", "There are unsaved changes in your profile settings. Are you sure you want to leave the page without saving?": "В настройках вашего профиля есть несохраненные изменения. Уверены, что хотите покинуть страницу без сохранения?", "There are unsaved changes in your publishing settings. Are you sure you want to leave the page without saving?": "В настройках публикации есть несохраненные изменения. Уверены, что хотите покинуть страницу без сохранения?", "This comment has not yet been rated": "Этот комментарий еще пока никто не оценил", @@ -358,6 +373,7 @@ "Unnamed draft": "Черновик без названия", "Upload": "Загрузить", "Upload error": "Ошибка загрузки", + "Upload userpic": "Загрузить аватар", "Upload video": "Загрузить видео", "Uploading image": "Загружаем изображение", "Username": "Имя пользователя", @@ -422,7 +438,6 @@ "feed": "лента", "follower": "подписчик", "followersWithCount": "{count} {count, plural, one {подписчик} few {подписчика} other {подписчиков}}", - "general feed": "Общая лента", "header 1": "заголовок 1", "header 2": "заголовок 2", "header 3": "заголовок 3", @@ -453,11 +468,13 @@ "subscriber": "подписчик", "subscriber_rp": "подписчика", "subscribers": "подписчиков", + "subscribing...": "Подписка...", "terms of use": "правилами пользования сайтом", "today": "сегодня", "topics": "темы", "user already exist": "пользователь уже существует", "video": "видео", "view": "просмотр", + "viewsWithCount": "{count} {count, plural, one {просмотр} few {просмотрa} other {просмотров}}", "yesterday": "вчера" } diff --git a/src/components/Article/Article.module.scss b/src/components/Article/Article.module.scss index c9d72f1e..ed15b000 100644 --- a/src/components/Article/Article.module.scss +++ b/src/components/Article/Article.module.scss @@ -1,11 +1,13 @@ h1 { @include font-size(4rem); + line-height: 1.1; margin-top: 0.5em; } h2 { @include font-size(4rem); + line-height: 1.1; } @@ -34,10 +36,12 @@ img { img { display: block; margin-bottom: 0.5em; + cursor: zoom-in; } blockquote, blockquote[data-type='punchline'] { + clear: both; font-size: 2.6rem; font-weight: bold; line-height: 1.4; @@ -61,6 +65,7 @@ img { ta-quotation { border: solid #000; border-width: 0 0 0 2px; + clear: both; display: block; font-weight: 500; line-height: 1.6; @@ -71,6 +76,10 @@ img { &[data-float='right'] { @include font-size(2.2rem); line-height: 1.4; + + @include media-breakpoint-up(sm) { + clear: none; + } } @include media-breakpoint-up(sm) { @@ -92,9 +101,11 @@ img { ta-sub, ta-selection-frame, ta-border-sub { - background: #f1f2f3; - display: block; @include font-size(1.4rem); + + background: #f1f2f3; + clear: both; + display: block; margin: 3.2rem 0; padding: 3.2rem; @@ -173,15 +184,17 @@ img { :global(.img-align-left) { float: left; - margin: 1em 8.3333% 1.5em 0; + margin: 0 8.3333% 1.5em 0; } - :global(.width-30) { - width: 30%; - } + @include media-breakpoint-up(sm) { + :global(.width-30) { + width: 30%; + } - :global(.width-50) { - width: 50%; + :global(.width-50) { + width: 50%; + } } :global(.img-align-left.width-50) { @@ -191,13 +204,15 @@ img { } :global(.img-align-right) { - float: right; - margin: 1em 0 1.5em 8.3333%; + @include media-breakpoint-up(sm) { + float: right; + margin: 1em 0 1.5em 8.3333%; + } } :global(.img-align-right.width-50) { @include media-breakpoint-up(xl) { - margin-right: -16.6666%; + margin-right: -8.3333%; } } @@ -240,7 +255,6 @@ img { .shoutAuthorsList { border-bottom: 1px solid #e8e8e8; margin: 2em 0; - padding-bottom: 2em; h4 { color: #696969; @@ -296,22 +310,24 @@ img { display: flex; justify-content: flex-start; padding: 3rem 0 0; + position: relative; - @include media-breakpoint-down(sm) { + @include media-breakpoint-down(lg) { flex-wrap: wrap; } } .shoutStatsItem { @include font-size(1.5rem); + align-items: center; font-weight: 500; display: flex; - margin: 0 6% 1em 0; + margin: 0 2rem 1em 0; vertical-align: baseline; cursor: pointer; - @include media-breakpoint-up(sm) { + @include media-breakpoint-up(xl) { margin-right: 3.2rem; } @@ -355,6 +371,14 @@ img { } } +.shoutStatsItemBookmarks { + margin-left: auto; + + @include media-breakpoint-up(lg) { + margin-left: 0; + } +} + .shoutStatsItemInner { cursor: pointer; @@ -378,31 +402,71 @@ img { .shoutStatsItemAdditionalData { color: rgb(0 0 0 / 40%); + cursor: default; font-weight: normal; justify-self: flex-end; - margin-right: 0; - margin-left: auto; white-space: nowrap; - cursor: default; .icon { opacity: 0.4; height: 2rem; } - @include media-breakpoint-down(sm) { + @include media-breakpoint-down(lg) { flex: 1 100%; + order: 9; + + .shoutStatsItemAdditionalDataItem { + margin-left: 0; + } } } .shoutStatsItemViews { + color: rgb(0 0 0 / 0.4); cursor: default; + font-weight: normal; + margin-left: auto; + white-space: nowrap; + + @include media-breakpoint-down(lg) { + bottom: 0; + flex: 1 40%; + justify-content: end; + margin-right: 0; + order: 10; + position: absolute; + right: 0; + + .icon { + display: none !important; + } + } +} + +.shoutStatsItemLabel { + font-weight: normal; + margin-left: 0.3em; +} + +.commentsTextLabel { + display: none; + + @include media-breakpoint-up(sm) { + display: block; + } +} + +.shoutStatsItemCount { + @include media-breakpoint-down(lg) { + display: none; + } } .shoutStatsItemAdditionalDataItem { font-weight: normal; display: inline-block; - margin-left: 2rem; + //margin-left: 2rem; margin-right: 0; margin-bottom: 0; cursor: default; @@ -416,6 +480,7 @@ img { .topicsList { @include font-size(1.2rem); + border-bottom: 1px solid #e8e8e8; letter-spacing: 0.08em; margin-top: 1.6rem; @@ -455,12 +520,15 @@ img { } .commentsHeaderWrapper { - display: flex; - justify-content: space-between; + @include media-breakpoint-up(sm) { + display: flex; + justify-content: space-between; + } } .commentsHeader { @include font-size(2.4rem); + margin-bottom: 1em; .newReactions { @@ -494,6 +562,7 @@ img { button { @include font-size(1.5rem); + border-radius: 0.8rem; margin-right: 1.2rem; padding: 0.9rem 1.2rem; @@ -575,13 +644,14 @@ a[data-toggle='tooltip'] { width: 0; height: 0; border-style: solid; - border-width: 4px 4px 0 4px; + border-width: 4px 4px 0; border-color: var(--black-500) transparent transparent transparent; } } .lead { @include font-size(1.8rem); + font-weight: 600; b, @@ -589,3 +659,19 @@ a[data-toggle='tooltip'] { font-weight: 700; } } + +.articlePopupOpener { + .iconHover { + display: none; + } + + &:hover { + .icon { + display: none; + } + + .iconHover { + display: inline-block; + } + } +} diff --git a/src/components/Article/AudioHeader/AudioHeader.tsx b/src/components/Article/AudioHeader/AudioHeader.tsx index 09f80bd9..ac8f38d4 100644 --- a/src/components/Article/AudioHeader/AudioHeader.tsx +++ b/src/components/Article/AudioHeader/AudioHeader.tsx @@ -1,11 +1,11 @@ import { clsx } from 'clsx' import styles from './AudioHeader.module.scss' -import { imageProxy } from '../../../utils/imageProxy' import { MediaItem } from '../../../pages/types' import { createSignal, Show } from 'solid-js' import { Icon } from '../../_shared/Icon' import { Topic } from '../../../graphql/types.gen' import { CardTopic } from '../../Feed/CardTopic' +import { Image } from '../../_shared/Image' type Props = { title: string @@ -19,7 +19,7 @@ export const AudioHeader = (props: Props) => { return (
- {props.title} + {props.title}
@@ -190,6 +181,7 @@ export const Comment = (props: Props) => { placeholder={t('Write a comment...')} onSubmit={(value) => handleUpdate(value)} submitByCtrlEnter={true} + onCancel={() => setEditMode(false)} setClear={clearEditor()} /> @@ -197,7 +189,7 @@ export const Comment = (props: Props) => {
-
+
+ } + />
-
- + + +
- - +
+
+ +
- -
+
+
@@ -437,9 +485,9 @@ export const FullArticle = (props: Props) => {

{t('Authors')}

- {(a) => ( + {(author) => (
- +
)}
@@ -456,6 +504,9 @@ export const FullArticle = (props: Props) => {
+ + + ) } diff --git a/src/components/Author/AhtorLink/AhtorLink.module.scss b/src/components/Author/AhtorLink/AhtorLink.module.scss new file mode 100644 index 00000000..1cb84379 --- /dev/null +++ b/src/components/Author/AhtorLink/AhtorLink.module.scss @@ -0,0 +1,51 @@ +.AuthorLink { + .link { + display: inline-flex; + flex-flow: row nowrap; + align-items: center; + gap: 1rem; + justify-content: center; + padding: 0; + border-bottom: none; + vertical-align: text-bottom; + + &:hover { + background: unset !important; + border-bottom: none; + color: var(--default-color) !important; + } + + .name { + font-weight: 500; + line-height: 1; + margin-bottom: -2px; + + &:hover { + color: var(--default-color-invert); + background: var(--background-color-invert); + } + } + } + + // adjust size + &.XS { + .link { + gap: 0.5rem; + } + + .name { + font-size: 1.2rem; + margin: 0; + } + } + + &.M { + .link { + gap: 1rem; + } + + .name { + font-size: 1.4rem; + } + } +} diff --git a/src/components/Author/AhtorLink/AuthorLink.tsx b/src/components/Author/AhtorLink/AuthorLink.tsx new file mode 100644 index 00000000..ddc10cf4 --- /dev/null +++ b/src/components/Author/AhtorLink/AuthorLink.tsx @@ -0,0 +1,21 @@ +import { clsx } from 'clsx' +import styles from './AhtorLink.module.scss' +import { Author } from '../../../graphql/types.gen' +import { Userpic } from '../Userpic' + +type Props = { + author: Author + size?: 'XS' | 'M' | 'L' + class?: string +} + +export const AuthorLink = (props: Props) => { + return ( +
+ + +
{props.author.name}
+
+
+ ) +} diff --git a/src/components/Author/AhtorLink/index.ts b/src/components/Author/AhtorLink/index.ts new file mode 100644 index 00000000..05f585a3 --- /dev/null +++ b/src/components/Author/AhtorLink/index.ts @@ -0,0 +1 @@ +export { AuthorLink } from './AuthorLink' diff --git a/src/components/Author/AuthorBadge/AuthorBadge.module.scss b/src/components/Author/AuthorBadge/AuthorBadge.module.scss index da653817..f119cb5d 100644 --- a/src/components/Author/AuthorBadge/AuthorBadge.module.scss +++ b/src/components/Author/AuthorBadge/AuthorBadge.module.scss @@ -1,26 +1,44 @@ .AuthorBadge { align-items: flex-start; display: flex; - flex-flow: row nowrap; - margin-bottom: 2rem; + gap: 1rem; + margin-bottom: 3rem; - @include media-breakpoint-down(sm) { - flex-wrap: wrap; - margin-bottom: 3rem; + &.nameOnly { + align-items: center; + + .info { + margin-bottom: 0; + } + } + + @include media-breakpoint-up(sm) { + margin-bottom: 2rem; } @include media-breakpoint-down(md) { text-align: left; } + .basicInfo { + display: flex; + flex-direction: row; + align-items: center; + flex: 0 calc(100% - 5.2rem); + gap: 1rem; + + @include media-breakpoint-down(sm) { + flex: 0 100%; + } + } + .info { @include font-size(1.4rem); + border: none; display: flex; - flex: 0 calc(100% - 5.2rem); flex-direction: column; line-height: 1.3; - margin-bottom: 1rem; @include media-breakpoint-up(sm) { flex: 1 100%; @@ -33,6 +51,11 @@ .name { color: var(--default-color); font-weight: 500; + + & span:hover { + color: var(--default-color-invert); + background: var(--background-color-invert); + } } .bio { @@ -42,7 +65,14 @@ .actions { flex: 0 20%; + display: flex; + flex-direction: row; margin-left: 5.2rem; + gap: 1rem; + + @include media-breakpoint-down(sm) { + margin-left: 0; + } @include media-breakpoint-up(sm) { margin-left: 2rem; @@ -56,9 +86,33 @@ } } - .subscribeButton { + .actionButton { border-radius: 0.8rem !important; margin-right: 0 !important; width: 9em; + + &.iconed { + padding: 6px !important; + min-width: 4rem; + width: unset; + + &:hover img { + filter: invert(1); + } + } + + &:hover { + .actionButtonLabel { + display: none; + } + + .actionButtonLabelHovered { + display: block; + } + } + } + + .actionButtonLabelHovered { + display: none; } } diff --git a/src/components/Author/AuthorBadge/AuthorBadge.tsx b/src/components/Author/AuthorBadge/AuthorBadge.tsx index e8730fb3..74b49154 100644 --- a/src/components/Author/AuthorBadge/AuthorBadge.tsx +++ b/src/components/Author/AuthorBadge/AuthorBadge.tsx @@ -1,5 +1,6 @@ import { clsx } from 'clsx' import styles from './AuthorBadge.module.scss' +import stylesButton from '../../_shared/Button/Button.module.scss' import { Userpic } from '../Userpic' import { Author, FollowingEntity } from '../../../graphql/types.gen' import { createMemo, createSignal, Match, Show, Switch } from 'solid-js' @@ -8,22 +9,29 @@ import { Button } from '../../_shared/Button' import { useSession } from '../../../context/session' import { follow, unfollow } from '../../../stores/zine/common' import { CheckButton } from '../../_shared/CheckButton' +import { openPage } from '@nanostores/router' +import { router, useRouter } from '../../../stores/router' +import { Icon } from '../../_shared/Icon' type Props = { author: Author minimizeSubscribeButton?: boolean + showMessageButton?: boolean + iconButtons?: boolean + nameOnly?: boolean } export const AuthorBadge = (props: Props) => { const [isSubscribing, setIsSubscribing] = createSignal(false) const { session, - actions: { loadSession, requireAuthentication } + subscriptions, + actions: { loadSubscriptions, requireAuthentication } } = useSession() - + const { changeSearchParam } = useRouter() const { t, formatDate } = useLocalize() - const subscribed = createMemo(() => { - return session()?.news?.authors?.some((u) => u === props.author.slug) || false - }) + const subscribed = createMemo(() => + subscriptions().authors.some((author) => author.slug === props.author.slug) + ) const subscribe = async (really = true) => { setIsSubscribing(true) @@ -32,7 +40,7 @@ export const AuthorBadge = (props: Props) => { ? follow({ what: FollowingEntity.Author, slug: props.author.slug }) : unfollow({ what: FollowingEntity.Author, slug: props.author.slug })) - await loadSession() + await loadSubscriptions() setIsSubscribing(false) } const handleSubscribe = (really: boolean) => { @@ -41,35 +49,69 @@ export const AuthorBadge = (props: Props) => { }, 'subscribe') } + const initChat = () => { + requireAuthentication(() => { + openPage(router, `inbox`) + changeSearchParam({ + initChat: props.author.id.toString() + }) + }, 'discussions') + } + const subscribeValue = createMemo(() => { + if (props.iconButtons) { + return + } + return isSubscribing() ? t('subscribing...') : t('Subscribe') + }) + + const unsubscribeValue = () => { + if (props.iconButtons) { + return + } + + return ( + <> + {t('Following')} + {t('Unfollow')} + + ) + } + return ( - - } - > - -
- - 0}> -
- {t('PublicationsWithCount', { count: props.author.stat?.shouts ?? 0 })} -
-
- -
- +
+ + } + > + + +
{ when={subscribed()} fallback={
diff --git a/src/components/Author/AuthorCard/AuthorCard.module.scss b/src/components/Author/AuthorCard/AuthorCard.module.scss index 52b0d3d1..eee554b7 100644 --- a/src/components/Author/AuthorCard/AuthorCard.module.scss +++ b/src/components/Author/AuthorCard/AuthorCard.module.scss @@ -8,10 +8,50 @@ margin-bottom: 0; } + @include media-breakpoint-down(md) { + justify-content: center; + } + @include media-breakpoint-up(md) { margin-bottom: 2.4rem; } + .authorName { + @include font-size(4rem); + + font-weight: 700; + margin-bottom: 0.2em; + } + + .authorAbout { + @include font-size(2rem); + + color: #696969; + font-weight: 500; + margin-top: 1.5rem; + } + + .authorActions { + margin: 2rem -0.8rem 0 0; + padding-left: 0; + display: flex; + flex-direction: row; + gap: 1rem; + + @include media-breakpoint-down(md) { + justify-content: center; + } + } + + .authorDetails { + display: block; + + @include media-breakpoint-down(md) { + flex: 1 100%; + text-align: center; + } + } + .listWrapper & { align-items: flex-start; margin-bottom: 2rem; @@ -36,10 +76,16 @@ @include media-breakpoint-down(lg) { flex-wrap: wrap; } + + .buttonWriteMessage { + border-radius: 0.8rem; + padding-bottom: 0.6rem; + padding-top: 0.6rem; + } } .authorDetails { - flex: 1; + flex: 0 0 auto; @include media-breakpoint-up(sm) { align-items: center; @@ -57,10 +103,6 @@ flex-wrap: nowrap; } } - - &.authorDetailsShrinked { - flex: 0 0 auto; - } } .authorDetailsWrapper { @@ -84,29 +126,10 @@ } } -.authorNameContainer { - line-height: 1.1; -} - .authorName { - border: none !important; - font-size: 1.6rem; - font-weight: 500; - margin-bottom: 0.8rem; + @include font-size(4rem); - .listWrapper & { - display: block; - - &:before { - content: ''; - height: 100%; - left: 0; - position: absolute; - top: 0; - width: 100%; - z-index: 2; - } - } + line-height: 1.1; } .authorAbout { @@ -117,42 +140,6 @@ word-break: break-word; } -.authorSubscribe { - align-items: center; - - @include media-breakpoint-down(md) { - flex-wrap: wrap; - } - - .button { - padding-left: 2rem; - padding-right: 2rem; - margin-right: 0.5em; - - &:first-of-type { - margin-left: 0; - } - - &:last-child { - margin-right: 0; - } - - &:hover { - .buttonUnfollowLabel { - display: block; - } - - .buttonSubscribedLabel { - display: none; - } - } - - .buttonUnfollowLabel { - display: none; - } - } -} - .authorSubscribeSocialLabel { display: none; } @@ -195,9 +182,10 @@ } .authorSubscribeSocialLabel { + @include font-size(1.6rem); + color: #000; display: block; - @include font-size(1.6rem); left: 100%; padding-left: 0.4rem; position: absolute; @@ -228,7 +216,8 @@ } } - &[href*='telegram.com/'] { + &[href*='telegram.com/'], + &[href*='t.me/'] { &::before { background-image: url(/icons/user-link-telegram.svg); } @@ -426,208 +415,6 @@ } } -.shareControl { - display: inline-block; -} - -.buttonSubscribe { - align-items: center; - aspect-ratio: 1/1; - border-radius: 100%; - display: inline-flex; - float: right; - - img { - display: block; - } -} - -.buttonLabel { - display: none; -} - -.buttonLabelVisible { - display: block; -} - -.buttonWrite { - background: #ccc; - color: #000; - display: inline-flex; - font-weight: 500; - transition: - background-color 0.3s, - color 0.3s; - - &:hover { - background: #000; - color: #fff; - - img { - filter: invert(1); - } - } - - .icon { - display: inline-block; - margin-right: 0.5em; - } - - img { - height: 15px; - transition: filter 0.3s; - } -} - -.authorPage { - align-items: center; - - @include media-breakpoint-down(md) { - justify-content: center; - } - - .authorName { - @include font-size(4rem); - font-weight: 700; - margin-bottom: 0.2em; - } - - .authorAbout { - color: #696969; - @include font-size(2rem); - font-weight: 500; - margin-top: 1.5rem; - } - - .authorSubscribe { - margin: 2rem -0.8rem 0 0; - padding-left: 0; - - @include media-breakpoint-down(md) { - justify-content: center; - } - } - - .authorDetails { - display: block; - - @include media-breakpoint-down(md) { - flex: 1 100%; - text-align: center; - } - } - - .buttonLabel { - display: block; - } - - .buttonSubscribe { - aspect-ratio: auto; - background-color: #000; - border-color: #000; - border-radius: 0.8rem; - color: #fff; - float: none; - padding-bottom: 0.6rem; - padding-top: 0.6rem; - width: 10em; - - .icon { - margin-right: 0.5em; - - img { - filter: invert(1); - } - } - - &:hover { - background: #fff; - color: #000; - - .icon img { - filter: invert(0); - } - } - } - - .buttonSubscribe img { - vertical-align: text-top; - } - - .button { - min-height: 4rem; - margin: 0 0.8rem 0 0; - vertical-align: middle; - - @include media-breakpoint-down(sm) { - margin-bottom: 0.5em; - } - } -} - -.authorsListItem { - margin-bottom: 1em !important; - - .authorName { - @include font-size(2.2rem); - - font-weight: bold; - } - - .authorSubscribe { - align-items: baseline; - - @include media-breakpoint-down(sm) { - padding: 1rem 0 0; - } - } - - .buttonLabel { - display: block; - } -} - -.nowrapView { - flex-wrap: nowrap; - align-items: center; - margin: 0; -} - -.authorComments { - .authorName { - @include font-size(1.2rem); - line-height: 1.2; - margin-bottom: 0; - } - - .circlewrap { - margin-top: -0.4em; - } -} - -.isSubscribing { - opacity: 0.5; -} - -.feedMode { - align-items: center; - margin-bottom: 0.4rem; - - .authorName, - .authorAbout { - @include font-size(1.2rem); - - margin-bottom: 0; - } - - .circlewrap { - height: 1.6rem; - margin-right: 0.4rem; - min-width: 1.6rem; - width: 1.6rem; - } -} - .subscribersContainer { display: flex; flex-wrap: wrap; @@ -648,33 +435,35 @@ vertical-align: top; border-bottom: unset !important; - &:last-child { - margin-right: 0; - } + .subscribersItem { + position: relative; - .userpic { - background: var(--background-color); - box-shadow: 0 0 0 2px var(--background-color); - height: 1.8rem; - min-width: 1.8rem; - max-width: 1.8rem; - vertical-align: top; - width: 1.8rem; - - &:not(:first-child) { - margin-left: -1.8rem; + &:nth-child(1) { + z-index: 2; } - > * { - line-height: 1.8rem; - min-width: auto; + &:nth-child(2) { + z-index: 1; + } + + &:not(:last-child) { + margin-right: -4px; + box-shadow: 0 0 0 1px var(--background-color); } } -} -.subscribersCounter { - font-weight: 500; - margin-left: -0.6rem; + .subscribersCounter { + font-weight: 500; + margin-left: 1rem; + } + + &:hover { + background: none !important; + + .subscribersCounter { + background: var(--background-color-invert); + } + } } .listWrapper { diff --git a/src/components/Author/AuthorCard/AuthorCard.tsx b/src/components/Author/AuthorCard/AuthorCard.tsx index 9ac66a04..432bc5ef 100644 --- a/src/components/Author/AuthorCard/AuthorCard.tsx +++ b/src/components/Author/AuthorCard/AuthorCard.tsx @@ -1,6 +1,5 @@ import type { Author } from '../../../graphql/types.gen' import { Userpic } from '../Userpic' -import { Icon } from '../../_shared/Icon' import { createEffect, createMemo, createSignal, For, Show } from 'solid-js' import { translit } from '../../../utils/ru2en' import { follow, unfollow } from '../../../stores/zine/common' @@ -11,7 +10,6 @@ import { FollowingEntity, Topic } from '../../../graphql/types.gen' import { router, useRouter } from '../../../stores/router' import { openPage, redirectPage } from '@nanostores/router' import { useLocalize } from '../../../context/localize' -import { ConditionalWrapper } from '../../_shared/ConditionalWrapper' import { Modal } from '../../Nav/Modal' import { SubscriptionFilter } from '../../../pages/types' import { isAuthor } from '../../../utils/isAuthor' @@ -20,48 +18,30 @@ import { TopicBadge } from '../../Topic/TopicBadge' import { Button } from '../../_shared/Button' import { getShareUrl, SharePopup } from '../../Article/SharePopup' import styles from './AuthorCard.module.scss' +import stylesButton from '../../_shared/Button/Button.module.scss' type Props = { - caption?: string - hideWriteButton?: boolean - hideDescription?: boolean - hideFollow?: boolean - hasLink?: boolean - subscribed?: boolean author: Author - isAuthorPage?: boolean - noSocialButtons?: boolean - isAuthorsList?: boolean - truncateBio?: boolean - liteButtons?: boolean - isTextButton?: boolean - isComments?: boolean - isFeedMode?: boolean - isNowrap?: boolean - class?: string followers?: Author[] following?: Array - showPublicationsCounter?: boolean - hideBio?: boolean - isCurrentUser?: boolean } export const AuthorCard = (props: Props) => { const { t, lang } = useLocalize() const { session, + subscriptions, isSessionLoaded, - actions: { loadSession, requireAuthentication } + actions: { loadSubscriptions, requireAuthentication } } = useSession() const [isSubscribing, setIsSubscribing] = createSignal(false) const [following, setFollowing] = createSignal>(props.following) const [subscriptionFilter, setSubscriptionFilter] = createSignal('all') - const [userpicUrl, setUserpicUrl] = createSignal() - const subscribed = createMemo(() => { - return session()?.news?.authors?.some((u) => u === props.author.slug) || false - }) + const subscribed = createMemo(() => + subscriptions().authors.some((author) => author.slug === props.author.slug) + ) const subscribe = async (really = true) => { setIsSubscribing(true) @@ -70,11 +50,11 @@ export const AuthorCard = (props: Props) => { ? follow({ what: FollowingEntity.Author, slug: props.author.slug }) : unfollow({ what: FollowingEntity.Author, slug: props.author.slug })) - await loadSession() + await loadSubscriptions() setIsSubscribing(false) } - const canFollow = createMemo(() => !props.hideFollow && session()?.user?.slug !== props.author.slug) + const isProfileOwner = createMemo(() => session()?.user?.slug === props.author.slug) const name = createMemo(() => { if (lang() !== 'ru') { @@ -101,7 +81,7 @@ export const AuthorCard = (props: Props) => { const handleSubscribe = () => { requireAuthentication(() => { - subscribe(true) + subscribe(!subscribed()) }, 'subscribe') } @@ -117,89 +97,36 @@ export const AuthorCard = (props: Props) => { } }) - if (props.isAuthorPage && props.author.userpic?.includes('assets.discours.io')) { - setUserpicUrl(props.author.userpic.replace('100x', '500x500')) + const followButtonText = () => { + if (isSubscribing()) { + return t('subscribing...') + } else if (subscribed()) { + return ( + <> + {t('Following')} + {t('Unfollow')} + + ) + } else { + return t('Follow') + } } + return ( -
- - } - > -
- -
-
- -
+
+
+ +
+
-
- ( - - {children} - - )} - > - {name()} - -
- - {t('PublicationsWithCount', { count: props.author.stat?.shouts ?? 0 })} -
- ) : ( - '' - ) - } - > -
- - +
{name()}
+
0) || @@ -210,10 +137,17 @@ export const AuthorCard = (props: Props) => { 0}> - {(f) => } + {(f) => ( + + )}
- {t('SubscriberWithCount', { count: props.followers.length })} + {t('SubscriberWithCount', { count: props.followers.length ?? 0 })}
@@ -223,9 +157,23 @@ export const AuthorCard = (props: Props) => { {(f) => { if ('name' in f) { - return + return ( + + ) } else if ('title' in f) { - return + return ( + + ) } return null }} @@ -258,102 +206,35 @@ export const AuthorCard = (props: Props) => {
- -
- - - - - - - {t('Follow')} - - - - } - > - - - - - -
-
- - -
+ class={styles.buttonWriteMessage} + /> +
+ } + > +
-
@@ -240,9 +230,16 @@ export const ArticleCard = (props: ArticleCardProps) => { name="comment-hover" class={clsx(styles.icon, styles.iconHover, styles.feedControlIcon)} /> - - {props.article.stat?.commented || t('Add comment')} - + + {t('Add comment')} + + } + > + {props.article.stat?.commented} +
diff --git a/src/components/Feed/ArticleCard/index.tsx b/src/components/Feed/ArticleCard/index.tsx new file mode 100644 index 00000000..d73a1e1c --- /dev/null +++ b/src/components/Feed/ArticleCard/index.tsx @@ -0,0 +1 @@ +export { ArticleCard } from './ArticleCard' diff --git a/src/components/Feed/Beside.tsx b/src/components/Feed/Beside.tsx index 160eefae..d309a7cb 100644 --- a/src/components/Feed/Beside.tsx +++ b/src/components/Feed/Beside.tsx @@ -33,7 +33,7 @@ export const Beside = (props: Props) => {
{
-
+
{ +export const Sidebar = () => { const { t } = useLocalize() const { seen } = useSeenStore() - const { session } = useSession() + const { subscriptions } = useSession() const { page } = useRouter() - const { authorEntities } = useAuthorsStore({ authors: props.authors }) const { articlesByTopic } = useArticlesStore() - const { topicEntities } = useTopicsStore() const [isSubscriptionsVisible, setSubscriptionsVisible] = createSignal(true) const checkTopicIsSeen = (topicSlug: string) => { @@ -47,7 +38,7 @@ export const Sidebar = (props: FeedSidebarProps) => { > - {t('general feed')} + {t('All')} @@ -73,7 +64,7 @@ export const Sidebar = (props: FeedSidebarProps) => { > - {t('Accomplices')} + {t('Participation')} @@ -118,7 +109,7 @@ export const Sidebar = (props: FeedSidebarProps) => { - + 0 || subscriptions().topics.length > 0}>

{ @@ -129,39 +120,31 @@ export const Sidebar = (props: FeedSidebarProps) => {

    - - {(authorSlug: string) => ( + + {(author) => (
  • - - - - - - - {authorEntities()[authorSlug]?.name} + + {author.name}
  • )}
    - - {(topicSlug: string) => ( + + {(topic) => (
  • - {topicEntities()[topicSlug]?.title ?? topicSlug} + {topic.title}
  • diff --git a/src/components/Inbox/DialogAvatar.tsx b/src/components/Inbox/DialogAvatar.tsx index a04a058c..bb3382dc 100644 --- a/src/components/Inbox/DialogAvatar.tsx +++ b/src/components/Inbox/DialogAvatar.tsx @@ -2,7 +2,7 @@ import { Show, createMemo } from 'solid-js' import './DialogCard.module.scss' import styles from './DialogAvatar.module.scss' import { clsx } from 'clsx' -import { imageProxy } from '../../utils/imageProxy' +import { getImageUrl } from '../../utils/getImageUrl' type Props = { name: string @@ -47,7 +47,10 @@ const DialogAvatar = (props: Props) => { style={{ 'background-color': `${randomBg()}` }} > {nameFirstLetter()}
}> -
+
) diff --git a/src/components/Inbox/DialogCard.tsx b/src/components/Inbox/DialogCard.tsx index 4a671ab0..52465089 100644 --- a/src/components/Inbox/DialogCard.tsx +++ b/src/components/Inbox/DialogCard.tsx @@ -5,6 +5,7 @@ import GroupDialogAvatar from './GroupDialogAvatar' import { clsx } from 'clsx' import styles from './DialogCard.module.scss' import { useLocalize } from '../../context/localize' +import { AuthorBadge } from '../Author/AuthorBadge' type DialogProps = { online?: boolean @@ -40,27 +41,41 @@ const DialogCard = (props: DialogProps) => { })} onClick={props.onClick} > -
- }> - = 3}> + + +
+ } + > + + + } + > + = 3}> +
- - -
-
-
- {companions()?.length > 1 ? t('Group Chat') : companions()[0]?.name} -
-
- - -
- - 1}>{names()} - -
-
+
+
+ + +
+
+ {companions()?.length > 1 ? t('Group Chat') : companions()[0]?.name} +
+
+ + +
+ + 1}>{names()} + +
+
{formatTime(new Date(props.lastUpdate * 1000))}
diff --git a/src/components/Inbox/Search.module.scss b/src/components/Inbox/Search.module.scss index c69ce198..9cedf931 100644 --- a/src/components/Inbox/Search.module.scss +++ b/src/components/Inbox/Search.module.scss @@ -1,5 +1,6 @@ .Search { flex: 1; + .field { position: relative; background: #fff; diff --git a/src/components/Nav/AuthModal/AuthModal.module.scss b/src/components/Nav/AuthModal/AuthModal.module.scss index 6b8216b5..2ecb2c76 100644 --- a/src/components/Nav/AuthModal/AuthModal.module.scss +++ b/src/components/Nav/AuthModal/AuthModal.module.scss @@ -4,7 +4,7 @@ position: relative; @include media-breakpoint-up(md) { - min-height: 710px; + min-height: 600px; } input { @@ -40,9 +40,9 @@ .authImage { @include font-size(1.5rem); - background: #141414 url('/auth-page.jpg') center no-repeat; + background: var(--background-color-invert) url('/auth-page.jpg') center no-repeat; background-size: cover; - color: #fff; + color: var(--default-color-invert); display: flex; padding: 3em; position: relative; @@ -69,7 +69,7 @@ z-index: 1; a { - color: #fff; + color: var(--default-color-invert); &:hover { color: rgb(255 255 255 / 70%); @@ -87,20 +87,22 @@ .disclaimer { @include font-size(1.2rem); + color: #9fa1a7; margin-bottom: 0; a { - color: #fff !important; + color: var(--default-color-invert) !important; &:hover { - color: rgb(255, 255, 255, 0.6) !important; + color: rgb(255 255 255 / 60%) !important; } } } .authActions { @include font-size(1.5rem); + margin-top: 1.6rem; text-align: center; @@ -192,8 +194,8 @@ border-color: #d00820; &:hover { - color: white; - border-color: black; + color: var(--default-color-invert); + border-color: var(--background-color-invert); } } } diff --git a/src/components/Nav/ConfirmModal/ConfirmModal.module.scss b/src/components/Nav/ConfirmModal/ConfirmModal.module.scss index b955ec59..98d96167 100644 --- a/src/components/Nav/ConfirmModal/ConfirmModal.module.scss +++ b/src/components/Nav/ConfirmModal/ConfirmModal.module.scss @@ -2,18 +2,22 @@ position: relative; .confirmModalTitle { - @include font-size(2rem); + @include font-size(3.2rem); font-weight: 700; color: var(--default-color); text-align: center; + + @include media-breakpoint-up(sm) { + margin: 0 10%; + } } .confirmModalActions { display: flex; justify-content: space-between; margin-top: 4rem; - gap: 2rem; + gap: 0.5rem; .confirmAction { flex: 1; diff --git a/src/components/Nav/Header/Header.module.scss b/src/components/Nav/Header/Header.module.scss index a991f1a9..d4e0a5c1 100644 --- a/src/components/Nav/Header/Header.module.scss +++ b/src/components/Nav/Header/Header.module.scss @@ -76,6 +76,8 @@ height: 20px; object-fit: contain; object-position: left; + position: relative; + top: 0.1rem; transition: height 0.2s; vertical-align: middle; width: 100px; @@ -112,6 +114,7 @@ .mainNavigationWrapper { @include font-size(1.7rem); + position: relative; @include media-breakpoint-down(lg) { @@ -125,10 +128,11 @@ .mainNavigation { font-size: 1.4rem !important; - //margin: 0 0 0 -0.4rem !important; opacity: 1; transition: opacity 0.3s; + // margin: 0 0 0 -0.4rem !important; + @include media-breakpoint-down(lg) { background: var(--background-color); bottom: 0; @@ -155,7 +159,7 @@ display: block; font-size: 3.2rem !important; font-weight: bold; - margin: 0 0 5rem; + margin: 0 0 4rem; } li { @@ -192,14 +196,15 @@ } :global(.view-switcher) { - margin-top: 0; + margin: 0 -0.5rem; overflow: hidden; + padding: 0; } li { margin-bottom: 0 !important; - &:first-letter { + &::first-letter { text-transform: capitalize; } } @@ -224,60 +229,57 @@ } } -.mainNavigationSocial a { - display: flex; - justify-content: space-between; +.mainNavigationSocial { + font-size: 2rem; + font-weight: 500; + + .mainNavigation .mainNavigationMobile & { + margin-bottom: 0 !important; + } + + a { + align-items: center; + display: flex; + + &:hover { + .icon { + filter: invert(1); + } + } - &:hover { .icon { - filter: invert(1); + height: 3.8rem; + margin-right: 0.3em; + width: 3.8rem; } } +} - .icon { - height: 3.8rem; - width: 3.8rem; - } +.languageSelectorMobile { + border: 2px solid #e8e8e8; + border-radius: 1.6rem; + display: block; + font-family: inherit; + font-size: 1.7rem; + height: 5.6rem; + margin-bottom: 5rem; + padding: 0 1.2rem; + width: 100%; +} + +.mainNavigationAdditionalLinks { + border-top: 1px solid #ccc; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 1rem; + padding: 1.6rem 0 2rem; } .mobileDescription { color: #696969; } -.mobileSubscription { - margin-bottom: 5rem; - - input[type='email'] { - background: #f7f7f8; - border: none; - border-radius: 1.6rem; - padding-right: 5.6rem; - - &:not(:placeholder-shown) { - & ~ .mobileSubscriptionSubmit { - display: block; - } - } - } -} - -.mobileSubscriptionSubmit { - aspect-ratio: 1/1; - display: none; - height: 100%; - position: absolute; - right: 0; - top: 0; - - img { - aspect-ratio: 1/1; - left: 50%; - position: relative; - transform: translateX(-50%); - width: 16px !important; - } -} - .mainNavigationItemActive { background: var(--link-hover-background) !important; color: var(--link-hover-color) !important; @@ -293,9 +295,10 @@ .burgerContainer { box-sizing: content-box; display: inline-flex; - //float: right; padding-left: 0; + // float: right; + @include media-breakpoint-up(sm) { padding-left: divide($container-padding-x, 2); } @@ -307,7 +310,7 @@ .burger { cursor: pointer; - height: 1.8rem; + height: 1.6rem; display: inline-block; position: relative; vertical-align: middle; @@ -355,13 +358,13 @@ } &::after { - bottom: 0.8rem; + bottom: 0.7rem; transform: rotate(-45deg); } &::before { transform: rotate(45deg); - top: 0.8rem; + top: 0.7rem; } } } @@ -383,6 +386,7 @@ .articleHeader { @include font-size(1.4rem); + left: $container-padding-x; margin: 0.2em 0; overflow: hidden; @@ -480,6 +484,28 @@ width: 100%; } } + + .editorControl { + border-radius: 1.2em; + + &:hover { + background: var(--background-color-invert); + } + } + + .settingsControl { + border-radius: 100%; + padding: 0.8rem !important; + min-width: 4rem !important; + + &:hover { + background: var(--background-color-invert); + + img { + filter: invert(1); + } + } + } } .userControlItem { @@ -549,7 +575,7 @@ } .userControlItemVerbose { - margin-left: 1.2em !important; + margin-left: 0.9em !important; &:first-child { margin-left: 0 !important; @@ -618,13 +644,14 @@ } .textLabel { - background-color: var(--link-hover-background); color: var(--link-hover-color); } } a:hover { - //background-color: var(--link-hover-background) !important; + .textLabel { + background-color: var(--link-hover-background); + } } } diff --git a/src/components/Nav/Header/Header.tsx b/src/components/Nav/Header/Header.tsx index b5743b6d..7dbe5026 100644 --- a/src/components/Nav/Header/Header.tsx +++ b/src/components/Nav/Header/Header.tsx @@ -12,7 +12,7 @@ import { Icon } from '../../_shared/Icon' import type { Topic } from '../../../graphql/types.gen' import { useModalStore } from '../../../stores/ui' -import { router, useRouter } from '../../../stores/router' +import { router, ROUTES, useRouter } from '../../../stores/router' import { getDescription } from '../../../utils/meta' @@ -23,6 +23,7 @@ import styles from './Header.module.scss' import { apiClient } from '../../../utils/apiClient' import { RANDOM_TOPICS_COUNT } from '../../Views/Home' import { Link } from './Link' +import { Subscribe } from '../../_shared/Subscribe' type Props = { title?: string @@ -37,11 +38,14 @@ type HeaderSearchParams = { source?: string } +const handleSwitchLanguage = (event) => { + location.href = `${location.href}${location.href.includes('?') ? '&' : '?'}lng=${event.target.value}` +} + export const Header = (props: Props) => { const { t, lang } = useLocalize() - const { modal } = useModalStore() - + const { page } = useRouter() const { actions: { requireAuthentication } } = useSession() @@ -58,7 +62,6 @@ export const Header = (props: Props) => { const [isTopicsVisible, setIsTopicsVisible] = createSignal(false) const [isZineVisible, setIsZineVisible] = createSignal(false) const [isFeedVisible, setIsFeedVisible] = createSignal(false) - const toggleFixed = () => setFixed((oldFixed) => !oldFixed) const tag = (topic: Topic) => @@ -147,6 +150,15 @@ export const Header = (props: Props) => { setRandomTopics(topics) }) + const handleToggleMenuByLink = (event: MouseEvent, route: keyof typeof ROUTES) => { + if (!fixed()) { + return + } + event.preventDefault() + if (page().route === route) { + toggleFixed() + } + } return (
{ routeName="home" active={isZineVisible()} body={t('journal')} + onClick={(event) => handleToggleMenuByLink(event, 'home')} /> toggleSubnavigation(true, setIsFeedVisible)} @@ -202,6 +215,7 @@ export const Header = (props: Props) => { routeName="feed" active={isFeedVisible()} body={t('feed')} + onClick={(event) => handleToggleMenuByLink(event, 'feed')} /> toggleSubnavigation(true, setIsTopicsVisible)} @@ -209,12 +223,14 @@ export const Header = (props: Props) => { routeName="topics" active={isTopicsVisible()} body={t('topics')} + onClick={(event) => handleToggleMenuByLink(event, 'topics')} /> hideSubnavigation(event, 0)} onMouseOut={(event) => hideSubnavigation(event, 0)} routeName="authors" body={t('authors')} + onClick={(event) => handleToggleMenuByLink(event, 'authors')} /> toggleSubnavigation(true, setIsKnowledgeBaseVisible)} @@ -222,20 +238,21 @@ export const Header = (props: Props) => { routeName="guide" body={t('Knowledge base')} active={isKnowledgeBaseVisible()} + onClick={(event) => handleToggleMenuByLink(event, 'guide')} />
-

{t('Join the community')}

+

{t('Participating')}

@@ -243,52 +260,60 @@ export const Header = (props: Props) => {

{t('Newsletter')}

-
-
- - - -
-
+ + +

{t('Language')}

+ + +

{ />

{t('Discours')} © 2015–{new Date().getFullYear()}{' '} - {t('Terms of use')}
@@ -382,31 +406,31 @@ export const Header = (props: Props) => { {t('Art')}
  • - Подкасты + {t('Podcasts')}
  • - Спецпроекты + {t('Special Projects')}
  • - #Интервью + #{t('Interview')}
  • - #Репортажи + #{t('Reports')}
  • - #Личный опыт + #{t('Experience')}
  • - #Общество + #{t('Society')}
  • - #Культура + #{t('Culture')}
  • - #Теории + #{t('Theory')}
  • - #Поэзия + #{t('Poetry')}
  • @@ -455,7 +479,7 @@ export const Header = (props: Props) => { - {t('general feed')} + {t('All')}
  • @@ -472,7 +496,7 @@ export const Header = (props: Props) => { - {t('Accomplices')} + {t('Participation')} diff --git a/src/components/Nav/Header/Link.tsx b/src/components/Nav/Header/Link.tsx index 81648617..bbad79b9 100644 --- a/src/components/Nav/Header/Link.tsx +++ b/src/components/Nav/Header/Link.tsx @@ -10,13 +10,17 @@ type Props = { routeName?: keyof typeof ROUTES body: string active?: boolean + onClick?: (event: MouseEvent) => void } export const Link = (props: Props) => { const { page } = useRouter() const isSelected = page().route === props.routeName return ( -
  • +
  • {children}} diff --git a/src/components/Nav/HeaderAuth.tsx b/src/components/Nav/HeaderAuth.tsx index 8668c093..1ca47d3b 100644 --- a/src/components/Nav/HeaderAuth.tsx +++ b/src/components/Nav/HeaderAuth.tsx @@ -86,8 +86,9 @@ export const HeaderAuth = (props: Props) => { fallback={
  • - + + +
    @@ -140,6 +144,15 @@ export const HeaderAuth = (props: Props) => {
    + +
    +
    + + +
    +
    +
    +
    {renderIconedButton({ @@ -163,8 +176,9 @@ export const HeaderAuth = (props: Props) => {
    } > - + + + { props.setIsProfilePopupVisible(isVisible) @@ -205,6 +217,7 @@ export const HeaderAuth = (props: Props) => { + />
    diff --git a/src/components/Topic/Full.module.scss b/src/components/Topic/Full.module.scss index 3cf0420e..bfa1efbb 100644 --- a/src/components/Topic/Full.module.scss +++ b/src/components/Topic/Full.module.scss @@ -15,16 +15,21 @@ .topicActions { margin-top: 2.8rem; - button, - a { - background: #000; + .write { + display: inline-flex; + align-items: center; + justify-content: center; + height: 40px; + min-width: 64px; + font-size: 17px; + padding: 8px 16px; + background: var(--background-color-invert); + color: var(--default-color-invert); border: none; + font-weight: 500; border-radius: 2px; - color: #fff; cursor: pointer; - font-size: 100%; margin: 0 1.2rem 1em; - padding: 0.8rem 1.6rem; white-space: nowrap; } } diff --git a/src/components/Topic/Full.tsx b/src/components/Topic/Full.tsx index 279efe68..9ce2a389 100644 --- a/src/components/Topic/Full.tsx +++ b/src/components/Topic/Full.tsx @@ -7,6 +7,7 @@ import { follow, unfollow } from '../../stores/zine/common' import { clsx } from 'clsx' import { useSession } from '../../context/session' import { useLocalize } from '../../context/localize' +import { Button } from '../_shared/Button' type Props = { topic: Topic @@ -14,19 +15,22 @@ type Props = { export const FullTopic = (props: Props) => { const { - session, - actions: { requireAuthentication } + subscriptions, + actions: { requireAuthentication, loadSubscriptions } } = useSession() - const { t } = useLocalize() - const subscribed = createMemo(() => session()?.news?.topics?.includes(props.topic?.slug)) - const handleSubscribe = (isFollowed: boolean) => { - requireAuthentication(() => { - if (isFollowed) { - unfollow({ what: FollowingEntity.Topic, slug: props.topic.slug }) - } else { - follow({ what: FollowingEntity.Topic, slug: props.topic.slug }) - } + const { t } = useLocalize() + + const subscribed = createMemo(() => + subscriptions().topics.some((topic) => topic.slug === props.topic?.slug) + ) + + const handleSubscribe = (really: boolean) => { + requireAuthentication(async () => { + await (really + ? follow({ what: FollowingEntity.Topic, slug: props.topic.slug }) + : unfollow({ what: FollowingEntity.Topic, slug: props.topic.slug })) + loadSubscriptions() }, 'follow') } @@ -36,16 +40,18 @@ export const FullTopic = (props: Props) => {

    {props.topic.body}

    {props.topic.title} diff --git a/src/components/Topic/TopicBadge/TopicBadge.module.scss b/src/components/Topic/TopicBadge/TopicBadge.module.scss index c6c5c8d6..e8a87c9f 100644 --- a/src/components/Topic/TopicBadge/TopicBadge.module.scss +++ b/src/components/Topic/TopicBadge/TopicBadge.module.scss @@ -36,11 +36,12 @@ } .info { + @include font-size(1.4rem); + border: none; display: flex; flex: 0 calc(100% - 5.2rem); flex-direction: column; - @include font-size(1.4rem); margin-bottom: 1rem; @include media-breakpoint-up(sm) { diff --git a/src/components/Topic/TopicBadge/TopicBadge.tsx b/src/components/Topic/TopicBadge/TopicBadge.tsx index b7fc5d66..3387a2e8 100644 --- a/src/components/Topic/TopicBadge/TopicBadge.tsx +++ b/src/components/Topic/TopicBadge/TopicBadge.tsx @@ -2,12 +2,12 @@ import { clsx } from 'clsx' import styles from './TopicBadge.module.scss' import { FollowingEntity, Topic } from '../../../graphql/types.gen' import { createMemo, createSignal, Show } from 'solid-js' -import { imageProxy } from '../../../utils/imageProxy' import { Button } from '../../_shared/Button' import { useSession } from '../../../context/session' import { useLocalize } from '../../../context/localize' import { follow, unfollow } from '../../../stores/zine/common' import { CheckButton } from '../../_shared/CheckButton' +import { getImageUrl } from '../../../utils/getImageUrl' type Props = { topic: Topic @@ -19,17 +19,13 @@ export const TopicBadge = (props: Props) => { const { t } = useLocalize() const { isAuthenticated, - session, - actions: { loadSession } + subscriptions, + actions: { loadSubscriptions } } = useSession() - const subscribed = createMemo(() => { - if (!session()?.user?.slug || !session()?.news?.topics) { - return false - } - - return session()?.news.topics.includes(props.topic.slug) - }) + const subscribed = createMemo(() => + subscriptions().topics.some((topic) => topic.slug === props.topic.slug) + ) const subscribe = async (really = true) => { setIsSubscribing(true) @@ -38,7 +34,7 @@ export const TopicBadge = (props: Props) => { ? follow({ what: FollowingEntity.Topic, slug: props.topic.slug }) : unfollow({ what: FollowingEntity.Topic, slug: props.topic.slug })) - await loadSession() + await loadSubscriptions() setIsSubscribing(false) } @@ -47,7 +43,11 @@ export const TopicBadge = (props: Props) => { {props.topic.title} @@ -80,7 +80,7 @@ export const TopicBadge = (props: Props) => { + +
    + {''} event.stopPropagation()} + /> +
    + ) +} diff --git a/src/components/_shared/Lightbox/index.ts b/src/components/_shared/Lightbox/index.ts new file mode 100644 index 00000000..2b06237a --- /dev/null +++ b/src/components/_shared/Lightbox/index.ts @@ -0,0 +1 @@ +export { Lightbox } from './Lightbox' diff --git a/src/components/_shared/Loading.module.scss b/src/components/_shared/Loading.module.scss index 83860b08..5e20153e 100644 --- a/src/components/_shared/Loading.module.scss +++ b/src/components/_shared/Loading.module.scss @@ -29,6 +29,7 @@ width: 32px; height: 32px; } + .tiny & { width: 18px; height: 18px; diff --git a/src/components/_shared/Popup/Popup.module.scss b/src/components/_shared/Popup/Popup.module.scss index d16a0e05..0bdde227 100644 --- a/src/components/_shared/Popup/Popup.module.scss +++ b/src/components/_shared/Popup/Popup.module.scss @@ -60,8 +60,12 @@ } &.horizontalAnchorCenter { - left: 50%; - transform: translateX(-50%); + left: -24px; + + @include media-breakpoint-up(md) { + left: 50%; + transform: translateX(-50%); + } } &.horizontalAnchorRight { diff --git a/src/components/_shared/Slider/Slider.scss b/src/components/_shared/Slider/Slider.scss deleted file mode 100644 index 1aa7d959..00000000 --- a/src/components/_shared/Slider/Slider.scss +++ /dev/null @@ -1,253 +0,0 @@ -.swiper-slide { - min-height: 0 !important; - - .cards-with-cover & { - height: 0 !important; - padding-top: 100%; - - @include media-breakpoint-up(sm) { - padding-top: 56.2% !important; - } - - @include media-breakpoint-up(md) { - padding-top: 35% !important; - } - - img { - height: 100%; - left: 0; - object-fit: cover; - object-position: center; - position: absolute; - top: 0; - width: 100%; - } - } -} - -.slider-arrow-prev, -.slider-arrow-next { - align-items: center; - display: flex; - cursor: pointer; - height: 100%; - position: absolute; - outline: none; - border: 0; - transform: translate(0); - top: 0; - width: 21%; - z-index: 1; - - @include media-breakpoint-down(md) { - width: 8%; - } - - &::after { - color: #fff; - } - - &:hover { - .icon { - opacity: 0.5; - } - } - - .icon { - height: 36px; - opacity: 1; - transition: opacity 0.2s; - width: 22px; - } -} - -.slider-arrow-prev { - background: linear-gradient(to left, rgb(0 0 0 / 0%) 0%, rgb(0 0 0 / 90%) 100%); - justify-content: flex-start; - left: 0; - - &::after { - margin-left: 5rem; - } - - .icon { - margin-left: 5rem; - - @include media-breakpoint-down(md) { - margin-left: 25%; - } - } -} - -.slider-arrow-next { - background: linear-gradient(to left, rgb(0 0 0 / 90%) 0%, rgb(0 0 0 / 0%) 100%); - justify-content: flex-end; - right: 0; - - &::after { - margin-right: 5rem; - } - - .icon { - margin-right: 5rem; - transform: rotate(180deg); - - @include media-breakpoint-down(md) { - margin-right: 25%; - } - } -} - -.swiper--page-gallery { - padding-bottom: 4rem; - - .swiper-wrapper { - align-items: center; - } - - .swiper-slide { - display: flex; - justify-content: center; - } - - .swiper-slide__inner { - display: flex; - flex-direction: column; - justify-content: center; - - img { - display: block; - height: auto; - margin: 0 auto; - max-height: 80vh; - width: auto; - position: relative; - z-index: 11; - } - } - - .slider-arrow-prev, - .slider-arrow-next { - background: rgb(0 0 0 / 20%); - width: 5rem; - } - - .slider-arrow-next .icon { - margin-right: 2rem; - } - - .slider-arrow-prev .icon { - margin-left: 2rem; - } - - .swiper-slide-active { - .swiper-lazy-preloader { - display: none; - } - } -} - -.thumbs-container { - @include media-breakpoint-up(md) { - padding-left: 3.2rem; - } -} - -.swiper--thumbs { - @include media-breakpoint-up(md) { - max-height: 80vh; - min-width: 100px; - padding: 0 !important; - width: 100px !important; - } - - .swiper-slide { - cursor: pointer; - height: 80px; - opacity: 0.5; - width: 100px; - - @include media-breakpoint-up(md) { - height: 52px; - width: auto; - } - - img { - height: 100%; - object-fit: cover; - object-position: center; - width: 100%; - } - } - - .swiper-slide-thumb-active { - opacity: 1; - } - - .swiper-slide__inner { - height: 100%; - flex: 1; - } - - .swiper-lazy-preloader, - .image-description { - display: none; - } -} - -.sliders-container { - @include media-breakpoint-up(md) { - display: flex; - } -} - -.swiper-pagination { - background: #141414; - bottom: 0; - font-size: 1.2rem; - font-weight: bold; - left: auto; - right: 0; - padding: 1rem; - width: auto; -} - -.uploadPreview { - background: unset; - position: relative; - padding: 0 40px; - - .sliders-container { - position: relative; - } - - .swiper { - background: unset; - - .swiper-wrapper { - min-height: 400px; - } - } - - .slider-arrow-next, - .slider-arrow-prev { - background: none; - filter: invert(1); - width: 40px; - max-height: 540px; - - .icon { - margin: auto; - width: 12px; - height: 20px; - } - } - - // - //.slider-arrow-prev { - // margin-left: -40px; - //} - //.slider-arrow-next { - // margin-right: -40px; - //} -} diff --git a/src/components/_shared/Slider/Slider.tsx b/src/components/_shared/Slider/Slider.tsx deleted file mode 100644 index c5797459..00000000 --- a/src/components/_shared/Slider/Slider.tsx +++ /dev/null @@ -1,154 +0,0 @@ -//TODO: Replace with SolidSwiper.tsx - -import { Swiper, Navigation, Pagination, Thumbs } from 'swiper' -import type { SwiperOptions } from 'swiper' -import 'swiper/scss' -import 'swiper/scss/navigation' -import 'swiper/scss/pagination' -import 'swiper/scss/thumbs' -import './Slider.scss' -import { createEffect, createSignal, JSX, Show } from 'solid-js' -import { Icon } from '../Icon' -import { clsx } from 'clsx' - -interface Props { - title?: string - slidesPerView?: number - isCardsWithCover?: boolean - children?: JSX.Element - isPageGallery?: boolean - hasThumbs?: boolean - variant?: 'uploadPreview' - slideIndex?: (value: number) => void -} - -export const Slider = (props: Props) => { - let el: HTMLDivElement | undefined - let thumbsEl: HTMLDivElement | undefined - let nextEl: HTMLDivElement | undefined - let prevEl: HTMLDivElement | undefined - - const isCardsWithCover = typeof props.isCardsWithCover === 'boolean' ? props.isCardsWithCover : true - - const [swiper, setSwiper] = createSignal() - const [swiperThumbs, setSwiperThumbs] = createSignal() - const opts: SwiperOptions = { - roundLengths: true, - loop: true, - centeredSlides: true, - slidesPerView: 1, - modules: [Navigation, Pagination, Thumbs], - speed: 500, - on: { - slideChange: () => { - if (swiper()) { - props.slideIndex(swiper().realIndex || 0) - } - } - }, - navigation: { nextEl, prevEl }, - breakpoints: { - 768: { - slidesPerView: props.slidesPerView > 0 ? props.slidesPerView : 1.66666, - spaceBetween: isCardsWithCover ? 8 : 26 - }, - 992: { - slidesPerView: props.slidesPerView > 0 ? props.slidesPerView : 1.66666, - spaceBetween: isCardsWithCover ? 8 : 52 - } - }, - thumbs: { - swiper: swiperThumbs() - } - } - - createEffect(() => { - if (props.hasThumbs && !!thumbsEl) { - setTimeout(() => { - setSwiperThumbs( - new Swiper(thumbsEl, { - slidesPerView: 'auto', - modules: [Thumbs], - roundLengths: true, - spaceBetween: 20, - freeMode: true, - breakpoints: { - 768: { - direction: 'vertical' - } - } - }) - ) - }, 500) - } - }) - - createEffect(() => { - if (!swiper() && !!el) { - setTimeout(() => { - if (swiperThumbs()) { - opts.thumbs = { - swiper: swiperThumbs() - } - - opts.pagination = { - el: '.swiper-pagination', - type: 'fraction' - } - } - - setSwiper(new Swiper(el, opts)) - }, 500) - } - }) - - return ( -
    -
    -
    - -

    {props.title}

    -
    - -
    -
    -
    {props.children}
    - -
    swiper()?.slideNext()}> - -
    -
    swiper()?.slidePrev()}> - -
    -
    - {/*
    */} -
    - - -
    -
    -
    {props.children}
    -
    -
    -
    -
    -
    -
    - -
    swiper()?.slideNext()}> - -
    -
    swiper()?.slidePrev()}> - -
    -
    -
    - ) -} diff --git a/src/components/_shared/Slider/index.ts b/src/components/_shared/Slider/index.ts deleted file mode 100644 index 6d43da3c..00000000 --- a/src/components/_shared/Slider/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { Slider } from './Slider' diff --git a/src/components/_shared/SocialNetworkInput/SocialNetworkInput.module.scss b/src/components/_shared/SocialNetworkInput/SocialNetworkInput.module.scss new file mode 100644 index 00000000..65401cdf --- /dev/null +++ b/src/components/_shared/SocialNetworkInput/SocialNetworkInput.module.scss @@ -0,0 +1,50 @@ +.SocialNetworkInput { + display: flex; + align-items: center; + justify-content: flex-start; + height: 54px; + border: 2px solid var(--black-100); + border-radius: 2px; + + .icon { + width: 54px; + height: 54px; + padding: 16px; + border-right: 2px solid var(--black-100); + display: flex; + align-items: center; + justify-content: center; + } + + .input { + @include font-size(1.7rem); + + margin: 0 16px; + width: 100%; + border: none; + height: 1em; + padding: 0; + display: block; + flex: 1; + + &:focus { + outline: none; + } + + &::placeholder { + color: var(--black-300); + } + } + + .remove { + width: 54px; + height: 54px; + padding: 16px; + &:hover { + background: var(--background-color-invert); + img { + filter: invert(1); + } + } + } +} diff --git a/src/components/_shared/SocialNetworkInput/SocialNetworkInput.tsx b/src/components/_shared/SocialNetworkInput/SocialNetworkInput.tsx new file mode 100644 index 00000000..c3008a2a --- /dev/null +++ b/src/components/_shared/SocialNetworkInput/SocialNetworkInput.tsx @@ -0,0 +1,44 @@ +import { clsx } from 'clsx' +import styles from './SocialNetworkInput.module.scss' +import { Icon } from '../Icon' +import { onMount, Show } from 'solid-js' + +type Props = { + class?: string + network?: string + link?: string + isExist: boolean + handleChange: (value: string) => void + handleDelete?: () => void + slug?: string + autofocus?: boolean +} + +export const SocialNetworkInput = (props: Props) => { + const inputRef: { current: HTMLInputElement } = { current: null } + onMount(() => { + if (props.autofocus) { + inputRef.current.focus() + } + }) + return ( +
    +
    + +
    + (inputRef.current = el)} + class={styles.input} + type="text" + value={props.isExist ? props.link : null} + onChange={(event) => props.handleChange(event.currentTarget.value)} + placeholder={props.autofocus ? null : `${props.link}${props.slug}`} + /> + + + +
    + ) +} diff --git a/src/components/_shared/SocialNetworkInput/index.ts b/src/components/_shared/SocialNetworkInput/index.ts new file mode 100644 index 00000000..bb028529 --- /dev/null +++ b/src/components/_shared/SocialNetworkInput/index.ts @@ -0,0 +1 @@ +export { SocialNetworkInput } from './SocialNetworkInput' diff --git a/src/components/_shared/SolidSwiper/ArticleCardSwiper.tsx b/src/components/_shared/SolidSwiper/ArticleCardSwiper.tsx new file mode 100644 index 00000000..bbfec7a1 --- /dev/null +++ b/src/components/_shared/SolidSwiper/ArticleCardSwiper.tsx @@ -0,0 +1,93 @@ +import { createSignal, For, Show } from 'solid-js' +import { Icon } from '../Icon' +import { register } from 'swiper/element/bundle' +import SwiperCore, { Manipulation, Navigation, Pagination } from 'swiper' +import { SwiperRef } from './swiper' +import { clsx } from 'clsx' +import styles from './Swiper.module.scss' +import { Shout } from '../../../graphql/types.gen' +import { ArticleCard } from '../../Feed/ArticleCard' + +type Props = { + slides: Shout[] + title?: string +} + +register() + +SwiperCore.use([Pagination, Navigation, Manipulation]) + +export const ArticleCardSwiper = (props: Props) => { + const [slideIndex, setSlideIndex] = createSignal(0) + + const mainSwipeRef: { current: SwiperRef } = { current: null } + + const handleSlideChange = () => { + setSlideIndex(mainSwipeRef.current.swiper.activeIndex) + } + + return ( +
    + +

    {props.title}

    +
    +
    + 0}> +
    + (mainSwipeRef.current = el)} + centered-slides={true} + observer={true} + onSlideChange={handleSlideChange} + space-between={20} + breakpoints={{ + 576: { spaceBetween: 20, slidesPerView: 1.5 }, + 992: { spaceBetween: 52, slidesPerView: 1.5 } + }} + round-lengths={true} + loop={true} + speed={800} + /* + autoplay={{ + disableOnInteraction: false, + delay: 6000, + pauseOnMouseEnter: true + }} +*/ + > + + {(slide, index) => ( + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + + + + )} + + +
    mainSwipeRef.current.swiper.slidePrev()} + > + +
    +
    mainSwipeRef.current.swiper.slideNext()} + > + +
    +
    +
    +
    +
    + ) +} diff --git a/src/components/_shared/SolidSwiper/SolidSwiper.tsx b/src/components/_shared/SolidSwiper/ImageSwiper.tsx similarity index 95% rename from src/components/_shared/SolidSwiper/SolidSwiper.tsx rename to src/components/_shared/SolidSwiper/ImageSwiper.tsx index 0c670873..8b3a497c 100644 --- a/src/components/_shared/SolidSwiper/SolidSwiper.tsx +++ b/src/components/_shared/SolidSwiper/ImageSwiper.tsx @@ -9,14 +9,15 @@ import { createFileUploader } from '@solid-primitives/upload' import SwiperCore, { Manipulation, Navigation, Pagination } from 'swiper' import { SwiperRef } from './swiper' import { validateFiles } from '../../../utils/validateFile' -import { handleFileUpload } from '../../../utils/handleFileUpload' import { useSnackbar } from '../../../context/snackbar' import { Loading } from '../Loading' -import { imageProxy } from '../../../utils/imageProxy' import { clsx } from 'clsx' import styles from './Swiper.module.scss' import { composeMediaItems } from '../../../utils/composeMediaItems' import SimplifiedEditor from '../../Editor/SimplifiedEditor' +import { handleImageUpload } from '../../../utils/handleImageUpload' +import { getImageUrl } from '../../../utils/getImageUrl' +import { Image } from '../Image' type Props = { images: MediaItem[] @@ -31,7 +32,7 @@ register() SwiperCore.use([Pagination, Navigation, Manipulation]) -export const SolidSwiper = (props: Props) => { +export const ImageSwiper = (props: Props) => { const { t } = useLocalize() const [loading, setLoading] = createSignal(false) const [slideIndex, setSlideIndex] = createSignal(0) @@ -45,7 +46,9 @@ export const SolidSwiper = (props: Props) => { } = useSnackbar() const handleSlideDescriptionChange = (index: number, field: string, value) => { - props.onImageChange(index, { ...props.images[index], [field]: value }) + if (props.onImageChange) { + props.onImageChange(index, { ...props.images[index], [field]: value }) + } } const swipeToUploaded = () => { setTimeout(() => { @@ -67,7 +70,6 @@ export const SolidSwiper = (props: Props) => { { defer: true } ) ) - const handleDropAreaUpload = (value: UploadedFile[]) => { props.onImagesAdd(composeMediaItems(value)) swipeToUploaded() @@ -95,7 +97,7 @@ export const SolidSwiper = (props: Props) => { setLoading(true) const results: UploadedFile[] = [] for (const file of selectedFiles) { - const result = await handleFileUpload(file) + const result = await handleImageUpload(file) results.push(result) } props.onImagesAdd(composeMediaItems(results)) @@ -172,7 +174,7 @@ export const SolidSwiper = (props: Props) => { // @ts-ignore
    - {slide.title} + {slide.title} {(triggerRef: (el) => void) => ( @@ -232,7 +234,9 @@ export const SolidSwiper = (props: Props) => {
    diff --git a/src/components/_shared/SolidSwiper/Swiper.module.scss b/src/components/_shared/SolidSwiper/Swiper.module.scss index 33a4eb1e..648ca264 100644 --- a/src/components/_shared/SolidSwiper/Swiper.module.scss +++ b/src/components/_shared/SolidSwiper/Swiper.module.scss @@ -1,10 +1,10 @@ -$navigation-reserve: 32px; - :root { --slide-height: 300px; + --navigation-reserve: 48px; @include media-breakpoint-up(md) { --slide-height: 500px; + --navigation-reserve: 56px; } } @@ -13,19 +13,33 @@ $navigation-reserve: 32px; margin: 2rem 0; flex-direction: column; + &.ArticleCardSwiper { + margin-bottom: 6rem; + padding-bottom: 2rem; + } + + .sliderTitle { + @include font-size(4.5rem); + + text-align: center; + padding: 4rem 0 0; + } + &.articleMode { background: var(--background-color-invert); color: var(--default-color-invert); display: flex; align-items: center; justify-content: center; + a { color: var(--default-color-invert); border-color: var(--default-color-invert); } + .container { margin: auto; - //max-width: 800px; + // max-width: 800px; position: relative; padding: 24px 0; display: flex; @@ -82,6 +96,10 @@ $navigation-reserve: 32px; &.editorMode { color: #0d0d0d; + + .holder { + width: 100%; + } } .action { @@ -93,7 +111,7 @@ $navigation-reserve: 32px; position: absolute; top: 16px; right: 16px; - background: rgba(var(--default-color), 0.3); + background: rgb(var(--default-color) 0.3); cursor: pointer; z-index: 12; display: none; @@ -108,10 +126,11 @@ $navigation-reserve: 32px; position: relative; box-sizing: border-box; overflow: hidden; - width: calc(100% - 130px); + width: 100%; .counter { @include font-size(1.2rem); + position: absolute; z-index: 2; top: 477px; @@ -132,6 +151,7 @@ $navigation-reserve: 32px; img { max-height: 100%; + width: auto; } } @@ -139,23 +159,16 @@ $navigation-reserve: 32px; display: flex; } } - &.editorMode { - .holder { - width: 100%; - } - } .navigation { - background: rgb(0 0 0 / 40%); display: flex; position: absolute; top: 0; bottom: 0; - justify-content: center; align-items: center; cursor: pointer; - height: var(--slide-height); - width: 52px; + height: 100%; + width: 10%; z-index: 2; &.disabled { @@ -164,16 +177,19 @@ $navigation-reserve: 32px; } &.prev { + background-image: linear-gradient(to right, #000, rgb(0 0 0 / 0)); left: 0; } &.next { + background-image: linear-gradient(to left, #000, rgb(0 0 0 / 0)); + justify-content: end; right: 0; } .icon { - height: $navigation-reserve; - width: $navigation-reserve; + height: var(--navigation-reserve); + width: var(--navigation-reserve); transition: 0.3s ease-in-out; } @@ -198,15 +214,17 @@ $navigation-reserve: 32px; .source { @include font-size(1.2rem); + color: var(--secondary-color); } .body { @include font-size(1.7rem); + margin-top: 24px; @include media-breakpoint-up(md) { - //margin-left: calc((100% + 130px) * 0.15); + // margin-left: calc((100% + 130px) * 0.15); margin-left: calc(15% + 24px); } } @@ -221,11 +239,11 @@ $navigation-reserve: 32px; height: auto; &.prev { - left: -$navigation-reserve; + left: -var(--navigation-reserve); } &.next { - right: -$navigation-reserve; + right: -var(--navigation-reserve); } } @@ -253,7 +271,9 @@ $navigation-reserve: 32px; background-color: var(--placeholder-color-semi); opacity: 0.5; filter: grayscale(1); - transition: filter 0.3s ease-in-out, opacity 0.5s ease-in-out; + transition: + filter 0.3s ease-in-out, + opacity 0.5s ease-in-out; .thumbAction { display: none; diff --git a/src/components/_shared/SolidSwiper/index.ts b/src/components/_shared/SolidSwiper/index.ts index fbd847e0..54c84efc 100644 --- a/src/components/_shared/SolidSwiper/index.ts +++ b/src/components/_shared/SolidSwiper/index.ts @@ -1 +1 @@ -export { SolidSwiper } from './SolidSwiper' +export { ImageSwiper } from './ImageSwiper' diff --git a/src/components/_shared/SolidSwiper/swiper.d.ts b/src/components/_shared/SolidSwiper/swiper.d.ts index 1da88ad9..d94ccd21 100644 --- a/src/components/_shared/SolidSwiper/swiper.d.ts +++ b/src/components/_shared/SolidSwiper/swiper.d.ts @@ -1,5 +1,5 @@ import 'solid-js' -import { SwiperOptions } from 'swiper' +import { SwiperOptions, AutoplayOptions } from 'swiper' import { SwiperSlideProps } from 'swiper/react' type Kebab = T extends `${infer F}${infer R}` @@ -37,6 +37,11 @@ declare module 'solid-js' { onSlideChange?: () => void onBeforeSlideChangeStart?: () => void class?: string + breakpoints?: { + [width: number]: SwiperOptions + [ratio: string]: SwiperOptions + } + autoplay?: AutoplayOptions | boolean } // eslint-disable-next-line @typescript-eslint/no-empty-interface interface SwiperSlideAttributes extends KebabObjectKeys { diff --git a/src/components/Discours/Subscribe.module.scss b/src/components/_shared/Subscribe/Subscribe.module.scss similarity index 64% rename from src/components/Discours/Subscribe.module.scss rename to src/components/_shared/Subscribe/Subscribe.module.scss index 7cbba980..1160df51 100644 --- a/src/components/Discours/Subscribe.module.scss +++ b/src/components/_shared/Subscribe/Subscribe.module.scss @@ -17,6 +17,7 @@ .input { @include font-size(2rem); + background: none; color: #fff; font-family: inherit; @@ -60,3 +61,37 @@ line-height: 16px; color: #d00820; } + +.mobileSubscription { + margin-bottom: 5rem; + + input[type='email'] { + background: #f7f7f8; + border: none; + border-radius: 1.6rem; + padding-right: 5.6rem; + + &:not(:placeholder-shown) { + & ~ .mobileSubscriptionSubmit { + display: block; + } + } + } +} + +.mobileSubscriptionSubmit { + aspect-ratio: 1/1; + display: none; + height: 100%; + position: absolute; + right: 0; + top: 0; + + img { + aspect-ratio: 1/1; + left: 50%; + position: relative; + transform: translateX(-50%); + width: 16px !important; + } +} diff --git a/src/components/Discours/Subscribe.tsx b/src/components/_shared/Subscribe/Subscribe.tsx similarity index 50% rename from src/components/Discours/Subscribe.tsx rename to src/components/_shared/Subscribe/Subscribe.tsx index a2301204..aaaf055a 100644 --- a/src/components/Discours/Subscribe.tsx +++ b/src/components/_shared/Subscribe/Subscribe.tsx @@ -1,13 +1,15 @@ import { createSignal, JSX, Show } from 'solid-js' - -import { useLocalize } from '../../context/localize' -import { validateEmail } from '../../utils/validateEmail' -import { Button } from '../_shared/Button' - +import { useLocalize } from '../../../context/localize' +import { validateEmail } from '../../../utils/validateEmail' +import { Button } from '../Button' import styles from './Subscribe.module.scss' -import { useSnackbar } from '../../context/snackbar' +import { useSnackbar } from '../../../context/snackbar' +import { Icon } from '../Icon' -export default () => { +type Props = { + variant?: 'mobileSubscription' +} +export const Subscribe = (props: Props) => { const { t } = useLocalize() const [title, setTitle] = createSignal('') @@ -42,7 +44,7 @@ export default () => { if (!validate()) return - setTitle(t('...subscribing')) + setTitle(t('subscribing...')) const requestOptions = { method: 'POST', @@ -69,19 +71,43 @@ export default () => { } return ( -
    + -
    - -
    + + +
    + } + > +
    + + + +
    +
    Подпишитесь на рассылку лучших публикаций
    +
    {emailError()}
    diff --git a/src/components/_shared/Subscribe/index.ts b/src/components/_shared/Subscribe/index.ts new file mode 100644 index 00000000..77ee7e60 --- /dev/null +++ b/src/components/_shared/Subscribe/index.ts @@ -0,0 +1 @@ +export { Subscribe } from './Subscribe' diff --git a/src/components/_shared/VotersList/VotersList.module.scss b/src/components/_shared/VotersList/VotersList.module.scss index ebfdc439..a36497ed 100644 --- a/src/components/_shared/VotersList/VotersList.module.scss +++ b/src/components/_shared/VotersList/VotersList.module.scss @@ -17,14 +17,18 @@ align-items: center; margin-right: 1.2rem; - a { + a:link { text-decoration: none; border: none; + + &:hover { + background: #000; + color: #fff; + } } .userpic { - width: 24px; - height: 24px; + margin-right: 0.8rem; } } } diff --git a/src/components/_shared/VotersList/VotersList.tsx b/src/components/_shared/VotersList/VotersList.tsx index 53bed086..f71fadf9 100644 --- a/src/components/_shared/VotersList/VotersList.tsx +++ b/src/components/_shared/VotersList/VotersList.tsx @@ -25,8 +25,7 @@ export const VotersList = (props: Props) => {
    {reaction.createdBy.name || ''}
    diff --git a/src/context/editor.tsx b/src/context/editor.tsx index 75812c53..a15d261c 100644 --- a/src/context/editor.tsx +++ b/src/context/editor.tsx @@ -26,7 +26,7 @@ export type ShoutForm = { selectedTopics: Topic[] mainTopic?: Topic body: string - coverImageUrl: string + coverImageUrl?: string media?: string } diff --git a/src/context/inbox.tsx b/src/context/inbox.tsx index e2762b53..e72759a2 100644 --- a/src/context/inbox.tsx +++ b/src/context/inbox.tsx @@ -30,12 +30,12 @@ export const InboxProvider = (props: { children: JSX.Element }) => { } = useNotifications() const handleMessage = (m) => { - console.log('[context.inbox] ', m) + console.log('[context.inbox]:', m) // TODO: handle all action types: create update delete join left - if (m.action in ['create', 'update', 'delete']) { + if (['create', 'update', 'delete'].includes(m.action)) { const msg = m.payload setMessages((mmm) => [msg, ...mmm]) - } else if (m.action in ['left', 'join']) { + } else if (['left', 'join'].includes(m.action)) { // TODO: set chat members console.debug(m) } @@ -50,6 +50,7 @@ export const InboxProvider = (props: { children: JSX.Element }) => { const loadChats = async () => { try { const newChats = await inboxClient.loadChats({ limit: 50, offset: 0 }) + console.log('!!! newChats:', newChats) setChats(newChats) } catch (error) { console.log('[loadChats]', error) diff --git a/src/context/localize.tsx b/src/context/localize.tsx index c307bb6e..10254c6d 100644 --- a/src/context/localize.tsx +++ b/src/context/localize.tsx @@ -73,7 +73,7 @@ export const LocalizeProvider = (props: { children: JSX.Element }) => { let result = date.toLocaleDateString(lang(), opts) if (lang() === 'ru') { - result = result.replace(' г.', '') + result = result.replace(' г.', '').replace('г.', '') } return result diff --git a/src/context/notifications.tsx b/src/context/notifications.tsx index 887d5b2e..3c519752 100644 --- a/src/context/notifications.tsx +++ b/src/context/notifications.tsx @@ -10,6 +10,7 @@ import { fetchEventSource } from '@microsoft/fetch-event-source' import { getToken } from '../graphql/privateGraphQLClient' import { Author, Message, Reaction, Shout } from '../graphql/types.gen' +export const PAGE_SIZE = 20 export interface SSEMessage { id: string entity: string diff --git a/src/context/profile.tsx b/src/context/profile.tsx index 0038b518..ed6f13c3 100644 --- a/src/context/profile.tsx +++ b/src/context/profile.tsx @@ -69,6 +69,7 @@ const useProfileForm = () => { }) } } + return { form, submit, updateFormField, slugError } } diff --git a/src/context/session.tsx b/src/context/session.tsx index 965ba955..041ba7fe 100644 --- a/src/context/session.tsx +++ b/src/context/session.tsx @@ -8,7 +8,7 @@ import { onMount, useContext } from 'solid-js' -import type { AuthResult, User } from '../graphql/types.gen' +import type { AuthResult, MySubscriptionsQueryResult, User } from '../graphql/types.gen' import { apiClient } from '../utils/apiClient' import { resetToken, setToken } from '../graphql/privateGraphQLClient' import { useSnackbar } from './snackbar' @@ -19,10 +19,12 @@ import type { AuthModalSource } from '../components/Nav/AuthModal/types' type SessionContextType = { session: Resource isSessionLoaded: Accessor + subscriptions: Accessor user: Accessor isAuthenticated: Accessor actions: { loadSession: () => AuthResult | Promise + loadSubscriptions: () => Promise requireAuthentication: ( callback: (() => Promise) | (() => void), modalSource: AuthModalSource @@ -39,8 +41,14 @@ export function useSession() { return useContext(SessionContext) } +const EMPTY_SUBSCRIPTIONS = { + topics: [], + authors: [] +} + export const SessionProvider = (props: { children: JSX.Element }) => { const [isSessionLoaded, setIsSessionLoaded] = createSignal(false) + const [subscriptions, setSubscriptions] = createSignal(EMPTY_SUBSCRIPTIONS) const { t } = useLocalize() const { actions: { showSnackbar } @@ -53,13 +61,25 @@ export const SessionProvider = (props: { children: JSX.Element }) => { return null } setToken(authResult.token) + loadSubscriptions() return authResult } catch (error) { console.error('getSession error:', error) resetToken() return null } finally { - setIsSessionLoaded(true) + setTimeout(() => { + setIsSessionLoaded(true) + }, 0) + } + } + + const loadSubscriptions = async (): Promise => { + const result = await apiClient.getMySubscriptions() + if (result) { + setSubscriptions(result) + } else { + setSubscriptions(EMPTY_SUBSCRIPTIONS) } } @@ -76,14 +96,17 @@ export const SessionProvider = (props: { children: JSX.Element }) => { const authResult = await apiClient.authLogin({ email, password }) setToken(authResult.token) mutate(authResult) - console.debug('signed in') + loadSubscriptions() + // console.debug('signed in') } const [isAuthWithCallback, setIsAuthWithCallback] = createSignal(null) - const requireAuthentication = (callback: () => void, modalSource: AuthModalSource) => { + const requireAuthentication = async (callback: () => void, modalSource: AuthModalSource) => { setIsAuthWithCallback(() => callback) + await loadSession() + if (!isAuthenticated()) { showModal('auth', modalSource) } @@ -105,13 +128,14 @@ export const SessionProvider = (props: { children: JSX.Element }) => { // TODO: call backend to revoke token mutate(null) resetToken() + setSubscriptions(EMPTY_SUBSCRIPTIONS) showSnackbar({ body: t("You've successfully logged out") }) } const confirmEmail = async (token: string) => { const authResult = await apiClient.confirmEmail({ token }) - mutate(authResult) setToken(authResult.token) + mutate(authResult) } const actions = { @@ -119,10 +143,18 @@ export const SessionProvider = (props: { children: JSX.Element }) => { requireAuthentication, signIn, signOut, - confirmEmail + confirmEmail, + loadSubscriptions } - const value: SessionContextType = { session, isSessionLoaded, user, isAuthenticated, actions } + const value: SessionContextType = { + session, + subscriptions, + isSessionLoaded, + user, + isAuthenticated, + actions + } onMount(() => { loadSession() diff --git a/src/graphql/mutation/auth-confirm-email.ts b/src/graphql/mutation/auth-confirm-email.ts index f2286e3d..2bedd5bb 100644 --- a/src/graphql/mutation/auth-confirm-email.ts +++ b/src/graphql/mutation/auth-confirm-email.ts @@ -14,13 +14,6 @@ export default gql` userpic links } - news { - unread - topics - authors - reactions - communities - } } } ` diff --git a/src/graphql/mutation/mark-all-notifications-as-read.ts b/src/graphql/mutation/mark-all-notifications-as-read.ts new file mode 100644 index 00000000..a02643d2 --- /dev/null +++ b/src/graphql/mutation/mark-all-notifications-as-read.ts @@ -0,0 +1,9 @@ +import { gql } from '@urql/core' + +export default gql` + mutation MarkAllNotificationsAsReadMutation { + markAllNotificationsAsRead { + error + } + } +` diff --git a/src/graphql/mutation/my-session.ts b/src/graphql/mutation/my-session.ts index d2972be3..77c5ba48 100644 --- a/src/graphql/mutation/my-session.ts +++ b/src/graphql/mutation/my-session.ts @@ -13,13 +13,6 @@ export default gql` userpic links } - news { - unread - topics - authors - reactions - # communities - } } } ` diff --git a/src/graphql/query/my-subscriptions.ts b/src/graphql/query/my-subscriptions.ts new file mode 100644 index 00000000..589275ed --- /dev/null +++ b/src/graphql/query/my-subscriptions.ts @@ -0,0 +1,21 @@ +import { gql } from '@urql/core' + +export default gql` + query MySubscriptionsQuery { + loadMySubscriptions { + topics { + id + title + body + slug + } + authors { + id + name + slug + userpic + createdAt + } + } + } +` diff --git a/src/graphql/query/notifications.ts b/src/graphql/query/notifications.ts index a1951b0f..6538e931 100644 --- a/src/graphql/query/notifications.ts +++ b/src/graphql/query/notifications.ts @@ -1,8 +1,8 @@ import { gql } from '@urql/core' export default gql` - query LoadNotificationsQuery { - loadNotifications(params: { limit: 10, offset: 0 }) { + query LoadNotificationsQuery($params: NotificationsQueryParams!) { + loadNotifications(params: $params) { notifications { id shout diff --git a/src/graphql/types.gen.ts b/src/graphql/types.gen.ts index 79039082..415462da 100644 --- a/src/graphql/types.gen.ts +++ b/src/graphql/types.gen.ts @@ -4,105 +4,109 @@ export type InputMaybe = Maybe export type Exact = { [K in keyof T]: T[K] } export type MakeOptional = Omit & { [SubKey in K]?: Maybe } export type MakeMaybe = Omit & { [SubKey in K]: Maybe } +export type MakeEmpty = { [_ in K]?: never } +export type Incremental = + | T + | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never } /** All built-in and custom scalars, mapped to their actual values */ export type Scalars = { - ID: string - String: string - Boolean: boolean - Int: number - Float: number - DateTime: any + ID: { input: string; output: string } + String: { input: string; output: string } + Boolean: { input: boolean; output: boolean } + Int: { input: number; output: number } + Float: { input: number; output: number } + DateTime: { input: any; output: any } } export type AuthResult = { - error?: Maybe - news?: Maybe - token?: Maybe + error?: Maybe + token?: Maybe user?: Maybe } export type Author = { - about?: Maybe - bio?: Maybe - caption?: Maybe - createdAt?: Maybe - id: Scalars['Int'] - lastSeen?: Maybe - links?: Maybe>> - name: Scalars['String'] + about?: Maybe + bio?: Maybe + caption?: Maybe + createdAt?: Maybe + id: Scalars['Int']['output'] + lastSeen?: Maybe + links?: Maybe>> + name: Scalars['String']['output'] roles?: Maybe>> - slug: Scalars['String'] + slug: Scalars['String']['output'] stat?: Maybe - userpic?: Maybe + userpic?: Maybe } export type AuthorStat = { - commented?: Maybe - followers?: Maybe - followings?: Maybe - rating?: Maybe - shouts?: Maybe + commented?: Maybe + followers?: Maybe + followings?: Maybe + rating?: Maybe + shouts?: Maybe } export type AuthorsBy = { - createdAt?: InputMaybe - days?: InputMaybe - lastSeen?: InputMaybe - name?: InputMaybe - order?: InputMaybe - slug?: InputMaybe - stat?: InputMaybe - topic?: InputMaybe + createdAt?: InputMaybe + days?: InputMaybe + lastSeen?: InputMaybe + name?: InputMaybe + order?: InputMaybe + slug?: InputMaybe + stat?: InputMaybe + topic?: InputMaybe } export type Chat = { - admins?: Maybe>> - createdAt: Scalars['Int'] - createdBy: Scalars['Int'] - description?: Maybe - id: Scalars['String'] + admins?: Maybe>> + createdAt: Scalars['Int']['output'] + createdBy: Scalars['Int']['output'] + description?: Maybe + id: Scalars['String']['output'] members?: Maybe>> messages?: Maybe>> - private?: Maybe - title?: Maybe - unread?: Maybe - updatedAt: Scalars['Int'] + private?: Maybe + title?: Maybe + unread?: Maybe + updatedAt: Scalars['Int']['output'] + users?: Maybe>> } export type ChatInput = { - description?: InputMaybe - id: Scalars['String'] - title?: InputMaybe + description?: InputMaybe + id: Scalars['String']['input'] + title?: InputMaybe } export type ChatMember = { - id: Scalars['Int'] - lastSeen: Maybe - name: Scalars['String'] - online?: Maybe - slug: Scalars['String'] - userpic?: Maybe + id: Scalars['Int']['output'] + lastSeen?: Maybe + name: Scalars['String']['output'] + online?: Maybe + slug: Scalars['String']['output'] + userpic?: Maybe } export type Collection = { - amount?: Maybe - createdAt: Scalars['DateTime'] + amount?: Maybe + createdAt: Scalars['DateTime']['output'] createdBy: User - desc?: Maybe - id: Scalars['Int'] - publishedAt?: Maybe - slug: Scalars['String'] - title: Scalars['String'] + desc?: Maybe + id: Scalars['Int']['output'] + publishedAt?: Maybe + slug: Scalars['String']['output'] + title: Scalars['String']['output'] } export type Community = { - createdAt: Scalars['DateTime'] + createdAt: Scalars['DateTime']['output'] createdBy: User - desc?: Maybe - id: Scalars['Int'] - name: Scalars['String'] - pic: Scalars['String'] - slug: Scalars['String'] + desc?: Maybe + id: Scalars['Int']['output'] + name: Scalars['String']['output'] + pic: Scalars['String']['output'] + slug: Scalars['String']['output'] } export enum FollowingEntity { @@ -113,35 +117,35 @@ export enum FollowingEntity { } export type LoadShoutsFilters = { - author?: InputMaybe - body?: InputMaybe - days?: InputMaybe - excludeLayout?: InputMaybe - layout?: InputMaybe - reacted?: InputMaybe - title?: InputMaybe - topic?: InputMaybe - visibility?: InputMaybe + author?: InputMaybe + body?: InputMaybe + days?: InputMaybe + excludeLayout?: InputMaybe + layout?: InputMaybe + reacted?: InputMaybe + title?: InputMaybe + topic?: InputMaybe + visibility?: InputMaybe } export type LoadShoutsOptions = { filters?: InputMaybe - limit: Scalars['Int'] - offset?: InputMaybe - order_by?: InputMaybe - order_by_desc?: InputMaybe - with_author_captions?: InputMaybe + limit: Scalars['Int']['input'] + offset?: InputMaybe + order_by?: InputMaybe + order_by_desc?: InputMaybe + with_author_captions?: InputMaybe } export type Message = { - author: Scalars['Int'] - body: Scalars['String'] - chatId: Scalars['String'] - createdAt: Scalars['Int'] - id: Scalars['Int'] - replyTo?: Maybe - seen?: Maybe - updatedAt?: Maybe + author: Scalars['Int']['output'] + body: Scalars['String']['output'] + chatId: Scalars['String']['output'] + createdAt: Scalars['Int']['output'] + id: Scalars['Int']['output'] + replyTo?: Maybe + seen?: Maybe + updatedAt?: Maybe } export enum MessageStatus { @@ -151,12 +155,12 @@ export enum MessageStatus { } export type MessagesBy = { - author?: InputMaybe - body?: InputMaybe - chat?: InputMaybe - days?: InputMaybe - order?: InputMaybe - stat?: InputMaybe + author?: InputMaybe + body?: InputMaybe + chat?: InputMaybe + days?: InputMaybe + order?: InputMaybe + stat?: InputMaybe } export type Mutation = { @@ -189,18 +193,18 @@ export type Mutation = { } export type MutationConfirmEmailArgs = { - token: Scalars['String'] + token: Scalars['String']['input'] } export type MutationCreateChatArgs = { - members: Array> - title?: InputMaybe + members: Array> + title?: InputMaybe } export type MutationCreateMessageArgs = { - body: Scalars['String'] - chat: Scalars['String'] - replyTo?: InputMaybe + body: Scalars['String']['input'] + chat: Scalars['String']['input'] + replyTo?: InputMaybe } export type MutationCreateReactionArgs = { @@ -216,59 +220,59 @@ export type MutationCreateTopicArgs = { } export type MutationDeleteChatArgs = { - chatId: Scalars['String'] + chatId: Scalars['String']['input'] } export type MutationDeleteMessageArgs = { - chatId: Scalars['String'] - id: Scalars['Int'] + chatId: Scalars['String']['input'] + id: Scalars['Int']['input'] } export type MutationDeleteReactionArgs = { - id: Scalars['Int'] + id: Scalars['Int']['input'] } export type MutationDeleteShoutArgs = { - shout_id: Scalars['Int'] + shout_id: Scalars['Int']['input'] } export type MutationDestroyTopicArgs = { - slug: Scalars['String'] + slug: Scalars['String']['input'] } export type MutationFollowArgs = { - slug: Scalars['String'] + slug: Scalars['String']['input'] what: FollowingEntity } export type MutationMarkAsReadArgs = { - chatId: Scalars['String'] - ids: Array> + chatId: Scalars['String']['input'] + ids: Array> } export type MutationMarkNotificationAsReadArgs = { - notification_id: Scalars['Int'] + notification_id: Scalars['Int']['input'] } export type MutationRateUserArgs = { - slug: Scalars['String'] - value: Scalars['Int'] + slug: Scalars['String']['input'] + value: Scalars['Int']['input'] } export type MutationRegisterUserArgs = { - email: Scalars['String'] - name?: InputMaybe - password?: InputMaybe + email: Scalars['String']['input'] + name?: InputMaybe + password?: InputMaybe } export type MutationSendLinkArgs = { - email: Scalars['String'] - lang?: InputMaybe - template?: InputMaybe + email: Scalars['String']['input'] + lang?: InputMaybe + template?: InputMaybe } export type MutationUnfollowArgs = { - slug: Scalars['String'] + slug: Scalars['String']['input'] what: FollowingEntity } @@ -277,9 +281,9 @@ export type MutationUpdateChatArgs = { } export type MutationUpdateMessageArgs = { - body: Scalars['String'] - chatId: Scalars['String'] - id: Scalars['Int'] + body: Scalars['String']['input'] + chatId: Scalars['String']['input'] + id: Scalars['Int']['input'] } export type MutationUpdateProfileArgs = { @@ -287,13 +291,13 @@ export type MutationUpdateProfileArgs = { } export type MutationUpdateReactionArgs = { - id: Scalars['Int'] + id: Scalars['Int']['input'] reaction: ReactionInput } export type MutationUpdateShoutArgs = { - publish?: InputMaybe - shout_id: Scalars['Int'] + publish?: InputMaybe + shout_id: Scalars['Int']['input'] shout_input?: InputMaybe } @@ -301,71 +305,73 @@ export type MutationUpdateTopicArgs = { input: TopicInput } +export type MySubscriptionsQueryResult = { + authors: Array> + topics: Array> +} + export type Notification = { - createdAt: Scalars['DateTime'] - data?: Maybe - id: Scalars['Int'] - occurrences: Scalars['Int'] - reaction?: Maybe - seen: Scalars['Boolean'] - shout?: Maybe + createdAt: Scalars['DateTime']['output'] + data?: Maybe + id: Scalars['Int']['output'] + occurrences: Scalars['Int']['output'] + reaction?: Maybe + seen: Scalars['Boolean']['output'] + shout?: Maybe type: NotificationType } export enum NotificationType { NewComment = 'NEW_COMMENT', - NewReply = 'NEW_REPLY', - NewFollower = 'NEW_FOLLOWER', - NewShout = 'NEW_SHOUT', - NewLike = 'NEW_LIKE', - NewDislike = 'NEW_DISLIKE' + NewReply = 'NEW_REPLY' } export type NotificationsQueryParams = { - limit?: InputMaybe - offset?: InputMaybe + limit?: InputMaybe + offset?: InputMaybe } export type NotificationsQueryResult = { notifications: Array> - totalCount: Scalars['Int'] - totalUnreadCount: Scalars['Int'] + totalCount: Scalars['Int']['output'] + totalUnreadCount: Scalars['Int']['output'] } export type Operation = { - id: Scalars['Int'] - name: Scalars['String'] + id: Scalars['Int']['output'] + name: Scalars['String']['output'] } export type Permission = { - operation: Scalars['Int'] - resource: Scalars['Int'] + operation: Scalars['Int']['output'] + resource: Scalars['Int']['output'] } export type ProfileInput = { - about?: InputMaybe - bio?: InputMaybe - links?: InputMaybe>> - name?: InputMaybe - slug?: InputMaybe - userpic?: InputMaybe + about?: InputMaybe + bio?: InputMaybe + links?: InputMaybe>> + name?: InputMaybe + slug?: InputMaybe + userpic?: InputMaybe } export type Query = { authorsAll: Array> getAuthor?: Maybe getTopic?: Maybe - isEmailUsed: Scalars['Boolean'] + isEmailUsed: Scalars['Boolean']['output'] loadAuthorsBy: Array> loadChats: Result loadDrafts: Array> loadMessagesBy: Result + loadMySubscriptions?: Maybe loadNotifications: NotificationsQueryResult loadReactionsBy: Array> loadRecipients: Result loadShout?: Maybe loadShouts: Array> - markdownBody: Scalars['String'] + markdownBody: Scalars['String']['output'] myFeed?: Maybe>> searchMessages: Result searchRecipients: Result @@ -381,32 +387,32 @@ export type Query = { } export type QueryGetAuthorArgs = { - slug: Scalars['String'] + slug: Scalars['String']['input'] } export type QueryGetTopicArgs = { - slug: Scalars['String'] + slug: Scalars['String']['input'] } export type QueryIsEmailUsedArgs = { - email: Scalars['String'] + email: Scalars['String']['input'] } export type QueryLoadAuthorsByArgs = { by?: InputMaybe - limit?: InputMaybe - offset?: InputMaybe + limit?: InputMaybe + offset?: InputMaybe } export type QueryLoadChatsArgs = { - limit?: InputMaybe - offset?: InputMaybe + limit?: InputMaybe + offset?: InputMaybe } export type QueryLoadMessagesByArgs = { by: MessagesBy - limit?: InputMaybe - offset?: InputMaybe + limit?: InputMaybe + offset?: InputMaybe } export type QueryLoadNotificationsArgs = { @@ -415,18 +421,18 @@ export type QueryLoadNotificationsArgs = { export type QueryLoadReactionsByArgs = { by: ReactionBy - limit?: InputMaybe - offset?: InputMaybe + limit?: InputMaybe + offset?: InputMaybe } export type QueryLoadRecipientsArgs = { - limit?: InputMaybe - offset?: InputMaybe + limit?: InputMaybe + offset?: InputMaybe } export type QueryLoadShoutArgs = { - shout_id?: InputMaybe - slug?: InputMaybe + shout_id?: InputMaybe + slug?: InputMaybe } export type QueryLoadShoutsArgs = { @@ -434,7 +440,7 @@ export type QueryLoadShoutsArgs = { } export type QueryMarkdownBodyArgs = { - body: Scalars['String'] + body: Scalars['String']['input'] } export type QueryMyFeedArgs = { @@ -443,85 +449,85 @@ export type QueryMyFeedArgs = { export type QuerySearchMessagesArgs = { by: MessagesBy - limit?: InputMaybe - offset?: InputMaybe + limit?: InputMaybe + offset?: InputMaybe } export type QuerySearchRecipientsArgs = { - limit?: InputMaybe - offset?: InputMaybe - query: Scalars['String'] + limit?: InputMaybe + offset?: InputMaybe + query: Scalars['String']['input'] } export type QuerySignInArgs = { - email: Scalars['String'] - lang?: InputMaybe - password?: InputMaybe + email: Scalars['String']['input'] + lang?: InputMaybe + password?: InputMaybe } export type QueryTopicsByAuthorArgs = { - author: Scalars['String'] + author: Scalars['String']['input'] } export type QueryTopicsByCommunityArgs = { - community: Scalars['String'] + community: Scalars['String']['input'] } export type QueryTopicsRandomArgs = { - amount?: InputMaybe + amount?: InputMaybe } export type QueryUserFollowedAuthorsArgs = { - slug: Scalars['String'] + slug: Scalars['String']['input'] } export type QueryUserFollowedTopicsArgs = { - slug: Scalars['String'] + slug: Scalars['String']['input'] } export type QueryUserFollowersArgs = { - slug: Scalars['String'] + slug: Scalars['String']['input'] } export type Rating = { - rater: Scalars['String'] - value: Scalars['Int'] + rater: Scalars['String']['output'] + value: Scalars['Int']['output'] } export type Reaction = { - body?: Maybe - createdAt: Scalars['DateTime'] + body?: Maybe + createdAt: Scalars['DateTime']['output'] createdBy: User - deletedAt?: Maybe + deletedAt?: Maybe deletedBy?: Maybe - id: Scalars['Int'] + id: Scalars['Int']['output'] kind: ReactionKind - old_id?: Maybe - old_thread?: Maybe - range?: Maybe - replyTo?: Maybe + old_id?: Maybe + old_thread?: Maybe + range?: Maybe + replyTo?: Maybe shout: Shout stat?: Maybe - updatedAt?: Maybe + updatedAt?: Maybe } export type ReactionBy = { - comment?: InputMaybe - createdBy?: InputMaybe - days?: InputMaybe - search?: InputMaybe - shout?: InputMaybe - shouts?: InputMaybe>> - sort?: InputMaybe - topic?: InputMaybe + comment?: InputMaybe + createdBy?: InputMaybe + days?: InputMaybe + search?: InputMaybe + shout?: InputMaybe + shouts?: InputMaybe>> + sort?: InputMaybe + topic?: InputMaybe } export type ReactionInput = { - body?: InputMaybe + body?: InputMaybe kind: ReactionKind - range?: InputMaybe - replyTo?: InputMaybe - shout: Scalars['Int'] + range?: InputMaybe + replyTo?: InputMaybe + shout: Scalars['Int']['input'] } export enum ReactionKind { @@ -550,14 +556,14 @@ export enum ReactionStatus { } export type ReactionUpdating = { - error?: Maybe + error?: Maybe reaction?: Maybe status?: Maybe } export type Resource = { - id: Scalars['Int'] - name: Scalars['String'] + id: Scalars['Int']['output'] + name: Scalars['String']['output'] } export type Result = { @@ -567,7 +573,7 @@ export type Result = { chats?: Maybe>> communities?: Maybe>> community?: Maybe - error?: Maybe + error?: Maybe members?: Maybe>> message?: Maybe messages?: Maybe>> @@ -575,129 +581,121 @@ export type Result = { reactions?: Maybe>> shout?: Maybe shouts?: Maybe>> - slugs?: Maybe>> + slugs?: Maybe>> topic?: Maybe topics?: Maybe>> } export type Role = { - community: Scalars['String'] - desc?: Maybe - id: Scalars['Int'] - name: Scalars['String'] + community: Scalars['String']['output'] + desc?: Maybe + id: Scalars['Int']['output'] + name: Scalars['String']['output'] permissions: Array } export type Shout = { authors?: Maybe>> - body: Scalars['String'] - community?: Maybe - cover?: Maybe - createdAt: Scalars['DateTime'] - deletedAt?: Maybe + body: Scalars['String']['output'] + community?: Maybe + cover?: Maybe + createdAt: Scalars['DateTime']['output'] + deletedAt?: Maybe deletedBy?: Maybe - description?: Maybe - id: Scalars['Int'] - lang?: Maybe - layout?: Maybe - lead?: Maybe - mainTopic?: Maybe - media?: Maybe - publishedAt?: Maybe - slug: Scalars['String'] + description?: Maybe + id: Scalars['Int']['output'] + lang?: Maybe + layout?: Maybe + lead?: Maybe + mainTopic?: Maybe + media?: Maybe + publishedAt?: Maybe + slug: Scalars['String']['output'] stat?: Maybe - subtitle?: Maybe - title?: Maybe + subtitle?: Maybe + title?: Maybe topics?: Maybe>> - updatedAt?: Maybe + updatedAt?: Maybe updatedBy?: Maybe - versionOf?: Maybe - visibility?: Maybe + versionOf?: Maybe + visibility?: Maybe } export type ShoutInput = { - authors?: InputMaybe>> - body?: InputMaybe - community?: InputMaybe - cover?: InputMaybe - description?: InputMaybe - layout?: InputMaybe - lead?: InputMaybe + authors?: InputMaybe>> + body?: InputMaybe + community?: InputMaybe + cover?: InputMaybe + description?: InputMaybe + layout?: InputMaybe + lead?: InputMaybe mainTopic?: InputMaybe - media?: InputMaybe - slug?: InputMaybe - subtitle?: InputMaybe - title?: InputMaybe + media?: InputMaybe + slug?: InputMaybe + subtitle?: InputMaybe + title?: InputMaybe topics?: InputMaybe>> } export type Stat = { - commented?: Maybe - ranking?: Maybe - rating?: Maybe - reacted?: Maybe - viewed?: Maybe + commented?: Maybe + ranking?: Maybe + rating?: Maybe + reacted?: Maybe + viewed?: Maybe } export type Token = { - createdAt: Scalars['DateTime'] - expiresAt?: Maybe - id: Scalars['Int'] - ownerId: Scalars['Int'] - usedAt?: Maybe - value: Scalars['String'] + createdAt: Scalars['DateTime']['output'] + expiresAt?: Maybe + id: Scalars['Int']['output'] + ownerId: Scalars['Int']['output'] + usedAt?: Maybe + value: Scalars['String']['output'] } export type Topic = { - body?: Maybe - id: Scalars['Int'] - oid?: Maybe - pic?: Maybe - slug: Scalars['String'] + body?: Maybe + id: Scalars['Int']['output'] + oid?: Maybe + pic?: Maybe + slug: Scalars['String']['output'] stat?: Maybe - title?: Maybe + title?: Maybe } export type TopicInput = { - body?: InputMaybe - id?: InputMaybe - pic?: InputMaybe - slug: Scalars['String'] - title?: InputMaybe + body?: InputMaybe + id?: InputMaybe + pic?: InputMaybe + slug: Scalars['String']['input'] + title?: InputMaybe } export type TopicStat = { - authors: Scalars['Int'] - followers: Scalars['Int'] - shouts: Scalars['Int'] + authors: Scalars['Int']['output'] + followers: Scalars['Int']['output'] + shouts: Scalars['Int']['output'] } export type User = { - about?: Maybe - bio?: Maybe - communities?: Maybe>> - createdAt: Scalars['DateTime'] - email?: Maybe - emailConfirmed?: Maybe - id: Scalars['Int'] - lastSeen?: Maybe - links?: Maybe>> - muted?: Maybe - name?: Maybe - oauth?: Maybe - oid?: Maybe - password?: Maybe + about?: Maybe + bio?: Maybe + communities?: Maybe>> + createdAt: Scalars['DateTime']['output'] + email?: Maybe + emailConfirmed?: Maybe + id: Scalars['Int']['output'] + lastSeen?: Maybe + links?: Maybe>> + muted?: Maybe + name?: Maybe + oauth?: Maybe + oid?: Maybe + password?: Maybe ratings?: Maybe>> - slug: Scalars['String'] - updatedAt?: Maybe - username: Scalars['String'] - userpic?: Maybe -} - -export type UserFollowings = { - authors?: Maybe>> - communities?: Maybe>> - reactions?: Maybe>> - topics?: Maybe>> - unread?: Maybe + slug: Scalars['String']['output'] + updatedAt?: Maybe + username: Scalars['String']['output'] + userpic?: Maybe } diff --git a/src/pages/about/discussionRules.page.tsx b/src/pages/about/discussionRules.page.tsx index 7f03e424..5a97f12b 100644 --- a/src/pages/about/discussionRules.page.tsx +++ b/src/pages/about/discussionRules.page.tsx @@ -4,7 +4,7 @@ import { Title } from '@solidjs/meta' export const DiscussionRulesPage = () => { const { t } = useLocalize() - const title = t('Discussion rules') + const title = t('Discussion rules in social networks') return ( {title} diff --git a/src/pages/about/help.page.tsx b/src/pages/about/help.page.tsx index cded23cb..250f0c5e 100644 --- a/src/pages/about/help.page.tsx +++ b/src/pages/about/help.page.tsx @@ -15,8 +15,8 @@ export const HelpPage = () => { return ( {t('Support us')} - Здесь можно поддержать Дискурс материально. - Discours.io, помощь, благотворительность + + {/*Благодарим!*/} diff --git a/src/pages/about/manifest.page.tsx b/src/pages/about/manifest.page.tsx index 9878de07..a4d2e4aa 100644 --- a/src/pages/about/manifest.page.tsx +++ b/src/pages/about/manifest.page.tsx @@ -2,7 +2,7 @@ import { createSignal, Show } from 'solid-js' import { PageLayout } from '../../components/_shared/PageLayout' import { Modal } from '../../components/Nav/Modal' import { Feedback } from '../../components/Discours/Feedback' -import Subscribe from '../../components/Discours/Subscribe' +import { Subscribe } from '../../components/_shared/Subscribe' import Opener from '../../components/Nav/Modal/Opener' import { Icon } from '../../components/_shared/Icon' diff --git a/src/pages/about/principles.page.tsx b/src/pages/about/principles.page.tsx index 88378c9f..314f1895 100644 --- a/src/pages/about/principles.page.tsx +++ b/src/pages/about/principles.page.tsx @@ -61,7 +61,7 @@ export const PrinciplesPage = () => {

    - Как участвовать в самиздате + Как у нас принято себя вести

    diff --git a/src/pages/article.page.server.ts b/src/pages/article.page.server.ts index fd439321..2889c1ee 100644 --- a/src/pages/article.page.server.ts +++ b/src/pages/article.page.server.ts @@ -1,14 +1,14 @@ import type { PageContext } from '../renderer/types' import type { PageProps } from './types' import { apiClient } from '../utils/apiClient' -import { RenderErrorPage } from 'vite-plugin-ssr/RenderErrorPage' +import { render } from 'vike/abort' export const onBeforeRender = async (pageContext: PageContext) => { const { slug } = pageContext.routeParams const article = await apiClient.getShoutBySlug(slug) if (!article) { - throw RenderErrorPage({ pageContext: {} }) + throw render(404, '/404') } const pageProps: PageProps = { article } diff --git a/src/pages/article.page.tsx b/src/pages/article.page.tsx index c5ed9aac..f96cc748 100644 --- a/src/pages/article.page.tsx +++ b/src/pages/article.page.tsx @@ -3,11 +3,12 @@ import type { Shout } from '../graphql/types.gen' import { PageLayout } from '../components/_shared/PageLayout' import type { PageProps } from './types' import { loadShout, useArticlesStore } from '../stores/zine/articles' -import { useRouter } from '../stores/router' +import { router, useRouter } from '../stores/router' import { Loading } from '../components/_shared/Loading' import { ReactionsProvider } from '../context/reactions' import { FullArticle } from '../components/Article/FullArticle' import { setPageLoadManagerPromise } from '../utils/pageLoadManager' +import { redirectPage } from '@nanostores/router' export const ArticlePage = (props: PageProps) => { const shouts = props.article ? [props.article] : [] @@ -28,6 +29,10 @@ export const ArticlePage = (props: PageProps) => { const loadShoutPromise = loadShout(slug()) setPageLoadManagerPromise(loadShoutPromise) await loadShoutPromise + + if (!article()) { + redirectPage(router, 'fourOuFour') + } } }) diff --git a/src/pages/author.page.server.ts b/src/pages/author.page.server.ts index 479e7fc7..9564e3d9 100644 --- a/src/pages/author.page.server.ts +++ b/src/pages/author.page.server.ts @@ -7,7 +7,7 @@ export const onBeforeRender = async (pageContext: PageContext) => { const { slug } = pageContext.routeParams const authorShouts = await apiClient.getShouts({ - filters: { author: slug }, + filters: { author: slug, visibility: 'community' }, limit: PRERENDERED_ARTICLES_COUNT }) const author = await apiClient.getAuthor({ slug }) diff --git a/src/pages/feed.page.tsx b/src/pages/feed.page.tsx index e695f29d..8acb88d0 100644 --- a/src/pages/feed.page.tsx +++ b/src/pages/feed.page.tsx @@ -1,27 +1,37 @@ import { PageLayout } from '../components/_shared/PageLayout' import { FeedView } from '../components/Views/Feed' -import { Match, onCleanup, Switch } from 'solid-js' +import { createEffect, Match, on, onCleanup, Switch } from 'solid-js' import { loadMyFeed, loadShouts, resetSortedArticles } from '../stores/zine/articles' import { ReactionsProvider } from '../context/reactions' import { useRouter } from '../stores/router' import { AuthGuard } from '../components/AuthGuard' import { LoadShoutsOptions } from '../graphql/types.gen' +const handleFeedLoadShouts = (options: LoadShoutsOptions) => { + return loadShouts({ + ...options, + filters: { visibility: 'community' } + }) +} + +const handleMyFeedLoadShouts = (options: LoadShoutsOptions) => { + return loadMyFeed(options) +} + export const FeedPage = () => { onCleanup(() => resetSortedArticles()) const { page } = useRouter() - const handleFeedLoadShouts = (options: LoadShoutsOptions) => { - return loadShouts({ - ...options, - filters: { visibility: 'community' } - }) - } - - const handleMyFeedLoadShouts = (options: LoadShoutsOptions) => { - return loadMyFeed(options) - } + createEffect( + on( + () => page().route, + () => { + resetSortedArticles() + }, + { defer: true } + ) + ) return ( diff --git a/src/pages/index.page.tsx b/src/pages/index.page.tsx index d3aada42..c086cb46 100644 --- a/src/pages/index.page.tsx +++ b/src/pages/index.page.tsx @@ -18,8 +18,10 @@ export const HomePage = (props: PageProps) => { return } - await loadShouts({ filters: { visibility: 'public' }, limit: PRERENDERED_ARTICLES_COUNT }) - await loadRandomTopics({ amount: RANDOM_TOPICS_COUNT }) + await Promise.all([ + loadShouts({ filters: { visibility: 'public' }, limit: PRERENDERED_ARTICLES_COUNT }), + loadRandomTopics({ amount: RANDOM_TOPICS_COUNT }) + ]) setIsLoaded(true) }) diff --git a/src/pages/profile/Settings.module.scss b/src/pages/profile/Settings.module.scss index a6ce9407..4553b827 100644 --- a/src/pages/profile/Settings.module.scss +++ b/src/pages/profile/Settings.module.scss @@ -17,6 +17,14 @@ h5 { margin-top: 3rem; } +.error { + @include font-size(1.6rem); + + text-align: center; + color: var(--danger-color); + margin-top: 1.6rem; +} + .multipleControlsItem { position: relative; @@ -133,7 +141,9 @@ h5 { color: #000; display: flex; padding: 0.8em 1em; - transition: background-color 0.3s, color 0.3s; + transition: + background-color 0.3s, + color 0.3s; &:hover { background: #000; @@ -205,3 +215,63 @@ h5 { } } } + +.userpic { + @include font-size(1.2rem); + + position: relative; + width: 180px; + height: 180px; + border-radius: 50%; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + text-align: center; + gap: 1rem; + color: var(--black-300); + border: 1px solid var(--black-100); + cursor: pointer; + + img { + width: 100%; + border-radius: 50%; + } + + &.hasControls { + overflow: visible; + } + + .controls { + position: absolute; + right: -50px; + display: flex; + flex-direction: column; + gap: 1rem; + } + + .control { + width: 40px; + height: 40px; + border-radius: 50%; + background: var(--background-color); + border: 1px solid var(--black-100); + + img { + border-radius: unset; + } + + &:hover { + background: var(--background-color-invert); + + img { + filter: invert(1); + } + } + } +} + +.socialInput { + margin-top: 1rem; +} diff --git a/src/pages/profile/profileSettings.page.tsx b/src/pages/profile/profileSettings.page.tsx index 478ae5d6..991892c7 100644 --- a/src/pages/profile/profileSettings.page.tsx +++ b/src/pages/profile/profileSettings.page.tsx @@ -1,7 +1,6 @@ import { PageLayout } from '../../components/_shared/PageLayout' -import { Icon } from '../../components/_shared/Icon' import { ProfileSettingsNavigation } from '../../components/Nav/ProfileSettingsNavigation' -import { For, createSignal, Show, onMount, onCleanup, createEffect } from 'solid-js' +import { For, createSignal, Show, onMount, onCleanup, createEffect, Switch, Match } from 'solid-js' import deepEqual from 'fast-deep-equal' import { clsx } from 'clsx' import styles from './Settings.module.scss' @@ -12,19 +11,27 @@ import { useSession } from '../../context/session' import FloatingPanel from '../../components/_shared/FloatingPanel/FloatingPanel' import { useSnackbar } from '../../context/snackbar' import { useLocalize } from '../../context/localize' -import { handleFileUpload } from '../../utils/handleFileUpload' import { Userpic } from '../../components/Author/Userpic' import { createStore } from 'solid-js/store' import { clone } from '../../utils/clone' import SimplifiedEditor from '../../components/Editor/SimplifiedEditor' import { GrowingTextarea } from '../../components/_shared/GrowingTextarea' import { AuthGuard } from '../../components/AuthGuard' +import { handleImageUpload } from '../../utils/handleImageUpload' +import { SocialNetworkInput } from '../../components/_shared/SocialNetworkInput' +import { profileSocialLinks } from '../../utils/profileSocialLinks' +import { Icon } from '../../components/_shared/Icon' +import { Popover } from '../../components/_shared/Popover' +import { Image } from '../../components/_shared/Image' +import { Loading } from '../../components/_shared/Loading' export const ProfileSettingsPage = () => { const { t } = useLocalize() const [addLinkForm, setAddLinkForm] = createSignal(false) const [incorrectUrl, setIncorrectUrl] = createSignal(false) + const [isUserpicUpdating, setIsUserpicUpdating] = createSignal(false) + const [uploadError, setUploadError] = createSignal(false) const [isFloatingPanelVisible, setIsFloatingPanelVisible] = createSignal(false) const { @@ -37,7 +44,7 @@ export const ProfileSettingsPage = () => { const { form, updateFormField, submit, slugError } = useProfileForm() const [prevForm, setPrevForm] = createStore(clone(form)) - + const [social, setSocial] = createSignal(form.links) const handleChangeSocial = (value: string) => { if (validateUrl(value)) { updateFormField('links', value) @@ -62,15 +69,17 @@ export const ProfileSettingsPage = () => { const { selectFiles } = createFileUploader({ multiple: false, accept: 'image/*' }) - const handleAvatarClick = async () => { - await selectFiles(async ([uploadFile]) => { + const handleUploadAvatar = async () => { + selectFiles(async ([uploadFile]) => { try { + setUploadError(false) setIsUserpicUpdating(true) - const result = await handleFileUpload(uploadFile) + const result = await handleImageUpload(uploadFile) updateFormField('userpic', result.url) setIsUserpicUpdating(false) setIsFloatingPanelVisible(true) } catch (error) { + setUploadError(true) console.error('[upload avatar] error', error) } }) @@ -105,6 +114,14 @@ export const ProfileSettingsPage = () => { } }) + const handleDeleteSocialLink = (link) => { + updateFormField('links', link, true) + } + + createEffect(() => { + setSocial(form.links) + }) + return ( @@ -123,14 +140,51 @@ export const ProfileSettingsPage = () => {

    {t('Here you can customize your profile the way you want.')}

    {t('Userpic')}

    -
    - +
    +
    + + + + + + {form.name} +
    + + {(triggerRef: (el) => void) => ( + + )} + + + {(triggerRef: (el) => void) => ( + + )} + +
    +
    + + + {t('Here you can upload your photo')} + +
    +
    + +
    {t('Upload error')}
    +

    {t('Name')}

    @@ -224,27 +278,26 @@ export const ProfileSettingsPage = () => {

    -
    - handleChangeSocial(event.currentTarget.value)} - /> -
    + handleChangeSocial(value)} + />

    {t('It does not look like url')}

    - - {(link) => ( -
    - - -
    + + {(network) => ( + handleChangeSocial(value)} + isExist={!network.isPlaceholder} + slug={form.slug} + handleDelete={() => handleDeleteSocialLink(network.link)} + /> )}
    diff --git a/src/renderer/_default.page.client.tsx b/src/renderer/_default.page.client.tsx index cbd78195..3c0fb580 100644 --- a/src/renderer/_default.page.client.tsx +++ b/src/renderer/_default.page.client.tsx @@ -1,9 +1,9 @@ import { App } from '../components/App' import { hydrate } from 'solid-js/web' -import type { PageContextBuiltInClientWithClientRouting } from 'vite-plugin-ssr/types' +import type { PageContextBuiltInClientWithClientRouting } from 'vike/types' import type { PageContext } from './types' import { MetaProvider } from '@solidjs/meta' -import i18next, { use as useI18next } from 'i18next' +import i18next from 'i18next' import ICU from 'i18next-icu' import HttpApi from 'i18next-http-backend' import * as Sentry from '@sentry/browser' @@ -30,14 +30,17 @@ export const render = async (pageContext: PageContextBuiltInClientWithClientRout }) } - useI18next(HttpApi) - await i18next.use(ICU).init({ - // debug: true, - supportedLngs: ['ru', 'en'], - fallbackLng: lng, - lng, - load: 'languageOnly' - }) + // eslint-disable-next-line import/no-named-as-default-member + await i18next + .use(HttpApi) + .use(ICU) + .init({ + // debug: true, + supportedLngs: ['ru', 'en'], + fallbackLng: lng, + lng, + load: 'languageOnly' + }) const isIOSorMacOSorAndroid = /iphone|ipad|ipod|macintosh|android/i.test(navigator.userAgent) diff --git a/src/renderer/_default.page.server.tsx b/src/renderer/_default.page.server.tsx index fa656cef..fccf4d9c 100644 --- a/src/renderer/_default.page.server.tsx +++ b/src/renderer/_default.page.server.tsx @@ -1,9 +1,9 @@ -import { generateHydrationScript, renderToString } from 'solid-js/web' -import { escapeInject, dangerouslySkipEscape } from 'vite-plugin-ssr/server' +import { generateHydrationScript, getAssets, renderToString } from 'solid-js/web' +import { escapeInject, dangerouslySkipEscape } from 'vike/server' import { App } from '../components/App' import { initRouter } from '../stores/router' import type { PageContext } from './types' -import { MetaProvider, renderTags } from '@solidjs/meta' +import { MetaProvider } from '@solidjs/meta' import i18next from 'i18next' import ru from '../../public/locales/ru/translation.json' import en from '../../public/locales/en/translation.json' @@ -45,6 +45,7 @@ export const render = async (pageContext: PageContext) => { } }) } else if (i18next.language !== lng) { + // eslint-disable-next-line import/no-named-as-default-member await i18next.changeLanguage(lng) } @@ -65,7 +66,7 @@ export const render = async (pageContext: PageContext) => { return escapeInject` - ${dangerouslySkipEscape(renderTags(metaTags))} + ${dangerouslySkipEscape(getAssets())} ${dangerouslySkipEscape(generateHydrationScript())} diff --git a/src/renderer/_error.page.ts b/src/renderer/_error.page.ts index f3733631..632ecd7e 100644 --- a/src/renderer/_error.page.ts +++ b/src/renderer/_error.page.ts @@ -1,4 +1,4 @@ -// this file is required by vite-plugin-ssr to show something after an error occurred +// this file is required by vike to show something after an error occurred // it's empty because error handling logic lives in _default.page.server.tsx and _default.page.client.tsx // eslint-disable-next-line unicorn/no-empty-file diff --git a/src/renderer/types.ts b/src/renderer/types.ts index f7b03b9b..56c7d1ea 100644 --- a/src/renderer/types.ts +++ b/src/renderer/types.ts @@ -1,8 +1,8 @@ -import type { PageContextBuiltIn } from 'vite-plugin-ssr/types' import type { PageProps } from '../pages/types' import type { Component } from 'solid-js' +import { PageContextBuiltInClientWithClientRouting } from 'vike/dist/esm/types' -export type PageContext = PageContextBuiltIn & { +export type PageContext = PageContextBuiltInClientWithClientRouting & { Page: (pageProps: PageProps) => Component pageProps: PageProps lng: string diff --git a/src/stores/zine/articles.ts b/src/stores/zine/articles.ts index f680353a..3630550e 100644 --- a/src/stores/zine/articles.ts +++ b/src/stores/zine/articles.ts @@ -12,41 +12,50 @@ const [topArticles, setTopArticles] = createSignal([]) const [topMonthArticles, setTopMonthArticles] = createSignal([]) const articlesByAuthor = createLazyMemo(() => { - return Object.values(articleEntities()).reduce((acc, article) => { - article.authors.forEach((author) => { - if (!acc[author.slug]) { - acc[author.slug] = [] - } - acc[author.slug].push(article) - }) + return Object.values(articleEntities()).reduce( + (acc, article) => { + article.authors.forEach((author) => { + if (!acc[author.slug]) { + acc[author.slug] = [] + } + acc[author.slug].push(article) + }) - return acc - }, {} as { [authorSlug: string]: Shout[] }) + return acc + }, + {} as { [authorSlug: string]: Shout[] } + ) }) const articlesByTopic = createLazyMemo(() => { - return Object.values(articleEntities()).reduce((acc, article) => { - article.topics.forEach((topic) => { - if (!acc[topic.slug]) { - acc[topic.slug] = [] - } - acc[topic.slug].push(article) - }) + return Object.values(articleEntities()).reduce( + (acc, article) => { + article.topics.forEach((topic) => { + if (!acc[topic.slug]) { + acc[topic.slug] = [] + } + acc[topic.slug].push(article) + }) - return acc - }, {} as { [authorSlug: string]: Shout[] }) + return acc + }, + {} as { [authorSlug: string]: Shout[] } + ) }) const articlesByLayout = createLazyMemo(() => { - return Object.values(articleEntities()).reduce((acc, article) => { - if (!acc[article.layout]) { - acc[article.layout] = [] - } + return Object.values(articleEntities()).reduce( + (acc, article) => { + if (!acc[article.layout]) { + acc[article.layout] = [] + } - acc[article.layout].push(article) + acc[article.layout].push(article) - return acc - }, {} as { [layout: string]: Shout[] }) + return acc + }, + {} as { [layout: string]: Shout[] } + ) }) const topViewedArticles = createLazyMemo(() => { @@ -65,10 +74,13 @@ const topCommentedArticles = createLazyMemo(() => { const addArticles = (...args: Shout[][]) => { const allArticles = args.flatMap((articles) => articles || []) - const newArticleEntities = allArticles.reduce((acc, article) => { - acc[article.slug] = article - return acc - }, {} as { [articleSLug: string]: Shout }) + const newArticleEntities = allArticles.reduce( + (acc, article) => { + acc[article.slug] = article + return acc + }, + {} as { [articleSLug: string]: Shout } + ) setArticleEntities((prevArticleEntities) => { return { @@ -77,23 +89,26 @@ const addArticles = (...args: Shout[][]) => { } }) - const authorsByTopic = allArticles.reduce((acc, article) => { - const { authors, topics } = article + const authorsByTopic = allArticles.reduce( + (acc, article) => { + const { authors, topics } = article - topics.forEach((topic) => { - if (!acc[topic.slug]) { - acc[topic.slug] = [] - } - - authors.forEach((author) => { - if (!acc[topic.slug].some((a) => a.slug === author.slug)) { - acc[topic.slug].push(author) + topics.forEach((topic) => { + if (!acc[topic.slug]) { + acc[topic.slug] = [] } - }) - }) - return acc - }, {} as { [topicSlug: string]: Author[] }) + authors.forEach((author) => { + if (!acc[topic.slug].some((a) => a.slug === author.slug)) { + acc[topic.slug].push(author) + } + }) + }) + + return acc + }, + {} as { [topicSlug: string]: Author[] } + ) addAuthorsByTopic(authorsByTopic) } @@ -104,6 +119,9 @@ const addSortedArticles = (articles: Shout[]) => { export const loadShout = async (slug: string): Promise => { const newArticle = await apiClient.getShoutBySlug(slug) + if (!newArticle) { + return + } addArticles([newArticle]) const newArticleIndex = sortedArticles().findIndex((s) => s.id === newArticle.id) if (newArticleIndex >= 0) { diff --git a/src/styles/app.scss b/src/styles/app.scss index 4f75474e..3fcbe46a 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -17,8 +17,8 @@ --link-hover-background: #000; --secondary-color: #85878a; --placeholder-color: #9fa1a7; - --placeholder-color-semi: rgba(159, 169, 167, 0.2); - --danger-color: #fc6847; + --placeholder-color-semi: rgb(159 169 167 / 20%); + --danger-color: #d00820; --lightgray-color: rgb(84 16 17 / 6%); --font: -apple-system, blinkmacsystemfont, 'Segoe UI', roboto, oxygen, ubuntu, cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; @@ -28,6 +28,7 @@ --icon-filter-hover: invert(1); --editor-bubble-menu-background: #fff; --blue-link: #2638d9; + // names from figma --black-50: #f7f7f8; --black-100: #e9e9ee; @@ -53,6 +54,7 @@ --icon-filter: invert(1); --icon-filter-hover: invert(0); --editor-bubble-menu-background: #444; + // names from figma --black-50: #080807; --black-100: #161611; @@ -146,11 +148,13 @@ h2 { h1 { @include font-size(4.8rem); + line-height: 1.1; } h2 { @include font-size(4rem); + line-height: 1.1; margin-bottom: 0.5em; margin-top: 1.5em; @@ -158,6 +162,7 @@ h2 { h3 { @include font-size(3.2rem); + line-height: 1.1; margin-bottom: 0.5em; } @@ -289,6 +294,7 @@ button { .button--light { @include font-size(1.5rem); + background-color: #f6f6f6; border-radius: 0.8rem; color: #000; @@ -583,16 +589,22 @@ figure { max-height: 90vh; margin: auto; } +} +.ta-video-container, +figure { figcaption { color: rgb(0 0 0 / 60%); + @include font-size(1.2rem); + line-height: 1.5; } } .view-switcher { @include font-size(1.4rem); + display: flex; font-weight: 500; list-style: none; @@ -810,8 +822,7 @@ figure { #root { display: flex; flex-direction: column; - align-content: space-between; - justify-content: space-between; + place-content: space-between space-between; min-height: 100vh; } @@ -901,6 +912,7 @@ figure { .content-index { @include font-size(1.4rem); + line-height: 1.4; margin: 0 3.6rem 2em 0; @@ -989,6 +1001,10 @@ details { @include font-size(1.4rem); color: rgba(0 0 0 / 40%); + + .pretty-form__item + & { + margin-top: -2rem; + } } [data-custom-scroll='on'] { @@ -1021,11 +1037,13 @@ details { iframe { border: none; - color: rgba(255, 255, 255, 0); + color: rgb(255 255 255 / 0%); + max-width: 100%; } .lead { @include font-size(2rem); + font-weight: bold; line-height: 1.5; } @@ -1033,3 +1051,7 @@ iframe { .cursorPointer { cursor: pointer; } + +.img-align-column { + clear: both; +} diff --git a/src/utils/apiClient.ts b/src/utils/apiClient.ts index 112eda7a..4cb2f618 100644 --- a/src/utils/apiClient.ts +++ b/src/utils/apiClient.ts @@ -17,7 +17,8 @@ import type { ReactionBy, Shout, NotificationsQueryParams, - NotificationsQueryResult + NotificationsQueryResult, + MySubscriptionsQueryResult } from '../graphql/types.gen' import { publicGraphQLClient } from '../graphql/publicGraphQLClient' import { getToken, privateGraphQLClient, privateInboxGraphQLClient } from '../graphql/privateGraphQLClient' @@ -58,6 +59,8 @@ import updateArticle from '../graphql/mutation/article-update' import deleteShout from '../graphql/mutation/article-delete' // import notifications from '../graphql/query/notifications' // import markNotificationAsRead from '../graphql/mutation/mark-notification-as-read' +import markAllNotificationsAsRead from '../graphql/mutation/mark-all-notifications-as-read' +import mySubscriptions from '../graphql/query/my-subscriptions' type ApiErrorCode = | 'unknown' @@ -307,9 +310,9 @@ export const apiClient = { }) .toPromise() - if (resp.error) { - console.error(resp) - } + // if (resp.error) { + // console.error(resp) + // } return resp.data.loadShout }, @@ -350,14 +353,12 @@ export const apiClient = { const resp = await publicGraphQLClient .query(reactionsLoadBy, { by, limit: limit ?? 1000, offset: 0 }) .toPromise() - // console.debug(resp) return resp.data.loadReactionsBy - } + }, // TODO: store notifications in browser storage /* getNotifications: async (params: NotificationsQueryParams): Promise => { - const resp = await privateGraphQLClient.query(notifications, params).toPromise() - // console.debug(resp.data) + const resp = await privateGraphQLClient.query(notifications, { params }).toPromise() return resp.data.loadNotifications }, markNotificationAsRead: async (notificationId: number): Promise => { @@ -368,6 +369,15 @@ export const apiClient = { .toPromise() }, */ + markAllNotificationsAsRead: async (): Promise => { + await privateGraphQLClient.mutation(markAllNotificationsAsRead, {}).toPromise() + }, + + getMySubscriptions: async (): Promise => { + const resp = await privateGraphQLClient.query(mySubscriptions, {}).toPromise() + // console.debug(resp.data) + return resp.data.loadMySubscriptions + } } export const inboxClient = { diff --git a/src/utils/config.ts b/src/utils/config.ts index 24918128..096c4e8d 100644 --- a/src/utils/config.ts +++ b/src/utils/config.ts @@ -4,4 +4,7 @@ const defaultApiUrl = 'https://testapi.discours.io' // export const apiBaseUrl = import.meta.env.PUBLIC_API_URL || defaultApiUrl export const apiBaseUrl = 'https://v2.discours.io' +const defaultThumborUrl = 'https://images.discours.io' +export const thumborUrl = import.meta.env.PUBLIC_THUMBOR_URL || defaultThumborUrl + export const SENTRY_DSN = import.meta.env.PUBLIC_SENTRY_DSN || '' diff --git a/src/utils/getImageUrl.ts b/src/utils/getImageUrl.ts new file mode 100644 index 00000000..93f7f616 --- /dev/null +++ b/src/utils/getImageUrl.ts @@ -0,0 +1,25 @@ +import { thumborUrl } from './config' + +const getSizeUrlPart = (options: { width?: number; height?: number } = {}) => { + const widthString = options.width ? options.width.toString() : '' + const heightString = options.height ? options.height.toString() : '' + + if (!widthString && !heightString) { + return '' + } + + return `${widthString}x${heightString}/` +} + +export const getImageUrl = (src: string, options: { width?: number; height?: number } = {}) => { + const sizeUrlPart = getSizeUrlPart(options) + + const thumborPrefix = `${thumborUrl}/unsafe/` + + if (src.startsWith(thumborPrefix)) { + const thumborKey = src.replace(thumborPrefix, '') + return `${thumborUrl}/unsafe/${sizeUrlPart}${thumborKey}` + } + + return `${thumborUrl}/unsafe/${sizeUrlPart}${src}` +} diff --git a/src/utils/getServerRoute.ts b/src/utils/getServerRoute.ts index dc666b5c..4e10ccc8 100644 --- a/src/utils/getServerRoute.ts +++ b/src/utils/getServerRoute.ts @@ -1,4 +1,4 @@ // /:slug -> /@slug -// https://vite-plugin-ssr.com/routing +// https://vike.dev/routing // https://www.npmjs.com/package/@nanostores/router export const getServerRoute = (clientRoute: string) => clientRoute.replaceAll(':', '@') diff --git a/src/utils/handleImageUpload.ts b/src/utils/handleImageUpload.ts new file mode 100644 index 00000000..609823df --- /dev/null +++ b/src/utils/handleImageUpload.ts @@ -0,0 +1,40 @@ +import { UploadFile } from '@solid-primitives/upload' +import { UploadedFile } from '../pages/types' +import { thumborUrl } from './config' + +export const handleImageUpload = async (uploadFile: UploadFile): Promise => { + const formData = new FormData() + formData.append('media', uploadFile.file, uploadFile.name) + const response = await fetch(`${thumborUrl}/image`, { + method: 'POST', + body: formData + }) + + const location = response.headers.get('Location') + + const url = `${thumborUrl}/unsafe/production${location.slice(0, location.lastIndexOf('/'))}` + const originalFilename = location.slice(location.lastIndexOf('/') + 1) + + // check that image is available + await new Promise((resolve, reject) => { + let retryCount = 0 + const checkUploadedImage = () => { + const uploadedImage = new Image() + uploadedImage.addEventListener('load', () => resolve()) + uploadedImage.addEventListener('error', () => { + retryCount++ + if (retryCount >= 3) { + return reject() + } + setTimeout(() => checkUploadedImage(), 1000) + }) + uploadedImage.src = url + } + checkUploadedImage() + }) + + return { + originalFilename, + url + } +} diff --git a/src/utils/imageProxy.ts b/src/utils/imageProxy.ts deleted file mode 100644 index c48530e6..00000000 --- a/src/utils/imageProxy.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { isDev } from './config' -export const imageProxy = (url: string) => { - return `${isDev ? 'https://new.discours.io' : ''}/api/image?url=${encodeURI(url)}` -} - -export const audioProxy = (url: string) => { - return `${isDev ? 'https://new.discours.io' : ''}/api/audio?url=${encodeURI(url)}` -} diff --git a/src/utils/profileSocialLinks.ts b/src/utils/profileSocialLinks.ts new file mode 100644 index 00000000..bc0f3e7a --- /dev/null +++ b/src/utils/profileSocialLinks.ts @@ -0,0 +1,51 @@ +type Link = { + link: string + isPlaceholder: boolean + name?: string +} + +const links: Link[] = [ + { link: 'https://facebook.com/', name: 'facebook', isPlaceholder: true }, + { link: 'https://linkedin.com/', name: 'linkedin', isPlaceholder: true }, + { link: 'https://vk.com/', name: 'vk', isPlaceholder: true }, + { link: 'https://instagram.com/', name: 'instagram', isPlaceholder: true }, + { link: 'https://t.me/', name: 'telegram', isPlaceholder: true }, + { link: 'https://twitter.com/', name: 'twitter', isPlaceholder: true } +] + +const checkLink = (link: string, keyword: string): boolean => link.includes(keyword) + +export const profileSocialLinks = (socialLinks: string[]): Link[] => { + const processedLinks: Link[] = [] + let unmatchedLinks: string[] = [...socialLinks] + + links.forEach((linkObj) => { + let linkMatched = false + + socialLinks.forEach((serverLink) => { + if (checkLink(serverLink, new URL(linkObj.link).hostname.replace('www.', ''))) { + processedLinks.push({ ...linkObj, link: serverLink, isPlaceholder: false }) + linkMatched = true + unmatchedLinks = unmatchedLinks.filter((unmatchedLink) => unmatchedLink !== serverLink) + } + }) + + if (!linkMatched) { + processedLinks.push({ ...linkObj, isPlaceholder: true }) + } + }) + + unmatchedLinks.forEach((unmatchedLink) => { + processedLinks.push({ link: unmatchedLink, isPlaceholder: false }) + }) + + return processedLinks.sort((a, b) => { + if (a.isPlaceholder && !b.isPlaceholder) { + return 1 + } else if (!a.isPlaceholder && b.isPlaceholder) { + return -1 + } else { + return 0 + } + }) +} diff --git a/src/utils/renderUploadedImage.ts b/src/utils/renderUploadedImage.ts index 40b95f14..e4e61279 100644 --- a/src/utils/renderUploadedImage.ts +++ b/src/utils/renderUploadedImage.ts @@ -1,5 +1,4 @@ import { UploadedFile } from '../pages/types' -import { imageProxy } from './imageProxy' import { hideModal } from '../stores/ui' import { Editor } from '@tiptap/core' @@ -22,7 +21,7 @@ export const renderUploadedImage = (editor: Editor, image: UploadedFile) => { { type: 'image', attrs: { - src: imageProxy(image.url) + src: image.url } } ] diff --git a/vite.config.ts b/vite.config.ts index 057c48e5..704d858d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'vite' import solidPlugin from 'vite-plugin-solid' -import ssrPlugin from 'vite-plugin-ssr/plugin' +import ssrPlugin from 'vike/plugin' import sassDts from 'vite-plugin-sass-dts' import mkcert from 'vite-plugin-mkcert'