@decaf-ts/for-typeorm 0.0.6

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 (109) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +93 -0
  3. package/dist/for-typeorm.cjs +2553 -0
  4. package/dist/for-typeorm.esm.cjs +2538 -0
  5. package/lib/TypeORMAdapter.cjs +1129 -0
  6. package/lib/TypeORMAdapter.d.ts +221 -0
  7. package/lib/TypeORMDispatch.cjs +134 -0
  8. package/lib/TypeORMDispatch.d.ts +87 -0
  9. package/lib/TypeORMEventSubscriber.cjs +96 -0
  10. package/lib/TypeORMEventSubscriber.d.ts +56 -0
  11. package/lib/TypeORMRepository.cjs +209 -0
  12. package/lib/TypeORMRepository.d.ts +125 -0
  13. package/lib/constants.cjs +43 -0
  14. package/lib/constants.d.ts +39 -0
  15. package/lib/errors.cjs +28 -0
  16. package/lib/errors.d.ts +21 -0
  17. package/lib/esm/TypeORMAdapter.d.ts +221 -0
  18. package/lib/esm/TypeORMAdapter.js +1124 -0
  19. package/lib/esm/TypeORMDispatch.d.ts +87 -0
  20. package/lib/esm/TypeORMDispatch.js +130 -0
  21. package/lib/esm/TypeORMEventSubscriber.d.ts +56 -0
  22. package/lib/esm/TypeORMEventSubscriber.js +93 -0
  23. package/lib/esm/TypeORMRepository.d.ts +125 -0
  24. package/lib/esm/TypeORMRepository.js +206 -0
  25. package/lib/esm/constants.d.ts +39 -0
  26. package/lib/esm/constants.js +40 -0
  27. package/lib/esm/errors.d.ts +21 -0
  28. package/lib/esm/errors.js +24 -0
  29. package/lib/esm/index.d.ts +22 -0
  30. package/lib/esm/index.js +25 -0
  31. package/lib/esm/indexes/generator.d.ts +50 -0
  32. package/lib/esm/indexes/generator.js +95 -0
  33. package/lib/esm/indexes/index.d.ts +1 -0
  34. package/lib/esm/indexes/index.js +2 -0
  35. package/lib/esm/overrides/Column.d.ts +74 -0
  36. package/lib/esm/overrides/Column.js +70 -0
  37. package/lib/esm/overrides/CreateDateColumn.d.ts +2 -0
  38. package/lib/esm/overrides/CreateDateColumn.js +9 -0
  39. package/lib/esm/overrides/Entity.d.ts +11 -0
  40. package/lib/esm/overrides/Entity.js +28 -0
  41. package/lib/esm/overrides/PrimaryColumn.d.ts +20 -0
  42. package/lib/esm/overrides/PrimaryColumn.js +53 -0
  43. package/lib/esm/overrides/PrimaryGeneratedColumn.d.ts +24 -0
  44. package/lib/esm/overrides/PrimaryGeneratedColumn.js +51 -0
  45. package/lib/esm/overrides/UpdateDateColumn.d.ts +2 -0
  46. package/lib/esm/overrides/UpdateDateColumn.js +9 -0
  47. package/lib/esm/overrides/utils.d.ts +2 -0
  48. package/lib/esm/overrides/utils.js +29 -0
  49. package/lib/esm/query/Paginator.d.ts +86 -0
  50. package/lib/esm/query/Paginator.js +124 -0
  51. package/lib/esm/query/Statement.d.ts +131 -0
  52. package/lib/esm/query/Statement.js +242 -0
  53. package/lib/esm/query/constants.d.ts +52 -0
  54. package/lib/esm/query/constants.js +74 -0
  55. package/lib/esm/query/index.d.ts +4 -0
  56. package/lib/esm/query/index.js +5 -0
  57. package/lib/esm/query/translate.d.ts +34 -0
  58. package/lib/esm/query/translate.js +42 -0
  59. package/lib/esm/raw/postgres.d.ts +36 -0
  60. package/lib/esm/raw/postgres.js +2 -0
  61. package/lib/esm/sequences/Sequence.d.ts +67 -0
  62. package/lib/esm/sequences/Sequence.js +117 -0
  63. package/lib/esm/sequences/index.d.ts +1 -0
  64. package/lib/esm/sequences/index.js +2 -0
  65. package/lib/esm/types.d.ts +67 -0
  66. package/lib/esm/types.js +28 -0
  67. package/lib/esm/utils.d.ts +16 -0
  68. package/lib/esm/utils.js +29 -0
  69. package/lib/index.cjs +42 -0
  70. package/lib/index.d.ts +22 -0
  71. package/lib/indexes/generator.cjs +98 -0
  72. package/lib/indexes/generator.d.ts +50 -0
  73. package/lib/indexes/index.cjs +18 -0
  74. package/lib/indexes/index.d.ts +1 -0
  75. package/lib/overrides/Column.cjs +73 -0
  76. package/lib/overrides/Column.d.ts +74 -0
  77. package/lib/overrides/CreateDateColumn.cjs +12 -0
  78. package/lib/overrides/CreateDateColumn.d.ts +2 -0
  79. package/lib/overrides/Entity.cjs +31 -0
  80. package/lib/overrides/Entity.d.ts +11 -0
  81. package/lib/overrides/PrimaryColumn.cjs +56 -0
  82. package/lib/overrides/PrimaryColumn.d.ts +20 -0
  83. package/lib/overrides/PrimaryGeneratedColumn.cjs +54 -0
  84. package/lib/overrides/PrimaryGeneratedColumn.d.ts +24 -0
  85. package/lib/overrides/UpdateDateColumn.cjs +12 -0
  86. package/lib/overrides/UpdateDateColumn.d.ts +2 -0
  87. package/lib/overrides/utils.cjs +32 -0
  88. package/lib/overrides/utils.d.ts +2 -0
  89. package/lib/query/Paginator.cjs +128 -0
  90. package/lib/query/Paginator.d.ts +86 -0
  91. package/lib/query/Statement.cjs +246 -0
  92. package/lib/query/Statement.d.ts +131 -0
  93. package/lib/query/constants.cjs +77 -0
  94. package/lib/query/constants.d.ts +52 -0
  95. package/lib/query/index.cjs +21 -0
  96. package/lib/query/index.d.ts +4 -0
  97. package/lib/query/translate.cjs +45 -0
  98. package/lib/query/translate.d.ts +34 -0
  99. package/lib/raw/postgres.cjs +3 -0
  100. package/lib/raw/postgres.d.ts +36 -0
  101. package/lib/sequences/Sequence.cjs +121 -0
  102. package/lib/sequences/Sequence.d.ts +67 -0
  103. package/lib/sequences/index.cjs +18 -0
  104. package/lib/sequences/index.d.ts +1 -0
  105. package/lib/types.cjs +31 -0
  106. package/lib/types.d.ts +67 -0
  107. package/lib/utils.cjs +32 -0
  108. package/lib/utils.d.ts +16 -0
  109. package/package.json +128 -0
