123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- /*
- config - Read configuration for gulp builds and define polyfills
- */
- import * as fs from 'fs'
- import * as json5 from 'json5'
- import * as gulp from 'gulp'
- import * as log from 'fancy-log'
- import {blend} from './blend'
- /*
- Polyfills
- */
- global.print = (...args) => log(...args)
- global.dump = (...args) => { for (let item of args) print(JSON.stringify(item, null, 4)) }
- /*
- Build up config environment which is
- ../pak.json + package.json + pak.json + product.json + command line
- */
- var config = {}
- let argv = process.argv
- let files = [
- '../CONFIG/keys.json',
- 'CONFIG/keys.json',
- '../pak.json',
- 'pak.json',
- 'product.json',
- ]
- for (let file of files) {
- file = process.cwd() + '/' + file
- if (fs.existsSync(file)) {
- let json
- try {
- json = json5.parse(fs.readFileSync(file))
- } catch (e) {
- print(`Cannot parse ${file}`)
- throw e
- }
- blend(config, json)
- }
- }
- if (fs.existsSync('../CONFIG/terraform.json')) {
- config.terraform = {}
- blend(config.terraform, json5.parse(fs.readFileSync('../CONFIG/terraform.json')))
- }
- /*
- Support --profile and other '-' switches. Convert --args into config.NAME = value.
- */
- let args = {}
- for (let i = 2; i < argv.length; i++) {
- let arg = argv[i]
- if (arg.indexOf('--') == 0) {
- arg = arg.slice(2)
- args[arg] = argv[++i] || true
- } else if (arg.indexOf('-') == 0) {
- arg = arg.slice(1)
- args[arg] = true
- }
- }
- /*
- Set sensible defaults: Default to profile == dev, debug == true if dev.
- */
- config.profile = args.profile || process.env.PROFILE || 'dev'
- if (config.profiles && config.profile && config.profiles[config.profile]) {
- blend(config, config.profiles[config.profile])
- }
- config.debug = args.debug || config.debug
- if (config.debug == 'true') {
- config.debug = true
- }
- /*
- Get version from ../pak.json or ./pak.json
- */
- try {
- var parent = json5.parse(fs.readFileSync(process.cwd() + '/../pak.json'))
- config.version = parent.version
- } catch (err) {
- try {
- var parent = json5.parse(fs.readFileSync(process.cwd() + '/pak.json'))
- config.version = parent.version
- } catch (err) {
- print('Cannot read ../pak.json or ./pak.json')
- }
- }
- global.expand = function(v, ...contexts) {
- let json = JSON.stringify(v)
- for (let context of contexts) {
- json = template(json, context)
- }
- return JSON.parse(json)
- }
- function template(v, context) {
- let text = v.toString()
- let matches = text.match(/\$\{[^}]*}/gm)
- if (matches) {
- for (let name of matches) {
- let word = name.slice(2).slice(0, -1)
- if (context[word] == undefined) {
- context[word] = '${' + word + '}'
- }
- }
- let fn = Function('_context_', 'with (_context_) { return `' + text + '`}')
- return fn(context)
- }
- return text
- }
- /*
- Map configuration hash into env var format. Uppercase with dots and "-" converted to "_".
- */
- function mapEnv(obj, prefix = '', vars = {}) {
- for (let name of Object.keys(obj)) {
- let value = obj[name]
- if (name == 'profiles') {
- continue
- }
- if (typeof value == 'object') {
- mapEnv(value, prefix + name.toUpperCase() + '_', vars)
- } else {
- name = (prefix + name).toUpperCase().replace(/\./g, '_').replace(/-/g, '_')
- vars[name] = value
- }
- }
- return vars
- }
- global.getEnv = function(obj, context) {
- let vars = mapEnv(obj)
- for (let [index, v] of Object.entries(vars)) {
- vars[index] = expand(v, context)
- }
- let env = blend({}, process.env)
- return blend(env, vars)
- }
- export default config
|