Skip to content

Commit

Permalink
Add error-utils helper and tests
Browse files Browse the repository at this point in the history
  • Loading branch information
James M. Greene authored and James M. Greene committed Mar 28, 2024
1 parent b85f2a6 commit 1c5932f
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 0 deletions.
27 changes: 27 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"dependencies": {
"@actions/core": "^1.10.1",
"@actions/github": "^6.0.0",
"error-stack-parser": "^2.1.4",
"espree": "^9.6.1"
},
"devDependencies": {
Expand Down
24 changes: 24 additions & 0 deletions src/error-utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
const ErrorStackParser = require('error-stack-parser')

// Convert an Error's stack into `@actions/core` toolkit AnnotationProperties:
// https://github.com/actions/toolkit/blob/ef77c9d60bdb03700d7758b0d04b88446e72a896/packages/core/src/core.ts#L36-L71
function convertErrorToAnnotationProperties(error, title = error.name) {
if (!(error instanceof Error)) {
throw new TypeError('error must be an instance of Error')
}

const stack = ErrorStackParser.parse(error)
const firstFrame = stack && stack.length > 0 ? stack[0] : null
if (!firstFrame) {
throw new Error('Error stack is empty or unparseable')
}

return {
title,
file: firstFrame.fileName,
startLine: firstFrame.lineNumber,
startColumn: firstFrame.columnNumber
}
}

module.exports = { convertErrorToAnnotationProperties }
38 changes: 38 additions & 0 deletions src/error-utils.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
const { convertErrorToAnnotationProperties } = require('./error-utils')

describe('error-utils', () => {
describe('convertErrorToAnnotationProperties', () => {
it('throws a TypeError if the first argument is not an Error instance', () => {
expect(() => convertErrorToAnnotationProperties('not an Error')).toThrow(
TypeError,
'error must be an instance of Error'
)
})

it('throws an Error if the first argument is an Error instance without a parseable stack', () => {
const error = new Error('Test error')
error.stack = ''
expect(() => convertErrorToAnnotationProperties(error)).toThrow(Error, 'Error stack is empty or unparseable')
})

it('returns an AnnotationProperties-compatible object', () => {
const result = convertErrorToAnnotationProperties(new TypeError('Test error'))
expect(result).toEqual({
title: 'TypeError',
file: __filename,
startLine: expect.any(Number),
startColumn: expect.any(Number)
})
})

it('returns an AnnotationProperties-compatible object with a custom title', () => {
const result = convertErrorToAnnotationProperties(new TypeError('Test error'), 'custom title')
expect(result).toEqual({
title: 'custom title',
file: __filename,
startLine: expect.any(Number),
startColumn: expect.any(Number)
})
})
})
})

0 comments on commit 1c5932f

Please sign in to comment.