orange-orm 4.5.5 → 4.6.0-beta.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.
Files changed (59) hide show
  1. package/README.md +18 -16
  2. package/{src/client/index.mjs → dist/index.browser.mjs} +33 -12
  3. package/dist/index.mjs +20127 -0
  4. package/docs/changelog.md +3 -0
  5. package/package.json +15 -4
  6. package/src/bunPg/newDatabase.js +137 -0
  7. package/src/bunPg/newPool.js +19 -0
  8. package/src/bunPg/newTransaction.js +87 -0
  9. package/src/bunPg/pool/end.js +13 -0
  10. package/src/bunPg/pool/newPgPool.js +77 -0
  11. package/src/bunPg/wrapQuery.js +97 -0
  12. package/src/bunSqlite/newPool.js +19 -0
  13. package/src/bunSqlite/newTransaction.js +88 -0
  14. package/src/bunSqlite/pool/newGenericPool.js +55 -0
  15. package/src/bunSqlite/wrapQuery.js +23 -0
  16. package/src/d1/newTransaction.js +2 -2
  17. package/src/d1/wrapQuery.js +1 -1
  18. package/src/index.js +20 -4
  19. package/src/merge-browser.js +9 -0
  20. package/src/merge-server.js +9 -0
  21. package/src/mssql/newTransaction.js +2 -2
  22. package/src/mssql/pool/newGenericPool.js +9 -2
  23. package/src/mssql/wrapQuery.js +1 -1
  24. package/src/mySql/newTransaction.js +2 -2
  25. package/src/mySql/pool/newGenericPool.js +11 -2
  26. package/src/mySql/wrapQuery.js +1 -1
  27. package/src/nodeSqlite/decodeBinary.js +9 -0
  28. package/src/nodeSqlite/encodeBinary.js +17 -0
  29. package/src/nodeSqlite/newDatabase.js +116 -0
  30. package/src/nodeSqlite/newPool.js +19 -0
  31. package/src/nodeSqlite/newTransaction.js +88 -0
  32. package/src/nodeSqlite/pool/newGenericPool.js +50 -0
  33. package/src/nodeSqlite/wrapQuery.js +23 -0
  34. package/src/oracle/newTransaction.js +2 -2
  35. package/src/oracle/pool/newGenericPool.js +13 -5
  36. package/src/oracle/wrapQuery.js +1 -1
  37. package/src/pg/newDatabase.js +0 -5
  38. package/src/pg/newTransaction.js +2 -2
  39. package/src/pg/pool/newPgPool.js +15 -3
  40. package/src/pg/wrapQuery.js +1 -1
  41. package/src/{client/rollup.config.js → rollup.config.browser.js} +1 -1
  42. package/src/rollup.config.server.js +32 -0
  43. package/src/runtimes.js +24 -0
  44. package/src/sap/newTransaction.js +2 -2
  45. package/src/sqlite3/encodeBuffer.js +7 -0
  46. package/src/sqlite3/newDatabase.js +116 -0
  47. package/src/{sqlite → sqlite3}/newTransaction.js +10 -10
  48. package/src/sqlite3/pool/end.js +13 -0
  49. package/src/{sqlite → sqlite3}/pool/newGenericPool.js +10 -2
  50. package/src/{sqlite → sqlite3}/wrapQuery.js +1 -1
  51. package/src/table/column/binary/newDecode.js +13 -2
  52. package/src/table/column/binary/newEncode.js +16 -6
  53. package/src/table/resultToRows/newDecodeDbRow.js +1 -1
  54. package/src/tedious/newTransaction.js +2 -2
  55. package/src/tedious/pool/newGenericPool.js +8 -2
  56. package/src/tedious/wrapQuery.js +41 -18
  57. package/src/client/merge.js +0 -9
  58. /package/src/{sqlite → bunSqlite}/newDatabase.js +0 -0
  59. /package/src/{sqlite → sqlite3}/newPool.js +0 -0
