Skip to content
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
23 changes: 23 additions & 0 deletions .github/actions/activity/dist/new-issues/index.js

Large diffs are not rendered by default.

23 changes: 23 additions & 0 deletions .github/actions/activity/dist/popular-issues/index.js

Large diffs are not rendered by default.

23 changes: 23 additions & 0 deletions .github/actions/activity/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"private": true,
"license": "MIT",
"scripts": {
"build": "pnpm build:typecheck && pnpm build:popular-issues:ncc && pnpm build:new-issues:ncc",
"build:new-issues:ncc": "ncc build src/new-issues.ts -m -o dist/new-issues",
"build:popular-issues:ncc": "ncc build src/popular-issues.ts -m -o dist/popular-issues",
"build:typecheck": "tsc",
"clean": "rimraf dist"
},
"dependencies": {
"@actions/core": "^1.3.0",
"@actions/github": "^5.0.0",
"@slack/web-api": "^7.10.0"
},
"devDependencies": {
"@octokit/openapi-types": "^26.0.0",
"@octokit/webhooks-types": "^7.5.1",
"@types/node": "^20.16.5",
"@vercel/ncc": "0.38.1",
"typescript": "^4.9.5"
}
}
4,241 changes: 4,241 additions & 0 deletions .github/actions/activity/pnpm-lock.yaml

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions .github/actions/activity/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import { run as newIssuesRun } from './new-issues'
import { run as popularIssuesRun } from './popular-issues'
21 changes: 21 additions & 0 deletions .github/actions/activity/src/lib/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/**
* Format date to <month|short> <day|numeric>, <year|numeric>
*/
export function formattedDate(createdAt: string): string {
const date = new Date(createdAt)

return date.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric',
})
}

/**
* Get days ago in YYYY-MM-DD format
*/
export function daysAgo(days: number): string {
const date = new Date()
date.setDate(date.getDate() - days)
return date.toISOString().split('T')[0]
}
55 changes: 55 additions & 0 deletions .github/actions/activity/src/new-issues.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { info, setFailed } from '@actions/core'
import { getOctokit } from '@actions/github'
import { WebClient } from '@slack/web-api'
import { daysAgo } from './lib/utils'
import { SlimIssue } from './types'

const DAYS_WINDOW = 7
const TRIAGE_LABEL = 'status: needs-triage'

function generateText(issues: SlimIssue[]) {
let text = `*A list of issues opened in the last ${DAYS_WINDOW} with \`status: needs-triage\`:*\n\n`

issues.forEach((issue) => {
text += `• ${issue.title} - (<${issue.html_url}|#${issue.number}>)\n`
})

return text.trim()
}

export async function run() {
try {
if (!process.env.GITHUB_TOKEN) throw new TypeError('GITHUB_TOKEN not set')
if (!process.env.SLACK_TOKEN) throw new TypeError('SLACK_TOKEN not set')

const octoClient = getOctokit(process.env.GITHUB_TOKEN)
const slackClient = new WebClient(process.env.SLACK_TOKEN)

const { data } = await octoClient.rest.search.issuesAndPullRequests({
order: 'desc',
per_page: 15,
q: `repo:payloadcms/payload is:issue is:open label:"${TRIAGE_LABEL}" created:>=${daysAgo(DAYS_WINDOW)}`,
sort: 'created',
})

if (!data.items.length) {
info(`No popular issues`)
return
}

const messageText = generateText(data.items)
console.log(messageText)

await slackClient.chat.postMessage({
text: generateText(data.items),
channel: process.env.DEBUG === 'true' ? '#test-slack-notifications' : '#dev-feed',
icon_emoji: ':github:',
username: 'GitHub Notifier',
})
info(`Posted to Slack!`)
} catch (error) {
setFailed(error as Error)
}
}

run()
64 changes: 64 additions & 0 deletions .github/actions/activity/src/popular-issues.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { info, setFailed } from '@actions/core'
import { getOctokit } from '@actions/github'
import { WebClient } from '@slack/web-api'
import { daysAgo } from './lib/utils'
import { SlimIssue } from './types'

const DAYS_WINDOW = 90

function generateText(issues: SlimIssue[]) {
let text = `*A list of the top 10 issues sorted by the most reactions over the last ${DAYS_WINDOW} days:*\n\n`

// Format date as "X days ago"
const formattedDaysAgo = (dateString: string) => {
const date = new Date(dateString)
const now = new Date()
const diffTime = Math.abs(now.getTime() - date.getTime())
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24))
return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`
}

issues.forEach((issue) => {
text += `• ${issue?.reactions?.total_count || 0} 👍 ${issue.title} - <${issue.html_url}|#${issue.number}>, ${formattedDaysAgo(issue.created_at)}\n`
})

return text.trim()
}

export async function run() {
try {
if (!process.env.GITHUB_TOKEN) throw new TypeError('GITHUB_TOKEN not set')
if (!process.env.SLACK_TOKEN) throw new TypeError('SLACK_TOKEN not set')

const octoClient = getOctokit(process.env.GITHUB_TOKEN)
const slackClient = new WebClient(process.env.SLACK_TOKEN)

const { data } = await octoClient.rest.search.issuesAndPullRequests({
order: 'desc',
per_page: 10,
q: `repo:payloadcms/payload is:issue is:open created:>=${daysAgo(DAYS_WINDOW)}`,
sort: 'reactions',
})

if (!data.items.length) {
info(`No popular issues`)
return
}

const messageText = generateText(data.items)
console.log(messageText)

await slackClient.chat.postMessage({
text: messageText,
channel: process.env.DEBUG === 'true' ? '#test-slack-notifications' : '#dev-feed',
icon_emoji: ':github:',
username: 'GitHub Notifier',
})

info(`Posted to Slack!`)
} catch (error) {
setFailed(error as Error)
}
}

run()
10 changes: 10 additions & 0 deletions .github/actions/activity/src/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { components } from '@octokit/openapi-types'

export type SlimIssue = Pick<
components['schemas']['issue-search-result-item'],
'html_url' | 'number'
> & {
title: string
created_at: string
reactions?: components['schemas']['reaction-rollup']
}
17 changes: 17 additions & 0 deletions .github/actions/activity/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"compilerOptions": {
"target": "esnext",
"noEmit": true,
"strict": true,
"noUnusedLocals": false, // Undo this
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"forceConsistentCasingInFileNames": true,
"downlevelIteration": true,
"skipLibCheck": true,
"moduleResolution": "node",
},
"exclude": [
"src/**/*.test.ts"
]
}
Loading