From 4c4462e4fae1bc9c96522ab676630906d4004b72 Mon Sep 17 00:00:00 2001 From: David Fahlander Date: Fri, 26 Sep 2025 09:59:36 +0200 Subject: [PATCH 1/2] Support using (issue #886) --- src/index.js | 6 ++++++ types/index.d.ts | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 944d50cf..874a1c72 100644 --- a/src/index.js +++ b/src/index.js @@ -25,6 +25,11 @@ import { Errors, PostgresError } from './errors.js' import Subscribe from './subscribe.js' import largeObject from './large.js' +// Polyfill for `Symbol.dispose`. We don't need asyncDispose as sql.release() is not async. +if (!('dispose' in Symbol)) { + Symbol.dispose = Symbol('dispose') +} + Object.assign(Postgres, { PostgresError, toPascal, @@ -221,6 +226,7 @@ function Postgres(a, b) { c.reserved = null onopen(c) } + sql[Symbol.dispose] = sql.release; return sql diff --git a/types/index.d.ts b/types/index.d.ts index eb604918..bc9800cb 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -20,6 +20,15 @@ declare function postgres = {}>( parse: (raw: any) => infer R } ? R : never }> +// Disposable type for `using sql = ...` syntax. +// If typescript doesn't know about `Symbol.dispose`, fallback to an empty interface. +type Disposable = typeof Symbol extends { + dispose: symbol; +} //@ts-ignore + ? {[Symbol.dispose]: () => void; + } + : {}; + /** * Connection options of Postgres. */ @@ -722,7 +731,7 @@ declare namespace postgres { prepare(name: string): Promise>; } - interface ReservedSql = {}> extends Sql { + interface ReservedSql = {}> extends Sql, Disposable { release(): void; } } From 03d1f0f0b3c38d45278935ac11da8e170f36d749 Mon Sep 17 00:00:00 2001 From: David Fahlander Date: Fri, 26 Sep 2025 10:15:24 +0200 Subject: [PATCH 2/2] A little cleaner polyfill variant --- src/index.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index 874a1c72..dc671cda 100644 --- a/src/index.js +++ b/src/index.js @@ -26,9 +26,7 @@ import Subscribe from './subscribe.js' import largeObject from './large.js' // Polyfill for `Symbol.dispose`. We don't need asyncDispose as sql.release() is not async. -if (!('dispose' in Symbol)) { - Symbol.dispose = Symbol('dispose') -} +Symbol.dispose ??= Symbol("Symbol.dispose") Object.assign(Postgres, { PostgresError,