UNPKG

5.36 kBJavaScriptView Raw
1'use strict';
2
3var node_fs = require('node:fs');
4var node_path = require('node:path');
5var node_url = require('node:url');
6var File = require('vinyl');
7var vfs = require('vinyl-fs');
8var _ = require('lodash');
9var concat = require('concat-stream');
10var GithubSlugger = require('github-slugger');
11var documentation = require('documentation');
12var hljs = require('highlight.js');
13var badges = require('@thebespokepixel/badges');
14var remark = require('remark');
15var gap = require('remark-heading-gap');
16var squeeze = require('remark-squeeze-paragraphs');
17
18function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
19
20var File__default = /*#__PURE__*/_interopDefaultLegacy(File);
21var vfs__default = /*#__PURE__*/_interopDefaultLegacy(vfs);
22var ___default = /*#__PURE__*/_interopDefaultLegacy(_);
23var concat__default = /*#__PURE__*/_interopDefaultLegacy(concat);
24var GithubSlugger__default = /*#__PURE__*/_interopDefaultLegacy(GithubSlugger);
25var hljs__default = /*#__PURE__*/_interopDefaultLegacy(hljs);
26var badges__default = /*#__PURE__*/_interopDefaultLegacy(badges);
27var remark__default = /*#__PURE__*/_interopDefaultLegacy(remark);
28var gap__default = /*#__PURE__*/_interopDefaultLegacy(gap);
29var squeeze__default = /*#__PURE__*/_interopDefaultLegacy(squeeze);
30
31const {createFormatters, LinkerStack} = documentation.util;
32
33function isFunction(section) {
34 return (
35 section.kind === 'function' ||
36 (section.kind === 'typedef' &&
37 section.type.type === 'NameExpression' &&
38 section.type.name === 'Function')
39 )
40}
41
42function formatSignature(section, formatters, isShort) {
43 let returns = '';
44 let prefix = '';
45 if (section.kind === 'class') {
46 prefix = 'new ';
47 } else if (!isFunction(section)) {
48 return section.name
49 }
50
51 if (!isShort && section.returns && section.returns.length > 0) {
52 returns = ' → ' +
53 formatters.type(section.returns[0].type);
54 }
55
56 return prefix + section.name + formatters.parameters(section, isShort) + returns
57}
58
59async function theme(comments, config) {
60 const linkerStack = new LinkerStack(config)
61 .namespaceResolver(comments, namespace => {
62 const slugger = new GithubSlugger__default["default"]();
63 return '#' + slugger.slug(namespace)
64 });
65
66 const formatters = createFormatters(linkerStack.link);
67
68 hljs__default["default"].configure(config.hljs || {});
69
70 const badgesAST = await badges__default["default"]('docs', true);
71
72 const sharedImports = {
73 imports: {
74 kebabCase(content) {
75 return ___default["default"].kebabCase(content)
76 },
77 badges() {
78 return formatters.markdown(badgesAST)
79 },
80 usage(example) {
81 const usage = node_fs.readFileSync(node_path.resolve(example));
82 return remark__default["default"]().use(gap__default["default"]).use(squeeze__default["default"]).parse(usage)
83 },
84 slug(content) {
85 const slugger = new GithubSlugger__default["default"]();
86 return slugger.slug(content)
87 },
88 shortSignature(section) {
89 return formatSignature(section, formatters, true)
90 },
91 signature(section) {
92 return formatSignature(section, formatters)
93 },
94 md(ast, inline) {
95 if (inline && ast && ast.children.length > 0 && ast.children[0].type === 'paragraph') {
96 ast = {
97 type: 'root',
98 children: ast.children[0].children.concat(ast.children.slice(1))
99 };
100 }
101
102 return formatters.markdown(ast)
103 },
104 formatType: formatters.type,
105 autolink: formatters.autolink,
106 highlight(example) {
107 if (config.hljs && config.hljs.highlightAuto) {
108 return hljs__default["default"].highlightAuto(example).value
109 }
110
111 return hljs__default["default"].highlight('js', example).value
112 }
113 }
114 };
115
116 const renderTemplate = source => ___default["default"].template(node_fs.readFileSync(node_path.join(node_path.dirname(node_url.fileURLToPath((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('index.js', document.baseURI).href)))), source), 'utf8'), sharedImports);
117
118 sharedImports.imports.renderSectionList = renderTemplate('parts/section_list._');
119 sharedImports.imports.renderSection = renderTemplate('parts/section._');
120 sharedImports.imports.renderNote = renderTemplate('parts/note._');
121 sharedImports.imports.renderParamProperty = renderTemplate('parts/paramProperty._');
122
123 const pageTemplate = renderTemplate('parts/index._');
124
125 // Push assets into the pipeline as well.
126 return new Promise(resolve => {
127 vfs__default["default"].src(
128 [
129 node_path.join(node_path.dirname(node_url.fileURLToPath((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('index.js', document.baseURI).href)))), 'assets', '**')
130 ],
131 {base: node_path.dirname(node_url.fileURLToPath((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('index.js', document.baseURI).href))))}
132 ).pipe(
133 concat__default["default"](files => {
134 resolve(
135 files.concat(
136 new File__default["default"]({
137 path: 'index.html',
138 contents: Buffer.from(pageTemplate({
139 docs: comments,
140 config
141 }))
142 })
143 )
144 );
145 })
146 );
147 })
148}
149
150module.exports = theme;