1 | var check = require('check-types');
|
2 | var verify = check.verify;
|
3 | var resolve = require('url').resolve;
|
4 | var clone = require('clone');
|
5 | var wh = require('./webhooks');
|
6 |
|
7 | var transforms = [
|
8 | metas,
|
9 | links,
|
10 | scopes,
|
11 | installable,
|
12 | configurable,
|
13 | webhooks
|
14 | ];
|
15 |
|
16 | module.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 |
|
26 | module.exports.use = function (transform) {
|
27 | transforms.push(transform);
|
28 | };
|
29 |
|
30 | function 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 |
|
59 | function 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 |
|
66 | function scopes(descriptor, options, urls) {
|
67 | if (!descriptor.capabilities.hipchatApiConsumer) {
|
68 | descriptor.capabilities.hipchatApiConsumer = {scopes: []};
|
69 | }
|
70 | return descriptor;
|
71 | }
|
72 |
|
73 | function 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 |
|
86 | function 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 |
|
99 | function 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 |
|
109 | function 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 |
|
118 | function buildUrl(base, path) {
|
119 | return (base + '/' + path).replace(/([^:])\/{2,3}/g, '$1/');
|
120 | }
|