motion
Version:
motion - moving development forward
246 lines (194 loc) • 7.41 kB
JavaScript
exports.__esModule = true;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var init = _asyncToGenerator(function* (cli) {
try {
// init
OPTS.appDir = _path2['default'].normalize(process.cwd());
OPTS.name = cli.name || _path2['default'].basename(process.cwd());
OPTS.saneName = _libFns.sanitize(cli.name);
OPTS.hasRunInitialBuild = false;
OPTS.defaultPort = 4000;
setupCliOpts(cli);
setupDirs();
// from flint
yield migration();
// config
var config = yield loadConfigs(cli);
setupConfig(cli, config);
} catch (e) {
_libFns.handleError(e);
}
}
// TODO remove in minor
);
exports.init = init;
var migration = _asyncToGenerator(function* () {
var flintDir = _libFns.p(OPTS.appDir, '.flint');
if (yield _libFns.exists(flintDir)) {
// .flint => .motion
yield _libFns2['default'].move(flintDir, OPTS.motionDir);
// index.html "#_flintapp" => "#_motionapp"
_libFns2['default'].replace({
regex: '#_flintapp',
replacement: '#_motionapp',
paths: [OPTS.motionDir],
recursive: false,
silent: true
});
// .motion/flint.json => .motion/config.js
var oldConfLoc = _libFns.p(OPTS.motionDir, 'flint.json');
if (yield _libFns.exists(oldConfLoc)) {
console.log(' Migrating flint config to motion (flint.json => config.js)...\n');
yield _libFns2['default'].move(oldConfLoc, OPTS.configFile);
// add module.exports
var oldConf = yield _libFns.readFile(OPTS.configFile);
yield _libFns.writeFile(OPTS.configFile, 'module.exports = ' + oldConf);
}
}
});
var loadConfigs = _asyncToGenerator(function* () {
var result = undefined;
try {
var file = yield parseConfig();
if (file) {
var out = yield _libFns.readFile(file);
result = eval(out);
} else {
print('No .motion/config.js file found!');
}
} catch (e) {
_libFns.handleError(e);
}
return modeMergedConfig(result || {});
});
var setupCliOpts = _asyncToGenerator(function* (cli) {
OPTS.version = cli.version;
OPTS.debug = cli.debug;
OPTS.watch = cli.watch;
OPTS.reset = cli.reset;
OPTS.build = cli.build;
OPTS.out = cli.out;
// ensure we dont clobber things
if (cli.out && (yield _libFns.exists(cli.out))) {
console.error('\n Build dir already exists! Ensure you target an empty directory.\n'.red);
process.exit(1);
}
});
exports.set = set;
exports.get = get;
var serialize = _asyncToGenerator(function* () {
yield _disk2['default'].state.write(function (state, write) {
state.opts = _extends({}, OPTS);
delete state.opts.state; // prevent circular structure
write(state);
});
});
exports.serialize = serialize;
exports.debug = debug;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { var callNext = step.bind(null, 'next'); var callThrow = step.bind(null, 'throw'); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(callNext, callThrow); } } callNext(); }); }; }
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _libFns = require('./lib/fns');
var _libFns2 = _interopRequireDefault(_libFns);
var _disk = require('./disk');
var _disk2 = _interopRequireDefault(_disk);
var _util = require('util');
var _util2 = _interopRequireDefault(_util);
var _webpack = require('webpack');
var _webpack2 = _interopRequireDefault(_webpack);
var _bundlerLibGetWebpackErrors = require('./bundler/lib/getWebpackErrors');
var _bundlerLibGetWebpackErrors2 = _interopRequireDefault(_bundlerLibGetWebpackErrors);
var OPTS = {};
function modeMergedConfig(config) {
var modeSpecificConfig = config[OPTS.build ? 'build' : 'run'];
var merged = Object.assign({}, config, modeSpecificConfig);
return merged;
}
function parseConfig() {
return new Promise(_asyncToGenerator(function* (resolve, reject) {
try {
if (!(yield _libFns.exists(OPTS.configFile))) resolve(false);
// for json loader
var runnerRoot = _path2['default'].resolve(_path2['default'].join(__dirname, '..', '..'));
var runnerModules = _path2['default'].join(runnerRoot, 'node_modules');
_webpack2['default']({
context: OPTS.motionDir,
entry: './config.js',
output: {
filename: 'user-config.js',
path: './.motion/.internal',
libraryTarget: 'commonjs2'
},
module: {
loaders: [{ test: /\.json$/, loader: 'json' }]
},
resolveLoader: { root: runnerModules }
}, function (err, stats) {
var error = _bundlerLibGetWebpackErrors2['default']('config', err, stats);
if (error) reject(error);else resolve(_libFns.p(OPTS.internalDir, 'user-config.js'));
});
} catch (e) {
reject(e);
}
}));
}
function setupDirs() {
// base dirs
OPTS.motionDir = _libFns.p(OPTS.appDir, '.motion');
OPTS.modulesDir = _libFns.p(OPTS.motionDir, 'node_modules');
OPTS.internalDir = _libFns.p(OPTS.motionDir, '.internal');
OPTS.template = OPTS.template || '.motion/index.html';
OPTS.buildDir = OPTS.out ? _libFns.p(OPTS.out) : _libFns.p(OPTS.motionDir, 'build');
// deps dirs
OPTS.deps = {};
OPTS.deps.dir = _libFns.p(OPTS.internalDir, 'deps');
OPTS.deps.internalDir = _libFns.p(OPTS.internalDir, 'deps', 'internal');
OPTS.deps.assetsDir = _libFns.p(OPTS.deps.dir, 'assets');
OPTS.deps.internalsIn = _libFns.p(OPTS.deps.dir, 'internals.in.js');
OPTS.deps.internalsOut = _libFns.p(OPTS.deps.dir, 'internals.js');
OPTS.deps.externalsIn = _libFns.p(OPTS.deps.dir, 'externals.in.js');
OPTS.deps.externalsOut = _libFns.p(OPTS.deps.dir, 'externals.js');
OPTS.deps.externalsPaths = _libFns.p(OPTS.deps.dir, 'externals.paths.js');
OPTS.configFile = _libFns.p(OPTS.motionDir, 'config.js');
OPTS.stateFile = _libFns.p(OPTS.internalDir, 'state.json');
OPTS.outDir = _libFns.p(OPTS.internalDir, 'out');
OPTS.styleDir = _libFns.p(OPTS.internalDir, 'styles');
OPTS.styleOutDir = _libFns.p(OPTS.buildDir, '_');
OPTS.styleOutName = 'styles.css';
}
function setupConfig(cli, config) {
// config
OPTS.config = Object.assign({
minify: true,
debug: false,
routing: true
}, config);
// cli overrides config
if (cli.nomin) OPTS.config.minify = false;
if (cli.pretty) OPTS.config.pretty = true;
if (cli.port) OPTS.config.port = cli.port;
if (cli.host) OPTS.config.host = cli.host;
}
function set(key, val) {
_libFns.log.opts('opts.set'.bold.yellow, key, val);
OPTS[key] = val;
return val;
}
function get(key) {
return key ? OPTS[key] : OPTS;
}
function debug() {
print(_util2['default'].inspect(OPTS, false, 10));
}
// this is bit funky, but lets us do:
// opts('dir') => path
// opts.set('dir', 'other')
function opts(name) {
return get(name);
}
opts.set = set;
opts.init = init;
opts.serialize = serialize;
opts.debug = debug;
exports['default'] = opts;