UNPKG

8.11 kBJavaScriptView Raw
1'use strict';
2
3var _clone = require('lodash/clone');
4var _defaults = require('lodash/defaults');
5var _includes = require('lodash/includes');
6
7// var debug = require('debug')('ifnode:config');
8var path = require('path');
9
10/**
11 *
12 * @param {IFSiteConnectionOptions} site_config
13 * @param {boolean} ssl
14 * @returns {string}
15 */
16function build_origin_value(site_config, ssl) {
17 var protocol = ssl?
18 'https://' :
19 'http://';
20 var port = site_config.port?
21 ':' + site_config.port :
22 '';
23
24 return protocol + site_config.host + port;
25}
26
27/**
28 *
29 * @param {IFSiteConnectionOptions} site_config
30 * @param {boolean} ssl
31 * @returns {Object}
32 */
33function location_init(site_config, ssl) {
34 Object.defineProperties(site_config, {
35 'origin': {
36 enumerable: true,
37 value: build_origin_value(site_config, ssl)
38 },
39 'url': {
40 enumerable: true,
41 value: function(pathname) {
42 if(pathname[0] !== '/') {
43 pathname = '/' + pathname;
44 }
45
46 return this.origin + pathname;
47 }
48 }
49 });
50
51 return site_config;
52}
53
54/**
55 *
56 * @param {Object} params
57 * @param {Array.<Object, string>} params.obj
58 * @param {Object} params.defaults
59 */
60function set_defaults(params) {
61 var obj = params.obj[0],
62 prop = params.obj[1],
63 defaults = params.defaults;
64
65 obj[prop] = obj[prop]?
66 _defaults(obj[prop], defaults) :
67 _clone(defaults);
68}
69
70/**
71 *
72 * @param {Object} config
73 * @param {Object} default_config
74 * @param {string} project_folder
75 */
76function initialize_properties_config(config, default_config, project_folder) {
77 config.environment = config.env = config.environment || config.env || default_config.environment;
78 config.application = config.application || {};
79 config.components = config.components || {};
80
81 if(config.application.folders) {
82 var folders = config.application.folders;
83
84 Object.keys(folders).forEach(function(type) {
85 folders[type] = path.resolve(project_folder, folders[type]);
86 });
87
88 if(folders.views) {
89 set_defaults({
90 obj: [config.application, 'express'],
91 defaults: {
92 views: config.application.folders.views
93 }
94 });
95 }
96 } else {
97 config.application.folders = {};
98 }
99
100
101 set_defaults({
102 obj: [config.application, 'folders'],
103 defaults: default_config.application.folders
104 });
105
106 set_defaults({
107 obj: [config.application, 'express'],
108 defaults: default_config.application.express
109 });
110}
111
112/**
113 *
114 * @param {Object} config
115 * @param {IFSiteConfig} config.site
116 * @param {Object} default_config
117 * @param {IFSiteConfig} default_config.site
118 * @param {string} project_folder
119 */
120function initialize_site_config(config, default_config, project_folder) {
121 /**
122 *
123 */
124 function initialize_ssl_config() {
125 /**
126 *
127 * @param {Object} config
128 * @param {Object} [default_ssl_config]
129 */
130 function check_ssl_property(config, default_ssl_config) {
131 if(typeof config.ssl !== 'undefined') {
132 if(typeof config.ssl === 'boolean') {
133 return;
134 }
135
136 if(config.ssl.pfx) {
137 config.ssl.pfx = path.resolve(project_folder, config.ssl.pfx);
138 } else if(config.ssl.key && config.ssl.cert) {
139 config.ssl.key = path.resolve(project_folder, config.ssl.key);
140 config.ssl.cert = path.resolve(project_folder, config.ssl.cert);
141 }
142 } else if(default_ssl_config) {
143 set_defaults({
144 obj: [config, 'ssl'],
145 defaults: default_ssl_config
146 });
147 }
148 }
149
150 check_ssl_property(config.site);
151 check_ssl_property(config.site.local, config.site.ssl);
152 check_ssl_property(config.site.global, config.site.ssl);
153 }
154
155 if(!config.site) {
156 config.site = _clone(default_config.site);
157 return;
158 }
159
160 if(!config.site.connection) {
161 config.site.connection = default_config.site.connection;
162 }
163
164 if(!config.site.local) {
165 config.site.local = _clone(default_config.site.local);
166 } else {
167 var local_site_config = config.site.local;
168 var local_default_config = default_config.site.local;
169
170 if(!local_site_config.host) {
171 local_site_config.host = local_default_config.host;
172 }
173
174 if(
175 _includes(['127.0.0.1', 'localhost'], local_site_config.host) &&
176 !local_site_config.port
177 ) {
178 local_site_config.port = local_default_config.port;
179 }
180 }
181
182 if(!config.site.global) {
183 config.site.global = _clone(config.site.local);
184 }
185
186 initialize_ssl_config();
187}
188
189/**
190 *
191 * @param {Object} config
192 */
193function initialize_additional_site_config(config) {
194 location_init(config.site.local, !!config.site.local.ssl);
195 location_init(config.site.global, !!config.site.global.ssl);
196}
197
198/**
199 *
200 * @param {Object} config
201 * @param {Object} default_config
202 */
203function initialize_db_config(config, default_config) {
204 config.db = _defaults(config.db || {}, default_config.db);
205}
206
207/**
208 *
209 * @param {Object} options
210 * @returns {IFConfig}
211 */
212function initialize_default_config(options) {
213 var backend_folder = options.backend_folder;
214 var env = options.environment || 'local';
215 var view_path = path.resolve(backend_folder, 'views/');
216
217 return {
218 environment: env,
219 site: {
220 //ssl: {
221 // key: '',
222 // cert: ''
223 //
224 // pfx: ''
225 //},
226 connection: 'http',
227 local: {
228 host: 'localhost',
229 port: 8080
230 },
231 global: {
232 host: 'localhost'
233 }
234 },
235 application: {
236 express: {
237 'env': env,
238 'views': view_path,
239 'view engine': 'jade',
240 'x-powered-by': false
241 },
242 folders: {
243 extensions: path.resolve(backend_folder, 'extensions/'),
244 components: path.resolve(backend_folder, 'components/'),
245 views: view_path,
246 controllers: path.resolve(backend_folder, 'controllers/'),
247 models: path.resolve(backend_folder, 'models/')
248 }
249 },
250
251 db: {
252 virtual: {
253 schema: 'virtual'
254 }
255 }
256 };
257}
258
259// var ConfigPrototype = {
260// by_path: function by_path(path) {
261// var parts = path.split('.'),
262// tmp = this,
263// part, i, len = parts.length;
264//
265// for (i = 0; i < len; ++i) {
266// part = parts[i];
267// tmp = tmp[part];
268//
269// if (typeof tmp === 'undefined') {
270// return null;
271// }
272// }
273//
274// return tmp;
275// },
276// byPath: function byPath(path) {
277// return this.by_path(path);
278// }
279// };
280
281/**
282 *
283 * @param {Object} options
284 * @returns {IFConfig}
285 */
286function ConfigurationBuilder(options) {
287 var default_config = initialize_default_config(options);
288
289 if(!options.config_path) {
290 initialize_additional_site_config(default_config);
291 return default_config;
292 }
293
294 var config = require(options.config_path);
295 // var config = Object.create(ConfigPrototype);
296
297 initialize_properties_config(config, default_config, options.project_folder);
298 initialize_site_config(config, default_config, options.project_folder);
299 initialize_additional_site_config(config);
300 initialize_db_config(config, default_config);
301
302 return config;
303}
304
305module.exports = ConfigurationBuilder;