Skip to content

Commit 73b4739

Browse files
balazsorban44ijjk
andauthored
chore: add build step to eslint-plugin-next (vercel#38647)
Follow-up on vercel#38534 (review) This lets us use modern JS/TS syntax in ESLint rules and avoid issues like vercel#38530 and vercel#36693 ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm lint` - [ ] The examples guidelines are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing.md#adding-examples) Co-authored-by: JJ Kasper <[email protected]>
1 parent 05c2fe0 commit 73b4739

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+81
-70
lines changed

Diff for: packages/eslint-plugin-next/.swcrc

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"$schema": "https://json.schemastore.org/swcrc",
3+
"jsc": {
4+
"parser": {
5+
"syntax": "typescript"
6+
}
7+
},
8+
"module": {
9+
"type": "commonjs"
10+
}
11+
}

Diff for: packages/eslint-plugin-next/lib/rules/no-img-element.js

-43
This file was deleted.

Diff for: packages/eslint-plugin-next/package.json

+7-3
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,23 @@
22
"name": "@next/eslint-plugin-next",
33
"version": "12.3.2-canary.15",
44
"description": "ESLint plugin for NextJS.",
5-
"main": "lib/index.js",
5+
"main": "dist/index.js",
66
"license": "MIT",
77
"repository": {
88
"url": "vercel/next.js",
99
"directory": "packages/eslint-plugin-next"
1010
},
1111
"files": [
12-
"lib"
12+
"dist"
1313
],
1414
"dependencies": {
1515
"glob": "7.1.7"
1616
},
1717
"devDependencies": {
18-
"@types/eslint": "7.28.0"
18+
"eslint": "7.24.0"
19+
},
20+
"scripts": {
21+
"build": "swc -d dist src",
22+
"prepublishOnly": "cd ../../ && turbo run build"
1923
}
2024
}
File renamed without changes.
+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import type { Rule } from 'eslint'
2+
3+
const url = 'https://nextjs.org/docs/messages/no-img-element'
4+
5+
export const meta: Rule.RuleMetaData = {
6+
docs: {
7+
description: 'Prevent usage of `<img>` element to prevent layout shift.',
8+
category: 'HTML',
9+
recommended: true,
10+
url,
11+
},
12+
type: 'problem',
13+
schema: [],
14+
}
15+
16+
export const create: Rule.RuleModule['create'] = (context) => {
17+
return {
18+
JSXOpeningElement(node) {
19+
if (node.name.name !== 'img') {
20+
return
21+
}
22+
23+
if (node.attributes.length === 0) {
24+
return
25+
}
26+
27+
if (node.parent?.parent?.openingElement?.name?.name === 'picture') {
28+
return
29+
}
30+
31+
context.report({
32+
node,
33+
message: `Do not use \`<img>\` element. Use \`<Image />\` from \`next/image\` instead. See: ${url}`,
34+
})
35+
},
36+
}
37+
}

Diff for: packages/eslint-plugin-next/jsconfig.json renamed to packages/eslint-plugin-next/tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
"module": "commonjs",
44
"target": "es2019"
55
},
6+
"include": ["src/**/*"],
67
"exclude": ["node_modules"]
78
}

Diff for: pnpm-lock.yaml

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: test/unit/eslint-plugin-next/google-font-display.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/google-font-display'
1+
import rule from '@next/eslint-plugin-next/dist/rules/google-font-display'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/google-font-preconnect.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/google-font-preconnect'
1+
import rule from '@next/eslint-plugin-next/dist/rules/google-font-preconnect'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/index.test.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import glob from 'glob'
33
import index from '@next/eslint-plugin-next'
44

55
const getRuleNameFromRulePath = (path) => basename(path, '.js')
6-
const rulePaths = glob.sync('packages/eslint-plugin-next/lib/rules/*js', {
6+
const rulePaths = glob.sync('packages/eslint-plugin-next/dist/rules/*js', {
77
absolute: true,
88
})
99

@@ -15,7 +15,8 @@ describe('@next/eslint-plugin-next index', () => {
1515
})
1616

1717
rulePaths.forEach((rulePath) => {
18-
const rule = require(rulePath)
18+
let rule = require(rulePath)
19+
rule = rule.default ?? rule
1920
const ruleName = getRuleNameFromRulePath(rulePath)
2021
const { recommended = false } = rule.meta.docs
2122

Diff for: test/unit/eslint-plugin-next/inline-script-id.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/inline-script-id'
1+
import rule from '@next/eslint-plugin-next/dist/rules/inline-script-id'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/next-script-for-ga.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/next-script-for-ga'
1+
import rule from '@next/eslint-plugin-next/dist/rules/next-script-for-ga'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-assign-module-variable.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-assign-module-variable'
1+
import rule from '@next/eslint-plugin-next/dist/rules/no-assign-module-variable'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-before-interactive-script-outside-document.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-before-interactive-script-outside-document'
1+
import rule from '@next/eslint-plugin-next/dist/rules/no-before-interactive-script-outside-document'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-css-tags.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-css-tags'
1+
import rule from '@next/eslint-plugin-next/dist/rules/no-css-tags'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-document-import-in-page.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import path from 'path'
22

3-
import rule from '@next/eslint-plugin-next/lib/rules/no-document-import-in-page'
3+
import rule from '@next/eslint-plugin-next/dist/rules/no-document-import-in-page'
44
import { RuleTester } from 'eslint'
55
;(RuleTester as any).setDefaultConfig({
66
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-duplicate-head.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-duplicate-head'
1+
import rule from '@next/eslint-plugin-next/dist/rules/no-duplicate-head'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-head-element.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-head-element'
1+
import rule from '@next/eslint-plugin-next/dist/rules/no-head-element'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-head-import-in-document.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-head-import-in-document'
1+
import rule from '@next/eslint-plugin-next/dist/rules/no-head-import-in-document'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-html-link-for-pages.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* eslint-env jest */
2-
import rule from '@next/eslint-plugin-next/lib/rules/no-html-link-for-pages'
2+
import rule from '@next/eslint-plugin-next/dist/rules/no-html-link-for-pages'
33
import { Linter } from 'eslint'
44
import assert from 'assert'
55
import path from 'path'

Diff for: test/unit/eslint-plugin-next/no-img-element.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-img-element'
1+
import * as rule from '@next/eslint-plugin-next/dist/rules/no-img-element'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-page-custom-font.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-page-custom-font'
1+
import rule from '@next/eslint-plugin-next/dist/rules/no-page-custom-font'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-script-component-in-head.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-script-component-in-head'
1+
import rule from '@next/eslint-plugin-next/dist/rules/no-script-component-in-head'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-styled-jsx-in-document.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-styled-jsx-in-document'
1+
import rule from '@next/eslint-plugin-next/dist/rules/no-styled-jsx-in-document'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-sync-scripts.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-sync-scripts'
1+
import rule from '@next/eslint-plugin-next/dist/rules/no-sync-scripts'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-title-in-document-head.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-title-in-document-head'
1+
import rule from '@next/eslint-plugin-next/dist/rules/no-title-in-document-head'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-typos.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-typos'
1+
import rule from '@next/eslint-plugin-next/dist/rules/no-typos'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

Diff for: test/unit/eslint-plugin-next/no-unwanted-polyfillio.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import rule from '@next/eslint-plugin-next/lib/rules/no-unwanted-polyfillio'
1+
import rule from '@next/eslint-plugin-next/dist/rules/no-unwanted-polyfillio'
22
import { RuleTester } from 'eslint'
33
;(RuleTester as any).setDefaultConfig({
44
parserOptions: {

0 commit comments

Comments
 (0)