UNPKG

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