@@ -0,0 +1,124 @@
1
+ import { Paginator, PagingError } from "@decaf-ts/core";
2
+ import { ModelKeys } from "@decaf-ts/decorator-validation";
3
+ import { findPrimaryKey } from "@decaf-ts/db-decorators";
4
+ /**
5
+ * @description Paginator for TypeORM query results.
6
+ * @summary Implements pagination for TypeORM-built queries using take/skip for efficient navigation through result sets.
7
+ * @template M The model type that extends Model.
8
+ * @template R The result type.
9
+ * @param {TypeORMAdapter} adapter The TypeORM adapter.
10
+ * @param {TypeORMQuery} query The query container to paginate.
11
+ * @param {number} size The page size.
12
+ * @param {Constructor<M>} clazz The model constructor.
13
+ * @class TypeORMPaginator
14
+ * @example
15
+ * // Example of using TypeORMPaginator
16
+ * const paginator = new TypeORMPaginator(adapter, { query: qb }, 10, User);
17
+ * const page1 = await paginator.page(1);
18
+ * const page2 = await paginator.page(2);
19
+ */
20
+ export class TypeORMPaginator extends Paginator {
21
+ /**
22
+ * @description Gets the total number of pages
23
+ * @summary Returns the total number of pages based on the record count and page size
24
+ * @return {number} The total number of pages
25
+ */
26
+ get total() {
27
+ return this._totalPages;
28
+ }
29
+ /**
30
+ * @description Gets the total record count
31
+ * @summary Returns the total number of records matching the query
32
+ * @return {number} The total record count
33
+ */
34
+ get count() {
35
+ return this._recordCount;
36
+ }
37
+ get repo() {
38
+ if (!this.__repo) {
39
+ this.__repo = this.adapter.dataSource.getRepository(this.clazz[ModelKeys.ANCHOR]);
40
+ }
41
+ return this.__repo;
42
+ }
43
+ /**
44
+ * @description Creates a new TypeORMPaginator instance.
45
+ * @summary Initializes a paginator for TypeORM query results.
46
+ * @param {TypeORMAdapter} adapter The TypeORM adapter.
47
+ * @param {TypeORMQuery} query The TypeORM query container to paginate.
48
+ * @param {number} size The page size.
49
+ * @param {Constructor<M>} clazz The model constructor.
50
+ */
51
+ constructor(adapter, query, size, clazz) {
52
+ super(adapter, query, size, clazz);
53
+ }
54
+ /**
55
+ * @description Prepares a query for pagination
56
+ * @summary Modifies the raw query to include pagination parameters
57
+ * @param {TypeORMQuery} rawStatement - The original PostgreSQL query
58
+ * @return {TypeORMQuery} The prepared query with pagination parameters
59
+ */
60
+ prepare(rawStatement) {
61
+ const query = { ...rawStatement };
62
+ return query;
63
+ }
64
+ /**
65
+ * @description Retrieves a specific page of results.
66
+ * @summary Executes the query with pagination and processes the results.
67
+ * @param {number} [page=1] The page number to retrieve.
68
+ * @return {Promise<R[]>} A promise that resolves to an array of results.
69
+ * @throws {PagingError} If trying to access an invalid page or if no class is defined.
70
+ * @mermaid
71
+ * sequenceDiagram
72
+ * participant Client
73
+ * participant Paginator as TypeORMPaginator
74
+ * participant Adapter
75
+ * participant DB as Database
76
+ *
77
+ * Client->>Paginator: page(pageNumber)
78
+ * Note over Paginator: Prepare options (skip/take)
79
+ *
80
+ * alt First time or need count
81
+ * Paginator->>Adapter: Get count
82
+ * Adapter->>DB: Execute COUNT
83
+ * DB-->>Adapter: count
84
+ * Adapter-->>Paginator: count
85
+ * Paginator->>Paginator: Calculate total pages
86
+ * end
87
+ *
88
+ * Paginator->>Adapter: Execute query
89
+ * Adapter->>DB: findAndCount(options)
90
+ * DB-->>Adapter: rows, count
91
+ * Adapter-->>Paginator: rows, count
92
+ *
93
+ * Paginator->>Paginator: Map rows to models
94
+ * Paginator-->>Client: results
95
+ */
96
+ async page(page = 1) {
97
+ const statement = { ...this.statement };
98
+ // Get total count if not already calculated
99
+ if (!this._recordCount || !this._totalPages) {
100
+ this._totalPages = this._recordCount = 0;
101
+ }
102
+ const opts = Object.assign(statement, {
103
+ skip: (this.current || 0) * this.size,
104
+ take: this.size,
105
+ });
106
+ // this.validatePage(page);
107
+ const result = await this.repo.findAndCount(opts);
108
+ this._recordCount = result[1];
109
+ this._totalPages = Math.ceil(this._recordCount / this.size);
110
+ if (!this.clazz)
111
+ throw new PagingError("No statement target defined");
112
+ const pkDef = findPrimaryKey(new this.clazz());
113
+ const rows = result[0] || [];
114
+ const results =
115
+ // statement.columns && statement.columns.length
116
+ // ? rows // has columns means it's not full model
117
+ rows.map((row) => {
118
+ return this.adapter.revert(row, this.clazz, pkDef.id, row[pkDef.id]);
119
+ });
120
+ this._currentPage = page;
121
+ return results;
122
+ }
123
+ }
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFnaW5hdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3F1ZXJ5L1BhZ2luYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhELE9BQU8sRUFBc0IsU0FBUyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHL0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXpEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sT0FBTyxnQkFBcUMsU0FBUSxTQUl6RDtJQUNDOzs7O09BSUc7SUFDSCxJQUFhLEtBQUs7UUFDaEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBYSxLQUFLO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBSUQsSUFBYyxJQUFJO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBSSxJQUFJLENBQUMsT0FBMEIsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUNyRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFpQyxDQUFDLENBQ3hELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsWUFDRSxPQUF1QixFQUN2QixLQUFtQixFQUNuQixJQUFZLEVBQ1osS0FBcUI7UUFFckIsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLE9BQU8sQ0FBQyxZQUEwQjtRQUMxQyxNQUFNLEtBQUssR0FBaUIsRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQ2hELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BK0JHO0lBRUgsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFlLENBQUM7UUFDekIsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV4Qyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQXVCLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1lBQ3hELElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUk7WUFDckMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUVILDJCQUEyQjtRQUUzQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxNQUFNLElBQUksV0FBVyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFFdEUsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUU3QixNQUFNLE9BQU87UUFDWCxnREFBZ0Q7UUFDaEQsb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsT0FBTyxPQUF5QixDQUFDO0lBQ25DLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhZ2luYXRvciwgUGFnaW5nRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFR5cGVPUk1RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsLCBNb2RlbEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuLi9UeXBlT1JNQWRhcHRlclwiO1xuaW1wb3J0IHsgRmluZE1hbnlPcHRpb25zLCBSZXBvc2l0b3J5IGFzIFJlcG8gfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXkgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFnaW5hdG9yIGZvciBUeXBlT1JNIHF1ZXJ5IHJlc3VsdHMuXG4gKiBAc3VtbWFyeSBJbXBsZW1lbnRzIHBhZ2luYXRpb24gZm9yIFR5cGVPUk0tYnVpbHQgcXVlcmllcyB1c2luZyB0YWtlL3NraXAgZm9yIGVmZmljaWVudCBuYXZpZ2F0aW9uIHRocm91Z2ggcmVzdWx0IHNldHMuXG4gKiBAdGVtcGxhdGUgTSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAdGVtcGxhdGUgUiBUaGUgcmVzdWx0IHR5cGUuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcXVlcnkgVGhlIHF1ZXJ5IGNvbnRhaW5lciB0byBwYWdpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIFRoZSBwYWdlIHNpemUuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gKiBAY2xhc3MgVHlwZU9STVBhZ2luYXRvclxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgb2YgdXNpbmcgVHlwZU9STVBhZ2luYXRvclxuICogY29uc3QgcGFnaW5hdG9yID0gbmV3IFR5cGVPUk1QYWdpbmF0b3IoYWRhcHRlciwgeyBxdWVyeTogcWIgfSwgMTAsIFVzZXIpO1xuICogY29uc3QgcGFnZTEgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgxKTtcbiAqIGNvbnN0IHBhZ2UyID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UoMik7XG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBQYWdpbmF0b3I8XG4gIE0sXG4gIFIsXG4gIFR5cGVPUk1RdWVyeVxuPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBiYXNlZCBvbiB0aGUgcmVjb3JkIGNvdW50IGFuZCBwYWdlIHNpemVcbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXG4gICAqL1xuICBvdmVycmlkZSBnZXQgdG90YWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxQYWdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdG90YWwgcmVjb3JkIGNvdW50XG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiByZWNvcmRzIG1hdGNoaW5nIHRoZSBxdWVyeVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0b3RhbCByZWNvcmQgY291bnRcbiAgICovXG4gIG92ZXJyaWRlIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yZWNvcmRDb3VudDtcbiAgfVxuXG4gIHByaXZhdGUgX19yZXBvPzogUmVwbzxhbnk+O1xuXG4gIHByb3RlY3RlZCBnZXQgcmVwbygpIHtcbiAgICBpZiAoIXRoaXMuX19yZXBvKSB7XG4gICAgICB0aGlzLl9fcmVwbyA9ICh0aGlzLmFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXIpLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShcbiAgICAgICAgdGhpcy5jbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmNsYXp6XVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19yZXBvO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IFR5cGVPUk1QYWdpbmF0b3IgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgcGFnaW5hdG9yIGZvciBUeXBlT1JNIHF1ZXJ5IHJlc3VsdHMuXG4gICAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlci5cbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHF1ZXJ5IFRoZSBUeXBlT1JNIHF1ZXJ5IGNvbnRhaW5lciB0byBwYWdpbmF0ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgYWRhcHRlcjogVHlwZU9STUFkYXB0ZXIsXG4gICAgcXVlcnk6IFR5cGVPUk1RdWVyeSxcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgcXVlcnkgZm9yIHBhZ2luYXRpb25cbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgdGhlIHJhdyBxdWVyeSB0byBpbmNsdWRlIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcmF3U3RhdGVtZW50IC0gVGhlIG9yaWdpbmFsIFBvc3RncmVTUUwgcXVlcnlcbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgcHJlcGFyZWQgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIHBhcmFtZXRlcnNcbiAgICovXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogVHlwZU9STVF1ZXJ5KTogVHlwZU9STVF1ZXJ5IHtcbiAgICBjb25zdCBxdWVyeTogVHlwZU9STVF1ZXJ5ID0geyAuLi5yYXdTdGF0ZW1lbnQgfTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHNwZWNpZmljIHBhZ2Ugb2YgcmVzdWx0cy5cbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgdGhlIHF1ZXJ5IHdpdGggcGFnaW5hdGlvbiBhbmQgcHJvY2Vzc2VzIHRoZSByZXN1bHRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BhZ2U9MV0gVGhlIHBhZ2UgbnVtYmVyIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJbXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHJlc3VsdHMuXG4gICAqIEB0aHJvd3Mge1BhZ2luZ0Vycm9yfSBJZiB0cnlpbmcgdG8gYWNjZXNzIGFuIGludmFsaWQgcGFnZSBvciBpZiBubyBjbGFzcyBpcyBkZWZpbmVkLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQYWdpbmF0b3IgYXMgVHlwZU9STVBhZ2luYXRvclxuICAgKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICAgKlxuICAgKiAgIENsaWVudC0+PlBhZ2luYXRvcjogcGFnZShwYWdlTnVtYmVyKVxuICAgKiAgIE5vdGUgb3ZlciBQYWdpbmF0b3I6IFByZXBhcmUgb3B0aW9ucyAoc2tpcC90YWtlKVxuICAgKlxuICAgKiAgIGFsdCBGaXJzdCB0aW1lIG9yIG5lZWQgY291bnRcbiAgICogICAgIFBhZ2luYXRvci0+PkFkYXB0ZXI6IEdldCBjb3VudFxuICAgKiAgICAgQWRhcHRlci0+PkRCOiBFeGVjdXRlIENPVU5UXG4gICAqICAgICBEQi0tPj5BZGFwdGVyOiBjb3VudFxuICAgKiAgICAgQWRhcHRlci0tPj5QYWdpbmF0b3I6IGNvdW50XG4gICAqICAgICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IENhbGN1bGF0ZSB0b3RhbCBwYWdlc1xuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIFBhZ2luYXRvci0+PkFkYXB0ZXI6IEV4ZWN1dGUgcXVlcnlcbiAgICogICBBZGFwdGVyLT4+REI6IGZpbmRBbmRDb3VudChvcHRpb25zKVxuICAgKiAgIERCLS0+PkFkYXB0ZXI6IHJvd3MsIGNvdW50XG4gICAqICAgQWRhcHRlci0tPj5QYWdpbmF0b3I6IHJvd3MsIGNvdW50XG4gICAqXG4gICAqICAgUGFnaW5hdG9yLT4+UGFnaW5hdG9yOiBNYXAgcm93cyB0byBtb2RlbHNcbiAgICogICBQYWdpbmF0b3ItLT4+Q2xpZW50OiByZXN1bHRzXG4gICAqL1xuXG4gIGFzeW5jIHBhZ2UocGFnZTogbnVtYmVyID0gMSk6IFByb21pc2U8UltdPiB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0geyAuLi50aGlzLnN0YXRlbWVudCB9O1xuXG4gICAgLy8gR2V0IHRvdGFsIGNvdW50IGlmIG5vdCBhbHJlYWR5IGNhbGN1bGF0ZWRcbiAgICBpZiAoIXRoaXMuX3JlY29yZENvdW50IHx8ICF0aGlzLl90b3RhbFBhZ2VzKSB7XG4gICAgICB0aGlzLl90b3RhbFBhZ2VzID0gdGhpcy5fcmVjb3JkQ291bnQgPSAwO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHM6IEZpbmRNYW55T3B0aW9uczxNPiA9IE9iamVjdC5hc3NpZ24oc3RhdGVtZW50LCB7XG4gICAgICBza2lwOiAodGhpcy5jdXJyZW50IHx8IDApICogdGhpcy5zaXplLFxuICAgICAgdGFrZTogdGhpcy5zaXplLFxuICAgIH0pO1xuXG4gICAgLy8gdGhpcy52YWxpZGF0ZVBhZ2UocGFnZSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcG8uZmluZEFuZENvdW50KG9wdHMpO1xuXG4gICAgdGhpcy5fcmVjb3JkQ291bnQgPSByZXN1bHRbMV07XG4gICAgdGhpcy5fdG90YWxQYWdlcyA9IE1hdGguY2VpbCh0aGlzLl9yZWNvcmRDb3VudCAvIHRoaXMuc2l6ZSk7XG5cbiAgICBpZiAoIXRoaXMuY2xhenopIHRocm93IG5ldyBQYWdpbmdFcnJvcihcIk5vIHN0YXRlbWVudCB0YXJnZXQgZGVmaW5lZFwiKTtcblxuICAgIGNvbnN0IHBrRGVmID0gZmluZFByaW1hcnlLZXkobmV3IHRoaXMuY2xhenooKSk7XG4gICAgY29uc3Qgcm93cyA9IHJlc3VsdFswXSB8fCBbXTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPVxuICAgICAgLy8gc3RhdGVtZW50LmNvbHVtbnMgJiYgc3RhdGVtZW50LmNvbHVtbnMubGVuZ3RoXG4gICAgICAvLyAgID8gcm93cyAvLyBoYXMgY29sdW1ucyBtZWFucyBpdCdzIG5vdCBmdWxsIG1vZGVsXG4gICAgICByb3dzLm1hcCgocm93OiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQocm93LCB0aGlzLmNsYXp6LCBwa0RlZi5pZCwgcm93W3BrRGVmLmlkXSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gcGFnZTtcbiAgICByZXR1cm4gcmVzdWx0cyBhcyB1bmtub3duIGFzIFJbXTtcbiAgfVxufVxuIl19
@@ -0,0 +1,131 @@
1
+ import { Condition, GroupOperator, Operator, Paginator, Statement } from "@decaf-ts/core";
2
+ import { Model } from "@decaf-ts/decorator-validation";
3
+ import { TypeORMQuery } from "../types";
4
+ import { TypeORMAdapter } from "../TypeORMAdapter";
5
+ import { SelectQueryBuilder } from "typeorm";
6
+ import { FindOptionsWhere } from "typeorm/find-options/FindOptionsWhere";
7
+ /**
8
+ * @description Statement builder for TypeORM-backed queries.
9
+ * @summary Provides a fluent interface for building SQL queries via TypeORM's SelectQueryBuilder with type safety and Decaf.ts abstractions.
10
+ * @template M The model type that extends Model.
11
+ * @template R The result type returned from execution.
12
+ * @param {TypeORMAdapter} adapter The TypeORM adapter.
13
+ * @class TypeORMStatement
14
+ * @example
15
+ * // Example using TypeORMStatement
16
+ * const statement = new TypeORMStatement<User, User[]>(adapter);
17
+ * const users = await statement
18
+ * .from(User)
19
+ * .where(Condition.attribute<User>('age').gt(18))
20
+ * .orderBy('lastName', 'asc')
21
+ * .limit(10)
22
+ * .execute();
23
+ */
24
+ export declare class TypeORMStatement<M extends Model, R> extends Statement<TypeORMQuery<M>, M, R> {
25
+ protected adapter: TypeORMAdapter;
26
+ constructor(adapter: TypeORMAdapter);
27
+ /**
28
+ * @description Builds a TypeORM SelectQueryBuilder from the statement.
29
+ * @summary Converts the statement's conditions, selectors, and options into a TypeORM-backed query object.
30
+ * @return {TypeORMQuery} The built TypeORM query container.
31
+ * @throws {Error} If there are invalid query conditions.
32
+ * @mermaid
33
+ * sequenceDiagram
34
+ * participant Statement
35
+ * participant Repository
36
+ * participant parseCondition
37
+ *
38
+ * Statement->>Statement: build()
39
+ * Note over Statement: Initialize query
40
+ * Statement->>Repository: Get table name
41
+ * Repository-->>Statement: Return table name
42
+ * Statement->>Statement: Create base query
43
+ *
44
+ * alt Has selectSelector
45
+ * Statement->>Statement: Add columns to query
46
+ * end
47
+ *
48
+ * alt Has whereCondition
49
+ * Statement->>Statement: Create combined condition with table
50
+ * Statement->>parseCondition: Parse condition
51
+ * parseCondition-->>Statement: Return parsed conditions
52
+ * Statement->>Statement: Add conditions to query
53
+ * end
54
+ *
55
+ * alt Has orderBySelector
56
+ * Statement->>Statement: Add orderBy to query
57
+ * end
58
+ *
59
+ * alt Has limitSelector
60
+ * Statement->>Statement: Set limit
61
+ * else
62
+ * Statement->>Statement: Use default limit
63
+ * end
64
+ *
65
+ * alt Has offsetSelector
66
+ * Statement->>Statement: Set offset
67
+ * end
68
+ *
69
+ * Statement-->>Statement: Return query
70
+ */
71
+ protected build(): TypeORMQuery<M>;
72
+ /**
73
+ * @description Creates a paginator for the statement.
74
+ * @summary Builds the query and returns a TypeORMPaginator for paginated results.
75
+ * @template R The result type.
76
+ * @param {number} size The page size.
77
+ * @return {Promise<Paginator<M, R, TypeORMQuery>>} A promise that resolves to a paginator.
78
+ * @throws {InternalError} If there's an error building the query.
79
+ */
80
+ paginate<R>(size: number): Promise<Paginator<M, R, TypeORMQuery>>;
81
+ /**
82
+ * @description Processes a record.
83
+ * @summary Converts a raw result row to a model instance using the adapter.
84
+ * @param {any} r The raw record.
85
+ * @param {keyof M} pkAttr The primary key attribute of the model.
86
+ * @param {"Number" | "BigInt" | undefined} sequenceType The type of the sequence.
87
+ * @return {any} The processed record.
88
+ */
89
+ private processRecord;
90
+ /**
91
+ * @description Executes a raw TypeORM query builder.
92
+ * @summary Sends the built SelectQueryBuilder to the database via TypeORM and returns the results.
93
+ * @template R The result type.
94
+ * @param {TypeORMQuery} rawInput The query container to execute.
95
+ * @return {Promise<R>} A promise that resolves to the query results.
96
+ */
97
+ raw<R>(rawInput: TypeORMQuery<M>): Promise<R>;
98
+ protected parseConditionForPagination(condition: Condition<M>, tableName: string, counter?: number, conditionalOp?: GroupOperator | Operator): FindOptionsWhere<M>[] | FindOptionsWhere<M>;
99
+ /**
100
+ * @description Parses a condition into PostgreSQL conditions
101
+ * @summary Converts a Condition object into PostgreSQL condition structures
102
+ * @param {Condition<M>} condition - The condition to parse
103
+ * @param {string} [tableName] - the positional index of the arguments
104
+ * @return {TypeORMQuery} The PostgresSQL condition
105
+ * @mermaid
106
+ * sequenceDiagram
107
+ * participant Statement
108
+ * participant translateOperators
109
+ * participant parseCondition
110
+ *
111
+ * Statement->>Statement: parseCondition(condition)
112
+ *
113
+ * Note over Statement: Extract condition parts
114
+ *
115
+ * alt Simple comparison operator
116
+ * Statement->>translateOperators: translateOperators(operator)
117
+ * translateOperators-->>Statement: Return PostgreSQL operator
118
+ * Statement->>Statement: Create condition with column, operator, and value
119
+ * else NOT operator
120
+ * Statement->>Statement: parseCondition(attr1)
121
+ * Statement->>Statement: Add NOT to conditions
122
+ * else AND/OR operator
123
+ * Statement->>Statement: parseCondition(attr1)
124
+ * Statement->>Statement: parseCondition(comparison)
125
+ * Statement->>Statement: Combine conditions with AND/OR
126
+ * end
127
+ *
128
+ * Statement-->>Statement: Return conditions array
129
+ */
130
+ protected parseCondition(condition: Condition<M>, tableName: string, qb: SelectQueryBuilder<any>, counter?: number, conditionalOp?: GroupOperator | Operator): TypeORMQuery<M>;
131
+ }
@@ -0,0 +1,242 @@
1
+ import { GroupOperator, Operator, OrderDirection, Repository, Statement, } from "@decaf-ts/core";
2
+ import { ModelKeys } from "@decaf-ts/decorator-validation";
3
+ import { translateOperators } from "./translate.js";
4
+ import { TypeORMQueryLimit } from "./constants.js";
5
+ import { TypeORMPaginator } from "./Paginator.js";
6
+ import { findPrimaryKey, InternalError } from "@decaf-ts/db-decorators";
7
+ /**
8
+ * @description Statement builder for TypeORM-backed queries.
9
+ * @summary Provides a fluent interface for building SQL queries via TypeORM's SelectQueryBuilder with type safety and Decaf.ts abstractions.
10
+ * @template M The model type that extends Model.
11
+ * @template R The result type returned from execution.
12
+ * @param {TypeORMAdapter} adapter The TypeORM adapter.
13
+ * @class TypeORMStatement
14
+ * @example
15
+ * // Example using TypeORMStatement
16
+ * const statement = new TypeORMStatement<User, User[]>(adapter);
17
+ * const users = await statement
18
+ * .from(User)
19
+ * .where(Condition.attribute<User>('age').gt(18))
20
+ * .orderBy('lastName', 'asc')
21
+ * .limit(10)
22
+ * .execute();
23
+ */
24
+ export class TypeORMStatement extends Statement {
25
+ constructor(adapter) {
26
+ super(adapter);
27
+ }
28
+ /**
29
+ * @description Builds a TypeORM SelectQueryBuilder from the statement.
30
+ * @summary Converts the statement's conditions, selectors, and options into a TypeORM-backed query object.
31
+ * @return {TypeORMQuery} The built TypeORM query container.
32
+ * @throws {Error} If there are invalid query conditions.
33
+ * @mermaid
34
+ * sequenceDiagram
35
+ * participant Statement
36
+ * participant Repository
37
+ * participant parseCondition
38
+ *
39
+ * Statement->>Statement: build()
40
+ * Note over Statement: Initialize query
41
+ * Statement->>Repository: Get table name
42
+ * Repository-->>Statement: Return table name
43
+ * Statement->>Statement: Create base query
44
+ *
45
+ * alt Has selectSelector
46
+ * Statement->>Statement: Add columns to query
47
+ * end
48
+ *
49
+ * alt Has whereCondition
50
+ * Statement->>Statement: Create combined condition with table
51
+ * Statement->>parseCondition: Parse condition
52
+ * parseCondition-->>Statement: Return parsed conditions
53
+ * Statement->>Statement: Add conditions to query
54
+ * end
55
+ *
56
+ * alt Has orderBySelector
57
+ * Statement->>Statement: Add orderBy to query
58
+ * end
59
+ *
60
+ * alt Has limitSelector
61
+ * Statement->>Statement: Set limit
62
+ * else
63
+ * Statement->>Statement: Use default limit
64
+ * end
65
+ *
66
+ * alt Has offsetSelector
67
+ * Statement->>Statement: Set offset
68
+ * end
69
+ *
70
+ * Statement-->>Statement: Return query
71
+ */
72
+ build() {
73
+ const log = this.log.for(this.build);
74
+ const tableName = Repository.table(this.fromSelector);
75
+ const m = new this.fromSelector();
76
+ const q = {
77
+ query: this.adapter.dataSource
78
+ .getRepository(this.fromSelector[ModelKeys.ANCHOR])
79
+ .createQueryBuilder(tableName),
80
+ };
81
+ if (this.selectSelector)
82
+ q.query = q.query.select(this.selectSelector.map((s) => `${tableName}.${s}`));
83
+ else
84
+ q.query = q.query.select();
85
+ //
86
+ // q.query = (q.query as SelectQueryBuilder<any>).from(
87
+ // this.fromSelector[ModelKeys.ANCHOR as keyof typeof this.fromSelector],
88
+ // tableName
89
+ // );
90
+ if (this.whereCondition)
91
+ q.query = this.parseCondition(this.whereCondition, tableName, q.query).query;
92
+ let orderByArgs;
93
+ if (!this.orderBySelector)
94
+ orderByArgs = [
95
+ `${tableName}.${findPrimaryKey(m).id}`,
96
+ OrderDirection.ASC.toUpperCase(),
97
+ ];
98
+ else
99
+ orderByArgs = [
100
+ `${tableName}.${this.orderBySelector[0]}`,
101
+ this.orderBySelector[1].toUpperCase(),
102
+ ];
103
+ q.query = q.query.orderBy(...orderByArgs);
104
+ if (this.limitSelector) {
105
+ q.query = q.query.limit(this.limitSelector);
106
+ }
107
+ else {
108
+ log.debug(`No limit selector defined. Using default limit of ${TypeORMQueryLimit}`);
109
+ q.query = q.query.limit(TypeORMQueryLimit);
110
+ }
111
+ // Add offset
112
+ if (this.offsetSelector)
113
+ q.query = q.query.skip(this.offsetSelector);
114
+ return q;
115
+ }
116
+ /**
117
+ * @description Creates a paginator for the statement.
118
+ * @summary Builds the query and returns a TypeORMPaginator for paginated results.
119
+ * @template R The result type.
120
+ * @param {number} size The page size.
121
+ * @return {Promise<Paginator<M, R, TypeORMQuery>>} A promise that resolves to a paginator.
122
+ * @throws {InternalError} If there's an error building the query.
123
+ */
124
+ async paginate(size) {
125
+ try {
126
+ const query = this.build();
127
+ const transformedQuery = {};
128
+ const a = query.query;
129
+ if (this.whereCondition)
130
+ transformedQuery.where = this.parseConditionForPagination(this.whereCondition, Repository.table(this.fromSelector));
131
+ if (this.orderBySelector)
132
+ transformedQuery.order = {
133
+ [this.orderBySelector[0]]: this.orderBySelector[1].toString(),
134
+ };
135
+ return new TypeORMPaginator(this.adapter, transformedQuery, size, this.fromSelector);
136
+ }
137
+ catch (e) {
138
+ throw new InternalError(e);
139
+ }
140
+ }
141
+ /**
142
+ * @description Processes a record.
143
+ * @summary Converts a raw result row to a model instance using the adapter.
144
+ * @param {any} r The raw record.
145
+ * @param {keyof M} pkAttr The primary key attribute of the model.
146
+ * @param {"Number" | "BigInt" | undefined} sequenceType The type of the sequence.
147
+ * @return {any} The processed record.
148
+ */
149
+ processRecord(r, pkAttr) {
150
+ if (typeof r[pkAttr] !== "undefined") {
151
+ return this.adapter.revert(r, this.fromSelector, pkAttr, r[pkAttr]);
152
+ }
153
+ return r;
154
+ }
155
+ /**
156
+ * @description Executes a raw TypeORM query builder.
157
+ * @summary Sends the built SelectQueryBuilder to the database via TypeORM and returns the results.
158
+ * @template R The result type.
159
+ * @param {TypeORMQuery} rawInput The query container to execute.
160
+ * @return {Promise<R>} A promise that resolves to the query results.
161
+ */
162
+ async raw(rawInput) {
163
+ const log = this.log.for(this.raw);
164
+ log.debug(`Executing raw query: ${rawInput.query.getSql()}`);
165
+ return (await rawInput.query.getMany());
166
+ }
167
+ parseConditionForPagination(condition, tableName, counter = 0, conditionalOp) {
168
+ throw new InternalError("Not implemented");
169
+ }
170
+ /**
171
+ * @description Parses a condition into PostgreSQL conditions
172
+ * @summary Converts a Condition object into PostgreSQL condition structures
173
+ * @param {Condition<M>} condition - The condition to parse
174
+ * @param {string} [tableName] - the positional index of the arguments
175
+ * @return {TypeORMQuery} The PostgresSQL condition
176
+ * @mermaid
177
+ * sequenceDiagram
178
+ * participant Statement
179
+ * participant translateOperators
180
+ * participant parseCondition
181
+ *
182
+ * Statement->>Statement: parseCondition(condition)
183
+ *
184
+ * Note over Statement: Extract condition parts
185
+ *
186
+ * alt Simple comparison operator
187
+ * Statement->>translateOperators: translateOperators(operator)
188
+ * translateOperators-->>Statement: Return PostgreSQL operator
189
+ * Statement->>Statement: Create condition with column, operator, and value
190
+ * else NOT operator
191
+ * Statement->>Statement: parseCondition(attr1)
192
+ * Statement->>Statement: Add NOT to conditions
193
+ * else AND/OR operator
194
+ * Statement->>Statement: parseCondition(attr1)
195
+ * Statement->>Statement: parseCondition(comparison)
196
+ * Statement->>Statement: Combine conditions with AND/OR
197
+ * end
198
+ *
199
+ * Statement-->>Statement: Return conditions array
200
+ */
201
+ parseCondition(condition, tableName, qb, counter = 0, conditionalOp) {
202
+ const { attr1, operator, comparison } = condition;
203
+ function parse() {
204
+ const sqlOperator = translateOperators(operator);
205
+ const attrRef = `${attr1}${counter}`;
206
+ const queryStr = `${tableName}.${attr1} ${sqlOperator} :${attrRef}`;
207
+ const values = {
208
+ [attrRef]: comparison,
209
+ };
210
+ switch (conditionalOp) {
211
+ case GroupOperator.AND:
212
+ return {
213
+ query: qb.andWhere(queryStr, values),
214
+ };
215
+ case GroupOperator.OR:
216
+ return {
217
+ query: qb.orWhere(queryStr, values),
218
+ };
219
+ case Operator.NOT:
220
+ throw new Error("NOT operator not implemented");
221
+ default:
222
+ return {
223
+ query: qb.where(queryStr, values),
224
+ };
225
+ }
226
+ }
227
+ if ([GroupOperator.AND, GroupOperator.OR, Operator.NOT].indexOf(operator) === -1) {
228
+ return parse();
229
+ }
230
+ // For NOT operator
231
+ else if (operator === Operator.NOT) {
232
+ throw new Error("NOT operator not implemented");
233
+ }
234
+ // For AND/OR operators
235
+ else {
236
+ qb = this.parseCondition(attr1, tableName, qb, ++counter)
237
+ .query;
238
+ return this.parseCondition(comparison, tableName, qb, ++counter, operator);
239
+ }
240
+ }
241
+ }
242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhdGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3F1ZXJ5L1N0YXRlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsYUFBYSxFQUNiLFFBQVEsRUFDUixjQUFjLEVBRWQsVUFBVSxFQUNWLFNBQVMsR0FDVixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBUyxTQUFTLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsdUJBQW9CO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx1QkFBb0I7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUFvQjtBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBT3hFOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxPQUFPLGdCQUFxQyxTQUFRLFNBSXpEO0lBR0MsWUFBWSxPQUF1QjtRQUNqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BMkNHO0lBQ08sS0FBSztRQUNiLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0RCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxNQUFNLENBQUMsR0FBMkM7WUFDaEQsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtpQkFDM0IsYUFBYSxDQUNaLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQXdDLENBQUMsQ0FD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O1lBQ0QsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNqQixDQUFDO1FBQ0QsbUJBQW1CO2FBQ2QsSUFBSSxRQUFRLEtBQUssUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsdUJBQXVCO2FBQ2xCLENBQUM7WUFDSixFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFxQixFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUM7aUJBQ3RFLEtBQXlDLENBQUM7WUFDN0MsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUN4QixVQUFVLEVBQ1YsU0FBUyxFQUNULEVBQUUsRUFDRixFQUFFLE9BQU8sRUFDVCxRQUFRLENBQ1QsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE9wZXJhdG9yLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGFnaW5hdG9yLFxuICBSZXBvc2l0b3J5LFxuICBTdGF0ZW1lbnQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHRyYW5zbGF0ZU9wZXJhdG9ycyB9IGZyb20gXCIuL3RyYW5zbGF0ZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5TGltaXQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFR5cGVPUk1QYWdpbmF0b3IgfSBmcm9tIFwiLi9QYWdpbmF0b3JcIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5LCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBGaW5kT3B0aW9uc1doZXJlIH0gZnJvbSBcInR5cGVvcm0vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zV2hlcmVcIjtcbmltcG9ydCB7IEZpbmRPcHRpb25zT3JkZXIgfSBmcm9tIFwidHlwZW9ybS9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNPcmRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGF0ZW1lbnQgYnVpbGRlciBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZmx1ZW50IGludGVyZmFjZSBmb3IgYnVpbGRpbmcgU1FMIHF1ZXJpZXMgdmlhIFR5cGVPUk0ncyBTZWxlY3RRdWVyeUJ1aWxkZXIgd2l0aCB0eXBlIHNhZmV0eSBhbmQgRGVjYWYudHMgYWJzdHJhY3Rpb25zLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGZyb20gZXhlY3V0aW9uLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzaW5nIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBUeXBlT1JNU3RhdGVtZW50PFVzZXIsIFVzZXJbXT4oYWRhcHRlcik7XG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZTxVc2VyPignYWdlJykuZ3QoMTgpKVxuICogICAub3JkZXJCeSgnbGFzdE5hbWUnLCAnYXNjJylcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STVN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBUeXBlT1JNUXVlcnk8TT4sXG4gIE0sXG4gIFJcbj4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWRhcHRlciE6IFR5cGVPUk1BZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IFR5cGVPUk1BZGFwdGVyKSB7XG4gICAgc3VwZXIoYWRhcHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGZyb20gdGhlIHN0YXRlbWVudC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIFR5cGVPUk0tYmFja2VkIHF1ZXJ5IG9iamVjdC5cbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgYnVpbHQgVHlwZU9STSBxdWVyeSBjb250YWluZXIuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBhcmUgaW52YWxpZCBxdWVyeSBjb25kaXRpb25zLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBTdGF0ZW1lbnRcbiAgICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VDb25kaXRpb25cbiAgICpcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IGJ1aWxkKClcbiAgICogICBOb3RlIG92ZXIgU3RhdGVtZW50OiBJbml0aWFsaXplIHF1ZXJ5XG4gICAqICAgU3RhdGVtZW50LT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAgICogICBSZXBvc2l0b3J5LS0+PlN0YXRlbWVudDogUmV0dXJuIHRhYmxlIG5hbWVcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENyZWF0ZSBiYXNlIHF1ZXJ5XG4gICAqXG4gICAqICAgYWx0IEhhcyBzZWxlY3RTZWxlY3RvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29sdW1ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgd2hlcmVDb25kaXRpb25cbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbWJpbmVkIGNvbmRpdGlvbiB3aXRoIHRhYmxlXG4gICAqICAgICBTdGF0ZW1lbnQtPj5wYXJzZUNvbmRpdGlvbjogUGFyc2UgY29uZGl0aW9uXG4gICAqICAgICBwYXJzZUNvbmRpdGlvbi0tPj5TdGF0ZW1lbnQ6IFJldHVybiBwYXJzZWQgY29uZGl0aW9uc1xuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29uZGl0aW9ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgb3JkZXJCeVNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBvcmRlckJ5IHRvIHF1ZXJ5XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyBsaW1pdFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBsaW1pdFxuICAgKiAgIGVsc2VcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogVXNlIGRlZmF1bHQgbGltaXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIG9mZnNldFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBvZmZzZXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBTdGF0ZW1lbnQtLT4+U3RhdGVtZW50OiBSZXR1cm4gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZCgpOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBtID0gbmV3IHRoaXMuZnJvbVNlbGVjdG9yKCk7XG5cbiAgICBjb25zdCBxOiBUeXBlT1JNUXVlcnk8TSwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+PiA9IHtcbiAgICAgIHF1ZXJ5OiB0aGlzLmFkYXB0ZXIuZGF0YVNvdXJjZVxuICAgICAgICAuZ2V0UmVwb3NpdG9yeShcbiAgICAgICAgICB0aGlzLmZyb21TZWxlY3RvcltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmZyb21TZWxlY3Rvcl1cbiAgICAgICAgKVxuICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHRhYmxlTmFtZSkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdChcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5tYXAoKHMpID0+IGAke3RhYmxlTmFtZX0uJHtzIGFzIHN0cmluZ31gKVxuICAgICAgKTtcbiAgICBlbHNlIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdCgpO1xuICAgIC8vXG4gICAgLy8gcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5mcm9tKFxuICAgIC8vICAgdGhpcy5mcm9tU2VsZWN0b3JbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5mcm9tU2VsZWN0b3JdLFxuICAgIC8vICAgdGFibGVOYW1lXG4gICAgLy8gKTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKVxuICAgICAgcS5xdWVyeSA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIHRoaXMud2hlcmVDb25kaXRpb24sXG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PlxuICAgICAgKS5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcblxuICAgIGxldCBvcmRlckJ5QXJnczogW3N0cmluZywgXCJERVNDXCIgfCBcIkFTQ1wiXTtcbiAgICBpZiAoIXRoaXMub3JkZXJCeVNlbGVjdG9yKVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHtmaW5kUHJpbWFyeUtleShtKS5pZCBhcyBzdHJpbmd9YCxcbiAgICAgICAgT3JkZXJEaXJlY3Rpb24uQVNDLnRvVXBwZXJDYXNlKCkgYXMgXCJBU0NcIixcbiAgICAgIF07XG4gICAgZWxzZVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHt0aGlzLm9yZGVyQnlTZWxlY3RvclswXSBhcyBzdHJpbmd9YCxcbiAgICAgICAgdGhpcy5vcmRlckJ5U2VsZWN0b3JbMV0udG9VcHBlckNhc2UoKSBhcyBcIkRFU0NcIiB8IFwiQVNDXCIsXG4gICAgICBdO1xuXG4gICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5vcmRlckJ5KC4uLm9yZGVyQnlBcmdzKTtcbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLmxpbWl0KHRoaXMubGltaXRTZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYE5vIGxpbWl0IHNlbGVjdG9yIGRlZmluZWQuIFVzaW5nIGRlZmF1bHQgbGltaXQgb2YgJHtUeXBlT1JNUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5saW1pdChUeXBlT1JNUXVlcnlMaW1pdCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG9mZnNldFxuICAgIGlmICh0aGlzLm9mZnNldFNlbGVjdG9yKVxuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5za2lwKHRoaXMub2Zmc2V0U2VsZWN0b3IpO1xuXG4gICAgcmV0dXJuIHEgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcGFnaW5hdG9yIGZvciB0aGUgc3RhdGVtZW50LlxuICAgKiBAc3VtbWFyeSBCdWlsZHMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGEgVHlwZU9STVBhZ2luYXRvciBmb3IgcGFnaW5hdGVkIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgVHlwZU9STVF1ZXJ5Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgcGFnaW5hdG9yLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSdzIGFuIGVycm9yIGJ1aWxkaW5nIHRoZSBxdWVyeS5cbiAgICovXG4gIGFzeW5jIHBhZ2luYXRlPFI+KHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFR5cGVPUk1RdWVyeT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnk6IFR5cGVPUk1RdWVyeSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUXVlcnk6IEZpbmRNYW55T3B0aW9uczxNPiA9IHt9O1xuICAgICAgY29uc3QgYSA9IHF1ZXJ5LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+O1xuICAgICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pXG4gICAgICAgIHRyYW5zZm9ybWVkUXVlcnkud2hlcmUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uRm9yUGFnaW5hdGlvbihcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIFJlcG9zaXRvcnkudGFibGUodGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcilcbiAgICAgICAgdHJhbnNmb3JtZWRRdWVyeS5vcmRlciA9IHtcbiAgICAgICAgICBbdGhpcy5vcmRlckJ5U2VsZWN0b3JbMF1dOiB0aGlzLm9yZGVyQnlTZWxlY3RvclsxXS50b1N0cmluZygpLFxuICAgICAgICB9IGFzIGFueTtcblxuICAgICAgcmV0dXJuIG5ldyBUeXBlT1JNUGFnaW5hdG9yKFxuICAgICAgICB0aGlzLmFkYXB0ZXIgYXMgYW55LFxuICAgICAgICB0cmFuc2Zvcm1lZFF1ZXJ5IGFzIGFueSxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSByYXcgcmVzdWx0IHJvdyB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIHRoZSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge2FueX0gciBUaGUgcmF3IHJlY29yZC5cbiAgICogQHBhcmFtIHtrZXlvZiBNfSBwa0F0dHIgVGhlIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBvZiB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7XCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCB1bmRlZmluZWR9IHNlcXVlbmNlVHlwZSBUaGUgdHlwZSBvZiB0aGUgc2VxdWVuY2UuXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHByb2Nlc3NlZCByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NSZWNvcmQocjogYW55LCBwa0F0dHI6IGtleW9mIE0pIHtcbiAgICBpZiAodHlwZW9mIHJbcGtBdHRyXSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5mcm9tU2VsZWN0b3IsIHBrQXR0ciwgcltwa0F0dHJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IFR5cGVPUk0gcXVlcnkgYnVpbGRlci5cbiAgICogQHN1bW1hcnkgU2VuZHMgdGhlIGJ1aWx0IFNlbGVjdFF1ZXJ5QnVpbGRlciB0byB0aGUgZGF0YWJhc2UgdmlhIFR5cGVPUk0gYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHJhd0lucHV0IFRoZSBxdWVyeSBjb250YWluZXIgdG8gZXhlY3V0ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IFR5cGVPUk1RdWVyeTxNPik6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJhdyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEV4ZWN1dGluZyByYXcgcXVlcnk6ICR7KHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+KS5nZXRTcWwoKX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IChcbiAgICAgIHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+XG4gICAgKS5nZXRNYW55KCkpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VDb25kaXRpb25Gb3JQYWdpbmF0aW9uKFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGNvdW50ZXIgPSAwLFxuICAgIGNvbmRpdGlvbmFsT3A/OiBHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3JcbiAgKTogRmluZE9wdGlvbnNXaGVyZTxNPltdIHwgRmluZE9wdGlvbnNXaGVyZTxNPiB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIFBvc3RncmVTUUwgY29uZGl0aW9uc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBQb3N0Z3JlU1FMIGNvbmRpdGlvbiBzdHJ1Y3R1cmVzXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFibGVOYW1lXSAtIHRoZSBwb3NpdGlvbmFsIGluZGV4IG9mIHRoZSBhcmd1bWVudHNcbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgUG9zdGdyZXNTUUwgY29uZGl0aW9uXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICAgKiAgIHBhcnRpY2lwYW50IHBhcnNlQ29uZGl0aW9uXG4gICAqXG4gICAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihjb25kaXRpb24pXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIFN0YXRlbWVudDogRXh0cmFjdCBjb25kaXRpb24gcGFydHNcbiAgICpcbiAgICogICBhbHQgU2ltcGxlIGNvbXBhcmlzb24gb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PnRyYW5zbGF0ZU9wZXJhdG9yczogdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKVxuICAgKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PlN0YXRlbWVudDogUmV0dXJuIFBvc3RncmVTUUwgb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbmRpdGlvbiB3aXRoIGNvbHVtbiwgb3BlcmF0b3IsIGFuZCB2YWx1ZVxuICAgKiAgIGVsc2UgTk9UIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGF0dHIxKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgTk9UIHRvIGNvbmRpdGlvbnNcbiAgICogICBlbHNlIEFORC9PUiBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihhdHRyMSlcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oY29tcGFyaXNvbilcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ29tYmluZSBjb25kaXRpb25zIHdpdGggQU5EL09SXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgU3RhdGVtZW50LS0+PlN0YXRlbWVudDogUmV0dXJuIGNvbmRpdGlvbnMgYXJyYXlcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZUNvbmRpdGlvbihcbiAgICBjb25kaXRpb246IENvbmRpdGlvbjxNPixcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgY291bnRlciA9IDAsXG4gICAgY29uZGl0aW9uYWxPcD86IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuICApOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcGFyc2UoKTogVHlwZU9STVF1ZXJ5PE0+IHtcbiAgICAgIGNvbnN0IHNxbE9wZXJhdG9yID0gdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKTtcbiAgICAgIGNvbnN0IGF0dHJSZWYgPSBgJHthdHRyMX0ke2NvdW50ZXJ9YDtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyID0gYCR7dGFibGVOYW1lfS4ke2F0dHIxfSAke3NxbE9wZXJhdG9yfSA6JHthdHRyUmVmfWA7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgIFthdHRyUmVmXTogY29tcGFyaXNvbixcbiAgICAgIH07XG4gICAgICBzd2l0Y2ggKGNvbmRpdGlvbmFsT3ApIHtcbiAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVlcnk6IHFiLmFuZFdoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuT1I6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxYi5vcldoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIE9wZXJhdG9yLk5PVDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1Qgb3BlcmF0b3Igbm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeTogcWIud2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gcGFyc2UoKTtcbiAgICB9XG4gICAgLy8gRm9yIE5PVCBvcGVyYXRvclxuICAgIGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVCBvcGVyYXRvciBub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfVxuICAgIC8vIEZvciBBTkQvT1Igb3BlcmF0b3JzXG4gICAgZWxzZSB7XG4gICAgICBxYiA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+LCB0YWJsZU5hbWUsIHFiLCArK2NvdW50ZXIpXG4gICAgICAgIC5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICBjb21wYXJpc29uLFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHFiLFxuICAgICAgICArK2NvdW50ZXIsXG4gICAgICAgIG9wZXJhdG9yXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,52 @@
1
+ import { SQLOperator } from "../types";
2
+ /**
3
+ * @description Default query limit for TypeORM-backed queries.
4
+ * @summary Maximum number of records to return in a single page when paginating results.
5
+ * @const TypeORMQueryLimit
6
+ * @memberOf module:for-typeorm
7
+ */
8
+ export declare const TypeORMQueryLimit = 250;
9
+ /**
10
+ * @description Mapping of operator names to SQL operators.
11
+ * @summary Constants for comparison operators used when translating high-level filters into SQL via TypeORM.
12
+ * @typedef {Object} PostgreSQLOperatorType
13
+ * @property {string} EQUAL Equality operator (=)
14
+ * @property {string} DIFFERENT Inequality operator (<>)
15
+ * @property {string} BIGGER Greater than operator (>)
16
+ * @property {string} BIGGER_EQ Greater than or equal operator (>=)
17
+ * @property {string} SMALLER Less than operator (<)
18
+ * @property {string} SMALLER_EQ Less than or equal operator (<=)
19
+ * @property {string} NOT Negation operator (NOT)
20
+ * @property {string} IN In array operator (IN)
21
+ * @property {string} REGEXP Regular expression operator (~)
22
+ * @property {string} IREGEXP Case-insensitive regular expression operator (~*)
23
+ * @property {string} LIKE Pattern matching operator (LIKE)
24
+ * @property {string} ILIKE Case-insensitive pattern matching operator (ILIKE)
25
+ * @property {string} BETWEEN Range operator (BETWEEN)
26
+ * @property {string} IS_NULL NULL check operator (IS NULL)
27
+ * @property {string} IS_NOT_NULL NOT NULL check operator (IS NOT NULL)
28
+ * @const TypeORMOperator
29
+ * @type {PostgreSQLOperatorType}
30
+ * @memberOf module:for-typeorm
31
+ */
32
+ export declare const TypeORMOperator: Record<string, SQLOperator | string>;
33
+ /**
34
+ * @description Mapping of logical operator names to SQL operators.
35
+ * @summary Constants for logical operators used when building WHERE clause groups in TypeORM queries.
36
+ * @typedef {Object} PostgreSQLGroupOperatorType
37
+ * @property {string} AND Logical AND operator (AND)
38
+ * @property {string} OR Logical OR operator (OR)
39
+ * @const TypeORMGroupOperator
40
+ * @type {PostgreSQLGroupOperatorType}
41
+ * @memberOf module:for-typeorm
42
+ */
43
+ export declare const TypeORMGroupOperator: Record<string, string>;
44
+ /**
45
+ * @description Special constant values used in queries.
46
+ * @summary String constants representing special values used while composing SQL with TypeORM.
47
+ * @typedef {Object} PostgreSQLConstType
48
+ * @property {string} NULL String representation of null value.
49
+ * @const TypeORMConst
50
+ * @memberOf module:for-typeorm
51
+ */
52
+ export declare const TypeORMConst: Record<string, string>;