Skip to content

Commit

Permalink
Merge pull request #572 from nextcloud/feat/add-eslint-config-for-ide
Browse files Browse the repository at this point in the history
  • Loading branch information
skjnldsv committed Jun 27, 2023
2 parents c7a4f9e + 96662f1 commit b8063ee
Show file tree
Hide file tree
Showing 4 changed files with 172 additions and 170 deletions.
7 changes: 5 additions & 2 deletions package.json
Expand Up @@ -8,8 +8,8 @@
"url": "git+https://github.com/nextcloud/eslint-config.git"
},
"scripts": {
"lint": "eslint -c index.js *.js",
"lint:fix": "eslint -c index.js --fix *.js",
"lint": "eslint parts *.js",
"lint:fix": "eslint --fix parts *.js",
"test": "jest"
},
"peerDependencies": {
Expand Down Expand Up @@ -65,6 +65,9 @@
"node": "^20.0.0",
"npm": "^9.0.0"
},
"eslintConfig": {
"extends": "./index.js"
},
"jest": {
"preset": "ts-jest",
"testEnvironment": "node",
Expand Down
186 changes: 93 additions & 93 deletions parts/base.js
@@ -1,96 +1,96 @@
/** Base rules */
module.exports = {
root: true,
env: {
browser: true,
commonjs: true,
es6: true,
node: true,
// Allow jest syntax in the src folder
jest: true,
},
parser: '@babel/eslint-parser',
parserOptions: {
requireConfigFile: false,
},
extends: [
'eslint:recommended',
'plugin:import/errors',
'plugin:import/warnings',
'plugin:n/recommended',
'plugin:@nextcloud/recommended',
'plugin:jsdoc/recommended',
'standard',
],
settings: {
'import/resolver': {
node: {
paths: ['src'],
extensions: ['.js', '.vue'],
},
exports: {
conditions: ['import'],
},
},
jsdoc: {
tagNamePreference: {
returns: 'return',
},
mode: 'typescript',
},
},
plugins: ['vue', 'n', 'jsdoc'],
rules: {
// space before function ()
'space-before-function-paren': ['error', {
anonymous: 'never',
named: 'never',
asyncArrow: 'always',
}],
// stay consistent with array brackets
'array-bracket-newline': ['error', 'consistent'],
// tabs only for indentation
indent: ['error', 'tab'],
'no-tabs': ['error', { allowIndentationTabs: true }],
// allow spaces after tabs for alignment
'no-mixed-spaces-and-tabs': ['error', 'smart-tabs'],
// only debug console
'no-console': ['error', { allow: ['error', 'warn', 'info', 'debug'] }],
// classes blocks
'padded-blocks': ['error', { classes: 'always' }],
// always have the operator in front
'operator-linebreak': ['error', 'before'],
// ternary on multiline
'multiline-ternary': ['error', 'always-multiline'],
// force proper JSDocs
'jsdoc/require-returns': 0,
'jsdoc/require-returns-description': 0,
'jsdoc/tag-lines': ['off'],
// disallow use of "var"
'no-var': 'error',
// suggest using const
'prefer-const': 'error',
// es6 import/export and require
'n/no-unpublished-require': ['off'],
'n/no-unsupported-features/es-syntax': ['off'],
// always add a trailing comma (for diff readability)
'comma-dangle': ['warn', 'always-multiline'],
// Allow shallow import of @vue/test-utils and @testing-library/vue in order to be able to use it in
// the src folder
'n/no-unpublished-import': ['error', {
allowModules: ['@vue/test-utils', '@testing-library/vue'],
}],
// require object literal shorthand syntax
'object-shorthand': ['error', 'always'],
// Warn when file extensions are not used on import paths
'import/extensions': ['warn', 'always', {
ignorePackages: true,
}],
// ignore camelcase for __webpack variables
camelcase: ['error', {
allow: ['^UNSAFE_', '^__webpack_'],
properties: 'never',
ignoreGlobals: true,
}],
},
root: true,
env: {
browser: true,
commonjs: true,
es6: true,
node: true,
// Allow jest syntax in the src folder
jest: true,
},
parser: '@babel/eslint-parser',
parserOptions: {
requireConfigFile: false,
},
extends: [
'eslint:recommended',
'plugin:import/errors',
'plugin:import/warnings',
'plugin:n/recommended',
'plugin:@nextcloud/recommended',
'plugin:jsdoc/recommended',
'standard',
],
settings: {
'import/resolver': {
node: {
paths: ['src'],
extensions: ['.js', '.vue'],
},
exports: {
conditions: ['import'],
},
},
jsdoc: {
tagNamePreference: {
returns: 'return',
},
mode: 'typescript',
},
},
plugins: ['vue', 'n', 'jsdoc'],
rules: {
// space before function ()
'space-before-function-paren': ['error', {
anonymous: 'never',
named: 'never',
asyncArrow: 'always',
}],
// stay consistent with array brackets
'array-bracket-newline': ['error', 'consistent'],
// tabs only for indentation
indent: ['error', 'tab'],
'no-tabs': ['error', { allowIndentationTabs: true }],
// allow spaces after tabs for alignment
'no-mixed-spaces-and-tabs': ['error', 'smart-tabs'],
// only debug console
'no-console': ['error', { allow: ['error', 'warn', 'info', 'debug'] }],
// classes blocks
'padded-blocks': ['error', { classes: 'always' }],
// always have the operator in front
'operator-linebreak': ['error', 'before'],
// ternary on multiline
'multiline-ternary': ['error', 'always-multiline'],
// force proper JSDocs
'jsdoc/require-returns': 0,
'jsdoc/require-returns-description': 0,
'jsdoc/tag-lines': ['off'],
// disallow use of "var"
'no-var': 'error',
// suggest using const
'prefer-const': 'error',
// es6 import/export and require
'n/no-unpublished-require': ['off'],
'n/no-unsupported-features/es-syntax': ['off'],
// always add a trailing comma (for diff readability)
'comma-dangle': ['warn', 'always-multiline'],
// Allow shallow import of @vue/test-utils and @testing-library/vue in order to be able to use it in
// the src folder
'n/no-unpublished-import': ['error', {
allowModules: ['@vue/test-utils', '@testing-library/vue'],
}],
// require object literal shorthand syntax
'object-shorthand': ['error', 'always'],
// Warn when file extensions are not used on import paths
'import/extensions': ['warn', 'always', {
ignorePackages: true,
}],
// ignore camelcase for __webpack variables
camelcase: ['error', {
allow: ['^UNSAFE_', '^__webpack_'],
properties: 'never',
ignoreGlobals: true,
}],
},
}
70 changes: 35 additions & 35 deletions parts/typescript.js
@@ -1,37 +1,37 @@
/** Rules for typescript */
module.exports = {
files: ['**/*.ts', '**/*.cts', '**/*.mts', '**/*.tsx'],
extends: [
'@vue/eslint-config-typescript/recommended',
'plugin:import/typescript',
],
parser: '@typescript-eslint/parser',
parserOptions: {},
rules: {
'n/no-missing-import': 'off',
'import/extensions': 'off',
'jsdoc/check-tag-names': [
'warn', {
// for projects using typedoc
definedTags: [
'notExported',
'packageDocumentation',
],
},
],
// Does not make sense with TypeScript
'jsdoc/require-param-type': 'off',
'@typescript-eslint/no-empty-function': 'off',
},
settings: {
'import/resolver': {
typescript: {
alwaysTryTypes: true,
},
node: {
paths: ['src'],
extensions: ['.(m|c)?js', '.ts', '.tsx', '.vue'],
},
},
},
}
files: ['**/*.ts', '**/*.cts', '**/*.mts', '**/*.tsx'],
extends: [
'@vue/eslint-config-typescript/recommended',
'plugin:import/typescript',
],
parser: '@typescript-eslint/parser',
parserOptions: {},
rules: {
'n/no-missing-import': 'off',
'import/extensions': 'off',
'jsdoc/check-tag-names': [
'warn', {
// for projects using typedoc
definedTags: [
'notExported',
'packageDocumentation',
],
},
],
// Does not make sense with TypeScript
'jsdoc/require-param-type': 'off',
'@typescript-eslint/no-empty-function': 'off',
},
settings: {
'import/resolver': {
typescript: {
alwaysTryTypes: true,
},
node: {
paths: ['src'],
extensions: ['.(m|c)?js', '.ts', '.tsx', '.vue'],
},
},
},
}
79 changes: 39 additions & 40 deletions parts/vue.js
@@ -1,42 +1,41 @@

