import * as common from '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; import assert from 'assert'; import fs from 'fs'; import * as json from '../../tools/doc/json.mjs'; import { remarkParse, unified, } from '../../tools/doc/deps.mjs'; function toJSON(input, filename, cb) { function nullCompiler() { this.Compiler = (tree) => tree; } unified() .use(remarkParse) .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: 'Static 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', }, ], }, }, { file: fixtures.path('doc_with_backticks_in_headings.md'), json: { type: 'module', source: 'foo', modules: [ { textRaw: 'Fhqwhgads', name: 'fhqwhgads', properties: [ { name: 'fullName', textRaw: '`Fqhqwhgads.fullName`', }, ], classMethods: [ { name: 'again', signatures: [ { params: [], }, ], textRaw: 'Static method: `Fhqwhgads.again()`', type: 'classMethod', }, ], classes: [ { textRaw: 'Class: `ComeOn`', type: 'class', name: 'ComeOn', }, ], ctors: [ { name: 'Fhqwhgads', signatures: [ { params: [], }, ], textRaw: 'Constructor: `new Fhqwhgads()`', type: 'ctor', }, ], methods: [ { textRaw: '`everybody.to(limit)`', type: 'method', name: 'to', signatures: [{ params: [] }], }, ], events: [ { textRaw: "Event: `'FHQWHfest'`", type: 'event', name: 'FHQWHfest', params: [], }, ], type: 'module', displayName: 'Fhqwhgads', }, ], }, }, ]; testData.forEach((item) => { fs.readFile(item.file, 'utf8', common.mustSucceed((input) => { toJSON(input, 'foo', common.mustSucceed((output) => { assert.deepStrictEqual(output.json, item.json); })); })); });