@sqb/sqljs 4.2.1 → 4.5.1

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/README.md ADDED
@@ -0,0 +1,67 @@
1
+
2
+ <p style="text-align:center">
3
+ <img src="https://user-images.githubusercontent.com/3836517/32965280-1a2b63ce-cbe7-11e7-8ee1-ba47313503c5.png" width="500px" alt="SQB Logo"/>
4
+ </p>
5
+
6
+ <br>
7
+
8
+ [![NPM Version][npm-image]][npm-url]
9
+ [![NPM Downloads][downloads-image]][downloads-url]
10
+ [![Build Status][travis-image]][travis-url]
11
+ [![Test Coverage][coveralls-image]][coveralls-url]
12
+ [![Dependencies][dependencies-image]][dependencies-url]
13
+ [![DevDependencies][devdependencies-image]][devdependencies-url]
14
+ [![Package Quality][quality-image]][quality-url]
15
+
16
+
17
+ ## About SQB
18
+
19
+ SQB is an extensible, multi-dialect SQL query builder and Database connection wrapper for NodeJS.
20
+
21
+ ## Main goals
22
+
23
+ - Single code base for any sql based database
24
+ - Powerful and simplified query coding scheme
25
+ - Fast applications with low memory requirements
26
+ - Let applications work with large data tables efficiently
27
+ - Support latest JavaScript language standards
28
+ - Lightweight and extensible framework.
29
+
30
+
31
+ You can report bugs and discuss features on the [GitHub issues](https://github.com/sqbjs/sqb/issues) page
32
+
33
+ Thanks to all of the great [contributions](https://github.com/sqbjs/sqb/graphs/contributors) to the project.
34
+
35
+ You may want to check detailed [DOCUMENTATION](https://sqbjs.github.io/sqb/)
36
+
37
+
38
+ ## Installation
39
+
40
+ ```bash
41
+ $ npm install @sqb/sqljs --save
42
+ ```
43
+
44
+ ## Node Compatibility
45
+
46
+ - node >= 16.x
47
+
48
+
49
+ ### License
50
+ SQB is available under [MIT](LICENSE) license.
51
+
52
+ [npm-image]: https://img.shields.io/npm/v/@sqb/sqljs.svg
53
+ [npm-url]: https://npmjs.org/package/@sqb/sqljs
54
+ [travis-image]: https://img.shields.io/travis/sqbjs/@sqb/sqljs/master.svg
55
+ [travis-url]: https://travis-ci.org/sqbjs/@sqb/sqljs
56
+ [coveralls-image]: https://img.shields.io/coveralls/sqbjs/@sqb/sqljs/master.svg
57
+ [coveralls-url]: https://coveralls.io/r/sqbjs/@sqb/sqljs
58
+ [downloads-image]: https://img.shields.io/npm/dm/@sqb/sqljs.svg
59
+ [downloads-url]: https://npmjs.org/package/@sqb/sqljs
60
+ [gitter-image]: https://badges.gitter.im/sqbjs/@sqb/sqljs.svg
61
+ [gitter-url]: https://gitter.im/sqbjs/@sqb/sqljs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
62
+ [dependencies-image]: https://david-dm.org/sqbjs/@sqb/sqljs/status.svg
63
+ [dependencies-url]:https://david-dm.org/sqbjs/@sqb/sqljs
64
+ [devdependencies-image]: https://david-dm.org/sqbjs/@sqb/sqljs/dev-status.svg
65
+ [devdependencies-url]:https://david-dm.org/sqbjs/@sqb/sqljs?type=dev
66
+ [quality-image]: http://npm.packagequality.com/shield/@sqb/sqljs.png
67
+ [quality-url]: http://packagequality.com/#?package=@sqb/sqljs
package/cjs/index.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const connect_1 = require("@sqb/connect");
4
+ const sqljs_adapter_js_1 = require("./sqljs-adapter.js");
5
+ (0, connect_1.registerAdapter)(new sqljs_adapter_js_1.SqljsAdapter());
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -7,17 +7,15 @@ const fs_1 = tslib_1.__importDefault(require("fs"));
7
7
  const path_1 = tslib_1.__importDefault(require("path"));
8
8
  const putil_promisify_1 = tslib_1.__importDefault(require("putil-promisify"));
9
9
  const sql_js_1 = tslib_1.__importDefault(require("sql.js"));
10
- const SqljsConnection_1 = require("./SqljsConnection");
10
+ const sqljs_connection_js_1 = require("./sqljs-connection.js");
11
11
  const dbCache = new Map();
12
12
  class SqljsAdapter {
13
- constructor() {
14
- this.driver = 'sqljs';
15
- this.dialect = 'sqlite';
16
- this.features = {
17
- cursor: true,
18
- // fetchAsString: [DataType.DATE, DataType.TIMESTAMP, DataType.TIMESTAMPTZ]
19
- };
20
- }
13
+ driver = 'sqljs';
14
+ dialect = 'sqlite';
15
+ features = {
16
+ cursor: true,
17
+ // fetchAsString: [DataType.DATE, DataType.TIMESTAMP, DataType.TIMESTAMPTZ]
18
+ };
21
19
  async connect(config) {
22
20
  if (!config.database)
23
21
  throw new Error('You must provide sqlite database file for sql.js driver');
@@ -49,7 +47,7 @@ class SqljsAdapter {
49
47
  dbCache.set(dbName, intlDb);
50
48
  }
51
49
  const _intlDb = intlDb;
52
- return new SqljsConnection_1.SqljsConnection(_intlDb, () => {
50
+ return new sqljs_connection_js_1.SqljsConnection(_intlDb, () => {
53
51
  if (isMemory)
54
52
  return;
55
53
  if (--_intlDb._refCount <= 0) {
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SqljsConnection = void 0;
4
- const SqljsCursor_1 = require("./SqljsCursor");
4
+ const sqljs_cursor_js_1 = require("./sqljs-cursor.js");
5
5
  class SqljsConnection {
6
+ _onClose;
7
+ intlcon;
6
8
  constructor(db, _onClose) {
7
9
  this._onClose = _onClose;
8
10
  this.intlcon = db;
@@ -109,7 +111,7 @@ class SqljsConnection {
109
111
  out.fields = this._convertFields(colNames);
110
112
  const rowType = query.objectRows ? 'object' : 'array';
111
113
  out.rowType = rowType;
112
- const cursor = new SqljsCursor_1.SqljsCursor(stmt, { rowType });
114
+ const cursor = new sqljs_cursor_js_1.SqljsCursor(stmt, { rowType });
113
115
  if (query.cursor) {
114
116
  out.cursor = cursor;
115
117
  stmt = undefined;
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SqljsCursor = void 0;
4
4
  class SqljsCursor {
5
+ _stmt;
6
+ _rowType;
5
7
  constructor(stmt, opts) {
6
8
  this._rowType = opts.rowType;
7
9
  this._stmt = stmt;
File without changes
package/esm/index.js ADDED
@@ -0,0 +1,3 @@
1
+ import { registerAdapter } from '@sqb/connect';
2
+ import { SqljsAdapter } from './sqljs-adapter.js';
3
+ registerAdapter(new SqljsAdapter());
@@ -0,0 +1,63 @@
1
+ import '@sqb/sqlite-dialect';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import promisify from 'putil-promisify';
5
+ import initSqlJs from 'sql.js';
6
+ import { SqljsConnection } from './sqljs-connection.js';
7
+ const dbCache = new Map();
8
+ export class SqljsAdapter {
9
+ driver = 'sqljs';
10
+ dialect = 'sqlite';
11
+ features = {
12
+ cursor: true,
13
+ // fetchAsString: [DataType.DATE, DataType.TIMESTAMP, DataType.TIMESTAMPTZ]
14
+ };
15
+ async connect(config) {
16
+ if (!config.database)
17
+ throw new Error('You must provide sqlite database file for sql.js driver');
18
+ let dbName = '';
19
+ let isMemory = false;
20
+ const m = config.database.match(/^(:memory:)(\w+)?$/);
21
+ if (m) {
22
+ isMemory = true;
23
+ dbName = config.database;
24
+ }
25
+ else {
26
+ dbName = path.resolve(config.database);
27
+ }
28
+ let intlDb = dbCache.get(dbName);
29
+ if (intlDb) {
30
+ intlDb._refCount++;
31
+ }
32
+ else {
33
+ const SQL = await initSqlJs();
34
+ if (isMemory) {
35
+ intlDb = new SQL.Database();
36
+ intlDb._refCount = 0;
37
+ }
38
+ else {
39
+ const buf = await promisify.fromCallback(cb => fs.readFile(dbName, cb));
40
+ intlDb = new SQL.Database(buf);
41
+ intlDb._refCount = 1;
42
+ }
43
+ dbCache.set(dbName, intlDb);
44
+ }
45
+ const _intlDb = intlDb;
46
+ return new SqljsConnection(_intlDb, () => {
47
+ if (isMemory)
48
+ return;
49
+ if (--_intlDb._refCount <= 0) {
50
+ _intlDb.close();
51
+ dbCache.delete(dbName);
52
+ }
53
+ });
54
+ }
55
+ }
56
+ export async function closeMemoryDatabase(name) {
57
+ const memoryDbName = name || ':memory:';
58
+ const memDb = dbCache.get(memoryDbName);
59
+ if (memDb) {
60
+ dbCache.delete(memoryDbName);
61
+ memDb.close();
62
+ }
63
+ }
@@ -0,0 +1,144 @@
1
+ import { SqljsCursor } from './sqljs-cursor.js';
2
+ export class SqljsConnection {
3
+ _onClose;
4
+ intlcon;
5
+ constructor(db, _onClose) {
6
+ this._onClose = _onClose;
7
+ this.intlcon = db;
8
+ }
9
+ get sessionId() {
10
+ return 0;
11
+ }
12
+ async close() {
13
+ if (this.intlcon) {
14
+ this.intlcon = undefined;
15
+ await this._onClose();
16
+ }
17
+ }
18
+ async reset() {
19
+ return this.rollback();
20
+ }
21
+ async startTransaction() {
22
+ assertDefined(this.intlcon);
23
+ try {
24
+ this.intlcon.exec('BEGIN TRANSACTION;');
25
+ }
26
+ catch (e) {
27
+ if (e instanceof Error && e.message.match(/within a transaction/))
28
+ return;
29
+ throw e;
30
+ }
31
+ }
32
+ async commit() {
33
+ assertDefined(this.intlcon);
34
+ try {
35
+ this.intlcon.exec('COMMIT;');
36
+ }
37
+ catch (e) {
38
+ if (e instanceof Error && e.message.match(/no transaction/))
39
+ return;
40
+ throw e;
41
+ }
42
+ }
43
+ async rollback() {
44
+ assertDefined(this.intlcon);
45
+ try {
46
+ this.intlcon.exec('ROLLBACK;');
47
+ }
48
+ catch (e) {
49
+ if (e instanceof Error && e.message.match(/no transaction/))
50
+ return;
51
+ throw e;
52
+ }
53
+ }
54
+ async test() {
55
+ assertDefined(this.intlcon);
56
+ this.intlcon.exec('select 1');
57
+ }
58
+ async execute(query) {
59
+ assertDefined(this.intlcon);
60
+ if (!query.autoCommit)
61
+ await this.startTransaction();
62
+ const out = {};
63
+ let params;
64
+ if (query.params) {
65
+ const prms = query.params;
66
+ params = Object.keys(prms).reduce((obj, k) => {
67
+ obj[':' + k] = prms[k];
68
+ return obj;
69
+ }, {});
70
+ }
71
+ const m = query.sql.match(/\b(insert into|update|delete from)\b ("?\w+"?)/i);
72
+ if (m) {
73
+ const stmt = this.intlcon.prepare(query.sql);
74
+ stmt.run(params);
75
+ stmt.free();
76
+ out.rowsAffected = this.intlcon.getRowsModified();
77
+ if (query.autoCommit)
78
+ await this.commit();
79
+ if (out.rowsAffected === 1 && query.returningFields) {
80
+ const selectFields = query.returningFields.map(x => x.field + (x.alias ? ' as ' + x.alias : ''));
81
+ let sql = `select ${selectFields.join(',')} from ${m[2]}\n`;
82
+ // Emulate insert into ... returning
83
+ if (m[1].toLowerCase() === 'insert into') {
84
+ sql += 'where rowid=last_insert_rowid();';
85
+ const r = this.intlcon.exec(sql);
86
+ if (r.length) {
87
+ out.fields = this._convertFields(r[0].columns);
88
+ out.rows = r[0].values;
89
+ out.rowType = 'array';
90
+ }
91
+ return out;
92
+ }
93
+ else
94
+ // Emulate update ... returning
95
+ if (m[1].toLowerCase() === 'update') {
96
+ const m2 = query.sql.match(/where (.+)/);
97
+ query = { ...query };
98
+ query.sql = sql + (m2 ? ' where ' + m2[1] : '');
99
+ }
100
+ else
101
+ return out;
102
+ }
103
+ }
104
+ let stmt = this.intlcon.prepare(query.sql, query.params);
105
+ try {
106
+ const colNames = stmt.getColumnNames();
107
+ if (colNames && colNames.length) {
108
+ out.fields = this._convertFields(colNames);
109
+ const rowType = query.objectRows ? 'object' : 'array';
110
+ out.rowType = rowType;
111
+ const cursor = new SqljsCursor(stmt, { rowType });
112
+ if (query.cursor) {
113
+ out.cursor = cursor;
114
+ stmt = undefined;
115
+ }
116
+ else
117
+ out.rows = await cursor.fetch(query.fetchRows || 100);
118
+ }
119
+ return out;
120
+ }
121
+ finally {
122
+ if (stmt)
123
+ stmt.free();
124
+ }
125
+ }
126
+ _convertFields(fields) {
127
+ const result = [];
128
+ for (let i = 0; i < fields.length; i++) {
129
+ const v = fields[i];
130
+ const o = {
131
+ fieldName: v,
132
+ dataType: 'any',
133
+ jsType: 'any',
134
+ _inf: { name: v }
135
+ };
136
+ result.push(o);
137
+ }
138
+ return result;
139
+ }
140
+ }
141
+ function assertDefined(d) {
142
+ if (d == null)
143
+ throw new Error("Invalid data");
144
+ }
File without changes
@@ -0,0 +1,30 @@
1
+ export class SqljsCursor {
2
+ _stmt;
3
+ _rowType;
4
+ constructor(stmt, opts) {
5
+ this._rowType = opts.rowType;
6
+ this._stmt = stmt;
7
+ }
8
+ get isClosed() {
9
+ return !this._stmt;
10
+ }
11
+ get rowType() {
12
+ return this._rowType;
13
+ }
14
+ async close() {
15
+ if (!this._stmt)
16
+ return;
17
+ this._stmt.free();
18
+ this._stmt = undefined;
19
+ }
20
+ async fetch(nRows) {
21
+ if (!this._stmt)
22
+ return;
23
+ const stmt = this._stmt;
24
+ const rows = [];
25
+ while (nRows-- && stmt.step()) {
26
+ rows.push(this.rowType === 'object' ? stmt.getAsObject() : stmt.get());
27
+ }
28
+ return rows;
29
+ }
30
+ }
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@sqb/sqljs",
3
3
  "description": "SQB serialization extension for sql.js driver",
4
- "version": "4.2.1",
4
+ "version": "4.5.1",
5
5
  "author": "Panates",
6
6
  "contributors": [
7
- "Eray Hanoglu <e.hanoglu@panates.com>"
7
+ "Eray Hanoglu <e.hanoglu@panates.com>",
8
+ "Ilker Gurelli <i.gurelli@panates.com>"
8
9
  ],
9
10
  "license": "Apache-2.0",
10
11
  "repository": {
@@ -12,52 +13,66 @@
12
13
  "url": "https://github.com/sqbjs/sqb.git",
13
14
  "directory": "packages/sqljs"
14
15
  },
15
- "keywords": [
16
- "javascript",
17
- "typescript",
18
- "sql",
19
- "query",
20
- "builder",
21
- "dialect",
22
- "sqlite",
23
- "sql.js",
24
- "database"
25
- ],
16
+ "scripts": {
17
+ "compile": "tsc",
18
+ "prebuild": "npm run lint && npm run clean",
19
+ "build": "npm run build:cjs && npm run build:esm",
20
+ "build:cjs": "tsc -b tsconfig-build-cjs.json",
21
+ "build:esm": "tsc -b tsconfig-build-esm.json",
22
+ "postbuild": "cp README.md package.json ../../LICENSE ../../build/sqljs && cp ../../package.cjs.json ../../build/sqljs/cjs/package.json",
23
+ "lint": "eslint .",
24
+ "test": "jest",
25
+ "cover": "jest --collect-coverage",
26
+ "clean": "npm run clean:src | npm run clean:dist | npm run clean:cover",
27
+ "clean:src": "ts-cleanup -s src --all",
28
+ "clean:dist": "rimraf ../../build/sqljs",
29
+ "clean:cover": "rimraf ../../coverage/sqljs"
30
+ },
26
31
  "dependencies": {
27
32
  "putil-promisify": "^1.8.5"
28
33
  },
29
34
  "devDependencies": {
30
35
  "@types/sql.js": "^1.4.3",
31
- "sql.js": "^1.7.0"
36
+ "sql.js": "^1.8.0"
32
37
  },
33
38
  "peerDependencies": {
34
- "@sqb/builder": "^4.2.0",
35
- "@sqb/connect": "^4.2.0",
36
- "@sqb/sqlite-dialect": "^4.2.0",
37
- "sql.js": "^1.4.0"
39
+ "@sqb/builder": "^4.5.0",
40
+ "@sqb/connect": "^4.5.0",
41
+ "@sqb/sqlite-dialect": "^4.5.0",
42
+ "sql.js": "^1.8.0"
38
43
  },
39
- "main": "dist/index.js",
40
- "types": "dist/index.d.ts",
41
- "engines": {
42
- "node": ">= 16.0"
44
+ "type": "module",
45
+ "main": "cjs/index.js",
46
+ "module": "esm/index.js",
47
+ "types": "esm/index.d.ts",
48
+ "exports": {
49
+ ".": {
50
+ "require": "./cjs/index.js",
51
+ "default": "./esm/index.js"
52
+ },
53
+ "./cjs": "./cjs/index.js",
54
+ "./esm": "./esm/index.js"
43
55
  },
44
- "directories": {
45
- "lib": "dist",
46
- "test": "test"
56
+ "engines": {
57
+ "node": ">=16.0",
58
+ "npm": ">=7.0.0"
47
59
  },
48
60
  "files": [
61
+ "bin/",
62
+ "cjs/",
63
+ "esm/",
49
64
  "LICENSE",
50
- "README",
51
- "dist/"
65
+ "README.md"
52
66
  ],
53
- "scripts": {
54
- "build": "tsc -b tsconfig-build.json",
55
- "prebuild": "npm run lint && npm run clean:dist",
56
- "postbuild": "copyfiles package.json README.md LICENSE ../../build/sqljs",
57
- "clean": "ts-cleanup -s src --all & ts-cleanup -s test",
58
- "clean:dist": "rimraf ../../build/sqljs",
59
- "compile": "tsc",
60
- "lint": "eslint src/** --no-error-on-unmatched-pattern",
61
- "test": "TS_NODE_PROJECT='./test/tsconfig.json' mocha -r ts-node/register -r tsconfig-paths/register --reporter spec test/**/*.spec.ts"
62
- }
67
+ "keywords": [
68
+ "sqb",
69
+ "sqlite",
70
+ "sql.js",
71
+ "sql",
72
+ "query",
73
+ "builder",
74
+ "dialect",
75
+ "serializer",
76
+ "database"
77
+ ]
63
78
  }
package/dist/index.js DELETED
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const connect_1 = require("@sqb/connect");
4
- const SqljsAdapter_1 = require("./SqljsAdapter");
5
- (0, connect_1.registerAdapter)(new SqljsAdapter_1.SqljsAdapter());