Просмотр исходного кода

web: add `info`/`cause` support to `BackwardCompatibleError` (OError-compatible) (#33766)

GitOrigin-RevId: 736ca3245f85f14df5a01e5c4a342b99742118e8
Copilot 2 месяцев назад
Родитель
Сommit
016296cc07

+ 16 - 7
services/web/app/src/Features/Errors/Errors.js

@@ -6,16 +6,25 @@ const settings = require('@overleaf/settings')
 // of object)
 class BackwardCompatibleError extends OError {
   /**
-   * @param {string | { message: string, info?: Object }} messageOrOptions
+   * @param {string | { message?: string, info?: Object, cause?: unknown }} messageOrOptions
+   * @param {Object} [info]
+   * @param {unknown} [cause]
    */
-  constructor(messageOrOptions) {
+  constructor(messageOrOptions, info, cause) {
     if (typeof messageOrOptions === 'string') {
-      super(messageOrOptions)
-    } else if (messageOrOptions) {
-      const { message, info } = messageOrOptions
-      super(message, info)
+      super(messageOrOptions, info, cause)
+    } else if (
+      typeof messageOrOptions === 'object' &&
+      messageOrOptions !== null
+    ) {
+      const {
+        message,
+        info: optionsInfo,
+        cause: optionsCause,
+      } = messageOrOptions
+      super(message, optionsInfo, optionsCause)
     } else {
-      super()
+      super(undefined, info, cause)
     }
   }
 }

+ 45 - 0
services/web/test/unit/src/Features/Errors.test.mjs

@@ -0,0 +1,45 @@
+import { describe, it, expect } from 'vitest'
+import Errors from '../../../../app/src/Features/Errors/Errors.js'
+
+describe('BackwardCompatibleError', function () {
+  it('supports OError signature with info and cause', function () {
+    const cause = new Error('root cause')
+    const error = new Errors.BackwardCompatibleError(
+      'message',
+      { key: 'value' },
+      cause
+    )
+
+    expect(error).to.be.instanceOf(Error)
+    expect(error).to.be.instanceOf(Errors.BackwardCompatibleError)
+    expect(error.message).to.equal('message')
+    expect(error.info).to.eql({ key: 'value' })
+    expect(error.cause).to.equal(cause)
+  })
+
+  it('supports object options signature including cause', function () {
+    const cause = new Error('root cause')
+    const error = new Errors.BackwardCompatibleError({
+      message: 'message',
+      info: { key: 'value' },
+      cause,
+    })
+
+    expect(error.message).to.equal('message')
+    expect(error.info).to.eql({ key: 'value' })
+    expect(error.cause).to.equal(cause)
+  })
+
+  it('handles null message values', function () {
+    const cause = new Error('root cause')
+    const error = new Errors.BackwardCompatibleError(
+      null,
+      { key: 'value' },
+      cause
+    )
+
+    expect(error.message).to.equal('')
+    expect(error.info).to.eql({ key: 'value' })
+    expect(error.cause).to.equal(cause)
+  })
+})