@happyvertical/sql 0.89.3 → 0.89.5

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.
Files changed (29) hide show
  1. package/AGENT.md +1 -0
  2. package/README.md +129 -9
  3. package/dist/chunks/{duckdb-Ba6QVk6i.js → duckdb-DfikVgov.js} +2 -2
  4. package/dist/chunks/{duckdb-Ba6QVk6i.js.map → duckdb-DfikVgov.js.map} +1 -1
  5. package/dist/chunks/sqlite-Cz2NMiDs.js +2619 -0
  6. package/dist/chunks/sqlite-Cz2NMiDs.js.map +1 -0
  7. package/dist/chunks/{sqlite-connection-cache-DwlyWaqG.js → sqlite-connection-cache-BAakj2HO.js} +8 -3
  8. package/dist/chunks/sqlite-connection-cache-BAakj2HO.js.map +1 -0
  9. package/dist/chunks/{sqlite-native-DBbBMvTD.js → sqlite-native-ByGwGEbS.js} +3 -3
  10. package/dist/chunks/{sqlite-native-DBbBMvTD.js.map → sqlite-native-ByGwGEbS.js.map} +1 -1
  11. package/dist/chunks/{types-uVFHgaSU.js → types-CwWJ-yju.js} +8 -2
  12. package/dist/chunks/types-CwWJ-yju.js.map +1 -0
  13. package/dist/index.d.ts +2 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +3 -3
  16. package/dist/index.js.map +1 -1
  17. package/dist/secure-sqlite-client.d.ts +81 -0
  18. package/dist/secure-sqlite-client.d.ts.map +1 -0
  19. package/dist/shared/sqlite-connection-cache.d.ts +1 -1
  20. package/dist/shared/sqlite-connection-cache.d.ts.map +1 -1
  21. package/dist/shared/transaction-lock.d.ts +2 -0
  22. package/dist/shared/transaction-lock.d.ts.map +1 -1
  23. package/dist/sqlite.d.ts +35 -0
  24. package/dist/sqlite.d.ts.map +1 -1
  25. package/package.json +4 -3
  26. package/dist/chunks/sqlite-BPI6YDpW.js +0 -1136
  27. package/dist/chunks/sqlite-BPI6YDpW.js.map +0 -1
  28. package/dist/chunks/sqlite-connection-cache-DwlyWaqG.js.map +0 -1
  29. package/dist/chunks/types-uVFHgaSU.js.map +0 -1
@@ -0,0 +1,81 @@
1
+ import { lstat, open } from 'node:fs/promises';
2
+ export interface SecureSqliteStatement {
3
+ sql: string;
4
+ args?: unknown[];
5
+ }
6
+ export interface SecureSqliteResult {
7
+ rows: Record<string, unknown>[];
8
+ rowsAffected: number;
9
+ lastInsertRowid?: bigint;
10
+ }
11
+ export interface SecureSqliteTransactionClient {
12
+ readonly closed: boolean;
13
+ execute(statement: string | SecureSqliteStatement): Promise<SecureSqliteResult>;
14
+ commit(): Promise<void>;
15
+ rollback(): Promise<void>;
16
+ close(): void;
17
+ }
18
+ export interface SecureSqliteClient {
19
+ readonly transactionReservation: 'exclusive';
20
+ execute(statement: string | SecureSqliteStatement): Promise<SecureSqliteResult>;
21
+ transaction(mode?: string): Promise<SecureSqliteTransactionClient>;
22
+ close(): Promise<void>;
23
+ }
24
+ export interface SecureSqliteCustodyOptions {
25
+ custody: 'trusted-parent';
26
+ root?: string;
27
+ }
28
+ interface NodeSqliteStatement {
29
+ all(...args: unknown[]): Record<string, unknown>[];
30
+ columns(): Array<{
31
+ name: string;
32
+ }>;
33
+ run(...args: unknown[]): {
34
+ changes: number | bigint;
35
+ lastInsertRowid: number | bigint;
36
+ };
37
+ setReadBigInts(enabled: boolean): void;
38
+ }
39
+ interface NodeSqliteDatabase {
40
+ readonly isTransaction: boolean;
41
+ prepare(sql: string): NodeSqliteStatement;
42
+ close(): void;
43
+ }
44
+ interface NodeSqliteModule {
45
+ DatabaseSync: new (filename: string, options?: {
46
+ enableForeignKeyConstraints?: boolean;
47
+ enableDoubleQuotedStringLiterals?: boolean;
48
+ }) => NodeSqliteDatabase;
49
+ }
50
+ /** @internal Deterministic acquisition seam used by the integration tests. */
51
+ export interface SecureSqliteRuntime {
52
+ platform: NodeJS.Platform;
53
+ nodeVersion?: string;
54
+ currentUid?: () => number;
55
+ pathOwnerUid?: (filePath: string, actualUid: number) => number;
56
+ inspectDarwinAcl?: (filePath: string) => Promise<boolean>;
57
+ openLeaf?: typeof open;
58
+ lstatLeaf?: typeof lstat;
59
+ loadDriver: () => Promise<NodeSqliteModule>;
60
+ }
61
+ /**
62
+ * @internal Parses the stable ACL section emitted by macOS `/bin/ls`.
63
+ * Returns true only when the ACL grants authority; deny-only ACLs are
64
+ * restrictive and do not weaken trusted-parent custody.
65
+ */
66
+ export declare function parseDarwinAclListing(listing: string): boolean;
67
+ /** @internal Exact public-contract range guard used by deterministic tests. */
68
+ export declare function toPublicRowCount(value: number | bigint): number;
69
+ /**
70
+ * Opens a local SQLite file under an explicit trusted-parent custody contract.
71
+ *
72
+ * Static path components and their ownership/mode are checked before the
73
+ * built-in `node:sqlite` driver opens the file. Other principals cannot replace
74
+ * a path beneath the caller-custodied parent. Hostile processes running as the
75
+ * same account are explicitly outside this boundary.
76
+ *
77
+ * @internal Call through `getDatabase()` with typed `secureFile` custody.
78
+ */
79
+ export declare function createSecureSqliteClient(url: string, options: SecureSqliteCustodyOptions, runtime?: SecureSqliteRuntime): Promise<SecureSqliteClient>;
80
+ export {};
81
+ //# sourceMappingURL=secure-sqlite-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-sqlite-client.d.ts","sourceRoot":"","sources":["../src/secure-sqlite-client.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import { DatabaseInterface, DatabaseOptions } from './types';
2
- export type SqliteAdapterPath = 'libsql' | 'native';
2
+ export type SqliteAdapterPath = 'libsql' | 'native' | 'secure';
3
3
  export declare function getCachedSqliteDatabase(path: SqliteAdapterPath, options: DatabaseOptions, create: () => Promise<DatabaseInterface>): Promise<DatabaseInterface>;
