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..0007cc26 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,106 +1,108 @@ 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', // 23-01-2024 681 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', // too many 'should be used within JSX' + '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', - "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/.gitea/workflows/main.yml b/.gitea/workflows/main.yml index a21d1a60..09c1881b 100644 --- a/.gitea/workflows/main.yml +++ b/.gitea/workflows/main.yml @@ -1,9 +1,11 @@ name: 'deploy' + on: push: branches: - main - - feature/sse-connect + - dev + - feature/email-templates jobs: test: @@ -26,24 +28,40 @@ jobs: update_mailgun_template: runs-on: ubuntu-latest name: Update templates on Mailgun + if: github.event_name == 'push' && github.ref == 'refs/heads/feature/email-templates' continue-on-error: true steps: - name: Checkout uses: actions/checkout@v2 - - name: update authorizer_password_reset - uses: jlepocher/mailgun-create-template-version-action@v1.3 + + - name: "Email confirmation template" + uses: gyto/mailgun-template-action@v2 with: - mailgun-host: 'api.eu.mailgun.net' + html-file: "./templates/authorizer_email_confirmation.html" mailgun-api-key: ${{ secrets.MAILGUN_API_KEY }} - mailgun-domain-name: 'discours.io' - mailgun-template-name: 'authorizer_password_reset' - html-file-path: './templates/authorizer_password_reset.html' - - - name: update authorizer_password_reset - uses: jlepocher/mailgun-create-template-version-action@v1.3 + mailgun-domain: "discours.io" + mailgun-template: "authorizer_email_confirmation" + + - name: "Password reset template" + uses: gyto/mailgun-template-action@v2 with: - mailgun-host: 'api.eu.mailgun.net' + html-file: "./templates/authorizer_password_reset.html" mailgun-api-key: ${{ secrets.MAILGUN_API_KEY }} - mailgun-domain-name: 'discours.io' - mailgun-template-name: 'authorizer_email_confirm' - html-file-path: './templates/authorizer_email_confirm.html' + mailgun-domain: "discours.io" + mailgun-template: "authorizer_password_reset" + + - name: "First publication notification" + uses: gyto/mailgun-template-action@v2 + with: + html-file: "./templates/first_publication_notification.html" + mailgun-api-key: ${{ secrets.MAILGUN_API_KEY }} + mailgun-domain: "discours.io" + mailgun-template: "first_publication_notification" + + - name: "New comment notification template" + uses: gyto/mailgun-template-action@v2 + with: + html-file: "./templates/new_comment_notification.html" + mailgun-api-key: ${{ secrets.MAILGUN_API_KEY }} + mailgun-domain: "discours.io" + mailgun-template: "new_comment_notification" 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..baa3c974 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,12 +11,14 @@ "license": "MIT", "dependencies": { "@authorizerdev/authorizer-js": "1.2.11", - "ackee-tracker": "5.1.0", + "@solid-primitives/pagination": "0.2.10", + "cropperjs": "1.6.1", "form-data": "4.0.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 +129,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", @@ -398,12 +400,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 +413,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 +452,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 +479,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 +495,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 +669,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 +687,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 +724,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 +1051,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 +1066,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 +1136,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 +1276,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 +1341,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 +1378,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 +1403,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 +1424,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 +1468,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 +1495,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 +1518,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 +1536,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 +1562,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 +1587,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 +1610,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 +1824,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 +1843,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 +1870,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 +1911,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 +1976,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 +2405,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 +2418,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 +2620,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 +2650,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 +2663,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 +2798,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 +2811,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 +2908,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 +2926,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 +3066,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 +3085,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 +3140,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 +3153,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 +3218,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 +3274,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 +3348,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 +3432,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 +3478,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 +3505,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 +4285,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 +4677,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 +4931,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 +5039,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 +5464,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 +5495,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 +5508,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 +5527,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 +5632,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 +5650,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 +6033,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 +6383,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 +6496,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 +6562,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 +6783,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 +6802,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 +7022,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 +7231,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 +7577,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 +7669,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 +7986,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 +8036,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 +8288,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 +8395,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 +8676,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 +8702,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 +8729,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 +8967,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 +9246,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 +9390,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", @@ -10294,16 +9902,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 +9921,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 +9976,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 +9989,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 +10005,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 +10671,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 +13329,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 +13491,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 +13576,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 +13611,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 +13852,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 +14522,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 +14555,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 +14845,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 +14940,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 +15021,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 +15565,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 +15575,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 +15594,7 @@ } ], "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -16069,9 +15676,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 +15867,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 +15889,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 +15913,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 +15955,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 +16028,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 +16304,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 +16638,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 +16721,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 +16823,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 +16912,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 +17525,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 +17902,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 +18104,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 +18269,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 +18353,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 +18462,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 +18530,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 +18612,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 +18817,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..d52e5fc7 100644 --- a/package.json +++ b/package.json @@ -31,12 +31,14 @@ }, "dependencies": { "@authorizerdev/authorizer-js": "1.2.11", - "ackee-tracker": "5.1.0", + "@solid-primitives/pagination": "0.2.10", + "cropperjs": "1.6.1", "form-data": "4.0.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": { 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..77a05db8 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -7,6 +7,7 @@ import { Dynamic } from 'solid-js/web' import { ConfirmProvider } from '../context/confirm' import { ConnectProvider } from '../context/connect' import { EditorProvider } from '../context/editor' +import { InboxProvider } from '../context/inbox' import { LocalizeProvider } from '../context/localize' import { MediaQueryProvider } from '../context/mediaQuery' import { NotificationsProvider } from '../context/notifications' @@ -92,11 +93,11 @@ export const App = (props: Props) => { let is404 = props.is404 createEffect(() => { - if (!searchParams().modal) { + if (!searchParams().m) { hideModal() } - const modal = MODALS[searchParams().modal] + const modal = MODALS[searchParams().m] if (modal) { showModal(modal) } @@ -124,7 +125,9 @@ export const App = (props: Props) => { - + + + diff --git a/src/components/Article/CommentsTree.tsx b/src/components/Article/CommentsTree.tsx index b0bb86f4..436b5988 100644 --- a/src/components/Article/CommentsTree.tsx +++ b/src/components/Article/CommentsTree.tsx @@ -172,11 +172,11 @@ export const CommentsTree = (props: Props) => { fallback={
{t('To write a comment, you must')}{' '} - + {t('sign up')} {' '} {t('or')}  - + {t('sign in')}
diff --git a/src/components/Article/FullArticle.tsx b/src/components/Article/FullArticle.tsx index ec6c565a..e296bbb7 100644 --- a/src/components/Article/FullArticle.tsx +++ b/src/components/Article/FullArticle.tsx @@ -4,7 +4,7 @@ import { getPagePath } from '@nanostores/router' import { createPopper } from '@popperjs/core' import { Link, Meta } from '@solidjs/meta' import { clsx } from 'clsx' -import { createEffect, For, createMemo, onMount, Show, createSignal, onCleanup } from 'solid-js' +import { createEffect, For, createMemo, onMount, Show, createSignal, onCleanup, on } from 'solid-js' import { isServer } from 'solid-js/web' import { useLocalize } from '../../context/localize' @@ -19,7 +19,7 @@ import { getImageUrl, getOpenGraphImageUrl } from '../../utils/getImageUrl' import { getDescription, getKeywords } from '../../utils/meta' import { Icon } from '../_shared/Icon' import { Image } from '../_shared/Image' -import { InviteCoAuthorsModal } from '../_shared/InviteCoAuthorsModal' +import { InviteMembers } from '../_shared/InviteMembers' import { Lightbox } from '../_shared/Lightbox' import { Popover } from '../_shared/Popover' import { ShareModal } from '../_shared/ShareModal' @@ -44,6 +44,11 @@ type Props = { scrollToComments?: boolean } +type IframeSize = { + width: number + height: number +} + export type ArticlePageSearchParams = { scrollTo: 'comments' commentId: string @@ -182,18 +187,6 @@ export const FullArticle = (props: Props) => { actions: { loadReactionsBy }, } = useReactions() - onMount(async () => { - await loadReactionsBy({ - by: { shout: props.article.slug }, - }) - - setIsReactionsLoaded(true) - }) - - onMount(() => { - document.title = props.article.title - }) - const clickHandlers = [] const documentClickHandlers = [] @@ -215,9 +208,9 @@ export const FullArticle = (props: Props) => { tooltipContent.classList.add(styles.tooltipContent) tooltipContent.innerHTML = element.dataset.originalTitle || element.dataset.value - tooltip.appendChild(tooltipContent) + tooltip.append(tooltipContent) - document.body.appendChild(tooltip) + document.body.append(tooltip) if (element.hasAttribute('href')) { element.setAttribute('href', 'javascript: void(0)') @@ -295,8 +288,50 @@ export const FullArticle = (props: Props) => { } } - const cover = props.article.cover ?? 'production/image/logo_image.png' + // Check iframes size + const articleContainer: { current: HTMLElement } = { current: null } + const updateIframeSizes = () => { + if (!articleContainer?.current || !props.article.body) return + const iframes = articleContainer?.current?.querySelectorAll('iframe') + if (!iframes) return + const containerWidth = articleContainer.current?.offsetWidth + iframes.forEach((iframe) => { + const style = window.getComputedStyle(iframe) + const originalWidth = iframe.getAttribute('width') || style.width.replace('px', '') + const originalHeight = iframe.getAttribute('height') || style.height.replace('px', '') + const width: IframeSize['width'] = Number(originalWidth) + const height: IframeSize['height'] = Number(originalHeight) + + if (containerWidth < width) { + const aspectRatio = width / height + iframe.style.width = `${containerWidth}px` + iframe.style.height = `${Math.round(containerWidth / aspectRatio) + 40}px` + } + }) + } + + createEffect( + on( + () => props.article, + () => { + updateIframeSizes() + }, + ), + ) + + onMount(async () => { + await loadReactionsBy({ + by: { shout: props.article.slug }, + }) + setIsReactionsLoaded(true) + document.title = props.article.title + window?.addEventListener('resize', updateIframeSizes) + + onCleanup(() => window.removeEventListener('resize', updateIframeSizes)) + }) + + const cover = props.article.cover ?? 'production/image/logo_image.png' const ogImage = getOpenGraphImageUrl(cover, { title: props.article.title, topic: mainTopic().title, @@ -328,6 +363,7 @@ export const FullArticle = (props: Props) => {
(articleContainer.current = el)} class={clsx('col-md-16 col-lg-14 col-xl-12 offset-md-5', styles.articleContent)} onClick={handleArticleBodyClick} > @@ -519,7 +555,7 @@ export const FullArticle = (props: Props) => { isOwner={canEdit()} containerCssClass={clsx(stylesHeader.control, styles.articlePopupOpener)} onShareClick={() => showModal('share')} - onInviteClick={() => showModal('inviteCoAuthors')} + onInviteClick={() => showModal('inviteMembers')} onVisibilityChange={(isVisible) => setIsActionPopupActive(isVisible)} trigger={ {props.shout.stat.rating}} variant="tiny"> @@ -100,13 +98,10 @@ export const ShoutRatingControl = (props: ShoutRatingControlProps) => { /> -
) diff --git a/src/components/AuthGuard/AuthGuard.tsx b/src/components/AuthGuard/AuthGuard.tsx index 73144eb0..86b10f95 100644 --- a/src/components/AuthGuard/AuthGuard.tsx +++ b/src/components/AuthGuard/AuthGuard.tsx @@ -12,11 +12,7 @@ type Props = { } export const AuthGuard = (props: Props) => { - const { - isAuthenticated, - isSessionLoaded, - actions: { loadSession }, - } = useSession() + const { isAuthenticated, isSessionLoaded } = useSession() const { changeSearchParams } = useRouter() createEffect(async () => { @@ -30,13 +26,14 @@ export const AuthGuard = (props: Props) => { changeSearchParams( { source: 'authguard', - modal: 'auth', + m: 'auth', }, true, ) } } else { - await loadSession() + // await loadSession() + console.warn('session is not loaded') } }) diff --git a/src/components/Author/AuthorBadge/AuthorBadge.module.scss b/src/components/Author/AuthorBadge/AuthorBadge.module.scss index 5483f4ba..e78f10ca 100644 --- a/src/components/Author/AuthorBadge/AuthorBadge.module.scss +++ b/src/components/Author/AuthorBadge/AuthorBadge.module.scss @@ -43,21 +43,23 @@ &:hover { background: unset; } + } - .name { - color: var(--default-color); - font-weight: 500; + .name { + @include font-size(1.4rem); - & span:hover { - color: var(--default-color-invert); - background: var(--background-color-invert); - } + color: var(--default-color); + font-weight: 500; + + & span:hover { + color: var(--default-color-invert); + background: var(--background-color-invert); } + } - .bio { - color: var(--black-400); - font-weight: 500; - } + .bio { + color: var(--black-400); + font-weight: 500; } .actions { diff --git a/src/components/Author/AuthorBadge/AuthorBadge.tsx b/src/components/Author/AuthorBadge/AuthorBadge.tsx index 48e78b49..a596075a 100644 --- a/src/components/Author/AuthorBadge/AuthorBadge.tsx +++ b/src/components/Author/AuthorBadge/AuthorBadge.tsx @@ -13,6 +13,7 @@ import { isCyrillic } from '../../../utils/cyrillic' import { translit } from '../../../utils/ru2en' import { Button } from '../../_shared/Button' import { CheckButton } from '../../_shared/CheckButton' +import { ConditionalWrapper } from '../../_shared/ConditionalWrapper' import { Icon } from '../../_shared/Icon' import { Userpic } from '../Userpic' @@ -25,6 +26,9 @@ type Props = { showMessageButton?: boolean iconButtons?: boolean nameOnly?: boolean + inviteView?: boolean + onInvite?: (id: number) => void + selected?: boolean } export const AuthorBadge = (props: Props) => { const { mediaMatches } = useMediaQuery() @@ -94,7 +98,14 @@ export const AuthorBadge = (props: Props) => { userpic={props.author.pic} slug={props.author.slug} /> - + ( + + {children} + + )} + >
{name()}
@@ -118,7 +129,7 @@ export const AuthorBadge = (props: Props) => { - +
@@ -195,6 +206,13 @@ export const AuthorBadge = (props: Props) => {
+ + props.onInvite(props.author.id)} + /> + ) } diff --git a/src/components/Author/AuthorCard/AuthorCard.tsx b/src/components/Author/AuthorCard/AuthorCard.tsx index f8100e00..587dd564 100644 --- a/src/components/Author/AuthorCard/AuthorCard.tsx +++ b/src/components/Author/AuthorCard/AuthorCard.tsx @@ -142,7 +142,7 @@ export const AuthorCard = (props: Props) => { >
0}> - + {(f) => ( @@ -155,7 +155,7 @@ export const AuthorCard = (props: Props) => { 0}> - + {(f) => { if ('name' in f) { diff --git a/src/components/Discours/Donate.tsx b/src/components/Discours/Donate.tsx index 0264fce7..2b31ada0 100644 --- a/src/components/Discours/Donate.tsx +++ b/src/components/Discours/Donate.tsx @@ -30,9 +30,7 @@ export const Donate = () => { const initiated = () => { // eslint-disable-next-line @typescript-eslint/no-explicit-any - const { - cp: { CloudPayments }, - } = window as any // Checkout(cpOptions) + const CloudPayments = window['cp'] // Checkout(cpOptions) setWidget(new CloudPayments()) console.log('[donate] payments initiated') setCustomerReciept({ @@ -68,7 +66,7 @@ export const Donate = () => { script.src = 'https://widget.cloudpayments.ru/bundles/cloudpayments.js' script.async = true script.addEventListener('load', initiated) - document.head.appendChild(script) + document.head.append(script) }) const show = () => { diff --git a/src/components/Editor/Editor.tsx b/src/components/Editor/Editor.tsx index 101f9af2..211d22e8 100644 --- a/src/components/Editor/Editor.tsx +++ b/src/components/Editor/Editor.tsx @@ -46,6 +46,8 @@ import { Figcaption } from './extensions/Figcaption' import { Figure } from './extensions/Figure' import { Footnote } from './extensions/Footnote' import { Iframe } from './extensions/Iframe' +import { Span } from './extensions/Span' +import { ToggleTextWrap } from './extensions/ToggleTextWrap' import { TrailingNode } from './extensions/TrailingNode' import { TextBubbleMenu } from './TextBubbleMenu' @@ -201,6 +203,8 @@ export const Editor = (props: Props) => { CustomBlockquote, Bold, Italic, + Span, + ToggleTextWrap, Strike, HorizontalRule.configure({ HTMLAttributes: { @@ -208,7 +212,10 @@ export const Editor = (props: Props) => { }, }), Underline, - Link.configure({ + Link.extend({ + inclusive: false, + }).configure({ + autolink: true, openOnClick: false, }), Heading.configure({ @@ -244,6 +251,7 @@ export const Editor = (props: Props) => { Figure, Figcaption, Footnote, + ToggleTextWrap, CharacterCount.configure(), // https://github.com/ueberdosis/tiptap/issues/2589#issuecomment-1093084689 BubbleMenu.configure({ pluginKey: 'textBubbleMenu', @@ -252,6 +260,9 @@ export const Editor = (props: Props) => { const { doc, selection } = state const { empty } = selection const isEmptyTextBlock = doc.textBetween(from, to).length === 0 && isTextSelection(selection) + if (isEmptyTextBlock) { + e.chain().focus().removeTextWrap({ class: 'highlight-fake-selection' }).run() + } setIsCommonMarkup(e.isActive('figcaption')) const result = (view.hasFocus() && @@ -345,7 +356,7 @@ export const Editor = (props: Props) => { }) onCleanup(() => { - editor().destroy() + editor()?.destroy() }) return ( diff --git a/src/components/Editor/Panel/Panel.tsx b/src/components/Editor/Panel/Panel.tsx index b639924c..3366f8b7 100644 --- a/src/components/Editor/Panel/Panel.tsx +++ b/src/components/Editor/Panel/Panel.tsx @@ -92,7 +92,7 @@ export const Panel = (props: Props) => {

- showModal('inviteCoAuthors')}> + showModal('inviteMembers')}> {t('Invite co-authors')}

diff --git a/src/components/Editor/Prosemirror.scss b/src/components/Editor/Prosemirror.scss index d84e01da..a28ee8db 100644 --- a/src/components/Editor/Prosemirror.scss +++ b/src/components/Editor/Prosemirror.scss @@ -311,3 +311,10 @@ footnote { background-color: unset; } } + +.highlight-fake-selection { + background: var(--selection-background); + color: var(--selection-color); + border: solid var(--selection-background); + border-width: 0; +} diff --git a/src/components/Editor/SimplifiedEditor.tsx b/src/components/Editor/SimplifiedEditor.tsx index a4aa4d7b..a549781e 100644 --- a/src/components/Editor/SimplifiedEditor.tsx +++ b/src/components/Editor/SimplifiedEditor.tsx @@ -117,7 +117,10 @@ const SimplifiedEditor = (props: Props) => { Paragraph, Bold, Italic, - Link.configure({ + Link.extend({ + inclusive: false, + }).configure({ + autolink: true, openOnClick: false, }), CharacterCount.configure({ diff --git a/src/components/Editor/TextBubbleMenu/TextBubbleMenu.tsx b/src/components/Editor/TextBubbleMenu/TextBubbleMenu.tsx index c7bb2d32..7457b009 100644 --- a/src/components/Editor/TextBubbleMenu/TextBubbleMenu.tsx +++ b/src/components/Editor/TextBubbleMenu/TextBubbleMenu.tsx @@ -129,11 +129,21 @@ export const TextBubbleMenu = (props: BubbleMenuProps) => { }) }) + const handleOpenLinkForm = () => { + props.editor.chain().focus().addTextWrap({ class: 'highlight-fake-selection' }).run() + setLinkEditorOpen(true) + } + + const handleCloseLinkForm = () => { + setLinkEditorOpen(false) + props.editor.chain().focus().removeTextWrap({ class: 'highlight-fake-selection' }).run() + } + return (
- setLinkEditorOpen(false)} /> + { - +
{error()}
diff --git a/src/components/Nav/AuthModal/RegisterForm.tsx b/src/components/Nav/AuthModal/RegisterForm.tsx index 7ce83e3e..24d1477d 100644 --- a/src/components/Nav/AuthModal/RegisterForm.tsx +++ b/src/components/Nav/AuthModal/RegisterForm.tsx @@ -118,13 +118,29 @@ export const RegisterForm = () => { setIsSuccess(true) } catch (error) { console.error(error) - - // TODO: move to context/session - if (error?.code === 'user_already_exists') { - return + if (error) { + if (error.message.includes('has already signed up')) { + setValidationErrors((errors) => ({ + ...errors, + email: ( + <> + {t('User with this email already exists')},{' '} + + changeSearchParams({ + mode: 'login', + }) + } + > + {t('sign in')} + + + ), + })) + } + console.error(error) } - - setSubmitError(error.message) } finally { setIsSubmitting(false) } @@ -138,9 +154,7 @@ export const RegisterForm = () => {
-
    -
  • {submitError()}
  • -
+
{submitError()}
{
- +
@@ -187,7 +187,7 @@ export const HeaderAuth = (props: Props) => { when={isAuthenticatedControlsVisible()} fallback={
- + {t('Enter')} {/**/} diff --git a/src/components/Nav/Modal/Modal.module.scss b/src/components/Nav/Modal/Modal.module.scss index f7b5ec19..97baac02 100644 --- a/src/components/Nav/Modal/Modal.module.scss +++ b/src/components/Nav/Modal/Modal.module.scss @@ -89,6 +89,13 @@ position: relative; text-align: left; + &::-webkit-scrollbar { + display: none; + } + + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ + @include media-breakpoint-up(sm) { padding: 5rem; } @@ -116,28 +123,6 @@ height: 90vh; } -.backdrop.isMobile { - z-index: 10002; - top: 56px; - height: calc(100% - 58px); - bottom: 0; - - .maxHeight { - height: 100%; - } - - .container { - padding: 0; - height: 100%; - min-height: 100%; - } - - .modalInner { - padding: 1rem 1rem 0; - height: 100%; - } -} - .modal-search { background: #000; @@ -163,3 +148,25 @@ width: 3.2rem; } } + +.backdrop.isMobile { + z-index: 10002; + top: 56px; + height: calc(100% - 58px); + bottom: 0; + + .maxHeight { + height: 100%; + } + + .container { + padding: 0; + height: 100%; + min-height: 100%; + } + + .modalInner { + padding: 1rem 1rem 0; + height: 100%; + } +} diff --git a/src/components/Nav/Modal/Modal.tsx b/src/components/Nav/Modal/Modal.tsx index 24f9c887..4e25cbfb 100644 --- a/src/components/Nav/Modal/Modal.tsx +++ b/src/components/Nav/Modal/Modal.tsx @@ -55,7 +55,7 @@ export const Modal = (props: Props) => { return (
{ {t('Drafts')}
  • - + {t('Subscriptions')}
  • diff --git a/src/components/Nav/SearchModal/SearchModal.module.scss b/src/components/Nav/SearchModal/SearchModal.module.scss index 8fb9acc5..1dbc5039 100644 --- a/src/components/Nav/SearchModal/SearchModal.module.scss +++ b/src/components/Nav/SearchModal/SearchModal.module.scss @@ -1,13 +1,14 @@ @mixin searchFilterControl { - background: rgb(64 64 64 / 50%); - border-radius: 10rem; - color: #fff; - @include font-size(1.4rem); - font-weight: 500; height: 4rem; + padding: 0 2rem; + + background: rgb(64 64 64 / 0.5); + border-radius: 10rem; + color: #fff; + font-weight: 500; white-space: nowrap; &:hover { @@ -15,49 +16,60 @@ } &:active { - color: rgb(255 255 255 / 40%); + color: rgb(255 255 255 / 0.4); } } -.searchForm { +.searchContainer { position: relative; +} - .searchField { - background: none; - border: none; - border-bottom: 2px solid #fff; - color: #fff; +.searchInput { + @include font-size(4.8rem); - @include font-size(4.8rem); + width: 100%; - font-weight: bold; - outline: none; - padding: 0 0 0.5rem; + padding: 0 0 0.5rem; - &::placeholder { - color: rgb(255 255 255 / 32%); - } + background: none; + border: none; + border-bottom: 2px solid #fff; + color: #fff; + font-weight: bold; + outline: none; - &:not(:placeholder-shown) + .submitControl { - display: block; - } + &::placeholder { + color: rgb(255 255 255 / 0.32); + } + + &:not(:placeholder-shown) + .searchButton img { + filter: invert(1); + } + + &::-moz-selection, + &::selection { + color: #2638d9; } } -.submitControl { - display: none; - filter: invert(1); - height: 3.2rem; +.searchButton { position: absolute; right: 0; top: 2rem; + width: 3.2rem; + height: 3.2rem; + + & img { + filter: invert(0.4); + } } .searchDescription { - color: rgb(255 255 255 / 64%); - + margin-bottom: 44px; @include font-size(1.6rem); + + color: rgb(255 255 255 / 0.64); } .topicsList { @@ -65,6 +77,7 @@ flex-wrap: wrap; justify-content: center; gap: 1rem; + margin-top: 9.6rem !important; } @@ -95,9 +108,31 @@ display: flex; flex-wrap: wrap; gap: 1rem; + margin: 6.4rem 0; } .filterResultsControl { @include searchFilterControl; } + +.searchLoader { + width: 28px; + height: 28px; + + border: 5px solid #fff; + border-bottom-color: transparent; + border-radius: 50%; + + animation: rotation 1s linear infinite; +} + +@keyframes rotation { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} diff --git a/src/components/Nav/SearchModal/SearchModal.tsx b/src/components/Nav/SearchModal/SearchModal.tsx index 61e2e0f7..5e3ddaca 100644 --- a/src/components/Nav/SearchModal/SearchModal.tsx +++ b/src/components/Nav/SearchModal/SearchModal.tsx @@ -1,140 +1,201 @@ -import { openPage } from '@nanostores/router' -import { clsx } from 'clsx' +import type { Shout } from '../../../graphql/schema/core.gen' + +import { createResource, createSignal, For, onCleanup, Show } from 'solid-js' +import { debounce } from 'throttle-debounce' import { useLocalize } from '../../../context/localize' -import { router, useRouter } from '../../../stores/router' -import { hideModal } from '../../../stores/ui' +import { loadShoutsSearch } from '../../../stores/zine/articles' +import { restoreScrollPosition, saveScrollPosition } from '../../../utils/scroll' +import { byScore } from '../../../utils/sortby' +import { Button } from '../../_shared/Button' import { Icon } from '../../_shared/Icon' +import { FEED_PAGE_SIZE } from '../../Views/Feed/Feed' + +import { SearchResultItem } from './SearchResultItem' import styles from './SearchModal.module.scss' +// @@TODO handle empty article options after backend support (subtitle, cover, etc.) +// @@TODO implement load more +// @@TODO implement FILTERS & TOPICS +// @@TODO use save/restoreScrollPosition if needed + +const getSearchCoincidences = ({ str, intersection }: { str: string; intersection: string }) => + `${str.replaceAll( + new RegExp(intersection, 'gi'), + (casePreservedMatch) => `${casePreservedMatch}`, + )}` + +const prepareSearchResults = (list: Shout[], searchValue: string) => + list.sort(byScore()).map((article, index) => ({ + ...article, + body: article.body, + cover: article.cover, + created_at: article.created_at, + id: index, + slug: article.slug, + authors: article.authors, + topics: article.topics, + title: article.title + ? getSearchCoincidences({ + str: article.title, + intersection: searchValue, + }) + : '', + subtitle: article.subtitle + ? getSearchCoincidences({ + str: article.subtitle, + intersection: searchValue, + }) + : '', + })) + export const SearchModal = () => { const { t } = useLocalize() - const { changeSearchParams } = useRouter() - let qElement: HTMLInputElement | undefined + const [isLoadMoreButtonVisible, setIsLoadMoreButtonVisible] = createSignal(false) + const [inputValue, setInputValue] = createSignal('') + const [isLoading, setIsLoading] = createSignal(false) + const [offset, setOffset] = createSignal(0) + const [searchResultsList, { refetch: loadSearchResults, mutate: setSearchResultsList }] = createResource< + Shout[] | null + >( + async () => { + setIsLoading(true) + const { hasMore, newShouts } = await loadShoutsSearch({ + limit: FEED_PAGE_SIZE, + text: inputValue(), + offset: offset(), + }) + setIsLoading(false) + setOffset(newShouts.length) + setIsLoadMoreButtonVisible(hasMore) + return newShouts + }, + { + ssrLoadFrom: 'initial', + initialValue: null, + }, + ) - const submitQuery = async (ev) => { - ev.preventDefault() - changeSearchParams({}, true) - hideModal() - openPage(router, 'search', { q: qElement.value }) + let searchEl: HTMLInputElement + const debouncedLoadMore = debounce(500, loadSearchResults) + + const handleQueryInput = async () => { + setInputValue(searchEl.value) + if (searchEl.value?.length > 2) { + await debouncedLoadMore() + } else { + setIsLoading(false) + setSearchResultsList(null) + } } + + const enterQuery = async (ev: KeyboardEvent) => { + setIsLoading(true) + if (ev.key === 'Enter' && inputValue().length > 2) { + await debouncedLoadMore() + } else { + setIsLoading(false) + setSearchResultsList(null) + } + restoreScrollPosition() + setIsLoading(false) + } + + // Cleanup the debounce timer when the component unmounts + onCleanup(() => { + debouncedLoadMore.cancel() + // console.debug('[SearchModal] cleanup debouncing search') + }) + return ( -
    +
    - -

    - Для поиска публикаций, искусства, комментариев, интересных вам авторов и тем, просто начните - вводить ваш запрос -

    -
      -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    + - - - - - -
    +

    -

    -
    -
    - - - - - - - - - - - - - - - - - - - - + + + + {(article: Shout) => ( +
    + +
    + )} +
    + + +

    + +

    +
    +
    + + +

    + + + + {/* @@TODO handle filter */} + {/* +

    + + {(filter) => ( + + )} + +
    +
    */} + + {/* @@TODO handle topics */} + {/* +
    +
    +
    + + {(topic) => ( + + )} + +
    -
    - + */} +
    ) } diff --git a/src/components/Nav/SearchModal/SearchResultItem.tsx b/src/components/Nav/SearchModal/SearchResultItem.tsx new file mode 100644 index 00000000..948e37de --- /dev/null +++ b/src/components/Nav/SearchModal/SearchResultItem.tsx @@ -0,0 +1,33 @@ +import type { Shout } from '../../../graphql/schema/core.gen' + +import { ArticleCard } from '../../Feed/ArticleCard' + +interface SearchCardProps { + settings?: { + noicon?: boolean + noimage?: boolean + nosubtitle?: boolean + noauthor?: boolean + nodate?: boolean + isGroup?: boolean + photoBottom?: boolean + additionalClass?: string + isFeedMode?: boolean + isFloorImportant?: boolean + isWithCover?: boolean + isBigTitle?: boolean + isVertical?: boolean + isShort?: boolean + withBorder?: boolean + isCompact?: boolean + isSingle?: boolean + isBeside?: boolean + withViewed?: boolean + noAuthorLink?: boolean + } + article: Shout +} + +export const SearchResultItem = (props: SearchCardProps) => { + return +} diff --git a/src/components/Nav/Topics/Topics.module.scss b/src/components/Nav/Topics/Topics.module.scss index c7bec984..128dc46f 100644 --- a/src/components/Nav/Topics/Topics.module.scss +++ b/src/components/Nav/Topics/Topics.module.scss @@ -6,10 +6,8 @@ overflow: hidden; position: relative; transform: translateY(-2px); - width: 100%; @include media-breakpoint-down(sm) { - overflow: auto; padding: 0 divide($container-padding-x, 2); } diff --git a/src/components/ProfileSettings/ProfileSettings.tsx b/src/components/ProfileSettings/ProfileSettings.tsx index fc3fab13..490c289a 100644 --- a/src/components/ProfileSettings/ProfileSettings.tsx +++ b/src/components/ProfileSettings/ProfileSettings.tsx @@ -9,6 +9,7 @@ import { useLocalize } from '../../context/localize' import { useProfileForm } from '../../context/profile' import { useSession } from '../../context/session' import { useSnackbar } from '../../context/snackbar' +import { showModal, hideModal } from '../../stores/ui' import { clone } from '../../utils/clone' import { getImageUrl } from '../../utils/getImageUrl' import { handleImageUpload } from '../../utils/handleImageUpload' @@ -16,9 +17,11 @@ import { profileSocialLinks } from '../../utils/profileSocialLinks' import { validateUrl } from '../../utils/validateUrl' import { Button } from '../_shared/Button' import { Icon } from '../_shared/Icon' +import { ImageCropper } from '../_shared/ImageCropper' import { Loading } from '../_shared/Loading' import { Popover } from '../_shared/Popover' import { SocialNetworkInput } from '../_shared/SocialNetworkInput' +import { Modal } from '../Nav/Modal' import { ProfileSettingsNavigation } from '../Nav/ProfileSettingsNavigation' import styles from '../../pages/profile/Settings.module.scss' @@ -28,12 +31,14 @@ const GrowingTextarea = lazy(() => import('../../components/_shared/GrowingTexta export const ProfileSettings = () => { const { t } = useLocalize() + const [prevForm, setPrevForm] = createStore({}) const [isFormInitialized, setIsFormInitialized] = createSignal(false) const [social, setSocial] = createSignal([]) const [addLinkForm, setAddLinkForm] = createSignal(false) const [incorrectUrl, setIncorrectUrl] = createSignal(false) const [isUserpicUpdating, setIsUserpicUpdating] = createSignal(false) + const [userpicFile, setUserpicFile] = createSignal(null) const [uploadError, setUploadError] = createSignal(false) const [isFloatingPanelVisible, setIsFloatingPanelVisible] = createSignal(false) const [hostname, setHostname] = createSignal(null) @@ -114,23 +119,32 @@ export const ProfileSettings = () => { } } - const { selectFiles } = createFileUploader({ multiple: false, accept: 'image/*' }) + const handleCropAvatar = () => { + const { selectFiles } = createFileUploader({ multiple: false, accept: 'image/*' }) - const handleUploadAvatar = async () => { - selectFiles(async ([uploadFile]) => { - try { - setUploadError(false) - setIsUserpicUpdating(true) - const result = await handleImageUpload(uploadFile) - updateFormField('userpic', result.url) - setIsUserpicUpdating(false) - } catch (error) { - setUploadError(true) - console.error('[upload avatar] error', error) - } + selectFiles(([uploadFile]) => { + setUserpicFile(uploadFile) + + showModal('cropImage') }) } + const handleUploadAvatar = async (uploadFile) => { + try { + setUploadError(false) + setIsUserpicUpdating(true) + + const result = await handleImageUpload(uploadFile) + updateFormField('userpic', result.url) + + setUserpicFile(null) + setIsUserpicUpdating(false) + } catch (error) { + setUploadError(true) + console.error('[upload avatar] error', error) + } + } + onMount(() => { setHostname(window?.location.host) @@ -177,7 +191,7 @@ export const ProfileSettings = () => {
    @@ -205,17 +219,19 @@ export const ProfileSettings = () => { )} - + + {/* @@TODO inspect popover below. onClick causes page refreshing */} + {/* {(triggerRef: (el) => void) => ( )} - + */}
    @@ -364,6 +380,21 @@ export const ProfileSettings = () => {
    + setUserpicFile(null)}> +

    {t('Crop image')}

    + + + { + handleUploadAvatar(data) + + hideModal() + }} + onDecline={() => hideModal()} + /> + +
    ) diff --git a/src/components/Views/DraftsView/DraftsView.tsx b/src/components/Views/DraftsView/DraftsView.tsx index f7da3fbf..1aed1a8e 100644 --- a/src/components/Views/DraftsView/DraftsView.tsx +++ b/src/components/Views/DraftsView/DraftsView.tsx @@ -1,6 +1,6 @@ import { openPage } from '@nanostores/router' import { clsx } from 'clsx' -import { createSignal, For, onMount, Show } from 'solid-js' +import { createSignal, createEffect, For, Show } from 'solid-js' import { useEditorContext } from '../../../context/editor' import { useSession } from '../../../context/session' @@ -13,28 +13,26 @@ import styles from './DraftsView.module.scss' export const DraftsView = () => { const { isAuthenticated, isSessionLoaded } = useSession() - const [drafts, setDrafts] = createSignal([]) const loadDrafts = async () => { - const loadedDrafts = await apiClient.getDrafts() - if (loadedDrafts) setDrafts(loadedDrafts.reverse()) - else setDrafts([]) + if (apiClient.private) { + const loadedDrafts = await apiClient.getDrafts() + setDrafts(loadedDrafts || []) + } } - onMount(() => { - loadDrafts() + createEffect(async () => { + if (isSessionLoaded()) await loadDrafts() }) const { actions: { publishShoutById, deleteShout }, } = useEditorContext() - const handleDraftDelete = (shout: Shout) => { + const handleDraftDelete = async (shout: Shout) => { const result = deleteShout(shout.id) - if (result) { - loadDrafts() - } + if (result) await loadDrafts() } const handleDraftPublish = (shout: Shout) => { diff --git a/src/components/Views/Edit.tsx b/src/components/Views/Edit.tsx index 4a083124..4110971f 100644 --- a/src/components/Views/Edit.tsx +++ b/src/components/Views/Edit.tsx @@ -14,7 +14,7 @@ import { isDesktop } from '../../utils/media-query' import { slugify } from '../../utils/slugify' import { DropArea } from '../_shared/DropArea' import { Icon } from '../_shared/Icon' -import { InviteCoAuthorsModal } from '../_shared/InviteCoAuthorsModal' +import { InviteMembers } from '../_shared/InviteMembers' import { Popover } from '../_shared/Popover' import { EditorSwiper } from '../_shared/SolidSwiper' import { Editor, Panel } from '../Editor' @@ -182,7 +182,7 @@ export const EditView = (props: Props) => { const hasChanges = !deepEqual(form, prevForm) if (hasChanges) { setSaving(true) - if (props.shout.visibility === ShoutVisibility.Authors) { + if (props.shout?.visibility === ShoutVisibility.Authors) { await saveDraft(form) } else { saveDraftToLocalStorage(form) @@ -413,7 +413,7 @@ export const EditView = (props: Props) => { - + ) } diff --git a/src/components/Views/Expo/Expo.tsx b/src/components/Views/Expo/Expo.tsx index 2f93e6ac..604cc50b 100644 --- a/src/components/Views/Expo/Expo.tsx +++ b/src/components/Views/Expo/Expo.tsx @@ -36,8 +36,12 @@ export const Expo = (props: Props) => { const { t } = useLocalize() + // const { sortedArticles } = useArticlesStore({ + // shouts: isLoaded() ? props.shouts : [], + // }) const { sortedArticles } = useArticlesStore({ - shouts: isLoaded() ? props.shouts : [], + shouts: props.shouts || [], + layout: props.layout, }) const getLoadShoutsFilters = (additionalFilters: LoadShoutsFilters = {}): LoadShoutsFilters => { diff --git a/src/components/Views/Feed/Feed.tsx b/src/components/Views/Feed/Feed.tsx index 63d6945f..5bd73f71 100644 --- a/src/components/Views/Feed/Feed.tsx +++ b/src/components/Views/Feed/Feed.tsx @@ -17,7 +17,7 @@ import { useTopicsStore } from '../../../stores/zine/topics' import { getImageUrl } from '../../../utils/getImageUrl' import { DropDown } from '../../_shared/DropDown' import { Icon } from '../../_shared/Icon' -import { InviteCoAuthorsModal } from '../../_shared/InviteCoAuthorsModal' +import { InviteMembers } from '../../_shared/InviteMembers' import { Loading } from '../../_shared/Loading' import { ShareModal } from '../../_shared/ShareModal' import { CommentDate } from '../../Article/CommentDate' @@ -48,14 +48,14 @@ type VisibilityItem = { } type FeedSearchParams = { - by: 'publish_date' | 'rating' | 'last_comment' + by: 'publish_date' | 'likes_stat' | 'rating' | 'last_comment' period: FeedPeriod visibility: VisibilityMode } const getOrderBy = (by: FeedSearchParams['by']) => { - if (by === 'rating') { - return 'rating_stat' + if (by === 'likes_stat' || by === 'rating') { + return 'likes_stat' } if (by === 'last_comment') { @@ -305,7 +305,7 @@ export const FeedView = (props: Props) => { {(article) => ( handleShare(shared)} - onInvite={() => showModal('inviteCoAuthors')} + onInvite={() => showModal('inviteMembers')} article={article} settings={{ isFeedMode: true }} desktopCoverSize="M" @@ -432,7 +432,7 @@ export const FeedView = (props: Props) => { shareUrl={getShareUrl({ pathname: `/${shareData().slug}` })} /> - +
    ) } diff --git a/src/components/Views/FeedSettings.tsx b/src/components/Views/FeedSettings.tsx index 681f6020..3adbef52 100644 --- a/src/components/Views/FeedSettings.tsx +++ b/src/components/Views/FeedSettings.tsx @@ -3,7 +3,7 @@ import { useLocalize } from '../../context/localize' import styles from '../../styles/FeedSettings.module.scss' // type FeedSettingsSearchParams = { -// by: '' | 'topics' | 'authors' | 'reacted' +// by: '' | 'topics' | 'authors' | 'shouts' // } export const FeedSettingsView = (_props) => { @@ -25,7 +25,7 @@ export const FeedSettingsView = (_props) => { {t('authors')}
  • - {t('reactions')} + {t('publications')}
  • 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/_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..41975d52 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[] 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..c98ebcaa 100644 --- a/src/context/reactions.tsx +++ b/src/context/reactions.tsx @@ -43,10 +43,13 @@ 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 } @@ -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..0b872ab4 100644 --- a/src/context/session.tsx +++ b/src/context/session.tsx @@ -47,7 +47,6 @@ export type SessionContextType = { authError: Accessor isSessionLoaded: Accessor subscriptions: Accessor - isAuthWithCallback: Accessor<() => void> isAuthenticated: Accessor actions: { loadSession: () => AuthToken | Promise @@ -70,6 +69,8 @@ export type SessionContextType = { } } +const noop = () => {} + const SessionContext = createContext() export function useSession() { @@ -82,7 +83,7 @@ const EMPTY_SUBSCRIPTIONS = { } export const SessionProvider = (props: { - onStateChangeCallback(state: any): unknown + onStateChangeCallback(state: AuthToken): unknown children: JSX.Element }) => { const { t } = useLocalize() @@ -250,18 +251,25 @@ export const SessionProvider = (props: { ), ) - // require auth wrapper - const [isAuthWithCallback, setIsAuthWithCallback] = createSignal<() => void>() + const [authCallback, setAuthCallback] = createSignal<() => void>(() => {}) const requireAuthentication = async (callback: () => void, modalSource: AuthModalSource) => { - setIsAuthWithCallback(() => callback) - - await loadSession() - + setAuthCallback((_cb) => callback) if (!session()) { - showModal('auth', modalSource) + await 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) @@ -337,7 +345,6 @@ export const SessionProvider = (props: { 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/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/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..c54208c1 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 } 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/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..ef59e6d8 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))