eslint-plugin-vue-setup-order
v1.0.1
Published
ESLint plugin to enforce consistent order of statements in Vue 3 <script setup>
Downloads
189
Maintainers
Readme
eslint-plugin-vue-setup-order
ESLint plugin to enforce a consistent order of statements within the Vue 3 <script setup> block.
Installation
npm install -D eslint-plugin-vue-setup-order
# or
pnpm add -D eslint-plugin-vue-setup-order
# or
yarn add -D eslint-plugin-vue-setup-orderConfiguration
ESLint Flat Config (ESLint 9+)
// eslint.config.js
import vueSetupOrder from 'eslint-plugin-vue-setup-order';
export default [
vueSetupOrder.configs.flat.recommended,
// Or manual configuration:
{
plugins: {
'vue-setup-order': vueSetupOrder,
},
rules: {
'vue-setup-order/order': 'error',
},
},
];Legacy Config (.eslintrc)
// .eslintrc.js
module.exports = {
plugins: ['vue-setup-order'],
extends: ['plugin:vue-setup-order/recommended'],
// Or manual configuration:
rules: {
'vue-setup-order/order': 'error',
},
};Default Order
The plugin enforces the following default sequence:
- Imports: All
importstatements. - Type Declarations: TypeScript
type,interface, andenumdeclarations. - Define Macros:
defineProps,defineEmits,defineOptions,defineSlots,defineExpose,defineModel, andwithDefaults. - Composables: Function calls following the
useXxxpattern (e.g.,useRouter,useStore). - Reactive State: Vue reactivity APIs such as
ref,reactive, andshallowRef. - Computed Properties:
computeddeclarations. - Watchers:
watchandwatchEffectcalls. - Lifecycle Hooks:
onMounted,onBeforeMount, and other lifecycle functions. - Functions: Regular function declarations and arrow functions.
- Provide:
providecalls.
Examples
Incorrect
<script setup>
import { ref, computed } from 'vue';
function increment() {
// Error: function declared before reactive state
count.value++;
}
const count = ref(0);
onMounted(() => {}); // Error: lifecycle hook before computed property
const doubled = computed(() => count.value * 2);
</script>Correct
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue';
import { useRouter } from 'vue-router';
type Props = {
title: string;
};
interface Emits {
(e: 'update', value: string): void;
}
const props = defineProps<Props>();
const emit = defineEmits<Emits>();
const router = useRouter();
const count = ref(0);
const doubled = computed(() => count.value * 2);
onMounted(() => {
console.log('mounted');
});
function increment() {
count.value++;
}
</script>Options
groupBlankLines
Ensures blank lines are present between different categories. Defaults to true.
{
'vue-setup-order/order': ['error', {
groupBlankLines: true,
}]
}order
Allows customization of the category sequence. Provide an array of category names to define your preferred order.
Available categories:
importtypes(type, interface, enum)defineProps,defineEmits,defineOptions,defineSlots,defineExpose,defineModel,withDefaultscomposable(useXxx)ref,reactive,computed,watch,watchEffectonMounted,onBeforeMount, etc.functionprovide
Example: Custom order
{
'vue-setup-order/order': ['error', {
order: [
'import',
'types',
'defineProps',
'defineEmits',
'composable',
'ref',
'reactive',
'computed',
'watch',
'lifecycle',
'function',
'provide'
]
}]
}Auto-fix
This rule supports automatic fixing. Run ESLint with the --fix flag to resolve ordering issues:
npx eslint --fix "src/**/*.vue"License
MIT
