detect-pr-changes.ts 1.7 KB

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