Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@
"async": "^3.1.0",
"chalk": "^5.6.2",
"didyoumean": "^1.2.1",
"eta": "^4.5.0",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Praise] TIL that eta is the recommended replacement for _.template. Cool! https://www.npmjs.com/package/lodash.template

"inquirer": "^7.3.3",
"json-fixer": "^1.6.8",
"lodash": "^4.11.2",
"node-fetch": "^2.6.0",
"pify": "^5.0.0",
"yargs": "^18.0.0"
Expand Down
29 changes: 19 additions & 10 deletions src/contributors/add.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
const _ = require('lodash/fp')

function uniqueTypes(contribution) {
return contribution.type || contribution
}

function formatContributions(options, existing = [], types) {
const same = _.intersectionBy(uniqueTypes, existing, types)
const same = types.filter(type =>
existing.some(
existingType => uniqueTypes(existingType) === uniqueTypes(type),
),
)
const remove = types.length < existing.length && same.length

if (options.url) {
Expand All @@ -20,17 +22,23 @@ function formatContributions(options, existing = [], types) {
return same
}

return _.uniqBy(uniqueTypes, existing.concat(types))
const combined = existing.concat(types)
return combined.filter(
(item, index, arr) =>
index ===
arr.findIndex(other => uniqueTypes(other) === uniqueTypes(item)),
)
}

function updateContributor(options, contributor, contributions) {
return _.assign(contributor, {
return {
...contributor,
contributions: formatContributions(
options,
contributor.contributions,
contributions,
),
})
}
}

function updateExistingContributor(options, username, contributions) {
Expand All @@ -48,9 +56,10 @@ function updateExistingContributor(options, username, contributions) {
function addNewContributor(options, username, contributions, infoFetcher) {
return infoFetcher(username, options.repoType, options.repoHost).then(
userData => {
const contributor = _.assign(userData, {
const contributor = {
...userData,
contributions: formatContributions(options, [], contributions),
})
}
return options.contributors.concat(contributor)
},
)
Expand All @@ -63,12 +72,12 @@ module.exports = function addContributor(
infoFetcher,
) {
// case insensitive find
const exists = _.find(contributor => {
const exists = options.contributors.find(contributor => {
return (
contributor.login &&
contributor.login.toLowerCase() === username.toLowerCase()
)
}, options.contributors)
})

if (exists) {
return Promise.resolve(
Expand Down
3 changes: 1 addition & 2 deletions src/contributors/index.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
const _ = require('lodash/fp')
const util = require('../util')
const repo = require('../repo')
const add = require('./add')
const prompt = require('./prompt')

function isNewContributor(contributorList, username) {
return !_.find({login: username}, contributorList)
return !contributorList.find(contributor => contributor.login === username)
}

module.exports = function addContributor(options, username, contributions) {
Expand Down
42 changes: 21 additions & 21 deletions src/contributors/prompt.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
const _ = require('lodash/fp')
const inquirer = require('inquirer')
const util = require('../util')
const repo = require('../repo')

const contributionChoices = _.flow(
util.contributionTypes,
_.toPairs,
_.sortBy(pair => {
return pair[1].description
}),
_.map(pair => {
return {
name: `${pair[1].symbol} ${pair[1].description}`,
value: pair[0],
}
}),
)
function contributionChoices(options) {
const types = util.contributionTypes(options)
const pairs = Object.entries(types)
const sorted = pairs.sort((a, b) =>
a[1].description.localeCompare(b[1].description),
)
return sorted.map(pair => ({
name: `${pair[1].symbol} ${pair[1].description}`,
value: pair[0],
}))
}

function getQuestions(options, username, contributions) {
return [
Expand Down Expand Up @@ -68,7 +65,10 @@ function getQuestions(options, username, contributions) {

if (!input.length) {
return 'Use space to select at least one contribution type.'
} else if (_.isEqual(input, previousContributions)) {
} else if (
JSON.stringify(input.sort()) ===
JSON.stringify(previousContributions.sort())
) {
return 'Nothing changed, use space to select contribution types.'
}
return true
Expand All @@ -81,15 +81,15 @@ function getValidUserContributions(options, contributions) {
const validContributionTypes = util.contributionTypes(options)
const userContributions = contributions && contributions.split(',')

const validUserContributions = _.filter(
const validUserContributions = userContributions.filter(
userContribution => validContributionTypes[userContribution] !== undefined,
)(userContributions)
)

const invalidUserContributions = _.filter(
const invalidUserContributions = userContributions.filter(
userContribution => validContributionTypes[userContribution] === undefined,
)(userContributions)
)

if (_.isEmpty(validUserContributions)) {
if (validUserContributions.length === 0) {
throw new Error(
`${invalidUserContributions.toString()} is/are invalid contribution type(s)`,
)
Expand All @@ -106,5 +106,5 @@ module.exports = function prompt(options, username, contributions) {
: getValidUserContributions(options, contributions),
}
const questions = getQuestions(options, username, contributions)
return inquirer.prompt(questions).then(_.assign(defaults))
return inquirer.prompt(questions).then(answers => ({...defaults, ...answers}))
}
11 changes: 4 additions & 7 deletions src/generate/__tests__/format-badge.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import _ from 'lodash/fp'
import formatBadge from '../format-badge'

test('return badge with the number of contributors', () => {
Expand All @@ -8,19 +7,17 @@ test('return badge with the number of contributors', () => {
const expected16 =
'[![All Contributors](https://img.shields.io/badge/all_contributors-16-orange.svg?style=flat-square)](#contributors-)'

expect(formatBadge(options, _.times(_.constant({}), 8))).toBe(expected8)
expect(formatBadge(options, _.times(_.constant({}), 16))).toBe(expected16)
expect(formatBadge(options, Array(8).fill({}))).toBe(expected8)
expect(formatBadge(options, Array(16).fill({}))).toBe(expected16)
})

test('be able to specify custom badge template', () => {
const options = {
badgeTemplate: 'We have <%= contributors.length %> contributors',
}

expect(formatBadge(options, _.times(_.constant({}), 8))).toBe(
'We have 8 contributors',
)
expect(formatBadge(options, _.times(_.constant({}), 16))).toBe(
expect(formatBadge(options, Array(8).fill({}))).toBe('We have 8 contributors')
expect(formatBadge(options, Array(16).fill({}))).toBe(
'We have 16 contributors',
)
})
11 changes: 6 additions & 5 deletions src/generate/__tests__/format-contributor.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import _ from 'lodash/fp'
import formatContributor from '../format-contributor'
import contributors from './fixtures/contributors.json'

Expand All @@ -14,9 +13,10 @@ function fixtures() {
}

test('format a simple contributor', () => {
const contributor = _.assign(contributors.kentcdodds, {
const contributor = {
...contributors.kentcdodds,
contributions: ['review'],
})
}
const {options} = fixtures()

const expected =
Expand Down Expand Up @@ -46,9 +46,10 @@ test('format contributor using custom template', () => {
})

test('default image size to 100', () => {
const contributor = _.assign(contributors.kentcdodds, {
const contributor = {
...contributors.kentcdodds,
contributions: ['review'],
})
}
const {options} = fixtures()
delete options.imageSize

Expand Down
4 changes: 2 additions & 2 deletions src/generate/format-badge.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
const _ = require('lodash/fp')
const util = require('../util')

const defaultTemplate =
'[![All Contributors](https://img.shields.io/badge/all_contributors-<%= contributors.length %>-orange.svg?style=flat-square)](#contributors-)'

module.exports = function formatBadge(options, contributors) {
return _.template(options.badgeTemplate || defaultTemplate)({
return util.template(options.badgeTemplate || defaultTemplate)({
contributors,
})
}
10 changes: 4 additions & 6 deletions src/generate/format-contribution-type.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
const _ = require('lodash/fp')

const util = require('../util')

const linkTemplate = _.template(
const linkTemplate = util.template(
'<a href="<%= url %>" title="<%= description %>"><%= symbol %></a>',
)

Expand All @@ -28,7 +26,7 @@ module.exports = function formatContribution(

const templateData = {
symbol: type.symbol,
description: type.description,
description: type.description || '',
contributor,
options,
}
Expand All @@ -38,10 +36,10 @@ module.exports = function formatContribution(
if (contribution.url) {
url = contribution.url
} else if (type.link) {
url = _.template(type.link)(templateData)
url = util.template(type.link)(templateData)
}

return linkTemplate(_.assign({url}, templateData))
return linkTemplate({url, ...templateData})
}

function getUrl(contribution, contributor) {
Expand Down
40 changes: 19 additions & 21 deletions src/generate/format-contributor.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
const _ = require('lodash/fp')
const util = require('../util')
const formatContributionType = require('./format-contribution-type')

const avatarTemplate = _.template(
const avatarTemplate = util.template(
'<img src="<%= contributor.avatar_url %>?s=<%= options.imageSize %>" width="<%= options.imageSize %>px;" alt="<%= name %>"/>',
)
const avatarBlockTemplate = _.template(
const avatarBlockTemplate = util.template(
'<a href="<%= contributor.profile %>"><%= avatar %><br /><sub><b><%= name %></b></sub></a>',
)
const avatarBlockTemplateNoProfile = _.template(
const avatarBlockTemplateNoProfile = util.template(
'<%= avatar %><br /><sub><b><%= name %></b></sub>',
)
const contributorTemplate = _.template(
const contributorTemplate = util.template(
'<%= avatarBlock %><br /><%= contributions %>',
)

Expand All @@ -20,18 +20,15 @@ function defaultTemplate(templateData) {
const rawName =
templateData.contributor.name || templateData.contributor.login
const name = escapeName(rawName)
const avatar = avatarTemplate(
_.assign(templateData, {
name,
}),
)
const avatarBlockTemplateData = _.assign(
{
name,
avatar,
},
templateData,
)
const avatar = avatarTemplate({
...templateData,
name,
})
const avatarBlockTemplateData = {
name,
avatar,
...templateData,
}
let avatarBlock = null

if (templateData.contributor.profile) {
Expand All @@ -40,7 +37,7 @@ function defaultTemplate(templateData) {
avatarBlock = avatarBlockTemplateNoProfile(avatarBlockTemplateData)
}

return contributorTemplate(_.assign({avatarBlock}, templateData))
return contributorTemplate({avatarBlock, ...templateData})
}

function escapeName(name) {
Expand All @@ -50,14 +47,15 @@ function escapeName(name) {
}

module.exports = function formatContributor(options, contributor) {
const formatter = _.partial(formatContributionType, [options, contributor])
const formatter = contribution =>
formatContributionType(options, contributor, contribution)
const contributions = contributor.contributions.map(formatter).join(' ')
const templateData = {
contributions,
contributor,
options: _.assign({imageSize: defaultImageSize}, options),
options: {imageSize: defaultImageSize, ...options},
}
const customTemplate =
options.contributorTemplate && _.template(options.contributorTemplate)
options.contributorTemplate && util.template(options.contributorTemplate)
return (customTemplate || defaultTemplate)(templateData)
}
Loading