eslint-plugin-lingui
Advanced tools
Comparing version 0.3.0 to 0.4.0
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.rules = void 0; | ||
const no_expression_in_message_1 = require("./rules/no-expression-in-message"); | ||
const no_unlocalized_strings_1 = require("./rules/no-unlocalized-strings"); | ||
const no_single_tag_to_translate_1 = require("./rules/no-single-tag-to-translate"); | ||
const no_single_variables_to_translate_1 = require("./rules/no-single-variables-to-translate"); | ||
const t_call_in_function_1 = require("./rules/t-call-in-function"); | ||
const text_restrictions_1 = require("./rules/text-restrictions"); | ||
const no_trans_inside_trans_1 = require("./rules/no-trans-inside-trans"); | ||
exports.rules = { | ||
'no-expression-in-message': no_expression_in_message_1.default, | ||
'no-unlocalized-strings': no_unlocalized_strings_1.default, | ||
'no-single-tag-to-translate': no_single_tag_to_translate_1.default, | ||
'no-single-variables-to-translate': no_single_variables_to_translate_1.default, | ||
't-call-in-function': t_call_in_function_1.default, | ||
'text-restrictions': text_restrictions_1.default, | ||
'no-trans-inside-trans': no_trans_inside_trans_1.default, | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
var desc = Object.getOwnPropertyDescriptor(m, k); | ||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
desc = { enumerable: true, get: function() { return m[k]; } }; | ||
} | ||
Object.defineProperty(o, k2, desc); | ||
}) : (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
o[k2] = m[k]; | ||
})); | ||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
}) : function(o, v) { | ||
o["default"] = v; | ||
}); | ||
var __importStar = (this && this.__importStar) || function (mod) { | ||
if (mod && mod.__esModule) return mod; | ||
var result = {}; | ||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||
__setModuleDefault(result, mod); | ||
return result; | ||
}; | ||
const noExpressionInMessageRule = __importStar(require("./rules/no-expression-in-message")); | ||
const noUnlocalizedStringsRule = __importStar(require("./rules/no-unlocalized-strings")); | ||
const noSingleTagToTranslateRule = __importStar(require("./rules/no-single-tag-to-translate")); | ||
const noSingleVariablesToTranslateRule = __importStar(require("./rules/no-single-variables-to-translate")); | ||
const tCallInFunctionRule = __importStar(require("./rules/t-call-in-function")); | ||
const textRestrictionsRule = __importStar(require("./rules/text-restrictions")); | ||
const noTransInsideTransRule = __importStar(require("./rules/no-trans-inside-trans")); | ||
const rules = { | ||
[noExpressionInMessageRule.name]: noExpressionInMessageRule.rule, | ||
[noUnlocalizedStringsRule.name]: noUnlocalizedStringsRule.rule, | ||
[noSingleTagToTranslateRule.name]: noSingleTagToTranslateRule.rule, | ||
[noSingleVariablesToTranslateRule.name]: noSingleVariablesToTranslateRule.rule, | ||
[tCallInFunctionRule.name]: tCallInFunctionRule.rule, | ||
[textRestrictionsRule.name]: textRestrictionsRule.rule, | ||
[noTransInsideTransRule.name]: noTransInsideTransRule.rule, | ||
}; | ||
const plugin = { | ||
meta: { | ||
name: 'eslint-plugin-lingui', | ||
}, | ||
configs: {}, | ||
rules, | ||
}; | ||
const recommendedRules = { | ||
'lingui/t-call-in-function': 'error', | ||
'lingui/no-single-tag-to-translate': 'warn', | ||
'lingui/no-single-variable-to-translate': 'warn', | ||
'lingui/no-trans-inside-trans': 'warn', | ||
}; | ||
// Assign configs here so we can reference `plugin` | ||
Object.assign(plugin.configs, { | ||
recommended: { | ||
plugins: ['lingui'], | ||
rules: recommendedRules, | ||
}, | ||
'flat/recommended': { | ||
plugins: { | ||
lingui: plugin, | ||
}, | ||
rules: recommendedRules, | ||
}, | ||
}); | ||
module.exports = plugin; | ||
//# sourceMappingURL=index.js.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.rule = exports.name = void 0; | ||
const utils_1 = require("@typescript-eslint/utils"); | ||
const helpers_1 = require("../helpers"); | ||
const rule = { | ||
const create_rule_1 = require("../create-rule"); | ||
exports.name = 'no-expression-in-message'; | ||
exports.rule = (0, create_rule_1.createRule)({ | ||
name: 'no-expression-in-message', | ||
meta: { | ||
@@ -25,2 +29,3 @@ docs: { | ||
create: function (context) { | ||
const linguiMacroFunctionNames = ['plural', 'select', 'selectOrdinal']; | ||
return { | ||
@@ -30,3 +35,7 @@ 'TemplateLiteral:exit'(node) { | ||
? node.expressions.filter((expression) => { | ||
return expression.type !== utils_1.TSESTree.AST_NODE_TYPES.Identifier; | ||
const isIdentifier = expression.type === utils_1.TSESTree.AST_NODE_TYPES.Identifier; | ||
const isCallToLinguiMacro = expression.type === utils_1.TSESTree.AST_NODE_TYPES.CallExpression && | ||
expression.callee.type === utils_1.TSESTree.AST_NODE_TYPES.Identifier && | ||
linguiMacroFunctionNames.includes(expression.callee.name); | ||
return !isIdentifier && !isCallToLinguiMacro; | ||
}) | ||
@@ -47,4 +56,3 @@ : []; | ||
}, | ||
}; | ||
exports.default = rule; | ||
}); | ||
//# sourceMappingURL=no-expression-in-message.js.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.rule = exports.name = void 0; | ||
const utils_1 = require("@typescript-eslint/utils"); | ||
const rule = { | ||
const create_rule_1 = require("../create-rule"); | ||
exports.name = 'no-single-tag-to-translate'; | ||
exports.rule = (0, create_rule_1.createRule)({ | ||
name: exports.name, | ||
meta: { | ||
@@ -48,4 +52,3 @@ docs: { | ||
}, | ||
}; | ||
exports.default = rule; | ||
}); | ||
//# sourceMappingURL=no-single-tag-to-translate.js.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.rule = exports.name = void 0; | ||
const utils_1 = require("@typescript-eslint/utils"); | ||
const helpers_1 = require("../helpers"); | ||
const rule = { | ||
const create_rule_1 = require("../create-rule"); | ||
exports.name = 'no-single-variable-to-translate'; | ||
exports.rule = (0, create_rule_1.createRule)({ | ||
name: exports.name, | ||
meta: { | ||
@@ -70,4 +74,3 @@ docs: { | ||
}, | ||
}; | ||
exports.default = rule; | ||
}); | ||
//# sourceMappingURL=no-single-variables-to-translate.js.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.rule = exports.name = void 0; | ||
const helpers_1 = require("../helpers"); | ||
const rule = { | ||
const create_rule_1 = require("../create-rule"); | ||
exports.name = 'no-trans-inside-trans'; | ||
exports.rule = (0, create_rule_1.createRule)({ | ||
name: exports.name, | ||
meta: { | ||
@@ -38,4 +42,3 @@ docs: { | ||
}, | ||
}; | ||
exports.default = rule; | ||
}); | ||
//# sourceMappingURL=no-trans-inside-trans.js.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.rule = exports.name = void 0; | ||
const utils_1 = require("@typescript-eslint/utils"); | ||
const helpers_1 = require("../helpers"); | ||
const rule = { | ||
const create_rule_1 = require("../create-rule"); | ||
exports.name = 'no-unlocalized-strings'; | ||
exports.rule = (0, create_rule_1.createRule)({ | ||
name: exports.name, | ||
meta: { | ||
@@ -42,2 +46,5 @@ docs: { | ||
}, | ||
useTsTypes: { | ||
type: 'boolean', | ||
}, | ||
}, | ||
@@ -52,3 +59,3 @@ additionalProperties: false, | ||
// variables should be defined here | ||
const { parserServices, options: [option], } = context; | ||
const { options: [option], } = context; | ||
const whitelists = [ | ||
@@ -120,2 +127,3 @@ /^[^A-Za-z]+$/, | ||
'height', | ||
'displayName', | ||
...ignoredProperties, | ||
@@ -139,7 +147,2 @@ ]; | ||
} | ||
const { esTreeNodeToTSNodeMap, program } = parserServices; | ||
let typeChecker; | ||
if (program && esTreeNodeToTSNodeMap) { | ||
typeChecker = program.getTypeChecker(); | ||
} | ||
const getAttrName = (node) => { | ||
@@ -264,3 +267,3 @@ if (typeof node === 'string') { | ||
// ───────────────────────────────────────────────────────────────── | ||
'ClassProperty > Literal'(node) { | ||
'ClassProperty > Literal, PropertyDefinition > Literal'(node) { | ||
onClassProperty(node); | ||
@@ -282,2 +285,15 @@ }, | ||
}, | ||
'MemberExpression[computed=true] > Literal'(node) { | ||
// obj["key with space"] | ||
visited.add(node); | ||
}, | ||
"AssignmentExpression[left.type='MemberExpression'] > Literal"(node) { | ||
const assignmentExp = node.parent; | ||
const memberExp = assignmentExp.left; | ||
if (!memberExp.computed && | ||
memberExp.property.type === utils_1.TSESTree.AST_NODE_TYPES.Identifier && | ||
userProperties.includes(memberExp.property.name)) { | ||
visited.add(node); | ||
} | ||
}, | ||
'BinaryExpression > Literal'(node) { | ||
@@ -313,5 +329,5 @@ onBinaryExpression(node); | ||
// | ||
if (typeChecker) { | ||
const tsNode = esTreeNodeToTSNodeMap.get(node); | ||
const typeObj = typeChecker.getTypeAtLocation(tsNode.parent); | ||
if (option === null || option === void 0 ? void 0 : option.useTsTypes) { | ||
const services = utils_1.ESLintUtils.getParserServices(context); | ||
const typeObj = services.getTypeAtLocation(node.parent); | ||
// var a: 'abc' = 'abc' | ||
@@ -346,2 +362,6 @@ if (typeObj.isStringLiteral() && typeObj.symbol) { | ||
}, | ||
'MemberExpression[computed=true] > TemplateLiteral'(node) { | ||
// obj[`key with space`] | ||
visited.add(node); | ||
}, | ||
'Property > TemplateLiteral'(node) { | ||
@@ -403,3 +423,3 @@ onProperty(node); | ||
}, | ||
}; | ||
}); | ||
const popularCallee = [ | ||
@@ -433,3 +453,2 @@ 'addEventListener', | ||
} | ||
exports.default = rule; | ||
//# sourceMappingURL=no-unlocalized-strings.js.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.rule = exports.name = void 0; | ||
const utils_1 = require("@typescript-eslint/utils"); | ||
const helpers_1 = require("../helpers"); | ||
const rule = { | ||
const create_rule_1 = require("../create-rule"); | ||
exports.name = 't-call-in-function'; | ||
exports.rule = (0, create_rule_1.createRule)({ | ||
name: exports.name, | ||
meta: { | ||
@@ -25,2 +29,4 @@ docs: { | ||
create: (context) => { | ||
var _a; | ||
const sourceCode = (_a = context.sourceCode) !== null && _a !== void 0 ? _a : context.getSourceCode(); | ||
const visited = new WeakSet(); | ||
@@ -48,3 +54,7 @@ const handler = (node) => { | ||
['CallExpression:exit'](node) { | ||
const scope = context.getScope(); | ||
const scope = sourceCode.getScope | ||
? // available from ESLint v8.37.0 | ||
sourceCode.getScope(node) | ||
: // deprecated and remove in V9 | ||
context.getScope(); | ||
if (scope.type === 'module' && | ||
@@ -72,4 +82,3 @@ node.callee.type === utils_1.TSESTree.AST_NODE_TYPES.Identifier && | ||
}, | ||
}; | ||
exports.default = rule; | ||
}); | ||
//# sourceMappingURL=t-call-in-function.js.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.rule = exports.name = void 0; | ||
const helpers_1 = require("../helpers"); | ||
const rule = { | ||
const create_rule_1 = require("../create-rule"); | ||
exports.name = 'text-restrictions'; | ||
exports.rule = (0, create_rule_1.createRule)({ | ||
name: exports.name, | ||
meta: { | ||
@@ -84,4 +88,3 @@ docs: { | ||
}, | ||
}; | ||
exports.default = rule; | ||
}); | ||
//# sourceMappingURL=text-restrictions.js.map |
{ | ||
"name": "eslint-plugin-lingui", | ||
"version": "0.3.0", | ||
"version": "0.4.0", | ||
"description": "ESLint plugin for Lingui", | ||
@@ -21,2 +21,3 @@ "keywords": [ | ||
], | ||
"type": "commonjs", | ||
"scripts": { | ||
@@ -33,14 +34,18 @@ "test": "jest", | ||
"dependencies": { | ||
"@typescript-eslint/utils": "^5.61.0" | ||
"@typescript-eslint/utils": "^8.8.1" | ||
}, | ||
"peerDependencies": { | ||
"eslint": "^8.37.0 || ^9.0.0" | ||
}, | ||
"devDependencies": { | ||
"@types/eslint": "^8.40.2", | ||
"@types/jest": "^29.5.13", | ||
"@types/node": "^20.3.3", | ||
"@typescript-eslint/parser": "^4.2.0", | ||
"babel-eslint": "^10.0.3", | ||
"eslint": "^8.44.0", | ||
"@typescript-eslint/parser": "^8.8.1", | ||
"@typescript-eslint/rule-tester": "^8.8.1", | ||
"eslint": "^9.12.0", | ||
"husky": "^8.0.3", | ||
"jest": "^29.5.0", | ||
"lint-staged": "^14.0.0", | ||
"prettier": "2.1.2", | ||
"prettier": "3.3.3", | ||
"ts-jest": "^29.1.1", | ||
@@ -56,3 +61,4 @@ "ts-node": "^10.9.1", | ||
}, | ||
"license": "MIT" | ||
"license": "MIT", | ||
"packageManager": "yarn@4.5.0+sha512.837566d24eec14ec0f5f1411adb544e892b3454255e61fdef8fd05f3429480102806bac7446bc9daff3896b01ae4b62d00096c7e989f1596f2af10b927532f39" | ||
} |
201
README.md
@@ -35,185 +35,72 @@ # <div align="center">An ESLint Plugin For Lingui<sub>js</sub></div> | ||
## Usage | ||
## Flat Config (`eslint.config.js`) | ||
Add `lingui` to the plugins section of your `.eslintrc` configuration file. You can omit the `eslint-plugin-` prefix: | ||
### Recommended Setup | ||
```json | ||
{ | ||
"plugins": ["lingui"] | ||
} | ||
``` | ||
To enable all of the recommended rules for our plugin, add the following config: | ||
Then configure the rules you want to use under the rules section. | ||
```js | ||
import pluginLingui from 'eslint-plugin-lingui' | ||
```json | ||
{ | ||
"rules": { | ||
"lingui/no-unlocalized-strings": 2, | ||
"lingui/t-call-in-function": 2, | ||
"lingui/no-single-variables-to-translate": 2, | ||
"lingui/no-expression-in-message": 2, | ||
"lingui/no-single-tag-to-translate": 2, | ||
"lingui/no-trans-inside-trans": 2, | ||
"lingui/text-restrictions": [ | ||
2, | ||
{ | ||
"rules": [ | ||
{ | ||
"patterns": ["''", "’", "“"], | ||
"message": "Error message" | ||
} | ||
] | ||
} | ||
] | ||
} | ||
} | ||
export default [ | ||
pluginLingui.configs['flat/recommended'], | ||
// Any other config... | ||
] | ||
``` | ||
## Supported Rules | ||
### Custom setup | ||
## no-unlocalized-strings | ||
Alternatively, you can load the plugin and configure only the rules you want to use: | ||
Check that code doesn't contain strings/templates/jsxText what should be wrapped into `<Trans>` or `i18n` | ||
### Options | ||
#### ignore | ||
The `ignore` option specifies exceptions not to check for | ||
literal strings that match one of regexp patterns. | ||
Examples of correct code for the `{ "ignore": ["rgba"] }` option: | ||
```jsx | ||
/*eslint lingui/no-unlocalized-strings ["error", {"ignore": ["rgba"]}]*/ | ||
const a = <div color="rgba(100, 100, 100, 0.4)"></div> | ||
``` | ||
#### ignoreFunction | ||
The `ignoreFunction` option specifies exceptions not check for | ||
function calls whose names match one of regexp patterns. | ||
Examples of correct code for the `{ "ignoreFunction": ["showIntercomMessage"] }` option: | ||
```js | ||
/*eslint lingui/no-unlocalized-strings: ["error", { "ignoreFunction": ["showIntercomMessage"] }]*/ | ||
const bar = showIntercomMessage('Please, write me') | ||
``` | ||
import pluginLingui from 'eslint-plugin-lingui' | ||
#### ignoreAttribute | ||
The `ignoreAttribute` option specifies exceptions not to check for JSX attributes that match one of ignored attributes. | ||
Examples of correct code for the `{ "ignoreAttribute": ["style"] }` option: | ||
```jsx | ||
/*eslint lingui/no-unlocalized-strings: ["error", { "ignoreAttribute": ["style"] }]*/ | ||
const element = <div style={{ margin: '1rem 2rem' }} /> | ||
export default [ | ||
{ | ||
plugins: { | ||
lingui: pluginLingui, | ||
}, | ||
rules: { | ||
'lingui/t-call-in-function': 'error', | ||
}, | ||
}, | ||
// Any other config... | ||
] | ||
``` | ||
By default, the following attributes are ignored: `className`, `styleName`, `type`, `id`, `width`, `height` | ||
## Legacy Config (`.eslintrc`) | ||
#### ignoreProperty | ||
### Recommended setup | ||
The `ignoreProperty` option specifies property names not to check. | ||
To enable all of the recommended rules for our plugin, add `plugin:lingui/recommended` in extends: | ||
Examples of correct code for the `{ "ignoreProperty": ["text"] }` option: | ||
```jsx | ||
/*eslint lingui/no-unlocalized-strings: ["error", { "ignoreProperty": ["text"] }]*/ | ||
const test = { text: 'This is ignored' } | ||
``` | ||
By default, the following properties are ignored: `className`, `styleName`, `type`, `id`, `width`, `height` | ||
## t-call-in-function | ||
Check that `t` calls are inside `function`. They should not be at the module level otherwise they will not react to language switching. | ||
```jsx | ||
import { t } from '@lingui/macro' | ||
// nope ⛔️ | ||
const msg = t`Hello world!` | ||
// ok ✅ | ||
function getGreeting() { | ||
return t`Hello world!` | ||
```json | ||
{ | ||
"extends": ["plugin:lingui/recommended"] | ||
} | ||
``` | ||
Check the [Lingui Docs](https://lingui.dev/tutorials/react-patterns#translations-outside-react-components) for more info. | ||
### Custom setup | ||
## no-expression-in-message | ||
Alternatively, add `lingui` to the plugins section, and configure the rules you want to use: | ||
Check that `` t` ` `` doesn't contain member or function expressions like `` t`Hello ${user.name}` `` or `` t`Hello ${getName()}` `` | ||
Such expressions would be transformed to its index position such as `Hello {0}` which gives zero to little context for translator. | ||
Use a variable identifier instead. | ||
```jsx | ||
// nope ⛔️ | ||
t`Hello ${user.name}` // => 'Hello {0}' | ||
// ok ✅ | ||
const userName = user.name | ||
t`Hello ${userName}` // => 'Hello {userName}' | ||
``` | ||
## no-trans-inside-trans | ||
Check that no `Trans` inside `Trans` components. | ||
```jsx | ||
// nope ⛔️ | ||
<Trans>Hello <Trans>World!</Trans></Trans> | ||
// ok ✅ | ||
<Trans>Hello World!</Trans> | ||
``` | ||
## no-single-variables-to-translate | ||
Doesn't allow single variables without text to translate like `<Trans>{variable}</Trans>` or `` t`${variable}` `` | ||
Such expression would pollute message catalog with useless string which has nothing to translate. | ||
## text-restrictions | ||
Check that strings/templates/jsxText doesn't contain patterns from the rules. | ||
This rules enforces a consistency rules inside your messages. | ||
### Options | ||
### rules | ||
`rules` is array of rules when one rule has structure | ||
```json | ||
{ | ||
"patterns": ["first", "second"], | ||
"message": "error message" | ||
"plugins": ["lingui"], | ||
"rules": { | ||
"lingui/t-call-in-function": "error" | ||
} | ||
} | ||
``` | ||
each `rule` has a structure: | ||
## Rules | ||
- `patterns` is an array of regex or strings | ||
- `message` is an error message that will be displayed if restricting pattern matches text | ||
- `flags` is a string with regex flags for patterns | ||
- `isOnlyForTranslation` is a boolean indicating that patterns should be found only inside `Trans` tags or `t` tagged template | ||
✅ - Recommended | ||
## no-single-tag-to-translate | ||
Ensures `<Trans></Trans>` isn't wrapping a single element unnecessarily | ||
```jsx | ||
// nope ⛔️ | ||
<Trans><strong>Foo bar</strong></Trans> | ||
// ok ✅ | ||
<strong><Trans>Foo bar</Trans></strong> | ||
``` | ||
- ✅ [no-expression-in-message](docs/rules/no-expression-in-message.md) | ||
- ✅ [no-single-tag-to-translate](docs/rules/no-single-tag-to-translate.md) | ||
- ✅ [no-single-variables-to-translate](docs/rules/no-single-variables-to-translate.md) | ||
- ✅ [no-trans-inside-trans](docs/rules/no-trans-inside-trans.md) | ||
- ✅ [t-call-in-function](docs/rules/t-call-in-function.md) | ||
- [no-unlocalized-strings](docs/rules/no-unlocalized-strings.md) | ||
- [text-restrictions](docs/rules/text-restrictions.md) |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
85567
36
1292
2
13
106
+ Added@eslint/config-array@0.19.2(transitive)
+ Added@eslint/core@0.10.0(transitive)
+ Added@eslint/eslintrc@3.2.0(transitive)
+ Added@eslint/js@9.19.0(transitive)
+ Added@eslint/object-schema@2.1.6(transitive)
+ Added@eslint/plugin-kit@0.2.5(transitive)
+ Added@humanfs/core@0.19.1(transitive)
+ Added@humanfs/node@0.16.6(transitive)
+ Added@humanwhocodes/retry@0.3.10.4.1(transitive)
+ Added@types/estree@1.0.6(transitive)
+ Added@typescript-eslint/scope-manager@8.22.0(transitive)
+ Added@typescript-eslint/types@8.22.0(transitive)
+ Added@typescript-eslint/typescript-estree@8.22.0(transitive)
+ Added@typescript-eslint/utils@8.22.0(transitive)
+ Added@typescript-eslint/visitor-keys@8.22.0(transitive)
+ Addedbrace-expansion@2.0.1(transitive)
+ Addedeslint@9.19.0(transitive)
+ Addedeslint-scope@8.2.0(transitive)
+ Addedeslint-visitor-keys@4.2.0(transitive)
+ Addedespree@10.3.0(transitive)
+ Addedfile-entry-cache@8.0.0(transitive)
+ Addedflat-cache@4.0.1(transitive)
+ Addedglobals@14.0.0(transitive)
+ Addedminimatch@9.0.5(transitive)
+ Addedts-api-utils@2.0.1(transitive)
- Removed@eslint/eslintrc@2.1.4(transitive)
- Removed@eslint/js@8.57.1(transitive)
- Removed@humanwhocodes/config-array@0.13.0(transitive)
- Removed@humanwhocodes/object-schema@2.0.3(transitive)
- Removed@types/semver@7.5.8(transitive)
- Removed@typescript-eslint/scope-manager@5.62.0(transitive)
- Removed@typescript-eslint/types@5.62.0(transitive)
- Removed@typescript-eslint/typescript-estree@5.62.0(transitive)
- Removed@typescript-eslint/utils@5.62.0(transitive)
- Removed@typescript-eslint/visitor-keys@5.62.0(transitive)
- Removed@ungap/structured-clone@1.3.0(transitive)
- Removedansi-regex@5.0.1(transitive)
- Removedarray-union@2.1.0(transitive)
- Removeddir-glob@3.0.1(transitive)
- Removeddoctrine@3.0.0(transitive)
- Removedeslint@8.57.1(transitive)
- Removedeslint-scope@5.1.17.2.2(transitive)
- Removedespree@9.6.1(transitive)
- Removedestraverse@4.3.0(transitive)
- Removedfile-entry-cache@6.0.1(transitive)
- Removedflat-cache@3.2.0(transitive)
- Removedfs.realpath@1.0.0(transitive)
- Removedglob@7.2.3(transitive)
- Removedglobals@13.24.0(transitive)
- Removedglobby@11.1.0(transitive)
- Removedgraphemer@1.4.0(transitive)
- Removedinflight@1.0.6(transitive)
- Removedinherits@2.0.4(transitive)
- Removedis-path-inside@3.0.3(transitive)
- Removedonce@1.4.0(transitive)
- Removedpath-is-absolute@1.0.1(transitive)
- Removedpath-type@4.0.0(transitive)
- Removedrimraf@3.0.2(transitive)
- Removedslash@3.0.0(transitive)
- Removedstrip-ansi@6.0.1(transitive)
- Removedtext-table@0.2.0(transitive)
- Removedtslib@1.14.1(transitive)
- Removedtsutils@3.21.0(transitive)
- Removedtype-fest@0.20.2(transitive)
- Removedwrappy@1.0.2(transitive)