diff --git a/src/index.js b/src/index.js index 944d50cf..dc671cda 100644 --- a/src/index.js +++ b/src/index.js @@ -25,6 +25,9 @@ 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. +Symbol.dispose ??= Symbol("Symbol.dispose") + Object.assign(Postgres, { PostgresError, toPascal, @@ -221,6 +224,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; } }