Skip to content

Commit 91a8078

Browse files
committed
test: check stability block position in API markdown
1 parent 641653b commit 91a8078

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

doc/api/buffer.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3491,13 +3491,13 @@ changes:
34913491
calculations with them.
34923492
-->
34933493

3494+
> Stability: 0 - Deprecated: Use [`buf.subarray`][] instead.
3495+
34943496
* `start` {integer} Where the new `Buffer` will start. **Default:** `0`.
34953497
* `end` {integer} Where the new `Buffer` will end (not inclusive).
34963498
**Default:** [`buf.length`][].
34973499
* Returns: {Buffer}
34983500

3499-
> Stability: 0 - Deprecated: Use [`buf.subarray`][] instead.
3500-
35013501
Returns a new `Buffer` that references the same memory as the original, but
35023502
offset and cropped by the `start` and `end` indexes.
35033503

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import '../common/index.mjs';
2+
3+
import fs from 'fs';
4+
import assert from 'assert';
5+
6+
import {
7+
remarkParse,
8+
unified,
9+
} from '../../tools/doc/deps.mjs';
10+
11+
const ignore = ['deprecations.md', 'documentation.md'];
12+
13+
const docURL = new URL('../../doc/api/', import.meta.url);
14+
const docList = fs.readdirSync(docURL).filter((filename) => !ignore.includes(filename));
15+
16+
const re = /^Stability: \d/;
17+
18+
for (const file of docList) {
19+
const fileURL = new URL(file, docURL);
20+
const tree = unified()
21+
.use(remarkParse)
22+
.parse(fs.readFileSync(fileURL));
23+
24+
// Traverse first-level nodes, ignoring comment blocks
25+
const nodes = tree.children.filter((node) => node.type !== 'html');
26+
27+
for (let i = 0; i < nodes.length; i++) {
28+
const { [i]: node, [i - 1]: previousNode } = nodes;
29+
if (node.type !== 'blockquote' || !node.children.length) continue;
30+
31+
const paragraph = node.children[0];
32+
if (paragraph.type !== 'paragraph' || !paragraph.children.length) continue;
33+
34+
const text = paragraph.children[0];
35+
if (text.type !== 'text' || !re.exec(text.value)) continue;
36+
37+
// Check that previous node type (excluding comment blocks) is one of:
38+
// * 'heading'
39+
// * 'paragraph' with a leading 'strong' node (pseudo-heading, eg. assert.equal)
40+
try {
41+
assert(previousNode.type === 'heading' ||
42+
(previousNode.type === 'paragraph' && previousNode.children[0]?.type === 'strong'),
43+
'Stability block must be the first content element under heading');
44+
} catch (error) {
45+
const { line, column } = node.position.start;
46+
error.stack = error.stack.split('\n')
47+
.toSpliced(1, 0, ` at ${fileURL}:${line}:${column}`)
48+
.join('\n');
49+
throw error;
50+
}
51+
}
52+
}

0 commit comments

Comments
 (0)