tspace-mysql 1.9.3-beta.3 → 1.9.4-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 (51) hide show
  1. package/README.md +21 -6
  2. package/dist/lib/core/Abstracts/AbstractBuilder.d.ts +1 -0
  3. package/dist/lib/core/Abstracts/AbstractBuilder.js +1 -0
  4. package/dist/lib/core/Abstracts/AbstractBuilder.js.map +1 -1
  5. package/dist/lib/core/Blueprint.d.ts +2 -2
  6. package/dist/lib/core/Builder.d.ts +1 -1
  7. package/dist/lib/core/Builder.js +14 -11
  8. package/dist/lib/core/Builder.js.map +1 -1
  9. package/dist/lib/core/DB.d.ts +137 -6
  10. package/dist/lib/core/DB.js +152 -29
  11. package/dist/lib/core/DB.js.map +1 -1
  12. package/dist/lib/core/Driver/index.d.ts +2 -1
  13. package/dist/lib/core/Driver/index.js +11 -0
  14. package/dist/lib/core/Driver/index.js.map +1 -1
  15. package/dist/lib/core/Driver/mariadb/MariadbDriver.d.ts +4 -1
  16. package/dist/lib/core/Driver/mariadb/MariadbDriver.js +21 -7
  17. package/dist/lib/core/Driver/mariadb/MariadbDriver.js.map +1 -1
  18. package/dist/lib/core/Driver/mongodb/MongodbDriver.d.ts +4 -1
  19. package/dist/lib/core/Driver/mongodb/MongodbDriver.js +8 -6
  20. package/dist/lib/core/Driver/mongodb/MongodbDriver.js.map +1 -1
  21. package/dist/lib/core/Driver/mysql/MysqlDriver.d.ts +4 -1
  22. package/dist/lib/core/Driver/mysql/MysqlDriver.js +35 -7
  23. package/dist/lib/core/Driver/mysql/MysqlDriver.js.map +1 -1
  24. package/dist/lib/core/Driver/postgres/PostgresDriver.d.ts +4 -1
  25. package/dist/lib/core/Driver/postgres/PostgresDriver.js +24 -8
  26. package/dist/lib/core/Driver/postgres/PostgresDriver.js.map +1 -1
  27. package/dist/lib/core/Driver/sqlite/SqliteDriver.d.ts +4 -1
  28. package/dist/lib/core/Driver/sqlite/SqliteDriver.js +14 -6
  29. package/dist/lib/core/Driver/sqlite/SqliteDriver.js.map +1 -1
  30. package/dist/lib/core/Model.d.ts +164 -1
  31. package/dist/lib/core/Model.js +177 -5
  32. package/dist/lib/core/Model.js.map +1 -1
  33. package/dist/lib/core/Pool.d.ts +1 -1
  34. package/dist/lib/core/Pool.js +10 -4
  35. package/dist/lib/core/Pool.js.map +1 -1
  36. package/dist/lib/core/Queue/index.d.ts +1 -1
  37. package/dist/lib/core/Queue/index.js +2 -1
  38. package/dist/lib/core/Queue/index.js.map +1 -1
  39. package/dist/lib/core/Queue/types.d.ts +3 -2
  40. package/dist/lib/core/Queue/worker.d.ts +2 -1
  41. package/dist/lib/core/Queue/worker.js +148 -63
  42. package/dist/lib/core/Queue/worker.js.map +1 -1
  43. package/dist/lib/core/Repository.js.map +1 -1
  44. package/dist/lib/core/Schema.d.ts +4 -4
  45. package/dist/lib/core/Schema.js +40 -14
  46. package/dist/lib/core/Schema.js.map +1 -1
  47. package/dist/lib/types/index.d.ts +5 -2
  48. package/dist/lib/utils/index.d.ts +4 -2
  49. package/dist/lib/utils/index.js +37 -5
  50. package/dist/lib/utils/index.js.map +1 -1
  51. package/package.json +3 -5
