tina4-nodejs 3.13.73 → 3.13.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +2 -2
- package/package.json +1 -1
- package/packages/core/src/devAdmin.ts +18 -15
package/CLAUDE.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# CLAUDE.md - AI Developer Guide for tina4-nodejs (v3.13.
|
|
1
|
+
# CLAUDE.md - AI Developer Guide for tina4-nodejs (v3.13.74)
|
|
2
2
|
|
|
3
3
|
> This file helps AI assistants (Claude, Copilot, Cursor, etc.) understand and work on this codebase effectively.
|
|
4
4
|
|
|
5
5
|
## What This Project Is
|
|
6
6
|
|
|
7
|
-
Tina4 for Node.js/TypeScript v3.13.
|
|
7
|
+
Tina4 for Node.js/TypeScript v3.13.74 - The Intelligent Native Application 4ramework. A convention-over-configuration structural paradigm. The developer writes TypeScript; Tina4 is invisible infrastructure.
|
|
8
8
|
|
|
9
9
|
The philosophy: zero ceremony, batteries included, file system as source of truth.
|
|
10
10
|
|
package/package.json
CHANGED
|
@@ -1753,30 +1753,33 @@ const handleConnectionsTest: RouteHandler = async (req, res) => {
|
|
|
1753
1753
|
let version = "Connected";
|
|
1754
1754
|
let tableCount = 0;
|
|
1755
1755
|
try {
|
|
1756
|
-
|
|
1756
|
+
// getTables() is async (Promise<string[]>) and MUST be awaited — the
|
|
1757
|
+
// un-awaited call made tableCount always 0 (Array.isArray(Promise) is
|
|
1758
|
+
// false). Python (db.get_tables()) and Ruby (db.tables) were correct.
|
|
1759
|
+
const tables = await db.getTables();
|
|
1757
1760
|
tableCount = Array.isArray(tables) ? tables.length : 0;
|
|
1758
1761
|
} catch { tableCount = 0; }
|
|
1759
1762
|
try {
|
|
1760
1763
|
const urlLower = url.toLowerCase();
|
|
1761
|
-
//
|
|
1762
|
-
//
|
|
1763
|
-
//
|
|
1764
|
-
//
|
|
1764
|
+
// fetchOne() is async and returns a single row object ({ v: ... }); it
|
|
1765
|
+
// must be awaited. Previously db.execute() was left un-awaited, so `row`
|
|
1766
|
+
// was a Promise and the version always fell back to the default string.
|
|
1767
|
+
// Mirrors Python/Ruby which read row["v"] from a fetch_one().
|
|
1765
1768
|
if (urlLower.includes("sqlite")) {
|
|
1766
|
-
const row = db.
|
|
1767
|
-
version = `SQLite ${
|
|
1769
|
+
const row = await db.fetchOne<{ v?: string }>("SELECT sqlite_version() as v");
|
|
1770
|
+
version = `SQLite ${row?.v ?? ""}`;
|
|
1768
1771
|
} else if (urlLower.includes("postgres")) {
|
|
1769
|
-
const row = db.
|
|
1770
|
-
version = (
|
|
1772
|
+
const row = await db.fetchOne<{ v?: string }>("SELECT version() as v");
|
|
1773
|
+
version = (row?.v ?? "PostgreSQL").toString().split(",")[0];
|
|
1771
1774
|
} else if (urlLower.includes("mysql")) {
|
|
1772
|
-
const row = db.
|
|
1773
|
-
version = `MySQL ${
|
|
1775
|
+
const row = await db.fetchOne<{ v?: string }>("SELECT version() as v");
|
|
1776
|
+
version = `MySQL ${row?.v ?? ""}`;
|
|
1774
1777
|
} else if (urlLower.includes("mssql")) {
|
|
1775
|
-
const row = db.
|
|
1776
|
-
version = (
|
|
1778
|
+
const row = await db.fetchOne<{ v?: string }>("SELECT @@VERSION as v");
|
|
1779
|
+
version = (row?.v ?? "MSSQL").toString().split("\n")[0];
|
|
1777
1780
|
} else if (urlLower.includes("firebird")) {
|
|
1778
|
-
const row = db.
|
|
1779
|
-
version = `Firebird ${
|
|
1781
|
+
const row = await db.fetchOne<{ v?: string }>("SELECT rdb$get_context('SYSTEM', 'ENGINE_VERSION') as v FROM rdb$database");
|
|
1782
|
+
version = `Firebird ${row?.v ?? ""}`;
|
|
1780
1783
|
}
|
|
1781
1784
|
} catch { /* keep version as Connected */ }
|
|
1782
1785
|
db.close();
|