Skip to content

Commit 7bdc418

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

File tree

2 files changed

+48
-2
lines changed

2 files changed

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

0 commit comments

Comments
 (0)