velocious 1.0.169 → 1.0.171

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 (39) hide show
  1. package/README.md +38 -0
  2. package/build/src/database/query/join-object.d.ts +18 -1
  3. package/build/src/database/query/join-object.d.ts.map +1 -1
  4. package/build/src/database/query/join-object.js +57 -9
  5. package/build/src/database/query/join-tracker.d.ts +49 -0
  6. package/build/src/database/query/join-tracker.d.ts.map +1 -0
  7. package/build/src/database/query/join-tracker.js +72 -0
  8. package/build/src/database/query/model-class-query.d.ts +59 -1
  9. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  10. package/build/src/database/query/model-class-query.js +103 -4
  11. package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
  12. package/build/src/database/query/preloader/belongs-to.js +7 -3
  13. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  14. package/build/src/database/query/preloader/has-many.js +4 -2
  15. package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
  16. package/build/src/database/query/preloader/has-one.js +4 -2
  17. package/build/src/database/query/where-model-class-hash.d.ts +2 -1
  18. package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
  19. package/build/src/database/query/where-model-class-hash.js +12 -5
  20. package/build/src/database/record/index.d.ts +25 -5
  21. package/build/src/database/record/index.d.ts.map +1 -1
  22. package/build/src/database/record/index.js +36 -9
  23. package/build/src/database/record/instance-relationships/base.d.ts +6 -0
  24. package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
  25. package/build/src/database/record/instance-relationships/base.js +9 -1
  26. package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
  27. package/build/src/database/record/instance-relationships/belongs-to.js +7 -2
  28. package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
  29. package/build/src/database/record/instance-relationships/has-many.js +4 -3
  30. package/build/src/database/record/instance-relationships/has-one.d.ts.map +1 -1
  31. package/build/src/database/record/instance-relationships/has-one.js +4 -2
  32. package/build/src/database/record/relationships/base.d.ts +19 -1
  33. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  34. package/build/src/database/record/relationships/base.js +21 -2
  35. package/build/src/testing/test.d.ts +9 -0
  36. package/build/src/testing/test.d.ts.map +1 -1
  37. package/build/src/testing/test.js +98 -2
  38. package/build/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +1 -1
package/README.md CHANGED
@@ -70,6 +70,17 @@ export default async function configureTesting() {
70
70
  }
71
71
  ```
72
72
 
73
+ ## Expectations
74
+
75
+ Common matchers:
76
+
77
+ ```js
78
+ expect(value).toBeTruthy()
79
+ expect(value).toMatchObject({status: "success"})
80
+ expect({a: 1, b: 2}).toEqual(expect.objectContaining({a: 1}))
81
+ expect([1, 2, 3]).toEqual(expect.arrayContaining([2, 3]))
82
+ ```
83
+
73
84
  # Models
74
85
 
75
86
  ```bash
@@ -115,6 +126,33 @@ await project.loadTasks()
115
126
  const tasks = project.tasks().loaded()
