UNPKG

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