@@ -0,0 +1,32 @@
1
+ import json from '@rollup/plugin-json';
2
+ import commonjs from '@rollup/plugin-commonjs';
3
+ import nodeResolve from '@rollup/plugin-node-resolve';
4
+
5
+ export default {
6
+ input: './src/index.js',
7
+ output: {
8
+ file: './dist/index.mjs',
9
+ format: 'esm',
10
+ interop: 'auto'
11
+ },
12
+
13
+ // plugins: [json(), commonjs()],
14
+ plugins: [json(), nodeResolve({ preferBuiltins: false }), commonjs({
15
+ transformMixedEsModules: true,
16
+ esmExternals: true, // Add this
17
+ requireReturnsDefault: 'preferred' // Change this
18
+ })],
19
+ external(id) {
20
+ // If it's in node_modules, mark as external
21
+ return id.includes('node_modules');
22
+ },
23
+ onwarn: (warning, warn) => {
24
+ if (warning.code === 'CIRCULAR_DEPENDENCY') {
25
+ // Log the full circular dependency warning message
26
+ console.warn(`[CIRCULAR DEPENDENCY] ${warning.message}`);
27
+ } else {
28
+ // For all other warnings, use Rollup's default handler.
29
+ warn(warning);
30
+ }
31
+ },
32
+ };
@@ -0,0 +1,24 @@
1
+ // @ts-ignore
2
+ // eslint-disable-next-line no-undef
3
+ const deno = typeof Deno !== 'undefined' && Deno.version?.deno;
4
+ // @ts-ignore
5
+ // eslint-disable-next-line no-undef
6
+ const bun = typeof Bun !== 'undefined' && Bun.version;
7
+ const node = (typeof process !== 'undefined' && process.versions?.node && !deno && !bun) ? process.versions.node : false;
8
+
9
+ function parseVersion(version) {
10
+ if (version) {
11
+ const versionArray = version.split('.');
12
+ return {
13
+ version,
14
+ major: parseInt(versionArray[0]),
15
+ minor: parseInt(versionArray[1]),
16
+ patch: parseInt(versionArray[2])
17
+ };
18
+ }
19
+ else
20
+ return false;
21
+ }
22
+
23
+
24
+ module.exports = { deno: parseVersion(deno), bun: parseVersion(bun), node: parseVersion(node) };
@@ -52,7 +52,7 @@ function newResolveTransaction(domain, pool, { readonly = false } = {}) {
52
52
  return callback(err);
53
53
  }