116
127
  ```
117
128
 
129
+ ## Relationship scopes
130
+
131
+ You can pass a scope callback to `hasMany`, `hasOne`, or `belongsTo` to add custom filters. The callback receives the query and is also bound as `this`:
132
+
133
+ ```js
134
+ Project.hasMany("acceptedTasks", (scope) => scope.where({state: "accepted"}), {className: "Task"})
135
+ Project.hasOne("activeDetail", function() { return this.where({isActive: true}) }, {className: "ProjectDetail"})
136
+ Comment.belongsTo("acceptedTask", (scope) => scope.where({state: "accepted"}), {className: "Task"})
137
+ ```
138
+
139
+ ### Join path table references
140
+
141
+ When joining relationships, use `getTableForJoin` to retrieve the table (or alias) for a join path:
142
+
143
+ ```js
144
+ const query = Task.joins({project: {account: true}})
145
+ const accountTable = query.getTableForJoin("project", "account")
146
+ ```
147
+
148
+ Inside relationship scopes, `getTableForJoin()` is relative to the current scope path:
149
+
150
+ ```js
151
+ Project.hasMany("acceptedTasks", function() {
152
+ return this.where(`${this.getTableForJoin()}.state = 'accepted'`)
153
+ }, {className: "Task"})
154
+ ```
155
+
118
156
  ### Finding records
119
157
 
120
158
  `find()` and `findByOrFail()` throw an error when no record is found. `findBy()` returns `null`. These apply to records.
@@ -13,9 +13,26 @@ export default class VelociousDatabaseQueryJoinObject extends JoinBase {
13
13
  * @param {typeof import("../record/index.js").default} modelClass - Model class.
14
14
  * @param {string} sql - SQL string.
15
15
  * @param {number} joinsCount - Joins count.
16
+ * @param {string[]} path - Join path.
16
17
  * @returns {string} - The join object.
17
18
  */
18
- joinObject(join: JoinObject, modelClass: typeof import("../record/index.js").default, sql: string, joinsCount: number): string;
19
+ joinObject(join: JoinObject, modelClass: typeof import("../record/index.js").default, sql: string, joinsCount: number, path: string[]): string;
20
+ /**
21
+ * @param {object} args - Options object.
22
+ * @param {import("../record/relationships/base.js").default} args.relationship - Relationship definition.
23
+ * @param {import("./model-class-query.js").default} args.query - Model class query.
24
+ * @param {typeof import("../record/index.js").default} args.targetModelClass - Target model class.
25
+ * @param {string[]} args.joinPath - Join path.
26
+ * @param {string} args.targetTableRef - Target table reference.
27
+ * @returns {string} - Scope SQL.
28
+ */
29
+ _scopeSql({ relationship, query, targetModelClass, joinPath, targetTableRef }: {
30
+ relationship: import("../record/relationships/base.js").default;
31
+ query: import("./model-class-query.js").default<any>;
32
+ targetModelClass: typeof import("../record/index.js").default;
33
+ joinPath: string[];
34
+ targetTableRef: string;
35
+ }): string;
19
36
  }
20
37
  export type JoinObject = {
21
38
  [key: string]: boolean | JoinObject;
@@ -1 +1 @@
1
- {"version":3,"file":"join-object.d.ts","sourceRoot":"","sources":["../../../../src/database/query/join-object.js"],"names":[],"mappings":"AAIA;;GAEG;AAEH;IACE;;OAEG;IACH,oBAFW,UAAU,EAKpB;IADC,mBAAoB;IAGtB,gBAWC;IAED;;;;;;OAMG;IACH,iBANW,UAAU,cACV,cAAc,oBAAoB,EAAE,OAAO,OAC3C,MAAM,cACN,MAAM,GACJ,MAAM,CAqClB;CACF;yBApEY;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAA;CAAC;qBAH7B,gBAAgB"}
1
+ {"version":3,"file":"join-object.d.ts","sourceRoot":"","sources":["../../../../src/database/query/join-object.js"],"names":[],"mappings":"AAKA;;GAEG;AAEH;IACE;;OAEG;IACH,oBAFW,UAAU,EAKpB;IADC,mBAAoB;IAGtB,gBAaC;IAED;;;;;;;OAOG;IACH,iBAPW,UAAU,cACV,cAAc,oBAAoB,EAAE,OAAO,OAC3C,MAAM,cACN,MAAM,QACN,MAAM,EAAE,GACN,MAAM,CAmDlB;IAED;;;;;;;;OAQG;IACH,+EAPG;QAAgE,YAAY,EAApE,OAAO,iCAAiC,EAAE,OAAO;QACF,KAAK,EAApD,6CAAwC;QACU,gBAAgB,EAAlE,cAAc,oBAAoB,EAAE,OAAO;QAC5B,QAAQ,EAAvB,MAAM,EAAE;QACK,cAAc,EAA3B,MAAM;KACd,GAAU,MAAM,CA4BlB;CACF;yBA1HY;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAA;CAAC;qBAJ7B,gBAAgB"}
@@ -1,5 +1,6 @@
1
1
  // @ts-check
2
2
  import JoinBase from "./join-base.js";
3
+ import WhereHash from "./where-hash.js";
3
4
  /**
4
5
  * @typedef {{[key: string]: boolean | JoinObject}} JoinObject
5
6
  */
@@ -18,22 +19,32 @@ export default class VelociousDatabaseQueryJoinObject extends JoinBase {
18
19
  }
19
20
  // @ts-expect-error
20
21
  const ModelClass = /** @type {typeof import("../record/index.js").default} */ (query.modelClass);
21
- return this.joinObject(this.object, ModelClass, "", 0);
22
+ const modelQuery = /** @type {import("./model-class-query.js").default} */ (query);
23
+ return this.joinObject(this.object, ModelClass, "", 0, modelQuery.getJoinBasePath());
22
24
  }
23
25
  /**
24
26
  * @param {JoinObject} join - Join.
25
27
  * @param {typeof import("../record/index.js").default} modelClass - Model class.
26
28
  * @param {string} sql - SQL string.
27
29
  * @param {number} joinsCount - Joins count.
30
+ * @param {string[]} path - Join path.
28
31
  * @returns {string} - The join object.
29
32
  */
30
- joinObject(join, modelClass, sql, joinsCount) {
33
+ joinObject(join, modelClass, sql, joinsCount, path) {
31
34
  const pretty = this.pretty;
32
35
  const conn = this.getQuery().driver;
36
+ const query = /** @type {import("./model-class-query.js").default} */ (this.getQuery());
33
37
  for (const joinKey in join) {
34
38
  const joinValue = join[joinKey];
35
39
  const relationship = modelClass.getRelationshipByName(joinKey);
36
40
  const targetModelClass = relationship.getTargetModelClass();
41
+ const joinPath = path.concat([joinKey]);
42
+ const parentTableRef = query.getJoinTableReference(path);
43
+ const targetEntry = query._registerJoinPath(joinPath);
44
+ const targetTableRef = targetEntry.alias || targetEntry.tableName;
45
+ const joinTableSql = targetEntry.alias
46
+ ? `${conn.quoteTable(targetEntry.tableName)} AS ${conn.quoteTable(targetEntry.alias)}`
47
+ : conn.quoteTable(targetEntry.tableName);
37
48
  if (joinsCount > 0) {
38
49
  if (pretty) {
39
50
  sql += "\n\n";
@@ -42,23 +53,60 @@ export default class VelociousDatabaseQueryJoinObject extends JoinBase {
42
53
  sql += " ";
43
54
  }
44
55
  }
45
- sql += `LEFT JOIN ${conn.quoteTable(targetModelClass.tableName())} ON `;
56
+ sql += `LEFT JOIN ${joinTableSql} ON `;
46
57
  if (relationship.getType() == "belongsTo") {
47
- sql += `${conn.quoteTable(targetModelClass.tableName())}.${conn.quoteColumn(relationship.getPrimaryKey())} = `;
48
- sql += `${conn.quoteTable(modelClass.tableName())}.${conn.quoteColumn(relationship.getForeignKey())}`;
58
+ sql += `${conn.quoteTable(targetTableRef)}.${conn.quoteColumn(relationship.getPrimaryKey())} = `;
59
+ sql += `${conn.quoteTable(parentTableRef)}.${conn.quoteColumn(relationship.getForeignKey())}`;
49
60
  }
50
61
  else if (relationship.getType() == "hasMany" || relationship.getType() == "hasOne") {
51
- sql += `${conn.quoteTable(targetModelClass.tableName())}.${conn.quoteColumn(relationship.getForeignKey())} = `;
52
- sql += `${conn.quoteTable(modelClass.tableName())}.${conn.quoteColumn(relationship.getPrimaryKey())}`;
62
+ sql += `${conn.quoteTable(targetTableRef)}.${conn.quoteColumn(relationship.getForeignKey())} = `;
63
+ sql += `${conn.quoteTable(parentTableRef)}.${conn.quoteColumn(relationship.getPrimaryKey())}`;
53
64
  }
54
65
  else {
55
66
  throw new Error(`Unknown relationship type: ${relationship.getType()}`);
56
67
  }
68
+ const scopeSql = this._scopeSql({ relationship, query, targetModelClass, joinPath, targetTableRef });
69
+ if (scopeSql) {
70
+ sql += ` AND ${scopeSql}`;
71
+ }
57
72
  if (typeof joinValue == "object") {
58
- sql = this.joinObject(joinValue, targetModelClass, sql, joinsCount + 1);
73
+ sql = this.joinObject(joinValue, targetModelClass, sql, joinsCount + 1, joinPath);
59
74
  }
60
75
  }
61
76
  return sql;
62
77
  }
78
+ /**
79
+ * @param {object} args - Options object.
80
+ * @param {import("../record/relationships/base.js").default} args.relationship - Relationship definition.
81
+ * @param {import("./model-class-query.js").default} args.query - Model class query.
82
+ * @param {typeof import("../record/index.js").default} args.targetModelClass - Target model class.
83
+ * @param {string[]} args.joinPath - Join path.
84
+ * @param {string} args.targetTableRef - Target table reference.
85
+ * @returns {string} - Scope SQL.
86
+ */
87
+ _scopeSql({ relationship, query, targetModelClass, joinPath, targetTableRef }) {
88
+ if (!relationship.getScope())
89
+ return "";
90
+ const scopedQuery = query.buildJoinScopeQuery(targetModelClass, joinPath);
91
+ const appliedQuery = relationship.applyScope(scopedQuery) || scopedQuery;
92
+ const wheres = appliedQuery._wheres;
93
+ if (!wheres || wheres.length === 0)
94
+ return "";
95
+ const parts = [];
96
+ for (const where of wheres) {
97
+ if (where instanceof WhereHash) {
98
+ const hash = where.hash;
99
+ const hasNested = Object.values(hash).some((value) => value !== null && typeof value === "object" && !Array.isArray(value));
100
+ const whereSql = hasNested
101
+ ? where.toSql()
102
+ : `(${where._whereSQLFromHash(hash, targetTableRef)})`;
103
+ parts.push(whereSql);
104
+ }
105
+ else {
106
+ parts.push(where.toSql());
107
+ }
108
+ }
109
+ return parts.join(" AND ");
110
+ }
63
111
  }
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9pbi1vYmplY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvcXVlcnkvam9pbi1vYmplY3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sUUFBUSxNQUFNLGdCQUFnQixDQUFBO0FBRXJDOztHQUVHO0FBRUgsTUFBTSxDQUFDLE9BQU8sT0FBTyxnQ0FBaUMsU0FBUSxRQUFRO0lBQ3BFOztPQUVHO0lBQ0gsWUFBWSxNQUFNO1FBQ2hCLEtBQUssRUFBRSxDQUFBO1FBQ1AsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7SUFDdEIsQ0FBQztJQUVELEtBQUs7UUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7UUFFN0IsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSx1Q0FBdUMsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUMxRixDQUFDO1FBRUQsbUJBQW1CO1FBQ25CLE1BQU0sVUFBVSxHQUFHLDBEQUEwRCxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRWhHLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDeEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxVQUFVO1FBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUE7UUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQTtRQUVuQyxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzNCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMvQixNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDOUQsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtZQUUzRCxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDWCxHQUFHLElBQUksTUFBTSxDQUFBO2dCQUNmLENBQUM7cUJBQU0sQ0FBQztvQkFDTixHQUFHLElBQUksR0FBRyxDQUFBO2dCQUNaLENBQUM7WUFDSCxDQUFDO1lBRUQsR0FBRyxJQUFJLGFBQWEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUE7WUFFdkUsSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQzFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxLQUFLLENBQUE7Z0JBQzlHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFBO1lBQ3ZHLENBQUM7aUJBQU0sSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksU0FBUyxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDckYsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssQ0FBQTtnQkFDOUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUE7WUFDdkcsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDekUsQ0FBQztZQUVELElBQUksT0FBTyxTQUFTLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2pDLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQ3pFLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEpvaW5CYXNlIGZyb20gXCIuL2pvaW4tYmFzZS5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge3tba2V5OiBzdHJpbmddOiBib29sZWFuIHwgSm9pbk9iamVjdH19IEpvaW5PYmplY3RcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNEYXRhYmFzZVF1ZXJ5Sm9pbk9iamVjdCBleHRlbmRzIEpvaW5CYXNlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7Sm9pbk9iamVjdH0gb2JqZWN0IC0gT2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqZWN0KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0XG4gIH1cblxuICB0b1NxbCgpIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuZ2V0UXVlcnkoKVxuXG4gICAgaWYgKHF1ZXJ5LmNvbnN0cnVjdG9yLm5hbWUgIT0gXCJWZWxvY2lvdXNEYXRhYmFzZVF1ZXJ5TW9kZWxDbGFzc1F1ZXJ5XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUXVlcnkgaGFzIHRvIGJlIGEgTW9kZWxDbGFzc1F1ZXJ5IGJ1dCB3YXMgYSAke3F1ZXJ5LmNvbnN0cnVjdG9yLm5hbWV9YClcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAocXVlcnkubW9kZWxDbGFzcylcblxuICAgIHJldHVybiB0aGlzLmpvaW5PYmplY3QodGhpcy5vYmplY3QsIE1vZGVsQ2xhc3MsIFwiXCIsIDApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtKb2luT2JqZWN0fSBqb2luIC0gSm9pbi5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNxbCAtIFNRTCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBqb2luc0NvdW50IC0gSm9pbnMgY291bnQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGpvaW4gb2JqZWN0LlxuICAgKi9cbiAgam9pbk9iamVjdChqb2luLCBtb2RlbENsYXNzLCBzcWwsIGpvaW5zQ291bnQpIHtcbiAgICBjb25zdCBwcmV0dHkgPSB0aGlzLnByZXR0eVxuICAgIGNvbnN0IGNvbm4gPSB0aGlzLmdldFF1ZXJ5KCkuZHJpdmVyXG5cbiAgICBmb3IgKGNvbnN0IGpvaW5LZXkgaW4gam9pbikge1xuICAgICAgY29uc3Qgam9pblZhbHVlID0gam9pbltqb2luS2V5XVxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoam9pbktleSlcbiAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICAgIGlmIChqb2luc0NvdW50ID4gMCkge1xuICAgICAgICBpZiAocHJldHR5KSB7XG4gICAgICAgICAgc3FsICs9IFwiXFxuXFxuXCJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcWwgKz0gXCIgXCJcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzcWwgKz0gYExFRlQgSk9JTiAke2Nvbm4ucXVvdGVUYWJsZSh0YXJnZXRNb2RlbENsYXNzLnRhYmxlTmFtZSgpKX0gT04gYFxuXG4gICAgICBpZiAocmVsYXRpb25zaGlwLmdldFR5cGUoKSA9PSBcImJlbG9uZ3NUb1wiKSB7XG4gICAgICAgIHNxbCArPSBgJHtjb25uLnF1b3RlVGFibGUodGFyZ2V0TW9kZWxDbGFzcy50YWJsZU5hbWUoKSl9LiR7Y29ubi5xdW90ZUNvbHVtbihyZWxhdGlvbnNoaXAuZ2V0UHJpbWFyeUtleSgpKX0gPSBgXG4gICAgICAgIHNxbCArPSBgJHtjb25uLnF1b3RlVGFibGUobW9kZWxDbGFzcy50YWJsZU5hbWUoKSl9LiR7Y29ubi5xdW90ZUNvbHVtbihyZWxhdGlvbnNoaXAuZ2V0Rm9yZWlnbktleSgpKX1gXG4gICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcC5nZXRUeXBlKCkgPT0gXCJoYXNNYW55XCIgfHwgcmVsYXRpb25zaGlwLmdldFR5cGUoKSA9PSBcImhhc09uZVwiKSB7XG4gICAgICAgIHNxbCArPSBgJHtjb25uLnF1b3RlVGFibGUodGFyZ2V0TW9kZWxDbGFzcy50YWJsZU5hbWUoKSl9LiR7Y29ubi5xdW90ZUNvbHVtbihyZWxhdGlvbnNoaXAuZ2V0Rm9yZWlnbktleSgpKX0gPSBgXG4gICAgICAgIHNxbCArPSBgJHtjb25uLnF1b3RlVGFibGUobW9kZWxDbGFzcy50YWJsZU5hbWUoKSl9LiR7Y29ubi5xdW90ZUNvbHVtbihyZWxhdGlvbnNoaXAuZ2V0UHJpbWFyeUtleSgpKX1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVsYXRpb25zaGlwIHR5cGU6ICR7cmVsYXRpb25zaGlwLmdldFR5cGUoKX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGpvaW5WYWx1ZSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHNxbCA9IHRoaXMuam9pbk9iamVjdChqb2luVmFsdWUsIHRhcmdldE1vZGVsQ2xhc3MsIHNxbCwgam9pbnNDb3VudCArIDEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNxbFxuICB9XG59XG4iXX0=
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9pbi1vYmplY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvcXVlcnkvam9pbi1vYmplY3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sUUFBUSxNQUFNLGdCQUFnQixDQUFBO0FBQ3JDLE9BQU8sU0FBUyxNQUFNLGlCQUFpQixDQUFBO0FBRXZDOztHQUVHO0FBRUgsTUFBTSxDQUFDLE9BQU8sT0FBTyxnQ0FBaUMsU0FBUSxRQUFRO0lBQ3BFOztPQUVHO0lBQ0gsWUFBWSxNQUFNO1FBQ2hCLEtBQUssRUFBRSxDQUFBO1FBQ1AsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7SUFDdEIsQ0FBQztJQUVELEtBQUs7UUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7UUFFN0IsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSx1Q0FBdUMsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUMxRixDQUFDO1FBRUQsbUJBQW1CO1FBQ25CLE1BQU0sVUFBVSxHQUFHLDBEQUEwRCxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRWhHLE1BQU0sVUFBVSxHQUFHLHVEQUF1RCxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFbEYsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUE7SUFDdEYsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUk7UUFDaEQsTUFBTSxNQUFNLEdB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S0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO2dCQUMzSCxNQUFNLFFBQVEsR0FBRyxTQUFTO29CQUN4QixDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRTtvQkFDZixDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUE7Z0JBRXhELEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDdEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDNUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBKb2luQmFzZSBmcm9tIFwiLi9qb2luLWJhc2UuanNcIlxuaW1wb3J0IFdoZXJlSGFzaCBmcm9tIFwiLi93aGVyZS1oYXNoLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7e1trZXk6IHN0cmluZ106IGJvb2xlYW4gfCBKb2luT2JqZWN0fX0gSm9pbk9iamVjdFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlUXVlcnlKb2luT2JqZWN0IGV4dGVuZHMgSm9pbkJhc2Uge1xuICAvKipcbiAgICogQHBhcmFtIHtKb2luT2JqZWN0fSBvYmplY3QgLSBPYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvYmplY3QpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5vYmplY3QgPSBvYmplY3RcbiAgfVxuXG4gIHRvU3FsKCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5nZXRRdWVyeSgpXG5cbiAgICBpZiAocXVlcnkuY29uc3RydWN0b3IubmFtZSAhPSBcIlZlbG9jaW91c0RhdGFiYXNlUXVlcnlNb2RlbENsYXNzUXVlcnlcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWVyeSBoYXMgdG8gYmUgYSBNb2RlbENsYXNzUXVlcnkgYnV0IHdhcyBhICR7cXVlcnkuY29uc3RydWN0b3IubmFtZX1gKVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChxdWVyeS5tb2RlbENsYXNzKVxuXG4gICAgY29uc3QgbW9kZWxRdWVyeSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSAqLyAocXVlcnkpXG5cbiAgICByZXR1cm4gdGhpcy5qb2luT2JqZWN0KHRoaXMub2JqZWN0LCBNb2RlbENsYXNzLCBcIlwiLCAwLCBtb2RlbFF1ZXJ5LmdldEpvaW5CYXNlUGF0aCgpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Sm9pbk9iamVjdH0gam9pbiAtIEpvaW4uXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge251bWJlcn0gam9pbnNDb3VudCAtIEpvaW5zIGNvdW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoIC0gSm9pbiBwYXRoLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBqb2luIG9iamVjdC5cbiAgICovXG4gIGpvaW5PYmplY3Qoam9pbiwgbW9kZWxDbGFzcywgc3FsLCBqb2luc0NvdW50LCBwYXRoKSB7XG4gICAgY29uc3QgcHJldHR5ID0gdGhpcy5wcmV0dHlcbiAgICBjb25zdCBjb25uID0gdGhpcy5nZXRRdWVyeSgpLmRyaXZlclxuICAgIGNvbnN0IHF1ZXJ5ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9ICovICh0aGlzLmdldFF1ZXJ5KCkpXG5cbiAgICBmb3IgKGNvbnN0IGpvaW5LZXkgaW4gam9pbikge1xuICAgICAgY29uc3Qgam9pblZhbHVlID0gam9pbltqb2luS2V5XVxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoam9pbktleSlcbiAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG4gICAgICBjb25zdCBqb2luUGF0aCA9IHBhdGguY29uY2F0KFtqb2luS2V5XSlcbiAgICAgIGNvbnN0IHBhcmVudFRhYmxlUmVmID0gcXVlcnkuZ2V0Sm9pblRhYmxlUmVmZXJlbmNlKHBhdGgpXG4gICAgICBjb25zdCB0YXJnZXRFbnRyeSA9IHF1ZXJ5Ll9yZWdpc3RlckpvaW5QYXRoKGpvaW5QYXRoKVxuICAgICAgY29uc3QgdGFyZ2V0VGFibGVSZWYgPSB0YXJnZXRFbnRyeS5hbGlhcyB8fCB0YXJnZXRFbnRyeS50YWJsZU5hbWVcbiAgICAgIGNvbnN0IGpvaW5UYWJsZVNxbCA9IHRhcmdldEVudHJ5LmFsaWFzXG4gICAgICAgID8gYCR7Y29ubi5xdW90ZVRhYmxlKHRhcmdldEVudHJ5LnRhYmxlTmFtZSl9IEFTICR7Y29ubi5xdW90ZVRhYmxlKHRhcmdldEVudHJ5LmFsaWFzKX1gXG4gICAgICAgIDogY29ubi5xdW90ZVRhYmxlKHRhcmdldEVudHJ5LnRhYmxlTmFtZSlcblxuICAgICAgaWYgKGpvaW5zQ291bnQgPiAwKSB7XG4gICAgICAgIGlmIChwcmV0dHkpIHtcbiAgICAgICAgICBzcWwgKz0gXCJcXG5cXG5cIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNxbCArPSBcIiBcIlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNxbCArPSBgTEVGVCBKT0lOICR7am9pblRhYmxlU3FsfSBPTiBgXG5cbiAgICAgIGlmIChyZWxhdGlvbnNoaXAuZ2V0VHlwZSgpID09IFwiYmVsb25nc1RvXCIpIHtcbiAgICAgICAgc3FsICs9IGAke2Nvbm4ucXVvdGVUYWJsZSh0YXJnZXRUYWJsZVJlZil9LiR7Y29ubi5xdW90ZUNvbHVtbihyZWxhdGlvbnNoaXAuZ2V0UHJpbWFyeUtleSgpKX0gPSBgXG4gICAgICAgIHNxbCArPSBgJHtjb25uLnF1b3RlVGFibGUocGFyZW50VGFibGVSZWYpfS4ke2Nvbm4ucXVvdGVDb2x1bW4ocmVsYXRpb25zaGlwLmdldEZvcmVpZ25LZXkoKSl9YFxuICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbnNoaXAuZ2V0VHlwZSgpID09IFwiaGFzTWFueVwiIHx8IHJlbGF0aW9uc2hpcC5nZXRUeXBlKCkgPT0gXCJoYXNPbmVcIikge1xuICAgICAgICBzcWwgKz0gYCR7Y29ubi5xdW90ZVRhYmxlKHRhcmdldFRhYmxlUmVmKX0uJHtjb25uLnF1b3RlQ29sdW1uKHJlbGF0aW9uc2hpcC5nZXRGb3JlaWduS2V5KCkpfSA9IGBcbiAgICAgICAgc3FsICs9IGAke2Nvbm4ucXVvdGVUYWJsZShwYXJlbnRUYWJsZVJlZil9LiR7Y29ubi5xdW90ZUNvbHVtbihyZWxhdGlvbnNoaXAuZ2V0UHJpbWFyeUtleSgpKX1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVsYXRpb25zaGlwIHR5cGU6ICR7cmVsYXRpb25zaGlwLmdldFR5cGUoKX1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzY29wZVNxbCA9IHRoaXMuX3Njb3BlU3FsKHtyZWxhdGlvbnNoaXAsIHF1ZXJ5LCB0YXJnZXRNb2RlbENsYXNzLCBqb2luUGF0aCwgdGFyZ2V0VGFibGVSZWZ9KVxuXG4gICAgICBpZiAoc2NvcGVTcWwpIHtcbiAgICAgICAgc3FsICs9IGAgQU5EICR7c2NvcGVTcWx9YFxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGpvaW5WYWx1ZSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHNxbCA9IHRoaXMuam9pbk9iamVjdChqb2luVmFsdWUsIHRhcmdldE1vZGVsQ2xhc3MsIHNxbCwgam9pbnNDb3VudCArIDEsIGpvaW5QYXRoKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzcWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3JlY29yZC9yZWxhdGlvbnNoaXBzL2Jhc2UuanNcIikuZGVmYXVsdH0gYXJncy5yZWxhdGlvbnNoaXAgLSBSZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBNb2RlbCBjbGFzcyBxdWVyeS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MudGFyZ2V0TW9kZWxDbGFzcyAtIFRhcmdldCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5qb2luUGF0aCAtIEpvaW4gcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudGFyZ2V0VGFibGVSZWYgLSBUYXJnZXQgdGFibGUgcmVmZXJlbmNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNjb3BlIFNRTC5cbiAgICovXG4gIF9zY29wZVNxbCh7cmVsYXRpb25zaGlwLCBxdWVyeSwgdGFyZ2V0TW9kZWxDbGFzcywgam9pblBhdGgsIHRhcmdldFRhYmxlUmVmfSkge1xuICAgIGlmICghcmVsYXRpb25zaGlwLmdldFNjb3BlKCkpIHJldHVybiBcIlwiXG5cbiAgICBjb25zdCBzY29wZWRRdWVyeSA9IHF1ZXJ5LmJ1aWxkSm9pblNjb3BlUXVlcnkodGFyZ2V0TW9kZWxDbGFzcywgam9pblBhdGgpXG4gICAgY29uc3QgYXBwbGllZFF1ZXJ5ID0gcmVsYXRpb25zaGlwLmFwcGx5U2NvcGUoc2NvcGVkUXVlcnkpIHx8IHNjb3BlZFF1ZXJ5XG4gICAgY29uc3Qgd2hlcmVzID0gYXBwbGllZFF1ZXJ5Ll93aGVyZXNcblxuICAgIGlmICghd2hlcmVzIHx8IHdoZXJlcy5sZW5ndGggPT09IDApIHJldHVybiBcIlwiXG5cbiAgICBjb25zdCBwYXJ0cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHdoZXJlIG9mIHdoZXJlcykge1xuICAgICAgaWYgKHdoZXJlIGluc3RhbmNlb2YgV2hlcmVIYXNoKSB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSB3aGVyZS5oYXNoXG4gICAgICAgIGNvbnN0IGhhc05lc3RlZCA9IE9iamVjdC52YWx1ZXMoaGFzaCkuc29tZSgodmFsdWUpID0+IHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIGNvbnN0IHdoZXJlU3FsID0gaGFzTmVzdGVkXG4gICAgICAgICAgPyB3aGVyZS50b1NxbCgpXG4gICAgICAgICAgOiBgKCR7d2hlcmUuX3doZXJlU1FMRnJvbUhhc2goaGFzaCwgdGFyZ2V0VGFibGVSZWYpfSlgXG5cbiAgICAgICAgcGFydHMucHVzaCh3aGVyZVNxbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRzLnB1c2god2hlcmUudG9TcWwoKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbihcIiBBTkQgXCIpXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,49 @@
1
+ export default class VelociousDatabaseQueryJoinTracker {
2
+ /**
3
+ * @param {object} args - Options object.
4
+ * @param {typeof import("../record/index.js").default} args.modelClass - Root model class.
5
+ */
6
+ constructor({ modelClass }: {
7
+ modelClass: typeof import("../record/index.js").default;
8
+ });
9
+ _rootModelClass: typeof import("../record/index.js").default;
10
+ _entries: Map<any, any>;
11
+ _tableUsage: Map<any, any>;
12
+ /**
13
+ * @returns {VelociousDatabaseQueryJoinTracker} - The clone.
14
+ */
15
+ clone(): VelociousDatabaseQueryJoinTracker;
16
+ /**
17
+ * @returns {typeof import("../record/index.js").default} - Root model class.
18
+ */
19
+ getRootModelClass(): typeof import("../record/index.js").default;
20
+ /**
21
+ * @param {string[]} path - Join path.
22
+ * @returns {string} - Path key.
23
+ */
24
+ pathKey(path: string[]): string;
25
+ /**
26
+ * @param {string[]} path - Join path.
27
+ * @returns {{tableName: string, alias: string | undefined} | undefined} - Entry.
28
+ */
29
+ getEntry(path: string[]): {
30
+ tableName: string;
31
+ alias: string | undefined;
32
+ } | undefined;
33
+ /**
34
+ * @param {string[]} path - Join path.
35
+ * @param {string} tableName - Table name.
36
+ * @returns {{tableName: string, alias: string | undefined}} - Entry.
37
+ */
38
+ registerPath(path: string[], tableName: string): {
39
+ tableName: string;
40
+ alias: string | undefined;
41
+ };
42
+ /**
43
+ * @param {string} tableName - Table name.
44
+ * @param {string[]} path - Join path.
45
+ * @returns {string} - Alias.
46
+ */
47
+ buildAlias(tableName: string, path: string[]): string;
48
+ }
49
+ //# sourceMappingURL=join-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-tracker.d.ts","sourceRoot":"","sources":["../../../../src/database/query/join-tracker.js"],"names":[],"mappings":"AAEA;IACE;;;OAGG;IACH,4BAFG;QAA0D,UAAU,EAA5D,cAAc,oBAAoB,EAAE,OAAO;KACrD,EASA;IALC,6DAAiC;IACjC,wBAAyB;IACzB,2BAA4B;IAK9B;;OAEG;IACH,SAFa,iCAAiC,CAS7C;IAED;;OAEG;IACH,qBAFa,cAAc,oBAAoB,EAAE,OAAO,CAIvD;IAED;;;OAGG;IACH,cAHW,MAAM,EAAE,GACN,MAAM,CAIlB;IAED;;;OAGG;IACH,eAHW,MAAM,EAAE,GACN;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;KAAC,GAAG,SAAS,CAItE;IAED;;;;OAIG;IACH,mBAJW,MAAM,EAAE,aACR,MAAM,GACJ;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;KAAC,CAkB1D;IAED;;;;OAIG;IACH,sBAJW,MAAM,QACN,MAAM,EAAE,GACN,MAAM,CAMlB;CACF"}
@@ -0,0 +1,72 @@
1
+ // @ts-check
2
+ export default class VelociousDatabaseQueryJoinTracker {
3
+ /**
4
+ * @param {object} args - Options object.
5
+ * @param {typeof import("../record/index.js").default} args.modelClass - Root model class.
6
+ */
7
+ constructor({ modelClass }) {
8
+ if (!modelClass)
9
+ throw new Error("No modelClass given to JoinTracker");
10
+ this._rootModelClass = modelClass;
11
+ this._entries = new Map();
12
+ this._tableUsage = new Map();
13
+ this.registerPath([], modelClass.tableName());
14
+ }
15
+ /**
16
+ * @returns {VelociousDatabaseQueryJoinTracker} - The clone.
17
+ */
18
+ clone() {
19
+ const cloned = new VelociousDatabaseQueryJoinTracker({ modelClass: this._rootModelClass });
20
+ cloned._entries = new Map(this._entries);
21
+ cloned._tableUsage = new Map(this._tableUsage);
22
+ return cloned;
23
+ }
24
+ /**
25
+ * @returns {typeof import("../record/index.js").default} - Root model class.
26
+ */
27
+ getRootModelClass() {
28
+ return this._rootModelClass;
29
+ }
30
+ /**
31
+ * @param {string[]} path - Join path.
32
+ * @returns {string} - Path key.
33
+ */
34
+ pathKey(path) {
35
+ return path.join(".");
36
+ }
37
+ /**
38
+ * @param {string[]} path - Join path.
39
+ * @returns {{tableName: string, alias: string | undefined} | undefined} - Entry.
40
+ */
41
+ getEntry(path) {
42
+ return this._entries.get(this.pathKey(path));
43
+ }
44
+ /**
45
+ * @param {string[]} path - Join path.
46
+ * @param {string} tableName - Table name.
47
+ * @returns {{tableName: string, alias: string | undefined}} - Entry.
48
+ */
49
+ registerPath(path, tableName) {
50
+ const key = this.pathKey(path);
51
+ const existing = this._entries.get(key);
52
+ if (existing)
53
+ return existing;
54
+ const usageCount = this._tableUsage.get(tableName) || 0;
55
+ const alias = usageCount > 0 ? this.buildAlias(tableName, path) : undefined;
56
+ this._tableUsage.set(tableName, usageCount + 1);
57
+ const entry = { tableName, alias };
58
+ this._entries.set(key, entry);
59
+ return entry;
60
+ }
61
+ /**
62
+ * @param {string} tableName - Table name.
63
+ * @param {string[]} path - Join path.
64
+ * @returns {string} - Alias.
65
+ */
66
+ buildAlias(tableName, path) {
67
+ if (path.length === 0)
68
+ return tableName;
69
+ return `${tableName}__${path.join("__")}`;
70
+ }
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9pbi10cmFja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3F1ZXJ5L2pvaW4tdHJhY2tlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosTUFBTSxDQUFDLE9BQU8sT0FBTyxpQ0FBaUM7SUFDcEQ7OztPQUdHO0lBQ0gsWUFBWSxFQUFDLFVBQVUsRUFBQztRQUN0QixJQUFJLENBQUMsVUFBVTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQTtRQUV0RSxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQTtRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTVCLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLGlDQUFpQyxDQUFDLEVBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUMsQ0FBQyxDQUFBO1FBRXhGLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRTlDLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFBO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPLENBQUMsSUFBSTtRQUNWLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLElBQUk7UUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUztRQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRXZDLElBQUksUUFBUTtZQUFFLE9BQU8sUUFBUSxDQUFBO1FBRTdCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN2RCxNQUFNLEtBQUssR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBRTNFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFFL0MsTUFBTSxLQUFLLEdBQUcsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUE7UUFFaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBRTdCLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUk7UUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUV2QyxPQUFPLEdBQUcsU0FBUyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQTtJQUMzQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VRdWVyeUpvaW5UcmFja2VyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe21vZGVsQ2xhc3N9KSB7XG4gICAgaWYgKCFtb2RlbENsYXNzKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBtb2RlbENsYXNzIGdpdmVuIHRvIEpvaW5UcmFja2VyXCIpXG5cbiAgICB0aGlzLl9yb290TW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3NcbiAgICB0aGlzLl9lbnRyaWVzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fdGFibGVVc2FnZSA9IG5ldyBNYXAoKVxuXG4gICAgdGhpcy5yZWdpc3RlclBhdGgoW10sIG1vZGVsQ2xhc3MudGFibGVOYW1lKCkpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1ZlbG9jaW91c0RhdGFiYXNlUXVlcnlKb2luVHJhY2tlcn0gLSBUaGUgY2xvbmUuXG4gICAqL1xuICBjbG9uZSgpIHtcbiAgICBjb25zdCBjbG9uZWQgPSBuZXcgVmVsb2Npb3VzRGF0YWJhc2VRdWVyeUpvaW5UcmFja2VyKHttb2RlbENsYXNzOiB0aGlzLl9yb290TW9kZWxDbGFzc30pXG5cbiAgICBjbG9uZWQuX2VudHJpZXMgPSBuZXcgTWFwKHRoaXMuX2VudHJpZXMpXG4gICAgY2xvbmVkLl90YWJsZVVzYWdlID0gbmV3IE1hcCh0aGlzLl90YWJsZVVzYWdlKVxuXG4gICAgcmV0dXJuIGNsb25lZFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IC0gUm9vdCBtb2RlbCBjbGFzcy5cbiAgICovXG4gIGdldFJvb3RNb2RlbENsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLl9yb290TW9kZWxDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGggLSBKb2luIHBhdGguXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUGF0aCBrZXkuXG4gICAqL1xuICBwYXRoS2V5KHBhdGgpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKFwiLlwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGggLSBKb2luIHBhdGguXG4gICAqIEByZXR1cm5zIHt7dGFibGVOYW1lOiBzdHJpbmcsIGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWR9IHwgdW5kZWZpbmVkfSAtIEVudHJ5LlxuICAgKi9cbiAgZ2V0RW50cnkocGF0aCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzLmdldCh0aGlzLnBhdGhLZXkocGF0aCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aCAtIEpvaW4gcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEByZXR1cm5zIHt7dGFibGVOYW1lOiBzdHJpbmcsIGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWR9fSAtIEVudHJ5LlxuICAgKi9cbiAgcmVnaXN0ZXJQYXRoKHBhdGgsIHRhYmxlTmFtZSkge1xuICAgIGNvbnN0IGtleSA9IHRoaXMucGF0aEtleShwYXRoKVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fZW50cmllcy5nZXQoa2V5KVxuXG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3RpbmdcblxuICAgIGNvbnN0IHVzYWdlQ291bnQgPSB0aGlzLl90YWJsZVVzYWdlLmdldCh0YWJsZU5hbWUpIHx8IDBcbiAgICBjb25zdCBhbGlhcyA9IHVzYWdlQ291bnQgPiAwID8gdGhpcy5idWlsZEFsaWFzKHRhYmxlTmFtZSwgcGF0aCkgOiB1bmRlZmluZWRcblxuICAgIHRoaXMuX3RhYmxlVXNhZ2Uuc2V0KHRhYmxlTmFtZSwgdXNhZ2VDb3VudCArIDEpXG5cbiAgICBjb25zdCBlbnRyeSA9IHt0YWJsZU5hbWUsIGFsaWFzfVxuXG4gICAgdGhpcy5fZW50cmllcy5zZXQoa2V5LCBlbnRyeSlcblxuICAgIHJldHVybiBlbnRyeVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoIC0gSm9pbiBwYXRoLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEFsaWFzLlxuICAgKi9cbiAgYnVpbGRBbGlhcyh0YWJsZU5hbWUsIHBhdGgpIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiB0YWJsZU5hbWVcblxuICAgIHJldHVybiBgJHt0YWJsZU5hbWV9X18ke3BhdGguam9pbihcIl9fXCIpfWBcbiAgfVxufVxuIl19
@@ -3,7 +3,7 @@
3
3
  */
4
4
  /**
5
5
  * @template {typeof import("../record/index.js").default} MC
6
- * @typedef {import("./index.js").QueryArgsType & {modelClass: MC}} ModelClassQueryArgsType
6
+ * @typedef {import("./index.js").QueryArgsType & {modelClass: MC, joinBasePath?: string[], joinTracker?: import("./join-tracker.js").default, forceQualifyBaseTable?: boolean}} ModelClassQueryArgsType
7
7
  */
8
8
  /**
9
9
  * A generic query over some model type.
@@ -14,12 +14,66 @@ export default class VelociousDatabaseQueryModelClassQuery<MC extends typeof imp
14
14
  constructor(args: ModelClassQueryArgsType<MC>);
15
15
  /** @type {MC} */
16
16
  modelClass: MC;
17
+ /** @type {string[]} */
18
+ _joinBasePath: string[];
19
+ _joinTracker: JoinTracker;
20
+ _forceQualifyBaseTable: boolean;
17
21
  /** @returns {this} - The clone. */
18
22
  clone(): this;
19
23
  /** @returns {Promise<number>} - Resolves with the count. */
20
24
  count(): Promise<number>;
21
25
  /** @returns {MC} - The model class. */
22
26
  getModelClass(): MC;
27
+ /** @returns {string[]} - The join base path. */
28
+ getJoinBasePath(): string[];
29
+ /** @returns {import("./join-tracker.js").default} - The join tracker. */
30
+ getJoinTracker(): import("./join-tracker.js").default;
31
+ /** @returns {boolean} - Whether to qualify base table. */
32
+ getForceQualifyBaseTable(): boolean;
33
+ /**
34
+ * @param {string[]} joinBasePath - Join base path.
35
+ * @returns {this} - The query with updated base path.
36
+ */
37
+ setJoinBasePath(joinBasePath: string[]): this;
38
+ /**
39
+ * @param {string[]} joinBasePath - Join base path.
40
+ * @returns {VelociousDatabaseQueryModelClassQuery<MC>} - The scoped query.
41
+ */
42
+ withJoinPath(joinBasePath: string[]): VelociousDatabaseQueryModelClassQuery<MC>;
43
+ /**
44
+ * @param {string[]} path - Join path.
45
+ * @returns {string} - Table name for path.
46
+ */
47
+ _resolveTableNameForJoinPath(path: string[]): string;
48
+ /**
49
+ * @param {string[]} path - Join path.
50
+ * @returns {{tableName: string, alias: string | undefined}} - The entry.
51
+ */
52
+ _registerJoinPath(path: string[]): {
53
+ tableName: string;
54
+ alias: string | undefined;
55
+ };
56
+ /**
57
+ * @param {string[]} path - Join path.
58
+ * @returns {string} - Unquoted table reference (alias or table name).
59
+ */
60
+ getJoinTableReference(path: string[]): string;
61
+ /**
62
+ * @param {...string} path - Join path segments.
63
+ * @returns {string} - Unquoted table reference (alias or table name).
64
+ */
65
+ getTableReferenceForJoin(...path: string[]): string;
66
+ /**
67
+ * @param {...string} path - Join path segments.
68
+ * @returns {string} - Quoted table name for join path.
69
+ */
70
+ getTableForJoin(...path: string[]): string;
71
+ /**
72
+ * @param {typeof import("../record/index.js").default} targetModelClass - Target model class.
73
+ * @param {string[]} joinPath - Join path.
74
+ * @returns {VelociousDatabaseQueryModelClassQuery<MC>} - The scoped join query.
75
+ */
76
+ buildJoinScopeQuery(targetModelClass: typeof import("../record/index.js").default, joinPath: string[]): VelociousDatabaseQueryModelClassQuery<MC>;
23
77
  /** @returns {Promise<void>} - Resolves when complete. */
24
78
  destroyAll(): Promise<void>;
25
79
  /**
@@ -83,6 +137,10 @@ export default class VelociousDatabaseQueryModelClassQuery<MC extends typeof imp
83
137
  }
84
138
  export type ModelClassQueryArgsType<MC extends typeof import("../record/index.js").default> = import("./index.js").QueryArgsType & {
85
139
  modelClass: MC;
140
+ joinBasePath?: string[];
141
+ joinTracker?: import("./join-tracker.js").default;
142
+ forceQualifyBaseTable?: boolean;
86
143
  };
87
144
  import DatabaseQuery from "./index.js";
145
+ import JoinTracker from "./join-tracker.js";
88
146
  //# sourceMappingURL=model-class-query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-class-query.d.ts","sourceRoot":"","sources":["../../../../src/database/query/model-class-query.js"],"names":[],"mappings":"AAWA;;GAEG;AACH;;;GAGG;AAEH;;;GAGG;AACH,2DAX2D,EAAE,SAAhD,cAAe,oBAAoB,EAAE,OAAQ;IAYxD,+EAA+E;IAC/E,kBADY,uBAAuB,CAAC,EAAE,CAAC,EAWtC;IAFC,iBAAiB;IACjB,YADW,EAAE,CACe;IAG9B,oCAAoC;IACpC,SADc,IAAI,CAsBjB;IAED,6DAA6D;IAC7D,SADc,OAAO,CAAC,MAAM,CAAC,CAsC5B;IAED,wCAAwC;IACxC,iBADc,EAAE,CAKf;IAED,0DAA0D;IAC1D,cADc,OAAO,CAAC,IAAI,CAAC,CAO1B;IAED;;;OAGG;IACH,eAHW,MAAM,GAAC,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAmBrC;IAED;;;OAGG;IACH,mBAHW;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;KAAC,GAC9B,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAiB5C;IAED;;;;OAIG;IACH,2BAJW;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;KAAC,aAChC,CAAS,IAAgB,EAAhB,YAAY,CAAC,EAAE,CAAC,KAAI,IAAI,GAC/B,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAUrC;IAED;;;OAGG;IACH,yBAHW;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;KAAC,GAC9B,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAuBrC;IAED;;;;OAIG;IACH,+BAJW,MAAM,aACN,CAAS,IAAgB,EAAhB,YAAY,CAAC,EAAE,CAAC,KAAI,IAAI,GAC/B,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAerC;IAED,mFAAmF;IACnF,SADc,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAMlD;IAED,kFAAkF;IAClF,QADc,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAOlD;IAED;;;OAGG;IACH,cAHW,OAAO,YAAY,EAAE,mBAAmB,GACtC,IAAI,CAKhB;IAED;;;OAGG;IACH,WAFa,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAyB5C;IAED;;;;OAIG;IACH,kBAHW,CAAG,MAAM,GAAC,MAAM,EAAE,GAAA,GAChB,OAAO,CAAC,GAAG,EAAE,CAAC,CA+B1B;IAED;;;OAGG;IACH,aAHW,OAAO,YAAY,EAAE,iBAAiB,GACpC,IAAI,CAiChB;CACF;oCA/U0D,EAAE,SAAhD,cAAe,oBAAoB,EAAE,OAAQ,IAC7C,OAAO,YAAY,EAAE,aAAa,GAAG;IAAC,UAAU,EAAE,EAAE,CAAA;CAAC;0BATxC,YAAY"}
1
+ {"version":3,"file":"model-class-query.d.ts","sourceRoot":"","sources":["../../../../src/database/query/model-class-query.js"],"names":[],"mappings":"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"}