zapier-platform-cli
Version:
The CLI for apps in the Zapier Developer Platform.
137 lines (120 loc) • 4.64 kB
JavaScript
;
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var _ = require('lodash');
var colors = require('colors');
var path = require('path');
var _require = require('../constants'),
PLATFORM_PACKAGE = _require.PLATFORM_PACKAGE;
var _require2 = require('./display'),
prettyJSONstringify = _require2.prettyJSONstringify;
var _require3 = require('./promisify'),
promisify = _require3.promisify;
var nodeWatch = function nodeWatch() {
return require('node-watch').apply(undefined, arguments);
};
var makeTunnelUrl = function makeTunnelUrl() {
return promisify(require('ngrok').connect).apply(undefined, arguments);
};
var getLocalAppHandler = function getLocalAppHandler() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref$reload = _ref.reload,
reload = _ref$reload === undefined ? false : _ref$reload,
_ref$baseEvent = _ref.baseEvent,
baseEvent = _ref$baseEvent === undefined ? {} : _ref$baseEvent;
var entryPath = process.cwd() + '/index';
var rootPath = path.dirname(require.resolve(entryPath));
if (reload) {
Object.keys(require.cache).map(function (cachePath) {
if (cachePath.startsWith(rootPath)) {
delete require.cache[cachePath];
}
});
}
var appRaw = void 0,
zapier = void 0;
try {
appRaw = require(entryPath);
zapier = require(rootPath + '/node_modules/' + PLATFORM_PACKAGE);
} catch (err) {
// this err.stack doesn't give a nice traceback at all :-(
// maybe we could do require('syntax-error') in the future
return function (event, ctx, callback) {
return callback(err);
};
}
var handler = zapier.createAppHandler(appRaw);
return function (event, ctx, callback) {
event = _.merge({}, event, {
calledFromCli: true
}, baseEvent);
handler(event, _, callback);
};
};
// Runs a local app command (./index.js) like {command: 'validate'};
var localAppCommand = function localAppCommand(event) {
var handler = getLocalAppHandler();
return new Promise(function (resolve, reject) {
handler(event, {}, function (err, resp) {
if (err) {
reject(err);
} else {
resolve(resp.results);
}
});
});
};
// translate a JS Error into what would be returned from lambda
var createAWSError = function createAWSError(error) {
var stackTrace = error.stack.split(/\n\s+at\s/).slice(1);
return {
errorMessage: error.message,
errorType: error.name,
stackTrace: stackTrace
};
};
// Stands up a local tunnel server for app commands.
var localAppTunnelServer = function localAppTunnelServer(options) {
var jayson = require('jayson');
var server = jayson.server({
test: function test(args, callback) {
callback(null, { 'results': 'Success!' });
},
invoke: function invoke(args, callback) {
var _args = _slicedToArray(args, 1),
event = _args[0];
options.log();
options.log(colors.green('==Method'));
options.log(event.method);
options.log(colors.green('==Bundle'));
options.log(prettyJSONstringify(event.bundle));
options.handler(event, {}, function (err, resp) {
if (err) {
options.log(colors.red(colors.bold('==Error')));
options.log(err.stack);
options.log();
} else {
options.log(colors.red(colors.bold('==Results')));
options.log(prettyJSONstringify(resp.results));
options.log();
}
if (err) {
// match how AWS returns its errors
var awsError = createAWSError(err);
callback(null, awsError);
} else {
callback(err, resp);
}
});
}
});
server.httpServer = server.http();
server.httpServer.listen(options.port);
return server;
};
module.exports = {
getLocalAppHandler: getLocalAppHandler,
localAppCommand: localAppCommand,
localAppTunnelServer: localAppTunnelServer,
makeTunnelUrl: makeTunnelUrl,
nodeWatch: nodeWatch
};