@gjsify/sqlite 0.4.0 → 0.4.4

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/package.json CHANGED
@@ -1,44 +1,47 @@
1
1
  {
2
- "name": "@gjsify/sqlite",
3
- "version": "0.4.0",
4
- "description": "Node.js sqlite module for Gjs using libgda",
5
- "type": "module",
6
- "module": "lib/esm/index.js",
7
- "types": "lib/types/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./lib/types/index.d.ts",
11
- "default": "./lib/esm/index.js"
2
+ "name": "@gjsify/sqlite",
3
+ "version": "0.4.4",
4
+ "description": "Node.js sqlite module for Gjs using libgda",
5
+ "type": "module",
6
+ "module": "lib/esm/index.js",
7
+ "types": "lib/types/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./lib/types/index.d.ts",
11
+ "default": "./lib/esm/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "lib"
16
+ ],
17
+ "scripts": {
18
+ "clear": "rm -rf lib tsconfig.tsbuildinfo tsconfig.types.tsbuildinfo test.gjs.mjs test.node.mjs || exit 0",
19
+ "check": "tsc --noEmit",
20
+ "build": "gjsify run build:gjsify && gjsify run build:types",
21
+ "build:gjsify": "gjsify build --library 'src/**/*.{ts,js}' --exclude 'src/**/*.spec.{mts,ts}' 'src/test.{mts,ts}'",
22
+ "build:types": "tsc",
23
+ "build:test": "gjsify run build:test:gjs && gjsify run build:test:node",
24
+ "build:test:gjs": "gjsify build src/test.mts --app gjs --outfile test.gjs.mjs",
25
+ "build:test:node": "gjsify build src/test.mts --app node --outfile test.node.mjs",
26
+ "test": "gjsify run build:gjsify && gjsify run build:test && gjsify run test:node && gjsify run test:gjs",
27
+ "test:gjs": "gjsify run test.gjs.mjs",
28
+ "test:node": "node test.node.mjs"
29
+ },
30
+ "keywords": [
31
+ "gjs",
32
+ "node",
33
+ "sqlite",
34
+ "libgda"
35
+ ],
36
+ "devDependencies": {
37
+ "@gjsify/cli": "^0.4.4",
38
+ "@gjsify/unit": "^0.4.4",
39
+ "@types/node": "^25.6.2",
40
+ "typescript": "^6.0.3"
41
+ },
42
+ "dependencies": {
43
+ "@girs/gda-6.0": "6.0.0-4.0.0-rc.15",
44
+ "@girs/glib-2.0": "2.88.0-4.0.0-rc.15",
45
+ "@girs/gobject-2.0": "2.88.0-4.0.0-rc.15"
12
46
  }
