UNPKG

3.48 kBJavaScriptView Raw
1/**
2 * Bud for index.js
3 * @memberof module:ape-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 {object} - Bud for index.js
13 */
14
15'use strict'
16
17const EOL = require('os').EOL
18const arrayfilter = require('arrayfilter')
19const arraysort = require('arraysort')
20const stringcase = require('stringcase')
21const assert = require('assert')
22const path = require('path')
23const fs = require('fs')
24const minimatch = require('minimatch')
25const _tmpl = require('./_tmpl')
26
27/** @lends indexJsBud */
28function indexJsBud (config) {
29 let dirname = config.dirname
30 assert.ok(!!dirname, 'config.dirname is required.')
31 return {
32 force: true,
33 mode: '444',
34 path: path.resolve(dirname, 'index.js'),
35 mkdirp: false,
36 tmpl: _tmpl('hbs/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 let 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(arrayfilter.patternReject(/\.jsx$/))
52 .filter((filename) => {
53 try {
54 require.resolve(path.resolve(dirname, filename))
55 return true
56 } catch (e) {
57 return false
58 }
59 })
60 .map((filename) => {
61 try {
62 let name = stringcase.camelcase(path.basename(filename, path.extname(filename)))
63 if (config.pascalcase) {
64 name = stringcase.pascalcase(name)
65 }
66 return {
67 name: name,
68 requireName: name.split(/\./g).map(stringcase.snakecase).join('.'),
69 get isSubmodules () {
70 let camelName = stringcase.camelcase(name)
71 for (let submodule of submodules) {
72 let hit = minimatch(camelName, submodule)
73 if (hit) {
74 return true
75 }
76 }
77 return false
78 },
79 get isSubclass () {
80 let pascalName = stringcase.pascalcase(name)
81 let camelName = stringcase.camelcase(name)
82 for (let subclass of subclasses) {
83 let hit = minimatch(pascalName, subclass) || minimatch(camelName, subclass)
84 if (hit) {
85 return true
86 }
87 }
88 return false
89 }
90 }
91 } catch (e) {
92 return null
93 }
94 })
95 .filter(arrayfilter.emptyReject())
96 }
97 }
98 }
99}
100
101module.exports = indexJsBud
102