@enplug/scripts
Version:
Enplug scripts
130 lines (108 loc) • 4.81 kB
JavaScript
const sh = require('shelljs');
const commandLineArgs = require('command-line-args');
const path = require('path');
const chalk = require('chalk');
const promptForBucket = require('./functions/promptForBucket');
const promptForTarget = require('./functions/promptForTarget');
const confirmDestination = require('./functions/confirmDestination');
const loadDevPrivateFile = require('./functions/loadDevPrivateFile');
const updateUrlsToStaging = require('./functions/updateUrlsToStaging');
const extractResourcesAndReplaceUrls = require('./functions/extractResourcesAndReplaceUrls');
const initOfflineConfig = require('./functions/initOfflineConfig');
const checkScriptsUpToDate = require('./functions/checkScriptsUpToDate');
const releaseLegacy = require('./functions/releaseLegacy');
const rootPath = __dirname.split('node_modules')[0];
const packagePath = path.join(rootPath, 'package.json');
const pkg = require(packagePath);
const buckets = (pkg && pkg.config && pkg.config.aws && pkg.config.aws.buckets) ||
['dev-apps.enplug.in', 'apps.enplug.in', 'apps.enplug.com'];
const optionDefinitions = [
{ name: 'build-for-release', alias: 'r', type: Boolean },
{ name: 'dev-server', alias: 's', type: Boolean },
{ name: 'dev', alias: 'd', type: Boolean },
{ name: 'target', alias: 't', type: String },
{ name: 'targets', type: String, multiple: true},
{ name: 'version', alias: 'v', type: String }
];
const options = commandLineArgs(optionDefinitions);
const version = options.dev ? pkg.version_dev : pkg.version;
const destination = options.dev ? `${pkg.config.destination}/dev` : pkg.config.destination;
let target = options['target']; // app or dashboard
let targets = options.targets ? options.targets : ['app', 'dashboard'];
let bucket = ''; // s3 bucket apps.enplug.in or apps.enplug.com
/**
* Copies offline support service woker over to the application.
*/
function copyOfflineSupportWorker() {
return new Promise((resolve) => {
try {
const commonStaticResources = [
'.',
'./index.html',
'./enplug-offline-worker.js'
];
let indexFilePath = path.join(rootPath, 'dist/app/index.html');
let configPath = path.join(rootPath, 'offline.config.json');
let srcFilePath = path.join(__dirname, './templates/enplug-offline-worker.js');
let destFilePath = path.join(rootPath, 'dist/app/enplug-offline-worker.js');
let offlineConfig = initOfflineConfig(require(configPath), pkg, commonStaticResources);
extractResourcesAndReplaceUrls(offlineConfig, pkg, indexFilePath, srcFilePath, [destFilePath])
.then(resolve);
} catch (e) {
console.warn(`Unable to copy offline support service worker. Please check whether ${chalk.default.cyan('offline.config.json')} exists.`);
resolve();
}
});
}
function runBuild() {
const needsDevServer = options['dev-server'];
let command = '';
if (needsDevServer) {
const devCert = loadDevPrivateFile(rootPath);
// webpack server + selected target + dev config
command = `webpack-dev-server --https --config webpack.config.${target}.dev.js --watch --colors --inline --progress --host localhost.enplug.in --cert "${devCert.cert}" --key "${devCert.key}"`;
} else {
command = 'rimraf dist/' + target + // clean previous build
' && rimraf tmp ' + // clean tmp
// webpack build + selected target + prod config
' && webpack --https --config webpack.config.' + target + '.prod.js --bail --progress --profile';
}
sh.exec(command, function () {
const fixOfflineSupportWorker = target === 'app'
? copyOfflineSupportWorker()
: Promise.resolve();
const fixUrlsToStaging = target === 'app' && bucket.endsWith('enplug.in')
? () => updateUrlsToStaging(rootPath, 'dist/app', false)
: () => Promise.resolve([]);
fixOfflineSupportWorker
.then(fixUrlsToStaging)
.then(() => {
if (!options['build-for-release']) { return; }
let prefix = `${destination}/${target}/${version}`;
confirmDestination(bucket, prefix).then(function (response) {
if (response.confirm) {
return releaseLegacy(pkg, bucket, prefix, target);
}
});
});
});
}
checkScriptsUpToDate(pkg)
.then(() => {
if (options['build-for-release']) {
promptForBucket(bucket, buckets)
.then(selectedBucket => bucket = selectedBucket)
.then(() => promptForTarget(target, targets))
.then(selectedTarget => target = selectedTarget)
.then(runBuild);
} else {
promptForTarget(target, targets)
.then(selectedTarget => target = selectedTarget)
.then(runBuild);
}
})
.catch((err) => {
console.error('BUILD ERROR:')
console.error(`${err}`);
})