-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
153 lines (127 loc) · 3.23 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*jslint node: true, stupid: true, white: true */
/**
* Module autoloader, chargement automatiques de composants avec cache.
* Chaque appel génère un nouvel autoloader.
*
* @returns autoloader ou Error
*/
module.exports = function (options) {
'use strict';
/**
* Valeures par défaut.
*/
options.imports = options.imports || {};
options.composants_path = options.composants_path || '';
var
/**
* @property cache Cache pour les composants déjà chargés.
*/
cache = {},
/**
* @property path Chemin des fichiers des composants.
*/
path = '',
/**
* @property logger Instance du logger.
*/
logger = options.logger,
/**
* Options à importer pour chaque composants (passé en paramètre aux composants).
*/
imports = options.imports,
/**
* Définit le chemin de stockage des composants.
*
* @param composants_path Chemin du dossier des composants
* @returns Error si échec, null sinon
*/
setPath = function (composants_path) {
var fs = require('fs'),
stat = null,
error = false;
try {
stat = fs.statSync(composants_path);
} catch (err) {
error = true;
}
if (error === true || !stat.isDirectory()) {
if (logger) {
logger.fatal("Impossible d'ouvrir le dossier des composants (%s) ", composants_path);
}
return new Error({code: 'COMPOSANT_PATH_NOT_FOUND'});
}
if (composants_path.lastIndexOf('/') !== composants_path.length - 1) {
composants_path = composants_path + '/';
}
path = composants_path;
return null;
},
/**
* Charge un composant depuis le disque et le retourne.
*
* @param file Fichier du composant a charger
* @returns Le composant
*/
fetch = function (file) {
var composant = {};
if (logger) {
logger.debug('Chargement du composant %s', file);
}
try {
composant = require(path + file)(imports);
} catch (err) {
if (logger) {
if (err.code === 'MODULE_NOT_FOUND') {
logger.warn({err: err}, 'Composant %s non trouvé (%s)', file, path + file);
} else {
logger.error({err: err}, 'Erreur inconnue au chargement du composant %s (%s)', file, path + file);
}
}
return new Error({code: 'COMPOSANT_NOT_FOUND'});
}
return composant;
},
/**
* Renvoie un objet modèle en fonction de son nom.
*
* @param name Nom du modèle à retourner
* @returns Le modèle
*/
get = function (name) {
if (cache[name] === undefined) {
cache[name] = fetch(name);
}
return cache[name];
},
/**
* Précharge tous les composants trouvés.
*
* @param callback Callback de fin de chargement
*/
loadFiles = function (callback) {
var walker = require('walk').walk(path);
walker.on('file', function (root, fileStats, next) {
root = root.replace(path, '');
if (root !== '') {
root = root + '/';
}
if (fileStats.name.match(/\.js$/)) {
get(root + fileStats.name);
}
next();
});
walker.on('end', callback);
},
/**
* Définition du chemin d'accès aux fichiers des composants.
*/
result = setPath(options.composants_path);
/**
* Exposition de la partie publique.
* Ou retour de l'erreur si il y a.
*/
return result || {
get: get,
loadFiles: loadFiles
};
};