@invisible/changelog-update
Version:
Ensure updates to your changelog, and push them to Slack seamlessly
97 lines (85 loc) • 2.07 kB
JavaScript
const assert = require('assert')
const got = require('got')
const { stripIndents } = require('common-tags')
const {
includes,
toLower,
trimChars,
} = require('lodash/fp')
const {
lastChangelogUpdate,
} = require('./helpers')
const {
CHANGELOG_FILE,
ICON_EMOJI,
SLACKBOT_NAME,
} = require('./constants')
const postToWebhook = async ({ payload, webhookUrl }) => {
const options = {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(payload),
},
method: 'POST',
body: payload,
}
return got(webhookUrl, options)
}
const normalizeEmoji = str => `:${trimChars(':')(toLower(str))}:`
const postToSlack = async ({
changelogFile = CHANGELOG_FILE,
iconEmoji = ICON_EMOJI,
slackbotName = SLACKBOT_NAME,
webhookUrl,
} = {}) => {
const text = lastChangelogUpdate({ changelogFile })
const payload = JSON.stringify({
icon_emoji: normalizeEmoji(iconEmoji),
text,
username: slackbotName,
})
return postToWebhook({ payload, webhookUrl })
}
const postToDiscord = async ({
changelogFile = CHANGELOG_FILE,
iconEmoji = ICON_EMOJI,
slackbotName = SLACKBOT_NAME,
webhookUrl,
} = {}) => {
const text = lastChangelogUpdate({ changelogFile })
const payload = JSON.stringify({
content: stripIndents`
${normalizeEmoji(iconEmoji)}
${text}
`,
username: slackbotName,
})
return postToWebhook({ payload, webhookUrl })
}
const run = async ({
changelogFile = CHANGELOG_FILE,
iconEmoji = ICON_EMOJI,
slackbotName = SLACKBOT_NAME,
webhookUrl,
}) => {
assert(webhookUrl, 'changelog-update: no webhook url given')
if (includes('slack')(process.env.CHANGELOG_WEBHOOK_URL)) {
return postToSlack({
changelogFile,
iconEmoji,
slackbotName,
webhookUrl,
})
}
if (includes('discord')(process.env.CHANGELOG_WEBHOOK_URL)) {
return postToDiscord({
changelogFile,
iconEmoji,
slackbotName,
webhookUrl,
})
}
}
module.exports = run