UNPKG

phpjs

Version:

php.js offers community built php functions in javascript

133 lines (115 loc) 3.93 kB
var cli = require('cli').enable('status', 'help', 'version', 'glob', 'timeout'); var fs = require('fs'); var glob = require('glob'); var path = require('path'); var phpjsutil = new require('../lib/phpjsutil'); var equal = require('deep-equal'); var __root = __dirname + '/..'; var PhpjsUtil = phpjsutil({ injectDependencies: ['ini_set', 'ini_get'], equal : equal, debug : cli.debug }); // Environment-specific file opener. function name needs to // be translated to code. The difficulty is in finding the // category. PhpjsUtil.opener = function(name, cb) { glob(__root + '/functions/*/' + name + '.js', {}, function(err, files) { if (err) { return cb(err); } var filepath = files[0]; if (!filepath) { return cb('could not find ' + __root + '/functions/*/' + name + '.js'); } fs.readFile(filepath, 'utf-8', function(err, code) { if (err) { return cb(err); } return cb(null, code); }); }); }; // --debug works out of the box. See -h cli.parse({ action : ['a', 'Test / Build', 'string', 'test'], output : ['o', 'Build output file', 'string', __root + '/build/npm.js'], name : ['n', 'Function name to test', 'path', '*'], category: ['c', 'Category to test', 'path', '*'], abort : ['a', 'Abort on first failure'] }); cli.buildnpm = function(args, options) { var self = this; var globpath = __root + '/functions/' + options.category + '/' + options.name + '.js'; fs.writeFileSync(options.output, '// This file is generated by `make build`. \n'); fs.appendFileSync(options.output, '// Do NOT edit by hand. \n'); fs.appendFileSync(options.output, '// \n'); fs.appendFileSync(options.output, '// Make function changes in ./functions and \n'); fs.appendFileSync(options.output, '// generator changes in ./lib/phpjsutil.js \n'); self.glob(globpath, function (err, params) { var buf = '\n'; buf += 'exports.' + params.func_name + ' = function (' + params.func_arguments.join(', ') + ') {\n'; buf += ' ' + params.body.split('\n').join('\n ').replace(/^ $/g, '') + '\n'; buf += '};\n'; fs.appendFileSync(options.output, buf); }); }; cli.glob = function(globpath, cb) { glob(globpath, {}, function(err, files) { var names = []; for (var i in files) { var file = files[i]; if (file.indexOf('/_') === -1) { names.push(path.basename(file, '.js')); } } names.forEach(function(name) { PhpjsUtil.load(name, function(err, params) { if (err) { return cb(err); } return cb(null, params); }); }); }); }; cli.test = function(args, options) { var self = this; var globpath = __root + '/functions/' + options.category + '/' + options.name + '.js'; process.on('exit', function() { var msg = self.pass_cnt + ' passed / ' + self.fail_cnt + ' failed / ' + self.skip_cnt + ' skipped'; if (self.fail_cnt) { cli.fatal(msg); } else { cli.ok(msg); } }); self.pass_cnt = 0; self.fail_cnt = 0; self.skip_cnt = 0; self.glob(globpath, function(err, params) { if (err) { return cli.fatal(err); } if (params.headKeys.test && params.headKeys.test[0] === 'skip') { self.skip_cnt++; return cli.info('--> ' + params.name + ' skipped as instructed. '); } PhpjsUtil.test(params, function(err, test, params) { if (!err) { self.pass_cnt++; cli.debug('--> ' + params.name + '#' + (+test.number + 1) + ' passed. '); } else { self.fail_cnt++; cli.error('--> ' + params.name + '#' + (+test.number + 1) + ' failed. '); cli.error(err); if (options.abort) { cli.fatal('Aborting on first failure as instructed. '); } } }); }); }; cli.main(function(args, options) { cli[options.action](args, options); });