ninjs-lodash
Version:
lodash wrapper + utils
113 lines (96 loc) • 3.42 kB
JavaScript
/**
* Settings -> merge(os, env, globals, .folders, .files, config)
*/
const path = require('path')
const os = require('os')
const _ = require('lodash')
const fs = require('fs-extra')
const libs = require('../libs')
const core = require('../core')
const DOT_NAME = '.ninjs'
let DEFAULTS = require('./settings')
let SETTINGS = _.assign({}, DEFAULTS)
// settings get/sets
function getset(k, v) { return v ? set(k, v) : get(k) }
function get(k) { return k && _.isString(k) ? _.get(SETTINGS, k) : SETTINGS }
function set(k, v) {
if(!k) return
let curr = get(k)
v = curr && _.isPlainObject(curr) && _.isPlainObject(v) ? _.deepExtend(curr, v) : v
_.set(SETTINGS, k, v)
return get(k)
}
exports = module.exports = getset
_.assign(_, { "$": getset })
function load() {
loadDependencySettings()
// loadUser()
// loadUserLocal()
// loadUserRoaming()
// loadUserTemp()
loadCwdSettings()
loadLodashSettings()
}
function existsSync(src) {
return !_.isError(_.attempt(fs.accessSync, src, fs.constants.F_OK)) ? true : false
}
function getFile(src) {
if(!src || !_.isString(src)) return
let ext = path.parse(src).ext
let isJson = ext && _.toLower(ext) === '.json' ? true : false
let isJs = ext && _.toLower(ext) === '.js' ? true : false
if(!isJson && !isJs) return
let file = isJson ? _.attempt(fs.readFileSync, src, 'utf8') : _.attempt(require, src)
if(!file || _.isError(file)) return
file = isJson ? _.strip(file) : file
let parsed = isJson ? _.attempt(JSON.parse, file) : file
return _.isError(parsed) ? file : parsed
}
function mergeFile(src) {
if(!src || !_.isString(src)) return
let exists = existsSync(src)
if(!exists) return
let obj = getFile(src)
if(!obj) return
return SETTINGS = _.attempt(_.deepExtend, SETTINGS, obj)
}
function loadDependencySettings() {
let pkg = get('pkg')
let deps = pkg ? _.get(pkg, 'dependencies') : null
if(!deps || !_.isPlainObject(deps) || _.isEmpty(deps)) return
_.forIn(deps, (v, k) => {
let src = _.attempt(require.resolve, k)
if(!src || _.isError(src)) return
let lib = path.parse(src).dir
let root = path.parse(lib).dir
mergeFile(path.join(lib, DOT_NAME, 'settings.js'))
mergeFile(path.join(lib, DOT_NAME, 'settings.json'))
mergeFile(path.join(root, DOT_NAME, 'settings.js'))
mergeFile(path.join(root, DOT_NAME, 'settings.json'))
})
}
function loadUser() {
let root = _.$('paths.home')
let src = root && _.isString(root) ? path.join(root, DOT_NAME, 'settings.json') : ''
if(!src || !_.isString(src)) return
return existsSync(src) ? mergeFile(src) : fs.outputJsonSync(src, SETTINGS)
}
function loadUserLocal() { }
function loadUserRoaming() { }
function loadUserTemp() { }
function loadCwdSettings() {
let root = process.cwd()
let par = path.parse(root).dir
mergeFile(path.join(root, DOT_NAME, 'settings.json'))
mergeFile(path.join(root, DOT_NAME, 'settings.js'))
mergeFile(path.join(par, DOT_NAME, 'settings.json'))
mergeFile(path.join(par, DOT_NAME, 'settings.js'))
}
function loadLodashSettings() {
// remove _ copy of itself
_.unset(_, '_')
// setup _.template settings to ignore template strings and Grave accents/backticks (`)
_.templateSettings.interpolate = _.$('lodash.template.settings.interpolate')
}
load()