module.exports = {
files: ['**/*.vue'],
parser: 'vue-eslint-parser',
parserOptions: {
parser: '@babel/eslint-parser',
},
extends: ['plugin:vue/recommended'],
rules: {
'vue/html-indent': ['error', 'tab'],
// PascalCase components names for vuejs
// https://vuejs.org/v2/style-guide/#Single-file-component-filename-casing-strongly-recommended
'vue/component-name-in-template-casing': ['error', 'PascalCase'],
// force name
'vue/match-component-file-name': ['error', {
extensions: ['jsx', 'vue', 'js'],
shouldMatchCase: true,
}],
// space before self-closing elements
'vue/html-closing-bracket-spacing': 'error',
// no ending html tag on a new line
'vue/html-closing-bracket-newline': ['error', { multiline: 'never' }],
// check vue files too
'n/no-missing-import': ['error', {}],
// code spacing with attributes
'vue/max-attributes-per-line': ['error', {
singleline: 3,
multiline: 1,
}],
'vue/first-attribute-linebreak': ['error', {
singleline: 'beside',
multiline: 'beside',
}],
// Allow single-word components names
'vue/multi-word-component-names': ['off'],
// custom event naming convention
'vue/custom-event-name-casing': ['error', 'kebab-case', {
// allows custom xxxx:xxx events formats
ignores: ['/^[a-z]+(?:-[a-z]+)*:[a-z]+(?:-[a-z]+)*$/u'],
}],
},
files: ['**/*.vue'],
parser: 'vue-eslint-parser',
parserOptions: {
parser: '@babel/eslint-parser',
},
extends: ['plugin:vue/recommended'],
rules: {
'vue/html-indent': ['error', 'tab'],
// PascalCase components names for vuejs
// https://vuejs.org/v2/style-guide/#Single-file-component-filename-casing-strongly-recommended
'vue/component-name-in-template-casing': ['error', 'PascalCase'],
// force name
'vue/match-component-file-name': ['error', {
extensions: ['jsx', 'vue', 'js'],
shouldMatchCase: true,
}],
// space before self-closing elements
'vue/html-closing-bracket-spacing': 'error',
// no ending html tag on a new line
'vue/html-closing-bracket-newline': ['error', { multiline: 'never' }],
// check vue files too
'n/no-missing-import': ['error', {}],
// code spacing with attributes
'vue/max-attributes-per-line': ['error', {
singleline: 3,
multiline: 1,
}],
'vue/first-attribute-linebreak': ['error', {
singleline: 'beside',
multiline: 'beside',
}],
// Allow single-word components names
'vue/multi-word-component-names': ['off'],
// custom event naming convention
'vue/custom-event-name-casing': ['error', 'kebab-case', {
// allows custom xxxx:xxx events formats
ignores: ['/^[a-z]+(?:-[a-z]+)*:[a-z]+(?:-[a-z]+)*$/u'],
}],
},
}

0 comments on commit b8063ee

Please sign in to comment.