vuejs / vue-eslint-parser

The ESLint custom parser for `.vue` files.
MIT License
443 stars 74 forks source link

`getCommentsBefore` empty in Vue SFC with two `script` tags #230

Open eliottvincent opened 5 months ago

eliottvincent commented 5 months ago

Before You File a Bug Report Please Confirm You Have Done The Following...

What version of ESLint are you using?

8.45.0

What version of eslint-plugin-vue and vue-eslint-parser are you using?

What did you do?

Configuration ``` module.exports = { root: true, env: { browser: true, es6: true, node: true }, parser: "vue-eslint-parser", parserOptions: { sourceType: "module" }, extends: [ "plugin:vue/vue3-recommended" ], plugins: [ "eslint-plugin-jsdoc", "eliottvincent" ], rules: { "eliottvincent/import-group-comment": "error", "jsdoc/require-jsdoc": [ "error", { "contexts": [ "Property[key.name=\"methods\"] > ObjectExpression > Property" ] } ] } }; ```
<template lang="pug">
.hello-world
  span {{ "Hello world" }}
</template>

<script setup>
// NPM
import { definePageMeta, useHead } from "#imports";
import { useI18n } from "vue-i18n";

definePageMeta({
  layout: "showcase"
});

useHead({
  title: "Hello World"
});
</script>

<script>
export default {
  methods: {
    // --> EVENT LISTENERS <--

    /**
     * Some function
     * @public
     * @return {undefined}
     */
    someFunction() {
      console.log("test");
    }
  }
};
</script>

What did you expect to happen?

I have two rules:

I expect both these rules to work in Vue SFC files.

What actually happened?

When a Vue SFC file contains two script tags, one with setup keyword (to make use of Vue Composition API) and a regular one, both of these rules will fail (check the file res/example/not_ok.vue in the repro example).

When a Vue SFC file contains only one script tag, these rules work fine (check the file res/example/ok_1.vue in the repro example).

When a Vue SFC file contains two regular script tags (no setup keyword), these rules work fine as well (check the file res/example/ok_2.vue in the repro example).

This is the raw output:

/vue-eslint-parser-script-repro/res/example/not_ok.vue
   8:1  error  Import "#imports" should be in the "NPM" group  eliottvincent/import-group-comment
   9:1  error  Import "vue-i18n" should be in the "NPM" group  eliottvincent/import-group-comment
  30:5  error  Missing JSDoc comment                           jsdoc/require-jsdoc

✖ 3 problems (3 errors, 0 warnings)
  1 error and 0 warnings potentially fixable with the `--fix` option.

Link to Minimal Reproducible Example

https://github.com/eliottvincent/vue-eslint-parser-script-repro

Additional comments

I suspect the culprit is the getCommentsBefore method which returns an empty array when both rule fails.