diff --git a/.eslintignore b/.eslintignore index 338ea90a..9261a192 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,6 +1,7 @@ node_modules public *.cjs -src/graphql/schema/*.gen.ts dist/ .vercel/ +src/graphql/client/* +src/graphql/schema/* diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 7dfc69c2..bb2138ff 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,106 +1,109 @@ module.exports = { - plugins: ["@typescript-eslint", "import", "sonarjs", "unicorn", "promise", "solid", "jest"], + plugins: ['@typescript-eslint', 'import', 'sonarjs', 'unicorn', 'promise', 'solid', 'jest'], extends: [ - "eslint:recommended", - "plugin:import/recommended", - "plugin:import/typescript", - "prettier", - "plugin:sonarjs/recommended", - "plugin:unicorn/recommended", - "plugin:promise/recommended", - "plugin:solid/recommended", - "plugin:jest/recommended" + 'eslint:recommended', + 'plugin:import/recommended', + 'plugin:import/typescript', + 'prettier', + 'plugin:sonarjs/recommended', + 'plugin:unicorn/recommended', + 'plugin:promise/recommended', + 'plugin:solid/recommended', + 'plugin:jest/recommended', ], overrides: [ { - files: ["**/*.ts", "**/*.tsx"], - parser: "@typescript-eslint/parser", + files: ['**/*.ts', '**/*.tsx'], + parser: '@typescript-eslint/parser', parserOptions: { ecmaVersion: 2021, ecmaFeatures: { jsx: true }, - sourceType: "module", - project: "./tsconfig.json" + sourceType: 'module', + project: './tsconfig.json', }, extends: [ - "plugin:@typescript-eslint/recommended" - // Maybe one day... - // 'plugin:@typescript-eslint/recommended-requiring-type-checking' + 'plugin:@typescript-eslint/recommended', + // 'plugin:@typescript-eslint/recommended-requiring-type-checking', // 30-01-2024 699 problems ], rules: { - "@typescript-eslint/no-unused-vars": [ - "warn", + '@typescript-eslint/no-unused-vars': [ + 'warn', { - argsIgnorePattern: "^_" - } + argsIgnorePattern: '^_', + }, ], - "@typescript-eslint/no-non-null-assertion": "error", - // TODO: Remove any usage and enable - "@typescript-eslint/no-explicit-any": "off" - } - } + '@typescript-eslint/no-non-null-assertion': 'error', + '@typescript-eslint/no-explicit-any': 'warn', + }, + }, ], env: { browser: true, node: true, - mocha: true + // mocha: true, }, globals: {}, rules: { // Solid - "solid/reactivity": "off", // FIXME - "solid/no-innerhtml": "off", + 'solid/reactivity': 'off', + 'solid/no-innerhtml': 'off', /** Unicorn **/ - "unicorn/no-null": "off", - "unicorn/filename-case": "off", - "unicorn/no-array-for-each": "off", - "unicorn/no-array-reduce": "off", - "unicorn/prefer-string-replace-all": "warn", - "unicorn/prevent-abbreviations": "off", - "unicorn/prefer-module": "off", - "unicorn/import-style": "off", - "unicorn/numeric-separators-style": "off", - "unicorn/prefer-node-protocol": "off", - "unicorn/prefer-dom-node-append": "off", // FIXME - "unicorn/prefer-top-level-await": "warn", - "unicorn/consistent-function-scoping": "warn", - "unicorn/no-array-callback-reference": "warn", - "unicorn/no-array-method-this-argument": "warn", - "unicorn/no-for-loop": "off", + 'unicorn/no-null': 'off', + 'unicorn/filename-case': 'off', + 'unicorn/no-array-for-each': 'off', + 'unicorn/no-array-reduce': 'off', + 'unicorn/prefer-string-replace-all': 'warn', + 'unicorn/prevent-abbreviations': 'off', + 'unicorn/prefer-module': 'off', + 'unicorn/import-style': 'off', + 'unicorn/numeric-separators-style': 'off', + 'unicorn/prefer-node-protocol': 'off', + 'unicorn/prefer-dom-node-append': 'warn', + 'unicorn/prefer-top-level-await': 'warn', + 'unicorn/consistent-function-scoping': 'warn', + 'unicorn/no-array-callback-reference': 'warn', + 'unicorn/no-array-method-this-argument': 'warn', + 'unicorn/no-for-loop': 'off', + 'unicorn/prefer-switch': 'warn', - "sonarjs/no-duplicate-string": ["warn", { threshold: 5 }], + 'sonarjs/no-duplicate-string': ['warn', { threshold: 5 }], + 'sonarjs/prefer-immediate-return': 'warn', // Promise - // 'promise/catch-or-return': 'off', // Should be enabled - "promise/always-return": "off", + 'promise/catch-or-return': 'off', + 'promise/always-return': 'off', - eqeqeq: "error", - "no-param-reassign": "error", - "no-nested-ternary": "error", - "no-shadow": "error", + eqeqeq: 'error', + 'no-param-reassign': 'error', + 'no-nested-ternary': 'error', + 'no-shadow': 'error', - "import/order": ["warn", { - groups: ["type", "builtin", "external", "internal", "parent", "sibling", "index"], - distinctGroup: false, - pathGroups: [ - { - pattern: "*.scss", - patternOptions: { matchBase: true }, - group: "index", - position: "after" - } - ], - "newlines-between": "always", - alphabetize: { - order: "asc", - caseInsensitive: true - } - }] + 'import/order': [ + 'warn', + { + groups: ['type', 'builtin', 'external', 'internal', 'parent', 'sibling', 'index'], + distinctGroup: false, + pathGroups: [ + { + pattern: '*.scss', + patternOptions: { matchBase: true }, + group: 'index', + position: 'after', + }, + ], + 'newlines-between': 'always', + alphabetize: { + order: 'asc', + caseInsensitive: true, + }, + }, + ], }, settings: { - "import/resolver": { + 'import/resolver': { typescript: true, - node: true - } - } -}; + node: true, + }, + }, +} diff --git a/.gitignore b/.gitignore index e36653bf..c1695636 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ stats.html *.scss.d.ts pnpm-lock.yaml bun.lockb +.jj diff --git a/.stylelintrc b/.stylelintrc index 6630d052..5923b87b 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -7,6 +7,8 @@ "stylelint-scss" ], "rules": { + "keyframes-name-pattern": null, + "declaration-block-no-redundant-longhand-properties": null, "selector-class-pattern": null, "no-descending-specificity": null, "scss/function-no-unknown": null, diff --git a/package-lock.json b/package-lock.json index 424ab0fe..a56a55f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,13 +10,16 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@authorizerdev/authorizer-js": "1.2.11", - "ackee-tracker": "5.1.0", + "@authorizerdev/authorizer-js": "2.0.0", + "@solid-primitives/pagination": "0.2.10", + "cropperjs": "1.6.1", "form-data": "4.0.0", + "ga-gtag": "1.2.0", "i18next": "22.4.15", "i18next-icu": "2.3.0", "idb": "7.1.1", "intl-messageformat": "10.5.3", + "just-throttle": "4.2.0", "mailgun.js": "8.2.1" }, "devDependencies": { @@ -127,7 +130,7 @@ "typograf": "7.1.0", "uniqolor": "1.1.0", "vike": "0.4.148", - "vite": "4.5.1", + "vite": "4.5.2", "vite-plugin-mkcert": "1.16.0", "vite-plugin-sass-dts": "1.3.11", "vite-plugin-solid": "2.7.2", @@ -384,9 +387,9 @@ } }, "node_modules/@authorizerdev/authorizer-js": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@authorizerdev/authorizer-js/-/authorizer-js-1.2.11.tgz", - "integrity": "sha512-onATswFYM0QCmhFPJmjS+S7Z0GNqlekqkDdFK6Bj3OeMBDQufARRHmVIGVI+0IlB7TWW38D1l6WbTZin0ct+aA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@authorizerdev/authorizer-js/-/authorizer-js-2.0.0.tgz", + "integrity": "sha512-PTVuCrCkZkVPoo+l0+9PVFyP9frLp/L3FUtQDtAaN+ERuqx97DNF20tIH8khSvnXrkKv3lTJ/5iFWddy+dTAwg==", "dependencies": { "cross-fetch": "^3.1.5" }, @@ -398,12 +401,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -411,9 +414,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -450,12 +453,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "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.6", + "@babel/types": "^7.23.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -477,14 +480,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -493,17 +496,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", - "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -667,9 +670,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -685,32 +688,32 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", @@ -722,9 +725,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "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" @@ -1049,9 +1052,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz", + "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1064,15 +1067,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", @@ -1133,13 +1137,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1274,16 +1277,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", + "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1339,13 +1342,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.3.tgz", + "integrity": "sha512-ogV0yWnq38CFwH20l2Afz0dfKuZBx9o/Y2Rmh5vuSS0YD1hswgEgTfyTzuSrT2q9btmHRSqYoSfwFUVaC1M1Jw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.23.3" }, @@ -1376,9 +1379,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1401,20 +1404,20 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "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.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.22.13", + "@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.6", - "@babel/types": "^7.23.6", - "debug": "^4.3.1", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", "globals": "^11.1.0" }, "engines": { @@ -1422,12 +1425,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "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.23.4", + "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -1466,18 +1469,18 @@ "dev": true }, "node_modules/@brillout/vite-plugin-import-build": { - "version": "0.2.22", - "resolved": "https://registry.npmjs.org/@brillout/vite-plugin-import-build/-/vite-plugin-import-build-0.2.22.tgz", - "integrity": "sha512-n5sv0HdCB5WC2QJSnTN6iS/F+sJsF0AmtsCCaQ+5+dRjgsoGGsa3auinJV8tuEog5WsX+3MF8RIwn3A/u0e04w==", + "version": "0.2.20", + "resolved": "https://registry.npmjs.org/@brillout/vite-plugin-import-build/-/vite-plugin-import-build-0.2.20.tgz", + "integrity": "sha512-/bdw1dg+H1nOYSy2PzYInQoZlIFP2uwyaF2GX64fyBqVAEWGopiMlnx294CbysjmP9Z+fJe48TkMzyogkyIDLw==", "dev": true, "dependencies": { "@brillout/import": "^0.2.3" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.5.0.tgz", - "integrity": "sha512-abypo6m9re3clXA00eu5syw+oaPHbJTPapu9C4pzNsJ4hdZDzushT50Zhu+iIYXgEe1CxnRMn7ngsbV+MLrlpQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz", + "integrity": "sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==", "dev": true, "funding": [ { @@ -1493,13 +1496,13 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-tokenizer": "^2.2.1" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.3.tgz", - "integrity": "sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz", + "integrity": "sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg==", "dev": true, "funding": [ { @@ -1516,9 +1519,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.7.tgz", - "integrity": "sha512-lHPKJDkPUECsyAvD60joYfDmp8UERYxHGkFfyLJFTVK/ERJe0sVlIFLXU5XFxdjNDTerp5L4KeaKG+Z5S94qxQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz", + "integrity": "sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==", "dev": true, "funding": [ { @@ -1534,14 +1537,14 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.5.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^2.3.2", + "@csstools/css-tokenizer": "^2.2.1" } }, "node_modules/@csstools/selector-specificity": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz", - "integrity": "sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", + "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", "dev": true, "funding": [ { @@ -1560,358 +1563,6 @@ "postcss-selector-parser": "^6.0.13" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -1937,9 +1588,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "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", @@ -1960,9 +1611,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2174,16 +1825,16 @@ } }, "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/executor-legacy-ws": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.5.tgz", - "integrity": "sha512-w54AZ7zkNuvpyV09FH+eGHnnAmaxhBVHg4Yh2ICcsMfRg0brkLt77PlbjBuxZ4HY8XZnKJaYWf+tKazQZtkQtg==", + "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", + "isomorphic-ws": "5.0.0", "tslib": "^2.4.0", - "ws": "^8.15.0" + "ws": "8.14.2" }, "engines": { "node": ">=16.0.0" @@ -2193,15 +1844,15 @@ } }, "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/url-loader": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.1.tgz", - "integrity": "sha512-B2k8KQEkEQmfV1zhurT5GLoXo8jbXP+YQHUayhCSxKYlRV7j/1Fhp1b21PDM8LXIDGlDRXaZ0FbWKOs7eYXDuQ==", + "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.5", + "@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", @@ -2220,9 +1871,9 @@ } }, "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/fetch": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.15.tgz", - "integrity": "sha512-2wIUcolUthZt0nsPRj+pT7K9h/EO3t/j09IBuq0FtITCsASc2fRCmRw2JHS6hk9fzUQrz2+YYrA1ZDpV7+vLsQ==", + "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", @@ -2261,15 +1912,15 @@ } }, "node_modules/@graphql-codegen/cli/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.3.tgz", - "integrity": "sha512-toMC8N53RxgprcuU7Fc05KOrJhZV49njJCHPZvXBsjZMQBKrDm9o14Y56CsrUC85cvjQu862MaYOjd8rKgHdDw==", + "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": { - "@kamilkisiela/fast-url-parser": "^1.1.4", "@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": { @@ -2326,9 +1977,9 @@ "dev": true }, "node_modules/@graphql-codegen/cli/node_modules/graphql-ws": { - "version": "5.14.3", - "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.14.3.tgz", - "integrity": "sha512-F/i2xNIVbaEF2xWggID0X/UZQa2V8kqKDPO8hwmu53bVOcTL7uNkxnexeEgSCVxYBQUTUNEI8+e4LO1FOhKPKQ==", + "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" @@ -2755,9 +2406,9 @@ } }, "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/fetch": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.15.tgz", - "integrity": "sha512-2wIUcolUthZt0nsPRj+pT7K9h/EO3t/j09IBuq0FtITCsASc2fRCmRw2JHS6hk9fzUQrz2+YYrA1ZDpV7+vLsQ==", + "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", @@ -2768,15 +2419,15 @@ } }, "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.3.tgz", - "integrity": "sha512-toMC8N53RxgprcuU7Fc05KOrJhZV49njJCHPZvXBsjZMQBKrDm9o14Y56CsrUC85cvjQu862MaYOjd8rKgHdDw==", + "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": { - "@kamilkisiela/fast-url-parser": "^1.1.4", "@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": { @@ -2970,9 +2621,9 @@ } }, "node_modules/@graphql-tools/executor-http": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.0.7.tgz", - "integrity": "sha512-/MoRYzQS50Tz5mxRfq3ZmeZ2SOins9wGZAGetsJ55F3PxL0PmHdSGlCq12KzffZDbwHV5YMlwigBsSGWq4y9Iw==", + "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", @@ -3000,9 +2651,9 @@ } }, "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/fetch": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.15.tgz", - "integrity": "sha512-2wIUcolUthZt0nsPRj+pT7K9h/EO3t/j09IBuq0FtITCsASc2fRCmRw2JHS6hk9fzUQrz2+YYrA1ZDpV7+vLsQ==", + "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", @@ -3013,15 +2664,15 @@ } }, "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.3.tgz", - "integrity": "sha512-toMC8N53RxgprcuU7Fc05KOrJhZV49njJCHPZvXBsjZMQBKrDm9o14Y56CsrUC85cvjQu862MaYOjd8rKgHdDw==", + "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": { - "@kamilkisiela/fast-url-parser": "^1.1.4", "@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": { @@ -3148,9 +2799,9 @@ } }, "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/fetch": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.15.tgz", - "integrity": "sha512-2wIUcolUthZt0nsPRj+pT7K9h/EO3t/j09IBuq0FtITCsASc2fRCmRw2JHS6hk9fzUQrz2+YYrA1ZDpV7+vLsQ==", + "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", @@ -3161,15 +2812,15 @@ } }, "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.3.tgz", - "integrity": "sha512-toMC8N53RxgprcuU7Fc05KOrJhZV49njJCHPZvXBsjZMQBKrDm9o14Y56CsrUC85cvjQu862MaYOjd8rKgHdDw==", + "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": { - "@kamilkisiela/fast-url-parser": "^1.1.4", "@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": { @@ -3258,13 +2909,13 @@ } }, "node_modules/@graphql-tools/load": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.0.1.tgz", - "integrity": "sha512-qSMsKngJhDqRbuWyo3NvakEFqFL6+eSjy8ooJ1o5qYD26N7dqXkKzIMycQsX7rBK19hOuINAUSaRcVWH6hTccw==", + "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": "^10.0.0", - "@graphql-tools/utils": "^10.0.11", + "@graphql-tools/utils": "^10.0.0", "p-limit": "3.1.0", "tslib": "^2.4.0" }, @@ -3276,12 +2927,12 @@ } }, "node_modules/@graphql-tools/merge": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.1.tgz", - "integrity": "sha512-hIEExWO9fjA6vzsVjJ3s0cCQ+Q/BEeMVJZtMXd7nbaVefVy0YDyYlEkeoYYNV3NVVvu1G9lr6DM1Qd0DGo9Caw==", + "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.10", + "@graphql-tools/utils": "^10.0.0", "tslib": "^2.4.0" }, "engines": { @@ -3416,16 +3067,16 @@ } }, "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/executor-legacy-ws": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.5.tgz", - "integrity": "sha512-w54AZ7zkNuvpyV09FH+eGHnnAmaxhBVHg4Yh2ICcsMfRg0brkLt77PlbjBuxZ4HY8XZnKJaYWf+tKazQZtkQtg==", + "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", + "isomorphic-ws": "5.0.0", "tslib": "^2.4.0", - "ws": "^8.15.0" + "ws": "8.14.2" }, "engines": { "node": ">=16.0.0" @@ -3435,15 +3086,15 @@ } }, "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/url-loader": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.1.tgz", - "integrity": "sha512-B2k8KQEkEQmfV1zhurT5GLoXo8jbXP+YQHUayhCSxKYlRV7j/1Fhp1b21PDM8LXIDGlDRXaZ0FbWKOs7eYXDuQ==", + "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.5", + "@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", @@ -3490,9 +3141,9 @@ } }, "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/fetch": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.15.tgz", - "integrity": "sha512-2wIUcolUthZt0nsPRj+pT7K9h/EO3t/j09IBuq0FtITCsASc2fRCmRw2JHS6hk9fzUQrz2+YYrA1ZDpV7+vLsQ==", + "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", @@ -3503,15 +3154,15 @@ } }, "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.3.tgz", - "integrity": "sha512-toMC8N53RxgprcuU7Fc05KOrJhZV49njJCHPZvXBsjZMQBKrDm9o14Y56CsrUC85cvjQu862MaYOjd8rKgHdDw==", + "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": { - "@kamilkisiela/fast-url-parser": "^1.1.4", "@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": { @@ -3568,9 +3219,9 @@ "dev": true }, "node_modules/@graphql-tools/prisma-loader/node_modules/graphql-ws": { - "version": "5.14.3", - "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.14.3.tgz", - "integrity": "sha512-F/i2xNIVbaEF2xWggID0X/UZQa2V8kqKDPO8hwmu53bVOcTL7uNkxnexeEgSCVxYBQUTUNEI8+e4LO1FOhKPKQ==", + "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" @@ -3624,13 +3275,13 @@ } }, "node_modules/@graphql-tools/schema": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.2.tgz", - "integrity": "sha512-TbPsIZnWyDCLhgPGnDjt4hosiNU2mF/rNtSk5BVaXWnZqvKJ6gzJV4fcHcvhRIwtscDMW2/YTnK6dLVnk8pc4w==", + "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.1", - "@graphql-tools/utils": "^10.0.10", + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/utils": "^10.0.0", "tslib": "^2.4.0", "value-or-promise": "^1.0.12" }, @@ -3698,9 +3349,9 @@ } }, "node_modules/@graphql-tools/utils": { - "version": "10.0.12", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.12.tgz", - "integrity": "sha512-+yS1qlFwXlwU3Gv8ek/h2aJ95quog4yF22haC11M0zReMSTddbGJZ5yXKkE3sXoY2BcL1utilSFjylJ9uXpSNQ==", + "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", @@ -3782,12 +3433,12 @@ } }, "node_modules/@hocuspocus/common": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-2.9.0.tgz", - "integrity": "sha512-VHqxf1Qov4PULmoevRV4hEyxfEGNtdCMDQTU0C1C6ZR6ImDAqnpuzzcxH5ppkZZiiSZwDWxMxxegFt2e3alDEA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-2.7.1.tgz", + "integrity": "sha512-mnwBn7b2g23rUmYA1+X+FrIwU9aODmRMWe7ypQdjL/MgzlZWrwqFFr0b9u4AhBrwqRTg+L8KCp8SDkpkt2OTtQ==", "dev": true, "dependencies": { - "lib0": "^0.2.87" + "lib0": "^0.2.47" } }, "node_modules/@hocuspocus/provider": { @@ -3828,13 +3479,13 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "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": "^2.0.2", - "debug": "^4.3.1", + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", "minimatch": "^3.0.5" }, "engines": { @@ -3855,9 +3506,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "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": { @@ -4635,12 +4286,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@kamilkisiela/fast-url-parser": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@kamilkisiela/fast-url-parser/-/fast-url-parser-1.1.4.tgz", - "integrity": "sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==", - "dev": true - }, "node_modules/@lifeomic/attempt": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@lifeomic/attempt/-/attempt-3.0.3.tgz", @@ -5033,9 +4678,9 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.24", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", - "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", + "version": "1.0.0-next.23", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", + "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", "dev": true }, "node_modules/@popperjs/core": { @@ -5287,6 +4932,17 @@ "solid-js": "^1.6.12" } }, + "node_modules/@solid-primitives/pagination": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@solid-primitives/pagination/-/pagination-0.2.10.tgz", + "integrity": "sha512-HVRW8NgNkjB2PPg4f4E4ava+PI6AO8INQpsARylzQcxeBW+RMY5bYJoSIQ2QSp+hHiJhNlYozdBdLUY39Vxtxg==", + "dependencies": { + "@solid-primitives/utils": "^6.2.2" + }, + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, "node_modules/@solid-primitives/refs": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@solid-primitives/refs/-/refs-1.0.5.tgz", @@ -5384,10 +5040,9 @@ } }, "node_modules/@solid-primitives/utils": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-6.2.1.tgz", - "integrity": "sha512-TsecNzxiO5bLfzqb4OOuzfUmdOROcssuGqgh5rXMMaasoFZ3GoveUgdY1wcf17frMJM7kCNGNuK34EjErneZkg==", - "dev": true, + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-6.2.2.tgz", + "integrity": "sha512-11ypVbp987XxETeRqY5Y3OmmTpm8/jZqJXRvo6AyqBthzkvvjEdReuUMU2yVb+pwWGxfZpWHZ6EUCcGXUMhfwg==", "peerDependencies": { "solid-js": "^1.6.12" } @@ -5810,9 +5465,9 @@ } }, "node_modules/@tiptap/pm": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.1.16.tgz", - "integrity": "sha512-yibLkjtgbBSnWCXbDyKM5kgIGLfMvfbRfFzb8T0uz4PI/L54o0a4fiWSW5Fg10B5+o+NAXW2wMxoId8/Tw91lQ==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.1.12.tgz", + "integrity": "sha512-Q3MXXQABG4CZBesSp82yV84uhJh/W0Gag6KPm2HRWPimSFELM09Z9/5WK9RItAYE0aLhe4Krnyiczn9AAa1tQQ==", "dev": true, "peer": true, "dependencies": { @@ -5841,9 +5496,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -5854,9 +5509,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" @@ -5873,9 +5528,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -5978,9 +5633,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "dev": true }, "node_modules/@types/stack-utils": { @@ -5996,18 +5651,18 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", + "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", + "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -6379,18 +6034,10 @@ "tslib": "^2.3.1" } }, - "node_modules/ackee-tracker": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ackee-tracker/-/ackee-tracker-5.1.0.tgz", - "integrity": "sha512-A7iKkGyUnEXuOzxultQB7hnm4bStYCo1c38MYRRihBfqUP8AImhtZOODb00t9xrXs/BTsg06bz1MKpXeMs9sYw==", - "dependencies": { - "platform": "^1.3.6" - } - }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -6737,11 +6384,11 @@ } }, "node_modules/axios": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", - "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.0", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -6850,7 +6497,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/babel-merge/-/babel-merge-3.0.0.tgz", "integrity": "sha512-eBOBtHnzt9xvnjpYNI5HmaPp/b2vMveE5XggzqHnQeHJ8mFIBrBv6WZEVIj5jJ2uwTItkqKo9gWzEEcBxEq0yw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "dependencies": { "deepmerge": "^2.2.1", @@ -6917,9 +6563,9 @@ } }, "node_modules/babel-plugin-jsx-dom-expressions": { - "version": "0.37.13", - "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.37.13.tgz", - "integrity": "sha512-oAEMMIgU0h1DmHn4ZDaBBFc08nsVJciLq9pF7g0ZdpeIDKfY4zXjXr8+/oBjKhXG8nyomhnTodPjeG+/ZXcWXQ==", + "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", @@ -7138,9 +6784,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -7157,9 +6803,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -7377,9 +7023,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001576", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", - "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", + "version": "1.0.30001562", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001562.tgz", + "integrity": "sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng==", "dev": true, "funding": [ { @@ -7586,9 +7232,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", + "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", "dev": true, "engines": { "node": ">=6" @@ -7932,6 +7578,11 @@ "dev": true, "peer": true }, + "node_modules/cropperjs": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/cropperjs/-/cropperjs-1.6.1.tgz", + "integrity": "sha512-F4wsi+XkDHCOMrHMYjrTEE4QBOrsHHN5/2VsVAaRq8P7E5z7xQpT75S+f/9WikmBEailas3+yo+6zPIomW+NOA==" + }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -8019,10 +7670,9 @@ } }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -8337,9 +7987,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.628", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.628.tgz", - "integrity": "sha512-2k7t5PHvLsufpP6Zwk0nof62yLOsCf032wZx7/q0mv8gwlXjhcxI3lz6f0jBr0GrnWKcm3burXzI3t5IrcdUxw==", + "version": "1.4.582", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.582.tgz", + "integrity": "sha512-89o0MGoocwYbzqUUjc+VNpeOFSOK9nIdC5wY4N+PVUarUK0MtjyTjks75AZS2bW4Kl8MdewdFsWaH0jLy+JNoA==", "dev": true }, "node_modules/emittery": { @@ -8387,9 +8037,9 @@ } }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", "dev": true, "peer": true, "engines": { @@ -8639,22 +8289,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-compat-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", - "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -8758,14 +8396,13 @@ } }, "node_modules/eslint-plugin-es-x": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", - "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.3.0.tgz", + "integrity": "sha512-W9zIs+k00I/I13+Bdkl/zG1MEO07G97XjUSQuH117w620SJ6bHtLUmoMvkGA2oYnI/gNdr+G7BONLyYnFaLLEQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.6.0", - "eslint-compat-utils": "^0.1.2" + "@eslint-community/regexpp": "^4.6.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -9040,16 +8677,15 @@ } }, "node_modules/eslint-plugin-n": { - "version": "16.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", - "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.3.1.tgz", + "integrity": "sha512-w46eDIkxQ2FaTHcey7G40eD+FhTXOdKudDXPUO2n9WNcslze/i/HT2qJ3GXjHngYSGDISIgPNhwGtgoix4zeOw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.5.0", + "eslint-plugin-es-x": "^7.1.0", "get-tsconfig": "^4.7.0", - "globals": "^13.24.0", "ignore": "^5.2.4", "is-builtin-module": "^3.2.1", "is-core-module": "^2.12.1", @@ -9067,21 +8703,6 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-plugin-n/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint-plugin-n/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -9109,18 +8730,6 @@ "node": ">=10" } }, - "node_modules/eslint-plugin-n/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint-plugin-n/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -9359,9 +8968,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -9638,9 +9247,9 @@ } }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -9782,9 +9391,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -9923,6 +9532,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ga-gtag": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ga-gtag/-/ga-gtag-1.2.0.tgz", + "integrity": "sha512-j9gxutMdpGMdwaX1SzOG31Ddm+IGFjeNf+N3Z5g+BBpS8FSXOALlrM+ORIGc/QKszGJEDlw+6PfIsJZICsqsGQ==" + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -10294,16 +9908,16 @@ } }, "node_modules/graphql-config/node_modules/@graphql-tools/executor-legacy-ws": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.5.tgz", - "integrity": "sha512-w54AZ7zkNuvpyV09FH+eGHnnAmaxhBVHg4Yh2ICcsMfRg0brkLt77PlbjBuxZ4HY8XZnKJaYWf+tKazQZtkQtg==", + "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", + "isomorphic-ws": "5.0.0", "tslib": "^2.4.0", - "ws": "^8.15.0" + "ws": "8.14.2" }, "engines": { "node": ">=16.0.0" @@ -10313,15 +9927,15 @@ } }, "node_modules/graphql-config/node_modules/@graphql-tools/url-loader": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.1.tgz", - "integrity": "sha512-B2k8KQEkEQmfV1zhurT5GLoXo8jbXP+YQHUayhCSxKYlRV7j/1Fhp1b21PDM8LXIDGlDRXaZ0FbWKOs7eYXDuQ==", + "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.5", + "@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", @@ -10368,9 +9982,9 @@ } }, "node_modules/graphql-config/node_modules/@whatwg-node/fetch": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.15.tgz", - "integrity": "sha512-2wIUcolUthZt0nsPRj+pT7K9h/EO3t/j09IBuq0FtITCsASc2fRCmRw2JHS6hk9fzUQrz2+YYrA1ZDpV7+vLsQ==", + "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", @@ -10381,15 +9995,15 @@ } }, "node_modules/graphql-config/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.3.tgz", - "integrity": "sha512-toMC8N53RxgprcuU7Fc05KOrJhZV49njJCHPZvXBsjZMQBKrDm9o14Y56CsrUC85cvjQu862MaYOjd8rKgHdDw==", + "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": { - "@kamilkisiela/fast-url-parser": "^1.1.4", "@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": { @@ -10397,9 +10011,9 @@ } }, "node_modules/graphql-config/node_modules/graphql-ws": { - "version": "5.14.3", - "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.14.3.tgz", - "integrity": "sha512-F/i2xNIVbaEF2xWggID0X/UZQa2V8kqKDPO8hwmu53bVOcTL7uNkxnexeEgSCVxYBQUTUNEI8+e4LO1FOhKPKQ==", + "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" @@ -11063,9 +10677,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -13721,9 +13335,9 @@ } }, "node_modules/jose": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.0.tgz", - "integrity": "sha512-oW3PCnvyrcm1HMvGTzqjxxfnEs9EoFOFWi2HsEGhlFVOXxTE3K9GKWVMFoFw06yPUqwpvEWic1BmtUZBI/tIjw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.1.1.tgz", + "integrity": "sha512-bfB+lNxowY49LfrBO0ITUn93JbUhxUN8I11K6oI5hJu/G6PO6fEUddVLjqdD0cQ9SXIHWXuWh7eJYwZF7Z0N/g==", "dev": true, "funding": { "url": "https://github.com/sponsors/panva" @@ -13883,6 +13497,11 @@ "node": ">=4.0" } }, + "node_modules/just-throttle": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/just-throttle/-/just-throttle-4.2.0.tgz", + "integrity": "sha512-/iAZv1953JcExpvsywaPKjSzfTiCLqeguUTE6+VmK15mOcwxBx7/FHrVvS4WEErMR03TRazH8kcBSHqMagYIYg==" + }, "node_modules/kebab-case": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/kebab-case/-/kebab-case-1.0.2.tgz", @@ -13963,9 +13582,9 @@ } }, "node_modules/lib0": { - "version": "0.2.88", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.88.tgz", - "integrity": "sha512-KyroiEvCeZcZEMx5Ys+b4u4eEBbA1ch7XUaBhYpwa/nPMrzTjUhI4RfcytmQfYoTBPcdyx+FX6WFNIoNuJzJfQ==", + "version": "0.2.87", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.87.tgz", + "integrity": "sha512-TbB63XJixvNToW2IHWAFsCJj9tVnajmwjE14p69i51Rx8byOQd2IP4ourE8v4d7vhyO++nVm1sQk3ePslfbucg==", "dev": true, "dependencies": { "isomorphic.js": "^0.2.4" @@ -13998,19 +13617,19 @@ "dev": true }, "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", "dev": true, "peer": true, "dependencies": { - "uc.micro": "^2.0.0" + "uc.micro": "^1.0.1" } }, "node_modules/linkifyjs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz", - "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.2.tgz", + "integrity": "sha512-1elJrH8MwUgr77Rgmx4JgB/nBgISYVoGossH6pAfCeHG+07TblTn6RWKx0MKozEMJU6NCFYHRih9M8ZtV3YZ+Q==", "dev": true }, "node_modules/lint-staged": { @@ -14239,9 +13858,9 @@ } }, "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -14909,21 +14528,20 @@ } }, "node_modules/markdown-it": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.0.0.tgz", - "integrity": "sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", + "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", "dev": true, "peer": true, "dependencies": { "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.0.0" + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" }, "bin": { - "markdown-it": "bin/markdown-it.mjs" + "markdown-it": "bin/markdown-it.js" } }, "node_modules/mathml-tag-names": { @@ -14943,9 +14561,9 @@ "dev": true }, "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", "dev": true, "peer": true }, @@ -15233,9 +14851,9 @@ } }, "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "dev": true, "engines": { "node": ">=10" @@ -15328,9 +14946,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/normalize-package-data": { @@ -15409,13 +15027,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -15953,11 +15571,6 @@ "node": ">=8" } }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" - }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -15968,9 +15581,9 @@ } }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -15987,7 +15600,7 @@ } ], "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -16069,9 +15682,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -16260,9 +15873,9 @@ } }, "node_modules/prosemirror-inputrules": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.3.0.tgz", - "integrity": "sha512-z1GRP2vhh5CihYMQYsJSa1cOwXb3SYxALXOIfAkX8nZserARtl9LiL+CEl+T+OFIsXc3mJIHKhbsmRzC0HDAXA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.2.1.tgz", + "integrity": "sha512-3LrWJX1+ULRh5SZvbIQlwZafOXqp1XuV21MGBu/i5xsztd+9VD15x6OtN6mdqSFI7/8Y77gYUbQ6vwwJ4mr6QQ==", "dev": true, "peer": true, "dependencies": { @@ -16282,13 +15895,13 @@ } }, "node_modules/prosemirror-markdown": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.12.0.tgz", - "integrity": "sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.11.2.tgz", + "integrity": "sha512-Eu5g4WPiCdqDTGhdSsG9N6ZjACQRYrsAkrF9KYfdMaCmjIApH75aVncsWYOJvEk2i1B3i8jZppv3J/tnuHGiUQ==", "dev": true, "peer": true, "dependencies": { - "markdown-it": "^14.0.0", + "markdown-it": "^13.0.1", "prosemirror-model": "^1.0.0" } }, @@ -16306,9 +15919,9 @@ } }, "node_modules/prosemirror-model": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.4.tgz", - "integrity": "sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ==", + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.3.tgz", + "integrity": "sha512-tgSnwN7BS7/UM0sSARcW+IQryx2vODKX4MI7xpqY2X+iaepJdKBPc7I4aACIsDV/LTaTjt12Z56MhDr9LsyuZQ==", "dev": true, "dependencies": { "orderedmap": "^2.0.0" @@ -16348,9 +15961,9 @@ } }, "node_modules/prosemirror-tables": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.3.5.tgz", - "integrity": "sha512-JSZ2cCNlApu/ObAhdPyotrjBe2cimniniTpz60YXzbL0kZ+47nEYk2LWbfKU2lKpBkUNquta2PjteoNi4YCluQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.3.4.tgz", + "integrity": "sha512-z6uLSQ1BLC3rgbGwZmpfb+xkdvD7W/UOsURDfognZFYaTtc0gsk7u/t71Yijp2eLflVpffMk6X0u0+u+MMDvIw==", "dev": true, "peer": true, "dependencies": { @@ -16421,16 +16034,6 @@ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/pure-rand": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", @@ -16707,9 +16310,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp-ast-analysis": { "version": "0.6.0", @@ -17041,18 +16644,15 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.1.tgz", - "integrity": "sha512-Y5NejJTTliTyY4H7sipGqY+RX5P87i3F7c4Rcepy72nq+mNLhIsD0W4c7kEmduMDQCSqtPsXPlSTsFhh2LQv+g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -17127,7 +16727,6 @@ "version": "0.15.1", "resolved": "https://registry.npmjs.org/seroval/-/seroval-0.15.1.tgz", "integrity": "sha512-OPVtf0qmeC7RW+ScVX+7aOS+xoIM7pWcZ0jOWg2aTZigCydgRB04adfteBRbecZnnrO1WuGQ+C3tLeBBzX2zSQ==", - "dev": true, "engines": { "node": ">=10" } @@ -17230,13 +16829,13 @@ "dev": true }, "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", + "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", "dev": true, "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", "totalist": "^3.0.0" }, "engines": { @@ -17319,7 +16918,6 @@ "version": "1.8.7", "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.8.7.tgz", "integrity": "sha512-9dzrSVieh2zj3SnJ02II6xZkonR6c+j/91b7XZUNcC6xSaldlqjjGh98F1fk5cRJ8ZTkzqF5fPIWDxEOs6QZXA==", - "dev": true, "dependencies": { "csstype": "^3.1.0", "seroval": "^0.15.1" @@ -17933,12 +17531,12 @@ "dev": true }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz", - "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==", + "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": { - "flat-cache": "^3.2.0" + "flat-cache": "^3.1.1" }, "engines": { "node": ">=12.0.0" @@ -18310,9 +17908,9 @@ "dev": true }, "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", @@ -18512,9 +18110,9 @@ } }, "node_modules/uc.micro": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.0.0.tgz", - "integrity": "sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true, "peer": true }, @@ -18677,9 +18275,9 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", + "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", @@ -18761,9 +18359,9 @@ } }, "node_modules/vite": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", - "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz", + "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==", "dev": true, "dependencies": { "esbuild": "^0.18.10", @@ -18870,358 +18468,6 @@ "vite": "^3.0.0 || ^4.0.0" } }, - "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", @@ -19290,9 +18536,9 @@ } }, "node_modules/vue-eslint-parser": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.0.tgz", - "integrity": "sha512-7KsNBb6gHFA75BtneJsoK/dbZ281whUIwFYdQxA68QrCrGMXYzUMbPDHGcOQ0OocIVKrWSKWXZ4mL7tonCXoUw==", + "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.4", @@ -19372,9 +18618,9 @@ } }, "node_modules/web-streams-polyfill": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", - "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", + "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" @@ -19577,9 +18823,9 @@ } }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index e2cd64b3..006bd345 100644 --- a/package.json +++ b/package.json @@ -30,13 +30,16 @@ "typecheck:watch": "tsc --noEmit --watch" }, "dependencies": { - "@authorizerdev/authorizer-js": "1.2.11", - "ackee-tracker": "5.1.0", + "@authorizerdev/authorizer-js": "2.0.0", + "@solid-primitives/pagination": "0.2.10", + "cropperjs": "1.6.1", "form-data": "4.0.0", + "ga-gtag": "1.2.0", "i18next": "22.4.15", "i18next-icu": "2.3.0", "idb": "7.1.1", "intl-messageformat": "10.5.3", + "just-throttle": "4.2.0", "mailgun.js": "8.2.1" }, "devDependencies": { @@ -147,7 +150,7 @@ "typograf": "7.1.0", "uniqolor": "1.1.0", "vike": "0.4.148", - "vite": "4.5.1", + "vite": "4.5.2", "vite-plugin-mkcert": "1.16.0", "vite-plugin-sass-dts": "1.3.11", "vite-plugin-solid": "2.7.2", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index a8bf5807..bdf6d55f 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -105,6 +105,7 @@ "Create gallery": "Create gallery", "Create post": "Create post", "Create video": "Create video", + "Crop image": "Crop image", "Culture": "Culture", "Date of Birth": "Date of Birth", "Decline": "Decline", @@ -203,6 +204,7 @@ "Invalid email": "Check if your email is correct", "Invalid image URL": "Invalid image URL", "Invalid url format": "Invalid url format", + "Invite": "Invite", "Invite co-authors": "Invite co-authors", "Invite collaborators": "Invite collaborators", "Invite to collab": "Invite to Collab", @@ -343,6 +345,7 @@ "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", + "Start dialog": "Start dialog", "Subsccriptions": "Subscriptions", "Subscribe": "Subscribe", "Subscribe to the best publications newsletter": "Subscribe to the best publications newsletter", @@ -381,6 +384,7 @@ "This way you ll be able to subscribe to authors, interesting topics and customize your feed": "This way you ll be able to subscribe to authors, interesting topics and customize your feed", "This week": "This week", "This year": "This year", + "To find publications, art, comments, authors and topics of interest to you, just start typing your query": "To find publications, art, comments, authors and topics of interest to you, just start typing your query", "To leave a comment please": "To leave a comment please", "To write a comment, you must": "To write a comment, you must", "Top authors": "Authors rating", @@ -403,6 +407,7 @@ "Upload userpic": "Upload userpic", "Upload video": "Upload video", "Uploading image": "Uploading image", + "User with this email already exists": "User with this email already exists", "Username": "Username", "Userpic": "Userpic", "Users": "Users", @@ -411,6 +416,7 @@ "Views": "Views", "We are working on collaborative editing of articles and in the near future you will have an amazing opportunity - to create together with your colleagues": "We are working on collaborative editing of articles and in the near future you will have an amazing opportunity - to create together with your colleagues", "We can't find you, check email or": "We can't find you, check email or", + "We couldn't find anything for your request": "We couldn’t find anything for your request", "We know you, please try to login": "This email address is already registered, please try to login", "We've sent you a message with a link to enter our website.": "We've sent you an email with a link to your email. Follow the link in the email to enter our website.", "Welcome to Discours": "Welcome to Discours", diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index 6638d0de..541002ad 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -110,6 +110,7 @@ "Create gallery": "Создать галерею", "Create post": "Создать публикацию", "Create video": "Создать видео", + "Crop image": "Кадрировать изображение", "Culture": "Культура", "Date of Birth": "Дата рождения", "Decline": "Отмена", @@ -213,6 +214,7 @@ "Invalid email": "Проверьте правильность ввода почты", "Invalid image URL": "Некорректная ссылка на изображение", "Invalid url format": "Неверный формат ссылки", + "Invite": "Пригласить", "Invite co-authors": "Пригласить соавторов", "Invite collaborators": "Пригласить соавторов", "Invite experts": "Пригласить экспертов", @@ -364,6 +366,7 @@ "Special projects": "Спецпроекты", "Specify the source and the name of the author": "Укажите источник и имя автора", "Start conversation": "Начать беседу", + "Start dialog": "Начать диалог", "Subheader": "Подзаголовок", "Subscribe": "Подписаться", "Subscribe to comments": "Подписаться на комментарии", @@ -403,6 +406,7 @@ "This way you ll be able to subscribe to authors, interesting topics and customize your feed": "Так вы сможете подписаться на авторов, интересные темы и настроить свою ленту", "This week": "За неделю", "This year": "За год", + "To find publications, art, comments, authors and topics of interest to you, just start typing your query": "Для поиска публикаций, искусства, комментариев, интересных вам авторов и тем, просто начните вводить ваш запрос", "To leave a comment please": "Чтобы оставить комментарий, необходимо", "To write a comment, you must": "Чтобы написать комментарий, необходимо", "Top authors": "Рейтинг авторов", @@ -425,6 +429,7 @@ "Upload userpic": "Загрузить аватар", "Upload video": "Загрузить видео", "Uploading image": "Загружаем изображение", + "User with this email already exists": "Пользователь с таким email уже существует", "Username": "Имя пользователя", "Userpic": "Аватар", "Users": "Пользователи", @@ -433,6 +438,7 @@ "Views": "Просмотры", "We are working on collaborative editing of articles and in the near future you will have an amazing opportunity - to create together with your colleagues": "Мы работаем над коллаборативным редактированием статей и в ближайшем времени у вас появиться удивительная возможность - творить вместе с коллегами", "We can't find you, check email or": "Не можем вас найти, проверьте адрес электронной почты или", + "We couldn't find anything for your request": "Мы не смогли ничего найти по вашему запросу", "We know you, please try to login": "Такой адрес почты уже зарегистрирован, попробуйте залогиниться", "We've sent you a message with a link to enter our website.": "Мы выслали вам письмо с ссылкой на почту. Перейдите по ссылке в письме, чтобы войти на сайт.", "Welcome to Discours": "Добро пожаловать в Дискурс", diff --git a/src/components/App.tsx b/src/components/App.tsx index dfc2be5d..eae090f0 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -7,6 +7,8 @@ import { Dynamic } from 'solid-js/web' import { ConfirmProvider } from '../context/confirm' import { ConnectProvider } from '../context/connect' import { EditorProvider } from '../context/editor' +import { FollowingProvider } from '../context/following' +import { InboxProvider } from '../context/inbox' import { LocalizeProvider } from '../context/localize' import { MediaQueryProvider } from '../context/mediaQuery' import { NotificationsProvider } from '../context/notifications' @@ -89,14 +91,14 @@ type Props = PageProps & { is404: boolean } export const App = (props: Props) => { const { page, searchParams } = useRouter() - let is404 = props.is404 + const is404 = createMemo(() => props.is404) createEffect(() => { - if (!searchParams().modal) { + if (!searchParams().m) { hideModal() } - const modal = MODALS[searchParams().modal] + const modal = MODALS[searchParams().m] if (modal) { showModal(modal) } @@ -105,8 +107,7 @@ export const App = (props: Props) => { const pageComponent = createMemo(() => { const result = pagesMap[page()?.route || 'home'] - if (is404 || !result || page()?.path === '/404') { - is404 = false + if (is404() || !result || page()?.path === '/404') { return FourOuFourPage } @@ -121,13 +122,17 @@ export const App = (props: Props) => { - - - - - - - + + + + + + + + + + + diff --git a/src/components/Article/AudioPlayer/PlayerPlaylist.tsx b/src/components/Article/AudioPlayer/PlayerPlaylist.tsx index 57bdaf2f..b4eec25f 100644 --- a/src/components/Article/AudioPlayer/PlayerPlaylist.tsx +++ b/src/components/Article/AudioPlayer/PlayerPlaylist.tsx @@ -1,3 +1,4 @@ +import { gtag } from 'ga-gtag' import { createSignal, For, lazy, Show } from 'solid-js' import { useLocalize } from '../../../context/localize' @@ -24,6 +25,8 @@ type Props = { onChangeMediaIndex?: (direction: 'up' | 'down', index) => void } +const getMediaTitle = (itm: MediaItem, idx: number) => `${idx}. ${itm.artist} - ${itm.title}` + export const PlayerPlaylist = (props: Props) => { const { t } = useLocalize() const [activeEditIndex, setActiveEditIndex] = createSignal(-1) @@ -34,6 +37,15 @@ export const PlayerPlaylist = (props: Props) => { const handleMediaItemFieldChange = (field: keyof MediaItem, value: string) => { props.onMediaItemFieldChange(activeEditIndex(), field, value) } + + const play = (index: number) => { + const mi = props.media[index] + gtag('event', 'select_item', { + item_list_id: props.articleSlug, + item_list_name: getMediaTitle(mi, index), + items: props.media.map((it, ix) => getMediaTitle(it, ix)), + }) + } return ( diff --git a/src/styles/Inbox.module.scss b/src/components/Views/Inbox/Inbox.module.scss similarity index 85% rename from src/styles/Inbox.module.scss rename to src/components/Views/Inbox/Inbox.module.scss index 0230879d..9e0f1737 100644 --- a/src/styles/Inbox.module.scss +++ b/src/components/Views/Inbox/Inbox.module.scss @@ -36,7 +36,6 @@ main { display: flex; flex-direction: column; padding: 10px; - height: calc(100% - 10px); $fadeHeight: 10px; @@ -52,26 +51,6 @@ main { position: relative; padding: $fadeHeight 0; - &::before, - &::after { - content: ''; - position: absolute; - width: 100%; - right: 0; - z-index: 1; - height: $fadeHeight; - } - - &::before { - top: 0; - background: linear-gradient(white, transparent $fadeHeight); - } - - &::after { - bottom: 0; - background: linear-gradient(transparent, white $fadeHeight); - } - .dialogs { scroll-behavior: smooth; display: flex; diff --git a/src/components/Views/Inbox.tsx b/src/components/Views/Inbox/Inbox.tsx similarity index 88% rename from src/components/Views/Inbox.tsx rename to src/components/Views/Inbox/Inbox.tsx index 3600d476..593df862 100644 --- a/src/components/Views/Inbox.tsx +++ b/src/components/Views/Inbox/Inbox.tsx @@ -1,27 +1,26 @@ -import type { Chat, Message as MessageType } from '../../graphql/schema/chat.gen' -import type { Author } from '../../graphql/schema/core.gen' +import type { Chat, Message as MessageType } from '../../../graphql/schema/chat.gen' +import type { Author } from '../../../graphql/schema/core.gen' import { clsx } from 'clsx' import { For, createSignal, Show, onMount, createEffect, createMemo, on } from 'solid-js' -import { useInbox } from '../../context/inbox' -import { useLocalize } from '../../context/localize' -import { useSession } from '../../context/session' -import { useRouter } from '../../stores/router' -import { showModal } from '../../stores/ui' -// import { AuthorsSortBy, useAuthorsStore } from '../../stores/zine/authors' -import { Icon } from '../_shared/Icon' -import { Popover } from '../_shared/Popover' -import SimplifiedEditor from '../Editor/SimplifiedEditor' -import CreateModalContent from '../Inbox/CreateModalContent' -import DialogCard from '../Inbox/DialogCard' -import DialogHeader from '../Inbox/DialogHeader' -import { Message } from '../Inbox/Message' -import MessagesFallback from '../Inbox/MessagesFallback' -import Search from '../Inbox/Search' -import { Modal } from '../Nav/Modal' +import { useInbox } from '../../../context/inbox' +import { useLocalize } from '../../../context/localize' +import { useSession } from '../../../context/session' +import { useRouter } from '../../../stores/router' +import { showModal } from '../../../stores/ui' +import { useAuthorsStore } from '../../../stores/zine/authors' +import { Icon } from '../../_shared/Icon' +import { InviteMembers } from '../../_shared/InviteMembers' +import { Popover } from '../../_shared/Popover' +import SimplifiedEditor from '../../Editor/SimplifiedEditor' +import DialogCard from '../../Inbox/DialogCard' +import DialogHeader from '../../Inbox/DialogHeader' +import { Message } from '../../Inbox/Message' +import MessagesFallback from '../../Inbox/MessagesFallback' +import Search from '../../Inbox/Search' -import styles from '../../styles/Inbox.module.scss' +import styles from './Inbox.module.scss' type InboxSearchParams = { by?: string @@ -34,7 +33,7 @@ const userSearch = (array: Author[], keyword: string) => { } const handleOpenInviteModal = () => { - showModal('inviteToChat') + showModal('inviteMembers') } type Props = { @@ -64,16 +63,12 @@ export const InboxView = (props: Props) => { current: null, } - // Поиск по диалогам const getQuery = (query) => { if (query().length >= 2) { const match = userSearch(recipients(), query()) setRecipients(match) - } else { - // setRecipients(cashedRecipients()) } } - const handleOpenChat = async (chat: Chat) => { setCurrentDialog(chat) changeSearchParams({ @@ -91,8 +86,6 @@ export const InboxView = (props: Props) => { } } - onMount(loadChats) - const handleSubmit = async (message: string) => { sendMessage({ body: message, @@ -129,6 +122,7 @@ export const InboxView = (props: Props) => { }) const chatsToShow = () => { + if (!chats()) return const sorted = chats().sort((a, b) => { return b.updated_at - a.updated_at }) @@ -181,11 +175,14 @@ export const InboxView = (props: Props) => { setIsScrollToNewVisible(false) } + onMount(async () => { + await loadChats() + }) + return (
- - - + + {/**/}
@@ -195,7 +192,7 @@ export const InboxView = (props: Props) => {
- +
  • -
  • -
  • diff --git a/src/components/Views/PublishSettings/PublishSettings.tsx b/src/components/Views/PublishSettings/PublishSettings.tsx index 2cc1e3eb..1fe168be 100644 --- a/src/components/Views/PublishSettings/PublishSettings.tsx +++ b/src/components/Views/PublishSettings/PublishSettings.tsx @@ -1,21 +1,21 @@ import { redirectPage } from '@nanostores/router' import { clsx } from 'clsx' -import { lazy, Show } from 'solid-js' +import { createEffect, createMemo, createSignal, lazy, onMount, Show } from 'solid-js' import { createStore } from 'solid-js/store' import { ShoutForm, useEditorContext } from '../../../context/editor' import { useLocalize } from '../../../context/localize' import { useSession } from '../../../context/session' +import { Topic } from '../../../graphql/schema/core.gen' import { UploadedFile } from '../../../pages/types' import { router } from '../../../stores/router' import { hideModal, showModal } from '../../../stores/ui' -import { useTopicsStore } from '../../../stores/zine/topics' +import { loadAllTopics, useTopicsStore } from '../../../stores/zine/topics' import { Button } from '../../_shared/Button' import { Icon } from '../../_shared/Icon' import { Image } from '../../_shared/Image' import { TopicSelect, UploadModalContent } from '../../Editor' import { Modal } from '../../Nav/Modal' -import { EMPTY_TOPIC } from '../Edit' import styles from './PublishSettings.module.scss' import stylesBeside from '../../Feed/Beside.module.scss' @@ -35,10 +35,25 @@ const shorten = (str: string, maxLen: number) => { return `${result}...` } +const EMPTY_TOPIC: Topic = { + id: -1, + slug: '', +} +const emptyConfig = { + coverImageUrl: '', + mainTopic: EMPTY_TOPIC, + slug: '', + title: '', + subtitle: '', + description: '', + selectedTopics: [], +} + export const PublishSettings = (props: Props) => { const { t } = useLocalize() const { author } = useSession() const { sortedTopics } = useTopicsStore() + const [topics, setTopics] = createSignal(sortedTopics()) const composeDescription = () => { if (!props.form.description) { @@ -49,22 +64,32 @@ export const PublishSettings = (props: Props) => { return props.form.description } - const initialData: Partial = { - coverImageUrl: props.form.coverImageUrl, - mainTopic: props.form.mainTopic || EMPTY_TOPIC, - slug: props.form.slug, - title: props.form.title, - subtitle: props.form.subtitle, - description: composeDescription(), - } + const initialData = createMemo(() => { + return { + coverImageUrl: props.form?.coverImageUrl, + mainTopic: props.form?.mainTopic || EMPTY_TOPIC, + slug: props.form?.slug, + title: props.form?.title, + subtitle: props.form?.subtitle, + description: composeDescription(), + selectedTopics: [], + } + }) + + const [settingsForm, setSettingsForm] = createStore(emptyConfig) + + onMount(() => { + setSettingsForm(initialData()) + loadAllTopics() + }) + + createEffect(() => setTopics(sortedTopics())) const { formErrors, actions: { setForm, setFormErrors, saveShout, publishShout }, } = useEditorContext() - const [settingsForm, setSettingsForm] = createStore(initialData) - const handleUploadModalContentCloseSetCover = (image: UploadedFile) => { hideModal() setSettingsForm('coverImageUrl', image.url) @@ -98,7 +123,7 @@ export const PublishSettings = (props: Props) => { }) } const handleCancelClick = () => { - setSettingsForm(initialData) + setSettingsForm(initialData()) handleBackClick() } const handlePublishSubmit = () => { @@ -137,9 +162,9 @@ export const PublishSettings = (props: Props) => { [styles.hasImage]: settingsForm.coverImageUrl, })} > - +
    - {initialData.title} + {initialData().title}
    @@ -205,9 +230,9 @@ export const PublishSettings = (props: Props) => {

    - + 0}> setForm('mainTopic', mainTopic)} @@ -222,7 +247,7 @@ export const PublishSettings = (props: Props) => {

    {t('Collaborators')}

    diff --git a/src/components/Views/Topic.tsx b/src/components/Views/Topic.tsx index a6702147..1b3d059a 100644 --- a/src/components/Views/Topic.tsx +++ b/src/components/Views/Topic.tsx @@ -2,7 +2,7 @@ import type { Shout, Topic } from '../../graphql/schema/core.gen' import { Meta } from '@solidjs/meta' import { clsx } from 'clsx' -import { For, Show, createMemo, onMount, createSignal } from 'solid-js' +import { For, Show, createMemo, onMount, createSignal, createEffect } from 'solid-js' import { useLocalize } from '../../context/localize' import { useRouter } from '../../stores/router' @@ -39,23 +39,27 @@ const LOAD_MORE_PAGE_SIZE = 9 // Row3 + Row3 + Row3 export const TopicView = (props: Props) => { const { t, lang } = useLocalize() const { searchParams, changeSearchParams } = useRouter() - const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) - const { sortedArticles } = useArticlesStore({ shouts: props.shouts }) const { topicEntities } = useTopicsStore({ topics: [props.topic] }) - const { authorsByTopic } = useAuthorsStore() - const topic = createMemo(() => - props.topic?.slug in topicEntities() ? topicEntities()[props.topic.slug] : props.topic, + const [topic, setTopic] = createSignal() + createEffect(() => { + const topics = topicEntities() + if (props.topicSlug && !topic() && topics) { + setTopic(topics[props.topicSlug]) + } + }) + const title = createMemo( + () => + `#${capitalize( + lang() === 'en' + ? topic()?.slug.replace(/-/, ' ') + : topic()?.title || topic()?.slug.replace(/-/, ' '), + true, + )}`, ) - const title = () => - `#${capitalize( - lang() === 'en' ? topic()?.slug.replace(/-/, ' ') : topic()?.title || topic()?.slug.replace(/-/, ' '), - true, - )}` - onMount(() => (document.title = title())) const loadMore = async () => { saveScrollPosition() diff --git a/src/components/_shared/ImageCropper/ImageCropper.module.scss b/src/components/_shared/ImageCropper/ImageCropper.module.scss new file mode 100644 index 00000000..51e4dd01 --- /dev/null +++ b/src/components/_shared/ImageCropper/ImageCropper.module.scss @@ -0,0 +1,10 @@ +.cropperContainer { + max-height: 55vh; +} + +.cropperControls { + display: flex; + justify-content: space-between; + + margin-top: 2rem; +} diff --git a/src/components/_shared/ImageCropper/ImageCropper.tsx b/src/components/_shared/ImageCropper/ImageCropper.tsx new file mode 100644 index 00000000..e0cd0f7a --- /dev/null +++ b/src/components/_shared/ImageCropper/ImageCropper.tsx @@ -0,0 +1,78 @@ +import 'cropperjs/dist/cropper.css' + +import { UploadFile } from '@solid-primitives/upload' +import Cropper from 'cropperjs' +import { createSignal, onMount, Show } from 'solid-js' + +import { useLocalize } from '../../../context/localize' +import { Button } from '../Button' + +import styles from './ImageCropper.module.scss' + +interface CropperProps { + uploadFile: UploadFile + onSave: (any) => void + onDecline?: () => void +} + +export const ImageCropper = (props: CropperProps) => { + const { t } = useLocalize() + + const imageTagRef: { current: HTMLImageElement } = { + current: null, + } + + const [cropper, setCropper] = createSignal(null) + + onMount(() => { + if (imageTagRef.current) { + setCropper( + new Cropper(imageTagRef.current, { + viewMode: 1, + aspectRatio: 1, + guides: false, + background: false, + rotatable: false, + autoCropArea: 1, + modal: true, + }), + ) + } + }) + + return ( +
    +
    + (imageTagRef.current = el)} + src={props.uploadFile.source} + alt="image crop panel" + /> +
    + +
    + +
    +
    + ) +} diff --git a/src/components/_shared/ImageCropper/index.tsx b/src/components/_shared/ImageCropper/index.tsx new file mode 100644 index 00000000..08e025d1 --- /dev/null +++ b/src/components/_shared/ImageCropper/index.tsx @@ -0,0 +1 @@ +export { ImageCropper } from './ImageCropper' diff --git a/src/components/_shared/InviteCoAuthorsModal/InviteCoAuthorsModal.tsx b/src/components/_shared/InviteCoAuthorsModal/InviteCoAuthorsModal.tsx deleted file mode 100644 index 859c295b..00000000 --- a/src/components/_shared/InviteCoAuthorsModal/InviteCoAuthorsModal.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { useLocalize } from '../../../context/localize' -import { Modal } from '../../Nav/Modal' -import { UserSearch } from '../UserSearch' - -type Props = { - title?: string -} -export const InviteCoAuthorsModal = (props: Props) => { - const { t } = useLocalize() - - return ( - -

    {props.title || t('Invite collaborators')}

    - {}} /> -
    - ) -} diff --git a/src/components/_shared/InviteCoAuthorsModal/index.ts b/src/components/_shared/InviteCoAuthorsModal/index.ts deleted file mode 100644 index cf10fce7..00000000 --- a/src/components/_shared/InviteCoAuthorsModal/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { InviteCoAuthorsModal } from './InviteCoAuthorsModal' diff --git a/src/components/_shared/UserSearch/UserSearch.module.scss b/src/components/_shared/InviteMembers/InviteMembers.module.scss similarity index 53% rename from src/components/_shared/UserSearch/UserSearch.module.scss rename to src/components/_shared/InviteMembers/InviteMembers.module.scss index 45a6d74d..8710a65a 100644 --- a/src/components/_shared/UserSearch/UserSearch.module.scss +++ b/src/components/_shared/InviteMembers/InviteMembers.module.scss @@ -1,4 +1,4 @@ -.UserSearch { +.InviteMembers { .searchHeader { display: flex; flex-flow: row nowrap; @@ -32,10 +32,40 @@ } } + .searchButton { + margin: 0; + } + .authors { - height: 400px; + height: 300px; overflow: auto; - padding: 1rem 0; + margin-top: 1rem; + + .author { + cursor: pointer; + + &:hover { + background: var(--black-100); + } + } + } + + .loading { + @include font-size(1.4rem); + + display: flex; + align-items: center; + justify-content: center; + gap: 1rem; + width: 100%; + flex-direction: row; + opacity: 0.5; + + .icon { + position: relative; + width: 18px; + height: 18px; + } } .teaser { @@ -46,4 +76,11 @@ justify-content: center; text-align: center; } + + .actions { + display: flex; + margin-top: 1rem; + flex-direction: row; + justify-content: space-between; + } } diff --git a/src/components/_shared/InviteMembers/InviteMembers.tsx b/src/components/_shared/InviteMembers/InviteMembers.tsx new file mode 100644 index 00000000..87979810 --- /dev/null +++ b/src/components/_shared/InviteMembers/InviteMembers.tsx @@ -0,0 +1,187 @@ +import { createInfiniteScroll } from '@solid-primitives/pagination' +import { clsx } from 'clsx' +import { createEffect, createSignal, For, on, Show } from 'solid-js' + +import { useInbox } from '../../../context/inbox' +import { useLocalize } from '../../../context/localize' +import { Author } from '../../../graphql/schema/core.gen' +import { hideModal } from '../../../stores/ui' +import { useAuthorsStore } from '../../../stores/zine/authors' +import { AuthorBadge } from '../../Author/AuthorBadge' +import { Modal } from '../../Nav/Modal' +import { Button } from '../Button' +import { DropdownSelect } from '../DropdownSelect' +import { Loading } from '../Loading' + +import styles from './InviteMembers.module.scss' + +type InviteAuthor = Author & { selected: boolean } + +type Props = { + title?: string + variant?: 'coauthors' | 'recipients' +} + +const PAGE_SIZE = 50 +export const InviteMembers = (props: Props) => { + const { t } = useLocalize() + const roles = [ + { + title: t('Editor'), + description: t('Can write and edit text directly, and accept or reject suggestions from others'), + }, + { + title: t('Co-author'), + description: t('Can make any changes, accept or reject suggestions, and share access with others'), + }, + { + title: t('Commentator'), + description: t('Can offer edits and comments, but cannot edit the post or share access with others'), + }, + ] + + const { sortedAuthors } = useAuthorsStore({ sortBy: 'name' }) + const { + actions: { loadChats, createChat }, + } = useInbox() + const [authorsToInvite, setAuthorsToInvite] = createSignal() + + const [searchResultAuthors, setSearchResultAuthors] = createSignal() + const [collectionToInvite, setCollectionToInvite] = createSignal([]) + const fetcher = async (page: number) => { + await new Promise((resolve, reject) => { + const checkDataLoaded = () => { + if (sortedAuthors().length > 0) { + resolve(true) + } else { + setTimeout(checkDataLoaded, 100) + } + } + setTimeout(() => reject(new Error('Timeout waiting for sortedAuthors')), 10000) + checkDataLoaded() + }) + const start = page * PAGE_SIZE + const end = start + PAGE_SIZE + const authors = authorsToInvite()?.map((author) => ({ ...author, selected: false })) + return authors?.slice(start, end) + } + + const [pages, infiniteScrollLoader, { end }] = createInfiniteScroll(fetcher) + + createEffect( + on( + () => sortedAuthors(), + (currentAuthors) => { + setAuthorsToInvite(currentAuthors.map((author) => ({ ...author, selected: false }))) + }, + { defer: true }, + ), + ) + + const handleInputChange = async (value: string) => { + if (value.length > 1) { + const match = authorsToInvite().filter((author) => + author.name.toLowerCase().includes(value.toLowerCase()), + ) + setSearchResultAuthors(match) + } else { + setSearchResultAuthors() + } + } + + const handleInvite = (id) => { + setCollectionToInvite((prev) => [...prev, id]) + } + + const handleCloseModal = () => { + setSearchResultAuthors() + setCollectionToInvite() + hideModal() + } + + const handleCreate = async () => { + try { + const initChat = await createChat(collectionToInvite(), 'chat Title') + console.debug('[components.Inbox] create chat result:', initChat) + hideModal() + await loadChats() + } catch (error) { + console.error('handleCreate chat', error) + } + } + + return ( + +

    {props.title || t('Invite collaborators')}

    +
    +
    +
    + { + if (props.variant === 'recipients') return + handleInputChange(e.target.value) + }} + onInput={(e) => { + if (props.variant === 'coauthors') return + handleInputChange(e.target.value) + }} + /> + + + +
    + +
    + +
    +

    {t('Coming soon')}

    +

    + {t( + 'We are working on collaborative editing of articles and in the near future you will have an amazing opportunity - to create together with your colleagues', + )} +

    +
    +
    + +
    + + {(author) => ( +
    + handleInvite(id)} + /> +
    + )} +
    + +
    +
    + +
    +
    {t('Loading')}
    +
    +
    +
    +
    +
    +
    +
    +
    + ) +} diff --git a/src/components/_shared/InviteMembers/index.ts b/src/components/_shared/InviteMembers/index.ts new file mode 100644 index 00000000..9f759543 --- /dev/null +++ b/src/components/_shared/InviteMembers/index.ts @@ -0,0 +1 @@ +export { InviteMembers } from './InviteMembers' diff --git a/src/components/_shared/Lightbox/Lightbox.module.scss b/src/components/_shared/Lightbox/Lightbox.module.scss index 4958b65a..cf1ab04f 100644 --- a/src/components/_shared/Lightbox/Lightbox.module.scss +++ b/src/components/_shared/Lightbox/Lightbox.module.scss @@ -8,7 +8,7 @@ display: flex; align-items: center; justify-content: center; - z-index: 10000; + z-index: 99999; animation: 300ms fadeIn; animation-fill-mode: forwards; @@ -23,20 +23,20 @@ border-radius: 100%; position: fixed; z-index: 1001; - top: 20px; - right: 40px; + top: -40px; + right: -40px; font-size: 30px; color: white; cursor: pointer; - width: 36px; - height: 36px; + width: 80px; + height: 80px; .icon { - height: 20px; - left: 50%; - top: 50%; - transform: translate(-50%, -50%); - width: 20px; + bottom: 16px; + height: 15px; + left: 16px; + position: absolute; + width: 15px; } } @@ -93,12 +93,10 @@ align-items: center; justify-content: center; z-index: 10001; - font-size: 1.2rem; border-radius: 6px; background-color: rgb(0 0 0 / 80%); color: #fff; - pointer-events: none; } diff --git a/src/components/_shared/Lightbox/Lightbox.tsx b/src/components/_shared/Lightbox/Lightbox.tsx index e4ad4f5a..a8a9de53 100644 --- a/src/components/_shared/Lightbox/Lightbox.tsx +++ b/src/components/_shared/Lightbox/Lightbox.tsx @@ -30,6 +30,12 @@ export const Lightbox = (props: Props) => { current: null, } + const handleSmoothAction = (action: () => void) => { + setTransitionEnabled(true) + action() + setTimeout(() => setTransitionEnabled(false), TRANSITION_SPEED) + } + const closeLightbox = () => { lightboxRef.current?.classList.add(styles.fadeOut) @@ -40,34 +46,45 @@ export const Lightbox = (props: Props) => { const zoomIn = (event) => { event.stopPropagation() - setTransitionEnabled(true) - setZoomLevel(zoomLevel() * ZOOM_STEP) - setTimeout(() => setTransitionEnabled(false), TRANSITION_SPEED) + + handleSmoothAction(() => { + setZoomLevel(zoomLevel() * ZOOM_STEP) + }) } const zoomOut = (event) => { event.stopPropagation() - setTransitionEnabled(true) - setZoomLevel(zoomLevel() / ZOOM_STEP) - setTimeout(() => setTransitionEnabled(false), TRANSITION_SPEED) + + handleSmoothAction(() => { + setZoomLevel(zoomLevel() / ZOOM_STEP) + }) + } + + const positionReset = () => { + setTranslateX(0) + setTranslateY(0) } const zoomReset = (event) => { event.stopPropagation() - setZoomLevel(1) + + handleSmoothAction(() => { + setZoomLevel(1) + positionReset() + }) } - const handleWheelZoom = (event) => { + const handleMouseWheelZoom = (event) => { event.preventDefault() + event.stopPropagation() let scale = zoomLevel() - scale += event.deltaY * -0.01 - scale = Math.min(Math.max(0.125, scale), 4) - setTransitionEnabled(true) - setZoomLevel(scale * ZOOM_STEP) + handleSmoothAction(() => { + setZoomLevel(scale * ZOOM_STEP) + }) } useEscKeyDownHandler(closeLightbox) @@ -130,14 +147,15 @@ export const Lightbox = (props: Props) => {
    e.preventDefault()} ref={(el) => (lightboxRef.current = el)} >
    {`${pictureScalePercentage()}%`}
    - +
    - +
    - -
    -

    {t('Coming soon')}

    -

    - {t( - 'We are working on collaborative editing of articles and in the near future you will have an amazing opportunity - to create together with your colleagues', - )} -

    -
    -
    - ) -} diff --git a/src/components/_shared/UserSearch/index.ts b/src/components/_shared/UserSearch/index.ts deleted file mode 100644 index 5b665453..00000000 --- a/src/components/_shared/UserSearch/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { UserSearch } from './UserSearch' diff --git a/src/context/connect.tsx b/src/context/connect.tsx index 5999cd9d..fea126d5 100644 --- a/src/context/connect.tsx +++ b/src/context/connect.tsx @@ -11,7 +11,8 @@ export interface SSEMessage { id: string entity: string // follower | shout | reaction action: string // create | delete | update | join | follow | seen - payload: any // Author | Shout | Reaction | Message + // eslint-disable-next-line @typescript-eslint/no-explicit-any + payload: any // Author Shout Message Reaction Chat created_at?: number // unixtime x1000 seen?: boolean } diff --git a/src/context/editor.tsx b/src/context/editor.tsx index cdb4022d..6d7c550b 100644 --- a/src/context/editor.tsx +++ b/src/context/editor.tsx @@ -23,7 +23,7 @@ export type ShoutForm = { shoutId: number slug: string title: string - subtitle: string + subtitle?: string lead?: string description?: string selectedTopics: Topic[] @@ -218,10 +218,10 @@ export const EditorProvider = (props: { children: JSX.Element }) => { } } - const deleteShout = async (shoutId: number) => { + const deleteShout = async (shout_id: number) => { try { await apiClient.deleteShout({ - shoutId, + shout_id, }) return true } catch { diff --git a/src/context/following.tsx b/src/context/following.tsx new file mode 100644 index 00000000..c826740b --- /dev/null +++ b/src/context/following.tsx @@ -0,0 +1,122 @@ +import { createEffect, createSignal, createContext, Accessor, useContext, JSX, onMount } from 'solid-js' +import { createStore } from 'solid-js/store' + +import { apiClient } from '../graphql/client/core' +import { Author, Community, FollowingEntity, Topic } from '../graphql/schema/core.gen' + +import { useSession } from './session' + +type SubscriptionsData = { + topics?: Topic[] + authors?: Author[] + communities?: Community[] +} + +interface FollowingContextType { + loading: Accessor + subscriptions: SubscriptionsData + setSubscriptions: (subscriptions: SubscriptionsData) => void + setFollowing: (what: FollowingEntity, slug: string, value: boolean) => void + loadSubscriptions: () => void + follow: (what: FollowingEntity, slug: string) => Promise + unfollow: (what: FollowingEntity, slug: string) => Promise +} + +const FollowingContext = createContext() + +export function useFollowing() { + return useContext(FollowingContext) +} + +const EMPTY_SUBSCRIPTIONS = { + topics: [], + authors: [], + communities: [], +} + +export const FollowingProvider = (props: { children: JSX.Element }) => { + const [loading, setLoading] = createSignal(false) + const [subscriptions, setSubscriptions] = createStore(EMPTY_SUBSCRIPTIONS) + const { author } = useSession() + + const fetchData = async () => { + setLoading(true) + try { + if (apiClient.private) { + console.debug('[context.following] fetching subs data...') + const result = await apiClient.getMySubscriptions() + setSubscriptions(result || EMPTY_SUBSCRIPTIONS) + console.info('[context.following] subs:', subscriptions) + } + } catch (error) { + console.info('[context.following] cannot get subs', error) + } finally { + setLoading(false) + } + } + + const follow = async (what: FollowingEntity, slug: string) => { + if (!author()) return + try { + await apiClient.follow({ what, slug }) + setSubscriptions((prevSubscriptions) => { + const updatedSubs = { ...prevSubscriptions } + if (!updatedSubs[what]) updatedSubs[what] = [] + const exists = updatedSubs[what]?.some((entity) => entity.slug === slug) + if (!exists) updatedSubs[what].push(slug) + return updatedSubs + }) + } catch (error) { + console.error(error) + } + } + + const unfollow = async (what: FollowingEntity, slug: string) => { + if (!author()) return + try { + await apiClient.unfollow({ what, slug }) + } catch (error) { + console.error(error) + } + } + + createEffect(() => { + if (author()) { + console.debug('[context.following] author update detect') + fetchData() + } + }) + + const setFollowing = (what: FollowingEntity, slug: string, value = true) => { + setSubscriptions((prevSubscriptions) => { + const updatedSubs = { ...prevSubscriptions } + if (!updatedSubs[what]) updatedSubs[what] = [] + if (value) { + const exists = updatedSubs[what]?.some((entity) => entity.slug === slug) + if (!exists) updatedSubs[what].push(slug) + } else { + updatedSubs[what] = (updatedSubs[what] || []).filter((x) => x !== slug) + } + return updatedSubs + }) + try { + ;(value ? follow : unfollow)(what, slug) + } catch (error) { + console.error(error) + } finally { + fetchData() + } + } + + const value: FollowingContextType = { + loading, + subscriptions, + setSubscriptions, + setFollowing, + loadSubscriptions: fetchData, + follow, + unfollow, + } + + return {props.children} +} diff --git a/src/context/inbox.tsx b/src/context/inbox.tsx index f518929c..22cbf22d 100644 --- a/src/context/inbox.tsx +++ b/src/context/inbox.tsx @@ -34,13 +34,13 @@ export const InboxProvider = (props: { children: JSX.Element }) => { const { sortedAuthors } = useAuthorsStore() const handleMessage = (sseMessage: SSEMessage) => { - console.log('[context.inbox]:', sseMessage) - // handling all action types: create update delete join left seen if (sseMessage.entity === 'message') { + console.debug('[context.inbox]:', sseMessage.payload) const relivedMessage = sseMessage.payload setMessages((prev) => [...prev, relivedMessage]) } else if (sseMessage.entity === 'chat') { + console.debug('[context.inbox]:', sseMessage.payload) const relivedChat = sseMessage.payload setChats((prev) => [...prev, relivedChat]) } diff --git a/src/context/notifications.tsx b/src/context/notifications.tsx index f104faa6..bdbc1bb2 100644 --- a/src/context/notifications.tsx +++ b/src/context/notifications.tsx @@ -47,7 +47,11 @@ export const NotificationsProvider = (props: { children: JSX.Element }) => { const loadNotificationsGrouped = async (options: { after: number; limit?: number; offset?: number }) => { if (isAuthenticated() && notifierClient?.private) { - const { notifications: groups, total, unread } = await notifierClient.getNotifications(options) + const notificationsResult = await notifierClient.getNotifications(options) + const groups = notificationsResult?.notifications || [] + const total = notificationsResult?.total || 0 + const unread = notificationsResult?.unread || 0 + const newGroupsEntries = groups.reduce((acc, group: NotificationGroup) => { acc[group.id] = group return acc diff --git a/src/context/reactions.tsx b/src/context/reactions.tsx index 8588e413..5af22fe2 100644 --- a/src/context/reactions.tsx +++ b/src/context/reactions.tsx @@ -43,17 +43,20 @@ export const ReactionsProvider = (props: { children: JSX.Element }) => { offset?: number }): Promise => { const reactions = await apiClient.getReactionsBy({ by, limit, offset }) - const newReactionEntities = reactions.reduce((acc, reaction) => { - acc[reaction.id] = reaction - return acc - }, {}) + const newReactionEntities = reactions.reduce( + (acc: { [reaction_id: number]: Reaction }, reaction: Reaction) => { + acc[reaction.id] = reaction + return acc + }, + {}, + ) setReactionEntities(newReactionEntities) return reactions } const createReaction = async (input: ReactionInput): Promise => { const reaction = await apiClient.createReaction(input) - + if (!reaction) return const changes = { [reaction.id]: reaction, } @@ -78,11 +81,13 @@ export const ReactionsProvider = (props: { children: JSX.Element }) => { setReactionEntities(changes) } - const deleteReaction = async (id: number): Promise => { - const reaction = await apiClient.destroyReaction(id) - setReactionEntities({ - [reaction.id]: undefined, - }) + const deleteReaction = async (reaction_id: number): Promise => { + if (reaction_id) { + await apiClient.destroyReaction(reaction_id) + setReactionEntities({ + [reaction_id]: undefined, + }) + } } const updateReaction = async (id: number, input: ReactionInput): Promise => { diff --git a/src/context/session.tsx b/src/context/session.tsx index 3d7b701b..c2b8b8f7 100644 --- a/src/context/session.tsx +++ b/src/context/session.tsx @@ -1,5 +1,5 @@ import type { AuthModalSource } from '../components/Nav/AuthModal/types' -import type { Author, Result } from '../graphql/schema/core.gen' +import type { Author } from '../graphql/schema/core.gen' import type { Accessor, JSX, Resource } from 'solid-js' import { @@ -10,7 +10,10 @@ import { ConfigType, SignupInput, AuthorizeResponse, - // GraphqlQueryInput, + ApiResponse, + GenericResponse, + ForgotPasswordResponse, + ForgotPasswordInput, } from '@authorizerdev/authorizer-js' import { createContext, @@ -41,20 +44,17 @@ const defaultConfig: ConfigType = { } export type SessionContextType = { - config: ConfigType + config: Accessor session: Resource author: Resource authError: Accessor isSessionLoaded: Accessor - subscriptions: Accessor - isAuthWithCallback: Accessor<() => void> isAuthenticated: Accessor actions: { loadSession: () => AuthToken | Promise setSession: (token: AuthToken | null) => void // setSession loadAuthor: (info?: unknown) => Author | Promise setAuthor: (a: Author) => void - loadSubscriptions: () => Promise requireAuthentication: ( callback: (() => Promise) | (() => void), modalSource: AuthModalSource, @@ -63,6 +63,9 @@ export type SessionContextType = { signIn: (params: LoginInput) => Promise signOut: () => Promise oauth: (provider: string) => Promise + forgotPassword: ( + params: ForgotPasswordInput, + ) => Promise<{ data: ForgotPasswordResponse; errors: Error[] }> changePassword: (password: string, token: string) => void confirmEmail: (input: VerifyEmailInput) => Promise // email confirm callback is in auth.discours.io setIsSessionLoaded: (loaded: boolean) => void @@ -70,19 +73,16 @@ export type SessionContextType = { } } +const noop = () => {} + const SessionContext = createContext() export function useSession() { return useContext(SessionContext) } -const EMPTY_SUBSCRIPTIONS = { - topics: [], - authors: [], -} - export const SessionProvider = (props: { - onStateChangeCallback(state: any): unknown + onStateChangeCallback(state: AuthToken): unknown children: JSX.Element }) => { const { t } = useLocalize() @@ -90,12 +90,12 @@ export const SessionProvider = (props: { actions: { showSnackbar }, } = useSnackbar() const { searchParams, changeSearchParams } = useRouter() - const [configuration, setConfig] = createSignal(defaultConfig) - const authorizer = createMemo(() => new Authorizer(configuration())) + const [config, setConfig] = createSignal(defaultConfig) + const authorizer = createMemo(() => new Authorizer(config())) const [oauthState, setOauthState] = createSignal() // handle callback's redirect_uri - createEffect(async () => { + createEffect(() => { // oauth const state = searchParams()?.state if (state) { @@ -119,43 +119,54 @@ export const SessionProvider = (props: { }) // load - let minuteLater + let minuteLater: NodeJS.Timeout | null const [isSessionLoaded, setIsSessionLoaded] = createSignal(false) const [authError, setAuthError] = createSignal('') - const [session, { refetch: loadSession, mutate: setSession }] = createResource( - async () => { - try { - const s = await authorizer().getSession() + + // Function to load session data + const sessionData = async () => { + try { + const s: ApiResponse = await authorizer().getSession() + if (s?.data) { console.info('[context.session] loading session', s) // Set session expiration time in local storage - const expires_at = new Date(Date.now() + s.expires_in * 1000) + const expires_at = new Date(Date.now() + s.data.expires_in * 1000) localStorage.setItem('expires_at', `${expires_at.getTime()}`) // Set up session expiration check timer minuteLater = setTimeout(checkSessionIsExpired, 60 * 1000) - console.info(`[context.session] will refresh in ${s.expires_in / 60} mins`) + console.info(`[context.session] will refresh in ${s.data.expires_in / 60} mins`) // Set the session loaded flag setIsSessionLoaded(true) - return s - } catch (error) { - console.info('[context.session] cannot refresh session', error) - setAuthError(error) + return s.data + } else { + console.info('[context.session] cannot refresh session', s.errors) + setAuthError(s.errors.pop().message) // Set the session loaded flag even if there's an error setIsSessionLoaded(true) return null } - }, - { - ssrLoadFrom: 'initial', - initialValue: null, - }, - ) + } catch (error) { + console.info('[context.session] cannot refresh session', error) + setAuthError(error) + + // Set the session loaded flag even if there's an error + setIsSessionLoaded(true) + + return null + } + } + + const [session, { refetch: loadSession, mutate: setSession }] = createResource(sessionData, { + ssrLoadFrom: 'initial', + initialValue: null, + }) const checkSessionIsExpired = () => { const expires_at_data = localStorage.getItem('expires_at') @@ -176,26 +187,17 @@ export const SessionProvider = (props: { } onCleanup(() => clearTimeout(minuteLater)) - - const [author, { refetch: loadAuthor, mutate: setAuthor }] = createResource( - async () => { - const u = session()?.user - return u ? (await apiClient.getAuthorId({ user: u.id.trim() })) || null : null - }, - { - ssrLoadFrom: 'initial', - initialValue: null, - }, - ) - - const [subscriptions, setSubscriptions] = createSignal(EMPTY_SUBSCRIPTIONS) - const loadSubscriptions = async (): Promise => { - const result = await apiClient.getMySubscriptions() - setSubscriptions(result || EMPTY_SUBSCRIPTIONS) + const authorData = async () => { + const u = session()?.user + return u ? (await apiClient.getAuthorId({ user: u.id.trim() })) || null : null } + const [author, { refetch: loadAuthor, mutate: setAuthor }] = createResource(authorData, { + ssrLoadFrom: 'initial', + initialValue: null, + }) // when session is loaded - createEffect(async () => { + createEffect(() => { if (session()) { const token = session()?.access_token if (token) { @@ -205,23 +207,24 @@ export const SessionProvider = (props: { notifierClient.connect(token) inboxClient.connect(token) } - if (!author()) { - const a = await loadAuthor() - if (a) { - await loadSubscriptions() - addAuthors([a]) - } else { - reset() - } - } + if (!author()) loadAuthor() + setIsSessionLoaded(true) } } }) + // when author is loaded + createEffect(() => { + if (author()) { + addAuthors([author()]) + } else { + reset() + } + }) + const reset = () => { setIsSessionLoaded(true) - setSubscriptions(EMPTY_SUBSCRIPTIONS) setSession(null) setAuthor(null) } @@ -250,31 +253,41 @@ export const SessionProvider = (props: { ), ) - // require auth wrapper - const [isAuthWithCallback, setIsAuthWithCallback] = createSignal<() => void>() - const requireAuthentication = async (callback: () => void, modalSource: AuthModalSource) => { - setIsAuthWithCallback(() => callback) - - await loadSession() - + const [authCallback, setAuthCallback] = createSignal<() => void>(() => {}) + const requireAuthentication = (callback: () => void, modalSource: AuthModalSource) => { + setAuthCallback((_cb) => callback) if (!session()) { - showModal('auth', modalSource) + loadSession() + if (!session()) { + showModal('auth', modalSource) + } } } + createEffect(() => { + const handler = authCallback() + if (handler !== noop) { + handler() + setAuthCallback((_cb) => noop) + } + }) + // authorizer api proxy methods const signUp = async (params: SignupInput) => { - const authResult: void | AuthToken = await authorizer().signup(params) - if (authResult) setSession(authResult) + const authResult: ApiResponse = await authorizer().signup(params) + if (authResult?.data) setSession(authResult.data) + if (authResult?.errors) console.error(authResult.errors) } const signIn = async (params: LoginInput) => { - const authResult: AuthToken | void = await authorizer().login(params) - if (authResult) setSession(authResult) + const authResult: ApiResponse = await authorizer().login(params) + if (authResult?.data) setSession(authResult.data) + if (authResult?.errors) console.error(authResult.errors) } const signOut = async () => { - await authorizer().logout() + const authResult: ApiResponse = await authorizer().logout() + console.debug(authResult) reset() showSnackbar({ body: t("You've successfully logged out") }) } @@ -284,12 +297,22 @@ export const SessionProvider = (props: { console.debug('[context.session] change password response:', resp) } + const forgotPassword = async (params: ForgotPasswordInput) => { + const resp = await authorizer().forgotPassword(params) + console.debug('[context.session] change password response:', resp) + return { data: resp?.data, errors: resp.errors } + } + const confirmEmail = async (input: VerifyEmailInput) => { console.debug(`[context.session] calling authorizer's verify email with`, input) try { - const at: void | AuthToken = await authorizer().verifyEmail(input) - if (at) setSession(at) - return at + const at: ApiResponse = await authorizer().verifyEmail(input) + if (at?.data) { + setSession(at.data) + return at.data + } else { + console.warn(at?.errors) + } } catch (error) { console.warn(error) } @@ -315,7 +338,6 @@ export const SessionProvider = (props: { const isAuthenticated = createMemo(() => Boolean(author())) const actions = { loadSession, - loadSubscriptions, requireAuthentication, signUp, signIn, @@ -326,18 +348,17 @@ export const SessionProvider = (props: { setAuthor, authorizer, loadAuthor, + forgotPassword, changePassword, oauth, } const value: SessionContextType = { authError, - config: configuration(), + config, session, - subscriptions, isSessionLoaded, author, actions, - isAuthWithCallback, isAuthenticated, } diff --git a/src/graphql/client/chat.ts b/src/graphql/client/chat.ts index 42c5be97..2f637fe3 100644 --- a/src/graphql/client/chat.ts +++ b/src/graphql/client/chat.ts @@ -28,6 +28,7 @@ export const inboxClient = { loadChats: async (options: QueryLoad_ChatsArgs): Promise => { const resp = await inboxClient.private.query(myChats, options).toPromise() + console.log('!!! resp:', resp) return resp.data.load_chats.chats }, diff --git a/src/graphql/client/core.ts b/src/graphql/client/core.ts index 38ed9705..ad149d8b 100644 --- a/src/graphql/client/core.ts +++ b/src/graphql/client/core.ts @@ -12,6 +12,8 @@ import type { QueryLoad_Authors_ByArgs, QueryLoad_Shouts_SearchArgs, QueryLoad_Shouts_Random_TopArgs, + Community, + MutationDelete_ShoutArgs, } from '../schema/core.gen' import { createGraphQLClient } from '../createGraphQLClient' @@ -37,20 +39,24 @@ import authorBy from '../query/core/author-by' import authorFollowers from '../query/core/author-followers' import authorId from '../query/core/author-id' import authorsAll from '../query/core/authors-all' -import authorFollowed from '../query/core/authors-followed-by' import authorsLoadBy from '../query/core/authors-load-by' import mySubscriptions from '../query/core/my-followed' import reactionsLoadBy from '../query/core/reactions-load-by' import topicBySlug from '../query/core/topic-by-slug' import topicsAll from '../query/core/topics-all' -import userFollowedTopics from '../query/core/topics-by-author' +import authorFollowedAuthors from '../query/core/authors-followed-by' +import authorFollowedTopics from '../query/core/topics-followed-by' +import authorFollowedCommunities from '../query/core/communities-followed-by' import topicsRandomQuery from '../query/core/topics-random' const publicGraphQLClient = createGraphQLClient('core') export const apiClient = { private: null, - connect: (token: string) => (apiClient.private = createGraphQLClient('core', token)), // NOTE: use it after token appears + connect: (token: string) => { + // NOTE: use it after token appears + apiClient.private = createGraphQLClient('core', token) + }, getRandomTopShouts: async (params: QueryLoad_Shouts_Random_TopArgs) => { const response = await publicGraphQLClient.query(loadShoutsTopRandom, params).toPromise() @@ -119,14 +125,18 @@ export const apiClient = { const response = await publicGraphQLClient.query(authorFollowers, { slug }).toPromise() return response.data.get_author_followers }, - getAuthorFollowingUsers: async ({ slug }: { slug: string }): Promise => { - const response = await publicGraphQLClient.query(authorFollowed, { slug }).toPromise() + getAuthorFollowingAuthors: async ({ slug }: { slug: string }): Promise => { + const response = await publicGraphQLClient.query(authorFollowedAuthors, { slug }).toPromise() return response.data.get_author_followed }, getAuthorFollowingTopics: async ({ slug }: { slug: string }): Promise => { - const response = await publicGraphQLClient.query(userFollowedTopics, { slug }).toPromise() + const response = await publicGraphQLClient.query(authorFollowedTopics, { slug }).toPromise() return response.data.get_topics_by_author }, + getAuthorFollowingCommunities: async ({ slug }: { slug: string }): Promise => { + const response = await publicGraphQLClient.query(authorFollowedCommunities, { slug }).toPromise() + return response.data.get_communities_by_author + }, updateProfile: async (input: ProfileInput) => { const response = await apiClient.private.mutation(updateProfile, { profile: input }).toPromise() return response.data.update_profile @@ -154,8 +164,8 @@ export const apiClient = { console.debug('[graphql.client.core] updateArticle:', response.data) return response.data.update_shout.shout }, - deleteShout: async ({ shoutId }: { shoutId: number }): Promise => { - const response = await apiClient.private.mutation(deleteShout, { shout_id: shoutId }).toPromise() + deleteShout: async (params: MutationDelete_ShoutArgs): Promise => { + const response = await apiClient.private.mutation(deleteShout, params).toPromise() console.debug('[graphql.client.core] deleteShout:', response) }, getDrafts: async (): Promise => { @@ -200,7 +210,7 @@ export const apiClient = { const resp = await publicGraphQLClient.query(shoutsLoadBy, { options }).toPromise() if (resp.error) console.error(resp) - return resp.data.load_shouts_by + return resp.data?.load_shouts_by }, getShoutsSearch: async ({ text, limit, offset }: QueryLoad_Shouts_SearchArgs) => { diff --git a/src/graphql/mutation/core/article-delete.ts b/src/graphql/mutation/core/article-delete.ts index 9aa22fc1..6ac5578e 100644 --- a/src/graphql/mutation/core/article-delete.ts +++ b/src/graphql/mutation/core/article-delete.ts @@ -1,8 +1,8 @@ import { gql } from '@urql/core' export default gql` - mutation DeleteShoutMutation($shoutId: Int!) { - delete_shout(shout_id: $shoutId) { + mutation DeleteShoutMutation($shout_id: Int!) { + delete_shout(shout_id: $shout_id) { error } } diff --git a/src/graphql/mutation/core/reaction-create.ts b/src/graphql/mutation/core/reaction-create.ts index c85d3353..72852d97 100644 --- a/src/graphql/mutation/core/reaction-create.ts +++ b/src/graphql/mutation/core/reaction-create.ts @@ -8,7 +8,6 @@ export default gql` id body kind - range created_at reply_to stat { diff --git a/src/graphql/mutation/core/reaction-destroy.ts b/src/graphql/mutation/core/reaction-destroy.ts index ed90143d..be1b5828 100644 --- a/src/graphql/mutation/core/reaction-destroy.ts +++ b/src/graphql/mutation/core/reaction-destroy.ts @@ -1,8 +1,8 @@ import { gql } from '@urql/core' export default gql` - mutation DeleteReactionMutation($id: Int!) { - delete_reaction(id: $id) { + mutation DeleteReactionMutation($reaction_id: Int!) { + delete_reaction(reaction_id: $reaction_id) { error reaction { id diff --git a/src/graphql/query/core/article-load.ts b/src/graphql/query/core/article-load.ts index f99e5e7e..066b7fb5 100644 --- a/src/graphql/query/core/article-load.ts +++ b/src/graphql/query/core/article-load.ts @@ -47,7 +47,7 @@ export default gql` published_at stat { viewed - reacted + rating commented } diff --git a/src/graphql/query/core/articles-load-by.ts b/src/graphql/query/core/articles-load-by.ts index 2f8129b6..a6a117ee 100644 --- a/src/graphql/query/core/articles-load-by.ts +++ b/src/graphql/query/core/articles-load-by.ts @@ -36,7 +36,7 @@ export default gql` published_at stat { viewed - reacted + rating commented } diff --git a/src/graphql/query/core/articles-load-drafts.ts b/src/graphql/query/core/articles-load-drafts.ts index 944739d7..7b2e4c01 100644 --- a/src/graphql/query/core/articles-load-drafts.ts +++ b/src/graphql/query/core/articles-load-drafts.ts @@ -34,7 +34,7 @@ export default gql` published_at stat { viewed - reacted + rating commented } diff --git a/src/graphql/query/core/articles-load-feed.ts b/src/graphql/query/core/articles-load-feed.ts index 01789b08..bc48b7cd 100644 --- a/src/graphql/query/core/articles-load-feed.ts +++ b/src/graphql/query/core/articles-load-feed.ts @@ -28,7 +28,7 @@ export default gql` published_at stat { viewed - reacted + rating } } diff --git a/src/graphql/query/core/articles-load-followed.ts b/src/graphql/query/core/articles-load-followed.ts index 122f290b..2eb0f193 100644 --- a/src/graphql/query/core/articles-load-followed.ts +++ b/src/graphql/query/core/articles-load-followed.ts @@ -31,7 +31,7 @@ export default gql` published_at stat { viewed - reacted + rating } } diff --git a/src/graphql/query/core/articles-load-random-top.ts b/src/graphql/query/core/articles-load-random-top.ts index e103ea28..f7f9b8cc 100644 --- a/src/graphql/query/core/articles-load-random-top.ts +++ b/src/graphql/query/core/articles-load-random-top.ts @@ -36,7 +36,7 @@ export default gql` published_at stat { viewed - reacted + rating commented } diff --git a/src/graphql/query/core/articles-load-random-topic.ts b/src/graphql/query/core/articles-load-random-topic.ts index 5ae25c19..e0b820c3 100644 --- a/src/graphql/query/core/articles-load-random-topic.ts +++ b/src/graphql/query/core/articles-load-random-topic.ts @@ -52,7 +52,7 @@ export default gql` published_at stat { viewed - reacted + rating commented } diff --git a/src/graphql/query/core/articles-load-unrated.ts b/src/graphql/query/core/articles-load-unrated.ts index 29b647de..fd0a2823 100644 --- a/src/graphql/query/core/articles-load-unrated.ts +++ b/src/graphql/query/core/articles-load-unrated.ts @@ -37,7 +37,7 @@ export default gql` published_at stat { viewed - reacted + rating commented } diff --git a/src/graphql/query/core/authors-load-by.ts b/src/graphql/query/core/authors-load-by.ts index 11e11be2..427889c4 100644 --- a/src/graphql/query/core/authors-load-by.ts +++ b/src/graphql/query/core/authors-load-by.ts @@ -1,7 +1,7 @@ import { gql } from '@urql/core' export default gql` - query AuthorsAllQuery($by: AuthorsBy, $limit: Int, $offset: Int) { + query AuthorsAllQuery($by: AuthorsBy!, $limit: Int, $offset: Int) { load_authors_by(by: $by, limit: $limit, offset: $offset) { id slug diff --git a/src/graphql/query/core/communities-followed-by.ts b/src/graphql/query/core/communities-followed-by.ts new file mode 100644 index 00000000..d5d33128 --- /dev/null +++ b/src/graphql/query/core/communities-followed-by.ts @@ -0,0 +1,17 @@ +import { gql } from '@urql/core' + +export default gql` + query LoadCommunitiesFollowedBy($slug: String, $user: String, $author_id: Int) { + get_communities_by_author(slug: $slug, user: $user, author_id: $author_id) { + id + slug + title + pic + stat { + shouts + followers + authors + } + } + } +` diff --git a/src/graphql/query/core/topics-by-author.ts b/src/graphql/query/core/topics-followed-by.ts similarity index 77% rename from src/graphql/query/core/topics-by-author.ts rename to src/graphql/query/core/topics-followed-by.ts index b5d7db23..b5299177 100644 --- a/src/graphql/query/core/topics-by-author.ts +++ b/src/graphql/query/core/topics-followed-by.ts @@ -1,7 +1,7 @@ import { gql } from '@urql/core' export default gql` - query UserFollowingTopicsQuery($slug: String, $user: String, $author_id: Int) { + query LoadTopicsFollowedBy($slug: String, $user: String, $author_id: Int) { get_topics_by_author(slug: $slug, user: $user, author_id: $author_id) { id slug diff --git a/src/pages/article.page.tsx b/src/pages/article.page.tsx index a7d89347..f212cc46 100644 --- a/src/pages/article.page.tsx +++ b/src/pages/article.page.tsx @@ -37,13 +37,9 @@ export const ArticlePage = (props: PageProps) => { }) onMount(() => { - const script = document.createElement('script') - script.async = true - script.src = 'https://ackee.discours.io/increment.js' - script.dataset.ackeeServer = 'https://ackee.discours.io' - script.dataset.ackeeDomainId = '2a6df3a8-53ac-4383-8cc6-73d38cea4524' try { - document.body.appendChild(script) + // document.body.appendChild(script) + console.debug('TODO: connect ga') } catch (error) { console.warn(error) } diff --git a/src/pages/inbox.page.tsx b/src/pages/inbox.page.tsx index 13f77c07..7bde26df 100644 --- a/src/pages/inbox.page.tsx +++ b/src/pages/inbox.page.tsx @@ -4,8 +4,7 @@ import { createSignal, onMount } from 'solid-js' import { PageLayout } from '../components/_shared/PageLayout' import { ShowOnlyOnClient } from '../components/_shared/ShowOnlyOnClient' -import { InboxView } from '../components/Views/Inbox' -import { InboxProvider } from '../context/inbox' +import { InboxView } from '../components/Views/Inbox/Inbox' import { useLocalize } from '../context/localize' import { loadAllAuthors } from '../stores/zine/authors' @@ -24,9 +23,7 @@ export const InboxPage = (props: PageProps) => { return ( - - - + ) diff --git a/src/pages/types.ts b/src/pages/types.ts index 627b5bda..b36a7612 100644 --- a/src/pages/types.ts +++ b/src/pages/types.ts @@ -23,7 +23,7 @@ export type PageProps = { } export type RootSearchParams = { - modal: string + m: string // modal lang: string } @@ -50,4 +50,4 @@ export type UploadedFile = { originalFilename?: string } -export type SubscriptionFilter = 'all' | 'users' | 'topics' +export type SubscriptionFilter = 'all' | 'authors' | 'topics' | 'communities' diff --git a/src/renderer/_default.page.client.tsx b/src/renderer/_default.page.client.tsx index 108ccbad..0ee002ba 100644 --- a/src/renderer/_default.page.client.tsx +++ b/src/renderer/_default.page.client.tsx @@ -1,7 +1,7 @@ import type { PageContext } from './types' import type { PageContextBuiltInClientWithClientRouting } from 'vike/types' -import * as Sentry from '@sentry/browser' +// import * as Sentry from '@sentry/browser' import i18next from 'i18next' import HttpApi from 'i18next-http-backend' import ICU from 'i18next-icu' @@ -9,7 +9,7 @@ import { hydrate } from 'solid-js/web' import { App } from '../components/App' import { initRouter } from '../stores/router' -import { SENTRY_DSN } from '../utils/config' +// import { SENTRY_DSN } from '../utils/config' import { resolveHydrationPromise } from '../utils/hydrationPromise' let layoutReady = false @@ -20,13 +20,13 @@ export const render = async (pageContext: PageContextBuiltInClientWithClientRout const { pathname, search } = window.location const searchParams = Object.fromEntries(new URLSearchParams(search)) initRouter(pathname, searchParams) - + /* if (SENTRY_DSN) { Sentry.init({ dsn: SENTRY_DSN, }) } - + */ // eslint-disable-next-line import/no-named-as-default-member await i18next .use(HttpApi) diff --git a/src/renderer/types.ts b/src/renderer/types.ts index 7f97c7ca..4948f2a7 100644 --- a/src/renderer/types.ts +++ b/src/renderer/types.ts @@ -7,8 +7,7 @@ export type PageContext = PageContextBuiltInClientWithClientRouting & { Page: (pageProps: PageProps) => Component pageProps: PageProps lng: string - // FIXME typing - cookies: any + cookies: { [key: string]: string | number | undefined } | null documentProps?: { title?: string description?: string diff --git a/src/stores/router.ts b/src/stores/router.ts index a9409c68..be197bd1 100644 --- a/src/stores/router.ts +++ b/src/stores/router.ts @@ -152,9 +152,14 @@ export const useRouter = = Record< searchParamsStore.open(newSearchParams, replace) } + const clearSearchParams = (replace = false) => { + searchParamsStore.open({}, replace) + } + return { page, searchParams, changeSearchParams, + clearSearchParams, } } diff --git a/src/stores/ui.ts b/src/stores/ui.ts index 551fe226..a97db243 100644 --- a/src/stores/ui.ts +++ b/src/stores/ui.ts @@ -16,7 +16,6 @@ export type ModalType = | 'thank' | 'confirm' | 'donate' - | 'inviteToChat' | 'uploadImage' | 'simplifiedEditorUploadImage' | 'uploadCoverImage' @@ -24,8 +23,9 @@ export type ModalType = | 'followers' | 'following' | 'search' - | 'inviteCoAuthors' + | 'inviteMembers' | 'share' + | 'cropImage' export const MODALS: Record = { auth: 'auth', @@ -34,21 +34,21 @@ export const MODALS: Record = { thank: 'thank', confirm: 'confirm', donate: 'donate', - inviteToChat: 'inviteToChat', + inviteMembers: 'inviteMembers', uploadImage: 'uploadImage', simplifiedEditorUploadImage: 'simplifiedEditorUploadImage', uploadCoverImage: 'uploadCoverImage', editorInsertLink: 'editorInsertLink', followers: 'followers', following: 'following', - inviteCoAuthors: 'inviteCoAuthors', search: 'search', share: 'share', + cropImage: 'cropImage', } const [modal, setModal] = createSignal(null) -const { changeSearchParams } = useRouter< +const { changeSearchParams, clearSearchParams } = useRouter< AuthModalSearchParams & ConfirmEmailSearchParams & RootSearchParams >() @@ -62,7 +62,10 @@ export const showModal = (modalType: ModalType, modalSource?: AuthModalSource) = setModal(modalType) } -export const hideModal = () => setModal(null) +export const hideModal = () => { + clearSearchParams() + setModal(null) +} export const useModalStore = () => { return { diff --git a/src/stores/zine/articles.ts b/src/stores/zine/articles.ts index 9785a4fb..f7cb9ae6 100644 --- a/src/stores/zine/articles.ts +++ b/src/stores/zine/articles.ts @@ -22,7 +22,7 @@ const [topMonthArticles, setTopMonthArticles] = createSignal([]) const articlesByAuthor = createLazyMemo(() => { return Object.values(articleEntities()).reduce( (acc, article) => { - article.authors.forEach((author) => { + article.authors?.forEach((author) => { if (!acc[author.slug]) { acc[author.slug] = [] } @@ -183,6 +183,7 @@ export const resetSortedArticles = () => { type InitialState = { shouts?: Shout[] + layout?: string } const TOP_MONTH_ARTICLES_COUNT = 10 @@ -195,7 +196,7 @@ export const loadTopMonthArticles = async (): Promise => { published: true, after, }, - order_by: 'rating_stat', + order_by: 'likes_stat', limit: TOP_MONTH_ARTICLES_COUNT, } const articles = await apiClient.getShouts(options) @@ -208,7 +209,7 @@ const TOP_ARTICLES_COUNT = 10 export const loadTopArticles = async (): Promise => { const options: LoadShoutsOptions = { filters: { published: true }, - order_by: 'rating_stat', + order_by: 'likes_stat', limit: TOP_ARTICLES_COUNT, } const articles = await apiClient.getShouts(options) @@ -219,7 +220,14 @@ export const loadTopArticles = async (): Promise => { export const useArticlesStore = (initialState: InitialState = {}) => { addArticles([...(initialState.shouts || [])]) - if (initialState.shouts) { + if (initialState.layout) { + // eslint-disable-next-line promise/catch-or-return + loadShouts({ filters: { layouts: [initialState.layout] }, limit: 10 }).then(({ newShouts }) => { + addArticles(newShouts) + setSortedArticles(newShouts) + }) + } else if (initialState.shouts) { + addArticles([...initialState.shouts]) setSortedArticles([...initialState.shouts]) } diff --git a/src/stores/zine/authors.ts b/src/stores/zine/authors.ts index 161b7642..db3f0627 100644 --- a/src/stores/zine/authors.ts +++ b/src/stores/zine/authors.ts @@ -18,16 +18,13 @@ const sortedAuthors = createLazyMemo(() => { const authors = Object.values(authorEntities()) switch (sortAllBy()) { case 'followers': { - authors.sort(byStat('followers')) - break + return authors.sort(byStat('followers')) } case 'shouts': { - authors.sort(byStat('shouts')) - break + return authors.sort(byStat('shouts')) } case 'name': { - authors.sort((a, b) => a.name.localeCompare(b.name)) - break + return authors.sort((a, b) => a.name.localeCompare(b.name)) } } return authors diff --git a/src/stores/zine/common.ts b/src/stores/zine/common.ts deleted file mode 100644 index c874816b..00000000 --- a/src/stores/zine/common.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { apiClient } from '../../graphql/client/core' -import { FollowingEntity } from '../../graphql/schema/core.gen' - -export const follow = async ({ what, slug }: { what: FollowingEntity; slug: string }) => { - await apiClient.follow({ what, slug }) -} -export const unfollow = async ({ what, slug }: { what: FollowingEntity; slug: string }) => { - await apiClient.unfollow({ what, slug }) -} diff --git a/src/styles/app.scss b/src/styles/app.scss index 2d3a7ac2..6adc6ff2 100644 --- a/src/styles/app.scss +++ b/src/styles/app.scss @@ -213,7 +213,6 @@ a:visited, a:link, .link { color: var(--link-color); - padding-bottom: 0.1em; transition: color 0.2s, background-color 0.2s; @@ -596,7 +595,9 @@ figure { figure { figcaption { color: rgb(0 0 0 / 60%); + @include font-size(1.2rem); + line-height: 1.5; } } @@ -1067,6 +1068,39 @@ iframe { cursor: pointer; } +.blackModeIntersection { + color: var(--default-color); + background: #fef2f2; +} + .img-align-column { clear: both; } + +.cropper-modal { + background-color: #fff !important; +} + +.cropper-canvas { + filter: blur(2px); +} + +.cropper-view-box, +.cropper-crop-box, +.cropper-line, +.cropper-point { + box-shadow: none !important; + outline: none !important; + border: none !important; + background-color: transparent !important; +} + +.cropper-crop-box { + border: 2px solid #000 !important; + border-radius: 8px; +} + +.cropper-view-box, +.cropper-face { + border-radius: 50%; +} diff --git a/src/utils/config.ts b/src/utils/config.ts index ea2e7488..1cfd89a5 100644 --- a/src/utils/config.ts +++ b/src/utils/config.ts @@ -1,6 +1,10 @@ export const isDev = import.meta.env.MODE === 'development' const defaultThumborUrl = 'https://images.discours.io' +export const cdnUrl = 'https://cdn.discours.io' export const thumborUrl = import.meta.env.PUBLIC_THUMBOR_URL || defaultThumborUrl export const SENTRY_DSN = import.meta.env.PUBLIC_SENTRY_DSN || '' + +const defaultSearchUrl = 'https://search.discours.io' +export const searchUrl = import.meta.env.PUBLIC_SEARCH_URL || defaultSearchUrl diff --git a/src/utils/getImageUrl.ts b/src/utils/getImageUrl.ts index 661e3951..6f249115 100644 --- a/src/utils/getImageUrl.ts +++ b/src/utils/getImageUrl.ts @@ -1,12 +1,10 @@ -import { thumborUrl } from './config' +import { thumborUrl, cdnUrl } from './config' -const thumborPrefix = `${thumborUrl}/unsafe/` - -const getSizeUrlPart = (options: { width?: number; height?: number } = {}) => { +const getSizeUrlPart = (options: { width?: number; height?: number; noSizeUrlPart?: boolean } = {}) => { const widthString = options.width ? options.width.toString() : '' const heightString = options.height ? options.height.toString() : '' - if (!widthString && !heightString) { + if ((!widthString && !heightString) || options.noSizeUrlPart) { return '' } @@ -17,21 +15,12 @@ export const getImageUrl = ( src: string, options: { width?: number; height?: number; noSizeUrlPart?: boolean } = {}, ) => { - const sizeUrlPart = getSizeUrlPart(options) + const filename = src?.split('/').pop() + const isAudio = src.toLowerCase().split('.').pop() in ['wav', 'mp3', 'ogg', 'aif', 'flac'] + const base = isAudio ? cdnUrl : `${thumborUrl}/unsafe/` + const sizeUrlPart = isAudio ? '' : getSizeUrlPart(options) - let modifiedSrc = src // Используйте новую переменную вместо переназначения параметра - - if (options.noSizeUrlPart) { - modifiedSrc = modifiedSrc.replace(/\d+x.*?\//, '') - } - - if (src.startsWith(thumborPrefix)) { - const thumborKey = modifiedSrc.replace(thumborPrefix, '') - - return `${thumborUrl}/unsafe/${sizeUrlPart}${thumborKey}` - } - - return `${thumborUrl}/unsafe/${sizeUrlPart}${modifiedSrc}` + return `${base}${sizeUrlPart}production/${isAudio ? 'audio' : 'image'}/${filename}` } export const getOpenGraphImageUrl = ( @@ -50,8 +39,8 @@ export const getOpenGraphImageUrl = ( options.author, )}','${encodeURIComponent(options.title)}')/` - if (src.startsWith(thumborPrefix)) { - const thumborKey = src.replace(thumborPrefix, '') + if (src.startsWith(thumborUrl)) { + const thumborKey = src.replace(thumborUrl + '/unsafe', '') return `${thumborUrl}/unsafe/${sizeUrlPart}${filtersPart}${thumborKey}` } diff --git a/src/utils/pageLoadManager.ts b/src/utils/pageLoadManager.ts index a25ff347..2f8a1798 100644 --- a/src/utils/pageLoadManager.ts +++ b/src/utils/pageLoadManager.ts @@ -1,10 +1,10 @@ const pageLoadManager: { - promise: Promise + promise: Promise } = { promise: Promise.resolve() } export const getPageLoadManagerPromise = () => { return pageLoadManager.promise } -export const setPageLoadManagerPromise = (promise: Promise) => { +export const setPageLoadManagerPromise = (promise: Promise) => { pageLoadManager.promise = promise } diff --git a/src/utils/sortby.ts b/src/utils/sortby.ts index 99112afd..f6d88df6 100644 --- a/src/utils/sortby.ts +++ b/src/utils/sortby.ts @@ -40,6 +40,16 @@ export const byTopicStatDesc = (metric: keyof TopicStat) => { } } +export const byScore = () => { + return (a, b) => { + const x = a?.score || 0 + const y = b?.score || 0 + if (x > y) return -1 + if (x < y) return 1 + return 0 + } +} + export const sortBy = (data, metric) => { const x = [...data] x.sort(typeof metric === 'function' ? metric : byStat(metric)) diff --git a/src/utils/useEscKeyDownHandler.ts b/src/utils/useEscKeyDownHandler.ts index 3e19f505..b3430c31 100644 --- a/src/utils/useEscKeyDownHandler.ts +++ b/src/utils/useEscKeyDownHandler.ts @@ -1,9 +1,9 @@ import { onCleanup, onMount } from 'solid-js' -export const useEscKeyDownHandler = (onEscKeyDown: () => void) => { +export const useEscKeyDownHandler = (onEscKeyDown: (ev) => void) => { const keydownHandler = (e: KeyboardEvent) => { if (e.key === 'Escape') { - onEscKeyDown() + onEscKeyDown(e) } }