@taylordb/query-builder 0.9.0 → 0.9.2

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 (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/dist/cjs/__tests__/query-builder.spec.js +126 -23
  4. package/dist/cjs/__tests__/query-builder.spec.js.map +1 -1
  5. package/dist/cjs/aggregation-query-builder.d.ts +92 -0
  6. package/dist/cjs/aggregation-query-builder.js +92 -0
  7. package/dist/cjs/aggregation-query-builder.js.map +1 -1
  8. package/dist/cjs/batch-query-builder.d.ts +36 -0
  9. package/dist/cjs/batch-query-builder.js +36 -0
  10. package/dist/cjs/batch-query-builder.js.map +1 -1
  11. package/dist/cjs/delete-query-builder.d.ts +17 -0
  12. package/dist/cjs/delete-query-builder.js +17 -0
  13. package/dist/cjs/delete-query-builder.js.map +1 -1
  14. package/dist/cjs/executor.d.ts +4 -1
  15. package/dist/cjs/executor.js +20 -35
  16. package/dist/cjs/executor.js.map +1 -1
  17. package/dist/cjs/insert-query-builder.d.ts +68 -0
  18. package/dist/cjs/insert-query-builder.js +71 -0
  19. package/dist/cjs/insert-query-builder.js.map +1 -1
  20. package/dist/cjs/query-builder.d.ts +224 -5
  21. package/dist/cjs/query-builder.js +219 -5
  22. package/dist/cjs/query-builder.js.map +1 -1
  23. package/dist/cjs/selection-builder.d.ts +11 -0
  24. package/dist/cjs/selection-builder.js +11 -0
  25. package/dist/cjs/selection-builder.js.map +1 -1
  26. package/dist/cjs/{subscription-manager.d.ts → socket-connection.d.ts} +5 -4
  27. package/dist/cjs/{subscription-manager.js → socket-connection.js} +55 -9
  28. package/dist/cjs/socket-connection.js.map +1 -0
  29. package/dist/cjs/update-query-builder.d.ts +32 -0
  30. package/dist/cjs/update-query-builder.js +32 -0
  31. package/dist/cjs/update-query-builder.js.map +1 -1
  32. package/dist/cjs/where-query-builder.d.ts +59 -0
  33. package/dist/cjs/where-query-builder.js +6 -0
  34. package/dist/cjs/where-query-builder.js.map +1 -1
  35. package/dist/cjs/with-resolver.d.ts +5 -0
  36. package/dist/cjs/with-resolver.js +17 -0
  37. package/dist/cjs/with-resolver.js.map +1 -0
  38. package/dist/esm/__tests__/query-builder.spec.js +126 -23
  39. package/dist/esm/__tests__/query-builder.spec.js.map +1 -1
  40. package/dist/esm/aggregation-query-builder.d.ts +92 -0
  41. package/dist/esm/aggregation-query-builder.js +92 -0
  42. package/dist/esm/aggregation-query-builder.js.map +1 -1
  43. package/dist/esm/batch-query-builder.d.ts +36 -0
  44. package/dist/esm/batch-query-builder.js +36 -0
  45. package/dist/esm/batch-query-builder.js.map +1 -1
  46. package/dist/esm/delete-query-builder.d.ts +17 -0
  47. package/dist/esm/delete-query-builder.js +17 -0
  48. package/dist/esm/delete-query-builder.js.map +1 -1
  49. package/dist/esm/executor.d.ts +4 -1
  50. package/dist/esm/executor.js +20 -35
  51. package/dist/esm/executor.js.map +1 -1
  52. package/dist/esm/insert-query-builder.d.ts +68 -0
  53. package/dist/esm/insert-query-builder.js +71 -0
  54. package/dist/esm/insert-query-builder.js.map +1 -1
  55. package/dist/esm/query-builder.d.ts +224 -5
  56. package/dist/esm/query-builder.js +217 -4
  57. package/dist/esm/query-builder.js.map +1 -1
  58. package/dist/esm/selection-builder.d.ts +11 -0
  59. package/dist/esm/selection-builder.js +11 -0
  60. package/dist/esm/selection-builder.js.map +1 -1
  61. package/dist/esm/{subscription-manager.d.ts → socket-connection.d.ts} +5 -4
  62. package/dist/esm/{subscription-manager.js → socket-connection.js} +53 -7
  63. package/dist/esm/socket-connection.js.map +1 -0
  64. package/dist/esm/update-query-builder.d.ts +32 -0
  65. package/dist/esm/update-query-builder.js +32 -0
  66. package/dist/esm/update-query-builder.js.map +1 -1
  67. package/dist/esm/where-query-builder.d.ts +59 -0
  68. package/dist/esm/where-query-builder.js +6 -0
  69. package/dist/esm/where-query-builder.js.map +1 -1
  70. package/dist/esm/with-resolver.d.ts +5 -0
  71. package/dist/esm/with-resolver.js +14 -0
  72. package/dist/esm/with-resolver.js.map +1 -0
  73. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  74. package/package.json +4 -2
  75. package/dist/cjs/subscription-manager.js.map +0 -1
  76. package/dist/esm/subscription-manager.js.map +0 -1
@@ -3,6 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BatchQueryBuilder = void 0;
4
4
  const aggregation_query_builder_js_1 = require("./aggregation-query-builder.js");
5
5
  const query_builder_js_1 = require("./query-builder.js");
6
+ /**
7
+ * A query builder for executing multiple queries in a single batch.
8
+ * @template TBuilders - An array of query builders to execute.
9
+ */
6
10
  class BatchQueryBuilder {
7
11
  #builders;
8
12
  #executor;
@@ -10,9 +14,41 @@ class BatchQueryBuilder {
10
14
  this.#builders = builders;
11
15
  this.#executor = executor;
12
16
  }
17
+ /**
18
+ * Executes the batch query.
19
+ * @returns A promise that resolves with an array of the results from each query in the batch.
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const [users, newUser] = await qb.batch([
24
+ * qb.selectFrom('users').select(['id', 'name']),
25
+ * qb.insertInto('users').values({ name: 'New User' }).returning(['id', 'name']),
26
+ * ]).execute();
27
+ * ```
28
+ */
13
29
  async execute() {
14
30
  return this.#executor.execute(this);
15
31
  }
32
+ /**
33
+ * Subscribes to the results of the batch query.
34
+ * This is only possible if all queries in the batch are subscribable (select and aggregate).
35
+ * @param callback - A callback function that will be called with the results of the batch query.
36
+ * @returns A function to unsubscribe from the query.
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * const unsubscribe = qb.batch([
41
+ * qb.selectFrom('users').select(['id', 'name']),
42
+ * qb.aggregateFrom('users').groupBy('role').withAggregates({ id: ['count'] }),
43
+ * ]).subscribe(([users, userAggregates]) => {
44
+ * console.log('Users:', users);
45
+ * console.log('User Aggregates:', userAggregates);
46
+ * });
47
+ *
48
+ * // To stop listening for updates
49
+ * unsubscribe();
50
+ * ```
51
+ */
16
52
  subscribe(callback) {
17
53
  const builders = this.#builders.filter(builder => builder instanceof aggregation_query_builder_js_1.AggregationQueryBuilder ||
18
54
  builder instanceof query_builder_js_1.QueryBuilder);
@@ -1 +1 @@
1
- {"version":3,"file":"batch-query-builder.js","sourceRoot":"","sources":["../../src/batch-query-builder.ts"],"names":[],"mappings":";;;AAAA,iFAAyE;AAIzE,yDAAkD;AAuBlD,MAAa,iBAAiB;IAG5B,SAAS,CAAY;IACrB,SAAS,CAAW;IAEpB,YAAY,QAAmB,EAAE,QAAkB;QACjD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO;QAGX,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,SAAS,CACP,QAIS;QAET,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CACpC,OAAO,CAAC,EAAE,CACR,OAAO,YAAY,sDAAuB;YAC1C,OAAO,YAAY,+BAAY,CAClC,CAAC;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAe,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO;QACL,MAAM,KAAK,GAAG,6DAA6D,CAAC;QAE5E,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAC5C,OAAO,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,KAAK;YACL,SAAS,EAAE;gBACT,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;CACF;AArDD,8CAqDC"}
1
+ {"version":3,"file":"batch-query-builder.js","sourceRoot":"","sources":["../../src/batch-query-builder.ts"],"names":[],"mappings":";;;AAAA,iFAAyE;AAIzE,yDAAkD;AAuBlD;;;GAGG;AACH,MAAa,iBAAiB;IAG5B,SAAS,CAAY;IACrB,SAAS,CAAW;IAEpB,YAAY,QAAmB,EAAE,QAAkB;QACjD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,OAAO;QAGX,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,SAAS,CACP,QAIS;QAET,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CACpC,OAAO,CAAC,EAAE,CACR,OAAO,YAAY,sDAAuB;YAC1C,OAAO,YAAY,+BAAY,CAClC,CAAC;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAe,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO;QACL,MAAM,KAAK,GAAG,6DAA6D,CAAC;QAE5E,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAC5C,OAAO,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,KAAK;YACL,SAAS,EAAE;gBACT,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;CACF;AArFD,8CAqFC"}
@@ -2,9 +2,26 @@ import type { DeleteNode } from './@types/delete.js';
2
2
  import type { AnyDB } from './@types/internal-types.js';
3
3
  import { Executor } from './executor.js';
4
4
  import { FilterableQueryBuilder } from './where-query-builder.js';
5
+ /**
6
+ * A query builder for deleting records from the database.
7
+ * @template DB - The database type.
8
+ * @template TableName - The name of the table to delete from.
9
+ */
5
10
  export declare class DeleteQueryBuilder<DB extends AnyDB, TableName extends keyof DB> extends FilterableQueryBuilder<DB, TableName> {
6
11
  #private;
7
12
  constructor(node: DeleteNode, executor: Executor);
13
+ /**
14
+ * Executes the delete query.
15
+ * @returns A promise that resolves with the number of affected records.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const { affectedRecords } = await qb
20
+ * .deleteFrom('users')
21
+ * .where('id', '=', 1)
22
+ * .execute();
23
+ * ```
24
+ */
8
25
  execute(): Promise<{
9
26
  affectedRecords: number;
10
27
  }>;
@@ -2,12 +2,29 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DeleteQueryBuilder = void 0;
4
4
  const where_query_builder_js_1 = require("./where-query-builder.js");
5
+ /**
6
+ * A query builder for deleting records from the database.
7
+ * @template DB - The database type.
8
+ * @template TableName - The name of the table to delete from.
9
+ */
5
10
  class DeleteQueryBuilder extends where_query_builder_js_1.FilterableQueryBuilder {
6
11
  #node;
7
12
  constructor(node, executor) {
8
13
  super(node, executor);
9
14
  this.#node = node;
10
15
  }
16
+ /**
17
+ * Executes the delete query.
18
+ * @returns A promise that resolves with the number of affected records.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const { affectedRecords } = await qb
23
+ * .deleteFrom('users')
24
+ * .where('id', '=', 1)
25
+ * .execute();
26
+ * ```
27
+ */
11
28
  async execute() {
12
29
  const response = await this._executor.execute(this);
13
30
  return response[0];
@@ -1 +1 @@
1
- {"version":3,"file":"delete-query-builder.js","sourceRoot":"","sources":["../../src/delete-query-builder.ts"],"names":[],"mappings":";;;AAGA,qEAAkE;AAElE,MAAa,kBAGX,SAAQ,+CAAqC;IAC7C,KAAK,CAAa;IAElB,YAAY,IAAgB,EAAE,QAAkB;QAC9C,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,QAAQ,GACZ,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAgC,IAAI,CAAC,CAAC;QAEpE,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,OAAO;QACL,MAAM,KAAK,GAAG,6DAA6D,CAAC;QAE5E,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAE3C,OAAO;YACL,KAAK;YACL,SAAS,EAAE;gBACT,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;IAED,gBAAgB;QACd,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;gBAC7C,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;gBACvC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;CACF;AAxCD,gDAwCC"}
1
+ {"version":3,"file":"delete-query-builder.js","sourceRoot":"","sources":["../../src/delete-query-builder.ts"],"names":[],"mappings":";;;AAGA,qEAAkE;AAElE;;;;GAIG;AACH,MAAa,kBAGX,SAAQ,+CAAqC;IAC7C,KAAK,CAAa;IAElB,YAAY,IAAgB,EAAE,QAAkB;QAC9C,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,QAAQ,GACZ,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAgC,IAAI,CAAC,CAAC;QAEpE,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,OAAO;QACL,MAAM,KAAK,GAAG,6DAA6D,CAAC;QAE5E,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAE3C,OAAO;YACL,KAAK;YACL,SAAS,EAAE;gBACT,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;IAED,gBAAgB;QACd,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;gBAC7C,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;gBACvC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;CACF;AApDD,gDAoDC"}
@@ -1,4 +1,5 @@
1
1
  import { AnySubscribableQueryBuilder } from './batch-query-builder.js';
2
+ import { SocketConnection } from './socket-connection.js';
2
3
  interface Compilable {
3
4
  compile(): {
4
5
  query: string;
@@ -7,7 +8,9 @@ interface Compilable {
7
8
  }
8
9
  export declare class Executor {
9
10
  #private;
10
- constructor(baseUrl: string, apiKey: string);
11
+ constructor(baseUrl: string, apiKey: string, transactionId?: string, socketConnection?: SocketConnection);
12
+ get isInTransaction(): boolean;
13
+ withTransactionId(transactionId: string): Executor;
11
14
  execute<T>(builder: Compilable): Promise<T>;
12
15
  rawRequest<T>(query: string, variables: Record<string, any>, headers?: Record<string, string>): Promise<T>;
13
16
  subscribe<TResult>(builders: AnySubscribableQueryBuilder[], callback: (result: TResult) => void): Promise<{
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Executor = void 0;
4
- const subscription_manager_js_1 = require("./subscription-manager.js");
4
+ const socket_connection_js_1 = require("./socket-connection.js");
5
5
  const generateUUID = () => {
6
6
  if (globalThis.crypto && globalThis.crypto.randomUUID) {
7
7
  return globalThis.crypto.randomUUID();
@@ -16,51 +16,36 @@ const generateUUID = () => {
16
16
  class Executor {
17
17
  #baseUrl;
18
18
  #apiKey;
19
- #subscriptionManager;
20
- constructor(baseUrl, apiKey) {
19
+ #socketConnection;
20
+ #transactionId;
21
+ constructor(baseUrl, apiKey, transactionId, socketConnection) {
21
22
  this.#baseUrl = baseUrl;
22
23
  this.#apiKey = apiKey;
23
- this.#subscriptionManager = new subscription_manager_js_1.SubscriptionManager(this, {
24
- baseUrl,
25
- apiKey,
26
- clientId: generateUUID(),
27
- });
24
+ this.#transactionId = transactionId;
25
+ this.#socketConnection =
26
+ socketConnection ??
27
+ new socket_connection_js_1.SocketConnection({
28
+ baseUrl,
29
+ apiKey,
30
+ clientId: generateUUID(),
31
+ });
32
+ }
33
+ get isInTransaction() {
34
+ return !!this.#transactionId;
35
+ }
36
+ withTransactionId(transactionId) {
37
+ return new Executor(this.#baseUrl, this.#apiKey, transactionId, this.#socketConnection);
28
38
  }
29
39
  async execute(builder) {
30
40
  const { query, variables } = builder.compile();
31
41
  return this.rawRequest(query, variables);
32
42
  }
33
43
  async rawRequest(query, variables, headers) {
34
- const response = await fetch(this.#baseUrl, {
35
- method: 'POST',
36
- headers: {
37
- 'Content-Type': 'application/json',
38
- Authorization: `Bearer ${this.#apiKey}`,
39
- schema: 'readable',
40
- ...(headers ? { ...headers } : {}),
41
- },
42
- body: JSON.stringify({ query, variables }),
43
- });
44
- if (!response.ok) {
45
- const errorText = await response.text();
46
- throw new Error(`Request failed with status ${response.status}: ${errorText}`);
47
- }
48
- const jsonResponse = await response.json();
49
- if (jsonResponse.errors) {
50
- throw new Error(`GraphQL errors: ${jsonResponse.errors.map(error => error.message).join('\n')}`);
51
- }
52
- if (jsonResponse.data) {
53
- const [firstKey] = Object.keys(jsonResponse.data);
54
- if (Array.isArray(jsonResponse.data[firstKey])) {
55
- return jsonResponse.data[firstKey];
56
- }
57
- return jsonResponse.data;
58
- }
59
- throw new Error('Unexpected response format');
44
+ return this.#socketConnection.rawRequest(query, variables, headers, this.#transactionId);
60
45
  }
61
46
  subscribe(builders, callback) {
62
47
  const metadatas = builders.map(b => b._prepareMetadata());
63
- return this.#subscriptionManager.subscribe(metadatas, callback);
48
+ return this.#socketConnection.subscribe(metadatas, callback);
64
49
  }
65
50
  }
66
51
  exports.Executor = Executor;
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/executor.ts"],"names":[],"mappings":";;;AACA,iEAA0D;AAM1D,MAAM,YAAY,GAAG,GAAG,EAAE;IACxB,IAAI,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACtD,OAAO,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IACxC,CAAC;IACD,+DAA+D;IAC/D,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE;QACjE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC1C,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAa,QAAQ;IACnB,QAAQ,CAAS;IACjB,OAAO,CAAS;IAChB,iBAAiB,CAAmB;IACpC,cAAc,CAAU;IAExB,YACE,OAAe,EACf,MAAc,EACd,aAAsB,EACtB,gBAAmC;QAEnC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,iBAAiB;YACpB,gBAAgB;gBAChB,IAAI,uCAAgB,CAAC;oBACnB,OAAO;oBACP,MAAM;oBACN,QAAQ,EAAE,YAAY,EAAE;iBACzB,CAAC,CAAC;IACP,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,iBAAiB,CAAC,aAAqB;QACrC,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,OAAO,EACZ,aAAa,EACb,IAAI,CAAC,iBAAiB,CACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,OAAmB;QAClC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,UAAU,CACd,KAAa,EACb,SAA8B,EAC9B,OAAgC;QAEhC,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,CACtC,KAAK,EACL,SAAS,EACT,OAAO,EACP,IAAI,CAAC,cAAc,CACpB,CAAC;IACJ,CAAC;IAED,SAAS,CACP,QAAuC,EACvC,QAAmC;QAEnC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/D,CAAC;CACF;AA9DD,4BA8DC"}
@@ -3,14 +3,82 @@ import type { AnyDB } from './@types/internal-types.js';
3
3
  import { NonLinkColumnNames } from './@types/query-builder.js';
4
4
  import { ResolveSelection } from './@types/type-helpers.js';
5
5
  import { Executor } from './executor.js';
6
+ /**
7
+ * A query builder for creating new records in the database.
8
+ * @template DB - The database type.
9
+ * @template TableName - The name of the table to insert into.
10
+ * @template Selection - The type of the selected fields.
11
+ */
6
12
  export declare class InsertQueryBuilder<DB extends AnyDB, TableName extends keyof DB, Selection = {
7
13
  id: number;
8
14
  }> {
9
15
  #private;
10
16
  constructor(node: InsertNode, executor: Executor);
17
+ /**
18
+ * The values to insert into the table.
19
+ * @param values - An object or array of objects representing the records to create.
20
+ * @returns The `InsertQueryBuilder` instance for chaining.
21
+ *
22
+ * @example Single Record Insertion
23
+ * ```typescript
24
+ * const newUser = await qb
25
+ * .insertInto('users')
26
+ * .values({ name: 'John Doe', email: 'john.doe@example.com' })
27
+ * .executeTakeFirst();
28
+ * ```
29
+ *
30
+ * @example Multiple Record Insertion
31
+ * ```typescript
32
+ * const newUsers = await qb
33
+ * .insertInto('users')
34
+ * .values([{ name: 'John Doe' }, { name: 'Jane Doe' }])
35
+ * .execute();
36
+ * ```
37
+ */
11
38
  values(values: Insertable<DB[TableName]> | Insertable<DB[TableName]>[]): InsertQueryBuilder<DB, TableName, Selection>;
39
+ /**
40
+ * The fields to return after the insert operation.
41
+ * @param fields - An array of field names to return.
42
+ * @returns The `InsertQueryBuilder` instance for chaining.
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * const newUser = await qb
47
+ * .insertInto('users')
48
+ * .values({ name: 'John Doe' })
49
+ * .returning(['id', 'name'])
50
+ * .executeTakeFirst();
51
+ * ```
52
+ */
12
53
  returning<const TFields extends readonly NonLinkColumnNames<DB[TableName]>[]>(fields: TFields): InsertQueryBuilder<DB, TableName, ResolveSelection<DB, TableName, TFields, object>>;
54
+ /**
55
+ * Executes the insert query.
56
+ * @returns A promise that resolves with an array of the selected fields from the inserted records.
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * const newUsers = await qb
61
+ * .insertInto('users')
62
+ * .values([{ name: 'John Doe' }, { name: 'Jane Doe' }])
63
+ * .returning(['id', 'name'])
64
+ * .execute();
65
+ * ```
66
+ */
13
67
  execute(): Promise<Selection[]>;
68
+ /**
69
+ * Executes the insert query and returns the first result.
70
+ * @returns A promise that resolves with the first inserted record, or `null` if no records were inserted.
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const newUser = await qb
75
+ * .insertInto('users')
76
+ * .values({ name: 'John Doe' })
77
+ * .returning(['id', 'name'])
78
+ * .executeTakeFirst();
79
+ * ```
80
+ */
81
+ executeTakeFirst(): Promise<Selection | null>;
14
82
  compile(): {
15
83
  query: string;
16
84
  variables: Record<string, any>;
@@ -3,6 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InsertQueryBuilder = void 0;
4
4
  const query_builder_js_1 = require("./query-builder.js");
5
5
  const selection_builder_js_1 = require("./selection-builder.js");
6
+ /**
7
+ * A query builder for creating new records in the database.
8
+ * @template DB - The database type.
9
+ * @template TableName - The name of the table to insert into.
10
+ * @template Selection - The type of the selected fields.
11
+ */
6
12
  class InsertQueryBuilder {
7
13
  #node;
8
14
  #executor;
@@ -10,12 +16,47 @@ class InsertQueryBuilder {
10
16
  this.#node = node;
11
17
  this.#executor = executor;
12
18
  }
19
+ /**
20
+ * The values to insert into the table.
21
+ * @param values - An object or array of objects representing the records to create.
22
+ * @returns The `InsertQueryBuilder` instance for chaining.
23
+ *
24
+ * @example Single Record Insertion
25
+ * ```typescript
26
+ * const newUser = await qb
27
+ * .insertInto('users')
28
+ * .values({ name: 'John Doe', email: 'john.doe@example.com' })
29
+ * .executeTakeFirst();
30
+ * ```
31
+ *
32
+ * @example Multiple Record Insertion
33
+ * ```typescript
34
+ * const newUsers = await qb
35
+ * .insertInto('users')
36
+ * .values([{ name: 'John Doe' }, { name: 'Jane Doe' }])
37
+ * .execute();
38
+ * ```
39
+ */
13
40
  values(values) {
14
41
  return new InsertQueryBuilder({
15
42
  ...this.#node,
16
43
  createdRecords: Array.isArray(values) ? values : [values],
17
44
  }, this.#executor);
18
45
  }
46
+ /**
47
+ * The fields to return after the insert operation.
48
+ * @param fields - An array of field names to return.
49
+ * @returns The `InsertQueryBuilder` instance for chaining.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * const newUser = await qb
54
+ * .insertInto('users')
55
+ * .values({ name: 'John Doe' })
56
+ * .returning(['id', 'name'])
57
+ * .executeTakeFirst();
58
+ * ```
59
+ */
19
60
  returning(fields) {
20
61
  const newSelects = fields.map(field => {
21
62
  if (typeof field === 'function') {
@@ -31,9 +72,39 @@ class InsertQueryBuilder {
31
72
  returning: [...this.#node.returning, ...newSelects],
32
73
  }, this.#executor);
33
74
  }
75
+ /**
76
+ * Executes the insert query.
77
+ * @returns A promise that resolves with an array of the selected fields from the inserted records.
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * const newUsers = await qb
82
+ * .insertInto('users')
83
+ * .values([{ name: 'John Doe' }, { name: 'Jane Doe' }])
84
+ * .returning(['id', 'name'])
85
+ * .execute();
86
+ * ```
87
+ */
34
88
  async execute() {
35
89
  return (await this.#executor.execute(this))[0];
36
90
  }
91
+ /**
92
+ * Executes the insert query and returns the first result.
93
+ * @returns A promise that resolves with the first inserted record, or `null` if no records were inserted.
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * const newUser = await qb
98
+ * .insertInto('users')
99
+ * .values({ name: 'John Doe' })
100
+ * .returning(['id', 'name'])
101
+ * .executeTakeFirst();
102
+ * ```
103
+ */
104
+ async executeTakeFirst() {
105
+ const response = await this.execute();
106
+ return response[0] ?? null;
107
+ }
37
108
  compile() {
38
109
  const query = 'mutation ($metadata: JSON) { execute(metadata: $metadata) }';
39
110
  const metadata = [this._prepareMetadata()];
@@ -1 +1 @@
1
- {"version":3,"file":"insert-query-builder.js","sourceRoot":"","sources":["../../src/insert-query-builder.ts"],"names":[],"mappings":";;;AAKA,yDAAkD;AAClD,iEAA0D;AAE1D,MAAa,kBAAkB;IAK7B,KAAK,CAAa;IAClB,SAAS,CAAW;IAEpB,YAAY,IAAgB,EAAE,QAAkB;QAC9C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,MAAM,CACJ,MAA+D;QAE/D,OAAO,IAAI,kBAAkB,CAC3B;YACE,GAAG,IAAI,CAAC,KAAK;YACb,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;SAC1D,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IAED,SAAS,CACP,MAAe;QAMf,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACpC,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,IAAI,uCAAgB,CAAgB,IAAI,CAAC,SAAS,CAAC,CAAC;gBACpE,aAAa;gBACb,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChC,OAAO,QAAQ,CAAC,KAAK,CAAC;YACxB,CAAC;YACD,OAAO,KAAe,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,kBAAkB,CAC3B;YACE,GAAG,IAAI,CAAC,KAAK;YACb,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,UAAU,CAAC;SACpD,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO;QACL,MAAM,KAAK,GAAG,6DAA6D,CAAC;QAE5E,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAE3C,OAAO;YACL,KAAK;YACL,SAAS,EAAE;gBACT,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;IAED,gBAAgB;QACd,MAAM,YAAY,GAAG,CAAC,OAA+B,EAAS,EAAE;YAC9D,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,MAAM,eAAe,GAAG,IAAI,+BAAY,CACtC,KAAkB,EAClB,IAAI,CAAC,SAAS,CACf,CAAC;gBACF,OAAO,eAAe,CAAC,gBAAgB,EAAE,CAAC;YAC5C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM;YACpD,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;YACpC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEX,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;YACzC,SAAS,EAAE,kBAAkB;SAC9B,CAAC;IACJ,CAAC;CACF;AA7FD,gDA6FC"}
1
+ {"version":3,"file":"insert-query-builder.js","sourceRoot":"","sources":["../../src/insert-query-builder.ts"],"names":[],"mappings":"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"}