From 4c578a7d6c2742bf3cf0632ee1eac3ee2d45825e Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Thu, 18 Aug 2022 20:11:37 +0200 Subject: [PATCH] Split eslint and prettier (#1315) * Split eslint and prettier As recommended at https://prettier.io/docs/en/integrating-with-linters.html * Fix vs config * Fix linter issues * Run prettier on everything * Fix lint cmd * Don't check git ignored files with prettier --- .eslintrc.cjs | 50 +- .github/dependabot.yml | 35 +- .github/workflows/deploy.yml | 25 +- .github/workflows/release.yml | 64 +- .gitpod.yml | 2 +- .storybook/main.cjs | 4 +- .vscode/extensions.json | 28 +- .vscode/launch.json | 16 +- .vscode/settings.json | 22 +- .vscode/tasks.json | 8 +- README.md | 54 +- apollo/apollo-server.ts | 6 +- apollo/cache.ts | 4 +- components/t-alert.stories.ts | 2 +- components/t-button.stories.ts | 2 +- components/t-checkbox.stories.ts | 2 +- components/t-dropdown.stories.ts | 2 +- components/t-input-group.stories.ts | 2 +- components/t-input.stories.ts | 2 +- components/t-nuxtlink.stories.ts | 2 +- components/t-select.stories.ts | 2 +- components/t-table.stories.ts | 2 +- components/t-tag.stories.ts | 2 +- components/t-textarea.stories.ts | 2 +- components/tagify.vue | 1 + docs/technology-api.md | 6 +- docs/technology-backend.md | 5 +- docs/technology-database.md | 3 +- docs/technology-frontend.md | 1 + graphql.config.json | 65 +- jest.config.ts | 2 +- modules/graphql.mjs | 6 +- modules/storybook.ts | 2 +- package.json | 20 +- plugins/apollo.ts | 6 +- plugins/fontawesome.ts | 4 +- plugins/tailwind.ts | 12 +- renovate.json | 4 +- server/database/seed.ts | 3 +- server/database/truncate.ts | 1 + server/database/util.ts | 2 +- server/documents/integration.test.ts | 2 +- server/documents/resolvers.spec.ts | 6 +- server/documents/resolvers.ts | 14 +- .../documents/user.document.service.spec.ts | 2 +- server/documents/user.document.service.ts | 8 +- server/groups/resolvers.ts | 11 +- server/index.ts | 8 +- server/middleware/auth.ts | 2 +- server/postman/TestSuite.json | 301 +++++----- server/resolvers.ts | 4 +- server/schema.ts | 4 +- server/tsyringe.config.ts | 1 + server/user/auth.email.strategy.ts | 6 +- server/user/auth.service.ts | 6 +- server/user/integration.test.ts | 2 +- server/user/passport-initializer.ts | 8 +- server/user/resolvers.ts | 16 +- server/utils/extractResolveType.ts | 6 +- server/utils/services.factory.ts | 2 +- tailwind.config.ts | 4 +- test/global.setup.ts | 3 +- test/testenv.ts | 4 +- tsconfig.json | 18 +- yarn.lock | 564 ++++++++---------- 65 files changed, 677 insertions(+), 808 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 9e8384d0b..0b016c677 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -6,11 +6,11 @@ module.exports = { }, extends: [ '@nuxtjs/eslint-config-typescript', - // Enable recommended rules for typescript + // Enable typescript-specific recommended rules 'plugin:@typescript-eslint/recommended', - 'prettier', - 'plugin:prettier/recommended', 'plugin:nuxt/recommended', + // Turns off all rules that are unnecessary or might conflict with Prettier (needs to be last) + 'prettier', ], plugins: ['unused-imports'], rules: { @@ -23,8 +23,8 @@ module.exports = { 'ts-ignore': 'allow-with-description', }, ], - // Report unused imports - 'unused-imports/no-unused-imports': 'error', + // Don't report unused imports (this is handled by prettier) + 'unused-imports/no-unused-imports': 'off', // Report unused variables (except the ones prefixed with an underscore) 'unused-imports/no-unused-vars': [ 'warn', @@ -35,18 +35,12 @@ module.exports = { argsIgnorePattern: '^_', }, ], - 'prettier/prettier': [ - 'error', - { - endOfLine: 'lf', - }, - ], // Ensure void operator is not used, except for variable assignment or function return (might be handy for promises) 'no-void': ['error', { allowAsStatement: true }], // Demote this to warning as long as we are still using cjs modules 'import/named': 'warn', - // Import order is normally handled by prettier, but sometimes there are conflicts: https://github.com/simonhaenisch/prettier-plugin-organize-imports/issues/65 - 'import/order': 'warn', + // Import order is handled by prettier (which is incompatible with this rule: https://github.com/simonhaenisch/prettier-plugin-organize-imports/issues/65) + 'import/order': 'off', }, overrides: [ { @@ -75,16 +69,16 @@ module.exports = { '@graphql-eslint/no-hashtag-description': 'warn', // Requires sname for your GraphQL operations. '@graphql-eslint/no-anonymous-operations': 'error', - "@graphql-eslint/naming-convention": [ - "error", + '@graphql-eslint/naming-convention': [ + 'error', { - "OperationDefinition": { - "style": "PascalCase", + OperationDefinition: { + style: 'PascalCase', // Make sure to not add the operation type to the name of the operation, e.g. 'user' instead of 'userQuery'. - "forbiddenPrefixes": ["Query", "Mutation", "Subscription", "Get"], - "forbiddenSuffixes": ["Query", "Mutation", "Subscription"] - } - } + forbiddenPrefixes: ['Query', 'Mutation', 'Subscription', 'Get'], + forbiddenSuffixes: ['Query', 'Mutation', 'Subscription'], + }, + }, ], // Requires all deprecation directives to specify a reason '@graphql-eslint/require-deprecation-reason': ['error'], @@ -92,10 +86,10 @@ module.exports = { '@graphql-eslint/require-description': [ 'warn', { - "types": true, - "FieldDefinition": true, - "ObjectTypeDefinition": true, - } + types: true, + FieldDefinition: true, + ObjectTypeDefinition: true, + }, ], // Checks for duplicate fields in selection set, variables in operation definition, or in arguments set of a field. '@graphql-eslint/no-duplicate-fields': ['error'], @@ -109,17 +103,13 @@ module.exports = { { files: ['*.tsx', '*.ts', '*.jsx', '*.js'], processor: '@graphql-eslint/graphql', - rules: { - // Workaround for for bug in prettier, can be removed after https://github.com/prettier/eslint-plugin-prettier/pull/415 - 'prettier/prettier': 0, - }, }, { files: ['*.ts', '*.vue'], // Parser supporting vue files parser: 'vue-eslint-parser', parserOptions: { - // Parser used for non-vue files and for the script tag in vue files + // Use ts parser for ts files and for the script tag in vue files parser: '@typescript-eslint/parser', // Correct root tsconfigRootDir: __dirname, diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 20cd7b49f..d1e5d6873 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,22 +1,21 @@ version: 2 updates: - # Fetch and update latest `npm` packages -- package-ecosystem: npm - directory: '/' - open-pull-requests-limit: 20 - schedule: - interval: "monthly" - labels: - - "type: dependencies" - - "status: safe to test" + - package-ecosystem: npm + directory: '/' + open-pull-requests-limit: 20 + schedule: + interval: 'monthly' + labels: + - 'type: dependencies' + - 'status: safe to test' -# Fetch and update latest `github-actions` pkgs -- package-ecosystem: github-actions - directory: '/' - open-pull-requests-limit: 20 - schedule: - interval: "monthly" - labels: - - "type: dependencies" - - "status: safe to test" + # Fetch and update latest `github-actions` pkgs + - package-ecosystem: github-actions + directory: '/' + open-pull-requests-limit: 20 + schedule: + interval: 'monthly' + labels: + - 'type: dependencies' + - 'status: safe to test' diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 9aa92b1c6..ba40f57af 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -41,12 +41,12 @@ jobs: with: azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_MANGO_PEBBLE_0224C3803 }} repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments) - action: "upload" + action: 'upload' ###### Repository/Build Configurations - These values can be configured to match your app requirements. ###### # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig - app_location: "/" # App source code path - api_location: ".output/server" # Api source code path - optional - output_location: ".output/public" # Built app content directory - optional + app_location: '/' # App source code path + api_location: '.output/server' # Api source code path - optional + output_location: '.output/public' # Built app content directory - optional ###### End of Repository/Build Configurations ###### env: DATABASE_URL: ${{ secrets.AZURE_TEST_DATABASE_URL }} @@ -60,7 +60,7 @@ jobs: runs-on: ubuntu-latest if: github.event_name == 'push' - + strategy: matrix: include: @@ -115,13 +115,13 @@ jobs: with: azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_MANGO_PEBBLE_0224C3803 }} repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments) - action: "upload" + action: 'upload' deployment_environment: ${{ matrix.deployment_environment }} ###### Repository/Build Configurations - These values can be configured to match your app requirements. ###### # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig - app_location: "/" # App source code path - api_location: ".output/server" # Api source code path - optional - output_location: ".output/public" # Built app content directory - optional + app_location: '/' # App source code path + api_location: '.output/server' # Api source code path - optional + output_location: '.output/public' # Built app content directory - optional ###### End of Repository/Build Configurations ###### - name: Run API tests @@ -129,9 +129,9 @@ jobs: close_pr_preview: name: Close PR preview - + if: github.event_name == 'pull_request_target' && github.event.action == 'closed' - + runs-on: ubuntu-latest steps: @@ -139,5 +139,4 @@ jobs: uses: Azure/static-web-apps-deploy@v1 with: azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_MANGO_PEBBLE_0224C3803 }} - action: "close" - + action: 'close' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 147d8d0fc..bf38e4eb5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,35 +13,35 @@ jobs: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Login to Azure - uses: Azure/login@v1 - with: - creds: ${{secrets.AZURE_CREDENTIALS}} - - - name: Start deployment (Staging server) - uses: bobheadxi/deployments@v1.3.0 - id: deployment - with: - step: start - token: ${{ secrets.GITHUB_TOKEN }} - env: Production - - - name: Swap staging > production slot - uses: azure/CLI@v1 - with: - inlineScript: | - az webapp deployment slot swap --name JabRef --resource-group JabRefOnline --slot staging --target-slot production --action swap - - - name: Update deployment status - uses: bobheadxi/deployments@v1.3.0 - if: always() - with: - step: finish - token: ${{ secrets.GITHUB_TOKEN }} - status: ${{ job.status }} - deployment_id: ${{ steps.deployment.outputs.deployment_id }} - env: ${{ steps.deployment.outputs.env }} - env_url: https://jabref.azurewebsites.net/ + - name: Checkout + uses: actions/checkout@v3 + + - name: Login to Azure + uses: Azure/login@v1 + with: + creds: ${{secrets.AZURE_CREDENTIALS}} + + - name: Start deployment (Staging server) + uses: bobheadxi/deployments@v1.3.0 + id: deployment + with: + step: start + token: ${{ secrets.GITHUB_TOKEN }} + env: Production + + - name: Swap staging > production slot + uses: azure/CLI@v1 + with: + inlineScript: | + az webapp deployment slot swap --name JabRef --resource-group JabRefOnline --slot staging --target-slot production --action swap + + - name: Update deployment status + uses: bobheadxi/deployments@v1.3.0 + if: always() + with: + step: finish + token: ${{ secrets.GITHUB_TOKEN }} + status: ${{ job.status }} + deployment_id: ${{ steps.deployment.outputs.deployment_id }} + env: ${{ steps.deployment.outputs.env }} + env_url: https://jabref.azurewebsites.net/ diff --git a/.gitpod.yml b/.gitpod.yml index 9c6348636..ddb21d355 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -67,5 +67,5 @@ ports: onOpen: open-preview # HMR websocket https://github.com/nuxt/framework/issues/1796#issuecomment-1111618663 # Still needs to be configured manually :( - - port: 24678 + - port: 24678 onOpen: ignore diff --git a/.storybook/main.cjs b/.storybook/main.cjs index 955747dec..b4c650a04 100644 --- a/.storybook/main.cjs +++ b/.storybook/main.cjs @@ -3,6 +3,6 @@ module.exports = { // Disable telemetry collection disableTelemetry: true, // Use vite as builder - builder: "@storybook/builder-vite" + builder: '@storybook/builder-vite', }, -}; +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 0a0269d37..b3d96e7ac 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,16 +1,16 @@ { - "recommendations": [ - "dbaeumer.vscode-eslint", - "github.copilot", - "streetsidesoftware.code-spell-checker", - "github.vscode-pull-request-github", - "eamodio.gitlens", - "graphql.vscode-graphql", - "orta.vscode-jest", - "esbenp.prettier-vscode", - "prisma.prisma", - "bradlc.vscode-tailwindcss", - "vue.volar", - "antfu.goto-alias" - ] + "recommendations": [ + "dbaeumer.vscode-eslint", + "github.copilot", + "streetsidesoftware.code-spell-checker", + "github.vscode-pull-request-github", + "eamodio.gitlens", + "graphql.vscode-graphql", + "orta.vscode-jest", + "esbenp.prettier-vscode", + "prisma.prisma", + "bradlc.vscode-tailwindcss", + "vue.volar", + "antfu.goto-alias" + ] } diff --git a/.vscode/launch.json b/.vscode/launch.json index a2310d66b..6fe203b1b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,10 +6,7 @@ "name": "vscode-jest-tests", "request": "launch", "program": "${workspaceFolder}/node_modules/.bin/jest", - "args": [ - "--runInBand", - "--watchAll=false" - ], + "args": ["--runInBand", "--watchAll=false"], "cwd": "${workspaceFolder}", "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", @@ -38,7 +35,7 @@ { "url": "webpack:///ignore/", "path": null - }, + } ] }, { @@ -59,9 +56,7 @@ "${workspaceFolder}/**", "!**/node_modules/**" ], - "args": [ - "dev" - ], + "args": ["dev"], "osx": { "program": "${workspaceFolder}/node_modules/.bin/nuxt" }, @@ -76,10 +71,7 @@ "compounds": [ { "name": "Fullstack: nuxt", - "configurations": [ - "Server: nuxt", - "Client: Firefox" - ] + "configurations": ["Server: nuxt", "Client: Firefox"] } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index e0f13a08c..608634dc6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -20,41 +20,29 @@ "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll.eslint": true - }, + } }, "[vue]": { "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll.eslint": true - }, + } }, "files.exclude": { "coverage": true }, "jest.jestCommandLine": "yarn test", - "eslint.validate": [ - "javascript", - "typescript", - "graphql", - "vue" - ], - "eslint.options": { - "extentions": [ - ".js", - ".graphql", - ".vue", - ] - }, + "eslint.validate": ["javascript", "typescript", "graphql", "vue"], "search.exclude": { "**/node_modules": true, "**/bower_components": true, "**/*.code-search": true, "**/coverage": true, "**/.output": true, - "**/.nuxt": true, + "**/.nuxt": true }, "vscode-graphql.useSchemaFileDefinitions": true, "yaml.schemas": { "https://json.schemastore.org/github-workflow.json": "/.github/workflows/*.yml" } -} \ No newline at end of file +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json index d984ebad3..2abb2c50c 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -5,7 +5,7 @@ "label": "Ensure dependencies", "type": "shell", "command": "yarn docker:redis", - "problemMatcher": [], + "problemMatcher": [] }, { "label": "Generate code", @@ -17,7 +17,7 @@ "runOn": "folderOpen" }, // Mark as a background task to avoid the spinner animation on the terminal tab - "isBackground": true, + "isBackground": true }, { "label": "Run dev server", @@ -29,7 +29,7 @@ "runOn": "folderOpen" }, // Mark as a background task to avoid the spinner animation on the terminal tab - "isBackground": true, + "isBackground": true }, { "label": "Prisma Studio", @@ -37,7 +37,7 @@ "command": "yarn prisma:studio", "problemMatcher": [], // Mark as a background task to avoid the spinner animation on the terminal tab - "isBackground": true, + "isBackground": true } ] } diff --git a/README.md b/README.md index 26a77eba9..ee8d967d6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # JabRefOnline ## Servers + - Production server: https://mango-pebble-0224c3803.1.azurestaticapps.net This server runs the last released version with data provided by the production database. - Staging server: https://mango-pebble-0224c3803-staging.westeurope.1.azurestaticapps.net @@ -14,6 +15,7 @@ Every pull request is deployed to a (temporary) server, which uses the same test data as the "Test server". ## Getting started + The simplest way to start is by [opening this project in Gitpod](https://gitpod.io/#https://github.com/JabRef/JabRefOnline/). - Install [Node.js](https://nodejs.org/) @@ -22,7 +24,7 @@ The simplest way to start is by [opening this project in Gitpod](https://gitpod. - Create a `.env` file in the root containing the connection URL for the database, e.g. `DATABASE_URL="postgresql://user:password@localhost:5432/jabref?schema=public"`. - Optional: Install and start [Redis](https://redis.io/). Perhaps the most straightforward way to do this is via Docker: `yarn docker:redis`. - If you do not use this command, make sure that Redis is available through the port `6380` or, alternatively, add the configuration `REDIS_PORT=` to the `.env` file. + If you do not use this command, make sure that Redis is available through the port `6380` or, alternatively, add the configuration `REDIS_PORT=` to the `.env` file. - Run `yarn install` to install all dependencies. - Run `yarn prisma:migrate:dev` to initialize the database. You may also want to use `yarn prisma:seed` to fill the database with some initial test data. @@ -31,20 +33,19 @@ Now you can start the server by using `yarn dev`. If you use Visual Studio Code, you might also want to activate automatic tasks which would then be run whenever you open the project and run the usual commands to get you running in no time. For this, open the command palette (Shift + Cmd + P) and choose "Tasks: Manage Automatic Tasks in Folder". Then accept "Allow Automatic Tasks in Folder". -Now close and re-open the workspace. +Now close and re-open the workspace. ## Commands -| Command | Description | -|---------|-------------| -| yarn install | Install project dependencies and generate code. | -| yarn dev | Start ExpressJS server in development with Nuxt.js in dev mode with hot reloading enabled. Listen on [http://localhost:3000](http://localhost:3000). The GraphQL API is then accessible at [http://localhost:3000/api](http://localhost:3000/api) | -| yarn test | Execute all tests. Pass `-u` to update all Jest snapshots.| -| yarn build | Build the nuxt.js web application for production. | -| yarn start | Start ExpressJS server (for testing purposes). | -| yarn prisma:studio | Explore data in the database using a visual editor. | -| yarn storybook | Start [Storybook](#ui-workflow-storybook) in your browser. | - +| Command | Description | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| yarn install | Install project dependencies and generate code. | +| yarn dev | Start ExpressJS server in development with Nuxt.js in dev mode with hot reloading enabled. Listen on [http://localhost:3000](http://localhost:3000). The GraphQL API is then accessible at [http://localhost:3000/api](http://localhost:3000/api) | +| yarn test | Execute all tests. Pass `-u` to update all Jest snapshots. | +| yarn build | Build the nuxt.js web application for production. | +| yarn start | Start ExpressJS server (for testing purposes). | +| yarn prisma:studio | Explore data in the database using a visual editor. | +| yarn storybook | Start [Storybook](#ui-workflow-storybook) in your browser. | ### Workflow for editing the database schema @@ -56,24 +57,28 @@ Now close and re-open the workspace. See [Prisma documentation](https://www.prisma.io/docs/guides/application-lifecycle/prototyping-schema-db-push) for more details. ### UI workflow: Storybook + As the primary UI development flow, we use Storybook which allows developing UI components in isolation without the need to start the whole application. Storybook uses so-called stories. Each story represents a single visual state of a component. For each component its stories should be placed in the same directory, with the suffix `.stories.ts` appended. -For example, +For example, + ``` components │ Button.vue │ Button.stories.ts ``` + To start developing with Storybook, simply run `yarn storybook`, which opens Storybook in the browser. An up-to-date version of all Storybook components can be found [online](https://www.chromatic.com/library?appId=61142988527d34003b1e783d&branch=main). ## Backend: Overall Structure + - `Resolver` aggregates the data, and transforms in a representation suitable for the domain layer. - `Service` performs input validation, authorization, sorting, and implements the business logic. -- Data layer is handled by Prisma. +- Data layer is handled by Prisma. ## Directories @@ -82,38 +87,41 @@ An up-to-date version of all Storybook components can be found [online](https:// - `components` is where we put all our Vue.js components which are then imported into the pages. - `layouts` contains the layouts that determine the look and feel. [Nuxt documentation](https://nuxtjs.org/docs/2.x/directory-structure/layouts). - `middleware` defines custom functions that are run before rendering either a page or a group of pages. [Nuxt documentation](https://nuxtjs.org/docs/2.x/directory-structure/middleware). -- `pages` contains the application's views and routes. Nuxt reads all the `*.vue` files inside this directory and creates the router of your application. +- `pages` contains the application's views and routes. Nuxt reads all the `*.vue` files inside this directory and creates the router of your application. - `plugins` contains Javascript plugins that are run before mounting the root Vue.js application. [Nuxt documentation](https://nuxtjs.org/guide/plugins). - `static` is directly mapped to the server root and contains files that have to keep their names (e.g. robots.txt) or likely won't change (e.g. the favicon). Files in this folder are not processed by webpack. - `store` contains Vuex Store files. [Nuxt documentation](https://nuxtjs.org/guide/vuex-store). ## Recommended VS Code and Browser extensions + - [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar): Add syntax highlighting and other tooling for Vue. It is also recommended to activate the [takeover mode](https://vuejs.org/guide/typescript/overview.html#takeover-mode). -- [Prisma](https://marketplace.visualstudio.com/items?itemName=Prisma.prisma): Add syntax highlighting, formatting, jump-to-definition and linting for Prisma Schema files. +- [Prisma](https://marketplace.visualstudio.com/items?itemName=Prisma.prisma): Add syntax highlighting, formatting, jump-to-definition and linting for Prisma Schema files. - [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode): Format code and enforces consistent style. - [EditorConfig](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig): Override user/workspace VS Code settings with the provided settings in `.editorconfig`. - [Tailwind CSS](https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss): IntelliSense enhancement to support Tailwind. - [Jest](https://marketplace.visualstudio.com/items?itemName=Orta.vscode-jest): Add integration of Jest, e.g. easy debugging of tests. - [GraphQL](https://marketplace.visualstudio.com/items?itemName=GraphQL.vscode-graphql): Add syntax highlighting and IntelliSense for GraphQL. -- Debugger for [Firefox](https://marketplace.visualstudio.com/items?itemName=firefox-devtools.vscode-firefox-debug) or [Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome): Allow debugging web applications from within VS Code. +- Debugger for [Firefox](https://marketplace.visualstudio.com/items?itemName=firefox-devtools.vscode-firefox-debug) or [Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome): Allow debugging web applications from within VS Code. - Vue.js devtools: Browser integration for debugging and investigation for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/) -- Apollo Client Devtools: Debug and analyze GraphQL on the client side for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/apollo-developer-tools/) +- Apollo Client Devtools: Debug and analyze GraphQL on the client side for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/apollo-developer-tools/) ## Technologies used + - [Vue.js](https://vuejs.org/): UI framework [Documentation](https://vuejs.org/v2/guide/) - [NuxtJS](https://nuxtjs.org/): Vue framework [Documentation](https://nuxtjs.org/docs/2.x/get-started/installation) - [Prisma](https://www.prisma.io/): [Documentation](https://www.prisma.io/docs/) - Graphql: - - [GraphQL code generator](https://graphql-code-generator.com/): [Documentation](https://graphql-code-generator.com/docs/getting-started/index) - - [Vue Apollo](https://apollo.vuejs.org/): Graphql integration for Vue [Documentation](https://v4.apollo.vuejs.org/guide-option/) -- [Tailwind CSS](https://tailwindcss.com/): CSS framework [Documentation](https://tailwindcss.com/docs), including [Vue Tailwind](https://www.vue-tailwind.com/docs/installation) to extract reusable components + - [GraphQL code generator](https://graphql-code-generator.com/): [Documentation](https://graphql-code-generator.com/docs/getting-started/index) + - [Vue Apollo](https://apollo.vuejs.org/): Graphql integration for Vue [Documentation](https://v4.apollo.vuejs.org/guide-option/) +- [Tailwind CSS](https://tailwindcss.com/): CSS framework [Documentation](https://tailwindcss.com/docs), including [Vue Tailwind](https://www.vue-tailwind.com/docs/installation) to extract reusable components - [Font Awesome](https://fontawesome.com/icons?d=gallery&p=2): Font-based icons - [Storybook](https://storybook.js.org/): Visual testing ## Conventions + - Vue: Single File Components are used for all components, with a PascalCase name. - Tests are placed next to the file containing the code-under-test, and have the same file name with a `.spec.ts` suffix added. - For example, + For example, ``` api │ Resolver.ts @@ -121,6 +129,7 @@ An up-to-date version of all Storybook components can be found [online](https:// ``` ## References + - Prisma used in different contexts: https://github.com/prisma/prisma-examples - Example application using Prisma and Apollo: https://github.com/poulainv/tottem - Example application using Nuxt: https://github.com/gyarasu/nuxt-full-stack-template @@ -131,4 +140,5 @@ An up-to-date version of all Storybook components can be found [online](https:// - Best practices: [Node](https://github.com/goldbergyoni/nodebestpractices) ## Sponsors + Thanks to [Chromatic](https://www.chromatic.com/) for providing the visual testing platform that helps us review UI changes and catch visual regressions. diff --git a/apollo/apollo-server.ts b/apollo/apollo-server.ts index af1127822..0d9c28202 100644 --- a/apollo/apollo-server.ts +++ b/apollo/apollo-server.ts @@ -1,12 +1,12 @@ -import type { LandingPage } from 'apollo-server-plugin-base' -import { useBody, useQuery, CompatibilityEvent, EventHandler } from 'h3' import type { GraphQLOptions } from 'apollo-server-core' import { ApolloServerBase, convertNodeHttpToRequest, - runHttpQuery, isHttpQueryError, + runHttpQuery, } from 'apollo-server-core' +import type { LandingPage } from 'apollo-server-plugin-base' +import { CompatibilityEvent, EventHandler, useBody, useQuery } from 'h3' // Manually specify CORS options as long as h3 doesn't suppor this natively // https://github.com/unjs/h3/issues/82 diff --git a/apollo/cache.ts b/apollo/cache.ts index e633e11d0..18456aa35 100644 --- a/apollo/cache.ts +++ b/apollo/cache.ts @@ -1,8 +1,8 @@ import { InMemoryCache } from '@apollo/client/core' import { relayStylePagination } from '@apollo/client/utilities/policies/pagination' -import { MeQuery } from './graphql' -import { gql } from '.' import introspection from '~/apollo/introspection' +import { gql } from '.' +import { MeQuery } from './graphql' export const cache = new InMemoryCache({ typePolicies: { diff --git a/components/t-alert.stories.ts b/components/t-alert.stories.ts index 779a7154a..e90f5ccb4 100644 --- a/components/t-alert.stories.ts +++ b/components/t-alert.stories.ts @@ -1,4 +1,4 @@ -import { Story, Meta } from '@storybook/vue3' +import { Meta, Story } from '@storybook/vue3' import { TAlert } from '@variantjs/vue' export default { diff --git a/components/t-button.stories.ts b/components/t-button.stories.ts index df9141455..d618846ea 100644 --- a/components/t-button.stories.ts +++ b/components/t-button.stories.ts @@ -1,4 +1,4 @@ -import { Story, Meta } from '@storybook/vue3' +import { Meta, Story } from '@storybook/vue3' import { TButton } from '@variantjs/vue' export default { diff --git a/components/t-checkbox.stories.ts b/components/t-checkbox.stories.ts index e4e9e97ec..7bf13c62c 100644 --- a/components/t-checkbox.stories.ts +++ b/components/t-checkbox.stories.ts @@ -1,4 +1,4 @@ -import { Story, Meta } from '@storybook/vue3' +import { Meta, Story } from '@storybook/vue3' import { TCheckbox } from '@variantjs/vue' export default { diff --git a/components/t-dropdown.stories.ts b/components/t-dropdown.stories.ts index 77e405c08..056f39279 100644 --- a/components/t-dropdown.stories.ts +++ b/components/t-dropdown.stories.ts @@ -1,4 +1,4 @@ -import { Story, Meta } from '@storybook/vue3' +import { Meta, Story } from '@storybook/vue3' import { TDropdown } from '@variantjs/vue' export default { diff --git a/components/t-input-group.stories.ts b/components/t-input-group.stories.ts index 6a6967ae3..ae47a2c35 100644 --- a/components/t-input-group.stories.ts +++ b/components/t-input-group.stories.ts @@ -1,4 +1,4 @@ -import { Story, Meta } from '@storybook/vue3' +import { Meta, Story } from '@storybook/vue3' import { TInputGroup } from '@variantjs/vue' export default { diff --git a/components/t-input.stories.ts b/components/t-input.stories.ts index 0fd3b77a5..b12039816 100644 --- a/components/t-input.stories.ts +++ b/components/t-input.stories.ts @@ -1,4 +1,4 @@ -import { Story, Meta } from '@storybook/vue3' +import { Meta, Story } from '@storybook/vue3' import { TInput } from '@variantjs/vue' export default { diff --git a/components/t-nuxtlink.stories.ts b/components/t-nuxtlink.stories.ts index 7066c6248..460ae0a7b 100644 --- a/components/t-nuxtlink.stories.ts +++ b/components/t-nuxtlink.stories.ts @@ -1,4 +1,4 @@ -import { Story, Meta } from '@storybook/vue3' +import { Meta, Story } from '@storybook/vue3' import { TButton } from '@variantjs/vue' export default { diff --git a/components/t-select.stories.ts b/components/t-select.stories.ts index 8e7256101..8a5274ee4 100644 --- a/components/t-select.stories.ts +++ b/components/t-select.stories.ts @@ -1,4 +1,4 @@ -import { Story, Meta } from '@storybook/vue3' +import { Meta, Story } from '@storybook/vue3' import { TSelect } from '@variantjs/vue' export default { diff --git a/components/t-table.stories.ts b/components/t-table.stories.ts index a28d10638..a476bf43c 100644 --- a/components/t-table.stories.ts +++ b/components/t-table.stories.ts @@ -1,4 +1,4 @@ -import { Story, Meta } from '@storybook/vue3' +import { Meta, Story } from '@storybook/vue3' import TTable from '~/components/TTable.vue' export default { diff --git a/components/t-tag.stories.ts b/components/t-tag.stories.ts index 1f2e50100..d7574e674 100644 --- a/components/t-tag.stories.ts +++ b/components/t-tag.stories.ts @@ -1,4 +1,4 @@ -import { Story, Meta } from '@storybook/vue3' +import { Meta, Story } from '@storybook/vue3' import { TTag } from '@variantjs/vue' export default { diff --git a/components/t-textarea.stories.ts b/components/t-textarea.stories.ts index d375e4463..0a522801e 100644 --- a/components/t-textarea.stories.ts +++ b/components/t-textarea.stories.ts @@ -1,4 +1,4 @@ -import { Story, Meta } from '@storybook/vue3' +import { Meta, Story } from '@storybook/vue3' import { TTextarea } from '@variantjs/vue' export default { diff --git a/components/tagify.vue b/components/tagify.vue index ed127c207..51f312e10 100644 --- a/components/tagify.vue +++ b/components/tagify.vue @@ -51,6 +51,7 @@ export default defineComponent({ watch: { value(newVal, _oldVal) { // Value modified externally, update tagify + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument this.tagify?.loadOriginalValues(newVal) }, }, diff --git a/docs/technology-api.md b/docs/technology-api.md index da62d2ae5..1b2e69bb0 100644 --- a/docs/technology-api.md +++ b/docs/technology-api.md @@ -3,15 +3,19 @@ [Apollo Documentation](https://www.apollographql.com/docs/) # Considered Alternatives + - Rest # Implementation: GraphQL.js with GraphQL Code Generator + Considered options: + - GraphQL.js with and without GraphQL Code Generator - TypeGraphQL - GraphQL Nexus - - `-` [Future of Nexus Prisma Plugin unclear](https://github.com/graphql-nexus/nexus-plugin-prisma/issues/1039) + - `-` [Future of Nexus Prisma Plugin unclear](https://github.com/graphql-nexus/nexus-plugin-prisma/issues/1039) Reference: + - [Comparison of GraphQL.js vs. TypeGraphQL vs. GraphQL Nexus](https://medium.com/swlh/graphql-js-vs-typegraphql-vs-graphql-nexus-2a8036deb851): Recommends GraphQL.js with GraphQL Code Generator - [How Prisma and GraphQL fit together](https://www.prisma.io/graphql) diff --git a/docs/technology-backend.md b/docs/technology-backend.md index 63cce598f..51ab5a2ca 100644 --- a/docs/technology-backend.md +++ b/docs/technology-backend.md @@ -1,10 +1,11 @@ # NodeJS with Express.js -- `+` Full js stack: common language makes it easier to work on, code reuse, most-used programming language +- `+` Full js stack: common language makes it easier to work on, code reuse, most-used programming language - `-` Harder to integrate with ML models (although there is https://blog.tensorflow.org/2020/01/run-tensorflow-savedmodel-in-nodejs-directly-without-conversion.html and https://gist.github.com/zcaceres/4cc1afb1d3b7550aeffec898967bd56c) - `-` Not best for computation-heavy back end processes (but these should be rare for us) - Node best practices: https://github.com/goldbergyoni/nodebestpractices + Node best practices: https://github.com/goldbergyoni/nodebestpractices # Considered alternatives + - Rust - Django or Flask (better ML integration) diff --git a/docs/technology-database.md b/docs/technology-database.md index ee43f049d..cae3e85d1 100644 --- a/docs/technology-database.md +++ b/docs/technology-database.md @@ -1,7 +1,8 @@ # PostgreSQL with Prisma as ORM + - Why PostgreSQL? https://www.prisma.io/dataguide/postgresql/benefits-of-postgresql - Why Prisma? Strong typing - # Considered Alternatives + - Mongodb + Mongoose diff --git a/docs/technology-frontend.md b/docs/technology-frontend.md index e4b71b013..dece79542 100644 --- a/docs/technology-frontend.md +++ b/docs/technology-frontend.md @@ -10,5 +10,6 @@ - `-` React has better typescript support (but better TS support is coming with Vue 3) # Considered Alternatives + - [React](https://reactjs.org/) - Example: https://github.com/karlhadwen/todoist diff --git a/graphql.config.json b/graphql.config.json index 0d64f4d74..00e6a172f 100644 --- a/graphql.config.json +++ b/graphql.config.json @@ -1,53 +1,48 @@ { - "schema":"server/**/*.graphql", + "schema": "server/**/*.graphql", "extensions": { "codegen": { - "overwrite":true, - "generates":{ - "server/graphql.ts":{ - "config":{ - "mapperTypeSuffix":"Model", - "contextType":"./context#Context", - "mappers":{ - "User":"@prisma/client/index.d#User", - "Document":"./documents/user.document.service#UserDocument", - "JournalArticle":"./documents/user.document.service#UserDocument", - "ProceedingsArticle":"./documents/user.document.service#UserDocument", - "Thesis":"./documents/user.document.service#UserDocument", - "Other":"./documents/user.document.service#UserDocument", - "Group":"./groups/resolvers#GroupMaybeResolved" + "overwrite": true, + "generates": { + "server/graphql.ts": { + "config": { + "mapperTypeSuffix": "Model", + "contextType": "./context#Context", + "mappers": { + "User": "@prisma/client/index.d#User", + "Document": "./documents/user.document.service#UserDocument", + "JournalArticle": "./documents/user.document.service#UserDocument", + "ProceedingsArticle": "./documents/user.document.service#UserDocument", + "Thesis": "./documents/user.document.service#UserDocument", + "Other": "./documents/user.document.service#UserDocument", + "Group": "./groups/resolvers#GroupMaybeResolved" }, - "scalars":{ - "Date":"string", - "DateTime":"Date", - "EmailAddress":"string" + "scalars": { + "Date": "string", + "DateTime": "Date", + "EmailAddress": "string" } }, - "plugins":[ - "typescript", - "typescript-resolvers" - ] + "plugins": ["typescript", "typescript-resolvers"] }, - "apollo":{ - "documents":[ + "apollo": { + "documents": [ "./pages/**/*.vue", "./components/**/*.vue", "./plugins/**/*.ts", "./apollo/cache.ts" ], - "preset":"gql-tag-operations-preset", - "config":{ - "scalars":{ - "Date":"Date", - "DateTime":"Date", - "EmailAddress":"string" + "preset": "gql-tag-operations-preset", + "config": { + "scalars": { + "Date": "Date", + "DateTime": "Date", + "EmailAddress": "string" } } }, - "apollo/introspection.ts":{ - "plugins":[ - "fragment-matcher" - ] + "apollo/introspection.ts": { + "plugins": ["fragment-matcher"] } } } diff --git a/jest.config.ts b/jest.config.ts index c37cfb9a4..27139e6ab 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -26,7 +26,7 @@ const config: Config.InitialOptions = { 'ts-jest': { useESM: true }, }, // GitHub Actions Reporter will annotate changed files with test failure messages on PRs - reporters: ["default", "github-actions"], + reporters: ['default', 'github-actions'], } export default config diff --git a/modules/graphql.mjs b/modules/graphql.mjs index 0747968d6..114df4ca3 100644 --- a/modules/graphql.mjs +++ b/modules/graphql.mjs @@ -1,7 +1,7 @@ +import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader' +import { loadSchema as loadGraphqlSchema } from '@graphql-tools/load' import { defineNuxtModule } from '@nuxt/kit' import { printSchema } from 'graphql' -import { loadSchema as loadGraphqlSchema } from '@graphql-tools/load' -import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader' // WARNING: This is a duplicate of the function with the same name defined in server/schema // Due to how nuxt/kit works, we have to define the module as a mjs file instead of ts (otherwise it resolves imports as cjs) @@ -11,7 +11,7 @@ import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader' * This method should not be used in production, since the graphql files are not deployed. * @returns the GraphQL schema */ - export async function loadSchemaFromFiles()/*: Promise*/ { +export async function loadSchemaFromFiles() /*: Promise*/ { return await loadGraphqlSchema('./server/**/*.graphql', { loaders: [new GraphQLFileLoader()], }) diff --git a/modules/storybook.ts b/modules/storybook.ts index 8db4e19b9..39e4d9fe0 100644 --- a/modules/storybook.ts +++ b/modules/storybook.ts @@ -59,7 +59,7 @@ configure(() => { }) */ nuxt.hook('listen', (_, listener) => { - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument const fullPath = `${withoutTrailingSlash(listener.url)}${path}` logger.info(`Storybook: ${chalk.underline.yellow(fullPath)}`) }) diff --git a/package.json b/package.json index 7311bc9f2..1da81e7db 100644 --- a/package.json +++ b/package.json @@ -30,8 +30,9 @@ "graphql:generate:watch": "graphql-codegen-esm --watch", "graphql:validate": "graphql-inspector validate --apollo '{pages,components}/**/*.vue' 'server/**/*.graphql'", "docker:redis": "docker run -d --rm --name JabRefRedis -p 6380:6379 redis --requirepass jabref", - "lint": "yarn lint:js && yarn lint:graphql", + "lint": "yarn lint:js && yarn lint:prettier && yarn lint:graphql", "lint:js": "eslint --ext .ts,.js,.vue --ignore-path .gitignore .", + "lint:prettier": "prettier --check --ignore-path .gitignore .", "lint:graphql": "eslint --ext .graphql,.vue --ignore-path .gitignore .", "postinstall": "patch-package && yarn generate && nuxi prepare", "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --runInBand", @@ -65,8 +66,7 @@ "body-scroll-lock": "^4.0.0-beta.0", "connect-redis": "^6.1.3", "cross-fetch": "^3.1.5", - "eslint-plugin-jest": "^26.8.2", - "eslint-plugin-prettier-vue": "^4.2.0", + "eslint-plugin-jest": "^26.8.3", "express": "^4.18.1", "express-session": "^1.17.3", "graphql": "^16.5.0", @@ -97,8 +97,8 @@ "@graphql-inspector/cli": "^3.3.0", "@graphql-typed-document-node/core": "^3.1.1", "@nuxt/postcss8": "^1.1.3", - "@nuxtjs/eslint-config": "^6.0.1", - "@nuxtjs/eslint-config-typescript": "^6.0.1", + "@nuxtjs/eslint-config": "^10.0.0", + "@nuxtjs/eslint-config-typescript": "^10.0.0", "@nuxtjs/eslint-module": "^3.1.0", "@nuxtjs/tailwindcss": "5.3.1", "@storybook/builder-vite": "^0.1.38", @@ -116,6 +116,9 @@ "@types/redis-mock": "^0.17.1", "@types/uuid": "^8.3.4", "@types/yaireo__tagify": "^4.15.1", + "@typescript-eslint/eslint-plugin": "^5.33.1", + "@typescript-eslint/parser": "^5.33.1", + "@volar/vue-typescript": "^0.40.1", "@vue/compiler-sfc": "^3.2.37", "@vue/runtime-dom": "^3.2.37", "@vue/test-utils": "^2.0.0", @@ -124,11 +127,10 @@ "chromatic": "^6.7.4", "concurrently": "^7.3.0", "cross-env": "^7.0.3", - "eslint": "^7.32.0", + "eslint": "^8.22.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-nuxt": "^3.2.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-unused-imports": "^1.1.5", + "eslint-plugin-unused-imports": "^2.0.0", "eslint-plugin-vue": "^9.3.0", "jest": "^28.1.3", "jest-mock-extended": "^2.0.7", @@ -140,7 +142,7 @@ "postcss-custom-properties": "^12.1.7", "postinstall-postinstall": "^2.1.0", "prettier": "^2.7.1", - "prettier-plugin-organize-imports": "^3.0.3", + "prettier-plugin-organize-imports": "^3.1.0", "prisma": "4.2.1", "redis-mock": "^0.56.3", "ts-jest": "^28.0.7", diff --git a/plugins/apollo.ts b/plugins/apollo.ts index fa9a1be0f..49a856852 100644 --- a/plugins/apollo.ts +++ b/plugins/apollo.ts @@ -1,10 +1,10 @@ import { ApolloClient, HttpLink } from '@apollo/client/core' -import fetch from 'cross-fetch' import { onError } from '@apollo/client/link/error' -import { logErrorMessages } from '@vue/apollo-util' import { DefaultApolloClient } from '@vue/apollo-composable' -import { cache } from '../apollo/cache' +import { logErrorMessages } from '@vue/apollo-util' +import fetch from 'cross-fetch' import { Environment } from '~/config' +import { cache } from '../apollo/cache' export default defineNuxtPlugin((nuxtApp) => { if (!nuxtApp) { diff --git a/plugins/fontawesome.ts b/plugins/fontawesome.ts index a896e4226..d098e753a 100644 --- a/plugins/fontawesome.ts +++ b/plugins/fontawesome.ts @@ -1,6 +1,6 @@ -import { library, config } from '@fortawesome/fontawesome-svg-core' -import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' +import { config, library } from '@fortawesome/fontawesome-svg-core' import { fas } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' // Do not add css to pages, since this is done by Nuxt config.autoAddCss = false diff --git a/plugins/tailwind.ts b/plugins/tailwind.ts index 165a4cde1..6ab8c51f9 100644 --- a/plugins/tailwind.ts +++ b/plugins/tailwind.ts @@ -186,14 +186,18 @@ const settings: VariantJSConfiguration = { }, }, TSelect: { - fixedClasses: 'bg-none block w-full py-2 pl-2 pr-6 transition duration-100 ease-in-out border rounded shadow-sm focus:ring-2 focus:ring-highlight-500 focus:outline-none focus:ring-opacity-50 disabled:opacity-50 disabled:cursor-not-allowed', - classes: 'text-black placeholder-gray-400 bg-white border-gray-300 focus:border-highlight-500 sm:text-sm', + fixedClasses: + 'bg-none block w-full py-2 pl-2 pr-6 transition duration-100 ease-in-out border rounded shadow-sm focus:ring-2 focus:ring-highlight-500 focus:outline-none focus:ring-opacity-50 disabled:opacity-50 disabled:cursor-not-allowed', + classes: + 'text-black placeholder-gray-400 bg-white border-gray-300 focus:border-highlight-500 sm:text-sm', variants: { plain: { - classes: 'shadow-none placeholder-gray-400 bg-white border-transparent focus:bg-white focus:border-highlight-500 hover:bg-gray-50 hover:border-gray-300 cursor-pointer sm:text-sm', + classes: + 'shadow-none placeholder-gray-400 bg-white border-transparent focus:bg-white focus:border-highlight-500 hover:bg-gray-50 hover:border-gray-300 cursor-pointer sm:text-sm', }, plaincaps: { - classes: 'text-current shadow-none placeholder-gray-400 bg-white border-transparent focus:bg-white focus:border-highlight-500 hover:bg-gray-50 hover:border-gray-300 cursor-pointer uppercase text-gray-600 tracking-wider focus-within:text-black sm:text-xs', + classes: + 'text-current shadow-none placeholder-gray-400 bg-white border-transparent focus:bg-white focus:border-highlight-500 hover:bg-gray-50 hover:border-gray-300 cursor-pointer uppercase text-gray-600 tracking-wider focus-within:text-black sm:text-xs', }, }, }, diff --git a/renovate.json b/renovate.json index 217d82177..9cfbe6625 100644 --- a/renovate.json +++ b/renovate.json @@ -1,5 +1,3 @@ { - "extends": [ - "@nuxtjs" - ] + "extends": ["@nuxtjs"] } diff --git a/server/database/seed.ts b/server/database/seed.ts index 166c4f7f4..78514d2b8 100644 --- a/server/database/seed.ts +++ b/server/database/seed.ts @@ -1,5 +1,6 @@ -import prisma from '@prisma/client' import type { PrismaClient as PrismaClientT } from '@prisma/client' +// eslint-disable-next-line import/default +import prisma from '@prisma/client' const { PrismaClient, GroupType, GroupHierarchyType } = prisma async function seedInternal(prisma: PrismaClientT): Promise { diff --git a/server/database/truncate.ts b/server/database/truncate.ts index 6a9e8050b..e8b613c29 100644 --- a/server/database/truncate.ts +++ b/server/database/truncate.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line import/default import prismaClient from '@prisma/client' import { seed } from './seed' diff --git a/server/database/util.ts b/server/database/util.ts index e881c7dd4..a8e0adcb6 100644 --- a/server/database/util.ts +++ b/server/database/util.ts @@ -1,2 +1,2 @@ -export { resetToSeed } from './truncate' export { disconnect } from './disconnect' +export { resetToSeed } from './truncate' diff --git a/server/documents/integration.test.ts b/server/documents/integration.test.ts index 33373464f..06e139137 100644 --- a/server/documents/integration.test.ts +++ b/server/documents/integration.test.ts @@ -1,6 +1,6 @@ import { gql } from 'apollo-server-express' -import { createAuthenticatedClient } from '../../test/apollo.server' import * as prisma from '~/server/database/util' +import { createAuthenticatedClient } from '../../test/apollo.server' const authenticatedClient = await createAuthenticatedClient() diff --git a/server/documents/resolvers.spec.ts b/server/documents/resolvers.spec.ts index a42b66648..8d4c45502 100644 --- a/server/documents/resolvers.spec.ts +++ b/server/documents/resolvers.spec.ts @@ -1,9 +1,9 @@ -import mocking from 'jest-mock-extended' import { UserDocument } from '@prisma/client' +import mocking from 'jest-mock-extended' +import { createUnauthenticatedContext } from '~/test/context.helper' import { register, resolve } from '../tsyringe' -import { UserDocumentService } from './user.document.service' import { DocumentResolver } from './resolvers' -import { createUnauthenticatedContext } from '~/test/context.helper' +import { UserDocumentService } from './user.document.service' const userDocumentService = mocking.mock() register('UserDocumentService', { useValue: userDocumentService }) diff --git a/server/documents/resolvers.ts b/server/documents/resolvers.ts index 3bf0d15dc..6bccedc8a 100644 --- a/server/documents/resolvers.ts +++ b/server/documents/resolvers.ts @@ -4,20 +4,20 @@ import { AddJournalArticleInput, AddProceedingsArticleInput, AddThesisInput, - Resolvers, + AddUserDocumentInput, + DocumentResolvers, + Institution, + JournalIssue, MutationAddUserDocumentArgs, MutationUpdateUserDocumentArgs, Person, QueryUserDocumentArgs, - Institution, - DocumentResolvers, - JournalIssue, - AddUserDocumentInput, + Resolvers, UpdateUserDocumentInput, } from '../graphql' import { ResolveType } from '../utils/extractResolveType' -import { resolve, injectable, inject } from './../tsyringe' -import { UserDocumentService, UserDocument } from './user.document.service' +import { inject, injectable, resolve } from './../tsyringe' +import { UserDocument, UserDocumentService } from './user.document.service' // Fields that are stored as separate columns in the database const specialFields: string[] = [ diff --git a/server/documents/user.document.service.spec.ts b/server/documents/user.document.service.spec.ts index 0dc726fae..3215d4cb4 100644 --- a/server/documents/user.document.service.spec.ts +++ b/server/documents/user.document.service.spec.ts @@ -1,5 +1,5 @@ -import { mockDeep, mockReset } from 'jest-mock-extended' import type { PrismaClient } from '@prisma/client' +import { mockDeep, mockReset } from 'jest-mock-extended' import { register, resolve } from '../tsyringe' import { UserDocument } from './user.document.service' diff --git a/server/documents/user.document.service.ts b/server/documents/user.document.service.ts index 5519f257c..1a50a0397 100644 --- a/server/documents/user.document.service.ts +++ b/server/documents/user.document.service.ts @@ -1,11 +1,11 @@ import type { - PrismaClient, - UserDocument as PlainUserDocument, + Journal, + JournalIssue, Prisma, + PrismaClient, User, + UserDocument as PlainUserDocument, UserDocumentOtherField, - JournalIssue, - Journal, } from '@prisma/client' import { DocumentFilters, UserDocumentsConnection } from '../graphql' import { inject, injectable } from './../tsyringe' diff --git a/server/groups/resolvers.ts b/server/groups/resolvers.ts index 5367465b9..b3cf7c9aa 100644 --- a/server/groups/resolvers.ts +++ b/server/groups/resolvers.ts @@ -1,14 +1,15 @@ +import type { Group, GroupType as GroupTypeT } from '@prisma/client' import { UserInputError } from 'apollo-server-errors' +// eslint-disable-next-line import/default import prisma from '@prisma/client' -import type { Group, GroupType as GroupTypeT } from '@prisma/client' import { Context } from '../context' import { - Resolvers, - QueryGroupArgs, - MutationUpdateGroupArgs, MutationCreateGroupArgs, + MutationUpdateGroupArgs, + QueryGroupArgs, + Resolvers, } from '../graphql' -import { resolve, injectable, inject } from './../tsyringe' +import { inject, injectable, resolve } from './../tsyringe' import { GroupService } from './service' const { GroupType, GroupHierarchyType } = prisma diff --git a/server/index.ts b/server/index.ts index 4268994ee..660bb8a7f 100644 --- a/server/index.ts +++ b/server/index.ts @@ -1,10 +1,10 @@ -import 'reflect-metadata' // Needed for tsyringe -import http from 'http' -import { ApolloServerPluginLandingPageLocalDefault } from 'apollo-server-core' import { InMemoryLRUCache } from '@apollo/utils.keyvaluecache' +import { ApolloServerPluginLandingPageLocalDefault } from 'apollo-server-core' +import http from 'http' +import 'reflect-metadata' // Needed for tsyringe +import { ApolloServer } from '~/apollo/apollo-server' import { buildContext } from './context' import { loadSchemaWithResolvers } from './schema' -import { ApolloServer } from '~/apollo/apollo-server' // Workaround for issue with Azure deploy: https://github.com/unjs/nitro/issues/351 // Original code taken from https://github.com/nodejs/node/blob/main/lib/_http_outgoing.js diff --git a/server/middleware/auth.ts b/server/middleware/auth.ts index fe6021567..cbd633e2e 100644 --- a/server/middleware/auth.ts +++ b/server/middleware/auth.ts @@ -1,6 +1,6 @@ import 'reflect-metadata' // Needed for tsyringe -import { configure as configureTsyringe } from './../tsyringe.config' import { resolve } from './../tsyringe' +import { configure as configureTsyringe } from './../tsyringe.config' export default defineLazyEventHandler(async () => { await configureTsyringe() diff --git a/server/postman/TestSuite.json b/server/postman/TestSuite.json index d6a6b6755..2d8e36c7c 100644 --- a/server/postman/TestSuite.json +++ b/server/postman/TestSuite.json @@ -1,168 +1,157 @@ { - "info": { - "_postman_id": "26eecc85-cfa1-4371-99ce-85514904ed76", - "name": "Test suite", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + "info": { + "_postman_id": "26eecc85-cfa1-4371-99ce-85514904ed76", + "name": "Test suite", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "mutations", + "item": [] }, - "item": [ + { + "name": "queries", + "item": [ { - "name": "mutations", - "item": [] - }, - { - "name": "queries", - "item": [ - { - "name": "Login", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Returns user id\", function () {\r", - " var jsonData = pm.response.json();\r", - " pm.expect(jsonData.data).to.eql({login: {user: {id: \"ckn4oul7100004cv7y3t94n8j\"}}});\r", - "});\r", - "\r", - "pm.test(\"Sets cookie\", function () {\r", - " pm.expect(pm.cookies.has('session')).to.be.true;\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "graphql", - "graphql": { - "query": "mutation Mutation($email: EmailAddress!, $password: String!) { login(email: $email, password: $password) {... on UserReturned {user {id}}}}", - "variables": "{\n \"email\": \"alice@jabref.de\",\"password\": \"EBNPXY35TYkYXHs\" \n}" - } - - }, - "url": { - "raw": "{{base_url}}", - "host": [ - "{{base_url}}" - ] - } - }, - "response": [] - } - ] - }, - { - "name": "general", - "item": [ - { - "name": "Invalid query throws error", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 400\", function () {\r", - " pm.response.to.have.status(400);\r", - "});\r", - "\r", - "pm.test(\"Content-Type is json\", function () {\r", - " pm.expect(pm.response.headers.get('Content-Type')).to.contain('application/json');", - "});\r", - "\r", - "pm.test(\"Contains error message\", function () {\r", - " var jsonData = pm.response.json();\r", - " pm.expect(jsonData.errors[0].message).to.eql(\"Cannot query field \\\"name\\\" on type \\\"User\\\".\");\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "POST", - "header": [], - "body": { - "mode": "graphql", - "graphql": { - "query": "query user ($id: String) {\n user (id: $id) {\n id\n name\n }\n}", - "variables": "{\n \"id\": \"\"\n}" - } - }, - "url": { - "raw": "{{base_url}}", - "host": [ - "{{base_url}}" - ] - } - }, - "response": [] - }, - { - "name": "Get with no query throws error", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 400\", function () {\r", - " pm.response.to.have.status(400);\r", - "});\r", - "pm.test(\"Response contains error\", function () {\r", - " pm.expect(pm.response.text()).to.eql(\"GET query missing.\");\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "protocolProfileBehavior": { - "disableBodyPruning": true - }, - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{base_url}}", - "host": [ - "{{base_url}}" - ] - } - }, - "response": [] - } - ] + "name": "Login", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Returns user id\", function () {\r", + " var jsonData = pm.response.json();\r", + " pm.expect(jsonData.data).to.eql({login: {user: {id: \"ckn4oul7100004cv7y3t94n8j\"}}});\r", + "});\r", + "\r", + "pm.test(\"Sets cookie\", function () {\r", + " pm.expect(pm.cookies.has('session')).to.be.true;\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "mutation Mutation($email: EmailAddress!, $password: String!) { login(email: $email, password: $password) {... on UserReturned {user {id}}}}", + "variables": "{\n \"email\": \"alice@jabref.de\",\"password\": \"EBNPXY35TYkYXHs\" \n}" + } + }, + "url": { + "raw": "{{base_url}}", + "host": ["{{base_url}}"] + } + }, + "response": [] } - ], - "event": [ + ] + }, + { + "name": "general", + "item": [ { - "listen": "prerequest", - "script": { - "type": "text/javascript", + "name": "Invalid query throws error", + "event": [ + { + "listen": "test", + "script": { "exec": [ - "" - ] + "pm.test(\"Status code is 400\", function () {\r", + " pm.response.to.have.status(400);\r", + "});\r", + "\r", + "pm.test(\"Content-Type is json\", function () {\r", + " pm.expect(pm.response.headers.get('Content-Type')).to.contain('application/json');", + "});\r", + "\r", + "pm.test(\"Contains error message\", function () {\r", + " var jsonData = pm.response.json();\r", + " pm.expect(jsonData.errors[0].message).to.eql(\"Cannot query field \\\"name\\\" on type \\\"User\\\".\");\r", + "});" + ], + "type": "text/javascript" + } + } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "query user ($id: String) {\n user (id: $id) {\n id\n name\n }\n}", + "variables": "{\n \"id\": \"\"\n}" + } + }, + "url": { + "raw": "{{base_url}}", + "host": ["{{base_url}}"] } + }, + "response": [] }, { - "listen": "test", - "script": { - "type": "text/javascript", + "name": "Get with no query throws error", + "event": [ + { + "listen": "test", + "script": { "exec": [ - "" - ] + "pm.test(\"Status code is 400\", function () {\r", + " pm.response.to.have.status(400);\r", + "});\r", + "pm.test(\"Response contains error\", function () {\r", + " pm.expect(pm.response.text()).to.eql(\"GET query missing.\");\r", + "});" + ], + "type": "text/javascript" + } } + ], + "protocolProfileBehavior": { + "disableBodyPruning": true + }, + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}", + "host": ["{{base_url}}"] + } + }, + "response": [] } - ], - "variable": [ - { - "key": "base_url", - "value": "http://localhost:3000/api" - } - ] -} \ No newline at end of file + ] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [""] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [""] + } + } + ], + "variable": [ + { + "key": "base_url", + "value": "http://localhost:3000/api" + } + ] +} diff --git a/server/resolvers.ts b/server/resolvers.ts index 5b88f66e5..978c1be30 100644 --- a/server/resolvers.ts +++ b/server/resolvers.ts @@ -1,9 +1,9 @@ import { mergeResolvers } from '@graphql-tools/merge' import { DateTimeResolver, EmailAddressResolver } from 'graphql-scalars' -import { Resolvers } from './graphql' -import { resolvers as userResolvers } from './user/resolvers' import { resolvers as documentResolvers } from './documents/resolvers' +import { Resolvers } from './graphql' import { resolvers as groupResolvers } from './groups/resolvers' +import { resolvers as userResolvers } from './user/resolvers' export function loadResolvers(): Resolvers { return mergeResolvers([ diff --git a/server/schema.ts b/server/schema.ts index 0b7e0229b..3f203d004 100644 --- a/server/schema.ts +++ b/server/schema.ts @@ -1,7 +1,7 @@ +import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader' +import { loadSchema as loadGraphqlSchema } from '@graphql-tools/load' import { addResolversToSchema } from '@graphql-tools/schema' import { GraphQLSchema } from 'graphql' -import { loadSchema as loadGraphqlSchema } from '@graphql-tools/load' -import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader' async function addResolvers(schema: GraphQLSchema) { const { loadResolvers } = await import('./resolvers') diff --git a/server/tsyringe.config.ts b/server/tsyringe.config.ts index 04562d1e8..ce343b2af 100644 --- a/server/tsyringe.config.ts +++ b/server/tsyringe.config.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line import/default import prisma from '@prisma/client' import * as DocumentResolvers from './documents/resolvers' import { UserDocumentService } from './documents/user.document.service' diff --git a/server/user/auth.email.strategy.ts b/server/user/auth.email.strategy.ts index c29a327e2..105f52e26 100644 --- a/server/user/auth.email.strategy.ts +++ b/server/user/auth.email.strategy.ts @@ -1,7 +1,7 @@ -import { GraphQLLocalStrategy } from 'graphql-passport' -import { Request as ExpressRequest } from 'express' import { User } from '@prisma/client' -import { AuthService, AuthenticationMessage } from './auth.service' +import { Request as ExpressRequest } from 'express' +import { GraphQLLocalStrategy } from 'graphql-passport' +import { AuthenticationMessage, AuthService } from './auth.service' export default class EmailStrategy extends GraphQLLocalStrategy< User, diff --git a/server/user/auth.service.ts b/server/user/auth.service.ts index 6e8cb73b4..bb5954dd9 100644 --- a/server/user/auth.service.ts +++ b/server/user/auth.service.ts @@ -1,11 +1,11 @@ import type { PrismaClient, User } from '@prisma/client' // eslint-disable-next-line import/default -import uuid from 'uuid' // TODO: Change to { v4 as generateToken } as soon as uuid is a proper esm module / jest supports it (https://github.com/uuidjs/uuid/issues/451) import { RedisClientType } from 'redis' +import uuid from 'uuid' // TODO: Change to { v4 as generateToken } as soon as uuid is a proper esm module / jest supports it (https://github.com/uuidjs/uuid/issues/451) +import { ResolversTypes } from '../graphql' import { hash, verifyHash } from '../utils/crypto' -import { sendEmail } from '../utils/sendEmail' import { resetPasswordTemplate } from '../utils/resetPasswordTemplate' -import { ResolversTypes } from '../graphql' +import { sendEmail } from '../utils/sendEmail' import { inject, injectable } from './../tsyringe' export type { InfoArgument as AuthenticationMessage } from 'graphql-passport' diff --git a/server/user/integration.test.ts b/server/user/integration.test.ts index 4206b5604..70a1b1bf0 100644 --- a/server/user/integration.test.ts +++ b/server/user/integration.test.ts @@ -1,6 +1,6 @@ import { gql } from 'apollo-server-express' -import { createAuthenticatedClient } from '../../test/apollo.server' import * as prisma from '~/server/database/util' +import { createAuthenticatedClient } from '../../test/apollo.server' const authenticatedClient = await createAuthenticatedClient() diff --git a/server/user/passport-initializer.ts b/server/user/passport-initializer.ts index 922f5a717..9cf4601d5 100644 --- a/server/user/passport-initializer.ts +++ b/server/user/passport-initializer.ts @@ -1,12 +1,12 @@ import connectRedis from 'connect-redis' -import { toEventHandler, EventHandler } from 'h3' import session from 'express-session' +import { EventHandler, toEventHandler } from 'h3' import passport from 'passport' import { RedisClientType } from 'redis' +import { Environment } from '~/config' import { inject, injectable } from './../tsyringe' -import { AuthService } from './auth.service' import EmailStrategy from './auth.email.strategy' -import { Environment } from '~/config' +import { AuthService } from './auth.service' @injectable() export default class PassportInitializer { @@ -89,7 +89,7 @@ export default class PassportInitializer { // eslint-disable-next-line @typescript-eslint/no-explicit-any private serializeUser(user: any, done: (err: unknown, id?: string) => void) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument done(null, user.id) } diff --git a/server/user/resolvers.ts b/server/user/resolvers.ts index 8858bc810..1ee233bf8 100644 --- a/server/user/resolvers.ts +++ b/server/user/resolvers.ts @@ -1,22 +1,22 @@ import { User } from '@prisma/client' import { Context } from '../context' import { - MutationLoginArgs, - MutationSignupArgs, + UserDocumentService, + UserDocumentsResult, +} from '../documents/user.document.service' +import { + ForgotPasswordPayload, MutationChangePasswordArgs, MutationForgotPasswordArgs, + MutationLoginArgs, + MutationSignupArgs, QueryUserArgs, Resolvers, UserDocumentsArgs, - ForgotPasswordPayload, } from '../graphql' import { GroupResolved } from '../groups/resolvers' -import { - UserDocumentService, - UserDocumentsResult, -} from '../documents/user.document.service' import { GroupService } from '../groups/service' -import { resolve, injectable, inject } from './../tsyringe' +import { inject, injectable, resolve } from './../tsyringe' import { AuthService, ChangePasswordPayload, diff --git a/server/utils/extractResolveType.ts b/server/utils/extractResolveType.ts index 853d2c40b..b29bdad6c 100644 --- a/server/utils/extractResolveType.ts +++ b/server/utils/extractResolveType.ts @@ -1,4 +1,4 @@ -type ResolveFnc = TResolver extends { +type ResolveFnc = TResolver extends { __resolveType: infer T } ? T @@ -9,6 +9,4 @@ type ReturnType = T extends (...args: any[]) => infer R ? R : unknown * Type to extract the resolve type from a resolver for unions / interfaces. * Workaround for feature request https://github.com/dotansimha/graphql-code-generator/issues/6443 */ -export type ResolveType = ReturnType< - ResolveFnc -> +export type ResolveType = ReturnType> diff --git a/server/utils/services.factory.ts b/server/utils/services.factory.ts index 6541d4613..ec51b81c3 100644 --- a/server/utils/services.factory.ts +++ b/server/utils/services.factory.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-misused-promises */ // TODO: Remove once redis-mock is updated /* eslint-disable @typescript-eslint/no-unsafe-assignment */ // TODO: Remove once redis-mock is updated -import { promisify } from 'util' import redis, { RedisClientType } from 'redis' +import { promisify } from 'util' import { Environment } from '~/config' export async function createRedisClient(): Promise< diff --git a/tailwind.config.ts b/tailwind.config.ts index bf073e773..c089c0a25 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -1,12 +1,10 @@ import { Config } from 'tailwindcss' -// TODO: Renable lint as soon as this file is converted to typescript +import forms from '@tailwindcss/forms' import colors from 'tailwindcss/colors' import plugin from 'tailwindcss/plugin' - // @ts-ignore: has no type info import lineClamp from '@tailwindcss/line-clamp' -import forms from '@tailwindcss/forms' // Flip object horizontally or vertically // Adapted from https://github.com/tailwindlabs/tailwindcss/discussions/2146 diff --git a/test/global.setup.ts b/test/global.setup.ts index e323aed8d..547b6b631 100644 --- a/test/global.setup.ts +++ b/test/global.setup.ts @@ -1,9 +1,10 @@ +// eslint-disable-next-line import/default import prisma from '@prisma/client' import dotenv from 'dotenv' import { constructConfig } from '~/config' -import { createRedisClient } from '~/server/utils/services.factory' import { instanceCachingFactory, register, resolve } from '~/server/tsyringe' import { registerClasses } from '~/server/tsyringe.config' +import { createRedisClient } from '~/server/utils/services.factory' // Load environment variables from .env file dotenv.config() diff --git a/test/testenv.ts b/test/testenv.ts index 2fd01bdc6..c089371f0 100644 --- a/test/testenv.ts +++ b/test/testenv.ts @@ -1,7 +1,7 @@ -import 'reflect-metadata' import { EnvironmentContext } from '@jest/environment' -import NodeEnvironment from 'jest-environment-node' import { Config } from '@jest/types' +import NodeEnvironment from 'jest-environment-node' +import 'reflect-metadata' export default class CustomEnvironment extends NodeEnvironment { readonly isIntegrationTest: boolean diff --git a/tsconfig.json b/tsconfig.json index b7f8a9f61..a28808009 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,11 +4,7 @@ "target": "ES2018", "module": "ESNext", "moduleResolution": "Node", - "lib": [ - "ESNext", - "ESNext.AsyncIterable", - "DOM" - ], + "lib": ["ESNext", "ESNext.AsyncIterable", "DOM"], "esModuleInterop": true, "allowJs": true, "sourceMap": true, @@ -17,11 +13,7 @@ "experimentalDecorators": true, "emitDecoratorMetadata": true, "baseUrl": ".", - "types": [ - "@types/node", - "@types/jest", - "@pinia/nuxt" - ] + "types": ["@types/node", "@types/jest", "@pinia/nuxt"] }, "ts-node": { "moduleTypes": { @@ -29,9 +21,5 @@ "jest.config.ts": "cjs" } }, - "exclude": [ - "node_modules", - ".output", - "dist" - ] + "exclude": ["node_modules", ".output", "dist"] } diff --git a/yarn.lock b/yarn.lock index d4be9f935..7ac87dd09 100644 --- a/yarn.lock +++ b/yarn.lock @@ -376,13 +376,6 @@ wait-on "^6.0.1" yaml "^2.0.1" -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" @@ -422,7 +415,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.16", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.17.10", "@babel/core@^7.18.10", "@babel/core@^7.18.6", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.0": +"@babel/core@^7.1.0", "@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.17.10", "@babel/core@^7.18.10", "@babel/core@^7.18.6", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.0": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== @@ -443,15 +436,6 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/eslint-parser@^7.12.16": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz#e14dee36c010edfb0153cf900c2b0815e82e3245" - integrity sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A== - dependencies: - eslint-scope "^5.1.1" - eslint-visitor-keys "^2.1.0" - semver "^6.3.0" - "@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.14.0", "@babel/generator@^7.18.10", "@babel/generator@^7.7.2": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.10.tgz#794f328bfabdcbaf0ebf9bf91b5b57b61fa77a2a" @@ -703,7 +687,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== -"@babel/helper-validator-identifier@^7.18.6": +"@babel/helper-validator-identifier@^7.15.7", "@babel/helper-validator-identifier@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== @@ -732,7 +716,7 @@ "@babel/traverse" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": +"@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== @@ -1664,22 +1648,7 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.2.tgz#e8b88813c3a1734504f43315147ebb9bf488bbe4" integrity sha512-lcfRxKY3CIBFop9slpNu04+fGro1S0QN5n+HrbOwR6eHHdYeidvMtSVK4vbbYmEMwQr3MFAt2yU6bhwl4dqL/A== -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@eslint/eslintrc@^1.0.5": +"@eslint/eslintrc@^1.0.5", "@eslint/eslintrc@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== @@ -2455,12 +2424,12 @@ helper-js "^2.0.7" tslib "^2" -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== +"@humanwhocodes/config-array@^0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" + integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== dependencies: - "@humanwhocodes/object-schema" "^1.2.0" + "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" minimatch "^3.0.4" @@ -2473,7 +2442,12 @@ debug "^4.1.1" minimatch "^3.0.4" -"@humanwhocodes/object-schema@^1.2.0", "@humanwhocodes/object-schema@^1.2.1": +"@humanwhocodes/gitignore-to-minimatch@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + +"@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== @@ -3213,28 +3187,29 @@ vite-plugin-checker "^0.4.9" vue-bundle-renderer "^0.4.1" -"@nuxtjs/eslint-config-typescript@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@nuxtjs/eslint-config-typescript/-/eslint-config-typescript-6.0.1.tgz#11e91a5e25aca6855ec7525080da694c4b3cd4d4" - integrity sha512-ZK/C2ZtXrc2FlQwssc3gqc3K9RAtGF+OLGXRDtDxyrlhgPwAC4bc9McBGqUokdbE+pup0OA38PylPOhbWHZkrg== - dependencies: - "@nuxtjs/eslint-config" "6.0.1" - "@typescript-eslint/eslint-plugin" "^4.25.0" - "@typescript-eslint/parser" "^4.25.0" - -"@nuxtjs/eslint-config@6.0.1", "@nuxtjs/eslint-config@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@nuxtjs/eslint-config/-/eslint-config-6.0.1.tgz#305450a71e362c26f99b3a7130be960015a96c9b" - integrity sha512-NISrmMx4J2usVDVLG7WFwTdfQaznHf/b2aKTb1o0TCxxXdY30UHLqEH+3MqpjY+0+UPM06YswFmOBjOg5y2BXQ== - dependencies: - eslint-config-standard "^16.0.3" - eslint-plugin-import "^2.23.3" - eslint-plugin-jest "^24.3.6" +"@nuxtjs/eslint-config-typescript@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@nuxtjs/eslint-config-typescript/-/eslint-config-typescript-10.0.0.tgz#08eab1c450b34d4da88b81ede81b549318e4b2d6" + integrity sha512-DaFjb0IPOq5MhdPs/5h0+kUmjQ6sVSMo3mrEuuAY3r2NUWmVSWEFrlUCqx0S0pHvjBXS4MfwBWS/oWPs41aQeA== + dependencies: + "@nuxtjs/eslint-config" "10.0.0" + "@typescript-eslint/eslint-plugin" "^5.21.0" + "@typescript-eslint/parser" "^5.21.0" + eslint-import-resolver-typescript "^2.7.1" + eslint-plugin-import "^2.26.0" + +"@nuxtjs/eslint-config@10.0.0", "@nuxtjs/eslint-config@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@nuxtjs/eslint-config/-/eslint-config-10.0.0.tgz#6b4a9ad3bcdcc7d24314c86812ddb471e4879f53" + integrity sha512-5umb4Nyd/D9azWyFPGe3ru0E5v8SSVzgtZeJwTaCpqjsQDrr51P7QPtBTVdJXIbhdY1lws67x9Emkb7oKwh4zw== + dependencies: + eslint-config-standard "^17.0.0" + eslint-plugin-import "^2.26.0" + eslint-plugin-n "^15.2.0" eslint-plugin-node "^11.1.0" - eslint-plugin-promise "^5.1.0" - eslint-plugin-standard "^4.1.0" - eslint-plugin-unicorn "^28.0.2" - eslint-plugin-vue "^7.9.0" + eslint-plugin-promise "^6.0.0" + eslint-plugin-unicorn "^42.0.0" + eslint-plugin-vue "^8.7.1" "@nuxtjs/eslint-module@^3.1.0": version "3.1.0" @@ -4575,7 +4550,7 @@ "@types/tough-cookie" "*" parse5 "^7.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== @@ -4900,49 +4875,30 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^4.25.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" - integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== +"@typescript-eslint/eslint-plugin@^5.21.0", "@typescript-eslint/eslint-plugin@^5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.1.tgz#c0a480d05211660221eda963cc844732fe9b1714" + integrity sha512-S1iZIxrTvKkU3+m63YUOxYPKaP+yWDQrdhxTglVDVEVBf+aCSw85+BmJnyUaQQsk5TXFG/LpBu9fa+LrAQ91fQ== dependencies: - "@typescript-eslint/experimental-utils" "4.33.0" - "@typescript-eslint/scope-manager" "4.33.0" - debug "^4.3.1" + "@typescript-eslint/scope-manager" "5.33.1" + "@typescript-eslint/type-utils" "5.33.1" + "@typescript-eslint/utils" "5.33.1" + debug "^4.3.4" functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.1.0" - semver "^7.3.5" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@4.33.0", "@typescript-eslint/experimental-utils@^4.0.1": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" - integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== - dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/parser@^4.25.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" - integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== - dependencies: - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - debug "^4.3.1" - -"@typescript-eslint/scope-manager@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" - integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== +"@typescript-eslint/parser@^5.21.0", "@typescript-eslint/parser@^5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.33.1.tgz#e4b253105b4d2a4362cfaa4e184e2d226c440ff3" + integrity sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA== dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" + "@typescript-eslint/scope-manager" "5.33.1" + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/typescript-estree" "5.33.1" + debug "^4.3.4" "@typescript-eslint/scope-manager@5.30.5": version "5.30.5" @@ -4952,28 +4908,32 @@ "@typescript-eslint/types" "5.30.5" "@typescript-eslint/visitor-keys" "5.30.5" -"@typescript-eslint/types@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" - integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== +"@typescript-eslint/scope-manager@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz#8d31553e1b874210018ca069b3d192c6d23bc493" + integrity sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA== + dependencies: + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/visitor-keys" "5.33.1" + +"@typescript-eslint/type-utils@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.33.1.tgz#1a14e94650a0ae39f6e3b77478baff002cec4367" + integrity sha512-X3pGsJsD8OiqhNa5fim41YtlnyiWMF/eKsEZGsHID2HcDqeSC5yr/uLOeph8rNF2/utwuI0IQoAK3fpoxcLl2g== + dependencies: + "@typescript-eslint/utils" "5.33.1" + debug "^4.3.4" + tsutils "^3.21.0" "@typescript-eslint/types@5.30.5": version "5.30.5" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.5.tgz#36a0c05a72af3623cdf9ee8b81ea743b7de75a98" integrity sha512-kZ80w/M2AvsbRvOr3PjaNh6qEW1LFqs2pLdo2s5R38B2HYXG8Z0PP48/4+j1QHJFL3ssHIbJ4odPRS8PlHrFfw== -"@typescript-eslint/typescript-estree@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" - integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== - dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.0" +"@typescript-eslint/types@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.33.1.tgz#3faef41793d527a519e19ab2747c12d6f3741ff7" + integrity sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ== "@typescript-eslint/typescript-estree@5.30.5": version "5.30.5" @@ -4988,6 +4948,31 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz#a573bd360790afdcba80844e962d8b2031984f34" + integrity sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA== + dependencies: + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/visitor-keys" "5.33.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.33.1.tgz#171725f924fe1fe82bb776522bb85bc034e88575" + integrity sha512-uphZjkMaZ4fE8CR4dU7BquOV6u0doeQAr8n6cQenl/poMaIyJtBu8eys5uk6u5HiDH01Mj5lzbJ5SfeDz7oqMQ== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.33.1" + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/typescript-estree" "5.33.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + "@typescript-eslint/utils@^5.10.0": version "5.30.5" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.30.5.tgz#3999cbd06baad31b9e60d084f20714d1b2776765" @@ -5000,14 +4985,6 @@ eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" - integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== - dependencies: - "@typescript-eslint/types" "4.33.0" - eslint-visitor-keys "^2.0.0" - "@typescript-eslint/visitor-keys@5.30.5": version "5.30.5" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.5.tgz#d4bb969202019d5d5d849a0aaedc7370cc044b14" @@ -5016,6 +4993,14 @@ "@typescript-eslint/types" "5.30.5" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@5.33.1": + version "5.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz#0155c7571c8cd08956580b880aea327d5c34a18b" + integrity sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg== + dependencies: + "@typescript-eslint/types" "5.33.1" + eslint-visitor-keys "^3.3.0" + "@variantjs/core@^0.0.79": version "0.0.79" resolved "https://registry.yarnpkg.com/@variantjs/core/-/core-0.0.79.tgz#b569a3c921d84b38b5765f7ecc8515d705914844" @@ -5111,7 +5096,7 @@ "@vue/reactivity" "^3.2.37" "@vue/shared" "^3.2.37" -"@volar/vue-typescript@0.40.1": +"@volar/vue-typescript@0.40.1", "@volar/vue-typescript@^0.40.1": version "0.40.1" resolved "https://registry.yarnpkg.com/@volar/vue-typescript/-/vue-typescript-0.40.1.tgz#5c6e9dd6a5a5e9ec47c90c70c98d2c97f1e8a20d" integrity sha512-58nW/Xwy7VBkeIPmbyEmi/j1Ta2HxGl/5aFiEEpWxoas7vI1AM+txz8+MhWho4ZMw0w0eCqPtGgugD2rr+/v7w== @@ -5658,7 +5643,7 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== -acorn-jsx@^5.2.0, acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: +acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -5687,7 +5672,7 @@ acorn@^6.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.0.0, acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.0.0, acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -5770,7 +5755,7 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1, ajv@^8.11.0: +ajv@^8.11.0: version "8.11.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== @@ -6929,6 +6914,13 @@ builtin-status-codes@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== +builtins@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + busboy@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -7336,7 +7328,7 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.0.0, ci-info@^3.2.0, ci-info@^3.3.2: +ci-info@^3.0.0, ci-info@^3.2.0, ci-info@^3.3.0, ci-info@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== @@ -8267,7 +8259,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -9273,10 +9265,10 @@ eslint-config-prettier@^8.5.0: resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== -eslint-config-standard@^16.0.3: - version "16.0.3" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz#6c8761e544e96c531ff92642eeb87842b8488516" - integrity sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg== +eslint-config-standard@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz#fd5b6cf1dcf6ba8d29f200c461de2e19069888cf" + integrity sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg== eslint-import-resolver-node@^0.3.6: version "0.3.6" @@ -9286,6 +9278,17 @@ eslint-import-resolver-node@^0.3.6: debug "^3.2.7" resolve "^1.20.0" +eslint-import-resolver-typescript@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz#a90a4a1c80da8d632df25994c4c5fdcdd02b8751" + integrity sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ== + dependencies: + debug "^4.3.4" + glob "^7.2.0" + is-glob "^4.0.3" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + eslint-module-utils@^2.7.3: version "2.7.3" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" @@ -9302,7 +9305,15 @@ eslint-plugin-es@^3.0.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-import@^2.23.3: +eslint-plugin-es@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9" + integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.26.0: version "2.26.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== @@ -9321,19 +9332,26 @@ eslint-plugin-import@^2.23.3: resolve "^1.22.0" tsconfig-paths "^3.14.1" -eslint-plugin-jest@^24.3.6: - version "24.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz#206ac0833841e59e375170b15f8d0955219c4889" - integrity sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA== +eslint-plugin-jest@^26.8.3: + version "26.8.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.8.3.tgz#f5d9bb162636491c8f6f0cd2743fe67c86569338" + integrity sha512-2roWu1MkEiihQ/qEszPPoaoqVI1x2D8Jtadk5AmoXTdEeNVPMu01Dtz7jIuTOAmdW3L+tSkPZOtEtQroYJDt0A== dependencies: - "@typescript-eslint/experimental-utils" "^4.0.1" + "@typescript-eslint/utils" "^5.10.0" -eslint-plugin-jest@^26.8.2: - version "26.8.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.8.2.tgz#42a1248a5ade2bc589eb0f9c4e0608dd89b18cf3" - integrity sha512-67oh0FKaku9y48OpLzL3uK9ckrgLb83Sp5gxxTbtOGDw9lq6D8jw/Psj/9CipkbK406I2M7mvx1q+pv/MdbvxA== +eslint-plugin-n@^15.2.0: + version "15.2.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.2.4.tgz#d62021a0821ae650701ed459756aaf478a9b6056" + integrity sha512-tjnVMv2fiXYMnuiIFI8QMtyUFI42SckEEWvi8h68SWGWshfqO6SSCASy24dGMGAiy7NUk6DZt90DM0iNUsmQ5w== dependencies: - "@typescript-eslint/utils" "^5.10.0" + builtins "^5.0.1" + eslint-plugin-es "^4.1.0" + eslint-utils "^3.0.0" + ignore "^5.1.1" + is-core-module "^2.9.0" + minimatch "^3.1.2" + resolve "^1.10.1" + semver "^7.3.7" eslint-plugin-node@^11.1.0: version "11.1.0" @@ -9356,70 +9374,39 @@ eslint-plugin-nuxt@^3.2.0: semver "^7.3.5" vue-eslint-parser "^8.3.0" -eslint-plugin-prettier-vue@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier-vue/-/eslint-plugin-prettier-vue-4.2.0.tgz#f24d684a41f8fb112977302689248ffe68175548" - integrity sha512-DA2oNRx+pZ6RM/EIHIPME4FQZifnkEROa55OWtTTUFGHpj53tcHomuxVP/kS/2MM+ul46GEK+jymK69STWDWoA== - dependencies: - "@vue/compiler-sfc" "^3.2.37" - chalk "^4.0.0" - prettier "^2.7.1" - prettier-linter-helpers "^1.0.0" - -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-promise@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz#a596acc32981627eb36d9d75f9666ac1a4564971" - integrity sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw== - -eslint-plugin-standard@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" - integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== +eslint-plugin-promise@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz#017652c07c9816413a41e11c30adc42c3d55ff18" + integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw== -eslint-plugin-unicorn@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-28.0.2.tgz#ab9884ebae04590ecd9c1c294330d889a74b7c37" - integrity sha512-k4AoFP7n8/oq6lBXkdc9Flid6vw2B8j7aXFCxgzJCyKvmaKrCUFb1TFPhG9eSJQFZowqmymMPRtl8oo9NKLUbw== +eslint-plugin-unicorn@^42.0.0: + version "42.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-42.0.0.tgz#47d60c00c263ad743403b052db689e39acbacff1" + integrity sha512-ixBsbhgWuxVaNlPTT8AyfJMlhyC5flCJFjyK3oKE8TRrwBnaHvUbuIkCM1lqg8ryYrFStL/T557zfKzX4GKSlg== dependencies: - ci-info "^2.0.0" + "@babel/helper-validator-identifier" "^7.15.7" + ci-info "^3.3.0" clean-regexp "^1.0.0" - eslint-template-visitor "^2.2.2" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - import-modules "^2.1.0" - lodash "^4.17.20" + eslint-utils "^3.0.0" + esquery "^1.4.0" + indent-string "^4.0.0" + is-builtin-module "^3.1.0" + lodash "^4.17.21" pluralize "^8.0.0" read-pkg-up "^7.0.1" - regexp-tree "^0.1.22" - reserved-words "^0.1.2" + regexp-tree "^0.1.24" safe-regex "^2.1.1" - semver "^7.3.4" + semver "^7.3.5" + strip-indent "^3.0.0" -eslint-plugin-unused-imports@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-1.1.5.tgz#a2b992ef0faf6c6c75c3815cc47bde76739513c2" - integrity sha512-TeV8l8zkLQrq9LBeYFCQmYVIXMjfHgdRQLw7dEZp4ZB3PeR10Y5Uif11heCsHRmhdRIYMoewr1d9ouUHLbLHew== +eslint-plugin-unused-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz#d8db8c4d0cfa0637a8b51ce3fd7d1b6bc3f08520" + integrity sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A== dependencies: eslint-rule-composer "^0.3.0" -eslint-plugin-vue@^7.9.0: - version "7.20.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz#98c21885a6bfdf0713c3a92957a5afeaaeed9253" - integrity sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw== - dependencies: - eslint-utils "^2.1.0" - natural-compare "^1.4.0" - semver "^6.3.0" - vue-eslint-parser "^7.10.0" - -eslint-plugin-vue@^8.5.0: +eslint-plugin-vue@^8.5.0, eslint-plugin-vue@^8.7.1: version "8.7.1" resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz#f13c53547a0c9d64588a675cc5ecc6ccaf63703f" integrity sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg== @@ -9473,18 +9460,7 @@ eslint-scope@^7.0.0, eslint-scope@^7.1.0, eslint-scope@^7.1.1: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-template-visitor@^2.2.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-2.3.2.tgz#b52f96ff311e773a345d79053ccc78275bbc463d" - integrity sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA== - dependencies: - "@babel/core" "^7.12.16" - "@babel/eslint-parser" "^7.12.16" - eslint-visitor-keys "^2.0.0" - esquery "^1.3.1" - multimap "^1.1.0" - -eslint-utils@^2.0.0, eslint-utils@^2.1.0: +eslint-utils@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== @@ -9498,12 +9474,12 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: +eslint-visitor-keys@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: +eslint-visitor-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== @@ -9569,49 +9545,48 @@ eslint@8.4.1: text-table "^0.2.0" v8-compile-cache "^2.0.3" -eslint@^7.32.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== +eslint@^8.22.0: + version "8.22.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.22.0.tgz#78fcb044196dfa7eef30a9d65944f6f980402c48" + integrity sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA== dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" + "@eslint/eslintrc" "^1.3.0" + "@humanwhocodes/config-array" "^0.10.4" + "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.3" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" + find-up "^5.0.0" functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" - minimatch "^3.0.4" + minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" + regexpp "^3.2.0" + strip-ansi "^6.0.1" strip-json-comments "^3.1.0" - table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -9624,30 +9599,12 @@ espree@9.2.0: acorn-jsx "^5.3.1" eslint-visitor-keys "^3.1.0" -espree@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -espree@^9.0.0, espree@^9.2.0, espree@^9.3.1, espree@^9.3.2: - version "9.3.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" - integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== +espree@^9.0.0, espree@^9.2.0, espree@^9.3.1, espree@^9.3.2, espree@^9.3.3: + version "9.3.3" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d" + integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng== dependencies: - acorn "^8.7.1" + acorn "^8.8.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" @@ -9656,7 +9613,7 @@ esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.3.1, esquery@^1.4.0: +esquery@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== @@ -9945,11 +9902,6 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - fast-glob@^2.2.6: version "2.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" @@ -10681,10 +10633,10 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.15.0, globals@^13.6.0, globals@^13.9.0: - version "13.16.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.16.0.tgz#9be4aca28f311aaeb974ea54978ebbb5e35ce46a" - integrity sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q== +globals@^13.15.0, globals@^13.6.0: + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== dependencies: type-fest "^0.20.2" @@ -10759,6 +10711,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + graphql-config@^4.3.0, graphql-config@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-4.3.1.tgz#636b539b1acc06fb48012d0e0f228014ccb0325f" @@ -11349,7 +11306,7 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1, ignore@^5.1.8, ignore@^5.2.0: +ignore@^5.1.1, ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== @@ -11385,11 +11342,6 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" -import-modules@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.1.0.tgz#abe7df297cb6c1f19b57246eb8b8bd9664b6d8c2" - integrity sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A== - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -13658,11 +13610,6 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - lodash.union@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" @@ -14295,11 +14242,6 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multimap@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" - integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== - mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -16062,17 +16004,10 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier-plugin-organize-imports@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.0.3.tgz#de6fed664b34d42bf6c7ce3f306ceec4ea3c4fb7" - integrity sha512-eu8PhJR39UZamhRdLEBJhUKG/sg0s+bnjwnN5Lc1TByZUHBtMuS9tBstnyaKGTSiMLhhftRPr0yIWG+PmJ13MA== +prettier-plugin-organize-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.1.0.tgz#00420affd69f21926dbf29bf94a152f37e859d5e" + integrity sha512-eufD78FKdkDTyyY9oKxuwEMrfz4/AXrGeyeyjqiRtSBr01DAdGFTq4SgIKvLeqlLkq+ZPJ2H0+BK0e6flRUwJQ== "prettier@>=2.2.1 <=2.3.0": version "2.3.0" @@ -16757,7 +16692,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp-tree@^0.1.22, regexp-tree@~0.1.1: +regexp-tree@^0.1.24, regexp-tree@~0.1.1: version "0.1.24" resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d" integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw== @@ -16771,7 +16706,7 @@ regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexpp@^3.0.0, regexpp@^3.1.0, regexpp@^3.2.0: +regexpp@^3.0.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -16948,11 +16883,6 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -reserved-words@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" - integrity sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw== - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -17267,7 +17197,7 @@ semver@7.3.5: dependencies: lru-cache "^6.0.0" -semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.6, semver@^7.3.7: +semver@7.x, semver@^7.0.0, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.6, semver@^7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -18116,17 +18046,6 @@ synchronous-promise@^2.0.15: resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.15.tgz#07ca1822b9de0001f5ff73595f3d08c4f720eb8e" integrity sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg== -table@^6.0.9: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - tailwind-config-viewer@^1.7.1: version "1.7.1" resolved "https://registry.yarnpkg.com/tailwind-config-viewer/-/tailwind-config-viewer-1.7.1.tgz#02beca5064d799908865907bbe085f368a4174d0" @@ -19497,19 +19416,6 @@ vue-docgen-loader@^1.5.0: loader-utils "^1.2.3" querystring "^0.2.0" -vue-eslint-parser@^7.10.0: - version "7.11.0" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz#214b5dea961007fcffb2ee65b8912307628d0daf" - integrity sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg== - dependencies: - debug "^4.1.1" - eslint-scope "^5.1.1" - eslint-visitor-keys "^1.1.0" - espree "^6.2.1" - esquery "^1.4.0" - lodash "^4.17.21" - semver "^6.3.0" - vue-eslint-parser@^8.0.1, vue-eslint-parser@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz#5d31129a1b3dd89c0069ca0a1c88f970c360bd0d"