0
0
mirror of https://github.com/nodejs/node.git synced 2024-11-21 21:19:50 +01:00

tools: enforce errors to not be documented in legacy section

PR-URL: https://github.com/nodejs/node/pull/55218
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
This commit is contained in:
Aviv Keller 2024-10-08 12:59:53 -04:00 committed by GitHub
parent 78f421de88
commit 5a3da7b4e4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 130 additions and 85 deletions

View File

@ -2325,6 +2325,17 @@ compiled with ICU support.
A non-context-aware native addon was loaded in a process that disallows them.
<a id="ERR_OPERATION_FAILED"></a>
### `ERR_OPERATION_FAILED`
<!-- YAML
added: v15.0.0
-->
An operation failed. This is typically used to signal the general failure
of an asynchronous operation.
<a id="ERR_OUT_OF_RANGE"></a>
### `ERR_OUT_OF_RANGE`
@ -2407,6 +2418,42 @@ Accessing `Object.prototype.__proto__` has been forbidden using
[`Object.setPrototypeOf`][] should be used to get and set the prototype of an
object.
<a id="ERR_QUIC_CONNECTION_FAILED"></a>
### `ERR_QUIC_CONNECTION_FAILED`
<!-- YAML
added: REPLACEME
-->
> Stability: 1 - Experimental
Establishing a QUIC connection failed.
<a id="ERR_QUIC_ENDPOINT_CLOSED"></a>
### `ERR_QUIC_ENDPOINT_CLOSED`
<!-- YAML
added: REPLACEME
-->
> Stability: 1 - Experimental
A QUIC Endpoint closed with an error.
<a id="ERR_QUIC_OPEN_STREAM_FAILED"></a>
### `ERR_QUIC_OPEN_STREAM_FAILED`
<!-- YAML
added: REPLACEME
-->
> Stability: 1 - Experimental
Opening a QUIC stream failed.
<a id="ERR_REQUIRE_CYCLE_MODULE"></a>
### `ERR_REQUIRE_CYCLE_MODULE`
@ -2990,6 +3037,16 @@ try {
}
```
<a id="ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING"></a>
### `ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING`
<!-- YAML
added: v22.6.0
-->
Type stripping is not supported for files descendent of a `node_modules` directory.
<a id="ERR_USE_AFTER_CLOSE"></a>
### `ERR_USE_AFTER_CLOSE`
@ -3636,17 +3693,6 @@ error indicates that the idle loop has failed to stop.
A Node.js API was called in an unsupported manner, such as
`Buffer.write(string, encoding, offset[, length])`.
<a id="ERR_OPERATION_FAILED"></a>
### `ERR_OPERATION_FAILED`
<!-- YAML
added: v15.0.0
-->
An operation failed. This is typically used to signal the general failure
of an asynchronous operation.
<a id="ERR_OUTOFMEMORY"></a>
### `ERR_OUTOFMEMORY`
@ -3670,42 +3716,6 @@ removed: v10.0.0
The `node:repl` module was unable to parse data from the REPL history file.
<a id="ERR_QUIC_CONNECTION_FAILED"></a>
### `ERR_QUIC_CONNECTION_FAILED`
<!-- YAML
added: REPLACEME
-->
> Stability: 1 - Experimental
Establishing a QUIC connection failed.
<a id="ERR_QUIC_ENDPOINT_CLOSED"></a>
### `ERR_QUIC_ENDPOINT_CLOSED`
<!-- YAML
added: REPLACEME
-->
> Stability: 1 - Experimental
A QUIC Endpoint closed with an error.
<a id="ERR_QUIC_OPEN_STREAM_FAILED"></a>
### `ERR_QUIC_OPEN_STREAM_FAILED`
<!-- YAML
added: REPLACEME
-->
> Stability: 1 - Experimental
Opening a QUIC stream failed.
<a id="ERR_SOCKET_CANNOT_SEND"></a>
### `ERR_SOCKET_CANNOT_SEND`
@ -4097,16 +4107,6 @@ The public key in the certificate SubjectPublicKeyInfo could not be read.
An error occurred trying to allocate memory. This should never happen.
<a id="ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING"></a>
#### `ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING`
<!-- YAML
added: v22.6.0
-->
Type stripping is not supported for files descendent of a `node_modules` directory.
[ES Module]: esm.md
[ICU]: intl.md#internationalization-support
[JSON Web Key Elliptic Curve Registry]: https://www.iana.org/assignments/jose/jose.xhtml#web-key-elliptic-curve

View File

@ -27,11 +27,6 @@ new RuleTester().run('documented-errors', rule, {
message: `"${invalidCode}" is not documented in doc/api/errors.md`,
line: 2
},
{
message:
`doc/api/errors.md does not have an anchor for "${invalidCode}"`,
line: 2
},
]
},
]

View File

@ -4,35 +4,85 @@ const fs = require('fs');
const path = require('path');
const { isDefiningError } = require('./rules-utils.js');
const doc = fs.readFileSync(path.resolve(__dirname, '../../doc/api/errors.md'),
'utf8');
// Load the errors documentation file once
const docPath = path.resolve(__dirname, '../../doc/api/errors.md');
const doc = fs.readFileSync(docPath, 'utf8');
function isInDoc(code) {
return doc.includes(`### \`${code}\``);
}
function includesAnchor(code) {
return doc.includes(`<a id="${code}"></a>`);
}
function errorForNode(node) {
return node.expression.arguments[0].value;
// Helper function to parse errors documentation and return a Map
function getErrorsInDoc() {
const lines = doc.split('\n');
let currentHeader;
const errors = new Map();
const codePattern = /^### `([^`]+)`$/;
const anchorPattern = /^<a id="([^"]+)"><\/a>$/;
function parse(line, legacy) {
const error = { legacy };
let code;
const codeMatch = line.match(codePattern);
if (codeMatch) {
error.header = true;
code = codeMatch[1];
}
const anchorMatch = line.match(anchorPattern);
if (anchorMatch) {
error.anchor = true;
code ??= anchorMatch[1];
}
if (!code) return;
// If the code already exists in the Map, merge the new error data
errors.set(code, {
...errors.get(code),
...error,
});
}
for (const line of lines) {
if (line.startsWith('## ')) currentHeader = line.substring(3);
if (currentHeader === 'Node.js error codes') parse(line, false);
if (currentHeader === 'Legacy Node.js error codes') parse(line, true);
}
return errors;
}
// Main rule export
module.exports = {
create: function(context) {
create(context) {
const errors = getErrorsInDoc();
return {
ExpressionStatement: function(node) {
if (!isDefiningError(node) || !errorForNode(node)) return;
const code = errorForNode(node);
if (!isInDoc(code)) {
const message = `"${code}" is not documented in doc/api/errors.md`;
context.report({ node, message });
ExpressionStatement(node) {
if (!isDefiningError(node)) return;
const code = node.expression.arguments?.[0]?.value;
if (!code) return;
const err = errors.get(code); // Use Map's get method to retrieve the error
if (!err || !err.header) {
context.report({
node,
message: `"${code}" is not documented in doc/api/errors.md`,
});
if (!err) return;
}
if (!includesAnchor(code)) {
const message =
`doc/api/errors.md does not have an anchor for "${code}"`;
context.report({ node, message });
if (!err.anchor) {
context.report({
node,
message: `doc/api/errors.md does not have an anchor for "${code}"`,
});
}
if (err.legacy) {
context.report({
node,
message: `"${code}" is marked as legacy, yet it is used in lib/.`,
});
}
},
};