1 | var fs = require('fs.extra');
|
2 | var path = require('path');
|
3 | var check = require('check-types');
|
4 | var verify = check.verify;
|
5 | var glob = require('glob');
|
6 | var unary = require('allong.es').es.unary;
|
7 | var mkdirp = require('mkdirp');
|
8 | var Q = require('q');
|
9 | require('console.json');
|
10 | var debug = require('debug')('xplain');
|
11 |
|
12 | var getApi = require('./extract-jsdocs/getTaggedComments').getCommentsFromFiles;
|
13 | var getSampleTests = require('./extract-jsdocs/getTaggedComments').getSampleTests;
|
14 |
|
15 | var toDoc = require('./html-generation/toHtml');
|
16 | var xplainMarkdown = require('./md-generation/xplainMarkdown');
|
17 | var rethrow = require('./utils/errors').rethrow;
|
18 | var docsToModules = require('./doc-model/docsToModules');
|
19 |
|
20 | var adapter = require('./doc-transform/adapters/adapter');
|
21 | verify.fn(adapter.isSupported, 'missing is supported function');
|
22 | verify.fn(adapter.supportedFrameworks,
|
23 | 'missing supported frameworks function ' + JSON.stringify(adapter));
|
24 |
|
25 | function isMarkdownFilename(name) {
|
26 | return (/\.md$/).test(name);
|
27 | }
|
28 |
|
29 | function 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 | 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 |
|
82 | function 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 |
|
96 | function isSpec(filename) {
|
97 | var spec = /spec\.js$/;
|
98 | lazyAss(check.unemptyString(filename), 'missing filename', filename);
|
99 | return spec.test(filename);
|
100 | }
|
101 |
|
102 | function detectFramework(inputFiles) {
|
103 | lazyAss(check.array(inputFiles), 'missing input files list', inputFiles);
|
104 | return inputFiles.some(isSpec) ? 'jasmine' : 'qunit';
|
105 | }
|
106 |
|
107 | module.exports = {
|
108 | document: generateDocs,
|
109 | isSupported: adapter.isSupported,
|
110 | supportedFrameworks: adapter.supportedFrameworks,
|
111 | detectFramework: detectFramework
|
112 | };
|