Permalink
'use strict'; | |
const $ = require('shelljs'); | |
const babel = require('gulp-babel'); | |
const changed = require('gulp-changed'); | |
const eslint = require('gulp-eslint'); | |
const fs = require('fs'); | |
const gulp = require('gulp'); | |
gulp.task('lint', function () { | |
return gulp.src(['src/*.js', './*.js', './bin/*.js']) | |
.pipe(eslint()) | |
.pipe(eslint.format()); | |
}); | |
gulp.task('babel', function () { | |
const bab = babel(); | |
gulp.src('src/**/*.js') | |
.pipe(changed('dist')) | |
.pipe(bab) | |
.pipe(gulp.dest('dist')); | |
return; | |
}); | |
gulp.task('build', function () { | |
const commands = require('./commands.json'); | |
for (let i = 0; i < commands.commands.length; ++i) { | |
const command = commands.commands[i]; | |
const content = `#!/usr/bin/env node\nrequire('./parser')(process.argv, '${command}');\n`; | |
fs.writeFileSync(`./bin/${command}.js`, content); | |
} | |
}); | |
function getJSON(name) { | |
const dir = `./packages/${name}`; | |
let json; | |
try { | |
json = fs.readFileSync(`${dir}/package.json`, {encoding: 'utf8', force: true}); | |
json = JSON.parse(json); | |
} catch (e) { | |
$.cp('-f', `./packages/template.package.json`, `${dir}/package.json`); | |
return getJSON(name); | |
} | |
return json; | |
} | |
function writeJSON(name, json) { | |
const dir = `./packages/${name}`; | |
fs.writeFileSync(`${dir}/package.json`, `${JSON.stringify(json, null, ' ')}\n`); | |
} | |
gulp.task('packages', function () { | |
const commands = require('./commands.json'); | |
let related = ''; | |
related += `- [cash](https://github.com/dthree/cash) - Main project\n`; | |
related += `- [cash-global](https://npmjs.com/package/cash-global) - Globally install all commands\n`; | |
related += `- [vorpal](https://github.com/dthree/vorpal) - Cash is built on Vorpal\n\n`; | |
related += `#### Individual commands\n\n`; | |
for (const name in commands.packages) { | |
if (commands.packages.hasOwnProperty(name)) { | |
related += `- [cash-${name}](https://npmjs.com/package/cash-${name})\n`; | |
} | |
} | |
related = related.replace(/\n$/g, ''); | |
for (const name in commands.packages) { | |
if (commands.packages.hasOwnProperty(name)) { | |
const pkg = commands.packages[name]; | |
const deps = pkg.dependencies; | |
const files = pkg.files; | |
const dir = `./packages/${name}`; | |
$.rm('-rf', `${dir}/dist`); | |
$.mkdir('-p', `${dir}/dist/help`); | |
$.mkdir('-p', `${dir}/dist/lib`); | |
$.mkdir('-p', `${dir}/dist/commands`); | |
$.mkdir('-p', `${dir}/dist/util`); | |
$.mkdir('-p', `${dir}/bin`); | |
const json = getJSON(name); | |
const jsonMain = require('./package.json'); | |
json.dependencies = {}; | |
json.devDependencies = {}; | |
const preparser = `./dist/preparser.js`; | |
const main = `./dist/commands/${name}.js`; | |
const help = `./dist/help/${name}.js`; | |
const bin = `./bin/${name}.js`; | |
$.cp('-f', main, `${dir}/${main}`); | |
$.cp('-f', bin, `${dir}/${bin}`); | |
$.cp('-f', help, `${dir}/${help}`); | |
$.cp('-f', preparser, `${dir}/${preparser}`); | |
$.cp('-f', './bin/parser.js', `${dir}/bin/parser.js`); | |
$.cp('-f', `./packages/template.README.md`, `${dir}/README.md`); | |
let readme = String($.cat(`${dir}/README.md`)); | |
readme = readme.replace(/\{package\-name\}/g, `cash-${name}`); | |
readme = readme.replace(/\{command\-name\}/g, `${name}`); | |
readme = readme.replace(/\{related\}/g, related); | |
readme.to(`${dir}/README.md`); | |
for (let i = 0; i < files.length; ++i) { | |
$.cp('-f', files[i], `${dir}/${files[i]}`); | |
} | |
for (let i = 0; i < deps.length; ++i) { | |
json.dependencies[deps[i]] = jsonMain.dependencies[deps[i]]; | |
if (json.dependencies[deps[i]] === undefined) { | |
throw new Error(`Sub-module dependency for "${name}" does not exist in the main package.json file.`); | |
} | |
} | |
json.files = ['dist', 'bin']; | |
json.dependencies.vorpal = jsonMain.dependencies.vorpal; | |
json.name = `cash-${name}`; | |
json.description = `Cross-platform implementation of the Unix '${name}' command.`; | |
json.main = main; | |
json.bin = json.bin || {}; | |
json.bin[name] = bin; | |
writeJSON(name, json); | |
} | |
} | |
if ($.test('-e', './../cash-global/commands.json')) { | |
$.cp('./commands.json', './../cash-global/commands.json'); | |
} | |
}); | |
gulp.task('watch', function () { | |
gulp.watch('src/**/*.js', ['babel', 'build', 'packages']); | |
gulp.watch('commands.json', ['babel', 'build', 'packages']); | |
gulp.watch('test/**/*.js', ['babel', 'build', 'packages']); | |
}); | |
gulp.task('default', ['babel', 'watch', 'build', 'packages']); | |
gulp.task('builder', ['babel', 'build', 'packages']); |