fix(node): preserve options when namespace is omitted (#4479)

The namespace overloads allow `undefined` to select the root namespace,
but overload dispatch treats it as the legacy options argument and
discards the trailing options. For example, `createTable(name, data,
undefined, { mode: "overwrite" })` raises an already-exists error
instead of overwriting.

Preserve the trailing options for `createTable`, `createEmptyTable`,
`tableNames`, and `listTables` when the namespace is omitted. Legacy
options-object calls and explicit namespace arrays keep their existing
behavior.

Adds native-database regressions for overwrite, existOk, and both
listing APIs, parameterized over `undefined` and `[]`.

Validation on Windows / Node 24.19.0:
- Before the fix: all five omitted-namespace cases failed; all five
explicit-root controls passed.
- Current TypeScript source with official, integrity-verified
0.41.0-beta.0 native binaries: the entire connection test file passed,
47/47 (transpile-only).
- The same fix replayed onto the matching 0.41.0-beta.0 source:
TypeScript compilation, strict ts-jest connection tests (47/47), and
TypeDoc passed.
- Biome check/format on both changed files and diff whitespace checks
passed.

No Rust changes. A complete current-main native rebuild remains for CI:
released declarations predate the unrelated lazy-iterator APIs, so
current-main typechecking against those declarations reports six
pre-existing iterator signature errors.

Signed-off-by: Xucheng Zhou <aden1350@outlook.com>
Co-authored-by: Xuanwo <github@xuanwo.io>
This commit is contained in:
adenzhou1350
2026-10-23 03:13:31 +08:00
committed by GitHub
co-authored by Xuanwo
parent 57a6cce681
commit 036f4ec53f
2 changed files with 64 additions and 4 deletions
+4 -4
View File
@@ -720,7 +720,7 @@ export class LocalConnection extends Connection {
} else {
// First argument is options object (backwards compatibility)
namespacePath = undefined;
tableNamesOptions = namespacePathOrOptions;
tableNamesOptions = namespacePathOrOptions ?? options;
}
return this.inner.tableNames(
@@ -831,7 +831,7 @@ export class LocalConnection extends Connection {
: undefined;
const listTablesOptions = Array.isArray(namespacePathOrOptions)
? options
: namespacePathOrOptions;
: (namespacePathOrOptions ?? options);
return this.inner.listTables(
namespacePath ?? [],
@@ -942,7 +942,7 @@ export class LocalConnection extends Connection {
} else {
// Third argument is options object (backwards compatibility)
namespacePath = undefined;
createOptions = namespacePathOrOptions;
createOptions = namespacePathOrOptions ?? options;
}
return this._createTableImpl(name, data, namespacePath, createOptions);
@@ -989,7 +989,7 @@ export class LocalConnection extends Connection {
} else {
// Third argument is options object (backwards compatibility)
namespacePath = undefined;
createOptions = namespacePathOrOptions;
createOptions = namespacePathOrOptions ?? options;
}
let mode: string = createOptions?.mode ?? "create";