Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ESM support #569

Merged
merged 1 commit into from
Apr 21, 2022
Merged
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
5 changes: 3 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
const mergeArrayByName = require('./lib/mergeArrayByName')
import mergeArrayByName from './lib/mergeArrayByName'
import SettingsApp from './lib/settings'

/**
* @param {import('probot').Probot} robot
*/
module.exports = (robot, _, Settings = require('./lib/settings')) => {
export default (robot, _, Settings = SettingsApp) => {
async function syncSettings (context, repo = context.repo()) {
const config = await context.config('settings.yml', {}, { arrayMerge: mergeArrayByName })
return Settings.sync(context.octokit, repo, config)
Expand Down
6 changes: 2 additions & 4 deletions lib/mergeArrayByName.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// https://github.com/KyleAMathews/deepmerge#arraymerge

const merge = require('deepmerge')
import merge from 'deepmerge'

function findMatchingIndex (sourceItem, target) {
if (Object.prototype.hasOwnProperty.call(sourceItem, 'name')) {
Expand All @@ -10,7 +10,7 @@ function findMatchingIndex (sourceItem, target) {
}
}

function mergeByName (target, source, options) {
export default function mergeByName (target, source, options) {
const destination = target.slice()

source.forEach(sourceItem => {
Expand All @@ -24,5 +24,3 @@ function mergeByName (target, source, options) {

return destination
}

module.exports = mergeByName
2 changes: 1 addition & 1 deletion lib/plugins/branches.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const previewHeaders = {
'application/vnd.github.hellcat-preview+json,application/vnd.github.luke-cage-preview+json,application/vnd.github.zzzax-preview+json'
}

module.exports = class Branches {
export default class Branches {
constructor (github, repo, settings) {
this.github = github
this.repo = repo
Expand Down
4 changes: 2 additions & 2 deletions lib/plugins/collaborators.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const Diffable = require('./diffable')
import Diffable from './diffable'

module.exports = class Collaborators extends Diffable {
export default class Collaborators extends Diffable {
constructor (...args) {
super(...args)

Expand Down
2 changes: 1 addition & 1 deletion lib/plugins/diffable.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
// remove(existing) {
// }
// }
module.exports = class Diffable {
export default class Diffable {
constructor (github, repo, entries) {
this.github = github
this.repo = repo
Expand Down
4 changes: 2 additions & 2 deletions lib/plugins/labels.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const Diffable = require('./diffable')
import Diffable from './diffable'
const previewHeaders = { accept: 'application/vnd.github.symmetra-preview+json' }

module.exports = class Labels extends Diffable {
export default class Labels extends Diffable {
constructor (...args) {
super(...args)

Expand Down
4 changes: 2 additions & 2 deletions lib/plugins/milestones.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const Diffable = require('./diffable')
import Diffable from './diffable'

module.exports = class Milestones extends Diffable {
export default class Milestones extends Diffable {
constructor (...args) {
super(...args)

Expand Down
2 changes: 1 addition & 1 deletion lib/plugins/repository.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ const enableVulnerabilityAlerts = ({ github, settings, enabled }) => {
return github.repos[methodName](args)
}

module.exports = class Repository {
export default class Repository {
constructor (github, repo, settings) {
this.github = github
this.settings = Object.assign({ mediaType: { previews: ['baptiste'] } }, settings, repo)
Expand Down
4 changes: 2 additions & 2 deletions lib/plugins/teams.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
const Diffable = require('./diffable')
import Diffable from './diffable'

// it is necessary to use this endpoint until GitHub Enterprise supports
// the modern version under /orgs
const teamRepoEndpoint = '/teams/:team_id/repos/:owner/:repo'

module.exports = class Teams extends Diffable {
export default class Teams extends Diffable {
find () {
return this.github.repos.listTeams(this.repo).then(res => res.data)
}
Expand Down
23 changes: 14 additions & 9 deletions lib/settings.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
class Settings {
import Repository from './plugins/repository'
import Labels from './plugins/labels'
import Collaborators from './plugins/collaborators'
import Teams from './plugins/teams'
import Milestones from './plugins/milestones'
import Branches from './plugins/branches'

export default class Settings {
static sync (github, repo, config) {
return new Settings(github, repo, config).update()
}
Expand All @@ -25,12 +32,10 @@ class Settings {
Settings.FILE_NAME = '.github/settings.yml'

Settings.PLUGINS = {
repository: require('./plugins/repository'),
labels: require('./plugins/labels'),
collaborators: require('./plugins/collaborators'),
teams: require('./plugins/teams'),
milestones: require('./plugins/milestones'),
branches: require('./plugins/branches')
repository: Repository,
labels: Labels,
collaborators: Collaborators,
teams: Teams,
milestones: Milestones,
branches: Branches
}

module.exports = Settings
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"version": "1.0.0",
"description": "",
"repository": "github:probot/settings",
"type": "module",
"main": "index.js",
"scripts": {
"dev": "nodemon",
Expand All @@ -13,9 +14,9 @@
"lint:lockfile": "lockfile-lint --path package-lock.json --type npm --validate-https --allowed-hosts npm",
"lint:engines": "check-engine",
"lint:peer": "npm ls >/dev/null",
"test:unit": "jest 'test/unit/'",
"test:unit": "NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 jest 'test/unit/'",
"test:unit:watch": "npm run test:unit -- --watch",
"test:integration": "jest --test-timeout=10000 'test/integration/'",
"test:integration": "NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 jest --test-timeout=10000 'test/integration/'",
"test:integration:debug": "LOG_LEVEL=debug DEBUG=nock.* run-s test:integration"
},
"author": "Brandon Keepers",
Expand Down
File renamed without changes.
12 changes: 6 additions & 6 deletions test/integration/common.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const { Probot } = require('probot')
const nock = require('nock')
const any = require('@travi/any')
const settingsBot = require('../../index')
const settings = require('../../lib/settings')
import { Probot } from 'probot'
import nock from 'nock'
import any from '@travi/any'
import settingsBot from '../../index'
import settings from '../../lib/settings'

nock.disableNetConnect()

Expand Down Expand Up @@ -65,7 +65,7 @@ function buildTriggerEvent () {
return any.fromList([buildPushEvent(), buildRepositoryCreatedEvent(), buildRepositoryEditedEvent()])
}

module.exports = {
export {
loadInstance,
initializeNock,
teardownNock,
Expand Down
13 changes: 6 additions & 7 deletions test/integration/plugins/collaborators.test.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
const path = require('path')
const fs = require('fs')
const { CREATED, NO_CONTENT, OK } = require('http-status-codes')
const settings = require('../../../lib/settings')
const { buildTriggerEvent, initializeNock, loadInstance, repository, teardownNock } = require('../common')
import fs from 'fs'
import { CREATED, NO_CONTENT, OK } from 'http-status-codes'
import Settings from '../../../lib/settings'
import { buildTriggerEvent, initializeNock, loadInstance, repository, teardownNock } from '../common'

describe('collaborators plugin', function () {
let probot, githubScope
Expand All @@ -17,11 +16,11 @@ describe('collaborators plugin', function () {
})

it('syncs collaborators', async () => {
const pathToConfig = path.resolve(__dirname, '..', '..', 'fixtures', 'collaborators-config.yml')
const pathToConfig = new URL('../../fixtures/collaborators-config.yml', import.meta.url)
const configFile = Buffer.from(fs.readFileSync(pathToConfig, 'utf8'))
const config = configFile.toString()
githubScope
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(settings.FILE_NAME)}`)
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(Settings.FILE_NAME)}`)
.reply(OK, config)
githubScope.get(`/repos/${repository.owner.name}/${repository.name}/collaborators?affiliation=direct`).reply(OK, [
{ login: 'travi', permissions: { admin: true } },
Expand Down
13 changes: 6 additions & 7 deletions test/integration/plugins/milestones.test.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
const path = require('path')
const fs = require('fs')
const { CREATED, NO_CONTENT, OK } = require('http-status-codes')
const settings = require('../../../lib/settings')
const { buildTriggerEvent, initializeNock, loadInstance, repository, teardownNock } = require('../common')
import fs from 'fs'
import { CREATED, NO_CONTENT, OK } from 'http-status-codes'
import Settings from '../../../lib/settings'
import { buildTriggerEvent, initializeNock, loadInstance, repository, teardownNock } from '../common'

describe('milestones plugin', function () {
let probot, githubScope
Expand All @@ -17,11 +16,11 @@ describe('milestones plugin', function () {
})

it('syncs milestones', async () => {
const pathToConfig = path.resolve(__dirname, '..', '..', 'fixtures', 'milestones-config.yml')
const pathToConfig = new URL('../../fixtures/milestones-config.yml', import.meta.url)
const configFile = Buffer.from(fs.readFileSync(pathToConfig, 'utf8'))
const config = configFile.toString()
githubScope
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(settings.FILE_NAME)}`)
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(Settings.FILE_NAME)}`)
.reply(OK, config)
githubScope.patch(`/repos/${repository.owner.name}/${repository.name}`).reply(200)
githubScope.get(`/repos/${repository.owner.name}/${repository.name}/milestones?per_page=100&state=all`).reply(OK, [
Expand Down
18 changes: 9 additions & 9 deletions test/integration/plugins/repository.test.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
const path = require('path')
const fs = require('fs')
const settings = require('../../../lib/settings')
const { buildTriggerEvent, initializeNock, loadInstance, repository, teardownNock } = require('../common')
import path from 'path'
import fs from 'fs'
import Settings from '../../../lib/settings'
import { buildTriggerEvent, initializeNock, loadInstance, repository, teardownNock } from '../common'

const loadConfig = configFilename => {
const pathToConfig = path.resolve(__dirname, '..', '..', 'fixtures', 'repository', configFilename)
const pathToConfig = new URL(path.join('../../fixtures/repository', configFilename), import.meta.url)
const configFile = Buffer.from(fs.readFileSync(pathToConfig, 'utf8'))

return configFile.toString()
Expand All @@ -27,7 +27,7 @@ describe('repository plugin', function () {
const repoSettings = Object.assign({}, config.repository)

githubScope
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(settings.FILE_NAME)}`)
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(Settings.FILE_NAME)}`)
.reply(200, config)
githubScope
.patch(`/repos/${repository.owner.name}/${repository.name}`, body => {
Expand All @@ -45,7 +45,7 @@ describe('repository plugin', function () {
const repoSettings = Object.assign({}, config.repository)

githubScope
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(settings.FILE_NAME)}`)
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(Settings.FILE_NAME)}`)
.reply(200, config)
githubScope
.patch(`/repos/${repository.owner.name}/${repository.name}`, body => {
Expand All @@ -71,7 +71,7 @@ describe('repository plugin', function () {
delete repoSettings.enable_vulnerability_alerts

githubScope
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(settings.FILE_NAME)}`)
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(Settings.FILE_NAME)}`)
.reply(200, config)
githubScope
.patch(`/repos/${repository.owner.name}/${repository.name}`, body => {
Expand All @@ -94,7 +94,7 @@ describe('repository plugin', function () {
delete repoSettings.enable_automated_security_fixes

githubScope
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(settings.FILE_NAME)}`)
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(Settings.FILE_NAME)}`)
.reply(200, config)
githubScope
.patch(`/repos/${repository.owner.name}/${repository.name}`, body => {
Expand Down
15 changes: 7 additions & 8 deletions test/integration/plugins/teams.test.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
const path = require('path')
const fs = require('fs')
const { CREATED, NO_CONTENT, OK } = require('http-status-codes')
const any = require('@travi/any')
const settings = require('../../../lib/settings')
const { buildTriggerEvent, initializeNock, loadInstance, repository, teardownNock } = require('../common')
import fs from 'fs'
import { CREATED, NO_CONTENT, OK } from 'http-status-codes'
import any from '@travi/any'
import Settings from '../../../lib/settings'
import { buildTriggerEvent, initializeNock, loadInstance, repository, teardownNock } from '../common'

describe('teams plugin', function () {
let probot, githubScope
Expand All @@ -18,15 +17,15 @@ describe('teams plugin', function () {
})

it('syncs teams', async () => {
const pathToConfig = path.resolve(__dirname, '..', '..', 'fixtures', 'teams-config.yml')
const pathToConfig = new URL('../../fixtures/teams-config.yml', import.meta.url)
const configFile = Buffer.from(fs.readFileSync(pathToConfig, 'utf8'))
const config = configFile.toString()
const probotTeamId = any.integer()
const githubTeamId = any.integer()
const greenkeeperKeeperTeamId = any.integer()
const formationTeamId = any.integer()
githubScope
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(settings.FILE_NAME)}`)
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(Settings.FILE_NAME)}`)
.reply(OK, config)
githubScope.get(`/repos/${repository.owner.name}/${repository.name}/teams`).reply(OK, [
{ slug: 'greenkeeper-keeper', id: greenkeeperKeeperTeamId, permission: 'pull' },
Expand Down
6 changes: 3 additions & 3 deletions test/integration/triggers/push.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const settings = require('../../../lib/settings')
const { initializeNock, loadInstance, repository, teardownNock } = require('../common')
import Settings from '../../../lib/settings'
import { initializeNock, loadInstance, repository, teardownNock } from '../common'

describe('push trigger', function () {
let probot, githubScope
Expand All @@ -19,7 +19,7 @@ describe('push trigger', function () {
payload: {
ref: 'refs/heads/wip',
repository,
commits: [{ modified: [settings.FILE_NAME], added: [] }]
commits: [{ modified: [Settings.FILE_NAME], added: [] }]
}
})
})
Expand Down
10 changes: 5 additions & 5 deletions test/integration/triggers/repository-created.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const { NOT_FOUND } = require('http-status-codes')
const settings = require('../../../lib/settings')
const { buildRepositoryCreatedEvent, initializeNock, loadInstance, repository, teardownNock } = require('../common')
import { NOT_FOUND } from 'http-status-codes'
import Settings from '../../../lib/settings'
import { buildRepositoryCreatedEvent, initializeNock, loadInstance, repository, teardownNock } from '../common'

describe('repository.created trigger', function () {
let probot, githubScope
Expand All @@ -16,13 +16,13 @@ describe('repository.created trigger', function () {

it('does not apply configuration when the repository does not have a settings.yml', async () => {
githubScope
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(settings.FILE_NAME)}`)
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(Settings.FILE_NAME)}`)
.reply(NOT_FOUND, {
message: 'Not Found',
documentation_url: 'https://developer.github.com/v3/repos/contents/#get-contents'
})
githubScope
.get(`/repos/${repository.owner.name}/.github/contents/${encodeURIComponent(settings.FILE_NAME)}`)
.get(`/repos/${repository.owner.name}/.github/contents/${encodeURIComponent(Settings.FILE_NAME)}`)
.reply(NOT_FOUND, {
message: 'Not Found',
documentation_url: 'https://developer.github.com/v3/repos/contents/#get-contents'
Expand Down
12 changes: 6 additions & 6 deletions test/integration/triggers/repository-edited.test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const { NOT_FOUND } = require('http-status-codes')
const any = require('@travi/any')
const settings = require('../../../lib/settings')
const { buildRepositoryEditedEvent, initializeNock, loadInstance, repository, teardownNock } = require('../common')
import { NOT_FOUND } from 'http-status-codes'
import any from '@travi/any'
import Settings from '../../../lib/settings'
import { buildRepositoryEditedEvent, initializeNock, loadInstance, repository, teardownNock } from '../common'

describe('repository.edited trigger', function () {
let probot, githubScope
Expand All @@ -26,13 +26,13 @@ describe('repository.edited trigger', function () {

it('does not apply configuration when the repository does not have a settings.yml', async () => {
githubScope
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(settings.FILE_NAME)}`)
.get(`/repos/${repository.owner.name}/${repository.name}/contents/${encodeURIComponent(Settings.FILE_NAME)}`)
.reply(NOT_FOUND, {
message: 'Not Found',
documentation_url: 'https://developer.github.com/v3/repos/contents/#get-contents'
})
githubScope
.get(`/repos/${repository.owner.name}/.github/contents/${encodeURIComponent(settings.FILE_NAME)}`)
.get(`/repos/${repository.owner.name}/.github/contents/${encodeURIComponent(Settings.FILE_NAME)}`)
.reply(NOT_FOUND, {
message: 'Not Found',
documentation_url: 'https://developer.github.com/v3/repos/contents/#get-contents'
Expand Down
Loading