package/README.md CHANGED
@@ -95,7 +95,8 @@ npm install -D typescript@5.9.3
95
95
  - [Query Builder](#query-builder)
96
96
  - [Table Name & Alias Name](#table-name--alias-name)
97
97
  - [Returning Results](#returning-results)
98
- - [Query Statement](#query-statements)
98
+ - [Query Statements](#query-statements)
99
+ - [Stream Statements](#stream-statements)
99
100
  - [Select Statements](#select-statements)
100
101
  - [Raw Expressions](#raw-expressions)
101
102
  - [Ordering, Grouping, Limit and Offset](#ordering-grouping-limit-and-offset)
@@ -532,6 +533,19 @@ const query = await DB.query(
532
533
  username : ['name1','name2']
533
534
  })
534
535
  // SELECT * FROM users WHERE id = '1' AND email IS NULL AND username in ('name1','name2');
536
+
537
+ const query = await DB.query(
538
+ "SELECT * FROM users WHERE id = ? AND email IS ? AND name IN ?",
539
+ [1,null,['name1','name2']]
540
+ )
541
+ // SELECT * FROM users WHERE id = '1' AND email IS NULL AND username in ('name1','name2');
542
+ ```
543
+
544
+ ## Stream Statements
545
+ ```js
546
+ for await (const user of DB.stream("SELECT * FROM users")) {
547
+ console.log(user);
548
+ }
535
549
  ```
536
550
 
537
551
  ## Select Statements
@@ -3276,10 +3290,11 @@ class Post extends Model {
3276
3290
  id: Blueprint.int().notNull().primary().autoIncrement(),
3277
3291
  uuid: Blueprint.varchar(50).null(),
3278
3292
  user_id: Blueprint.int().notNull().foreign({
3279
- references: "id",
3280
- on: User,
3281
- onDelete: "CASCADE",
3282
- onUpdate: "CASCADE",
3293
+ on: () => User, // or "users"
3294
+ // Optionals
3295
+ references: "id", // default "id"
3296
+ onDelete: "CASCADE", // default "CASCADE"
3297
+ onUpdate: "CASCADE", // default "CASCADE"
3283
3298
  }),
3284
3299
  title: Blueprint.varchar(255).null(),
3285
3300
  created_at: Blueprint.timestamp().null(),
@@ -4200,7 +4215,7 @@ await Queue.start({
4200
4215
  maxIdleRetries : 8, // @default 5, maximum retries when no jobs are available
4201
4216
  poll : {
4202
4217
  enabled : true, // @default false, enable periodic job checking
4203
- timeout : 10_000 // @default 60_000, polling interval
4218
+ interval : 10_000 // @default 60_000, polling interval
4204
4219
  };
4205
4220
  });
4206
4221
 
@@ -26,6 +26,7 @@ declare abstract class AbstractBuilder {
26
26
  get: Function;
27
27
  queryBuilder: Function;
28
28
  transaction: Function;
29
+ stream: Function;
29
30
  };
30
31
  abstract void(): this;
31
32
  abstract debug(): this;
@@ -22,6 +22,7 @@ class AbstractBuilder {
22
22
  get: () => { },
23
23
  queryBuilder: () => { },
24
24
  transaction: () => { },
25
+ stream: (sql) => { },
25
26
  };
26
27
  }
27
28
  exports.AbstractBuilder = AbstractBuilder;
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractBuilder.js","sourceRoot":"","sources":["../../../../src/lib/core/Abstracts/AbstractBuilder.ts"],"names":[],"mappings":";;;AAGA,yCAA4C;AAO5C,MAAe,eAAe;IAEhB,MAAM,CAAU;IAEhB,SAAS,GAAY,MAAM,CAAC,eAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAEnD,YAAY,GAAG;QACrB,IAAI,EAAO,eAAM,CAAC,IAAI;QACtB,IAAI,EAAO,MAAM,CAAC,eAAM,CAAC,IAAI,CAAC;QAC9B,QAAQ,EAAG,MAAM,CAAC,eAAM,CAAC,QAAQ,CAAC;QAClC,QAAQ,EAAG,MAAM,CAAC,eAAM,CAAC,QAAQ,CAAC;QAClC,QAAQ,EAAG,eAAM,CAAC,QAAQ;KAC7B,CAAA;IAES,OAAO,GAAI,MAAM,CAAC,eAAM,CAAC,MAAM,IAAI,OAAO,CAAY,CAAC;IAEvD,QAAQ,GAAa,OAAO,CAAC,eAAM,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAEtD,UAAU,CAGlB;IAEQ,MAAM,CAAgB;IAEtB,KAAK,GAMX;QACA,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,GAAE,CAAC;QAC1B,GAAG,EAAE,CAAC,IAAU,EAAE,EAAE,GAAE,CAAC;QACvB,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;QACb,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;QACtB,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;KACxB,CAAA;CAwFJ;AAES,0CAAe;AACzB,kBAAe,eAAe,CAAA"}
1
+ {"version":3,"file":"AbstractBuilder.js","sourceRoot":"","sources":["../../../../src/lib/core/Abstracts/AbstractBuilder.ts"],"names":[],"mappings":";;;AAGA,yCAA4C;AAO5C,MAAe,eAAe;IAEhB,MAAM,CAAU;IAEhB,SAAS,GAAY,MAAM,CAAC,eAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAEnD,YAAY,GAAG;QACrB,IAAI,EAAO,eAAM,CAAC,IAAI;QACtB,IAAI,EAAO,MAAM,CAAC,eAAM,CAAC,IAAI,CAAC;QAC9B,QAAQ,EAAG,MAAM,CAAC,eAAM,CAAC,QAAQ,CAAC;QAClC,QAAQ,EAAG,MAAM,CAAC,eAAM,CAAC,QAAQ,CAAC;QAClC,QAAQ,EAAG,eAAM,CAAC,QAAQ;KAC7B,CAAA;IAES,OAAO,GAAI,MAAM,CAAC,eAAM,CAAC,MAAM,IAAI,OAAO,CAAY,CAAC;IAEvD,QAAQ,GAAa,OAAO,CAAC,eAAM,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAEtD,UAAU,CAGlB;IAEQ,MAAM,CAAgB;IAEtB,KAAK,GAOX;QACA,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,GAAE,CAAC;QAC1B,GAAG,EAAE,CAAC,IAAU,EAAE,EAAE,GAAE,CAAC;QACvB,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;QACb,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;QACtB,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;QACrB,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE,GAAE,CAAC;KAC9B,CAAA;CAwFJ;AAES,0CAAe;AACzB,kBAAe,eAAe,CAAA"}
@@ -1,4 +1,4 @@
1
- import { type T } from "./UtilityTypes";
1
+ import type { T } from "./UtilityTypes";
2
2
  import { Model } from "./Model";
3
3
  type ExtendType = NumberConstructor | StringConstructor | BooleanConstructor | DateConstructor | readonly ExtendType[] | {
4
4
  [_: string]: ExtendType;
@@ -478,7 +478,7 @@ declare class Blueprint<T = any> {
478
478
  */
479
479
  foreign({ references, on, onDelete, onUpdate, }: {
480
480
  references?: string;
481
- on: (new () => Model) | string;
481
+ on: (() => new () => Model) | string;
482
482
  onDelete?: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET NULL";
483
483
  onUpdate?: "CASCADE" | "NO ACTION" | "RESTRICT" | "SET NULL";
484
484
  }): Blueprint<T>;
@@ -1494,7 +1494,7 @@ declare class Builder<TA extends TAction = null> extends AbstractBuilder {
1494
1494
  * @param {Function} func function for callback result
1495
1495
  * @returns {this}
1496
1496
  */
1497
- hook(func: Function): this;
1497
+ hook(func: (results: any) => void): this;
1498
1498
  /**
1499
1499
  * The 'before' method is used function when execute returns a result to callback function
1500
1500
  * @param {Function} func function for callback result
@@ -2036,7 +2036,7 @@ class Builder extends AbstractBuilder_1.AbstractBuilder {
2036
2036
  columns[key] = `( ${updateColumns[key].join(" ")} )`;
2037
2037
  }
2038
2038
  const keyValue = Object.entries(columns).map(([column, value]) => {
2039
- value = this.$utils.escapeActions(value);
2039
+ value = this.$utils.escapePayload(value);
2040
2040
  return `${this.bindColumn(column)} = ${value == null || value === this.$constants("NULL")
2041
2041
  ? this.$constants("NULL")
2042
2042
  : typeof value === "string" && value.includes(this.$constants("RAW"))
@@ -4043,7 +4043,7 @@ class Builder extends AbstractBuilder_1.AbstractBuilder {
4043
4043
  _queryUpdate(data) {
4044
4044
  this.$utils.transfromDateToDateString(data);
4045
4045
  const values = Object.entries(data).map(([column, value]) => {
4046
- value = this.$utils.escapeActions(value);
4046
+ value = this.$utils.escapePayload(value);
4047
4047
  return `${this.bindColumn(column)} = ${value == null || value === this.$constants("NULL")
4048
4048
  ? this.$constants("NULL")
4049
4049
  : this.$utils.transfromValueHasRaw(value)}`;
@@ -4055,7 +4055,7 @@ class Builder extends AbstractBuilder_1.AbstractBuilder {
4055
4055
  data = this.$utils.transfromDateToDateString(data);
4056
4056
  const columns = Object.keys(data).map((c) => `\`${c.replace(/\`/g, "")}\``);
4057
4057
  const values = Object.values(data).map((value) => {
4058
- value = this.$utils.escapeActions(value);
4058
+ value = this.$utils.escapePayload(value);
4059
4059
  if (this.$utils.typeOf(value) === "object" ||
4060
4060
  this.$utils.typeOf(value) === "array") {
4061
4061
  value = JSON.stringify(value);
@@ -4075,7 +4075,7 @@ class Builder extends AbstractBuilder_1.AbstractBuilder {
4075
4075
  for (let objects of data) {
4076
4076
  this.$utils.transfromDateToDateString(objects);
4077
4077
  const vals = Object.values(objects).map((value) => {
4078
- value = this.$utils.escapeActions(value);
4078
+ value = this.$utils.escapePayload(value);
4079
4079
  if (this.$utils.typeOf(value) === "object" ||
4080
4080
  this.$utils.typeOf(value) === "array") {
4081
4081
  value = JSON.stringify(value);
@@ -4141,17 +4141,14 @@ class Builder extends AbstractBuilder_1.AbstractBuilder {
4141
4141
  return {
4142
4142
  query: async (sql) => {
4143
4143
  const first = sql.trim().split(/\s+/)[0].toUpperCase();
4144
+ const isRowLock = Object.values(this.$constants("ROW_LEVEL_LOCK")).some(lock => sql.toUpperCase().includes(lock));
4145
+ // Row-level locked SELECTs (e.g. FOR UPDATE, FOR SHARE) acquire database locks,
4146
+ // so they are not considered read-only queries and should be handled as write/locking operations.
4144
4147
  const isReaded = [
4145
4148
  this.$constants("SELECT"),
4146
4149
  this.$constants("SHOW"),
4147
4150
  this.$constants("DESCRIBE")
4148
- ].includes(first) &&
4149
- (!sql
4150
- .toUpperCase()
4151
- .includes(this.$constants("ROW_LEVEL_LOCK").update) ||
4152
- !sql
4153
- .toUpperCase()
4154
- .includes(this.$constants("ROW_LEVEL_LOCK").share));
4151
+ ].includes(first) && !isRowLock;
4155
4152
  if (isReaded) {
4156
4153
  const length = poolCluster?.slaves?.length ?? 0;
4157
4154
  const random = Math.floor(Math.random() * length);
@@ -4185,10 +4182,16 @@ class Builder extends AbstractBuilder_1.AbstractBuilder {
4185
4182
  transaction: async () => {
4186
4183
  return await poolCluster.masters[0].connection();
4187
4184
  },
4185
+ stream: async (sql) => {
4186
+ return await poolCluster.masters[0].stream(sql);
4187
+ },
4188
4188
  };
4189
4189
  }
4190
4190
  let pool = Pool_1.Pool.connect();
4191
4191
  return {
4192
+ stream: async (sql) => {
4193
+ return await pool.stream(sql);
4194
+ },
4192
4195
  transaction: async () => {
4193
4196
  return await pool.connection();
4194
4197
  },