UNPKG

1.9 kBJavaScriptView Raw
1/**
2 * @copyright Copyright (c) 2019 Maxim Khorin <maksimovichu@gmail.com>
3 */
4'use strict';
5
6const Base = require('../base/Base');
7
8module.exports = class FileMap extends Base {
9
10 constructor (config) {
11 super({
12 // directory: [path],
13 required: false, // require files
14 ...config
15 });
16 this.indexFiles();
17 }
18
19 isEmpty () {
20 return Object.values(this._files).length === 0;
21 }
22
23 get (name) {
24 if (Object.prototype.hasOwnProperty.call(this._files, name)) {
25 return this._files[name];
26 }
27 }
28
29 indexFiles () {
30 try {
31 this._files = {};
32 this.indexDirectoryFiles(this.directory);
33 if (this.required) {
34 this.requireFiles();
35 }
36 } catch {}
37 }
38
39 indexDirectoryFiles (dir) {
40 for (const name of fs.readdirSync(dir)) {
41 const file = path.join(dir, name);
42 if (fs.lstatSync(file).isDirectory()) {
43 this.indexDirectoryFiles(file);
44 } else {
45 this._files[this.getKey(file)] = file;
46 }
47 }
48 }
49
50 getKey (file) {
51 const relative = file.substring(this.directory.length + 1);
52 const parts = relative.split(path.sep);
53 parts.push(FileHelper.trimExtension(parts.pop()));
54 return parts.join('/'); // normalize separator
55 }
56
57 requireFiles () {
58 for (const key of Object.keys(this._files)) {
59 try {
60 this._files[key] = require(this._files[key]);
61 } catch (err) {
62 console.error(err);
63 delete this._files[key];
64 }
65 }
66 }
67};
68
69const fs = require('fs');
70const path = require('path');
71const FileHelper = require('../helper/FileHelper');
\No newline at end of file