UNPKG

lazo-next

Version:

A client-server web framework built on Node.js that allows front-end developers to easily create a 100% SEO compliant, component MVC structured web application with an optimized first page load.

187 lines (159 loc) 7.92 kB
var scan = require('./scanner'); scan(process.env.FILE_REPO_DIR, function (appFiles) { var fs = require('fs'); var path = require('path'); var requirejs = require('requirejs'); var http = require('http'); var _ = require('lodash'); var bootstrap; var appJSON = fs.readFileSync(path.normalize(process.env.FILE_REPO_DIR + '/app/app.json')); var routes = {}; try { appJSON = JSON.parse(appJSON); routes = appJSON.routes; } catch (e) { console.log('Error reading app/routes.json: ' + e); process.exit(code=0); } var conf = (function() { var conf = JSON.parse(fs.readFileSync(path.normalize(process.env.BASE_PATH + '/' + 'conf.json'))); var appConfPath = path.normalize(process.env.FILE_REPO_DIR + '/conf.json'); var appConf = fs.existsSync(appConfPath) ? fs.readFileSync(appConfPath) : null; if (appConf) { try { appConf = JSON.parse(appConf); } catch (e) { console.log('Error reading conf.json: ' + e); process.exit(code=0); } _.merge(conf, appConf); } return conf; })(); global.LAZO = { BASE_PATH: process.env.BASE_PATH, FILE_REPO_DIR: process.env.FILE_REPO_DIR, SHARED_REPO_DIR: process.env.SHARED_REPO_DIR, FILE_REPO_PATH: path.resolve(process.env.FILE_REPO_DIR), PORT: process.env.PORT ? parseInt(process.env.PORT, 10) : conf.server.port, CLUSTER: process.env.CLUSTER === '1', ROBUST: process.env.ROBUST === '1', conf: conf, routes: routes, files: appFiles }; bootstrap = requirejs.config({ baseUrl: LAZO.BASE_PATH, context: 'bootstrap', paths: { 'json': 'lib/vendor/json', 'text': 'lib/vendor/text', 'common': 'lib/common', 'base': 'lib/common/base', 'resolver': 'lib/common/resolver' } }); // load requireConfigure directly as opposed to resolver/main because resolver // sub modules have need requirejs to be configured prior to being loaded bootstrap(['resolver/requireConfigure'], function (requireConfigure) { 'use strict'; var options = { basePath: LAZO.BASE_PATH, baseUrl: LAZO.FILE_REPO_DIR, paths: conf.requirejs.paths, shim: conf.requirejs.shim }; requireConfigure.get('server', options, function (err, conf) { if (err) { throw new Error(err); } var serverConf = conf; requireConfigure.get('client', options, function (err, conf) { if (err) { throw new Error(err); } var clientConf = conf; function addPaths(serverConf) { var customBundlerPath = path.normalize(LAZO.FILE_REPO_DIR + path.sep + 'app' + path.sep + 'bundle.js'); var customAssetPath = path.normalize(LAZO.FILE_REPO_DIR + path.sep + 'app' + path.sep + 'assets.js'); var customServerSetup = path.normalize(LAZO.FILE_REPO_DIR + path.sep + 'app' + path.sep + 'server' + path.sep + 'server.js'); var customPageTemplate = path.normalize(LAZO.FILE_REPO_DIR + path.sep + 'app' + path.sep + 'views' + path.sep + 'page.hbs'); if (fs.existsSync(customBundlerPath)) { serverConf.paths.bundler = path.resolve(path.normalize(LAZO.FILE_REPO_DIR + '/app/bundle')); } else { serverConf.paths.bundler = serverConf.paths.lazoBundle; } if (fs.existsSync(customAssetPath)) { serverConf.paths.assets = path.resolve(path.normalize(LAZO.FILE_REPO_DIR + '/app/assets')); } if (fs.existsSync(customServerSetup)) { serverConf.paths.appServerSetup = path.resolve(path.normalize(LAZO.FILE_REPO_DIR + '/app/server/server')); } if (fs.existsSync(customPageTemplate)) { serverConf.paths.pageTemplate = path.resolve(path.normalize(LAZO.FILE_REPO_DIR + '/app/views/page.hbs')); } return serverConf; } LAZO.require = requirejs.config(addPaths(serverConf)); LAZO.contexts = { request: JSON.parse(JSON.stringify(clientConf)), // request combo handling lib: JSON.parse(JSON.stringify(clientConf)), // lib combo handling server: JSON.parse(JSON.stringify(serverConf)), // paths are used for generating combo handled file app: { shim: conf.shim, paths: conf.paths } }; // these are needed by dependencies of lazoApp LAZO.isServer = true; LAZO.isClient = false; // these cannot be loaded until the requirejs app config has been set LAZO.require(['config'], function (config) { LAZO.config = config; LAZO.require(['app/application'], function (LazoApp) { LAZO.app = new LazoApp(); LAZO.app.isServer = LAZO.isServer; LAZO.app.isClient = LAZO.isClient; LAZO.app.css = appJSON.css || []; LAZO.app.js = appJSON.js || []; LAZO.app.imports = appJSON.imports || []; LAZO.app.getAssets = appJSON.assets || false; LAZO.app.defaultLayout = appJSON.defaultLayout; // these are dependent on the LAZO.require(['server', 'resolver/file', 'error', 'logger'], function (server, file, err, logger) { LAZO.error = err; LAZO.logger = logger; // process appArgs command line argument into application.args var args = process.argv.filter(function (elem) { return elem.indexOf('--appArgs') !== -1; }); if (args.length) { LAZO.app.args = {}; var appArgs = args[0].split('='), args = appArgs[1].split(';'); for (var i = 0, il = args.length; i < il; i++) { var arg = args[i].split(':'); LAZO.app.args[arg[0]] = arg[1]; } } LAZO.logger.warn(['server.app'], 'Initializing with arguments: %j', LAZO.app.args); http.globalAgent.maxSockets = LAZO.conf.server.maxSockets; LAZO.conf.server.instances.primary.port = LAZO.PORT || LAZO.conf.server.instances.primary.port; LAZO.app.initialize(function () { file.getErrorTemplatePaths(function (err, templates) { if (err) { throw err; } LAZO.errorTemplates = templates; server.initialize(templates); }); }); }); }); }); }); }); }); });