From e1071eba5faa1fd99169eb72aec585c7e64d2f4e Mon Sep 17 00:00:00 2001 From: Rebecca Stevens Date: Tue, 16 Apr 2024 18:58:17 +1200 Subject: [PATCH] fix: more tweaks --- package.json | 16 +-- pnpm-lock.yaml | 214 +++++++++++++++++++------------------- scripts/typegen.ts | 40 ++++--- src/configs/comments.ts | 4 +- src/configs/formatters.ts | 6 +- src/configs/functional.ts | 10 +- src/configs/ignores.ts | 6 +- src/configs/imports.ts | 8 +- src/configs/in-editor.ts | 2 +- src/configs/index.ts | 3 + src/configs/javascript.ts | 139 ++----------------------- src/configs/jsdoc.ts | 2 +- src/configs/jsonc.ts | 2 +- src/configs/markdown.ts | 2 +- src/configs/node.ts | 2 +- src/configs/promise.ts | 30 ++++++ src/configs/regexp.ts | 93 +++++++++++++++++ src/configs/sonar.ts | 59 +++++++++++ src/configs/stylistic.ts | 99 +++++++++++++----- src/configs/test.ts | 2 +- src/configs/toml.ts | 2 +- src/configs/typescript.ts | 14 +-- src/configs/unicorn.ts | 4 +- src/configs/unocss.ts | 2 +- src/configs/vue.ts | 2 +- src/configs/yaml.ts | 2 +- src/factory.ts | 22 ++-- src/utils.ts | 4 +- 28 files changed, 456 insertions(+), 335 deletions(-) create mode 100644 src/configs/promise.ts create mode 100644 src/configs/regexp.ts create mode 100644 src/configs/sonar.ts diff --git a/package.json b/package.json index 7fd9005f..05feab28 100644 --- a/package.json +++ b/package.json @@ -62,21 +62,21 @@ "@semantic-release/github": "10.0.3", "@semantic-release/npm": "12.0.0", "@semantic-release/release-notes-generator": "13.0.0", - "@stylistic/eslint-plugin": "1.7.0", - "@stylistic/eslint-plugin-migrate": "1.7.0", + "@stylistic/eslint-plugin": "1.7.2", + "@stylistic/eslint-plugin-migrate": "1.7.2", "@types/node": "20.12.7", "@types/rollup-plugin-auto-external": "2.0.5", - "@typescript-eslint/eslint-plugin": "7.6.0", - "@typescript-eslint/parser": "7.6.0", - "@typescript-eslint/utils": "7.6.0", - "@unocss/eslint-plugin": "0.59.2", + "@typescript-eslint/eslint-plugin": "7.7.0", + "@typescript-eslint/parser": "7.7.0", + "@typescript-eslint/utils": "7.7.0", + "@unocss/eslint-plugin": "0.59.3", "commitizen": "4.3.0", "cspell": "8.7.0", "cz-conventional-changelog": "3.3.0", "deassert": "1.0.2", "eslint": "9.0.0", "eslint-config-prettier": "9.1.0", - "eslint-flat-config-utils": "0.2.2", + "eslint-flat-config-utils": "0.2.3", "eslint-import-resolver-typescript": "3.6.1", "eslint-merge-processors": "0.1.0", "eslint-plugin-eslint-comments": "3.2.0", @@ -99,7 +99,7 @@ "eslint-plugin-vue": "9.25.0", "eslint-plugin-yml": "1.14.0", "eslint-processor-vue-blocks": "0.1.1", - "eslint-typegen": "0.2.2", + "eslint-typegen": "0.2.3", "husky": "9.0.11", "jiti": "1.21.0", "jsonc-eslint-parser": "2.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4a26b821..c26144d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,11 +47,11 @@ devDependencies: specifier: 13.0.0 version: 13.0.0(semantic-release@23.0.8) '@stylistic/eslint-plugin': - specifier: 1.7.0 - version: 1.7.0(eslint@9.0.0)(typescript@5.4.5) + specifier: 1.7.2 + version: 1.7.2(eslint@9.0.0)(typescript@5.4.5) '@stylistic/eslint-plugin-migrate': - specifier: 1.7.0 - version: 1.7.0(eslint@9.0.0)(typescript@5.4.5) + specifier: 1.7.2 + version: 1.7.2(eslint@9.0.0)(typescript@5.4.5) '@types/node': specifier: 20.12.7 version: 20.12.7 @@ -59,17 +59,17 @@ devDependencies: specifier: 2.0.5 version: 2.0.5 '@typescript-eslint/eslint-plugin': - specifier: 7.6.0 - version: 7.6.0(@typescript-eslint/parser@7.6.0)(eslint@9.0.0)(typescript@5.4.5) + specifier: 7.7.0 + version: 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@9.0.0)(typescript@5.4.5) '@typescript-eslint/parser': - specifier: 7.6.0 - version: 7.6.0(eslint@9.0.0)(typescript@5.4.5) + specifier: 7.7.0 + version: 7.7.0(eslint@9.0.0)(typescript@5.4.5) '@typescript-eslint/utils': - specifier: 7.6.0 - version: 7.6.0(eslint@9.0.0)(typescript@5.4.5) + specifier: 7.7.0 + version: 7.7.0(eslint@9.0.0)(typescript@5.4.5) '@unocss/eslint-plugin': - specifier: 0.59.2 - version: 0.59.2(eslint@9.0.0)(typescript@5.4.5) + specifier: 0.59.3 + version: 0.59.3(eslint@9.0.0)(typescript@5.4.5) commitizen: specifier: 4.3.0 version: 4.3.0(@types/node@20.12.7)(typescript@5.4.5) @@ -89,11 +89,11 @@ devDependencies: specifier: 9.1.0 version: 9.1.0(eslint@9.0.0) eslint-flat-config-utils: - specifier: 0.2.2 - version: 0.2.2 + specifier: 0.2.3 + version: 0.2.3 eslint-import-resolver-typescript: specifier: 3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.6.0)(eslint-plugin-import@2.29.1)(eslint@9.0.0) + version: 3.6.1(@typescript-eslint/parser@7.7.0)(eslint-plugin-import@2.29.1)(eslint@9.0.0) eslint-merge-processors: specifier: 0.1.0 version: 0.1.0(eslint@9.0.0) @@ -147,7 +147,7 @@ devDependencies: version: 52.0.0(eslint@9.0.0) eslint-plugin-vitest: specifier: 0.5.3 - version: 0.5.3(@typescript-eslint/eslint-plugin@7.6.0)(eslint@9.0.0)(typescript@5.4.5) + version: 0.5.3(@typescript-eslint/eslint-plugin@7.7.0)(eslint@9.0.0)(typescript@5.4.5) eslint-plugin-vue: specifier: 9.25.0 version: 9.25.0(eslint@9.0.0) @@ -158,8 +158,8 @@ devDependencies: specifier: 0.1.1 version: 0.1.1(@vue/compiler-sfc@3.4.21)(eslint@9.0.0) eslint-typegen: - specifier: 0.2.2 - version: 0.2.2(eslint@9.0.0) + specifier: 0.2.3 + version: 0.2.3(eslint@9.0.0) husky: specifier: 9.0.11 version: 9.0.11 @@ -1057,8 +1057,8 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint-stylistic/metadata@1.7.0: - resolution: {integrity: sha512-EdyFKr1BHcx45o6gMZuCkFS64XHzVGFql0V3oL6mZwepnueulpmjsPxTiRRdrYdRknmQA+vjj1/znFkGRrPWHQ==} + /@eslint-stylistic/metadata@1.7.2: + resolution: {integrity: sha512-/oJdlHbVtMRfC0+17aaLG/5hqMrup40VcQztWRrIy1oLRNQDwXdOjR/x3+g8kknu61LqmDAmbpeBXJnN62WvRg==} dev: true /@eslint/eslintrc@2.1.4: @@ -1794,8 +1794,8 @@ packages: p-map: 4.0.0 dev: true - /@stylistic/eslint-plugin-js@1.7.0(eslint@9.0.0): - resolution: {integrity: sha512-PN6On/+or63FGnhhMKSQfYcWutRlzOiYlVdLM6yN7lquoBTqUJHYnl4TA4MHwiAt46X5gRxDr1+xPZ1lOLcL+Q==} + /@stylistic/eslint-plugin-js@1.7.2(eslint@9.0.0): + resolution: {integrity: sha512-ZYX7C5p7zlHbACwFLU+lISVh6tdcRP/++PWegh2Sy0UgMT5kU0XkPa2tKWEtJYzZmPhJxu9LxbnWcnE/tTwSDQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' @@ -1808,24 +1808,24 @@ packages: espree: 9.6.1 dev: true - /@stylistic/eslint-plugin-jsx@1.7.0(eslint@9.0.0): - resolution: {integrity: sha512-BACdBwXakQvjYIST5N2WWhRbvhRsIxa/F59BiZol+0IH4FSmDXhie7v/yaxDIIA9CbfElzOmIA5nWNYTVXcnwQ==} + /@stylistic/eslint-plugin-jsx@1.7.2(eslint@9.0.0): + resolution: {integrity: sha512-lNZR5PR0HLJPs+kY0y8fy6KroKlYqA5PwsYWpVYWzqZWiL5jgAeUo4s9yLFYjJjzildJ5MsTVMy/xP81Qz6GXg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' dependencies: - '@stylistic/eslint-plugin-js': 1.7.0(eslint@9.0.0) + '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) '@types/eslint': 8.56.9 eslint: 9.0.0 estraverse: 5.3.0 - picomatch: 4.0.1 + picomatch: 4.0.2 dev: true - /@stylistic/eslint-plugin-migrate@1.7.0(eslint@9.0.0)(typescript@5.4.5): - resolution: {integrity: sha512-1xcTyY8EIyRLtI86c2XM2GYLv9tBAuelYCH8i2H84k8lSWO8fTg9ArohG3Oo2bj55KFkOHO39lU1QlfKDMpxLQ==} + /@stylistic/eslint-plugin-migrate@1.7.2(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-1TCKas3kibGWqPHyGjyPOA5gsZuZeiTJrV8xMhtcgEnLTbI30l1hsr0e4IDs7GUmDHVhKDidzARTkQ83dmnEGA==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@eslint-stylistic/metadata': 1.7.0 + '@eslint-stylistic/metadata': 1.7.2 '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.4.5) transitivePeerDependencies: - eslint @@ -1833,8 +1833,8 @@ packages: - typescript dev: true - /@stylistic/eslint-plugin-plus@1.7.0(eslint@9.0.0)(typescript@5.4.5): - resolution: {integrity: sha512-AabDw8sXsc70Ydx3qnbeTlRHZnIwY6UKEenBPURPhY3bfYWX+/pDpZH40HkOu94v8D0DUrocPkeeEUxl4e0JDg==} + /@stylistic/eslint-plugin-plus@1.7.2(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-luUfRVbBVtt0+/FNt8/76BANJEzb/nHWasHD7UUjyMrch2U9xUKpObrkTCzqBuisKek+uFupwGjqXqDP07+fQw==} peerDependencies: eslint: '*' dependencies: @@ -1846,13 +1846,13 @@ packages: - typescript dev: true - /@stylistic/eslint-plugin-ts@1.7.0(eslint@9.0.0)(typescript@5.4.5): - resolution: {integrity: sha512-QsHv98mmW1xaucVYQTyLDgEpybPJ/6jPPxVBrIchntWWwj74xCWKUiw79hu+TpYj/Pbhd9rkqJYLNq3pQGYuyA==} + /@stylistic/eslint-plugin-ts@1.7.2(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-szX89YPocwCe4T0eT3alj7MwEzDHt5+B+kb/vQfSSLIjI9CGgoWrgj50zU8PtaDctTh4ZieFBzU/lRmkSUo0RQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' dependencies: - '@stylistic/eslint-plugin-js': 1.7.0(eslint@9.0.0) + '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) '@types/eslint': 8.56.9 '@typescript-eslint/utils': 6.21.0(eslint@9.0.0)(typescript@5.4.5) eslint: 9.0.0 @@ -1861,16 +1861,16 @@ packages: - typescript dev: true - /@stylistic/eslint-plugin@1.7.0(eslint@9.0.0)(typescript@5.4.5): - resolution: {integrity: sha512-ThMUjGIi/jeWYNvOdjZkoLw1EOVs0tEuKXDgWvTn8uWaEz55HuPlajKxjKLpv19C+qRDbKczJfzUODfCdME53A==} + /@stylistic/eslint-plugin@1.7.2(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-TesaPR4AOCeD4unwu9gZCdTe8SsUpykriICuwXV8GFBgESuVbfVp+S8g6xTWe9ntVR803bNMtnr2UhxHW0iFqg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' dependencies: - '@stylistic/eslint-plugin-js': 1.7.0(eslint@9.0.0) - '@stylistic/eslint-plugin-jsx': 1.7.0(eslint@9.0.0) - '@stylistic/eslint-plugin-plus': 1.7.0(eslint@9.0.0)(typescript@5.4.5) - '@stylistic/eslint-plugin-ts': 1.7.0(eslint@9.0.0)(typescript@5.4.5) + '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.0.0) + '@stylistic/eslint-plugin-jsx': 1.7.2(eslint@9.0.0) + '@stylistic/eslint-plugin-plus': 1.7.2(eslint@9.0.0)(typescript@5.4.5) + '@stylistic/eslint-plugin-ts': 1.7.2(eslint@9.0.0)(typescript@5.4.5) '@types/eslint': 8.56.9 eslint: 9.0.0 transitivePeerDependencies: @@ -1950,8 +1950,8 @@ packages: resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} dev: true - /@typescript-eslint/eslint-plugin@7.6.0(@typescript-eslint/parser@7.6.0)(eslint@9.0.0)(typescript@5.4.5): - resolution: {integrity: sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==} + /@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0)(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1962,11 +1962,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.6.0(eslint@9.0.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.6.0 - '@typescript-eslint/type-utils': 7.6.0(eslint@9.0.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.6.0(eslint@9.0.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.6.0 + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/type-utils': 7.7.0(eslint@9.0.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 eslint: 9.0.0 graphemer: 1.4.0 @@ -1979,8 +1979,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@7.6.0(eslint@9.0.0)(typescript@5.4.5): - resolution: {integrity: sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==} + /@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1989,10 +1989,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.6.0 - '@typescript-eslint/types': 7.6.0 - '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.6.0 + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 eslint: 9.0.0 typescript: 5.4.5 @@ -2008,16 +2008,16 @@ packages: '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/scope-manager@7.6.0: - resolution: {integrity: sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==} + /@typescript-eslint/scope-manager@7.7.0: + resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.6.0 - '@typescript-eslint/visitor-keys': 7.6.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 dev: true - /@typescript-eslint/type-utils@7.6.0(eslint@9.0.0)(typescript@5.4.5): - resolution: {integrity: sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==} + /@typescript-eslint/type-utils@7.7.0(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -2026,8 +2026,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.6.0(eslint@9.0.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.4.5) debug: 4.3.4 eslint: 9.0.0 ts-api-utils: 1.3.0(typescript@5.4.5) @@ -2041,8 +2041,8 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/types@7.6.0: - resolution: {integrity: sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==} + /@typescript-eslint/types@7.7.0: + resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} engines: {node: ^18.18.0 || >=20.0.0} dev: true @@ -2068,8 +2068,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.6.0(typescript@5.4.5): - resolution: {integrity: sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==} + /@typescript-eslint/typescript-estree@7.7.0(typescript@5.4.5): + resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -2077,8 +2077,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.6.0 - '@typescript-eslint/visitor-keys': 7.6.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -2109,8 +2109,8 @@ packages: - typescript dev: true - /@typescript-eslint/utils@7.6.0(eslint@9.0.0)(typescript@5.4.5): - resolution: {integrity: sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==} + /@typescript-eslint/utils@7.7.0(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -2118,9 +2118,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.6.0 - '@typescript-eslint/types': 7.6.0 - '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) eslint: 9.0.0 semver: 7.6.0 transitivePeerDependencies: @@ -2136,33 +2136,33 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@7.6.0: - resolution: {integrity: sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==} + /@typescript-eslint/visitor-keys@7.7.0: + resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.6.0 + '@typescript-eslint/types': 7.7.0 eslint-visitor-keys: 3.4.3 dev: true - /@unocss/config@0.59.2: - resolution: {integrity: sha512-KknR9kcid1w/8IuujZ8msE5pU930GD5e2v84H9Ftcv308yfuj+j/0zQ/ORtG8qMx+97p7uFy3xspzI2yoRYRpQ==} + /@unocss/config@0.59.3: + resolution: {integrity: sha512-40xSskRsPrIDIspE1mVRBW03cGdgwpxCpXltj0xZ3fSutj1L6mcQnswd0AzCdnRyYo623zfuPO1jskvTYuAiMw==} engines: {node: '>=14'} dependencies: - '@unocss/core': 0.59.2 + '@unocss/core': 0.59.3 unconfig: 0.3.13 dev: true - /@unocss/core@0.59.2: - resolution: {integrity: sha512-0NtauY7v5bG0UIcvIABWnD2ssD5b9UcFkyw4iRIsT9NvR0e7QqGIOvZEg5XN0j25o50GtxlotMmTAAiaazHZ0Q==} + /@unocss/core@0.59.3: + resolution: {integrity: sha512-G9+1pmQB65KnGj2tvshcMGYs1aqiaw9FWb8cxMRLvQyquuOU/JdULD9vuuchXQ+DLYPTZ4vgDmMJefBJT6JDVw==} dev: true - /@unocss/eslint-plugin@0.59.2(eslint@9.0.0)(typescript@5.4.5): - resolution: {integrity: sha512-QNWJy7jx/gOApmQtcKJnKI5NWF1H579582ZTrna5fjqDbYIfKieNKm16SrpO1wFFwWMoVnvMKlAHQSGR6RXnSQ==} + /@unocss/eslint-plugin@0.59.3(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-kHEr1NO7P3xh7CQwtn3PT58z1B9S9WlWJZ8PFSemEVZgfSn9g6/dW9sok3hEMpdFIBGaeAwDqjNcUI6tO4rbbQ==} engines: {node: '>=14'} dependencies: - '@typescript-eslint/utils': 7.6.0(eslint@9.0.0)(typescript@5.4.5) - '@unocss/config': 0.59.2 - '@unocss/core': 0.59.2 + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.4.5) + '@unocss/config': 0.59.3 + '@unocss/core': 0.59.3 magic-string: 0.30.9 synckit: 0.9.0 transitivePeerDependencies: @@ -3575,8 +3575,8 @@ packages: eslint: 9.0.0 dev: true - /eslint-flat-config-utils@0.2.2: - resolution: {integrity: sha512-iWjXCsGBuyqlGhmam4V9IXlxpDfnc7l0VC1YzncROF2PYIPSRpejugrIp2bXPT5mutKF3zq69Vbt7J9su9E/Lw==} + /eslint-flat-config-utils@0.2.3: + resolution: {integrity: sha512-tfrMNXZfuN4q7sFi1Cr//BN3qdI7c8fLJhbshlp8l9PZIqZ7eVeeyd2Regtu/P9kjOlv18lRlBALzsZaF7ByUg==} dependencies: '@types/eslint': 8.56.9 pathe: 1.1.2 @@ -3601,7 +3601,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.6.0)(eslint-plugin-import@2.29.1)(eslint@9.0.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0)(eslint-plugin-import@2.29.1)(eslint@9.0.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -3611,8 +3611,8 @@ packages: debug: 4.3.4 enhanced-resolve: 5.16.0 eslint: 9.0.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.6.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.6.0)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) fast-glob: 3.3.2 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -3632,7 +3632,7 @@ packages: eslint: 9.0.0 dev: true - /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.6.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0): + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0): resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: @@ -3653,11 +3653,11 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.6.0(eslint@9.0.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.4.5) debug: 3.2.7 eslint: 9.0.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.6.0)(eslint-plugin-import@2.29.1)(eslint@9.0.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0)(eslint-plugin-import@2.29.1)(eslint@9.0.0) transitivePeerDependencies: - supports-color dev: true @@ -3714,7 +3714,7 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 7.6.0(eslint@9.0.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.4.5) deepmerge-ts: 5.1.0 escape-string-regexp: 4.0.0 eslint: 9.0.0 @@ -3732,7 +3732,7 @@ packages: peerDependencies: eslint: ^8.56.0 || ^9.0.0-0 dependencies: - '@typescript-eslint/utils': 7.6.0(eslint@9.0.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.4.5) debug: 4.3.4 doctrine: 3.0.0 eslint: 9.0.0 @@ -3746,7 +3746,7 @@ packages: - typescript dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.6.0)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -3756,7 +3756,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 7.6.0(eslint@9.0.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.4.5) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -3765,7 +3765,7 @@ packages: doctrine: 2.1.0 eslint: 9.0.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.6.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -3955,7 +3955,7 @@ packages: - supports-color dev: true - /eslint-plugin-vitest@0.5.3(@typescript-eslint/eslint-plugin@7.6.0)(eslint@9.0.0)(typescript@5.4.5): + /eslint-plugin-vitest@0.5.3(@typescript-eslint/eslint-plugin@7.7.0)(eslint@9.0.0)(typescript@5.4.5): resolution: {integrity: sha512-D0iu6ppP6FmNSZP4cdhEXqyI+fuW6JwwWdECRrNymd1jiVgUmDgSvtryytonNxHQQWhGNmZM3V/qvpXttH1rRQ==} engines: {node: ^18.0.0 || >= 20.0.0} peerDependencies: @@ -3968,8 +3968,8 @@ packages: vitest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.6.0(@typescript-eslint/parser@7.6.0)(eslint@9.0.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.6.0(eslint@9.0.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@9.0.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.4.5) eslint: 9.0.0 transitivePeerDependencies: - supports-color @@ -4037,8 +4037,8 @@ packages: estraverse: 5.3.0 dev: true - /eslint-typegen@0.2.2(eslint@9.0.0): - resolution: {integrity: sha512-hgKW5octZPdbnOvzWYjzdk3fD8P8n2c7RvmYlVF3zLFjkf2wyvAf9QRt/r8a7jYzqh6lZrVgr81XOe5jwz3z9g==} + /eslint-typegen@0.2.3(eslint@9.0.0): + resolution: {integrity: sha512-mqK+DFIztmumA76bLwP0TZmeMZCmsrT0Dqw/JoQonZFluG1cpI7I/C+kk56wIoHvgU0+uvkNO0h47byEY7wuMg==} peerDependencies: eslint: ^8.45.0 || ^9.0.0 dependencies: @@ -5064,7 +5064,7 @@ packages: eslint: '*' typescript: '>=4.7.4' dependencies: - '@typescript-eslint/type-utils': 7.6.0(eslint@9.0.0)(typescript@5.4.5) + '@typescript-eslint/type-utils': 7.7.0(eslint@9.0.0)(typescript@5.4.5) eslint: 9.0.0 ts-api-utils: 1.3.0(typescript@5.4.5) ts-declaration-location: 1.0.0(typescript@5.4.5) @@ -5391,7 +5391,7 @@ packages: micromatch: 4.0.5 minimist: 1.2.8 picocolors: 1.0.0 - picomatch: 4.0.1 + picomatch: 4.0.2 pretty-ms: 9.0.0 resolve: 1.22.8 smol-toml: 1.1.4 @@ -6501,8 +6501,8 @@ packages: engines: {node: '>=8.6'} dev: true - /picomatch@4.0.1: - resolution: {integrity: sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==} + /picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} dev: true diff --git a/scripts/typegen.ts b/scripts/typegen.ts index 298aa6b5..27dd66b7 100644 --- a/scripts/typegen.ts +++ b/scripts/typegen.ts @@ -8,11 +8,16 @@ import { functional, ignores, imports, + inEditor, javascript, jsdoc, jsonc, markdown, node, + overrides, + promise, + regexp, + sonar, sortTsconfig, stylistic, test, @@ -27,24 +32,29 @@ import { combine } from "../src/utils"; const configs = await combine( comments(), - formatters(), - functional(), - ignores(), - imports(), - javascript(), - jsdoc(), - jsonc(), - markdown(), + formatters({}, {}), + functional({}), + ignores({}), + imports({}), + inEditor(), + javascript({}), + jsdoc({}), + jsonc({}), + markdown({}), node(), + overrides(), + promise(), + regexp(), + sonar({}), sortTsconfig(), - stylistic(), - test(), - toml(), - typescript(), + stylistic({}), + test({}), + toml({}), + typescript({}), unicorn(), - unocss(), - vue(), - yaml(), + unocss({}), + vue({}), + yaml({}), ); const dts = await flatConfigsToRulesDTS(configs, { diff --git a/src/configs/comments.ts b/src/configs/comments.ts index 73daa540..3717030b 100644 --- a/src/configs/comments.ts +++ b/src/configs/comments.ts @@ -3,9 +3,7 @@ import { type ESLint } from "eslint"; import { type FlatConfigItem } from "../types"; import { loadPackages } from "../utils"; -export async function comments( - options: unknown = {}, -): Promise { +export async function comments(): Promise { const [pluginComments] = (await loadPackages([ "eslint-plugin-eslint-comments", ])) as [ESLint.Plugin]; diff --git a/src/configs/formatters.ts b/src/configs/formatters.ts index bd6702db..079d2ce1 100644 --- a/src/configs/formatters.ts +++ b/src/configs/formatters.ts @@ -26,11 +26,9 @@ import { } from "../types"; import { loadPackages, parserPlain } from "../utils"; -import { StylisticConfigDefaults } from "./stylistic"; - export async function formatters( - opts: OptionsFormatters | true = {}, - stylistic: StylisticConfig = StylisticConfigDefaults, + opts: Readonly, + stylistic: Readonly, ): Promise { const options = opts === true diff --git a/src/configs/functional.ts b/src/configs/functional.ts index 04d9c6ae..51ee17f7 100644 --- a/src/configs/functional.ts +++ b/src/configs/functional.ts @@ -9,10 +9,12 @@ import { import { loadPackages } from "../utils"; export async function functional( - options: OptionsFunctional & - OptionsStylistic & - OptionsOverrides & - OptionsTypeScriptParserOptions = {}, + options: Readonly< + OptionsFunctional & + OptionsStylistic & + OptionsOverrides & + OptionsTypeScriptParserOptions + >, ): Promise { const { overrides = {}, diff --git a/src/configs/ignores.ts b/src/configs/ignores.ts index b134023d..d18997e9 100644 --- a/src/configs/ignores.ts +++ b/src/configs/ignores.ts @@ -2,7 +2,7 @@ import { GLOB_EXCLUDE } from "../globs"; import { type FlatConfigItem, type OptionsIgnores } from "../types"; export function ignores( - options: Readonly<{ ignores?: OptionsIgnores }> = {}, + options: Readonly<{ ignores?: OptionsIgnores }>, ): FlatConfigItem[] { const ignoresOptions = options.ignores; @@ -11,11 +11,9 @@ export function ignores( ? [true, ignoresOptions ?? []] : [ignoresOptions.extend ?? true, ignoresOptions.files ?? []]; - const ignores = extend ? [...GLOB_EXCLUDE, ...files] : [...files]; - return [ { - ignores, + ignores: extend ? [...GLOB_EXCLUDE, ...files] : [...files], }, ]; } diff --git a/src/configs/imports.ts b/src/configs/imports.ts index f38edfc6..96558d9c 100644 --- a/src/configs/imports.ts +++ b/src/configs/imports.ts @@ -10,9 +10,11 @@ import { import { loadPackages } from "../utils"; export async function imports( - options: OptionsStylistic & - OptionsTypeScriptWithTypes & - OptionsTypeScriptParserOptions = {}, + options: Readonly< + OptionsStylistic & + OptionsTypeScriptWithTypes & + OptionsTypeScriptParserOptions + >, ): Promise { const { stylistic = true } = options; diff --git a/src/configs/in-editor.ts b/src/configs/in-editor.ts index 06961644..af439aa3 100644 --- a/src/configs/in-editor.ts +++ b/src/configs/in-editor.ts @@ -1,6 +1,6 @@ import { type FlatConfigItem } from "../types"; -export function inEditor(options: unknown = {}): FlatConfigItem[] { +export function inEditor(): FlatConfigItem[] { return [ { name: "rs:in-editor", diff --git a/src/configs/index.ts b/src/configs/index.ts index 76c7c04e..560d824d 100644 --- a/src/configs/index.ts +++ b/src/configs/index.ts @@ -19,3 +19,6 @@ export * from "./unicorn"; export * from "./unocss"; export * from "./vue"; export * from "./yaml"; +export * from "./promise"; +export * from "./regexp"; +export * from "./sonar"; diff --git a/src/configs/javascript.ts b/src/configs/javascript.ts index 93be4392..58f72845 100644 --- a/src/configs/javascript.ts +++ b/src/configs/javascript.ts @@ -1,4 +1,3 @@ -import { type ESLint } from "eslint"; import globals from "globals"; import { @@ -6,25 +5,16 @@ import { type OptionsFunctional, type OptionsOverrides, } from "../types"; -import { loadPackages } from "../utils"; const useNumberIsFinite = "Please use Number.isFinite instead"; const useNumberIsNan = "Please use Number.isNaN instead"; const useObjectDefineProperty = "Please use Object.defineProperty instead."; -export async function javascript( - options: OptionsOverrides & OptionsFunctional = {}, -): Promise { +export function javascript( + options: Readonly, +): FlatConfigItem[] { const { functionalEnforcement = "none", overrides = {} } = options; - const [pluginRegexp, pluginOptimizeRegex, pluginPromise, pluginSonar] = - (await loadPackages([ - "eslint-plugin-regexp", - "eslint-plugin-optimize-regex", - "eslint-plugin-promise", - "eslint-plugin-sonarjs", - ])) as [ESLint.Plugin, ESLint.Plugin, ESLint.Plugin, ESLint.Plugin]; - return [ { name: "rs:javascript", @@ -48,17 +38,6 @@ export async function javascript( linterOptions: { reportUnusedDisableDirectives: true, }, - plugins: { - regexp: { - ...pluginRegexp, - rules: { - ...pluginRegexp.rules, - ...pluginOptimizeRegex.rules, - }, - }, - promise: pluginPromise, - sonar: pluginSonar, - }, rules: { "accessor-pairs": "error", "array-callback-return": "error", @@ -361,117 +340,11 @@ export async function javascript( "vars-on-top": "error", yoda: ["error", "never"], - "no-empty-character-class": "off", - "no-invalid-regexp": "off", - "no-useless-backreference": "off", - "regexp/confusing-quantifier": "error", - "regexp/control-character-escape": "error", - "regexp/match-any": "error", - "regexp/negation": "error", - "regexp/no-contradiction-with-assertion": "error", - "regexp/no-dupe-characters-character-class": "error", - "regexp/no-dupe-disjunctions": "error", - "regexp/no-empty-alternative": "error", - "regexp/no-empty-capturing-group": "error", - "regexp/no-empty-character-class": "error", - "regexp/no-empty-group": "error", - "regexp/no-empty-lookarounds-assertion": "error", - "regexp/no-empty-string-literal": "error", - "regexp/no-escape-backspace": "error", - "regexp/no-extra-lookaround-assertions": "error", - "regexp/no-invalid-regexp": "error", - "regexp/no-invisible-character": "error", - "regexp/no-lazy-ends": "error", - "regexp/no-legacy-features": "error", - "regexp/no-misleading-capturing-group": "error", - "regexp/no-misleading-unicode-character": "error", - "regexp/no-missing-g-flag": "error", - "regexp/no-non-standard-flag": "error", - "regexp/no-obscure-range": "error", - "regexp/no-optional-assertion": "error", - "regexp/no-potentially-useless-backreference": "error", - "regexp/no-super-linear-backtracking": "error", - "regexp/no-trivially-nested-assertion": "error", - "regexp/no-trivially-nested-quantifier": "error", - "regexp/no-unused-capturing-group": "error", - "regexp/no-useless-assertions": "error", - "regexp/no-useless-backreference": "error", - "regexp/no-useless-character-class": "error", - "regexp/no-useless-dollar-replacements": "error", - "regexp/no-useless-escape": "error", - "regexp/no-useless-flag": "error", - "regexp/no-useless-lazy": "error", - "regexp/no-useless-non-capturing-group": "error", - "regexp/no-useless-quantifier": "error", - "regexp/no-useless-range": "error", - "regexp/no-useless-set-operand": "error", - "regexp/no-useless-string-literal": "error", - "regexp/no-useless-two-nums-quantifier": "error", - "regexp/no-zero-quantifier": "error", - "regexp/optimal-lookaround-quantifier": "error", - "regexp/optimal-quantifier-concatenation": "error", - "regexp/optimize-regex": "error", - "regexp/prefer-character-class": "error", - "regexp/prefer-d": "error", - "regexp/prefer-plus-quantifier": "error", - "regexp/prefer-predefined-assertion": "error", - "regexp/prefer-question-quantifier": "error", - "regexp/prefer-range": "error", - "regexp/prefer-set-operation": "error", - "regexp/prefer-star-quantifier": "error", - "regexp/prefer-unicode-codepoint-escapes": "error", - "regexp/prefer-w": "error", - "regexp/simplify-set-operations": "error", - "regexp/sort-flags": "error", - "regexp/strict": "error", - "regexp/use-ignore-case": "error", - - "promise/avoid-new": "warn", - "promise/no-callback-in-promise": "error", - // "promise/no-nesting": "error", // Doesn't work with eslint 9 yet - "promise/no-new-statics": "error", - // "promise/no-promise-in-callback": "error", // Doesn't work with eslint 9 yet - "promise/no-return-in-finally": "error", - // "promise/no-return-wrap": "error", // Doesn't work with eslint 9 yet - "promise/param-names": "error", - "promise/valid-params": "error", - - "sonar/no-all-duplicated-branches": "error", - "sonar/no-collapsible-if": "error", - "sonar/no-collection-size-mischeck": "error", - "sonar/no-duplicated-branches": "error", - "sonar/no-element-overwrite": "error", - // "sonar/no-empty-collection": "error", // Doesn't work with eslint 9 yet - // "sonar/no-extra-arguments": "error", // Doesn't work with eslint 9 yet - // "sonar/no-gratuitous-expressions": "error", // Doesn't work with eslint 9 yet - "sonar/no-identical-conditions": "error", - "sonar/no-identical-expressions": "error", - "sonar/no-identical-functions": "error", - "sonar/no-ignored-return": "error", - "sonar/no-inverted-boolean-check": "error", - "sonar/no-nested-switch": "error", - "sonar/no-nested-template-literals": "error", - "sonar/no-one-iteration-loop": "error", - "sonar/no-redundant-boolean": "error", - // "sonar/no-redundant-jump": "error", // Doesn't work with eslint 9 yet - "sonar/no-same-line-conditional": "error", - // "sonar/no-unused-collection": "error", // Doesn't work with eslint 9 yet - // "sonar/no-use-of-empty-return-value": "error", // Doesn't work with eslint 9 yet - "sonar/no-useless-catch": "error", - "sonar/non-existent-operator": "error", - "sonar/prefer-immediate-return": "error", - "sonar/prefer-object-literal": "error", - "sonar/prefer-single-boolean-return": "error", - "sonar/prefer-while": "error", - ...(functionalEnforcement === "none" ? {} - : functionalEnforcement === "lite" - ? { "no-param-reassign": "error" } - : { - "no-param-reassign": "error", - "sonar/elseif-without-else": "error", - }), + : { + "no-param-reassign": "error", + }), ...overrides, }, diff --git a/src/configs/jsdoc.ts b/src/configs/jsdoc.ts index abe59a79..87308ff0 100644 --- a/src/configs/jsdoc.ts +++ b/src/configs/jsdoc.ts @@ -4,7 +4,7 @@ import { type FlatConfigItem, type OptionsStylistic } from "../types"; import { loadPackages } from "../utils"; export async function jsdoc( - options: OptionsStylistic = {}, + options: Readonly, ): Promise { const { stylistic = true } = options; diff --git a/src/configs/jsonc.ts b/src/configs/jsonc.ts index 48a144d7..57c0a29c 100644 --- a/src/configs/jsonc.ts +++ b/src/configs/jsonc.ts @@ -10,7 +10,7 @@ import { import { loadPackages } from "../utils"; export async function jsonc( - options: OptionsFiles & OptionsStylistic & OptionsOverrides = {}, + options: Readonly, ): Promise { const { files = [GLOB_JSON, GLOB_JSON5, GLOB_JSONC], diff --git a/src/configs/markdown.ts b/src/configs/markdown.ts index 6b51b549..4ff8d9c5 100644 --- a/src/configs/markdown.ts +++ b/src/configs/markdown.ts @@ -15,7 +15,7 @@ import { import { interopDefault, loadPackages, parserPlain } from "../utils"; export async function markdown( - options: OptionsFiles & OptionsComponentExts & OptionsOverrides = {}, + options: Readonly, ): Promise { const { componentExts = [], diff --git a/src/configs/node.ts b/src/configs/node.ts index 2f63c043..27b878ed 100644 --- a/src/configs/node.ts +++ b/src/configs/node.ts @@ -4,7 +4,7 @@ import { GLOB_MJS, GLOB_TS } from "../globs"; import { type FlatConfigItem } from "../types"; import { loadPackages } from "../utils"; -export async function node(options: unknown = {}): Promise { +export async function node(): Promise { const [pluginNode] = (await loadPackages(["eslint-plugin-n"])) as [ ESLint.Plugin, ]; diff --git a/src/configs/promise.ts b/src/configs/promise.ts new file mode 100644 index 00000000..a5680b94 --- /dev/null +++ b/src/configs/promise.ts @@ -0,0 +1,30 @@ +import { type ESLint } from "eslint"; + +import { type FlatConfigItem } from "../types"; +import { loadPackages } from "../utils"; + +export async function promise(): Promise { + const [pluginPromise] = (await loadPackages(["eslint-plugin-promise"])) as [ + ESLint.Plugin, + ]; + + return [ + { + name: "rs:node", + plugins: { + promise: pluginPromise, + }, + rules: { + "promise/avoid-new": "warn", + "promise/no-callback-in-promise": "error", + // "promise/no-nesting": "error", // Doesn't work with eslint 9 yet + "promise/no-new-statics": "error", + // "promise/no-promise-in-callback": "error", // Doesn't work with eslint 9 yet + "promise/no-return-in-finally": "error", + // "promise/no-return-wrap": "error", // Doesn't work with eslint 9 yet + "promise/param-names": "error", + "promise/valid-params": "error", + }, + }, + ]; +} diff --git a/src/configs/regexp.ts b/src/configs/regexp.ts new file mode 100644 index 00000000..cd511390 --- /dev/null +++ b/src/configs/regexp.ts @@ -0,0 +1,93 @@ +import { type ESLint } from "eslint"; + +import { type FlatConfigItem } from "../types"; +import { loadPackages } from "../utils"; + +export async function regexp(): Promise { + const [pluginRegexp, pluginOptimizeRegex] = (await loadPackages([ + "eslint-plugin-regexp", + "eslint-plugin-optimize-regex", + ])) as [ESLint.Plugin, ESLint.Plugin]; + + return [ + { + name: "rs:node", + plugins: { + regexp: { + ...pluginRegexp, + rules: { + ...pluginRegexp.rules, + ...pluginOptimizeRegex.rules, + }, + }, + }, + rules: { + "no-empty-character-class": "off", + "no-invalid-regexp": "off", + "no-useless-backreference": "off", + + "regexp/confusing-quantifier": "error", + "regexp/control-character-escape": "error", + "regexp/match-any": "error", + "regexp/negation": "error", + "regexp/no-contradiction-with-assertion": "error", + "regexp/no-dupe-characters-character-class": "error", + "regexp/no-dupe-disjunctions": "error", + "regexp/no-empty-alternative": "error", + "regexp/no-empty-capturing-group": "error", + "regexp/no-empty-character-class": "error", + "regexp/no-empty-group": "error", + "regexp/no-empty-lookarounds-assertion": "error", + "regexp/no-empty-string-literal": "error", + "regexp/no-escape-backspace": "error", + "regexp/no-extra-lookaround-assertions": "error", + "regexp/no-invalid-regexp": "error", + "regexp/no-invisible-character": "error", + "regexp/no-lazy-ends": "error", + "regexp/no-legacy-features": "error", + "regexp/no-misleading-capturing-group": "error", + "regexp/no-misleading-unicode-character": "error", + "regexp/no-missing-g-flag": "error", + "regexp/no-non-standard-flag": "error", + "regexp/no-obscure-range": "error", + "regexp/no-optional-assertion": "error", + "regexp/no-potentially-useless-backreference": "error", + "regexp/no-super-linear-backtracking": "error", + "regexp/no-trivially-nested-assertion": "error", + "regexp/no-trivially-nested-quantifier": "error", + "regexp/no-unused-capturing-group": "error", + "regexp/no-useless-assertions": "error", + "regexp/no-useless-backreference": "error", + "regexp/no-useless-character-class": "error", + "regexp/no-useless-dollar-replacements": "error", + "regexp/no-useless-escape": "error", + "regexp/no-useless-flag": "error", + "regexp/no-useless-lazy": "error", + "regexp/no-useless-non-capturing-group": "error", + "regexp/no-useless-quantifier": "error", + "regexp/no-useless-range": "error", + "regexp/no-useless-set-operand": "error", + "regexp/no-useless-string-literal": "error", + "regexp/no-useless-two-nums-quantifier": "error", + "regexp/no-zero-quantifier": "error", + "regexp/optimal-lookaround-quantifier": "error", + "regexp/optimal-quantifier-concatenation": "error", + "regexp/optimize-regex": "error", + "regexp/prefer-character-class": "error", + "regexp/prefer-d": "error", + "regexp/prefer-plus-quantifier": "error", + "regexp/prefer-predefined-assertion": "error", + "regexp/prefer-question-quantifier": "error", + "regexp/prefer-range": "error", + "regexp/prefer-set-operation": "error", + "regexp/prefer-star-quantifier": "error", + "regexp/prefer-unicode-codepoint-escapes": "error", + "regexp/prefer-w": "error", + "regexp/simplify-set-operations": "error", + "regexp/sort-flags": "error", + "regexp/strict": "error", + "regexp/use-ignore-case": "error", + }, + }, + ]; +} diff --git a/src/configs/sonar.ts b/src/configs/sonar.ts new file mode 100644 index 00000000..bbf6e8e1 --- /dev/null +++ b/src/configs/sonar.ts @@ -0,0 +1,59 @@ +import { type ESLint } from "eslint"; + +import { type FlatConfigItem, type OptionsFunctional } from "../types"; +import { loadPackages } from "../utils"; + +export async function sonar( + options: Readonly, +): Promise { + const { functionalEnforcement = "none" } = options; + + const [pluginSonar] = (await loadPackages(["eslint-plugin-sonarjs"])) as [ + ESLint.Plugin, + ]; + + return [ + { + name: "rs:node", + plugins: { + sonar: pluginSonar, + }, + rules: { + "sonar/no-all-duplicated-branches": "error", + "sonar/no-collapsible-if": "error", + "sonar/no-collection-size-mischeck": "error", + "sonar/no-duplicated-branches": "error", + "sonar/no-element-overwrite": "error", + // "sonar/no-empty-collection": "error", // Doesn't work with eslint 9 yet + // "sonar/no-extra-arguments": "error", // Doesn't work with eslint 9 yet + // "sonar/no-gratuitous-expressions": "error", // Doesn't work with eslint 9 yet + "sonar/no-identical-conditions": "error", + "sonar/no-identical-expressions": "error", + "sonar/no-identical-functions": "error", + "sonar/no-ignored-return": "error", + "sonar/no-inverted-boolean-check": "error", + "sonar/no-nested-switch": "error", + "sonar/no-nested-template-literals": "error", + "sonar/no-one-iteration-loop": "error", + "sonar/no-redundant-boolean": "error", + // "sonar/no-redundant-jump": "error", // Doesn't work with eslint 9 yet + "sonar/no-same-line-conditional": "error", + // "sonar/no-unused-collection": "error", // Doesn't work with eslint 9 yet + // "sonar/no-use-of-empty-return-value": "error", // Doesn't work with eslint 9 yet + "sonar/no-useless-catch": "error", + "sonar/non-existent-operator": "error", + "sonar/prefer-immediate-return": "error", + "sonar/prefer-object-literal": "error", + "sonar/prefer-single-boolean-return": "error", + "sonar/prefer-while": "error", + + ...(functionalEnforcement === "default" || + functionalEnforcement === "strict" + ? { + "sonar/elseif-without-else": "error", + } + : {}), + }, + }, + ]; +} diff --git a/src/configs/stylistic.ts b/src/configs/stylistic.ts index f94338df..edb033c3 100644 --- a/src/configs/stylistic.ts +++ b/src/configs/stylistic.ts @@ -3,12 +3,13 @@ import { type ESLint } from "eslint"; import { type FlatConfigItem, + type OptionsHasTypeScript, type OptionsOverrides, type StylisticConfig, } from "../types"; import { loadPackages } from "../utils"; -export const StylisticConfigDefaults: StylisticConfig = { +export const StylisticConfigDefaults: Required = { indent: 2, jsx: true, quotes: "double", @@ -16,9 +17,20 @@ export const StylisticConfigDefaults: StylisticConfig = { }; export async function stylistic( - options: StylisticConfig & OptionsOverrides = {}, + options: Readonly< + { stylistic?: StylisticConfig } & OptionsOverrides & OptionsHasTypeScript + >, ): Promise { - const { indent, jsx, overrides = {}, quotes, semi } = options; + const { + stylistic: { + indent = StylisticConfigDefaults.indent, + jsx = StylisticConfigDefaults.jsx, + quotes = StylisticConfigDefaults.quotes, + semi = StylisticConfigDefaults.semi, + } = StylisticConfigDefaults, + overrides = {}, + typescript = false, + } = options; const [pluginStylistic] = (await loadPackages([ "@stylistic/eslint-plugin", @@ -55,6 +67,14 @@ export async function stylistic( functions: "ignore", imports: "only-multiline", objects: "only-multiline", + + ...(typescript + ? { + enums: "only-multiline", + generics: "only-multiline", + tuples: "only-multiline", + } + : {}), }, ], "style/comma-spacing": ["error", { before: false, after: true }], @@ -64,24 +84,26 @@ export async function stylistic( "style/eol-last": "error", "style/func-call-spacing": ["error", "never"], "style/generator-star-spacing": ["error", "after"], - "style/indent": [ - "error", - indent ?? 2, - { - SwitchCase: 1, - VariableDeclarator: 1, - outerIIFEBody: 1, - MemberExpression: 1, - FunctionDeclaration: { parameters: 1, body: 1 }, - FunctionExpression: { parameters: 1, body: 1 }, - CallExpression: { arguments: 1 }, - ArrayExpression: 1, - ObjectExpression: 1, - ImportDeclaration: 1, - flatTernaryExpressions: false, - ignoreComments: false, - }, - ], + "style/indent": typescript + ? "off" + : [ + "error", + indent, + { + SwitchCase: 1, + VariableDeclarator: 1, + outerIIFEBody: 1, + MemberExpression: 1, + FunctionDeclaration: { parameters: 1, body: 1 }, + FunctionExpression: { parameters: 1, body: 1 }, + CallExpression: { arguments: 1 }, + ArrayExpression: 1, + ObjectExpression: 1, + ImportDeclaration: 1, + flatTernaryExpressions: false, + ignoreComments: false, + }, + ], "style/indent-binary-ops": "error", "style/key-spacing": [ "error", @@ -105,12 +127,32 @@ export async function stylistic( allowArrayEnd: true, allowClassStart: true, allowClassEnd: true, + + ...(typescript + ? { + allowEnumEnd: true, + allowEnumStart: true, + allowInterfaceEnd: true, + allowInterfaceStart: true, + allowModuleEnd: true, + allowModuleStart: true, + allowTypeEnd: true, + allowTypeStart: true, + } + : {}), }, ], "style/lines-between-class-members": [ "error", "always", - { exceptAfterSingleLine: true }, + { + exceptAfterSingleLine: true, + ...(typescript + ? { + exceptAfterOverload: true, + } + : {}), + }, ], "style/max-statements-per-line": ["error", { max: 1 }], "style/multiline-ternary": ["error", "always-multiline"], @@ -195,13 +237,13 @@ export async function stylistic( "style/quote-props": ["error", "consistent-as-needed"], "style/quotes": [ "error", - quotes ?? "double", + quotes, { avoidEscape: true, allowTemplateLiterals: true }, ], "style/rest-spread-spacing": ["error", "never"], "style/semi-spacing": ["error", { before: false, after: true }], "style/semi-style": ["error", "last"], - "style/semi": ["error", semi === false ? "never" : "always"], + "style/semi": ["error", semi ? "always" : "never"], "style/space-before-blocks": ["error", "always"], "style/space-before-function-paren": [ "error", @@ -238,8 +280,13 @@ export async function stylistic( { functionPrototypeMethods: true }, ], "style/yield-star-spacing": ["error", "after"], - "style/type-annotation-spacing": "error", - "style/member-delimiter-style": "error", + + ...(typescript + ? { + "style/member-delimiter-style": "error", + "style/type-annotation-spacing": "error", + } + : {}), ...overrides, }, diff --git a/src/configs/test.ts b/src/configs/test.ts index dbb2ccf5..8809ed3a 100644 --- a/src/configs/test.ts +++ b/src/configs/test.ts @@ -9,7 +9,7 @@ import { import { interopDefault, loadPackages } from "../utils"; export async function test( - options: OptionsFiles & OptionsOverrides = {}, + options: Readonly, ): Promise { const { files = GLOB_TESTS, overrides = {} } = options; diff --git a/src/configs/toml.ts b/src/configs/toml.ts index e9a2c586..e2b8e5cb 100644 --- a/src/configs/toml.ts +++ b/src/configs/toml.ts @@ -10,7 +10,7 @@ import { import { loadPackages } from "../utils"; export async function toml( - options: OptionsOverrides & OptionsStylistic & OptionsFiles = {}, + options: Readonly, ): Promise { const { files = [GLOB_TOML], overrides = {}, stylistic = true } = options; diff --git a/src/configs/typescript.ts b/src/configs/typescript.ts index de1b0d2f..cc49ddd5 100644 --- a/src/configs/typescript.ts +++ b/src/configs/typescript.ts @@ -23,12 +23,14 @@ import { import { loadPackages, toArray } from "../utils"; export async function typescript( - options: OptionsFiles & - OptionsComponentExts & - OptionsOverrides & - OptionsTypeScriptWithTypes & - OptionsTypeScriptParserOptions & - OptionsTypeScriptUnsafeSeverity = {}, + options: Readonly< + OptionsFiles & + OptionsComponentExts & + OptionsOverrides & + OptionsTypeScriptWithTypes & + OptionsTypeScriptParserOptions & + OptionsTypeScriptUnsafeSeverity + >, ): Promise { const { componentExts = [], diff --git a/src/configs/unicorn.ts b/src/configs/unicorn.ts index bf4a3b8f..bdf6de33 100644 --- a/src/configs/unicorn.ts +++ b/src/configs/unicorn.ts @@ -3,9 +3,7 @@ import { type ESLint } from "eslint"; import { type FlatConfigItem } from "../types"; import { loadPackages } from "../utils"; -export async function unicorn( - options: unknown = {}, -): Promise { +export async function unicorn(): Promise { const [pluginUnicorn] = (await loadPackages(["eslint-plugin-unicorn"])) as [ ESLint.Plugin, ]; diff --git a/src/configs/unocss.ts b/src/configs/unocss.ts index 5f5adf57..f33f5873 100644 --- a/src/configs/unocss.ts +++ b/src/configs/unocss.ts @@ -4,7 +4,7 @@ import { type FlatConfigItem, type OptionsUnoCSS } from "../types"; import { loadPackages } from "../utils"; export async function unocss( - options: OptionsUnoCSS = {}, + options: Readonly, ): Promise { const { attributify = true, strict = true } = options; diff --git a/src/configs/vue.ts b/src/configs/vue.ts index 8c159320..da1e3553 100644 --- a/src/configs/vue.ts +++ b/src/configs/vue.ts @@ -33,7 +33,7 @@ export async function vue( OptionsOverrides & OptionsStylistic & OptionsFiles - > = {}, + >, ): Promise { const { files = [GLOB_VUE], diff --git a/src/configs/yaml.ts b/src/configs/yaml.ts index dbb6eb70..db0b3516 100644 --- a/src/configs/yaml.ts +++ b/src/configs/yaml.ts @@ -10,7 +10,7 @@ import { import { loadPackages } from "../utils"; export async function yaml( - options: OptionsOverrides & OptionsStylistic & OptionsFiles = {}, + options: Readonly, ): Promise { const { files = [GLOB_YAML], overrides = {}, stylistic = true } = options; diff --git a/src/factory.ts b/src/factory.ts index dcdb3086..4103d9ba 100644 --- a/src/factory.ts +++ b/src/factory.ts @@ -15,6 +15,9 @@ import { markdown, node, overrides, + promise, + regexp, + sonar, sortTsconfig, stylistic, test, @@ -83,14 +86,11 @@ export function rsEslint( : typeof options.stylistic === "object" ? { ...StylisticConfigDefaults, + jsx: jsxOptions, ...options.stylistic, } : StylisticConfigDefaults; - if (stylisticOptions !== false && !("jsx" in stylisticOptions)) { - stylisticOptions.jsx = jsxOptions; - } - const functionalEnforcement = typeof functionalOptions === "string" ? functionalOptions @@ -98,6 +98,8 @@ export function rsEslint( ? functionalOptions.functionalEnforcement ?? "default" : "default"; + const hasTypeScript = Boolean(typeScriptOptions); + const configs: Array> = []; // Base configs @@ -116,6 +118,9 @@ export function rsEslint( jsdoc({ stylistic: stylisticOptions, }), + promise(), + regexp(), + sonar({ functionalEnforcement }), comments(), unicorn(), node(), @@ -138,7 +143,8 @@ export function rsEslint( if (stylisticOptions !== false) { configs.push( stylistic({ - ...stylisticOptions, + stylistic: stylisticOptions, + typescript: hasTypeScript, overrides: getOverrides(options, "stylistic"), }), ); @@ -170,7 +176,7 @@ export function rsEslint( ...resolveSubOptions(options, "vue"), overrides: getOverrides(options, "vue"), stylistic: stylisticOptions, - typescript: Boolean(typeScriptOptions), + typescript: hasTypeScript, }), ); } @@ -225,7 +231,7 @@ export function rsEslint( configs.push( formatters( formattersOptions, - typeof stylisticOptions === "boolean" ? {} : stylisticOptions, + stylisticOptions === false ? {} : stylisticOptions, ), ); } @@ -238,7 +244,7 @@ export function rsEslint( let m_composer = new FlatConfigComposer().append( ...configs, - ...(userConfigs as any), + ...userConfigs, ); if (autoRenamePlugins) { diff --git a/src/utils.ts b/src/utils.ts index 52764fb5..96f464d8 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,6 +1,8 @@ -import { type Awaitable, type FlatConfigItem } from "eslint-flat-config-utils"; +import { type Awaitable } from "eslint-flat-config-utils"; import { isPackageExists } from "local-pkg"; +import { type FlatConfigItem } from "./types"; + /** * Combine array and non-array configs into a single array. */