Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vue/require-explicit-emits - emits [] inside mixin is not being recognised by eslint #2079

Open
2 tasks done
nicholaszuccarelli opened this issue Jan 23, 2023 · 4 comments
Open
2 tasks done

Comments

@nicholaszuccarelli
Copy link

nicholaszuccarelli commented Jan 23, 2023

Checklist

  • I have tried restarting my IDE and the issue persists.
  • I have read the FAQ and my problem is not listed.

Tell us about your environment

  • ESLint version: 8.32.0
  • eslint-plugin-vue version: 9.9.0
  • Node version: 16.18.1
  • Operating System: Windows 11 22621

Please show your full configuration:

module.exports = {
  // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy
  // This option interrupts the configuration hierarchy at this file
  // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos)
  root: true,

  parserOptions: {
    parser: '@babel/eslint-parser',
    ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features
    sourceType: 'module' // Allows for the use of imports
  },

  env: {
    browser: true,
    'vue/setup-compiler-macros': true
  },

  // Rules order is important, please avoid shuffling them
  extends: [
    // Base ESLint recommended rules
    // 'eslint:recommended',

    // Uncomment any of the lines below to choose desired strictness,
    // but leave only one uncommented!
    // See https://eslint.vuejs.org/rules/#available-rules
    'plugin:vue/vue3-recommended', // Priority A: Essential (Error Prevention)
    // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability)
    // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead)

    'standard'

  ],

  plugins: [
    // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files
    // required to lint *.vue files
    'vue',

  ],

  globals: {
    ga: 'readonly', // Google Analytics
    cordova: 'readonly',
    __statics: 'readonly',
    __QUASAR_SSR__: 'readonly',
    __QUASAR_SSR_SERVER__: 'readonly',
    __QUASAR_SSR_CLIENT__: 'readonly',
    __QUASAR_SSR_PWA__: 'readonly',
    process: 'readonly',
    Capacitor: 'readonly',
    chrome: 'readonly'
  },

  // add your custom rules here
  rules: {

    // allow async-await
    'generator-star-spacing': 'off',
    // allow paren-less arrow functions
    'arrow-parens': 'off',
    'one-var': 'off',
    'no-void': 'off',
    'multiline-ternary': 'off',

    'import/first': 'off',
    'import/named': 'error',
    'import/namespace': 'error',
    'import/default': 'error',
    'import/export': 'error',
    'import/extensions': 'off',
    'import/no-unresolved': 'off',
    'import/no-extraneous-dependencies': 'off',

    'prefer-promise-reject-errors': 'off',

    // allow debugger during development only
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
  }
}

What did you do?

Sample Project containing the Vue3 ESLint error: https://github.com/nicholaszuccarelli/quasar-broken-popover-inside-field
Essentially, I've created a component and used a mixin on the component (using options API).
The mixin contains the emits[] array of some properties that the component can emit.

The component example:
<template>
  <div>
    <q-btn @click="$emit('sample')" />
  </div>
</template>

<script>
import sampleMixin from './sampleMixin'

export default defineComponent({
  name: 'IndexPage',
  mixins: [sampleMixin]
})
</script>

The mixin:
export default {
  emits: ['sample']
}

What did you expect to happen?
ESLint should recognise that the mixin contains a 'sample' emitter property (should not show warning).
While this is a simple use-case, I have 10+ components which inherit a single mixin which emits an event - it becomes troublesome having to define these same emits[] arrays in each of the components which share the single mixin.

What actually happened?

55:18 warning The "sample" event has been triggered but not declared on emits option vue/require-explicit-emits

✖ 1 problem (0 errors, 1 warning)

image

Repository to reproduce this issue

https://github.com/nicholaszuccarelli/quasar-broken-popover-inside-field

(npm install then quasar dev to run project)

@vedmant
Copy link

vedmant commented Mar 3, 2023

I have the same issue, I have needed emits in a mixin, but eslint is still requiring to add emits to a component that imports that mixin.

@FloEdelmann
Copy link
Member

ESLint has no access to files other than the currently linted one. So we can either exclude components containing a mixin completely from this check (and similar ones), or require users to rewrite their code, or require users to disable the rule.

@nicholaszuccarelli
Copy link
Author

Could you make it a setting to exclude components which contain a mixin? I think this would be most appropriate.

@FloEdelmann
Copy link
Member

A pull request adding a boolean ignoreMixins option (default false) would be accepted.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants