diff --git a/lib/rules/no-unused-properties.js b/lib/rules/no-unused-properties.js index d09aca5c2..7eb7eb75d 100644 --- a/lib/rules/no-unused-properties.js +++ b/lib/rules/no-unused-properties.js @@ -496,12 +496,16 @@ module.exports = { let groupName = null if (/^mapMutations|mapActions$/u.test(node.callee.name)) { groupName = 'methods' - } else if (/^mapState|mapGetters$/u.test(node.callee.name)) { + } else if ( + /^mapState|mapGetters|mapWritableState$/u.test(node.callee.name) + ) { groupName = 'computed' } if (!groupName || node.arguments.length === 0) return - const arg = node.arguments[0] + // On Pinia the store is always the first argument + const arg = + node.arguments.length === 2 ? node.arguments[1] : node.arguments[0] if (arg.type === 'ObjectExpression') { // e.g. // `mapMutations({ add: 'increment' })` diff --git a/tests/lib/rules/no-unused-properties.js b/tests/lib/rules/no-unused-properties.js index 65b185298..64e858d31 100644 --- a/tests/lib/rules/no-unused-properties.js +++ b/tests/lib/rules/no-unused-properties.js @@ -53,6 +53,7 @@ const unreferencedOptions = { tester.run('no-unused-properties', rule, { valid: [ + // vuex getters { filename: 'test.vue', code: ` @@ -74,6 +75,68 @@ tester.run('no-unused-properties', rule, { `, options: allOptions }, + { + filename: 'test.vue', + code: ` + + + {{ count }} + + ` + }, + { + filename: 'test.vue', + code: ` + + + {{ count1 }} {{ count2 }} + + ` + }, + { + filename: 'test.vue', + code: ` + + + {{ count }} + + ` + }, + { + filename: 'test.vue', + code: ` + + + {{ count }} + + ` + }, + + // vuex mutations { filename: 'test.vue', code: ` @@ -136,6 +199,8 @@ tester.run('no-unused-properties', rule, { ` }, + + // vuex actions { filename: 'test.vue', code: ` @@ -196,6 +261,8 @@ tester.run('no-unused-properties', rule, { ` }, + + // vuex state { filename: 'test.vue', code: ` @@ -251,7 +318,7 @@ tester.run('no-unused-properties', rule, { @@ -260,27 +327,37 @@ tester.run('no-unused-properties', rule, { ` }, + + // pinia getters { filename: 'test.vue', code: ` - {{ count1 }} {{ count2 }} + {{ baz() }} - ` + `, + options: allOptions }, { filename: 'test.vue', code: ` @@ -293,15 +370,11 @@ tester.run('no-unused-properties', rule, { code: ` - {{ count }} + {{ count1 }} {{ count2 }} ` }, @@ -310,9 +383,9 @@ tester.run('no-unused-properties', rule, { code: ` @@ -320,52 +393,55 @@ tester.run('no-unused-properties', rule, { ` }, - // a property used in a script expression { filename: 'test.vue', code: ` + + {{ count }} + ` }, + + // pinia actions { filename: 'test.vue', code: ` + + {{ add() }} + ` }, - // default options { filename: 'test.vue', code: ` + + {{ add() }} + ` }, { @@ -373,143 +449,352 @@ tester.run('no-unused-properties', rule, { code: ` + + {{ add() }} + ` }, - - // a property being watched { filename: 'test.vue', code: ` + + {{ add() }} + ` }, - // a property used as a template identifier + // pinia state { filename: 'test.vue', code: ` - - {{ count }} - + + {{ count }} + ` }, - // a property used as a template $props member expression { filename: 'test.vue', code: ` - - {{ $props.count }} - + + {{ count }} + ` }, - - // properties used in a template expression { filename: 'test.vue', code: ` - - {{ count1 + count2 }} - + + {{ count }} + ` }, - // properties used in a template expression as $props member expression { filename: 'test.vue', code: ` - - {{ $props.count1 + $props.count2 }} - + + {{ count }} + ` }, - // a property used in v-if + // pinia writable state { filename: 'test.vue', code: ` - - - + + {{ count }} + ` }, - // a property used in v-if as $props member expression { filename: 'test.vue', code: ` - - - + + {{ count }} + ` }, - - // a property used in v-for { filename: 'test.vue', code: ` - - {{ color }} - + + {{ count }} + + ` + }, + { + filename: 'test.vue', + code: ` + + + {{ count }} + + ` + }, + + // a property used in a script expression + { + filename: 'test.vue', + code: ` + + ` + }, + { + filename: 'test.vue', + code: ` + + ` + }, + // default options + { + filename: 'test.vue', + code: ` + + ` + }, + { + filename: 'test.vue', + code: ` + + ` + }, + + // a property being watched + { + filename: 'test.vue', + code: ` + + ` + }, + + // a property used as a template identifier + { + filename: 'test.vue', + code: ` + + {{ count }} + + + ` + }, + // a property used as a template $props member expression + { + filename: 'test.vue', + code: ` + + {{ $props.count }} + + + ` + }, + + // properties used in a template expression + { + filename: 'test.vue', + code: ` + + {{ count1 + count2 }} + + + ` + }, + // properties used in a template expression as $props member expression + { + filename: 'test.vue', + code: ` + + {{ $props.count1 + $props.count2 }} + + + ` + }, + + // a property used in v-if + { + filename: 'test.vue', + code: ` + + + + + ` + }, + // a property used in v-if as $props member expression + { + filename: 'test.vue', + code: ` + + + + + ` + }, + + // a property used in v-for + { + filename: 'test.vue', + code: ` + + {{ color }} + + ` }, { - // defineModel + // defineModel + filename: 'test.vue', + code: ` + + + {{ foo }} + + ` + } + ], + invalid: [ + // vuex unused mutations + { + filename: 'test.vue', + code: ` + + + {{ add() }} + + `, + errors: [ + { + message: "'add2' of method found, but never used.", + line: 5 + } + ] + }, + { + filename: 'test.vue', + code: ` + + + {{ add() }} + + `, + errors: [ + { + message: "'add2' of method found, but never used.", + line: 6 + } + ] + }, + { + filename: 'test.vue', + code: ` + + + {{ add() }} + + `, + errors: [ + { + message: "'add2' of method found, but never used.", + line: 4 + } + ] + }, + { + filename: 'test.vue', + code: ` + + + {{ add() }} + + `, + errors: [ + { + message: "'add2' of method found, but never used.", + line: 6 + } + ] + }, + + // vuex unused actions + { + filename: 'test.vue', + code: ` + + + {{ add() }} + + `, + errors: [ + { + message: "'add2' of method found, but never used.", + line: 6 + } + ] + }, + { + filename: 'test.vue', + code: ` + + + {{ add() }} + + `, + errors: [ + { + message: "'add2' of method found, but never used.", + line: 5 + } + ] + }, + { + filename: 'test.vue', + code: ` + + + {{ add() }} + + `, + errors: [ + { + message: "'add2' of method found, but never used.", + line: 4 + } + ] + }, + { + filename: 'test.vue', + code: ` + + + {{ add() }} + + `, + errors: [ + { + message: "'add2' of method found, but never used.", + line: 5 + } + ] + }, + + // vuex unused state + { + filename: 'test.vue', + code: ` + + + {{ count }} + + `, + errors: [ + { + message: "'count2' of computed property found, but never used.", + line: 5 + } + ] + }, + { + filename: 'test.vue', + code: ` + + + {{ count }} + + `, + errors: [ + { + message: "'count2' of computed property found, but never used.", + line: 6 + } + ] + }, + { + filename: 'test.vue', + code: ` + + + {{ count }} + + `, + errors: [ + { + message: "'count2' of computed property found, but never used.", + line: 5 + } + ] + }, + { + filename: 'test.vue', + code: ` + + + {{ count2 }} {{ count3 }} + + `, + errors: [ + { + message: "'count' of computed property found, but never used.", + line: 5 + } + ] + }, + { + filename: 'test.vue', + code: ` + + + {{ count }} + + `, + errors: [ + { + message: "'count2' of computed property found, but never used.", + line: 6 + } + ] + }, + + // vuex unused getters + { + filename: 'test.vue', + code: ` + + + {{ count }} + + `, + errors: [ + { + message: "'count2' of computed property found, but never used.", + line: 5 + } + ] + }, + { filename: 'test.vue', code: ` - - - {{ foo }} - - ` - } - ], - invalid: [ + + + {{ count1 }} {{ count2 }} + + `, + errors: [ + { + message: "'count' of computed property found, but never used.", + line: 4 + } + ] + }, { filename: 'test.vue', code: ` - {{ add() }} + {{ count }} `, errors: [ { - message: "'add2' of method found, but never used.", + message: "'count2' of computed property found, but never used.", line: 5 } ] @@ -2197,22 +2819,22 @@ tester.run('no-unused-properties', rule, { code: ` - {{ add() }} + {{ count }} `, errors: [ { - message: "'add2' of method found, but never used.", - line: 6 + message: "'count3' of computed property found, but never used.", + line: 7 } ] }, @@ -2221,17 +2843,21 @@ tester.run('no-unused-properties', rule, { code: ` - {{ add() }} + {{ count }} `, errors: [ { - message: "'add2' of method found, but never used.", - line: 4 + message: "'a' of computed property found, but never used.", + line: 6 } ] }, @@ -2240,31 +2866,34 @@ tester.run('no-unused-properties', rule, { code: ` - {{ add() }} + {{ count }} `, errors: [ { - message: "'add2' of method found, but never used.", + message: "'a' of computed property found, but never used.", line: 6 } ] }, + + // pinia unused actions { filename: 'test.vue', code: ` @@ -2329,7 +2958,7 @@ tester.run('no-unused-properties', rule, { @@ -2344,12 +2973,14 @@ tester.run('no-unused-properties', rule, { } ] }, + + // pinia unused state { filename: 'test.vue', code: ` - {{ count }} + {{ count2 }} {{ count3 }} `, errors: [ { - message: "'count2' of computed property found, but never used.", + message: "'count' of computed property found, but never used.", line: 5 } ] @@ -2443,28 +3074,33 @@ tester.run('no-unused-properties', rule, { code: ` - {{ count1 }} {{ count2 }} + {{ count }} `, errors: [ { - message: "'count' of computed property found, but never used.", - line: 4 + message: "'count2' of computed property found, but never used.", + line: 6 } ] }, + + // pinia unused writable state { filename: 'test.vue', code: ` @@ -2485,9 +3121,9 @@ tester.run('no-unused-properties', rule, { @@ -2521,8 +3161,8 @@ tester.run('no-unused-properties', rule, { `, errors: [ { - message: "'a' of computed property found, but never used.", - line: 6 + message: "'count2' of computed property found, but never used.", + line: 5 } ] }, @@ -2532,57 +3172,93 @@ tester.run('no-unused-properties', rule, { + + {{ count2 }} {{ count3 }} + + `, + errors: [ + { + message: "'count' of computed property found, but never used.", + line: 5 + } + ] + }, + { + filename: 'test.vue', + code: ` + {{ count }} `, errors: [ { - message: "'a' of computed property found, but never used.", + message: "'count2' of computed property found, but never used.", line: 6 } ] }, - // vuex unused state + // pinia unused getters { filename: 'test.vue', code: ` - {{ count2 }} {{ count3 }} + {{ count }} `, errors: [ { - message: "'count' of computed property found, but never used.", + message: "'count2' of computed property found, but never used.", line: 5 } ] }, - - // vuex unused state { filename: 'test.vue', code: ` + + {{ count1 }} {{ count2 }} + + `, + errors: [ + { + message: "'count' of computed property found, but never used.", + line: 4 + } + ] + }, + { + filename: 'test.vue', + code: ` + @@ -2593,19 +3269,67 @@ tester.run('no-unused-properties', rule, { errors: [ { message: "'count2' of computed property found, but never used.", + line: 5 + } + ] + }, + { + filename: 'test.vue', + code: ` + + + {{ count }} + + `, + errors: [ + { + message: "'count3' of computed property found, but never used.", + line: 7 + } + ] + }, + { + filename: 'test.vue', + code: ` + + + {{ count }} + + `, + errors: [ + { + message: "'a' of computed property found, but never used.", line: 6 } ] }, - - // vuex unused state { filename: 'test.vue', code: ` @@ -2615,8 +3339,8 @@ tester.run('no-unused-properties', rule, { `, errors: [ { - message: "'additional' of computed property found, but never used.", - line: 5 + message: "'a' of computed property found, but never used.", + line: 6 } ] },