detect-pr-changes.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #!/usr/bin/env bun
  2. import { appendFile } from 'node:fs/promises'
  3. export type ChangeFlags = {
  4. 'has-evals': boolean
  5. 'has-docs': boolean
  6. 'has-workflows': boolean
  7. }
  8. export function parseChangedPaths(input: string): string[] {
  9. return input.split('\0').filter((path) => path.length > 0)
  10. }
  11. export function classifyChangedPaths(paths: readonly string[]): ChangeFlags {
  12. return {
  13. 'has-evals': paths.some((path) => path.startsWith('evals/')),
  14. 'has-docs': paths.some((path) => path.startsWith('docs/')),
  15. 'has-workflows': paths.some((path) => path.startsWith('.github/workflows/')),
  16. }
  17. }
  18. export function formatGitHubOutput(flags: ChangeFlags): string {
  19. return [
  20. `has-evals=${flags['has-evals']}`,
  21. `has-docs=${flags['has-docs']}`,
  22. `has-workflows=${flags['has-workflows']}`,
  23. ].join('\n') + '\n'
  24. }
  25. async function main(): Promise<void> {
  26. const outputPath = process.env.GITHUB_OUTPUT
  27. if (!outputPath) throw new Error('GITHUB_OUTPUT is required but was not set')
  28. const paths = parseChangedPaths(await Bun.stdin.text())
  29. const output = formatGitHubOutput(classifyChangedPaths(paths))
  30. await appendFile(outputPath, output, 'utf8').catch((error: unknown) => {
  31. const message = error instanceof Error ? error.message : String(error)
  32. throw new Error(`Unable to append change detection outputs to GITHUB_OUTPUT (${outputPath}): ${message}`)
  33. })
  34. }
  35. if (import.meta.main) {
  36. await main().catch((error: unknown) => {
  37. const message = error instanceof Error ? error.message : String(error)
  38. console.error(`detect-pr-changes: ${message}`)
  39. process.exitCode = 1
  40. })
  41. }