raptor-dev
Version:
Developer tools for RaptorJS
176 lines (141 loc) • 5.84 kB
JavaScript
;
require('raptor-polyfill');
var walk = require('../lib/walk');
var nodePath = require('path');
var fs = require('fs');
var packageTransformer = require('../lib/package-transformer');
function readJsonFile(path) {
var json = fs.readFileSync(path, {encoding: 'utf8'});
return JSON.parse(json);
}
function writeJsonFile(path, pkg) {
var json = JSON.stringify(pkg, null, 4);
fs.writeFileSync(path, json, {encoding: 'utf8'});
}
function isEmpty(o) {
for (var k in o) {
if (o.hasOwnProperty(k)) {
return false;
}
}
return true;
}
module.exports = {
usage: 'Usage: $0 $commandName [dir]',
options: {
'preserve-orig': {
description: 'Do not modify or delete the original package.json',
type: 'boolean',
default: false
},
'root-dir': {
description: 'The root directory to resolve "absolute" paths relative to',
type: 'string'
},
'project-root-dir': {
description: 'The root directory for the project',
type: 'string'
}
},
validate: function(args, rapido) {
args.files = args._;
if (!args.files || !args.files.length) {
throw 'one or more files is required';
}
var rootDir = args['root-dir'];
if (rootDir) {
rootDir = nodePath.resolve(process.cwd(), rootDir);
} else {
rootDir = process.cwd();
}
var projectRootDir = args['project-root-dir'];
if (projectRootDir) {
projectRootDir = nodePath.resolve(process.cwd(), projectRootDir);
}
args.rootDir = rootDir;
args.projectRootDir = projectRootDir;
return args;
},
run: function(args, config, rapido) {
var files = args.files;
var rootDir = args.rootDir;
var projectRootDir = args.projectRootDir;
// console.log(JSON.stringify(args, null, ' '));
walk(
files,
{
file: function(file) {
var basename = nodePath.basename(file);
var dirname = nodePath.dirname(file);
if (basename !== 'package.json' &&
!basename.endsWith('-package.json') &&
basename !== 'optimizer.json' &&
!basename.endsWith('-optimizer.json')) {
return;
}
var pkg;
try {
pkg = readJsonFile(file);
}
catch(e) {
rapido.log.error('WARN', 'Unable to parse JSON file at path "' + file + '". Skipping!');
return;
}
var isOptimizerManifest = pkg.raptor ||
pkg['raptor-optimizer'] ||
Array.isArray(pkg.dependencies) ||
Array.isArray(pkg.includes) ||
pkg.extensions;
if (isOptimizerManifest) {
rapido.log.info('Migrating "' + file + '"...');
var transformedPkg = packageTransformer.transform(pkg, file, rootDir, projectRootDir);
var outputName;
if (basename.endsWith('-package.json')) {
outputName = basename.slice(0, 0-'-package.json'.length) + '-optimizer.json';
}
else if (basename === 'package.json') {
outputName = 'optimizer.json';
}
else {
outputName = basename;
}
var outputFile = nodePath.join(dirname, outputName);
var alreadyExists = fs.existsSync(outputFile);
writeJsonFile(outputFile, transformedPkg);
if (alreadyExists) {
rapido.log.info('updated', outputFile);
}
else {
rapido.log.info('added', outputFile);
}
if ((args['preserve-orig'] === false) && (outputFile !== file)) {
delete pkg.raptor;
delete pkg['raptor-optimizer'];
if (Array.isArray(pkg.dependencies)) {
delete pkg.dependencies;
}
delete pkg.extensions;
if (pkg.type === 'raptor-module' || pkg.type === 'module') {
pkg = {}; // Delete all of the metadata... not actually a Node.js module
}
if (isEmpty(pkg)) {
rapido.log.info('deleted', file);
fs.unlinkSync(file);
}
else {
rapido.log.info('updated', file);
writeJsonFile(file, pkg);
}
}
}
}
},
function(err) {
if (err) {
console.error('Error while migrating to optimizer.json: ' + (err.stack || err));
return;
}
console.log('All package.json migrated to optimizer.json');
});
}
};