Comparing version 8.30.0 to 8.31.0
@@ -96,2 +96,3 @@ /** | ||
const privateMembers = new WeakMap(); | ||
const importedConfigFileModificationTime = new Map(); | ||
@@ -285,3 +286,38 @@ /** | ||
return (await import(fileURL)).default; | ||
const mtime = (await fs.stat(filePath)).mtime.getTime(); | ||
/* | ||
* Append a query with the config file's modification time (`mtime`) in order | ||
* to import the current version of the config file. Without the query, `import()` would | ||
* cache the config file module by the pathname only, and then always return | ||
* the same version (the one that was actual when the module was imported for the first time). | ||
* | ||
* This ensures that the config file module is loaded and executed again | ||
* if it has been changed since the last time it was imported. | ||
* If it hasn't been changed, `import()` will just return the cached version. | ||
* | ||
* Note that we should not overuse queries (e.g., by appending the current time | ||
* to always reload the config file module) as that could cause memory leaks | ||
* because entries are never removed from the import cache. | ||
*/ | ||
fileURL.searchParams.append("mtime", mtime); | ||
/* | ||
* With queries, we can bypass the import cache. However, when import-ing a CJS module, | ||
* Node.js uses the require infrastructure under the hood. That includes the require cache, | ||
* which caches the config file module by its file path (queries have no effect). | ||
* Therefore, we also need to clear the require cache before importing the config file module. | ||
* In order to get the same behavior with ESM and CJS config files, in particular - to reload | ||
* the config file only if it has been changed, we track file modification times and clear | ||
* the require cache only if the file has been changed. | ||
*/ | ||
if (importedConfigFileModificationTime.get(filePath) !== mtime) { | ||
delete require.cache[filePath]; | ||
} | ||
const config = (await import(fileURL)).default; | ||
importedConfigFileModificationTime.set(filePath, mtime); | ||
return config; | ||
} | ||
@@ -288,0 +324,0 @@ |
@@ -351,2 +351,36 @@ /** | ||
/** | ||
* Starting from the given node (a property.key node here) looks forward | ||
* until it finds the colon punctuator and returns it. | ||
* @param {ASTNode} node The node to start looking from. | ||
* @returns {ASTNode} The colon punctuator. | ||
*/ | ||
function getNextColon(node) { | ||
return sourceCode.getTokenAfter(node, astUtils.isColonToken); | ||
} | ||
/** | ||
* Starting from the given node (a property.key node here) looks forward | ||
* until it finds the last token before a colon punctuator and returns it. | ||
* @param {ASTNode} node The node to start looking from. | ||
* @returns {ASTNode} The last token before a colon punctuator. | ||
*/ | ||
function getLastTokenBeforeColon(node) { | ||
const colonToken = getNextColon(node); | ||
return sourceCode.getTokenBefore(colonToken); | ||
} | ||
/** | ||
* Starting from the given node (a property.key node here) looks forward | ||
* until it finds the first token after a colon punctuator and returns it. | ||
* @param {ASTNode} node The node to start looking from. | ||
* @returns {ASTNode} The first token after a colon punctuator. | ||
*/ | ||
function getFirstTokenAfterColon(node) { | ||
const colonToken = getNextColon(node); | ||
return sourceCode.getTokenAfter(colonToken); | ||
} | ||
/** | ||
* Checks whether a property is a member of the property group it follows. | ||
@@ -359,3 +393,3 @@ * @param {ASTNode} lastMember The last Property known to be in the group. | ||
const groupEndLine = lastMember.loc.start.line, | ||
candidateValueStartLine = (isKeyValueProperty(candidate) ? candidate.value : candidate).loc.start.line; | ||
candidateValueStartLine = (isKeyValueProperty(candidate) ? getFirstTokenAfterColon(candidate.key) : candidate).loc.start.line; | ||
@@ -390,24 +424,2 @@ if (candidateValueStartLine - groupEndLine <= 1) { | ||
/** | ||
* Starting from the given a node (a property.key node here) looks forward | ||
* until it finds the last token before a colon punctuator and returns it. | ||
* @param {ASTNode} node The node to start looking from. | ||
* @returns {ASTNode} The last token before a colon punctuator. | ||
*/ | ||
function getLastTokenBeforeColon(node) { | ||
const colonToken = sourceCode.getTokenAfter(node, astUtils.isColonToken); | ||
return sourceCode.getTokenBefore(colonToken); | ||
} | ||
/** | ||
* Starting from the given a node (a property.key node here) looks forward | ||
* until it finds the colon punctuator and returns it. | ||
* @param {ASTNode} node The node to start looking from. | ||
* @returns {ASTNode} The colon punctuator. | ||
*/ | ||
function getNextColon(node) { | ||
return sourceCode.getTokenAfter(node, astUtils.isColonToken); | ||
} | ||
/** | ||
* Gets an object literal property's key as the identifier name or string value. | ||
@@ -414,0 +426,0 @@ * @param {ASTNode} property Property node whose key to retrieve. |
@@ -56,2 +56,10 @@ /** | ||
default: false | ||
}, | ||
allowInArrayDestructuring: { | ||
type: "boolean", | ||
default: true | ||
}, | ||
allowInObjectDestructuring: { | ||
type: "boolean", | ||
default: true | ||
} | ||
@@ -78,2 +86,4 @@ }, | ||
const allowFunctionParams = typeof options.allowFunctionParams !== "undefined" ? options.allowFunctionParams : true; | ||
const allowInArrayDestructuring = typeof options.allowInArrayDestructuring !== "undefined" ? options.allowInArrayDestructuring : true; | ||
const allowInObjectDestructuring = typeof options.allowInObjectDestructuring !== "undefined" ? options.allowInObjectDestructuring : true; | ||
@@ -200,2 +210,3 @@ //------------------------------------------------------------------------- | ||
/** | ||
@@ -208,14 +219,28 @@ * Check if variable expression has a dangling underscore | ||
function checkForDanglingUnderscoreInVariableExpression(node) { | ||
const identifier = node.id.name; | ||
context.getDeclaredVariables(node).forEach(variable => { | ||
const definition = variable.defs.find(def => def.node === node); | ||
const identifierNode = definition.name; | ||
const identifier = identifierNode.name; | ||
let parent = identifierNode.parent; | ||
if (typeof identifier !== "undefined" && hasDanglingUnderscore(identifier) && | ||
!isSpecialCaseIdentifierInVariableExpression(identifier) && !isAllowed(identifier)) { | ||
context.report({ | ||
node, | ||
messageId: "unexpectedUnderscore", | ||
data: { | ||
identifier | ||
} | ||
}); | ||
} | ||
while (!["VariableDeclarator", "ArrayPattern", "ObjectPattern"].includes(parent.type)) { | ||
parent = parent.parent; | ||
} | ||
if ( | ||
hasDanglingUnderscore(identifier) && | ||
!isSpecialCaseIdentifierInVariableExpression(identifier) && | ||
!isAllowed(identifier) && | ||
!(allowInArrayDestructuring && parent.type === "ArrayPattern") && | ||
!(allowInObjectDestructuring && parent.type === "ObjectPattern") | ||
) { | ||
context.report({ | ||
node, | ||
messageId: "unexpectedUnderscore", | ||
data: { | ||
identifier | ||
} | ||
}); | ||
} | ||
}); | ||
} | ||
@@ -222,0 +247,0 @@ |
@@ -338,2 +338,3 @@ /** | ||
const leftParenToken = sourceCode.getTokenAfter(functionToken, astUtils.isOpeningParenToken); | ||
const tokenBeforeBody = sourceCode.getTokenBefore(node.body); | ||
@@ -352,3 +353,3 @@ if (sourceCode.commentsExistBetween(functionToken, leftParenToken)) { | ||
} | ||
yield fixer.insertTextBefore(node.body, "=> "); | ||
yield fixer.insertTextAfter(tokenBeforeBody, " =>"); | ||
@@ -355,0 +356,0 @@ // Get the node that will become the new arrow function. |
{ | ||
"name": "eslint", | ||
"version": "8.30.0", | ||
"version": "8.31.0", | ||
"author": "Nicholas C. Zakas <nicholas+npm@nczconsulting.com>", | ||
@@ -17,13 +17,14 @@ "description": "An AST-based pattern checker for JavaScript.", | ||
"build:docs:update-links": "node tools/fetch-docs-links.js", | ||
"release:generate:latest": "node Makefile.js generateRelease", | ||
"release:generate:alpha": "node Makefile.js generatePrerelease -- alpha", | ||
"release:generate:beta": "node Makefile.js generatePrerelease -- beta", | ||
"release:publish": "node Makefile.js publishRelease", | ||
"release:generate:rc": "node Makefile.js generatePrerelease -- rc", | ||
"build:site": "node Makefile.js gensite", | ||
"build:webpack": "node Makefile.js webpack", | ||
"build:readme": "node tools/update-readme.js", | ||
"lint": "node Makefile.js lint", | ||
"lint:docs:js": "node Makefile.js lintDocsJS", | ||
"lint:fix": "node Makefile.js lint -- fix", | ||
"lint:docs:js": "node Makefile.js lintDocsJS", | ||
"lint:fix:docs:js": "node Makefile.js lintDocsJS -- fix", | ||
"release:generate:alpha": "node Makefile.js generatePrerelease -- alpha", | ||
"release:generate:beta": "node Makefile.js generatePrerelease -- beta", | ||
"release:generate:latest": "node Makefile.js generateRelease", | ||
"release:generate:rc": "node Makefile.js generatePrerelease -- rc", | ||
"release:publish": "node Makefile.js publishRelease", | ||
"test": "node Makefile.js test", | ||
@@ -59,3 +60,3 @@ "test:cli": "mocha", | ||
"dependencies": { | ||
"@eslint/eslintrc": "^1.4.0", | ||
"@eslint/eslintrc": "^1.4.1", | ||
"@humanwhocodes/config-array": "^0.11.8", | ||
@@ -62,0 +63,0 @@ "@humanwhocodes/module-importer": "^1.0.1", |
@@ -34,3 +34,3 @@ [![npm version](https://img.shields.io/npm/v/eslint.svg)](https://www.npmjs.com/package/eslint) | ||
4. [Filing Issues](#filing-issues) | ||
5. [Frequently Asked Questions](#faq) | ||
5. [Frequently Asked Questions](#frequently-asked-questions) | ||
6. [Releases](#releases) | ||
@@ -45,3 +45,3 @@ 7. [Security Policy](#security-policy) | ||
## <a name="installation-and-usage"></a>Installation and Usage | ||
## Installation and Usage | ||
@@ -62,3 +62,3 @@ Prerequisites: [Node.js](https://nodejs.org/) (`^12.22.0`, `^14.17.0`, or `>=16.0.0`) built with SSL support. (If you are using an official Node.js distribution, SSL is always built in.) | ||
## <a name="configuration"></a>Configuration | ||
## Configuration | ||
@@ -84,7 +84,7 @@ After running `npm init @eslint/config`, you'll have a `.eslintrc` file in your directory. In it, you'll see some rules configured like this: | ||
## <a name="code-of-conduct"></a>Code of Conduct | ||
## Code of Conduct | ||
ESLint adheres to the [JS Foundation Code of Conduct](https://eslint.org/conduct). | ||
## <a name="filing-issues"></a>Filing Issues | ||
## Filing Issues | ||
@@ -98,3 +98,3 @@ Before filing an issue, please be sure to read the guidelines for what you're reporting: | ||
## <a name="faq"></a>Frequently Asked Questions | ||
## Frequently Asked Questions | ||
@@ -149,11 +149,11 @@ ### I'm using JSCS, should I migrate to ESLint? | ||
## <a name="releases"></a>Releases | ||
## Releases | ||
We have scheduled releases every two weeks on Friday or Saturday. You can follow a [release issue](https://github.com/eslint/eslint/issues?q=is%3Aopen+is%3Aissue+label%3Arelease) for updates about the scheduling of any particular release. | ||
## <a name="security-policy"></a>Security Policy | ||
## Security Policy | ||
ESLint takes security seriously. We work hard to ensure that ESLint is safe for everyone and that security issues are addressed quickly and responsibly. Read the full [security policy](https://github.com/eslint/.github/blob/master/SECURITY.md). | ||
## <a name="semantic-versioning-policy"></a>Semantic Versioning Policy | ||
## Semantic Versioning Policy | ||
@@ -191,3 +191,3 @@ ESLint follows [semantic versioning](https://semver.org). However, due to the nature of ESLint as a code quality tool, it's not always clear when a minor or major version bump occurs. To help clarify this for everyone, we've defined the following semantic versioning policy for ESLint: | ||
## <a name="stylistic-rule-updates"></a>Stylistic Rule Updates | ||
## Stylistic Rule Updates | ||
@@ -201,7 +201,7 @@ Stylistic rules are frozen according to [our policy](https://eslint.org/blog/2020/05/changes-to-rules-policies) on how we evaluate new rules and rule changes. | ||
## <a name="license"></a>License | ||
## License | ||
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Feslint%2Feslint.svg?type=large)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Feslint%2Feslint?ref=badge_large) | ||
## <a name="team"></a>Team | ||
## Team | ||
@@ -256,7 +256,2 @@ These folks keep the project moving and are resources for help. | ||
<table><tbody><tr><td align="center" valign="top" width="11%"> | ||
<a href="https://github.com/brettz9"> | ||
<img src="https://github.com/brettz9.png?s=75" width="75" height="75"><br /> | ||
Brett Zamir | ||
</a> | ||
</td><td align="center" valign="top" width="11%"> | ||
<a href="https://github.com/bmish"> | ||
@@ -272,15 +267,26 @@ <img src="https://github.com/bmish.png?s=75" width="75" height="75"><br /> | ||
</td><td align="center" valign="top" width="11%"> | ||
<a href="https://github.com/g-plane"> | ||
<img src="https://github.com/g-plane.png?s=75" width="75" height="75"><br /> | ||
Pig Fang | ||
<a href="https://github.com/yeonjuan"> | ||
<img src="https://github.com/yeonjuan.png?s=75" width="75" height="75"><br /> | ||
YeonJuan | ||
</a> | ||
</td></tr></tbody></table> | ||
### Website Team | ||
Team members who focus specifically on eslint.org | ||
<table><tbody><tr><td align="center" valign="top" width="11%"> | ||
<a href="https://github.com/amareshsm"> | ||
<img src="https://github.com/amareshsm.png?s=75" width="75" height="75"><br /> | ||
Amaresh S M | ||
</a> | ||
</td><td align="center" valign="top" width="11%"> | ||
<a href="https://github.com/anikethsaha"> | ||
<img src="https://github.com/anikethsaha.png?s=75" width="75" height="75"><br /> | ||
Anix | ||
<a href="https://github.com/harish-sethuraman"> | ||
<img src="https://github.com/harish-sethuraman.png?s=75" width="75" height="75"><br /> | ||
Strek | ||
</a> | ||
</td><td align="center" valign="top" width="11%"> | ||
<a href="https://github.com/yeonjuan"> | ||
<img src="https://github.com/yeonjuan.png?s=75" width="75" height="75"><br /> | ||
YeonJuan | ||
<a href="https://github.com/kecrily"> | ||
<img src="https://github.com/kecrily.png?s=75" width="75" height="75"><br /> | ||
Percy Ma | ||
</a> | ||
@@ -291,3 +297,3 @@ </td></tr></tbody></table> | ||
## <a name="sponsors"></a>Sponsors | ||
## Sponsors | ||
@@ -299,9 +305,9 @@ The following companies, organizations, and individuals support ESLint's ongoing maintenance and development. [Become a Sponsor](https://opencollective.com/eslint) to get your logo on our README and website. | ||
<h3>Platinum Sponsors</h3> | ||
<p><a href="https://automattic.com"><img src="https://images.opencollective.com/automattic/d0ef3e1/logo.png" alt="Automattic" height="undefined"></a></p><h3>Gold Sponsors</h3> | ||
<p><a href="https://www.salesforce.com"><img src="https://images.opencollective.com/salesforce/ca8f997/logo.png" alt="Salesforce" height="96"></a> <a href="https://www.airbnb.com/"><img src="https://images.opencollective.com/airbnb/d327d66/logo.png" alt="Airbnb" height="96"></a> <a href="https://americanexpress.io"><img src="https://avatars.githubusercontent.com/u/3853301?v=4" alt="American Express" height="96"></a></p><h3>Silver Sponsors</h3> | ||
<p><a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/5c4fa84/logo.png" alt="Liftoff" height="64"></a></p><h3>Bronze Sponsors</h3> | ||
<p><a href="https://launchdarkly.com"><img src="https://images.opencollective.com/launchdarkly/574bb9e/logo.png" alt="launchdarkly" height="32"></a> <a href="https://nx.dev"><img src="https://images.opencollective.com/nx/0efbe42/logo.png" alt="Nx (by Nrwl)" height="32"></a> <a href="https://www.crosswordsolver.org/anagram-solver/"><img src="https://images.opencollective.com/anagram-solver/2666271/logo.png" alt="Anagram Solver" height="32"></a> <a href="https://www.vpsserver.com"><img src="https://images.opencollective.com/vpsservercom/logo.png" alt="VPS" height="32"></a> <a href="https://icons8.com"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8: free icons, photos, illustrations, and music" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://themeisle.com"><img src="https://images.opencollective.com/themeisle/d5592fe/logo.png" alt="ThemeIsle" height="32"></a> <a href="https://www.ignitionapp.com"><img src="https://avatars.githubusercontent.com/u/5753491?v=4" alt="Ignition" height="32"></a> <a href="https://herocoders.com"><img src="https://avatars.githubusercontent.com/u/37549774?v=4" alt="HeroCoders" height="32"></a></p> | ||
<p><a href="#"><img src="https://images.opencollective.com/2021-frameworks-fund/logo.png" alt="Chrome Frameworks Fund" height="undefined"></a> <a href="https://automattic.com"><img src="https://images.opencollective.com/automattic/d0ef3e1/logo.png" alt="Automattic" height="undefined"></a></p><h3>Gold Sponsors</h3> | ||
<p><a href="https://ridicorp.com/career/"><img src="https://images.opencollective.com/ridi-corporation/175dcf3/logo.png" alt="RIDI" height="96"></a> <a href="https://engineering.salesforce.com"><img src="https://images.opencollective.com/salesforce/ca8f997/logo.png" alt="Salesforce" height="96"></a> <a href="https://www.airbnb.com/"><img src="https://images.opencollective.com/airbnb/d327d66/logo.png" alt="Airbnb" height="96"></a></p><h3>Silver Sponsors</h3> | ||
<p><a href="https://sentry.io"><img src="https://avatars.githubusercontent.com/u/1396951?v=4" alt="Sentry" height="64"></a> <a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/5c4fa84/logo.png" alt="Liftoff" height="64"></a></p><h3>Bronze Sponsors</h3> | ||
<p><a href="https://themeisle.com"><img src="https://images.opencollective.com/themeisle/d5592fe/logo.png" alt="ThemeIsle" height="32"></a> <a href="https://nx.dev"><img src="https://images.opencollective.com/nx/0efbe42/logo.png" alt="Nx (by Nrwl)" height="32"></a> <a href="https://www.crosswordsolver.org/anagram-solver/"><img src="https://images.opencollective.com/anagram-solver/2666271/logo.png" alt="Anagram Solver" height="32"></a> <a href="https://icons8.com"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8: free icons, photos, illustrations, and music" height="32"></a> <a href="https://discord.com"><img src="https://images.opencollective.com/discordapp/f9645d9/logo.png" alt="Discord" height="32"></a> <a href="https://www.ignitionapp.com"><img src="https://avatars.githubusercontent.com/u/5753491?v=4" alt="Ignition" height="32"></a> <a href="https://herocoders.com"><img src="https://avatars.githubusercontent.com/u/37549774?v=4" alt="HeroCoders" height="32"></a> <a href="https://quickbookstoolhub.com"><img src="https://avatars.githubusercontent.com/u/95090305?u=e5bc398ef775c9ed19f955c675cdc1fb6abf01df&v=4" alt="QuickBooks Tool hub" height="32"></a></p> | ||
<!--sponsorsend--> | ||
## <a name="technology-sponsors"></a>Technology Sponsors | ||
## Technology Sponsors | ||
@@ -308,0 +314,0 @@ * Site search ([eslint.org](https://eslint.org)) is sponsored by [Algolia](https://www.algolia.com) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
2856992
67763
305
Updated@eslint/eslintrc@^1.4.1