4
4
  //# sourceMappingURL=sqlite-connection-cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-connection-cache.d.ts","sourceRoot":"","sources":["../../src/shared/sqlite-connection-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAElE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAsEpD,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,GACvC,OAAO,CAAC,iBAAiB,CAAC,CA+B5B"}
1
+ {"version":3,"file":"sqlite-connection-cache.d.ts","sourceRoot":"","sources":["../../src/shared/sqlite-connection-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAElE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AA0E/D,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,GACvC,OAAO,CAAC,iBAAiB,CAAC,CAqC5B"}
@@ -10,6 +10,8 @@ export declare const DEFAULT_TRANSACTION_QUEUE_TIMEOUT_MS = 30000;
10
10
  * Serializes transactions on a connection that cannot hold more than one.
11
11
  */
12
12
  export interface TransactionLock {
13
+ /** Whether one caller currently owns the connection. */
14
+ readonly held: boolean;
13
15
  /**
14
16
  * Takes the connection and returns the function that gives it back.
15
17
  *
@@ -1 +1 @@
1
- {"version":3,"file":"transaction-lock.d.ts","sourceRoot":"","sources":["../../src/shared/transaction-lock.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,eAAO,MAAM,oCAAoC,QAAS,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAE/B;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAA6C,GACvD,eAAe,CAoEjB"}
1
+ {"version":3,"file":"transaction-lock.d.ts","sourceRoot":"","sources":["../../src/shared/transaction-lock.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,eAAO,MAAM,oCAAoC,QAAS,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAEvB;;;;;OAKG;IACH,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAE/B;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAA6C,GACvD,eAAe,CA6EjB"}
package/dist/sqlite.d.ts CHANGED
@@ -1,4 +1,26 @@
1
1
  import { DatabaseInterface, DatabaseOptions, SqliteCapabilitiesOptions } from './shared/types';
2
+ export declare function toSafeSqliteCount(value: unknown): number;
3
+ /** Options for the trusted-parent SQLite file acquisition boundary. */
4
+ export interface SecureSqliteFileOptions {
5
+ /**
6
+ * Built-in driver that owns the secure acquisition and exact integer path.
7
+ *
8
+ * @default 'node:sqlite'
9
+ */
10
+ driver: 'node:sqlite';
11
+ /**
12
+ * Assert that the application controls the database parent directory.
13
+ * The adapter verifies current-user ownership, non-writable group/other
14
+ * permissions, current-user/root ancestor ownership, static symlink absence,
15
+ * and no macOS ACL before acquisition.
16
+ */
17
+ custody: 'trusted-parent';
18
+ /**
19
+ * Optional application data root. Defaults to the database's direct parent.
20
+ * Every database parent at or below this root must satisfy the custody check.
21
+ */
22
+ root?: string;
23
+ }
2
24
  /**
3
25
  * Configuration options for SQLite database connections
4
26
  */
@@ -35,6 +57,19 @@ export interface SqliteOptions extends DatabaseOptions {
35
57
  * capabilities are only supported for local SQLite databases.
36
58
  */
37
59
  capabilities?: SqliteCapabilitiesOptions;
60
+ /**
61
+ * Require trusted-parent acquisition for a local file-backed database.
62
+ *
63
+ * This requires an explicit `trusted-parent` custody assertion, verifies the
64
+ * application data root/parent chain and rejects static symlinks before the
65
+ * built-in `node:sqlite` driver opens the file. Other principals cannot
66
+ * replace a path under the custodied parent. It does not claim protection
67
+ * from a hostile same-account process, which can directly replace or rewrite
68
+ * an unencrypted user-owned database.
69
+ *
70
+ * Existing pathname behavior is unchanged when omitted or false.
71
+ */
72
+ secureFile?: boolean | SecureSqliteFileOptions;
38
73
  /**
39
74
  * How long a queued transaction waits for the connection, in milliseconds.
40
75
  *
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAGV,iBAAiB,EACjB,eAAe,EAIf,yBAAyB,EAK1B,MAAM,gBAAgB,CAAC;AAoIxB;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,yBAAyB,CAAC;IAEzC;;;;;;;;;;;;;;;;;;OAkBG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,gBAAgB,EAAE,aAAa,CAAC;CAClD;AA+ED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAkB5B"}
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAGV,iBAAiB,EACjB,eAAe,EAIf,yBAAyB,EAK1B,MAAM,gBAAgB,CAAC;AAsKxB,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASxD;AAixBD,uEAAuE;AACvE,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,MAAM,EAAE,aAAa,CAAC;IAEtB;;;;;OAKG;IACH,OAAO,EAAE,gBAAgB,CAAC;IAE1B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,yBAAyB,CAAC;IAEzC;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,uBAAuB,CAAC;IAE/C;;;;;;;;;;;;;;;;;;OAkBG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,gBAAgB,EAAE,aAAa,CAAC;CAClD;AA+ED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAuE5B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/sql",
3
- "version": "0.89.3",
3
+ "version": "0.89.5",
4
4
  "description": "Database interface with support for SQLite, PostgreSQL, and DuckDB",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -46,7 +46,7 @@
46
46
  "@libsql/client": "0.17.2",
47
47
  "pg": "^8.20.0",
48
48
  "sqlite-vss": "^0.1.2",
49
- "@happyvertical/utils": "0.89.3"
49
+ "@happyvertical/utils": "0.89.5"
50
50
  },
51
51
  "peerDependencies": {
52
52
  "@russellthehippo/honker-node": "^0.3.3",
@@ -71,10 +71,11 @@
71
71
  "scripts": {
72
72
  "test": "vitest --config ../../vitest.package.config.ts run",
73
73
  "test:watch": "vitest --config ../../vitest.package.config.ts",
74
- "test:sqlite": "vitest --config ../../vitest.package.config.ts run src/sqlite.spec.ts src/count.spec.ts",
74
+ "test:sqlite": "vitest --config ../../vitest.package.config.ts run src/sqlite.spec.ts src/secure-sqlite.spec.ts src/count.spec.ts",
75
75
  "test:postgres": "node ../../scripts/run-with-ci-postgres.mjs -- vitest --config ../../vitest.package.config.ts run src/postgres.spec.ts src/postgres-vector.spec.ts src/postgres-connection-lifecycle.spec.ts src/postgres-nested-transaction.spec.ts src/postgres-transaction-errors.spec.ts src/transaction-schema-scope.spec.ts src/identifier-injection.spec.ts src/postgres-insert-column-binding.spec.ts src/postgres-count.spec.ts src/contains.spec.ts",
76
76
  "test:duckdb": "vitest --config ../../vitest.package.config.ts run src/duckdb.spec.ts src/count.spec.ts",
77
77
  "build": "vite build",
78
+ "typecheck": "tsc --noEmit",
78
79
  "build:watch": "vite build --watch",
79
80
  "docs": "typedoc --plugin typedoc-plugin-markdown --out docs --entryPoints ./src/index.ts --tsconfig ./tsconfig.json --excludePrivate --excludeInternal --hideGenerator --fileExtension .md --readme none --categorizeByGroup false --includeVersion false --hidePageHeader --hidePageTitle false --outputFileStrategy modules",
80
81
  "docs:watch": "typedoc --plugin typedoc-plugin-markdown --out docs --entryPoints ./src/index.ts --tsconfig ./tsconfig.json --excludePrivate --excludeInternal --hideGenerator --fileExtension .md --readme none --categorizeByGroup false --includeVersion false --hidePageHeader --hidePageTitle false --outputFileStrategy modules --watch",