UNPKG

3.13 kBJavaScriptView Raw
1/**
2 * Bud for index.js
3 * @memberof module:coz-tmpl/lib
4 * @function indexJsBud
5 * @param {object} config - Index js configuration.
6 * @param {string} config.dirname - Directory name.
7 * @param {string} [config.desc] - Module description.
8 * @param {string} [config.module] - Module annotation.
9 * @param {string} [config.parentmodule] - Name of parent module.
10 * @param {string[]} [config.submodules] - Name of members as submodule.
11 * @param {string[]} [config.subclasses] - Name of members as subclasses
12 * @returns {module:coz-bud/lib~Bud} - Bud for index.js
13 */
14
15"use strict";
16
17var EOL = require('os').EOL,
18 arrayfilter = require('arrayfilter'),
19 arraysort = require('arraysort'),
20 stringcase = require('stringcase'),
21 cozBud = require('coz-bud'),
22 assert = require('assert'),
23 path = require('path'),
24 fs = require('fs'),
25 _tmpl = require('./_tmpl');
26
27/** @lends indexJsBud */
28function indexJsBud(config) {
29 var dirname = config.dirname;
30 assert.ok(!!dirname, 'config.dirname is required.');
31 return cozBud({
32 force: true,
33 mode: '444',
34 path: path.resolve(dirname, 'index.js'),
35 mkdirp: false,
36 tmpl: _tmpl('index.js.hbs'),
37 data: {
38 END_BRACE: '}',
39 desc: [].concat(config.desc || []).join(EOL + ' * '),
40 module: config.module,
41 parentmodule: [].concat(config.parentmodule || []),
42 get modules() {
43 var submodules = [].concat(config.submodules || []),
44 subclasses = [].concat(config.subclasses || []);
45 return fs.readdirSync(dirname)
46 .sort(arraysort.stringCompare())
47 .filter(arrayfilter.patternReject(/^[\._]/))
48 .filter(arrayfilter.patternReject(/~$/))
49 .filter(arrayfilter.patternReject(/.tmp$/))
50 .filter(arrayfilter.patternReject(/^index\.js$/))
51 .filter(function (filename) {
52 try {
53 require.resolve(path.resolve(dirname, filename));
54 return true;
55 } catch (e) {
56 return false;
57 }
58 })
59 .map(function (filename) {
60 try {
61 var name = path.basename(filename, path.extname(filename));
62 return {
63 name: name,
64 requireName: name.split(/\./g).map(stringcase.snakecase).join('.'),
65 isSubmodules: ~submodules.indexOf(stringcase.camelcase(name)),
66 isSubclass: ~subclasses.indexOf(stringcase.camelcase(name)) || ~subclasses.indexOf(stringcase.pascalcase(name))
67 };
68 } catch (e) {
69 return null;
70 }
71 })
72 .filter(arrayfilter.emptyReject());
73 }
74 }
75 });
76}
77
78module.exports = indexJsBud;
79