ac-node-hipchat
Version:
A common module plugin for building Atlassian Connect add-ons for HipChat
226 lines (203 loc) • 6.46 kB
JavaScript
var check = require('check-types');
var verify = check.verify;
var resolve = require('url').resolve;
var clone = require('clone');
var wh = require('./webhooks');
var COMMAND_REGEXP = /^\/[a-z_-]+$/;
var transforms = [
metas,
links,
scopes,
installable,
configurable,
webhooks,
commands,
glances,
webPanels,
actions,
dialogs,
externalPages
];
module.exports = function (descriptor, options, urls) {
verify.object(descriptor.capabilities);
verify.webUrl(urls.base);
descriptor = clone(descriptor);
transforms.forEach(function (transform) {
descriptor = transform(descriptor, options, urls);
});
return descriptor;
};
module.exports.use = function (transform) {
transforms.push(transform);
};
function metas(descriptor, options, urls) {
if (!descriptor.key && options.name) {
descriptor.key = options.name;
}
if (!descriptor.name && options.displayName) {
descriptor.name = options.displayName;
}
if (!descriptor.description && options.description) {
descriptor.description = options.description;
}
if (!descriptor.version && options.version) {
descriptor.version = options.version;
}
var vendor;
if ((!descriptor.vendor || !descriptor.vendor.name) && options.author) {
vendor = descriptor.vendor = descriptor.vendor || {};
if (typeof options.author === 'string') {
vendor.name = options.author;
} else if (options.author.name) {
vendor.name = options.author.name;
}
}
if ((!descriptor.vendor || !descriptor.vendor.url) && options.author && options.author.url) {
vendor = descriptor.vendor = descriptor.vendor || {};
vendor.url = options.author.url;
}
return descriptor;
}
function links(descriptor, options, urls) {
var links = descriptor.links = descriptor.links || {};
links.self = ensureUrl(links.self, urls.base, urls.descriptor);
links.homepage = ensureUrl(links.homepage, urls.base, urls.homepage);
return descriptor;
}
function scopes(descriptor, options, urls) {
if (!descriptor.capabilities.hipchatApiConsumer) {
descriptor.capabilities.hipchatApiConsumer = {scopes: []};
}
return descriptor;
}
function installable(descriptor, options, urls) {
var capabilities = descriptor.capabilities;
var installable = capabilities.installable = capabilities.installable || {};
if (!installable.allowGlobal) {
installable.allowGlobal = false;
}
if (!installable.allowRoom) {
installable.allowRoom = false;
}
installable.callbackUrl = ensureUrl(installable.callbackUrl, urls.base, urls.installable);
return descriptor;
}
function configurable(descriptor, options, urls) {
var capabilities = descriptor.capabilities;
var configurable = capabilities.configurable;
if (configurable) {
if (!configurable.url || !check.string(configurable.url)) {
delete capabilities.configurable;
} else if (!check.webUrl(capabilities.configurable.url)) {
configurable.url = buildUrl(urls.base, configurable.url);
}
}
return descriptor;
}
function webhooks(descriptor, options, urls) {
var capabilities = descriptor.capabilities;
if (check.array(capabilities.webhook)) {
capabilities.webhook = capabilities.webhook.map(function (webhook) {
return wh.normalize(webhook, urls.base, urls.webhook);
});
}
return descriptor;
}
function commands(descriptor, options) {
var commands = options.command;
if (commands){
if (!check.array(commands)){
commands = [commands];
}
var capabilities = descriptor.capabilities;
capabilities.command = commands.map(function (command) {
check.map(command, {
name: verify.unemptyString,
description: verify.unemptyString,
usage: verify.maybe.string,
aliases: verify.maybe.array
});
if (!COMMAND_REGEXP.test(command.name)){
throw new Error('Command name format is wrong: ' + command.name);
}
if (command.aliases){
for (var key in command.aliases) {
var alias = command.aliases[key];
if (!COMMAND_REGEXP.test(alias)) {
throw new Error('Command alias format is wrong: ' + alias);
}
}
}
return {
name: command.name,
usage: command.usage,
description: command.description,
aliases: command.aliases
}
});
}
return descriptor;
}
function glances(descriptor, options, urls) {
var capabilities = descriptor.capabilities;
if (check.array(capabilities.glance)) {
capabilities.glance = capabilities.glance.map(function (glance) {
glance.queryUrl = buildUrl(urls.base, glance.queryUrl);
glance.icon["url"] = buildUrl(urls.base, glance.icon["url"]);
glance.icon["url@2x"] = buildUrl(urls.base, glance.icon["url@2x"]);
return glance;
})
}
return descriptor;
}
function webPanels(descriptor, options, urls) {
var capabilities = descriptor.capabilities;
if (check.array(capabilities.webPanel)) {
capabilities.webPanel = capabilities.webPanel.map(function (webPanel) {
webPanel.url = buildUrl(urls.base, webPanel.url);
return webPanel;
})
}
return descriptor;
}
function actions(descriptor, options, urls) {
var capabilities = descriptor.capabilities;
if (check.array(capabilities.action)) {
capabilities.action = capabilities.action.map(function (action) {
action.url = buildUrl(urls.base, action.url);
return action;
})
}
return descriptor;
}
function dialogs(descriptor, options, urls) {
var capabilities = descriptor.capabilities;
if (check.array(capabilities.dialog)) {
capabilities.dialog = capabilities.dialog.map(function (dialog) {
dialog.url = buildUrl(urls.base, dialog.url);
return dialog;
})
}
return descriptor;
}
function externalPages(descriptor, options, urls) {
var capabilities = descriptor.capabilities;
if (check.array(capabilities.externalPage)) {
capabilities.externalPage = capabilities.externalPage.map(function (externalPage) {
externalPage.url = buildUrl(urls.base, externalPage.url);
return externalPage;
})
}
return descriptor;
}
function ensureUrl(value, base, def) {
if (!value && def) {
value = buildUrl(base, def);
} else if (check.string(value) && !check.webUrl(value)) {
value = buildUrl(base, value);
}
return value;
}
function buildUrl(base, path) {
return (base + '/' + path).replace(/([^:])\/{2,3}/g, '$1/');
}