Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Eliminate @storis dependencies internalize configs #644

Merged
merged 21 commits into from
Apr 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
da24381
Update npm-run-all to npm-run-all2. npm-run-all2 is a maintenance for…
philfuster Apr 16, 2024
47edd99
Update date-fns.
philfuster Apr 16, 2024
6e2f44c
update clsx.
philfuster Apr 16, 2024
1bcfa20
update prettier
philfuster Apr 16, 2024
df0d490
run updated prettier version on Document.ts
philfuster Apr 16, 2024
e0918e0
Remove @storis/eslint-config dependency. Integrate those configuratio…
philfuster Apr 16, 2024
8fc30f0
consolidate eslint-confing from .config within .eslintrc.js.
philfuster Apr 17, 2024
dadf274
delete .config
philfuster Apr 17, 2024
06d93ee
remove extra comma in array.
philfuster Apr 17, 2024
d582634
fix some config stuff.
philfuster Apr 17, 2024
2c83bfa
merge the @storis/ts-config config within root tsconfig.
philfuster Apr 17, 2024
459d79f
remove @storis/tsconfig dependency.
philfuster Apr 17, 2024
82da44d
run prettier on tsconfig.json.
philfuster Apr 17, 2024
03bb669
upgrade eslint-config-prettier
philfuster Apr 17, 2024
03c9a45
remove carot from eslint-config-prettier dependency version.
philfuster Apr 17, 2024
cec79b1
Merge branch 'main' into eliminate-@storis-dependencies-internalize-c…
philfuster Apr 17, 2024
b7d0fb0
revert eslint-config-prettier upgrade. let the renovate bot PR handle…
philfuster Apr 17, 2024
699c04b
remove un-necessary overrides and rules in eslint config.
philfuster Apr 17, 2024
ae7b5b0
Remove un-necessary ts-node configuration in tsconfig.json
philfuster Apr 17, 2024
a6e2cfc
replace use of @ts-ignore with @ts-expect-error according to eslint r…
philfuster Apr 17, 2024
1f8c60c
re-run prettier to fix tsconfig.json
philfuster Apr 17, 2024
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
270 changes: 266 additions & 4 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
const { overrides: baseOverrides } = require('@storis/eslint-config/nodejs');
const jsGlobs = ['**/*.?([cm])js', '**/*.js?(x)'];

const baseNamingRules = baseOverrides[0].rules['@typescript-eslint/naming-convention'].slice(1);
const tsGlobs = ['**/*.?([cm])ts', '**/*.ts?(x)'];

const jsTsGlobs = [...jsGlobs, ...tsGlobs];

