UNPKG

3.56 kBJavaScriptView Raw
1var fs = require('fs.extra');
2var path = require('path');
3var check = require('check-types');
4var verify = check.verify;
5var glob = require('glob');
6var unary = require('allong.es').es.unary;
7var mkdirp = require('mkdirp');
8var Q = require('q');
9require('console.json');
10var debug = require('debug')('xplain');
11
12var getApi = require('./extract-jsdocs/getTaggedComments').getCommentsFromFiles;
13var getSampleTests = require('./extract-jsdocs/getTaggedComments').getSampleTests;
14
15var toDoc = require('./html-generation/toHtml');
16var xplainMarkdown = require('./md-generation/xplainMarkdown');
17var rethrow = require('./utils/errors').rethrow;
18var docsToModules = require('./doc-model/docsToModules');
19
20var adapter = require('./doc-transform/adapters/adapter');
21verify.fn(adapter.isSupported, 'missing is supported function');
22verify.fn(adapter.supportedFrameworks,
23 'missing supported frameworks function ' + JSON.stringify(adapter));
24
25function isMarkdownFilename(name) {
26 return (/\.md$/).test(name);
27}
28
29function generateDocs(options) {
30 verify.object(options, 'mising options');
31 if (typeof options.patterns === 'string') {
32 options.patterns = [options.patterns];
33 }
34 verify.array(options.patterns, 'missing input files');
35 verify.string(options.outputFolder, 'missing output folder');
36
37 if (!isMarkdownFilename(options.outputFolder)) {
38 console.log('deleting output folder', options.outputFolder);
39 fs.rmrfSync(options.outputFolder);
40 mkdirp(options.outputFolder, rethrow);
41 }
42
43 var inputFiles = discoverSourceFiles(options.patterns);
44 verify.array(inputFiles, 'could not find filenames');
45 lazyAss(check.positiveNumber(inputFiles.length),
46 'Cannot find any source files for input', options.patterns);
47
48 if (!check.unemptyString(options.framework)) {
49 options.framework = detectFramework(inputFiles);
50 }
51
52 if (isMarkdownFilename(options.outputFolder)) {
53 return xplainMarkdown({
54 inputFiles: inputFiles,
55 framework: options.framework,
56 outputFilename: options.outputFolder
57 });
58 } else {
59 var api = getApi(inputFiles);
60 lazyAss(check.array(api), 'did not get api from files');
61 debug('extracted api', api);
62
63 var rootModule = docsToModules(api);
64 verify.object(rootModule, 'could not convert docs to modules');
65
66 var docOptions = {
67 outputFolder: options.outputFolder,
68 title: options.title,
69 apiVersion: options.apiVersion,
70 framework: options.framework,
71 header: options.header
72 };
73 return Q(toDoc(rootModule, docOptions)).then(function (result) {
74 return {
75 inputOptions: docOptions,
76 inputFiles: inputFiles
77 };
78 });
79 }
80}
81
82function discoverSourceFiles(patterns) {
83 verify.array(patterns, 'expect list of filenames/patterns');
84
85 var filenames = patterns.reduce(function (all, shortName) {
86 verify.string(shortName, 'missing filename');
87 var files = glob.sync(shortName);
88 return all.concat(files);
89 }, []);
90
91 console.log(filenames);
92 filenames = filenames.map(unary(path.resolve));
93 return filenames;
94}
95
96function isSpec(filename) {
97 var spec = /spec\.js$/;
98 lazyAss(check.unemptyString(filename), 'missing filename', filename);
99 return spec.test(filename);
100}
101
102function detectFramework(inputFiles) {
103 lazyAss(check.array(inputFiles), 'missing input files list', inputFiles);
104 return inputFiles.some(isSpec) ? 'jasmine' : 'qunit';
105}
106
107module.exports = {
108 document: generateDocs,
109 isSupported: adapter.isSupported,
110 supportedFrameworks: adapter.supportedFrameworks,
111 detectFramework: detectFramework
112};