UNPKG

@balderdash/sails-edge

Version:

API-driven framework for building realtime apps, using MVC conventions (based on Express and Socket.io)

173 lines (131 loc) 5.53 kB
/** * Module dependencies. */ var _ = require('lodash'); var async = require('async'); var CaptainsLog = require('captains-log'); var path = require('path'); module.exports = function(sails) { /** * Expose Configuration loader * * Load command-line overrides * * TODO: consider merging this into the `app` directory * * For reference, config priority is: * --> implicit defaults * --> environment variables * --> user config files * --> local config file * --> configOverride ( in call to sails.lift() ) * --> --cmdline args */ return function loadConfig(cb) { // Save reference to context for use in closures var self = this; // Commence with loading/validating/defaulting all the rest of the config async.auto({ /** * Until this point this point, `sails.config` is composed only of * configuration overrides passed into `sails.lift(overrides)` * (or `sails.load(overrides)`-- same thing) * * This step clones this into an "overrides" object, negotiating cmdline * shortcuts into the properly namespced sails configuration options. */ mapOverrides: function(cb) { // Clone the `overrides` that were passed in. var overrides = _.cloneDeep(sails.config || {}); // TODO: bring the rconf stuff from bin/sails-lift in here // Command-line arguments take highest precedence // overrides = _.merge(overrides, argv); // Map Sails options from overrides overrides = _.merge(overrides, { // `--verbose` command-line argument // `--silly` command-line argument // `--silent` command-line argument log: overrides.verbose ? { level: 'verbose' } : overrides.silly ? { level: 'silly' } : overrides.silent ? { level: 'silent' } : undefined, // `--port=?` command-line argument port: overrides.port || undefined, // `--prod` command-line argument environment: overrides.prod ? 'production' : (overrides.dev ? 'development' : undefined) }); // Pass on overrides object cb(null, overrides); }, /** * Immediately instantiate the default logger in case a log-worthy event occurs * Even though the app might actually use its own custom logger, we don't know * all of the user configurations yet. * * Makes sails.log accessible for the first time */ logger: ['mapOverrides', function(cb, async_data) { var logConfigSoFar = async_data.mapOverrides.log; sails.log = new CaptainsLog(logConfigSoFar); cb(); } ], /** * Expose version/dependency info for the currently-running * Sails on the `sails` object (from its `package.json`) */ versionAndDependencyInfo: function(cb) { var pathToThisVersionOfSails = path.join(__dirname, '../../..'); sails.util.getPackage(pathToThisVersionOfSails, function(err, json) { if (err) return cb(err); sails.version = json.version; sails.majorVersion = sails.version.split('.')[0].replace(/[^0-9]/g, ''); sails.minorVersion = sails.version.split('.')[1].replace(/[^0-9]/g, ''); sails.patchVersion = sails.version.split('.')[2].replace(/[^0-9]/g, ''); sails.dependencies = json.dependencies; cb(); }); }, /** * Ensure that environment variables are applied to important configs */ mixinDefaults: ['mapOverrides', function(cb, results) { // Get overrides var overrides = results.mapOverrides; //_.cloneDeep(results.mapOverrides); // Apply environment variables // (if the config values are not set in overrides) overrides.environment = overrides.environment || process.env.NODE_ENV; overrides.port = overrides.port || process.env.PORT; // Generate implicit, built-in framework defaults for the app var implicitDefaults = self.defaults(overrides.appPath || process.cwd()); // Extend copy of implicit defaults with user config var mergedConfig = _.merge(_.cloneDeep(implicitDefaults), overrides); // Override the environment variable so express and other modules // which expect NODE_ENV to be set mirror the configured Sails environment. sails.log.verbose('Setting Node environment...'); // Setting an environment var explicitly to "undefined" sets it to the // *string* "undefined". So we have to check if there's something to set first. if (mergedConfig.environment) { process.env['NODE_ENV'] = mergedConfig.environment; } cb(null, mergedConfig); } ] }, function configLoaded(err, results) { if (err) { sails.log.error('Error encountered loading config ::\n', err); return cb(err); } // Override the previous contents of sails.config with the new, validated // config w/ defaults and overrides mixed in the appropriate order. sails.config = results.mixinDefaults; cb(); }); }; };