54
54
  try {
55
- wrapQuery(client)(query, (err, res) => {
55
+ wrapQuery(domain, client)(query, (err, res) => {
56
56
  done();
57
57
  callback(err, res);
58
58
  });
@@ -77,7 +77,7 @@ function newResolveTransaction(domain, pool, { readonly = false } = {}) {
77
77
  onError(err);
78
78
  return;
79
79
  }
80
- client.executeQuery = wrapQuery(client);
80
+ client.executeQuery = wrapQuery(domain, client);
81
81
  rdb.dbClient = client;
82
82
  rdb.dbClientDone = done;
83
83
  domain.rdb = rdb;
@@ -0,0 +1,7 @@
1
+ //unused because using sql parameters instead
2
+ //Remove ?
3
+ function encodeBuffer(buffer) {
4
+ return 'E\'\\\\x' + buffer.toString('hex') + '\'';
5
+ }
6
+
7
+ module.exports = encodeBuffer;
@@ -0,0 +1,116 @@
1
+ let createDomain = require('../createDomain');
2
+ let newTransaction = require('./newTransaction');
3
+ let _begin = require('../table/begin');
4
+ let commit = require('../table/commit');
5
+ let rollback = require('../table/rollback');
6
+ let newPool = require('./newPool');
7
+ let express = require('../hostExpress');
8
+ let hostLocal = require('../hostLocal');
9
+ let doQuery = require('../query');
10
+ let releaseDbClient = require('../table/releaseDbClient');
11
+ let setSessionSingleton = require('../table/setSessionSingleton');
12
+
13
+ function newDatabase(connectionString, poolOptions) {
14
+ if (!connectionString)
15
+ throw new Error('Connection string cannot be empty');
16
+ var pool;
17
+ if (!poolOptions)
18
+ pool = newPool.bind(null,connectionString, poolOptions);
19
+ else
20
+ pool = newPool(connectionString, poolOptions);
21
+
22
+ let c = {poolFactory: pool, hostLocal, express};
23
+
24
+ c.transaction = function(options, fn) {
25
+ if ((arguments.length === 1) && (typeof options === 'function')) {
26
+ fn = options;
27
+ options = undefined;
28
+ }
29
+ let domain = createDomain();
30
+
31
+ if (fn)
32
+ return domain.run(runInTransaction);
33
+ else
34
+ return domain.run(run);
35
+
36
+ function begin() {
37
+ return _begin(domain, options);
38
+ }
39
+
40
+ async function runInTransaction() {
41
+ let result;
42
+ let transaction = newTransaction(domain, pool, options);
43
+ await new Promise(transaction)
44
+ .then(begin)
45
+ .then(() => fn(domain))
46
+ .then((res) => result = res)
47
+ .then(() => commit(domain))
48
+ .then(null, (e) => rollback(domain, e));
49
+ return result;
50
+ }
51
+
52
+ function run() {
53
+ let p;
54
+ let transaction = newTransaction(domain, pool, options);
55
+ p = new Promise(transaction);
56
+
57
+ return p.then(begin);
58
+ }
59
+
60
+ };
61
+
62
+ c.createTransaction = function(options) {
63
+ let domain = createDomain();
64
+ let transaction = newTransaction(domain, pool);
65
+ let p = domain.run(() => new Promise(transaction).then(begin));
66
+
67
+ function run(fn) {
68
+ return p.then(() => fn(domain));
69
+ }
70
+ run.rollback = rollback.bind(null, domain);
71
+ run.commit = commit.bind(null, domain);
72
+ return run;
73
+
74
+ function begin() {
75
+ return _begin(domain, options);
76
+ }
77
+ };
78
+
79
+ c.query = function(query) {
80
+ let domain = createDomain();
81
+ let transaction = newTransaction(domain, pool);
82
+ let p = domain.run(() => new Promise(transaction)
83
+ .then(() => setSessionSingleton(domain, 'changes', []))
84
+ .then(() => doQuery(domain, query).then(onResult, onError)));
85
+ return p;
86
+
87
+ function onResult(result) {
88
+ releaseDbClient(domain);
89
+ return result;
90
+ }
91
+
92
+ function onError(e) {
93
+ releaseDbClient(domain);
94
+ throw e;
95
+ }
96
+ };
97
+
98
+
99
+ c.rollback = rollback;
100
+ c.commit = commit;
101
+
102
+ c.end = function() {
103
+ if (poolOptions)
104
+ return pool.end();
105
+ else
106
+ return Promise.resolve();
107
+ };
108
+
109
+ c.accept = function(caller) {
110
+ caller.visitSqlite();
111
+ };
112
+
113
+ return c;
114
+ }
115
+
116
+ module.exports = newDatabase;
@@ -1,12 +1,12 @@
1
1
  const wrapQuery = require('./wrapQuery');
2
- const encodeBoolean = require('./encodeBoolean');
3
- const deleteFromSql = require('./deleteFromSql');
4
- const selectForUpdateSql = require('./selectForUpdateSql');
5
- const lastInsertedSql = require('./lastInsertedSql');
6
- const limitAndOffset = require('./limitAndOffset');
7
- const insertSql = require('./insertSql');
8
- const insert = require('./insert');
9
- const quote = require('./quote');
2
+ const encodeBoolean = require('../sqlite/encodeBoolean');
3
+ const deleteFromSql = require('../sqlite/deleteFromSql');
4
+ const selectForUpdateSql = require('../sqlite/selectForUpdateSql');
5
+ const lastInsertedSql = require('../sqlite/lastInsertedSql');
6
+ const limitAndOffset = require('../sqlite/limitAndOffset');
7
+ const insertSql = require('../sqlite/insertSql');
8
+ const insert = require('../sqlite/insert');
9
+ const quote = require('../sqlite/quote');
10
10
 
11
11
  function newResolveTransaction(domain, pool, { readonly = false } = {}) {
12
12
  var rdb = {poolFactory: pool};
@@ -41,7 +41,7 @@ function newResolveTransaction(domain, pool, { readonly = false } = {}) {
41
41
  return callback(err);
42
42
  }
43
43
  try {
44
- wrapQuery(client)(query, (err, res) => {
44
+ wrapQuery(domain, client)(query, (err, res) => {
45
45
  done();
46
46
  callback(err, res);
47
47
  });
@@ -65,7 +65,7 @@ function newResolveTransaction(domain, pool, { readonly = false } = {}) {
65
65
  onError(err);
66
66
  return;
67
67
  }
68
- client.executeQuery = wrapQuery(client);
68
+ client.executeQuery = wrapQuery(domain, client);
69
69
  rdb.dbClient = client;
70
70
  rdb.dbClientDone = done;
71
71
  domain.rdb = rdb;
@@ -0,0 +1,13 @@
1
+ var pools = require('../../pools');
2
+
3
+ function endPool(genericPool, id, done) {
4
+ genericPool.drain(onDrained);
5
+
6
+ function onDrained() {
7
+ genericPool.destroyAllNow();
8
+ delete pools[id];
9
+ done();
10
+ }
11
+ }
12
+
13
+ module.exports = endPool;
@@ -2,7 +2,7 @@
2
2
  var defaults = require('../../poolDefaults');
3
3
 
4
4
  var genericPool = require('../../generic-pool');
5
- var sqlite = require('sqlite3');
5
+ var sqlite;
6
6
 
7
7
  function newGenericPool(connectionString, poolOptions) {
8
8
  poolOptions = poolOptions || {};
@@ -11,7 +11,15 @@ function newGenericPool(connectionString, poolOptions) {
11
11
  idleTimeoutMillis: poolOptions.idleTimeout || defaults.poolIdleTimeout,
12
12
  reapIntervalMillis: poolOptions.reapIntervalMillis || defaults.reapIntervalMillis,
13
13
  log: poolOptions.log || defaults.poolLog,
14
- create: function(cb) {
14
+ create: async function(cb) {
15
+ try {
16
+ if (!sqlite)
17
+ sqlite = await import('sqlite3');
18
+ sqlite = sqlite.default || sqlite;
19
+ }
20
+ catch (err) {
21
+ return cb(err, null);
22
+ }
15
23
  var client = new sqlite.Database(connectionString, onConnected);
16
24
 
17
25
  function onConnected(err) {
@@ -1,6 +1,6 @@
1
1
  var log = require('../table/log');
2
2
 
3
- function wrapQuery(connection) {
3
+ function wrapQuery(_context, connection) {
4
4
  var runOriginalQuery = connection.all;
5
5
  return runQuery;
6
6
 
@@ -1,15 +1,26 @@
1
1
  var newDecodeCore = require('../newDecodeCore');
2
+ var getSessionSingleton = require('../../getSessionSingleton');
2
3
 
3
4
  function _new(column) {
4
5
  var decodeCore = newDecodeCore(column);
5
6
 
6
7
  return function(context, value) {
8
+
9
+ var toBase64 = getSessionSingleton(context, 'decodeBinary') || toBase64Default;
10
+
7
11
  value = decodeCore(context, value);
8
12
  if (value === null)
9
13
  return value;
10
- else
11
- return value.toString('base64');
14
+ else {
15
+ const ret = toBase64(value);
16
+ return ret;
17
+ }
12
18
  };
13
19
  }
14
20
 
21
+ function toBase64Default(buffer) {
22
+ return buffer.toString('base64');
23
+
24
+ }
25
+
15
26
  module.exports = _new;
@@ -1,26 +1,36 @@
1
1
  var purify = require('./purify');
2
2
  var newParam = require('../../query/newParameterized');
3
+ var getSessionSingleton = require('../../getSessionSingleton');
3
4
 
4
5
  function _new(_column) {
5
6
 
6
- function encode(_context, value) {
7
+ function encode(context, value) {
7
8
  value = purify(value);
8
9
  if (value === null)
9
10
  return newParam('null');
10
- return newParam('?', [Buffer.from(value, 'base64')]);
11
+
12
+ var encodeCore = getSessionSingleton(context, 'encodeBinary') || encodeDefault;
13
+ const enc = encodeCore(value);
14
+ return newParam('?', [enc]);
11
15
  }
12
- encode.unsafe = function(_context, value) {
16
+ encode.unsafe = function(context, value) {
13
17
  value = purify(value);
14
18
  if (value === null)
15
19
  return 'null';
16
- return Buffer.from(value, 'base64');
20
+ var encodeCore = getSessionSingleton(context, 'encodeBinary') || encodeDefault;
21
+ return encodeCore(value);
17
22
  };
18
23
 
19
- encode.direct = function(_context, value) {
20
- return Buffer.from(value, 'base64');
24
+ encode.direct = function(context, value) {
25
+ var encodeCore = getSessionSingleton(context, 'encodeBinary') || encodeDefault;
26
+ return encodeCore(value);
21
27
  };
22
28
 
23
29
  return encode;
24
30
  }
25
31
 
32
+ function encodeDefault(base64) {
33
+ return Buffer.from(base64, 'base64');
34
+ }
35
+
26
36
  module.exports = _new;
@@ -207,7 +207,7 @@ function newDecodeDbRow(table, dbRow, filteredAliases, shouldValidate, isInsert)
207
207
  for (let i = 0; i < numberOfColumns; i++) {
208
208
  let index = offset + i;
209
209
  let key = keys[index];
210
- if (row[key] !== undefined)
210
+ if (row[key] !== undefined && !isInsert)
211
211
  row[key] = columns[i].decode(context, row[key]);
212
212
  if (shouldValidate && columns[i].validate)
213
213
  columns[i].validate(row[key], row, isInsert);
@@ -54,7 +54,7 @@ function newResolveTransaction(domain, pool, { readonly = false } = {}) {
54
54
  return callback(err);
55
55
  }
56
56
  try {
57
- wrapQuery(client)(query, (err, res) => {
57
+ wrapQuery(domain, client)(query, (err, res) => {
58
58
  done();
59
59
  callback(err, res);
60
60
  });
@@ -78,7 +78,7 @@ function newResolveTransaction(domain, pool, { readonly = false } = {}) {
78
78
  onError(err);
79
79
  return;
80
80
  }
81
- client.executeQuery = wrapQuery(client);
81
+ client.executeQuery = wrapQuery(domain, client);
82
82
  rdb.dbClient = client;
83
83
  rdb.dbClientDone = done;
84
84
  domain.rdb = rdb;
@@ -3,7 +3,7 @@
3
3
 
4
4
  var defaults = require('../../poolDefaults');
5
5
  var genericPool = require('../../generic-pool');
6
- var tedious = require('tedious');
6
+ var tedious;
7
7
  var parseConnectionString = require('./parseConnectionString');
8
8
 
9
9
  function newGenericPool(connectionString, poolOptions) {
@@ -17,7 +17,13 @@ function newGenericPool(connectionString, poolOptions) {
17
17
  idleTimeoutMillis: poolOptions.idleTimeout || defaults.poolIdleTimeout,
18
18
  reapIntervalMillis: poolOptions.reapIntervalMillis || defaults.reapIntervalMillis,
19
19
  log: poolOptions.log || defaults.poolLog,
20
- create: function(cb) {
20
+ create: async function(cb) {
21
+ try {
22
+ if (!tedious)
23
+ tedious = await import('tedious');
24
+ } catch (err) {
25
+ return cb(err, null);
26
+ }
21
27
  var client = new tedious.Connection(connectionString);
22
28
  client.on('connect', onConnected);
23
29
  client.connect();
@@ -1,12 +1,31 @@
1
1
  var log = require('../table/log');
2
- var { Request, TYPES } = require('tedious');
3
2
 
4
- function wrapQuery(connection) {
3
+ function wrapQuery(_context, connection) {
4
+ let CachedRequest = null;
5
+ let CachedTypes = null;
6
+
5
7
  return runQuery;
6
8
 
7
9
  function runQuery(query, onCompleted) {
10
+ if (!CachedRequest || !CachedTypes) {
11
+ import('tedious')
12
+ .then(({ Request, TYPES }) => {
13
+ CachedRequest = Request;
14
+ CachedTypes = TYPES;
15
+ doQuery(query, onCompleted);
16
+ })
17
+ .catch(err => onCompleted(extractError(err), []));
18
+ }
19
+ else {
20
+ doQuery(query, onCompleted);
21
+ }
22
+ }
23
+
24
+ function doQuery(query, onCompleted) {
8
25
  const result = [];
9
26
  const sql = replaceParamChar(query.sql(), query.parameters);
27
+
28
+ // Transaction statements
10
29
  if (sql.length < 18 && query.parameters.length === 0) {
11
30
  if (sql === 'BEGIN TRANSACTION') {
12
31
  log.emitQuery({ sql, parameters: [] });
@@ -30,38 +49,45 @@ function wrapQuery(connection) {
30
49
  return;
31
50
  }
32
51
  }
52
+
33
53
  let keys;
34
- var request = new Request(sql, onInnerCompleted);
35
- const params = addParameters(request, query.parameters);
54
+ // Now we can safely create Request using CachedRequest
55
+ var request = new CachedRequest(sql, onInnerCompleted);
56
+ const params = addParameters(request, query.parameters, CachedTypes);
57
+
36
58
  request.on('row', rows => {
37
59
  const tmp = {};
38
60
  if (!keys) {
39
61
  keys = Object.keys(rows);
40
62
  }
41
- keys.forEach((cols) => {
63
+ keys.forEach(cols => {
42
64
  tmp[cols] = rows[cols].value;
43
65
  });
44
66
  result.push(tmp);
45
67
  });
68
+
46
69
  log.emitQuery({ sql, parameters: params });
47
70
  connection.execSql(request);
48
71
 
49
72
  function onInnerCompleted(err) {
50
73
  if (err) {
51
74
  onCompleted(extractError(err));
52
- }
53
- else
75
+ } else {
54
76
  onCompleted(null, result);
77
+ }
55
78
  }
56
79
  }
80
+ }
57
81
 
58
- function extractError(e) {
59
- if (e && e.errors)
60
- return e.errors[0];
61
- else
62
- return e;
63
- }
82
+ // same helpers as before
64
83
 
84
+ function extractError(e) {
85
+ if (e && e.errors) {
86
+ return e.errors[0];
87
+ }
88
+ else {
89
+ return e;
90
+ }
65
91
  }
66
92
 
67
93
  function replaceParamChar(sql, params) {
@@ -77,7 +103,7 @@ function replaceParamChar(sql, params) {
77
103
  return sql;
78
104
  }
79
105
 
80
- function addParameters(request, params) {
106
+ function addParameters(request, params, TYPES) {
81
107
  const res = [];
82
108
  for (let i = 0; i < params.length; i++) {
83
109
  const p = [`${i}`, toType(params[i]), params[i]];
@@ -93,7 +119,6 @@ function addParameters(request, params) {
93
119
  return TYPES.Int;
94
120
  else if (typeof p === 'number')
95
121
  return TYPES.Money;
96
- // @ts-ignore
97
122
  else if (p instanceof Date && !isNaN(p))
98
123
  return TYPES.Date;
99
124
  else if (Array.isArray(p))
@@ -104,9 +129,7 @@ function addParameters(request, params) {
104
129
  return TYPES.NVarChar;
105
130
  else
106
131
  throw new Error('Unknown data type');
107
-
108
132
  }
109
-
110
133
  }
111
134
 
112
- module.exports = wrapQuery;
135
+ module.exports = wrapQuery;
@@ -1,9 +0,0 @@
1
- const fs = require('fs').promises;
2
-
3
- async function merge() {
4
- let data1 = await fs.readFile('./src/client/self.js', 'utf8');
5
- let data2 = await fs.readFile('./src/client/index.mjs', 'utf8');
6
- await fs.writeFile('./src/client/index.mjs', data1 + data2);
7
- }
8
-
9
- merge();
File without changes
File without changes