13
- },
14
- "scripts": {
15
- "clear": "rm -rf lib tsconfig.tsbuildinfo tsconfig.types.tsbuildinfo test.gjs.mjs test.node.mjs || exit 0",
16
- "check": "tsc --noEmit",
17
- "build": "yarn build:gjsify && yarn build:types",
18
- "build:gjsify": "gjsify build --library 'src/**/*.{ts,js}' --exclude 'src/**/*.spec.{mts,ts}' 'src/test.{mts,ts}'",
19
- "build:types": "tsc",
20
- "build:test": "yarn build:test:gjs && yarn build:test:node",
21
- "build:test:gjs": "gjsify build src/test.mts --app gjs --outfile test.gjs.mjs",
22
- "build:test:node": "gjsify build src/test.mts --app node --outfile test.node.mjs",
23
- "test": "yarn build:gjsify && yarn build:test && yarn test:node && yarn test:gjs",
24
- "test:gjs": "gjsify run test.gjs.mjs",
25
- "test:node": "node test.node.mjs"
26
- },
27
- "keywords": [
28
- "gjs",
29
- "node",
30
- "sqlite",
31
- "libgda"
32
- ],
33
- "devDependencies": {
34
- "@gjsify/cli": "^0.4.0",
35
- "@gjsify/unit": "^0.4.0",
36
- "@types/node": "^25.6.2",
37
- "typescript": "^6.0.3"
38
- },
39
- "dependencies": {
40
- "@girs/gda-6.0": "6.0.0-4.0.0-rc.15",
41
- "@girs/glib-2.0": "2.88.0-4.0.0-rc.15",
42
- "@girs/gobject-2.0": "2.88.0-4.0.0-rc.15"
43
- }
44
- }
47
+ }
package/src/constants.ts DELETED
@@ -1,101 +0,0 @@
1
- // SQLite constants matching Node.js node:sqlite constants
2
- // Reference: Node.js lib/sqlite.js
3
-
4
- // Changeset conflict constants
5
- export const SQLITE_CHANGESET_OMIT = 0;
6
- export const SQLITE_CHANGESET_REPLACE = 1;
7
- export const SQLITE_CHANGESET_ABORT = 2;
8
- export const SQLITE_CHANGESET_DATA = 1;
9
- export const SQLITE_CHANGESET_NOTFOUND = 2;
10
- export const SQLITE_CHANGESET_CONFLICT = 3;
11
- export const SQLITE_CHANGESET_CONSTRAINT = 4;
12
- export const SQLITE_CHANGESET_FOREIGN_KEY = 5;
13
-
14
- // Authorization result constants
15
- export const SQLITE_OK = 0;
16
- export const SQLITE_DENY = 1;
17
- export const SQLITE_IGNORE = 2;
18
-
19
- // Authorization action code constants
20
- export const SQLITE_CREATE_INDEX = 1;
21
- export const SQLITE_CREATE_TABLE = 2;
22
- export const SQLITE_CREATE_TEMP_INDEX = 3;
23
- export const SQLITE_CREATE_TEMP_TABLE = 4;
24
- export const SQLITE_CREATE_TEMP_TRIGGER = 5;
25
- export const SQLITE_CREATE_TEMP_VIEW = 6;
26
- export const SQLITE_CREATE_TRIGGER = 7;
27
- export const SQLITE_CREATE_VIEW = 8;
28
- export const SQLITE_DELETE = 9;
29
- export const SQLITE_DROP_INDEX = 10;
30
- export const SQLITE_DROP_TABLE = 11;
31
- export const SQLITE_DROP_TEMP_INDEX = 12;
32
- export const SQLITE_DROP_TEMP_TABLE = 13;
33
- export const SQLITE_DROP_TEMP_TRIGGER = 14;
34
- export const SQLITE_DROP_TEMP_VIEW = 15;
35
- export const SQLITE_DROP_TRIGGER = 16;
36
- export const SQLITE_DROP_VIEW = 17;
37
- export const SQLITE_INSERT = 18;
38
- export const SQLITE_PRAGMA = 19;
39
- export const SQLITE_READ = 20;
40
- export const SQLITE_SELECT = 21;
41
- export const SQLITE_TRANSACTION = 22;
42
- export const SQLITE_UPDATE = 23;
43
- export const SQLITE_ATTACH = 24;
44
- export const SQLITE_DETACH = 25;
45
- export const SQLITE_ALTER_TABLE = 26;
46
- export const SQLITE_REINDEX = 27;
47
- export const SQLITE_ANALYZE = 28;
48
- export const SQLITE_CREATE_VTABLE = 29;
49
- export const SQLITE_DROP_VTABLE = 30;
50
- export const SQLITE_FUNCTION = 31;
51
- export const SQLITE_SAVEPOINT = 32;
52
- export const SQLITE_COPY = 0;
53
- export const SQLITE_RECURSIVE = 33;
54
-
55
- export const constants = {
56
- SQLITE_CHANGESET_OMIT,
57
- SQLITE_CHANGESET_REPLACE,
58
- SQLITE_CHANGESET_ABORT,
59
- SQLITE_CHANGESET_DATA,
60
- SQLITE_CHANGESET_NOTFOUND,
61
- SQLITE_CHANGESET_CONFLICT,
62
- SQLITE_CHANGESET_CONSTRAINT,
63
- SQLITE_CHANGESET_FOREIGN_KEY,
64
- SQLITE_OK,
65
- SQLITE_DENY,
66
- SQLITE_IGNORE,
67
- SQLITE_CREATE_INDEX,
68
- SQLITE_CREATE_TABLE,
69
- SQLITE_CREATE_TEMP_INDEX,
70
- SQLITE_CREATE_TEMP_TABLE,
71
- SQLITE_CREATE_TEMP_TRIGGER,
72
- SQLITE_CREATE_TEMP_VIEW,
73
- SQLITE_CREATE_TRIGGER,
74
- SQLITE_CREATE_VIEW,
75
- SQLITE_DELETE,
76
- SQLITE_DROP_INDEX,
77
- SQLITE_DROP_TABLE,
78
- SQLITE_DROP_TEMP_INDEX,
79
- SQLITE_DROP_TEMP_TABLE,
80
- SQLITE_DROP_TEMP_TRIGGER,
81
- SQLITE_DROP_TEMP_VIEW,
82
- SQLITE_DROP_TRIGGER,
83
- SQLITE_DROP_VIEW,
84
- SQLITE_INSERT,
85
- SQLITE_PRAGMA,
86
- SQLITE_READ,
87
- SQLITE_SELECT,
88
- SQLITE_TRANSACTION,
89
- SQLITE_UPDATE,
90
- SQLITE_ATTACH,
91
- SQLITE_DETACH,
92
- SQLITE_ALTER_TABLE,
93
- SQLITE_REINDEX,
94
- SQLITE_ANALYZE,
95
- SQLITE_CREATE_VTABLE,
96
- SQLITE_DROP_VTABLE,
97
- SQLITE_FUNCTION,
98
- SQLITE_SAVEPOINT,
99
- SQLITE_COPY,
100
- SQLITE_RECURSIVE,
101
- };
@@ -1,106 +0,0 @@
1
- // Convert Gda.DataModel results to JavaScript objects/arrays
2
- // Reference: Node.js lib/sqlite.js
3
- // Reimplemented for GJS using Gda-6.0
4
-
5
- import Gda from '@girs/gda-6.0';
6
- import GObject from '@girs/gobject-2.0';
7
- import { OutOfRangeError } from './errors.ts';
8
-
9
- export interface ReadOptions {
10
- readBigInts: boolean;
11
- returnArrays: boolean;
12
- }
13
-
14
- function convertValue(value: unknown, readBigInts: boolean): unknown {
15
- if (value === null || value === undefined) {
16
- return null;
17
- }
18
- if (typeof value === 'number') {
19
- if (Number.isInteger(value) && !Number.isSafeInteger(value)) {
20
- if (!readBigInts) {
21
- throw new OutOfRangeError(
22
- `Value is too large to be represented as a JavaScript number: ${value}`
23
- );
24
- }
25
- return BigInt(value);
26
- }
27
- if (readBigInts && Number.isInteger(value)) {
28
- return BigInt(value);
29
- }
30
- return value;
31
- }
32
- if (typeof value === 'bigint') {
33
- if (!readBigInts) {
34
- if (value > BigInt(Number.MAX_SAFE_INTEGER) || value < BigInt(-Number.MAX_SAFE_INTEGER)) {
35
- throw new OutOfRangeError(
36
- `Value is too large to be represented as a JavaScript number: ${value}`
37
- );
38
- }
39
- return Number(value);
40
- }
41
- return value;
42
- }
43
- if (typeof value === 'string') {
44
- return value;
45
- }
46
- // Handle GLib.Bytes or Uint8Array (BLOB)
47
- if (value instanceof Uint8Array) {
48
- return value;
49
- }
50
- // GLib.Bytes from Gda
51
- if (value && typeof (value as any).toArray === 'function') {
52
- return new Uint8Array((value as any).toArray());
53
- }
54
- return value;
55
- }
56
-
57
- export function readRow(
58
- model: Gda.DataModel,
59
- row: number,
60
- options: ReadOptions,
61
- ): Record<string, unknown> | unknown[] | undefined {
62
- const nCols = model.get_n_columns();
63
-
64
- if (options.returnArrays) {
65
- const arr: unknown[] = [];
66
- for (let col = 0; col < nCols; col++) {
67
- const val = model.get_value_at(col, row);
68
- arr.push(convertValue(val, options.readBigInts));
69
- }
70
- return arr;
71
- }
72
-
73
- const obj = Object.create(null) as Record<string, unknown>;
74
- for (let col = 0; col < nCols; col++) {
75
- const name = model.get_column_name(col);
76
- const val = model.get_value_at(col, row);
77
- obj[name] = convertValue(val, options.readBigInts);
78
- }
79
- return obj;
80
- }
81
-
82
- export function readAllRows(
83
- model: Gda.DataModel,
84
- options: ReadOptions,
85
- ): (Record<string, unknown> | unknown[])[] {
86
- const nRows = model.get_n_rows();
87
- const rows: (Record<string, unknown> | unknown[])[] = [];
88
- for (let row = 0; row < nRows; row++) {
89
- const r = readRow(model, row, options);
90
- if (r !== undefined) {
91
- rows.push(r);
92
- }
93
- }
94
- return rows;
95
- }
96
-
97
- export function readFirstRow(
98
- model: Gda.DataModel,
99
- options: ReadOptions,
100
- ): Record<string, unknown> | unknown[] | undefined {
101
- const nRows = model.get_n_rows();
102
- if (nRows === 0) {
103
- return undefined;
104
- }
105
- return readRow(model, 0, options);
106
- }
@@ -1,144 +0,0 @@
1
- // Ported from refs/node-test/parallel/test-sqlite-data-types.js
2
- // Original: MIT license, Node.js contributors
3
-
4
- import { describe, it, expect } from '@gjsify/unit';
5
- import { join } from 'node:path';
6
- import { tmpdir } from 'node:os';
7
- import { mkdirSync, rmSync } from 'node:fs';
8
- import { DatabaseSync } from 'node:sqlite';
9
-
10
- let cnt = 0;
11
- const testDir = join(tmpdir(), 'gjsify-sqlite-types-test-' + Date.now());
12
-
13
- function setup() {
14
- try { mkdirSync(testDir, { recursive: true }); } catch {}
15
- }
16
-
17
- function cleanup() {
18
- try { rmSync(testDir, { recursive: true, force: true }); } catch {}
19
- }
20
-
21
- function nextDb(): string {
22
- return join(testDir, `database-${cnt++}.db`);
23
- }
24
-
25
- export default async () => {
26
- setup();
27
-
28
- await describe('sqlite data types', async () => {
29
- await it('supports INTEGER, REAL, TEXT, BLOB, and NULL', async () => {
30
- const u8a = new TextEncoder().encode('a☃b☃c');
31
- const db = new DatabaseSync(nextDb());
32
- db.exec(`
33
- CREATE TABLE types(
34
- key INTEGER PRIMARY KEY,
35
- int INTEGER,
36
- double REAL,
37
- text TEXT,
38
- buf BLOB
39
- ) STRICT;
40
- `);
41
- const stmt = db.prepare('INSERT INTO types (key, int, double, text, buf) VALUES (?, ?, ?, ?, ?)');
42
-
43
- const r1 = stmt.run(1, 42, 3.14159, 'foo', u8a);
44
- expect(r1.changes).toBe(1);
45
- expect(r1.lastInsertRowid).toBe(1);
46
-
47
- const r2 = stmt.run(2, null, null, null, null);
48
- expect(r2.changes).toBe(1);
49
- expect(r2.lastInsertRowid).toBe(2);
50
-
51
- const query = db.prepare('SELECT * FROM types WHERE key = ?');
52
-
53
- const row1 = query.get(1) as Record<string, unknown>;
54
- expect(row1.key).toBe(1);
55
- expect(row1.int).toBe(42);
56
- expect(row1.double).toBe(3.14159);
57
- expect(row1.text).toBe('foo');
58
-
59
- const row2 = query.get(2) as Record<string, unknown>;
60
- expect(row2.key).toBe(2);
61
- expect(row2.int).toBeNull();
62
- expect(row2.double).toBeNull();
63
- expect(row2.text).toBeNull();
64
- expect(row2.buf).toBeNull();
65
-
66
- db.close();
67
- });
68
-
69
- await it('rejects unsupported data types', async () => {
70
- const db = new DatabaseSync(nextDb());
71
- db.exec('CREATE TABLE types(key INTEGER PRIMARY KEY, val INTEGER) STRICT;');
72
-
73
- const unsupported = [
74
- undefined,
75
- () => {},
76
- Symbol(),
77
- /foo/,
78
- Promise.resolve(),
79
- new Map(),
80
- new Set(),
81
- ];
82
-
83
- for (const val of unsupported) {
84
- expect(() => {
85
- // Intentionally pass non-SQLInputValue values to verify runtime rejection.
86
- db.prepare('INSERT INTO types (key, val) VALUES (?, ?)').run(1, val as any);
87
- }).toThrow();
88
- }
89
-
90
- db.close();
91
- });
92
-
93
- await it('supports BigInt binding', async () => {
94
- const db = new DatabaseSync(nextDb());
95
- db.exec('CREATE TABLE types(key INTEGER PRIMARY KEY, val INTEGER) STRICT;');
96
- const stmt = db.prepare('INSERT INTO types (key, val) VALUES (?, ?)');
97
- const result = stmt.run(4, 99n);
98
- expect(result.changes).toBe(1);
99
-
100
- const query = db.prepare('SELECT * FROM types WHERE key = ?');
101
- const row = query.get(4) as Record<string, unknown>;
102
- expect(row.val).toBe(99);
103
- db.close();
104
- });
105
-
106
- await it('throws when binding a BigInt that is too large', async () => {
107
- const max = 9223372036854775807n;
108
- const db = new DatabaseSync(nextDb());
109
- db.exec('CREATE TABLE types(key INTEGER PRIMARY KEY, val INTEGER) STRICT;');
110
- const stmt = db.prepare('INSERT INTO types (key, val) VALUES (?, ?)');
111
-
112
- // Max should succeed
113
- stmt.run(1, max);
114
-
115
- // Max + 1 should throw
116
- expect(() => {
117
- stmt.run(2, max + 1n);
118
- }).toThrow();
119
- db.close();
120
- });
121
-
122
- await it('statements are unbound on each call', async () => {
123
- const db = new DatabaseSync(nextDb());
124
- db.exec('CREATE TABLE data(key INTEGER PRIMARY KEY, val INTEGER) STRICT;');
125
- const stmt = db.prepare('INSERT INTO data (key, val) VALUES (?, ?)');
126
-
127
- const r1 = stmt.run(1, 5);
128
- expect(r1.changes).toBe(1);
129
-
130
- // Second call without params — params should be unbound (NULL)
131
- const r2 = stmt.run();
132
- expect(r2.changes).toBe(1);
133
-
134
- const rows = db.prepare('SELECT * FROM data ORDER BY key').all() as Record<string, unknown>[];
135
- expect(rows.length).toBe(2);
136
- expect(rows[0].key).toBe(1);
137
- expect(rows[0].val).toBe(5);
138
- expect(rows[1].val).toBeNull();
139
- db.close();
140
- });
141
- });
142
-
143
- cleanup();
144
- };