UNPKG

3.52 kBJavaScriptView Raw
1var check = require('check-types');
2var verify = check.verify;
3var resolve = require('url').resolve;
4var clone = require('clone');
5var wh = require('./webhooks');
6
7var transforms = [
8 metas,
9 links,
10 scopes,
11 installable,
12 configurable,
13 webhooks
14];
15
16module.exports = function (descriptor, options, urls) {
17 verify.object(descriptor.capabilities);
18 verify.webUrl(urls.base);
19 descriptor = clone(descriptor);
20 transforms.forEach(function (transform) {
21 descriptor = transform(descriptor, options, urls);
22 });
23 return descriptor;
24};
25
26module.exports.use = function (transform) {
27 transforms.push(transform);
28};
29
30function metas(descriptor, options, urls) {
31 if (!descriptor.key && options.name) {
32 descriptor.key = options.name;
33 }
34 if (!descriptor.name && options.displayName) {
35 descriptor.name = options.displayName;
36 }
37 if (!descriptor.description && options.description) {
38 descriptor.description = options.description;
39 }
40 if (!descriptor.version && options.version) {
41 descriptor.version = options.version;
42 }
43 var vendor;
44 if ((!descriptor.vendor || !descriptor.vendor.name) && options.author) {
45 vendor = descriptor.vendor = descriptor.vendor || {};
46 if (typeof options.author === 'string') {
47 vendor.name = options.author;
48 } else if (options.author.name) {
49 vendor.name = options.author.name;
50 }
51 }
52 if ((!descriptor.vendor || !descriptor.vendor.url) && options.author && options.author.url) {
53 vendor = descriptor.vendor = descriptor.vendor || {};
54 vendor.url = options.author.url;
55 }
56 return descriptor;
57}
58
59function links(descriptor, options, urls) {
60 var links = descriptor.links = descriptor.links || {};
61 links.self = ensureUrl(links.self, urls.base, urls.descriptor);
62 links.homepage = ensureUrl(links.homepage, urls.base, urls.homepage);
63 return descriptor;
64}
65
66function scopes(descriptor, options, urls) {
67 if (!descriptor.capabilities.hipchatApiConsumer) {
68 descriptor.capabilities.hipchatApiConsumer = {scopes: []};
69 }
70 return descriptor;
71}
72
73function installable(descriptor, options, urls) {
74 var capabilities = descriptor.capabilities;
75 var installable = capabilities.installable = capabilities.installable || {};
76 if (!installable.allowGlobal) {
77 installable.allowGlobal = false;
78 }
79 if (!installable.allowRoom) {
80 installable.allowRoom = false;
81 }
82 installable.callbackUrl = ensureUrl(installable.callbackUrl, urls.base, urls.installable);
83 return descriptor;
84}
85
86function configurable(descriptor, options, urls) {
87 var capabilities = descriptor.capabilities;
88 var configurable = capabilities.configurable;
89 if (configurable) {
90 if (!configurable.url || !check.string(configurable.url)) {
91 delete capabilities.configurable;
92 } else if (!check.webUrl(capabilities.configurable.url)) {
93 configurable.url = buildUrl(urls.base, configurable.url);
94 }
95 }
96 return descriptor;
97}
98
99function webhooks(descriptor, options, urls) {
100 var capabilities = descriptor.capabilities;
101 if (check.array(capabilities.webhook)) {
102 capabilities.webhook = capabilities.webhook.map(function (webhook) {
103 return wh.normalize(webhook, urls.base, urls.webhook);
104 });
105 }
106 return descriptor;
107}
108
109function ensureUrl(value, base, def) {
110 if (!value && def) {
111 value = buildUrl(base, def);
112 } else if (check.string(value) && !check.webUrl(value)) {
113 value = buildUrl(base, value);
114 }
115 return value;
116}
117
118function buildUrl(base, path) {
119 return (base + '/' + path).replace(/([^:])\/{2,3}/g, '$1/');
120}