'use strict'; const common = require('../common'); // The doctool currently uses js-yaml from the tool/node_modules/eslint/ tree. try { require('../../tools/node_modules/eslint/node_modules/js-yaml'); } catch { common.skip('missing js-yaml (eslint not present)'); } const assert = require('assert'); const fs = require('fs'); const path = require('path'); const fixtures = require('../common/fixtures'); const json = require('../../tools/doc/json.js'); module.paths.unshift( path.join(__dirname, '..', '..', 'tools', 'doc', 'node_modules')); const unified = require('unified'); const markdown = require('remark-parse'); function toJSON(input, filename, cb) { function nullCompiler() { this.Compiler = (tree) => tree; } unified() .use(markdown) .use(json.jsonAPI, { filename }) .use(nullCompiler) .process(input, cb); } // Outputs valid json with the expected fields when given simple markdown // Test data is a list of objects with two properties. // The file property is the file path. // The json property is some json which will be generated by the doctool. const testData = [ { file: fixtures.path('sample_document.md'), json: { type: 'module', source: 'foo', modules: [{ textRaw: 'Sample Markdown', name: 'sample_markdown', modules: [{ textRaw: 'Seussian Rhymes', name: 'seussian_rhymes', desc: '
    \n
  1. fish
  2. \n
  3. fish
  4. \n
\n' + '', type: 'module', displayName: 'Seussian Rhymes' }], type: 'module', displayName: 'Sample Markdown' }] } }, { file: fixtures.path('order_of_end_tags_5873.md'), json: { type: 'module', source: 'foo', modules: [{ textRaw: 'Title', name: 'title', modules: [{ textRaw: 'Subsection', name: 'subsection', classMethods: [{ textRaw: 'Class Method: Buffer.from(array)', type: 'classMethod', name: 'from', signatures: [ { params: [{ textRaw: '`array` {Array}', name: 'array', type: 'Array' }] } ] }], type: 'module', displayName: 'Subsection' }], type: 'module', displayName: 'Title' }] } }, { file: fixtures.path('doc_with_yaml.md'), json: { type: 'module', source: 'foo', modules: [ { textRaw: 'Sample Markdown with YAML info', name: 'sample_markdown_with_yaml_info', modules: [ { textRaw: 'Foobar', name: 'foobar', meta: { added: ['v1.0.0'], changes: [] }, desc: '

Describe Foobar in more detail ' + 'here.

', type: 'module', displayName: 'Foobar' }, { textRaw: 'Foobar II', name: 'foobar_ii', meta: { added: ['v5.3.0', 'v4.2.0'], changes: [ { 'version': 'v4.2.0', 'pr-url': 'https://github.com/nodejs/node/pull/3276', 'description': 'The `error` parameter can now be ' + 'an arrow function.' } ] }, desc: '

Describe Foobar II in more detail ' + 'here. fg(1)

', type: 'module', displayName: 'Foobar II' }, { textRaw: 'Deprecated thingy', name: 'deprecated_thingy', meta: { added: ['v1.0.0'], deprecated: ['v2.0.0'], changes: [] }, desc: '

Describe Deprecated thingy in more ' + 'detail here. fg(1p)

', type: 'module', displayName: 'Deprecated thingy' }, { textRaw: 'Something', name: 'something', desc: '\n

' + 'Describe Something in more detail here.

', type: 'module', displayName: 'Something' } ], type: 'module', displayName: 'Sample Markdown with YAML info' } ] } } ]; testData.forEach((item) => { fs.readFile(item.file, 'utf8', common.mustCall((err, input) => { assert.ifError(err); toJSON(input, 'foo', common.mustCall((err, output) => { assert.ifError(err); assert.deepStrictEqual(output.json, item.json); })); })); });