Welcome to mirror list, hosted at ThFree Co, Russian Federation.

stability.js « doc « tools - github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: ca4158ebc9a77ebee5f72a404627a6c8a599c36c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
'use strict';

// Build stability table to documentation.html/json/md by generated all.json

const fs = require('fs');
const path = require('path');
const unified = require('unified');
const raw = require('rehype-raw');
const markdown = require('remark-parse');
const htmlStringify = require('rehype-stringify');
const gfm = require('remark-gfm');
const remark2rehype = require('remark-rehype');
const visit = require('unist-util-visit');

const source = `${__dirname}/../../out/doc/api`;
const data = require(path.join(source, 'all.json'));
const mark = '<!-- STABILITY_OVERVIEW_SLOT -->';

const output = {
  json: path.join(source, 'stability.json'),
  docHTML: path.join(source, 'documentation.html'),
  docJSON: path.join(source, 'documentation.json'),
  docMarkdown: path.join(source, 'documentation.md'),
};

function collectStability(data) {
  const stability = [];

  for (const mod of data.modules) {
    if (mod.displayName && mod.stability >= 0) {
      const link = mod.source.replace('doc/api/', '').replace('.md', '.html');
      // const link = re.exec(toc)[1]
      stability.push({
        api: mod.name,
        link: link,
        stability: mod.stability,
        stabilityText: `(${mod.stability}) ${mod.stabilityText}`,
      });
    }
  }

  stability.sort((a, b) => a.api.localeCompare(b.api));
  return stability;
}

function createMarkdownTable(data) {
  const md = ['| API | Stability |', '| --- | --------- |'];

  for (const mod of data) {
    md.push(`| [${mod.api}](${mod.link}) | ${mod.stabilityText} |`);
  }

  return md.join('\n');
}

function createHTML(md) {
  const file = unified()
    .use(markdown)
    .use(gfm)
    .use(remark2rehype, { allowDangerousHtml: true })
    .use(raw)
    .use(htmlStringify)
    .use(processStability)
    .processSync(md);

  return file.contents.trim();
}

function processStability() {
  return (tree) => {
    visit(tree, { type: 'element', tagName: 'tr' }, (node) => {
      const [api, stability] = node.children;
      if (api.tagName !== 'td') {
        return;
      }

      api.properties.class = 'module_stability';

      const level = stability.children[0].value[1];
      stability.properties.class = `api_stability api_stability_${level}`;
    });
  };
}

function updateStabilityMark(file, value, mark) {
  const fd = fs.openSync(file, 'r+');
  const content = fs.readFileSync(fd);

  // Find the position of the `mark`.
  const index = content.indexOf(mark);

  // Overwrite the mark with `value` parameter.
  const offset = fs.writeSync(fd, value, index, 'utf-8');

  // Re-write the end of the file after `value`.
  fs.writeSync(fd, content, index + mark.length, undefined, index + offset);
  fs.closeSync(fd);
}

const stability = collectStability(data);

// add markdown
const markdownTable = createMarkdownTable(stability);
updateStabilityMark(output.docMarkdown, markdownTable, mark);

// add html table
const html = createHTML(markdownTable);
updateStabilityMark(output.docHTML, html, mark);

// add json output
updateStabilityMark(output.docJSON, JSON.stringify(html), JSON.stringify(mark));