module.exports = {
extends: ['@storis/eslint-config/nodejs'],
ignorePatterns: ['node_modules', 'dist', 'coverage', '**/*.d.ts', '!.*.js', '!.*.cjs', '!.*.mjs'],

// warn on unused eslint disable directives
reportUnusedDisableDirectives: true,

extends: ['airbnb-base', 'airbnb-typescript/base'],

settings: {
'import/resolver': {
Expand All @@ -21,11 +28,266 @@ module.exports = {
filter: { regex: '^Model$', match: true },
format: ['PascalCase'],
},
...baseNamingRules,
// camelCase for everything not otherwise indicated
{ selector: 'default', format: ['camelCase'] },
// allow known default exclusions
{ selector: 'default', filter: { regex: '^(_id|__v|_raw)$', match: true }, format: null },
// allow variables to be camelCase or UPPER_CASE
{ selector: 'variable', format: ['camelCase', 'UPPER_CASE'] },
// allow known variable exclusions
{
selector: 'variable',
filter: { regex: '^(_id|__v|_raw)$', match: true },
format: null,
},
// do not enforce format on property names
{ selector: 'property', format: null },
// PascalCase for classes and TypeScript keywords
{
selector: ['typeLike'],
format: ['PascalCase'],
},
],
},

overrides: [
{
files: tsGlobs,
rules: {
// enforce return types on module boundaries
'@typescript-eslint/explicit-module-boundary-types': 'error',
},
},

{
files: ['**/types/*.ts'],
rules: {
'import/prefer-default-export': 'off',
'import/no-default-export': 'error',
},
},
{
files: jsTsGlobs,
extends: [
'plugin:jest/recommended',
'plugin:jest/style',
'plugin:@typescript-eslint/recommended',
'plugin:import/typescript',
'prettier',
],

parserOptions: { project: true },

env: { es2021: true, node: true, 'jest/globals': true },

plugins: ['jest'],

rules: {
// enforce curly brace usage
curly: ['error', 'all'],

// allow class methods which do not use this
'class-methods-use-this': 'off',

// Allow use of ForOfStatement - no-restricted-syntax does not allow us to turn off a rule. This block overrides the airbnb rule entirely
// https://github.com/airbnb/javascript/blob/7152396219e290426a03e47837e53af6bcd36bbe/packages/eslint-config-airbnb-base/rules/style.js#L257-L263
'no-restricted-syntax': [
'error',
{
selector: 'ForInStatement',
message:
'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.',
},
{
selector: 'LabeledStatement',
message:
'Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.',
},
{
selector: 'WithStatement',
message:
'`with` is disallowed in strict mode because it makes code impossible to predict and optimize.',
},
],

// underscore dangle will be handled by @typescript-eslint/naming-convention
'no-underscore-dangle': 'off',

// enforce consistent sort order
'sort-imports': ['error', { ignoreCase: true, ignoreDeclarationSort: true }],

// disable import/no-cycle due to performance reasons; dpdm will validate this in CI
'import/no-cycle': 'off',

// enforce convention in import order
'import/order': [
'error',
{
'newlines-between': 'never',
groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'],
alphabetize: { order: 'asc', caseInsensitive: true },
},
],

// ensure consistent array typings
'@typescript-eslint/array-type': 'error',

// prefer type imports and exports
'@typescript-eslint/consistent-type-exports': [
'error',
{ fixMixedExportsWithInlineTypeSpecifier: true },
],
'@typescript-eslint/consistent-type-imports': ['error', { prefer: 'type-imports' }],

// enforce consistent order of class members
'@typescript-eslint/member-ordering': 'error',

// disallow parameter properties in favor of explicit class declarations
'@typescript-eslint/no-parameter-properties': 'error',

// ensure unused variables are treated as an error
// overrides @typescript-eslint/recommended -- '@typescript-eslint/no-unused-vars': 'warn'
// https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/recommended.ts
'@typescript-eslint/no-unused-vars': 'error',
},
},
{
files: tsGlobs,
extends: ['plugin:@typescript-eslint/recommended-requiring-type-checking'],
rules: {
// ban ts-comment except with description
'@typescript-eslint/ban-ts-comment': [
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should make this:

				// ban ts-comment except with description
				'@typescript-eslint/ban-ts-comment': [
					'error',
					{
						'ts-expect-error': { descriptionFormat: '^: ' },
						'ts-ignore': true,
						'ts-nocheck': true,
						'ts-check': false,
					},
				],

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea. Looking at all these rules has been great. Thank you.

'error',
{
'ts-expect-error': { descriptionFormat: '^: ' },
'ts-ignore': true,
'ts-nocheck': true,
'ts-check': false,
},
],

// disable rules turned on by @typescript-eslint/recommended-requiring-type-checking which are too noisy
// https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/src/configs/recommended-requiring-type-checking.ts
'@typescript-eslint/no-unsafe-argument': 'off',
'@typescript-eslint/no-unsafe-assignment': 'off',
'@typescript-eslint/no-unsafe-call': 'off',
'@typescript-eslint/no-unsafe-member-access': 'off',
'@typescript-eslint/no-unsafe-return': 'off',
'@typescript-eslint/restrict-template-expressions': 'off',
'@typescript-eslint/unbound-method': 'off',

// force explicit member accessibility modifiers
'@typescript-eslint/explicit-member-accessibility': 'error',

// disallow boolean comparisons against non-boolean values
'@typescript-eslint/strict-boolean-expressions': ['error', { allowNullableBoolean: true }],
},
},

{
files: jsGlobs,
rules: {
// allow ts-nocheck in js files
'@typescript-eslint/ban-ts-comment': [
'error',
{
'ts-expect-error': 'allow-with-description',
'ts-ignore': 'allow-with-description',
'ts-nocheck': false,
'ts-check': false,
},
],
},
},

{
files: ['**/index.[jt]s?(x)'],
rules: {
// prefer named exports for certain file types
'import/prefer-default-export': 'off',
'import/no-default-export': 'error',
},
},

{
files: [
'**/test/**/*.[jt]s?(x)',
'**/__tests__/**/*.[jt]s?(x)',
'**/?(*.)+(spec|test).[jt]s?(x)',
],
rules: {
// allow tests to create multiple classes
'max-classes-per-file': 'off',

// allow side effect constructors
'no-new': 'off',

// allow import with CommonJS export
'import/no-import-module-exports': 'off',

// allow dev dependencies
'import/no-extraneous-dependencies': [
'error',
{ devDependencies: true, optionalDependencies: false, peerDependencies: false },
],

// disallow use of "it" for test blocks
'jest/consistent-test-it': ['error', { fn: 'test', withinDescribe: 'test' }],

// ensure all tests contain an assertion
'jest/expect-expect': 'error',

// no commented out tests
'jest/no-commented-out-tests': 'error',

// no duplicate test hooks
'jest/no-duplicate-hooks': 'error',

// valid titles
'jest/valid-title': 'error',

// no if conditionals in tests
'jest/no-if': 'error',

// expect statements in test blocks
'jest/no-standalone-expect': 'error',

// disallow returning from test
'jest/no-test-return-statement': 'error',

// disallow truthy and falsy in tests
'jest/no-restricted-matchers': ['error', { toBeFalsy: null, toBeTruthy: null }],

// prefer called with
'jest/prefer-called-with': 'error',
},
},

{
files: ['**/test/**/*.ts?(x)', '**/__tests__/**/*.ts?(x)', '**/?(*.)+(spec|test).ts?(x)'],
rules: {
// allow explicit any in tests
'@typescript-eslint/no-explicit-any': 'off',

// allow non-null-assertions
'@typescript-eslint/no-non-null-assertion': 'off',
},
},

{
files: ['./.*.?(c|m)js', './*.?(c|m)js'],
rules: {
// allow requires in config files
'@typescript-eslint/no-var-requires': 'off',

// allow dev dependencies in config files
'import/no-extraneous-dependencies': [
'error',
{ devDependencies: true, optionalDependencies: false, peerDependencies: false },
],
},
},

{
files: ['./.*.js', './*.js', './website/**/*.js'],
rules: {
Expand Down
Loading