UNPKG

3.79 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 const tmpl = config.mjs ? _tmpl('hbs/index.mjs.hbs') : _tmpl('hbs/index.js.hbs')
32 return {
33 force: true,
34 mode: '444',
35 path: path.resolve(dirname, 'index.js'),
36 mkdirp: false,
37 tmpl: tmpl,
38 data: {
39 END_BRACE: '}',
40 desc: [].concat(config.desc || []).join(EOL + ' * '),
41 module: config.module,
42 parentmodule: [].concat(config.parentmodule || []),
43 get modules () {
44 let submodules = [].concat(config.submodules || []),
45 subclasses = [].concat(config.subclasses || [])
46 return fs.readdirSync(dirname)
47 .sort(arraysort.stringCompare())
48 .filter(arrayfilter.patternReject(/^[\._]/))
49 .filter(arrayfilter.patternReject(/~$/))
50 .filter(arrayfilter.patternReject(/.tmp$/))
51 .filter(arrayfilter.patternReject(/^index\.js$/))
52 .filter(arrayfilter.patternReject(/\.jsx$/))
53 .filter((filename) => {
54 try {
55 require.resolve(path.resolve(dirname, filename))
56 return true
57 } catch (e) {
58 return false
59 }
60 })
61 .map((filename) => {
62 try {
63 const extname = path.extname(filename)
64 let name = stringcase.camelcase(path.basename(filename, extname))
65 if (config.pascalcase) {
66 name = stringcase.pascalcase(name)
67 }
68 let requireName = name.split(/\./g).map(stringcase.snakecase).join('.')
69 const needsExtToRequire = ['.json'].includes(extname)
70 if (needsExtToRequire) {
71 requireName += extname
72 }
73 return {
74 name: name,
75 requireName: requireName,
76 get isSubmodules () {
77 let camelName = stringcase.camelcase(name)
78 for (let submodule of submodules) {
79 let hit = minimatch(camelName, submodule)
80 if (hit) {
81 return true
82 }
83 }
84 return false
85 },
86 get isSubclass () {
87 let pascalName = stringcase.pascalcase(name)
88 let camelName = stringcase.camelcase(name)
89 for (let subclass of subclasses) {
90 let hit = minimatch(pascalName, subclass) || minimatch(camelName, subclass)
91 if (hit) {
92 return true
93 }
94 }
95 return false
96 }
97 }
98 } catch (e) {
99 return null
100 }
101 })
102 .filter(arrayfilter.emptyReject())
103 }
104 }
105 }
106}
107
108module.exports = indexJsBud
109