Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions packages/eslint-config/src/configs/nuxt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,17 @@ export default function nuxt(options: NuxtESLintConfigOptions): Linter.Config[]
},
})

configs.push({
name: 'nuxt/nuxt-config',
files: [
'**/.config/nuxt.?([cm])[jt]s?(x)',
'**/nuxt.config.?([cm])[jt]s?(x)',
],
rules: {
'nuxt/no-nuxt-config-test-key': 'error',
},
})

if (sortConfigKeys) {
configs.push({
name: 'nuxt/sort-config',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,13 @@ exports[`flat config composition > custom src dirs 1`] = `
{
"name": "nuxt/rules",
},
{
"files": [
"**/.config/nuxt.?([cm])[jt]s?(x)",
"**/nuxt.config.?([cm])[jt]s?(x)",
],
"name": "nuxt/nuxt-config",
},
{
"files": [
"src1/app.{js,ts,jsx,tsx,vue}",
Expand Down Expand Up @@ -164,6 +171,13 @@ exports[`flat config composition > empty 1`] = `
{
"name": "nuxt/rules",
},
{
"files": [
"**/.config/nuxt.?([cm])[jt]s?(x)",
"**/nuxt.config.?([cm])[jt]s?(x)",
],
"name": "nuxt/nuxt-config",
},
{
"files": [
"app.{js,ts,jsx,tsx,vue}",
Expand Down Expand Up @@ -201,6 +215,13 @@ exports[`flat config composition > non-standalone 1`] = `
{
"name": "nuxt/rules",
},
{
"files": [
"**/.config/nuxt.?([cm])[jt]s?(x)",
"**/nuxt.config.?([cm])[jt]s?(x)",
],
"name": "nuxt/nuxt-config",
},
{
"files": [
"app.{js,ts,jsx,tsx,vue}",
Expand Down Expand Up @@ -292,6 +313,13 @@ exports[`flat config composition > with stylistic 1`] = `
{
"name": "nuxt/rules",
},
{
"files": [
"**/.config/nuxt.?([cm])[jt]s?(x)",
"**/nuxt.config.?([cm])[jt]s?(x)",
],
"name": "nuxt/nuxt-config",
},
{
"files": [
"**/.config/nuxt.?([cm])[jt]s?(x)",
Expand Down
2 changes: 2 additions & 0 deletions packages/eslint-plugin/src/rules/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { rule as preferImportMetaRule } from './prefer-import-meta'
import { rule as nuxtConfigOrderKeysRule } from './nuxt-config-keys-order'
import { rule as noNuxtConfigTestKeyRule } from './no-nuxt-config-test-key'

export default {
'prefer-import-meta': preferImportMetaRule,
'nuxt-config-keys-order': nuxtConfigOrderKeysRule,
'no-nuxt-config-test-key': noNuxtConfigTestKeyRule,
}
54 changes: 54 additions & 0 deletions packages/eslint-plugin/src/rules/no-nuxt-config-test-key/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import type { TSESTree as Tree } from '@typescript-eslint/utils'
import { createRule } from '../utils'

type MessageIds = 'default'

type Options = []

export const rule = createRule<MessageIds, Options>({
name: 'no-nuxt-config-test-key',
meta: {
type: 'problem',
docs: {
description: 'Disallow setting `test` key in Nuxt config',
},
schema: [],
messages: {
default: 'Do not set `test` key in Nuxt config. The test environment is automatically detected.',
},
},
defaultOptions: [],
create(context) {
return {
ExportDefaultDeclaration(node) {
let object: Tree.ObjectExpression | undefined
if (node.declaration.type === 'ObjectExpression') {
object = node.declaration
}
else if (node.declaration.type === 'CallExpression' && node.declaration.arguments[0]?.type === 'ObjectExpression') {
object = node.declaration.arguments[0]
}
if (!object) {
return
}

for (const prop of object.properties) {
if (
prop.type === 'Property'
&& prop.key.type === 'Identifier'
&& prop.key.name === 'test'
&& (
(prop.value.type === 'Literal' && typeof prop.value.value === 'boolean')
|| (prop.value.type === 'Identifier' && (prop.value.name === 'true' || prop.value.name === 'false'))
)
) {
context.report({
node: prop,
messageId: 'default',
})
}
}
},
}
},
})