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.
- package/README.md +38 -0
- package/build/src/database/query/join-object.d.ts +18 -1
- package/build/src/database/query/join-object.d.ts.map +1 -1
- package/build/src/database/query/join-object.js +57 -9
- package/build/src/database/query/join-tracker.d.ts +49 -0
- package/build/src/database/query/join-tracker.d.ts.map +1 -0
- package/build/src/database/query/join-tracker.js +72 -0
- package/build/src/database/query/model-class-query.d.ts +59 -1
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +103 -4
- package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
- package/build/src/database/query/preloader/belongs-to.js +7 -3
- package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-many.js +4 -2
- package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-one.js +4 -2
- package/build/src/database/query/where-model-class-hash.d.ts +2 -1
- package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
- package/build/src/database/query/where-model-class-hash.js +12 -5
- package/build/src/database/record/index.d.ts +25 -5
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +36 -9
- package/build/src/database/record/instance-relationships/base.d.ts +6 -0
- package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/base.js +9 -1
- package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/belongs-to.js +7 -2
- package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/has-many.js +4 -3
- package/build/src/database/record/instance-relationships/has-one.d.ts.map +1 -1
- package/build/src/database/record/instance-relationships/has-one.js +4 -2
- package/build/src/database/record/relationships/base.d.ts +19 -1
- package/build/src/database/record/relationships/base.d.ts.map +1 -1
- package/build/src/database/record/relationships/base.js +21 -2
- package/build/src/testing/test.d.ts +9 -0
- package/build/src/testing/test.d.ts.map +1 -1
- package/build/src/testing/test.js +98 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- 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":"
|
|
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
|
-
|
|
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 ${
|
|
56
|
+
sql += `LEFT JOIN ${joinTableSql} ON `;
|
|
46
57
|
if (relationship.getType() == "belongsTo") {
|
|
47
|
-
sql += `${conn.quoteTable(
|
|
48
|
-
sql += `${conn.quoteTable(
|
|
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(
|
|
52
|
-
sql += `${conn.quoteTable(
|
|
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":"
|
|
1
|
+
{"version":3,"file":"model-class-query.d.ts","sourceRoot":"","sources":["../../../../src/database/query/model-class-query.js"],"names":[],"mappings":"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"}
|