UNPKG

docs-ts

Version:

Documentation tool for TypeScript packages

410 lines (409 loc) 15.9 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.showMarkdown = exports.monoidMarkdown = exports.semigroupMarkdown = exports.printModule = exports.printTypeAlias = exports.printInterface = exports.printFunction = exports.printExport = exports.printConstant = exports.printClass = exports.fold = exports.Strikethrough = exports.PlainTexts = exports.PlainText = exports.Paragraph = exports.Newline = exports.Header = exports.Fence = exports.Bold = void 0; var Foldable_1 = require("fp-ts/Foldable"); var function_1 = require("fp-ts/function"); var M = require("fp-ts/Monoid"); var O = require("fp-ts/Option"); var RA = require("fp-ts/ReadonlyArray"); var RNEA = require("fp-ts/ReadonlyNonEmptyArray"); var RR = require("fp-ts/ReadonlyRecord"); var S = require("fp-ts/string"); var prettier = require("prettier"); // eslint-disable-next-line @typescript-eslint/no-var-requires var toc = require('markdown-toc'); // ------------------------------------------------------------------------------------- // constructors // ------------------------------------------------------------------------------------- /** * @category constructors * @since 0.6.0 */ var Bold = function (content) { return ({ _tag: 'Bold', content: content }); }; exports.Bold = Bold; /** * @category constructors * @since 0.6.0 */ var Fence = function (language, content) { return ({ _tag: 'Fence', language: language, content: content }); }; exports.Fence = Fence; /** * @category constructors * @since 0.6.0 */ var Header = function (level, content) { return ({ _tag: 'Header', level: level, content: content }); }; exports.Header = Header; /** * @category constructors * @since 0.6.0 */ exports.Newline = { _tag: 'Newline' }; /** * @category constructors * @since 0.6.0 */ var Paragraph = function (content) { return ({ _tag: 'Paragraph', content: content }); }; exports.Paragraph = Paragraph; /** * @category constructors * @since 0.6.0 */ var PlainText = function (content) { return ({ _tag: 'PlainText', content: content }); }; exports.PlainText = PlainText; /** * @category constructors * @since 0.6.0 */ var PlainTexts = function (content) { return ({ _tag: 'PlainTexts', content: content }); }; exports.PlainTexts = PlainTexts; /** * @category constructors * @since 0.6.0 */ var Strikethrough = function (content) { return ({ _tag: 'Strikethrough', content: content }); }; exports.Strikethrough = Strikethrough; // ------------------------------------------------------------------------------------- // destructors // ------------------------------------------------------------------------------------- /** * @category destructors * @since 0.6.0 */ var fold = function (patterns) { var f = function (x) { switch (x._tag) { case 'Bold': return patterns.Bold(x.content); case 'Fence': return patterns.Fence(x.language, x.content); case 'Header': return patterns.Header(x.level, x.content); case 'Newline': return patterns.Newline(); case 'Paragraph': return patterns.Paragraph(x.content); case 'PlainText': return patterns.PlainText(x.content); case 'PlainTexts': return patterns.PlainTexts(x.content); case 'Strikethrough': return patterns.Strikethrough(x.content); default: return (0, function_1.absurd)(x); } }; return f; }; exports.fold = fold; // ------------------------------------------------------------------------------------- // combinators // ------------------------------------------------------------------------------------- var foldS = M.concatAll(S.Monoid); var foldMarkdown = function (as) { return (0, function_1.pipe)(as, M.concatAll(exports.monoidMarkdown)); }; var CRLF = (0, exports.PlainTexts)(RA.replicate(2, exports.Newline)); var intercalateCRLF = function (xs) { return (0, Foldable_1.intercalate)(exports.monoidMarkdown, RA.Foldable)(CRLF, xs); }; var intercalateNewline = function (xs) { return (0, Foldable_1.intercalate)(S.Monoid, RA.Foldable)('\n', xs); }; var h1 = function (content) { return (0, exports.Header)(1, content); }; var h2 = function (content) { return (0, exports.Header)(2, content); }; var h3 = function (content) { return (0, exports.Header)(3, content); }; var ts = function (code) { return (0, exports.Fence)('ts', (0, exports.PlainText)(code)); }; var since = O.fold(function () { return exports.monoidMarkdown.empty; }, function (v) { return foldMarkdown([CRLF, (0, exports.PlainText)("Added in v".concat(v))]); }); var title = function (s, deprecated, type) { var title = s.trim() === 'hasOwnProperty' ? "".concat(s, " (function)") : s; var markdownTitle = deprecated ? (0, exports.Strikethrough)((0, exports.PlainText)(title)) : (0, exports.PlainText)(title); return (0, function_1.pipe)(O.fromNullable(type), O.fold(function () { return markdownTitle; }, function (t) { return foldMarkdown([markdownTitle, (0, exports.PlainText)(" ".concat(t))]); })); }; var description = (0, function_1.flow)(O.fold(function () { return exports.monoidMarkdown.empty; }, exports.PlainText), exports.Paragraph); var signature = function (s) { return (0, function_1.pipe)(RA.of(ts(s)), RA.prepend((0, exports.Paragraph)((0, exports.Bold)((0, exports.PlainText)('Signature')))), foldMarkdown); }; var signatures = function (ss) { return (0, function_1.pipe)(RA.of(ts(intercalateNewline(ss))), RA.prepend((0, exports.Paragraph)((0, exports.Bold)((0, exports.PlainText)('Signature')))), foldMarkdown); }; var examples = (0, function_1.flow)(RA.map(function (code) { return (0, function_1.pipe)(RA.of(ts(code)), RA.prepend((0, exports.Bold)((0, exports.PlainText)('Example'))), intercalateCRLF); }), intercalateCRLF); var staticMethod = function (m) { return (0, exports.Paragraph)(foldMarkdown([ h3(title(m.name, m.deprecated, '(static method)')), description(m.description), signatures(m.signatures), examples(m.examples), since(m.since) ])); }; var method = function (m) { return (0, exports.Paragraph)(foldMarkdown([ h3(title(m.name, m.deprecated, '(method)')), description(m.description), signatures(m.signatures), examples(m.examples), since(m.since) ])); }; var propertyToMarkdown = function (p) { return (0, exports.Paragraph)(foldMarkdown([ h3(title(p.name, p.deprecated, '(property)')), description(p.description), signature(p.signature), examples(p.examples), since(p.since) ])); }; var staticMethods = (0, function_1.flow)(RA.map(staticMethod), intercalateCRLF); var methods = (0, function_1.flow)(RA.map(method), intercalateCRLF); var properties = (0, function_1.flow)(RA.map(propertyToMarkdown), intercalateCRLF); var moduleDescription = function (m) { return (0, exports.Paragraph)(foldMarkdown([ (0, exports.Paragraph)(h2(title(m.name, m.deprecated, 'overview'))), description(m.description), examples(m.examples), since(m.since) ])); }; var meta = function (title, order) { return (0, exports.Paragraph)(foldMarkdown([ (0, exports.PlainText)('---'), exports.Newline, (0, exports.PlainText)("title: ".concat(title)), exports.Newline, (0, exports.PlainText)("nav_order: ".concat(order)), exports.Newline, (0, exports.PlainText)("parent: Modules"), exports.Newline, (0, exports.PlainText)('---') ])); }; var fromClass = function (c) { return (0, exports.Paragraph)(foldMarkdown([ (0, exports.Paragraph)(foldMarkdown([ h2(title(c.name, c.deprecated, '(class)')), description(c.description), signature(c.signature), examples(c.examples), since(c.since) ])), staticMethods(c.staticMethods), methods(c.methods), properties(c.properties) ])); }; var fromConstant = function (c) { return (0, exports.Paragraph)(foldMarkdown([ h2(title(c.name, c.deprecated)), description(c.description), signature(c.signature), examples(c.examples), since(c.since) ])); }; var fromExport = function (e) { return (0, exports.Paragraph)(foldMarkdown([ h2(title(e.name, e.deprecated)), description(e.description), signature(e.signature), examples(e.examples), since(e.since) ])); }; var fromFunction = function (f) { return (0, exports.Paragraph)(foldMarkdown([ h2(title(f.name, f.deprecated)), description(f.description), signatures(f.signatures), examples(f.examples), since(f.since) ])); }; var fromInterface = function (i) { return (0, exports.Paragraph)(foldMarkdown([ h2(title(i.name, i.deprecated, '(interface)')), description(i.description), signature(i.signature), examples(i.examples), since(i.since) ])); }; var fromTypeAlias = function (ta) { return (0, exports.Paragraph)(foldMarkdown([ h2(title(ta.name, ta.deprecated, '(type alias)')), description(ta.description), signature(ta.signature), examples(ta.examples), since(ta.since) ])); }; var fromPrintable = function (p) { switch (p._tag) { case 'Class': return fromClass(p); case 'Constant': return fromConstant(p); case 'Export': return fromExport(p); case 'Function': return fromFunction(p); case 'Interface': return fromInterface(p); case 'TypeAlias': return fromTypeAlias(p); default: return (0, function_1.absurd)(p); } }; // ------------------------------------------------------------------------------------- // printers // ------------------------------------------------------------------------------------- var getPrintables = function (module) { return (0, function_1.pipe)(M.concatAll(RA.getMonoid())([ module.classes, module.constants, module.exports, module.functions, module.interfaces, module.typeAliases ]), RNEA.fromReadonlyArray); }; /** * @category printers * @since 0.6.0 */ var printClass = function (c) { return (0, function_1.pipe)(fromClass(c), exports.showMarkdown.show); }; exports.printClass = printClass; /** * @category printers * @since 0.6.0 */ var printConstant = function (c) { return (0, function_1.pipe)(fromConstant(c), exports.showMarkdown.show); }; exports.printConstant = printConstant; /** * @category printers * @since 0.6.0 */ var printExport = function (e) { return (0, function_1.pipe)(fromExport(e), exports.showMarkdown.show); }; exports.printExport = printExport; /** * @category printers * @since 0.6.0 */ var printFunction = function (f) { return (0, function_1.pipe)(fromFunction(f), exports.showMarkdown.show); }; exports.printFunction = printFunction; /** * @category printers * @since 0.6.0 */ var printInterface = function (i) { return (0, function_1.pipe)(fromInterface(i), exports.showMarkdown.show); }; exports.printInterface = printInterface; /** * @category printers * @since 0.6.0 */ var printTypeAlias = function (f) { return (0, function_1.pipe)(fromTypeAlias(f), exports.showMarkdown.show); }; exports.printTypeAlias = printTypeAlias; /** * @category printers * @since 0.6.0 */ var printModule = function (module, order) { var DEFAULT_CATEGORY = 'utils'; var header = (0, function_1.pipe)(meta(module.path.slice(1).join('/'), order), exports.showMarkdown.show); var description = (0, function_1.pipe)((0, exports.Paragraph)(moduleDescription(module)), exports.showMarkdown.show); var content = (0, function_1.pipe)(getPrintables(module), O.map((0, function_1.flow)(RNEA.groupBy(function (_a) { var category = _a.category; return (0, function_1.pipe)(category, O.getOrElse(function () { return DEFAULT_CATEGORY; })); }), RR.collect(S.Ord)(function (category, printables) { var title = (0, function_1.pipe)(h1((0, exports.PlainText)(category)), exports.showMarkdown.show); var documentation = (0, function_1.pipe)(printables, RA.map((0, function_1.flow)(fromPrintable, exports.showMarkdown.show)), RA.sort(S.Ord), intercalateNewline); return intercalateNewline([title, documentation]); }), RA.sort(S.Ord), intercalateNewline)), O.getOrElse(function () { return ''; })); var tableOfContents = function (c) { return (0, function_1.pipe)((0, exports.Paragraph)(foldMarkdown([(0, exports.Paragraph)((0, exports.PlainText)('<h2 class="text-delta">Table of contents</h2>')), (0, exports.PlainText)(toc(c).content)])), exports.showMarkdown.show); }; return (0, function_1.pipe)(intercalateNewline([header, description, '---\n', tableOfContents(content), '---\n', content]), prettify); }; exports.printModule = printModule; // ------------------------------------------------------------------------------------- // instances // ------------------------------------------------------------------------------------- /** * @category instances * @since 0.6.0 */ exports.semigroupMarkdown = { concat: function (x, y) { return (0, exports.PlainTexts)([x, y]); } }; /** * @category instances * @since 0.6.0 */ exports.monoidMarkdown = __assign(__assign({}, exports.semigroupMarkdown), { empty: (0, exports.PlainText)('') }); var prettierOptions = { parser: 'markdown', semi: false, singleQuote: true, printWidth: 120 }; var prettify = function (s) { return prettier.format(s, prettierOptions); }; var canonicalizeMarkdown = RA.filterMap(function (markdown) { return (0, function_1.pipe)(markdown, (0, exports.fold)({ Bold: function () { return O.some(markdown); }, Header: function () { return O.some(markdown); }, Fence: function () { return O.some(markdown); }, Newline: function () { return O.some(markdown); }, Paragraph: function () { return O.some(markdown); }, PlainText: function (content) { return (content.length > 0 ? O.some(markdown) : O.none); }, PlainTexts: function (content) { return O.some((0, exports.PlainTexts)(canonicalizeMarkdown(content))); }, Strikethrough: function () { return O.some(markdown); } })); }); var markdownToString = (0, exports.fold)({ Bold: function (content) { return foldS(['**', markdownToString(content), '**']); }, Header: function (level, content) { return foldS(['\n', foldS(RA.replicate(level, '#')), ' ', markdownToString(content), '\n\n']); }, Fence: function (language, content) { return foldS(['```', language, '\n', markdownToString(content), '\n', '```\n\n']); }, Newline: function () { return '\n'; }, Paragraph: function (content) { return foldS([markdownToString(content), '\n\n']); }, PlainText: function (content) { return content; }, PlainTexts: function (content) { return (0, function_1.pipe)(content, canonicalizeMarkdown, RA.map(markdownToString), foldS); }, Strikethrough: function (content) { return foldS(['~~', markdownToString(content), '~~']); } }); /** * @category instances * @since 0.6.0 */ exports.showMarkdown = { show: (0, function_1.flow)(markdownToString, prettify) };