1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | 'use strict'
|
16 |
|
17 | const EOL = require('os').EOL
|
18 | const arrayfilter = require('arrayfilter')
|
19 | const arraysort = require('arraysort')
|
20 | const stringcase = require('stringcase')
|
21 | const assert = require('assert')
|
22 | const path = require('path')
|
23 | const fs = require('fs')
|
24 | const minimatch = require('minimatch')
|
25 | const _tmpl = require('./_tmpl')
|
26 |
|
27 |
|
28 | function 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 |
|
101 | module.exports = indexJsBud
|
102 |
|