velocious 1.0.405 → 1.0.407
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 +1 -0
- package/build/src/database/query/index.d.ts +16 -2
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +9 -3
- package/build/src/database/query/model-class-query.d.ts +18 -0
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +58 -2
- package/build/src/database/query/preloader/belongs-to.d.ts +22 -1
- package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
- package/build/src/database/query/preloader/belongs-to.js +117 -63
- package/build/src/database/query/preloader/has-many.d.ts +17 -1
- package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-many.js +59 -27
- package/build/src/database/query/preloader/has-one.d.ts +5 -1
- package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
- package/build/src/database/query/preloader/has-one.js +23 -7
- package/build/src/database/query/preloader/selection.d.ts +87 -0
- package/build/src/database/query/preloader/selection.d.ts.map +1 -0
- package/build/src/database/query/preloader/selection.js +132 -0
- package/build/src/database/query/preloader.d.ts +22 -1
- package/build/src/database/query/preloader.d.ts.map +1 -1
- package/build/src/database/query/preloader.js +44 -7
- package/build/src/database/record/index.d.ts +22 -0
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +26 -1
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +17 -3
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1,80 +1,50 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import ensureModelClassInitialized from "./ensure-model-class-initialized.js";
|
|
3
|
+
import PreloaderSelection from "./selection.js";
|
|
3
4
|
import restArgsError from "../../../utils/rest-args-error.js";
|
|
4
5
|
export default class VelociousDatabaseQueryPreloaderBelongsTo {
|
|
5
6
|
/**
|
|
6
7
|
* @param {object} args - Options object.
|
|
7
8
|
* @param {import("../../record/index.js").default[]} args.models - Model instances.
|
|
8
9
|
* @param {import("../../record/relationships/belongs-to.js").default} args.relationship - Relationship.
|
|
10
|
+
* @param {PreloaderSelection} [args.selection] - Column selection and idempotency rules.
|
|
9
11
|
*/
|
|
10
|
-
constructor({ models, relationship, ...restArgs }) {
|
|
12
|
+
constructor({ models, relationship, selection, ...restArgs }) {
|
|
11
13
|
restArgsError(restArgs);
|
|
12
14
|
this.models = models;
|
|
13
15
|
this.relationship = relationship;
|
|
16
|
+
this.selection = selection || new PreloaderSelection();
|
|
14
17
|
}
|
|
15
18
|
async run() {
|
|
16
19
|
const foreignKey = this.relationship.getForeignKey();
|
|
17
20
|
const primaryKey = this.relationship.getPrimaryKey();
|
|
21
|
+
const relationshipName = this.relationship.getRelationshipName();
|
|
18
22
|
if (this.relationship.getPolymorphic()) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
continue;
|
|
35
|
-
if (meta.foreignKeyValue === undefined || meta.foreignKeyValue === null)
|
|
36
|
-
continue;
|
|
37
|
-
if (!foreignKeyValuesByType[meta.targetType])
|
|
38
|
-
foreignKeyValuesByType[meta.targetType] = [];
|
|
39
|
-
if (!foreignKeyValuesByType[meta.targetType].includes(meta.foreignKeyValue))
|
|
40
|
-
foreignKeyValuesByType[meta.targetType].push(meta.foreignKeyValue);
|
|
41
|
-
}
|
|
42
|
-
/** @type {Record<string, Record<number | string, import("../../record/index.js").default>>} */
|
|
43
|
-
const targetModelsByTypeAndId = {};
|
|
44
|
-
/** @type {Record<string, import("../../record/index.js").default[]>} */
|
|
45
|
-
const targetModelsByClassName = {};
|
|
46
|
-
/** @type {import("../../record/index.js").default[]} */
|
|
47
|
-
const targetModels = [];
|
|
48
|
-
for (const targetType in foreignKeyValuesByType) {
|
|
49
|
-
const targetModelClass = configuration.getModelClass(targetType);
|
|
50
|
-
await ensureModelClassInitialized(targetModelClass, configuration);
|
|
51
|
-
/** @type {Record<string, string | number | Array<string | number>>} */
|
|
52
|
-
const whereArgs = {};
|
|
53
|
-
whereArgs[primaryKey] = foreignKeyValuesByType[targetType];
|
|
54
|
-
let query = targetModelClass.where(whereArgs);
|
|
55
|
-
query = this.relationship.applyScope(query);
|
|
56
|
-
const foundTargetModels = await query.toArray();
|
|
57
|
-
targetModels.push(...foundTargetModels);
|
|
58
|
-
targetModelsByClassName[targetModelClass.getModelName()] = foundTargetModels;
|
|
59
|
-
targetModelsByTypeAndId[targetType] = {};
|
|
60
|
-
for (const targetModel of foundTargetModels) {
|
|
61
|
-
const primaryKeyValue = /** @type {string | number} */ (targetModel.readColumn(primaryKey));
|
|
62
|
-
targetModelsByTypeAndId[targetType][primaryKeyValue] = targetModel;
|
|
63
|
-
}
|
|
23
|
+
return await this._runPolymorphic({ foreignKey, primaryKey, relationshipName });
|
|
24
|
+
}
|
|
25
|
+
const targetModelClass = this.relationship.getTargetModelClass();
|
|
26
|
+
if (!targetModelClass)
|
|
27
|
+
throw new Error("No target model class could be gotten from relationship");
|
|
28
|
+
/** @type {import("../../record/index.js").default[]} */
|
|
29
|
+
const satisfiedTargets = [];
|
|
30
|
+
/** @type {import("../../record/index.js").default[]} */
|
|
31
|
+
const modelsToLoad = [];
|
|
32
|
+
for (const model of this.models) {
|
|
33
|
+
const instanceRelationship = model.getRelationshipByName(relationshipName);
|
|
34
|
+
if (this.selection.isSatisfied({ instanceRelationship, targetModelClass, mappingColumns: [primaryKey] })) {
|
|
35
|
+
const loaded = /** @type {import("../../record/index.js").default | undefined} */ (instanceRelationship.getLoadedOrUndefined());
|
|
36
|
+
if (loaded)
|
|
37
|
+
satisfiedTargets.push(loaded);
|
|
64
38
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const targetModel = (meta.targetType && meta.foreignKeyValue !== undefined && meta.foreignKeyValue !== null)
|
|
68
|
-
? targetModelsByTypeAndId[meta.targetType]?.[meta.foreignKeyValue]
|
|
69
|
-
: undefined;
|
|
70
|
-
modelRelationship.setPreloaded(true);
|
|
71
|
-
modelRelationship.setLoaded(targetModel);
|
|
39
|
+
else {
|
|
40
|
+
modelsToLoad.push(model);
|
|
72
41
|
}
|
|
73
|
-
return { targetModels, targetModelsByClassName };
|
|
74
42
|
}
|
|
43
|
+
if (modelsToLoad.length == 0)
|
|
44
|
+
return satisfiedTargets;
|
|
75
45
|
/** @type {Array<number | string>} */
|
|
76
46
|
const foreignKeyValues = [];
|
|
77
|
-
for (const model of
|
|
47
|
+
for (const model of modelsToLoad) {
|
|
78
48
|
const foreignKeyValue = /** @type {string | number | null | undefined} */ (model.readColumn(foreignKey));
|
|
79
49
|
// Skip null/undefined foreign keys: a belongsTo with no foreign key has no
|
|
80
50
|
// target, and including them would serialize to e.g. `IN (null)` which
|
|
@@ -84,9 +54,6 @@ export default class VelociousDatabaseQueryPreloaderBelongsTo {
|
|
|
84
54
|
if (!foreignKeyValues.includes(foreignKeyValue))
|
|
85
55
|
foreignKeyValues.push(foreignKeyValue);
|
|
86
56
|
}
|
|
87
|
-
const targetModelClass = this.relationship.getTargetModelClass();
|
|
88
|
-
if (!targetModelClass)
|
|
89
|
-
throw new Error("No target model class could be gotten from relationship");
|
|
90
57
|
/** @type {Record<string, import("../../record/index.js").default>} */
|
|
91
58
|
const targetModelsById = {};
|
|
92
59
|
/** @type {import("../../record/index.js").default[]} */
|
|
@@ -100,21 +67,108 @@ export default class VelociousDatabaseQueryPreloaderBelongsTo {
|
|
|
100
67
|
// Load target models to be preloaded on the given models
|
|
101
68
|
let query = targetModelClass.where(whereArgs);
|
|
102
69
|
query = this.relationship.applyScope(query);
|
|
70
|
+
query = this.selection.applyToQuery({ query, targetModelClass, mappingColumns: [primaryKey] });
|
|
103
71
|
targetModels = await query.toArray();
|
|
104
72
|
for (const targetModel of targetModels) {
|
|
105
|
-
const primaryKeyValue = /** @type {string | number} */ (targetModel.readColumn(
|
|
73
|
+
const primaryKeyValue = /** @type {string | number} */ (targetModel.readColumn(primaryKey));
|
|
106
74
|
targetModelsById[primaryKeyValue] = targetModel;
|
|
107
75
|
}
|
|
108
76
|
}
|
|
109
77
|
// Set the target preloaded models on the given models
|
|
110
|
-
for (const model of
|
|
78
|
+
for (const model of modelsToLoad) {
|
|
111
79
|
const foreignKeyValue = /** @type {string | number} */ (model.readColumn(foreignKey));
|
|
112
80
|
const targetModel = targetModelsById[foreignKeyValue];
|
|
113
|
-
const modelRelationship = model.getRelationshipByName(
|
|
81
|
+
const modelRelationship = model.getRelationshipByName(relationshipName);
|
|
82
|
+
modelRelationship.setPreloaded(true);
|
|
83
|
+
modelRelationship.setLoaded(targetModel);
|
|
84
|
+
}
|
|
85
|
+
return [...satisfiedTargets, ...targetModels];
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Preload a polymorphic belongsTo, grouping models by their target type so
|
|
89
|
+
* each concrete target model class is queried separately.
|
|
90
|
+
* @param {object} args - Options object.
|
|
91
|
+
* @param {string} args.foreignKey - Foreign key column.
|
|
92
|
+
* @param {string} args.primaryKey - Primary key column on the target.
|
|
93
|
+
* @param {string} args.relationshipName - Relationship name.
|
|
94
|
+
* @returns {Promise<{targetModels: import("../../record/index.js").default[], targetModelsByClassName: Record<string, import("../../record/index.js").default[]>}>} - Loaded targets and a per-class-name grouping.
|
|
95
|
+
*/
|
|
96
|
+
async _runPolymorphic({ foreignKey, primaryKey, relationshipName }) {
|
|
97
|
+
const typeColumn = this.relationship.getPolymorphicTypeColumn();
|
|
98
|
+
const configuration = this.relationship.getConfiguration();
|
|
99
|
+
/** @type {{foreignKeyValue: number | string | undefined, model: import("../../record/index.js").default, targetType: string | undefined}[]} */
|
|
100
|
+
const modelMeta = [];
|
|
101
|
+
/** @type {import("../../record/index.js").default[]} */
|
|
102
|
+
const satisfiedTargets = [];
|
|
103
|
+
/** @type {Record<string, import("../../record/index.js").default[]>} */
|
|
104
|
+
const targetModelsByClassName = {};
|
|
105
|
+
for (const model of this.models) {
|
|
106
|
+
const targetType = /** @type {string | undefined} */ (model.readColumn(typeColumn));
|
|
107
|
+
const instanceRelationship = model.getRelationshipByName(relationshipName);
|
|
108
|
+
const targetModelClass = targetType ? configuration.getModelClass(targetType) : undefined;
|
|
109
|
+
if (targetModelClass && this.selection.isSatisfied({ instanceRelationship, targetModelClass, mappingColumns: [primaryKey] })) {
|
|
110
|
+
const loaded = /** @type {import("../../record/index.js").default | undefined} */ (instanceRelationship.getLoadedOrUndefined());
|
|
111
|
+
if (loaded) {
|
|
112
|
+
satisfiedTargets.push(loaded);
|
|
113
|
+
const className = /** @type {typeof import("../../record/index.js").default} */ (loaded.constructor).getModelName();
|
|
114
|
+
if (!targetModelsByClassName[className])
|
|
115
|
+
targetModelsByClassName[className] = [];
|
|
116
|
+
targetModelsByClassName[className].push(loaded);
|
|
117
|
+
}
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
modelMeta.push({
|
|
121
|
+
foreignKeyValue: /** @type {string | number | undefined} */ (model.readColumn(foreignKey)),
|
|
122
|
+
model,
|
|
123
|
+
targetType
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/** @type {Record<string, Array<number | string>>} */
|
|
127
|
+
const foreignKeyValuesByType = {};
|
|
128
|
+
for (const meta of modelMeta) {
|
|
129
|
+
if (meta.targetType === undefined || meta.targetType === null)
|
|
130
|
+
continue;
|
|
131
|
+
if (meta.foreignKeyValue === undefined || meta.foreignKeyValue === null)
|
|
132
|
+
continue;
|
|
133
|
+
if (!foreignKeyValuesByType[meta.targetType])
|
|
134
|
+
foreignKeyValuesByType[meta.targetType] = [];
|
|
135
|
+
if (!foreignKeyValuesByType[meta.targetType].includes(meta.foreignKeyValue))
|
|
136
|
+
foreignKeyValuesByType[meta.targetType].push(meta.foreignKeyValue);
|
|
137
|
+
}
|
|
138
|
+
/** @type {Record<string, Record<number | string, import("../../record/index.js").default>>} */
|
|
139
|
+
const targetModelsByTypeAndId = {};
|
|
140
|
+
/** @type {import("../../record/index.js").default[]} */
|
|
141
|
+
const targetModels = [];
|
|
142
|
+
for (const targetType in foreignKeyValuesByType) {
|
|
143
|
+
const targetModelClass = configuration.getModelClass(targetType);
|
|
144
|
+
await ensureModelClassInitialized(targetModelClass, configuration);
|
|
145
|
+
/** @type {Record<string, string | number | Array<string | number>>} */
|
|
146
|
+
const whereArgs = {};
|
|
147
|
+
whereArgs[primaryKey] = foreignKeyValuesByType[targetType];
|
|
148
|
+
let query = targetModelClass.where(whereArgs);
|
|
149
|
+
query = this.relationship.applyScope(query);
|
|
150
|
+
query = this.selection.applyToQuery({ query, targetModelClass, mappingColumns: [primaryKey] });
|
|
151
|
+
const foundTargetModels = await query.toArray();
|
|
152
|
+
targetModels.push(...foundTargetModels);
|
|
153
|
+
const className = targetModelClass.getModelName();
|
|
154
|
+
if (!targetModelsByClassName[className])
|
|
155
|
+
targetModelsByClassName[className] = [];
|
|
156
|
+
targetModelsByClassName[className].push(...foundTargetModels);
|
|
157
|
+
targetModelsByTypeAndId[targetType] = {};
|
|
158
|
+
for (const targetModel of foundTargetModels) {
|
|
159
|
+
const primaryKeyValue = /** @type {string | number} */ (targetModel.readColumn(primaryKey));
|
|
160
|
+
targetModelsByTypeAndId[targetType][primaryKeyValue] = targetModel;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
for (const meta of modelMeta) {
|
|
164
|
+
const modelRelationship = meta.model.getRelationshipByName(relationshipName);
|
|
165
|
+
const targetModel = (meta.targetType && meta.foreignKeyValue !== undefined && meta.foreignKeyValue !== null)
|
|
166
|
+
? targetModelsByTypeAndId[meta.targetType]?.[meta.foreignKeyValue]
|
|
167
|
+
: undefined;
|
|
114
168
|
modelRelationship.setPreloaded(true);
|
|
115
169
|
modelRelationship.setLoaded(targetModel);
|
|
116
170
|
}
|
|
117
|
-
return targetModels;
|
|
171
|
+
return { targetModels: [...satisfiedTargets, ...targetModels], targetModelsByClassName };
|
|
118
172
|
}
|
|
119
173
|
}
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVsb25ncy10by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS9wcmVsb2FkZXIvYmVsb25ncy10by5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTywyQkFBMkIsTUFBTSxxQ0FBcUMsQ0FBQTtBQUM3RSxPQUFPLGFBQWEsTUFBTSxtQ0FBbUMsQ0FBQTtBQUU3RCxNQUFNLENBQUMsT0FBTyxPQUFPLHdDQUF3QztJQUMzRDs7OztPQUlHO0lBQ0gsWUFBWSxFQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDN0MsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFBO0lBQ2xDLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDcEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUVwRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHdCQUF3QixFQUFFLENBQUE7WUFDL0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1lBRTFELCtJQUErSTtZQUMvSSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7WUFFcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2hDLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQ2IsZUFBZSxFQUFFLDBDQUEwQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVB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LGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUMxQyxDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUE7SUFDckIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBlbnN1cmVNb2RlbENsYXNzSW5pdGlhbGl6ZWQgZnJvbSBcIi4vZW5zdXJlLW1vZGVsLWNsYXNzLWluaXRpYWxpemVkLmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNEYXRhYmFzZVF1ZXJ5UHJlbG9hZGVyQmVsb25nc1RvIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gYXJncy5tb2RlbHMgLSBNb2RlbCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vcmVjb3JkL3JlbGF0aW9uc2hpcHMvYmVsb25ncy10by5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlbGF0aW9uc2hpcCAtIFJlbGF0aW9uc2hpcC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHttb2RlbHMsIHJlbGF0aW9uc2hpcCwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIHRoaXMubW9kZWxzID0gbW9kZWxzXG4gICAgdGhpcy5yZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBcbiAgfVxuXG4gIGFzeW5jIHJ1bigpIHtcbiAgICBjb25zdCBmb3JlaWduS2V5ID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0Rm9yZWlnbktleSgpXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IHRoaXMucmVsYXRpb25zaGlwLmdldFByaW1hcnlLZXkoKVxuXG4gICAgaWYgKHRoaXMucmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljKCkpIHtcbiAgICAgIGNvbnN0IHR5cGVDb2x1bW4gPSB0aGlzLnJlbGF0aW9uc2hpcC5nZXRQb2x5bW9ycGhpY1R5cGVDb2x1bW4oKVxuICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMucmVsYXRpb25zaGlwLmdldENvbmZpZ3VyYXRpb24oKVxuXG4gICAgICAvKiogQHR5cGUge3tmb3JlaWduS2V5VmFsdWU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCwgbW9kZWw6IGltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCB0YXJnZXRUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWR9W119ICovXG4gICAgICBjb25zdCBtb2RlbE1ldGEgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHRoaXMubW9kZWxzKSB7XG4gICAgICAgIG1vZGVsTWV0YS5wdXNoKHtcbiAgICAgICAgICBmb3JlaWduS2V5VmFsdWU6IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkfSAqLyAobW9kZWwucmVhZENvbHVtbihmb3JlaWduS2V5KSksXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgdGFyZ2V0VHlwZTogLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovIChtb2RlbC5yZWFkQ29sdW1uKHR5cGVDb2x1bW4pKVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIEFycmF5PG51bWJlciB8IHN0cmluZz4+fSAqL1xuICAgICAgY29uc3QgZm9yZWlnbktleVZhbHVlc0J5VHlwZSA9IHt9XG5cbiAgICAgIGZvciAoY29uc3QgbWV0YSBvZiBtb2RlbE1ldGEpIHtcbiAgICAgICAgaWYgKG1ldGEudGFyZ2V0VHlwZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGEudGFyZ2V0VHlwZSA9PT0gbnVsbCkgY29udGludWVcbiAgICAgICAgaWYgKG1ldGEuZm9yZWlnbktleVZhbHVlID09PSB1bmRlZmluZWQgfHwgbWV0YS5mb3JlaWduS2V5VmFsdWUgPT09IG51bGwpIGNvbnRpbnVlXG5cbiAgICAgICAgaWYgKCFmb3JlaWduS2V5VmFsdWVzQnlUeXBlW21ldGEudGFyZ2V0VHlwZV0pIGZvcmVpZ25LZXlWYWx1ZXNCeVR5cGVbbWV0YS50YXJnZXRUeXBlXSA9IFtdXG4gICAgICAgIGlmICghZm9yZWlnbktleVZhbHVlc0J5VHlwZVttZXRhLnRhcmdldFR5cGVdLmluY2x1ZGVzKG1ldGEuZm9yZWlnbktleVZhbHVlKSkgZm9yZWlnbktleVZhbHVlc0J5VHlwZVttZXRhLnRhcmdldFR5cGVdLnB1c2gobWV0YS5mb3JlaWduS2V5VmFsdWUpXG4gICAgICB9XG5cbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPG51bWJlciB8IHN0cmluZywgaW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+Pn0gKi9cbiAgICAgIGNvbnN0IHRhcmdldE1vZGVsc0J5VHlwZUFuZElkID0ge31cblxuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdPn0gKi9cbiAgICAgIGNvbnN0IHRhcmdldE1vZGVsc0J5Q2xhc3NOYW1lID0ge31cblxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfSAqL1xuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxzID0gW11cblxuICAgICAgZm9yIChjb25zdCB0YXJnZXRUeXBlIGluIGZvcmVpZ25LZXlWYWx1ZXNCeVR5cGUpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzcyh0YXJnZXRUeXBlKVxuXG4gICAgICAgIGF3YWl0IGVuc3VyZU1vZGVsQ2xhc3NJbml0aWFsaXplZCh0YXJnZXRNb2RlbENsYXNzLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPj59ICovXG4gICAgICAgIGNvbnN0IHdoZXJlQXJncyA9IHt9XG5cbiAgICAgICAgd2hlcmVBcmdzW3ByaW1hcnlLZXldID0gZm9yZWlnbktleVZhbHVlc0J5VHlwZVt0YXJnZXRUeXBlXVxuXG4gICAgICAgIGxldCBxdWVyeSA9IHRhcmdldE1vZGVsQ2xhc3Mud2hlcmUod2hlcmVBcmdzKVxuXG4gICAgICAgIHF1ZXJ5ID0gdGhpcy5yZWxhdGlvbnNoaXAuYXBwbHlTY29wZShxdWVyeSlcblxuICAgICAgICBjb25zdCBmb3VuZFRhcmdldE1vZGVscyA9IGF3YWl0IHF1ZXJ5LnRvQXJyYXkoKVxuXG4gICAgICAgIHRhcmdldE1vZGVscy5wdXNoKC4uLmZvdW5kVGFyZ2V0TW9kZWxzKVxuICAgICAgICB0YXJnZXRNb2RlbHNCeUNsYXNzTmFtZVt0YXJnZXRNb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXSA9IGZvdW5kVGFyZ2V0TW9kZWxzXG4gICAgICAgIHRhcmdldE1vZGVsc0J5VHlwZUFuZElkW3RhcmdldFR5cGVdID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IHRhcmdldE1vZGVsIG9mIGZvdW5kVGFyZ2V0TW9kZWxzKSB7XG4gICAgICAgICAgY29uc3QgcHJpbWFyeUtleVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovICh0YXJnZXRNb2RlbC5yZWFkQ29sdW1uKHByaW1hcnlLZXkpKVxuXG4gICAgICAgICAgdGFyZ2V0TW9kZWxzQnlUeXBlQW5kSWRbdGFyZ2V0VHlwZV1bcHJpbWFyeUtleVZhbHVlXSA9IHRhcmdldE1vZGVsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBtZXRhIG9mIG1vZGVsTWV0YSkge1xuICAgICAgICBjb25zdCBtb2RlbFJlbGF0aW9uc2hpcCA9IG1ldGEubW9kZWwuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHRoaXMucmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSlcbiAgICAgICAgY29uc3QgdGFyZ2V0TW9kZWwgPSAobWV0YS50YXJnZXRUeXBlICYmIG1ldGEuZm9yZWlnbktleVZhbHVlICE9PSB1bmRlZmluZWQgJiYgbWV0YS5mb3JlaWduS2V5VmFsdWUgIT09IG51bGwpXG4gICAgICAgICAgPyB0YXJnZXRNb2RlbHNCeVR5cGVBbmRJZFttZXRhLnRhcmdldFR5cGVdPy5bbWV0YS5mb3JlaWduS2V5VmFsdWVdXG4gICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgICBtb2RlbFJlbGF0aW9uc2hpcC5zZXRQcmVsb2FkZWQodHJ1ZSlcbiAgICAgICAgbW9kZWxSZWxhdGlvbnNoaXAuc2V0TG9hZGVkKHRhcmdldE1vZGVsKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge3RhcmdldE1vZGVscywgdGFyZ2V0TW9kZWxzQnlDbGFzc05hbWV9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtBcnJheTxudW1iZXIgfCBzdHJpbmc+fSAqL1xuICAgIGNvbnN0IGZvcmVpZ25LZXlWYWx1ZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiB0aGlzLm1vZGVscykge1xuICAgICAgY29uc3QgZm9yZWlnbktleVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSAqLyAobW9kZWwucmVhZENvbHVtbihmb3JlaWduS2V5KSlcblxuICAgICAgLy8gU2tpcCBudWxsL3VuZGVmaW5lZCBmb3JlaWduIGtleXM6IGEgYmVsb25nc1RvIHdpdGggbm8gZm9yZWlnbiBrZXkgaGFzIG5vXG4gICAgICAvLyB0YXJnZXQsIGFuZCBpbmNsdWRpbmcgdGhlbSB3b3VsZCBzZXJpYWxpemUgdG8gZS5nLiBgSU4gKG51bGwpYCB3aGljaFxuICAgICAgLy8gdGhyb3dzIG9uIG5vbi1zdHJpbmcgcHJpbWFyeS1rZXkgY29sdW1ucy5cbiAgICAgIGlmIChmb3JlaWduS2V5VmFsdWUgPT09IG51bGwgfHwgZm9yZWlnbktleVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG5cbiAgICAgIGlmICghZm9yZWlnbktleVZhbHVlcy5pbmNsdWRlcyhmb3JlaWduS2V5VmFsdWUpKSBmb3JlaWduS2V5VmFsdWVzLnB1c2goZm9yZWlnbktleVZhbHVlKVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSB0aGlzLnJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgIGlmICghdGFyZ2V0TW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKFwiTm8gdGFyZ2V0IG1vZGVsIGNsYXNzIGNvdWxkIGJlIGdvdHRlbiBmcm9tIHJlbGF0aW9uc2hpcFwiKVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59ICovXG4gICAgY29uc3QgdGFyZ2V0TW9kZWxzQnlJZCA9IHt9XG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119ICovXG4gICAgbGV0IHRhcmdldE1vZGVscyA9IFtdXG5cbiAgICAvLyBPbmx5IHF1ZXJ5IHdoZW4gYXQgbGVhc3Qgb25lIG1vZGVsIGhhcyBhIG5vbi1udWxsIGZvcmVpZ24ga2V5LlxuICAgIGlmIChmb3JlaWduS2V5VmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IGVuc3VyZU1vZGVsQ2xhc3NJbml0aWFsaXplZCh0YXJnZXRNb2RlbENsYXNzLCB0aGlzLnJlbGF0aW9uc2hpcC5nZXRDb25maWd1cmF0aW9uKCkpXG5cbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPj59ICovXG4gICAgICBjb25zdCB3aGVyZUFyZ3MgPSB7fVxuXG4gICAgICB3aGVyZUFyZ3NbcHJpbWFyeUtleV0gPSBmb3JlaWduS2V5VmFsdWVzXG5cbiAgICAgIC8vIExvYWQgdGFyZ2V0IG1vZGVscyB0byBiZSBwcmVsb2FkZWQgb24gdGhlIGdpdmVuIG1vZGVsc1xuICAgICAgbGV0IHF1ZXJ5ID0gdGFyZ2V0TW9kZWxDbGFzcy53aGVyZSh3aGVyZUFyZ3MpXG5cbiAgICAgIHF1ZXJ5ID0gdGhpcy5yZWxhdGlvbnNoaXAuYXBwbHlTY29wZShxdWVyeSlcblxuICAgICAgdGFyZ2V0TW9kZWxzID0gYXdhaXQgcXVlcnkudG9BcnJheSgpXG5cbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0TW9kZWwgb2YgdGFyZ2V0TW9kZWxzKSB7XG4gICAgICAgIGNvbnN0IHByaW1hcnlLZXlWYWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAodGFyZ2V0TW9kZWwucmVhZENvbHVtbih0aGlzLnJlbGF0aW9uc2hpcC5nZXRQcmltYXJ5S2V5KCkpKVxuXG4gICAgICAgIHRhcmdldE1vZGVsc0J5SWRbcHJpbWFyeUtleVZhbHVlXSA9IHRhcmdldE1vZGVsXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSB0YXJnZXQgcHJlbG9hZGVkIG1vZGVscyBvbiB0aGUgZ2l2ZW4gbW9kZWxzXG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiB0aGlzLm1vZGVscykge1xuICAgICAgY29uc3QgZm9yZWlnbktleVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQ29sdW1uKGZvcmVpZ25LZXkpKVxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWwgPSB0YXJnZXRNb2RlbHNCeUlkW2ZvcmVpZ25LZXlWYWx1ZV1cbiAgICAgIGNvbnN0IG1vZGVsUmVsYXRpb25zaGlwID0gbW9kZWwuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHRoaXMucmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSlcblxuICAgICAgbW9kZWxSZWxhdGlvbnNoaXAuc2V0UHJlbG9hZGVkKHRydWUpXG4gICAgICBtb2RlbFJlbGF0aW9uc2hpcC5zZXRMb2FkZWQodGFyZ2V0TW9kZWwpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldE1vZGVsc1xuICB9XG59XG4iXX0=
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVsb25ncy10by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS9wcmVsb2FkZXIvYmVsb25ncy10by5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTywyQkFBMkIsTUFBTSxxQ0FBcUMsQ0FBQTtBQUM3RSxPQUFPLGtCQUFrQixNQUFNLGdCQUFnQixDQUFBO0FBQy9DLE9BQU8sYUFBYSxNQUFNLG1DQUFtQyxDQUFBO0FBRTdELE1BQU0sQ0FBQyxPQUFPLE9BQU8sd0NBQXdDO0lBQzNEOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEdBQUcsUUFBUSxFQUFDO1FBQ3hELGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLGtCQUFrQixFQUFFLENBQUE7SUFDeEQsQ0FBQztJQUVELEtBQUssQ0FBQyxHQUFHO1FBQ1AsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ3BELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO1FBRWhFLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLENBQUE7UUFDL0UsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsSUFB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QUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtZQUViLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNwQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDMUMsQ0FBQztRQUVELE9BQU8sRUFBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixFQUFFLEdBQUcsWUFBWSxDQUFDLEVBQUUsdUJBQXVCLEVBQUMsQ0FBQTtJQUN4RixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGVuc3VyZU1vZGVsQ2xhc3NJbml0aWFsaXplZCBmcm9tIFwiLi9lbnN1cmUtbW9kZWwtY2xhc3MtaW5pdGlhbGl6ZWQuanNcIlxuaW1wb3J0IFByZWxvYWRlclNlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb24uanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlUXVlcnlQcmVsb2FkZXJCZWxvbmdzVG8ge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfSBhcmdzLm1vZGVscyAtIE1vZGVsIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9yZWNvcmQvcmVsYXRpb25zaGlwcy9iZWxvbmdzLXRvLmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVsYXRpb25zaGlwIC0gUmVsYXRpb25zaGlwLlxuICAgKiBAcGFyYW0ge1ByZWxvYWRlclNlbGVjdGlvbn0gW2FyZ3Muc2VsZWN0aW9uXSAtIENvbHVtbiBzZWxlY3Rpb24gYW5kIGlkZW1wb3RlbmN5IHJ1bGVzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe21vZGVscywgcmVsYXRpb25zaGlwLCBzZWxlY3Rpb24sIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICB0aGlzLm1vZGVscyA9IG1vZGVsc1xuICAgIHRoaXMucmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwXG4gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb24gfHwgbmV3IFByZWxvYWRlclNlbGVjdGlvbigpXG4gIH1cblxuICBhc3luYyBydW4oKSB7XG4gICAgY29uc3QgZm9yZWlnbktleSA9IHRoaXMucmVsYXRpb25zaGlwLmdldEZvcmVpZ25LZXkoKVxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSB0aGlzLnJlbGF0aW9uc2hpcC5nZXRQcmltYXJ5S2V5KClcbiAgICBjb25zdCByZWxhdGlvbnNoaXBOYW1lID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpXG5cbiAgICBpZiAodGhpcy5yZWxhdGlvbnNoaXAuZ2V0UG9seW1vcnBoaWMoKSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3J1blBvbHltb3JwaGljKHtmb3JlaWduS2V5LCBwcmltYXJ5S2V5LCByZWxhdGlvbnNoaXBOYW1lfSlcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihcIk5vIHRhcmdldCBtb2RlbCBjbGFzcyBjb3VsZCBiZSBnb3R0ZW4gZnJvbSByZWxhdGlvbnNoaXBcIilcblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gKi9cbiAgICBjb25zdCBzYXRpc2ZpZWRUYXJnZXRzID0gW11cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119ICovXG4gICAgY29uc3QgbW9kZWxzVG9Mb2FkID0gW11cblxuICAgIGZvciAoY29uc3QgbW9kZWwgb2YgdGhpcy5tb2RlbHMpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlUmVsYXRpb25zaGlwID0gbW9kZWwuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpXG5cbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc1NhdGlzZmllZCh7aW5zdGFuY2VSZWxhdGlvbnNoaXAsIHRhcmdldE1vZGVsQ2xhc3MsIG1hcHBpbmdDb2x1bW5zOiBbcHJpbWFyeUtleV19KSkge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAqLyAoaW5zdGFuY2VSZWxhdGlvbnNoaXAuZ2V0TG9hZGVkT3JVbmRlZmluZWQoKSlcblxuICAgICAgICBpZiAobG9hZGVkKSBzYXRpc2ZpZWRUYXJnZXRzLnB1c2gobG9hZGVkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW9kZWxzVG9Mb2FkLnB1c2gobW9kZWwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vZGVsc1RvTG9hZC5sZW5ndGggPT0gMCkgcmV0dXJuIHNhdGlzZmllZFRhcmdldHNcblxuICAgIC8qKiBAdHlwZSB7QXJyYXk8bnVtYmVyIHwgc3RyaW5nPn0gKi9cbiAgICBjb25zdCBmb3JlaWduS2V5VmFsdWVzID0gW11cblxuICAgIGZvciAoY29uc3QgbW9kZWwgb2YgbW9kZWxzVG9Mb2FkKSB7XG4gICAgICBjb25zdCBmb3JlaWduS2V5VmFsdWUgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWR9ICovIChtb2RlbC5yZWFkQ29sdW1uKGZvcmVpZ25LZXkpKVxuXG4gICAgICAvLyBTa2lwIG51bGwvdW5kZWZpbmVkIGZvcmVpZ24ga2V5czogYSBiZWxvbmdzVG8gd2l0aCBubyBmb3JlaWduIGtleSBoYXMgbm9cbiAgICAgIC8vIHRhcmdldCwgYW5kIGluY2x1ZGluZyB0aGVtIHdvdWxkIHNlcmlhbGl6ZSB0byBlLmcuIGBJTiAobnVsbClgIHdoaWNoXG4gICAgICAvLyB0aHJvd3Mgb24gbm9uLXN0cmluZyBwcmltYXJ5LWtleSBjb2x1bW5zLlxuICAgICAgaWYgKGZvcmVpZ25LZXlWYWx1ZSA9PT0gbnVsbCB8fCBmb3JlaWduS2V5VmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgaWYgKCFmb3JlaWduS2V5VmFsdWVzLmluY2x1ZGVzKGZvcmVpZ25LZXlWYWx1ZSkpIGZvcmVpZ25LZXlWYWx1ZXMucHVzaChmb3JlaWduS2V5VmFsdWUpXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59ICovXG4gICAgY29uc3QgdGFyZ2V0TW9kZWxzQnlJZCA9IHt9XG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119ICovXG4gICAgbGV0IHRhcmdldE1vZGVscyA9IFtdXG5cbiAgICAvLyBPbmx5IHF1ZXJ5IHdoZW4gYXQgbGVhc3Qgb25lIG1vZGVsIGhhcyBhIG5vbi1udWxsIGZvcmVpZ24ga2V5LlxuICAgIGlmIChmb3JlaWduS2V5VmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IGVuc3VyZU1vZGVsQ2xhc3NJbml0aWFsaXplZCh0YXJnZXRNb2RlbENsYXNzLCB0aGlzLnJlbGF0aW9uc2hpcC5nZXRDb25maWd1cmF0aW9uKCkpXG5cbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPj59ICovXG4gICAgICBjb25zdCB3aGVyZUFyZ3MgPSB7fVxuXG4gICAgICB3aGVyZUFyZ3NbcHJpbWFyeUtleV0gPSBmb3JlaWduS2V5VmFsdWVzXG5cbiAgICAgIC8vIExvYWQgdGFyZ2V0IG1vZGVscyB0byBiZSBwcmVsb2FkZWQgb24gdGhlIGdpdmVuIG1vZGVsc1xuICAgICAgbGV0IHF1ZXJ5ID0gdGFyZ2V0TW9kZWxDbGFzcy53aGVyZSh3aGVyZUFyZ3MpXG5cbiAgICAgIHF1ZXJ5ID0gdGhpcy5yZWxhdGlvbnNoaXAuYXBwbHlTY29wZShxdWVyeSlcbiAgICAgIHF1ZXJ5ID0gdGhpcy5zZWxlY3Rpb24uYXBwbHlUb1F1ZXJ5KHtxdWVyeSwgdGFyZ2V0TW9kZWxDbGFzcywgbWFwcGluZ0NvbHVtbnM6IFtwcmltYXJ5S2V5XX0pXG5cbiAgICAgIHRhcmdldE1vZGVscyA9IGF3YWl0IHF1ZXJ5LnRvQXJyYXkoKVxuXG4gICAgICBmb3IgKGNvbnN0IHRhcmdldE1vZGVsIG9mIHRhcmdldE1vZGVscykge1xuICAgICAgICBjb25zdCBwcmltYXJ5S2V5VmFsdWUgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKHRhcmdldE1vZGVsLnJlYWRDb2x1bW4ocHJpbWFyeUtleSkpXG5cbiAgICAgICAgdGFyZ2V0TW9kZWxzQnlJZFtwcmltYXJ5S2V5VmFsdWVdID0gdGFyZ2V0TW9kZWxcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIHRhcmdldCBwcmVsb2FkZWQgbW9kZWxzIG9uIHRoZSBnaXZlbiBtb2RlbHNcbiAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIG1vZGVsc1RvTG9hZCkge1xuICAgICAgY29uc3QgZm9yZWlnbktleVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQ29sdW1uKGZvcmVpZ25LZXkpKVxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWwgPSB0YXJnZXRNb2RlbHNCeUlkW2ZvcmVpZ25LZXlWYWx1ZV1cbiAgICAgIGNvbnN0IG1vZGVsUmVsYXRpb25zaGlwID0gbW9kZWwuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpXG5cbiAgICAgIG1vZGVsUmVsYXRpb25zaGlwLnNldFByZWxvYWRlZCh0cnVlKVxuICAgICAgbW9kZWxSZWxhdGlvbnNoaXAuc2V0TG9hZGVkKHRhcmdldE1vZGVsKVxuICAgIH1cblxuICAgIHJldHVybiBbLi4uc2F0aXNmaWVkVGFyZ2V0cywgLi4udGFyZ2V0TW9kZWxzXVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWxvYWQgYSBwb2x5bW9ycGhpYyBiZWxvbmdzVG8sIGdyb3VwaW5nIG1vZGVscyBieSB0aGVpciB0YXJnZXQgdHlwZSBzb1xuICAgKiBlYWNoIGNvbmNyZXRlIHRhcmdldCBtb2RlbCBjbGFzcyBpcyBxdWVyaWVkIHNlcGFyYXRlbHkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZvcmVpZ25LZXkgLSBGb3JlaWduIGtleSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnByaW1hcnlLZXkgLSBQcmltYXJ5IGtleSBjb2x1bW4gb24gdGhlIHRhcmdldC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7dGFyZ2V0TW9kZWxzOiBpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdLCB0YXJnZXRNb2RlbHNCeUNsYXNzTmFtZTogUmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXT59Pn0gLSBMb2FkZWQgdGFyZ2V0cyBhbmQgYSBwZXItY2xhc3MtbmFtZSBncm91cGluZy5cbiAgICovXG4gIGFzeW5jIF9ydW5Qb2x5bW9ycGhpYyh7Zm9yZWlnbktleSwgcHJpbWFyeUtleSwgcmVsYXRpb25zaGlwTmFtZX0pIHtcbiAgICBjb25zdCB0eXBlQ29sdW1uID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0UG9seW1vcnBoaWNUeXBlQ29sdW1uKClcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0Q29uZmlndXJhdGlvbigpXG5cbiAgICAvKiogQHR5cGUge3tmb3JlaWduS2V5VmFsdWU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCwgbW9kZWw6IGltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCB0YXJnZXRUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWR9W119ICovXG4gICAgY29uc3QgbW9kZWxNZXRhID0gW11cblxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gKi9cbiAgICBjb25zdCBzYXRpc2ZpZWRUYXJnZXRzID0gW11cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXT59ICovXG4gICAgY29uc3QgdGFyZ2V0TW9kZWxzQnlDbGFzc05hbWUgPSB7fVxuXG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiB0aGlzLm1vZGVscykge1xuICAgICAgY29uc3QgdGFyZ2V0VHlwZSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqLyAobW9kZWwucmVhZENvbHVtbih0eXBlQ29sdW1uKSlcbiAgICAgIGNvbnN0IGluc3RhbmNlUmVsYXRpb25zaGlwID0gbW9kZWwuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpXG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gdGFyZ2V0VHlwZSA/IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzcyh0YXJnZXRUeXBlKSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAodGFyZ2V0TW9kZWxDbGFzcyAmJiB0aGlzLnNlbGVjdGlvbi5pc1NhdGlzZmllZCh7aW5zdGFuY2VSZWxhdGlvbnNoaXAsIHRhcmdldE1vZGVsQ2xhc3MsIG1hcHBpbmdDb2x1bW5zOiBbcHJpbWFyeUtleV19KSkge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAqLyAoaW5zdGFuY2VSZWxhdGlvbnNoaXAuZ2V0TG9hZGVkT3JVbmRlZmluZWQoKSlcblxuICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgc2F0aXNmaWVkVGFyZ2V0cy5wdXNoKGxvYWRlZClcblxuICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAobG9hZGVkLmNvbnN0cnVjdG9yKS5nZXRNb2RlbE5hbWUoKVxuXG4gICAgICAgICAgaWYgKCF0YXJnZXRNb2RlbHNCeUNsYXNzTmFtZVtjbGFzc05hbWVdKSB0YXJnZXRNb2RlbHNCeUNsYXNzTmFtZVtjbGFzc05hbWVdID0gW11cbiAgICAgICAgICB0YXJnZXRNb2RlbHNCeUNsYXNzTmFtZVtjbGFzc05hbWVdLnB1c2gobG9hZGVkKVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbW9kZWxNZXRhLnB1c2goe1xuICAgICAgICBmb3JlaWduS2V5VmFsdWU6IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkfSAqLyAobW9kZWwucmVhZENvbHVtbihmb3JlaWduS2V5KSksXG4gICAgICAgIG1vZGVsLFxuICAgICAgICB0YXJnZXRUeXBlXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgQXJyYXk8bnVtYmVyIHwgc3RyaW5nPj59ICovXG4gICAgY29uc3QgZm9yZWlnbktleVZhbHVlc0J5VHlwZSA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IG1ldGEgb2YgbW9kZWxNZXRhKSB7XG4gICAgICBpZiAobWV0YS50YXJnZXRUeXBlID09PSB1bmRlZmluZWQgfHwgbWV0YS50YXJnZXRUeXBlID09PSBudWxsKSBjb250aW51ZVxuICAgICAgaWYgKG1ldGEuZm9yZWlnbktleVZhbHVlID09PSB1bmRlZmluZWQgfHwgbWV0YS5mb3JlaWduS2V5VmFsdWUgPT09IG51bGwpIGNvbnRpbnVlXG5cbiAgICAgIGlmICghZm9yZWlnbktleVZhbHVlc0J5VHlwZVttZXRhLnRhcmdldFR5cGVdKSBmb3JlaWduS2V5VmFsdWVzQnlUeXBlW21ldGEudGFyZ2V0VHlwZV0gPSBbXVxuICAgICAgaWYgKCFmb3JlaWduS2V5VmFsdWVzQnlUeXBlW21ldGEudGFyZ2V0VHlwZV0uaW5jbHVkZXMobWV0YS5mb3JlaWduS2V5VmFsdWUpKSBmb3JlaWduS2V5VmFsdWVzQnlUeXBlW21ldGEudGFyZ2V0VHlwZV0ucHVzaChtZXRhLmZvcmVpZ25LZXlWYWx1ZSlcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxudW1iZXIgfCBzdHJpbmcsIGltcG9ydChcIi4uLy4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pj59ICovXG4gICAgY29uc3QgdGFyZ2V0TW9kZWxzQnlUeXBlQW5kSWQgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfSAqL1xuICAgIGNvbnN0IHRhcmdldE1vZGVscyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldFR5cGUgaW4gZm9yZWlnbktleVZhbHVlc0J5VHlwZSkge1xuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzcyh0YXJnZXRUeXBlKVxuXG4gICAgICBhd2FpdCBlbnN1cmVNb2RlbENsYXNzSW5pdGlhbGl6ZWQodGFyZ2V0TW9kZWxDbGFzcywgY29uZmlndXJhdGlvbilcblxuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBBcnJheTxzdHJpbmcgfCBudW1iZXI+Pn0gKi9cbiAgICAgIGNvbnN0IHdoZXJlQXJncyA9IHt9XG5cbiAgICAgIHdoZXJlQXJnc1twcmltYXJ5S2V5XSA9IGZvcmVpZ25LZXlWYWx1ZXNCeVR5cGVbdGFyZ2V0VHlwZV1cblxuICAgICAgbGV0IHF1ZXJ5ID0gdGFyZ2V0TW9kZWxDbGFzcy53aGVyZSh3aGVyZUFyZ3MpXG5cbiAgICAgIHF1ZXJ5ID0gdGhpcy5yZWxhdGlvbnNoaXAuYXBwbHlTY29wZShxdWVyeSlcbiAgICAgIHF1ZXJ5ID0gdGhpcy5zZWxlY3Rpb24uYXBwbHlUb1F1ZXJ5KHtxdWVyeSwgdGFyZ2V0TW9kZWxDbGFzcywgbWFwcGluZ0NvbHVtbnM6IFtwcmltYXJ5S2V5XX0pXG5cbiAgICAgIGNvbnN0IGZvdW5kVGFyZ2V0TW9kZWxzID0gYXdhaXQgcXVlcnkudG9BcnJheSgpXG5cbiAgICAgIHRhcmdldE1vZGVscy5wdXNoKC4uLmZvdW5kVGFyZ2V0TW9kZWxzKVxuXG4gICAgICBjb25zdCBjbGFzc05hbWUgPSB0YXJnZXRNb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXG5cbiAgICAgIGlmICghdGFyZ2V0TW9kZWxzQnlDbGFzc05hbWVbY2xhc3NOYW1lXSkgdGFyZ2V0TW9kZWxzQnlDbGFzc05hbWVbY2xhc3NOYW1lXSA9IFtdXG4gICAgICB0YXJnZXRNb2RlbHNCeUNsYXNzTmFtZVtjbGFzc05hbWVdLnB1c2goLi4uZm91bmRUYXJnZXRNb2RlbHMpXG5cbiAgICAgIHRhcmdldE1vZGVsc0J5VHlwZUFuZElkW3RhcmdldFR5cGVdID0ge31cblxuICAgICAgZm9yIChjb25zdCB0YXJnZXRNb2RlbCBvZiBmb3VuZFRhcmdldE1vZGVscykge1xuICAgICAgICBjb25zdCBwcmltYXJ5S2V5VmFsdWUgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKHRhcmdldE1vZGVsLnJlYWRDb2x1bW4ocHJpbWFyeUtleSkpXG5cbiAgICAgICAgdGFyZ2V0TW9kZWxzQnlUeXBlQW5kSWRbdGFyZ2V0VHlwZV1bcHJpbWFyeUtleVZhbHVlXSA9IHRhcmdldE1vZGVsXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtZXRhIG9mIG1vZGVsTWV0YSkge1xuICAgICAgY29uc3QgbW9kZWxSZWxhdGlvbnNoaXAgPSBtZXRhLm1vZGVsLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKVxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWwgPSAobWV0YS50YXJnZXRUeXBlICYmIG1ldGEuZm9yZWlnbktleVZhbHVlICE9PSB1bmRlZmluZWQgJiYgbWV0YS5mb3JlaWduS2V5VmFsdWUgIT09IG51bGwpXG4gICAgICAgID8gdGFyZ2V0TW9kZWxzQnlUeXBlQW5kSWRbbWV0YS50YXJnZXRUeXBlXT8uW21ldGEuZm9yZWlnbktleVZhbHVlXVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICBtb2RlbFJlbGF0aW9uc2hpcC5zZXRQcmVsb2FkZWQodHJ1ZSlcbiAgICAgIG1vZGVsUmVsYXRpb25zaGlwLnNldExvYWRlZCh0YXJnZXRNb2RlbClcbiAgICB9XG5cbiAgICByZXR1cm4ge3RhcmdldE1vZGVsczogWy4uLnNhdGlzZmllZFRhcmdldHMsIC4uLnRhcmdldE1vZGVsc10sIHRhcmdldE1vZGVsc0J5Q2xhc3NOYW1lfVxuICB9XG59XG4iXX0=
|
|
@@ -3,15 +3,30 @@ export default class VelociousDatabaseQueryPreloaderHasMany {
|
|
|
3
3
|
* @param {object} args - Options object.
|
|
4
4
|
* @param {import("../../record/index.js").default[]} args.models - Model instances.
|
|
5
5
|
* @param {import("../../record/relationships/has-many.js").default} args.relationship - Relationship.
|
|
6
|
+
* @param {PreloaderSelection} [args.selection] - Column selection and idempotency rules.
|
|
6
7
|
*/
|
|
7
|
-
constructor({ models, relationship, ...restArgs }: {
|
|
8
|
+
constructor({ models, relationship, selection, ...restArgs }: {
|
|
8
9
|
models: import("../../record/index.js").default[];
|
|
9
10
|
relationship: import("../../record/relationships/has-many.js").default;
|
|
11
|
+
selection?: PreloaderSelection | undefined;
|
|
10
12
|
});
|
|
11
13
|
models: import("../../record/index.js").default[];
|
|
12
14
|
relationship: import("../../record/relationships/has-many.js").default;
|
|
15
|
+
selection: PreloaderSelection;
|
|
13
16
|
/** @returns {Promise<import("../../record/index.js").default[]>} - Loaded target models. */
|
|
14
17
|
run(): Promise<import("../../record/index.js").default[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Partitions `this.models` into those already satisfied by the current
|
|
20
|
+
* selection (skip) and those that still need loading. Satisfied models'
|
|
21
|
+
* already-loaded targets are collected so nested preloads keep working.
|
|
22
|
+
* @param {typeof import("../../record/index.js").default} targetModelClass - Target model class.
|
|
23
|
+
* @param {string[]} mappingColumns - Columns required for mapping (foreign key).
|
|
24
|
+
* @returns {{modelsToLoad: import("../../record/index.js").default[], satisfiedTargets: import("../../record/index.js").default[]}} - The partition.
|
|
25
|
+
*/
|
|
26
|
+
_partition(targetModelClass: typeof import("../../record/index.js").default, mappingColumns: string[]): {
|
|
27
|
+
modelsToLoad: import("../../record/index.js").default[];
|
|
28
|
+
satisfiedTargets: import("../../record/index.js").default[];
|
|
29
|
+
};
|
|
15
30
|
/**
|
|
16
31
|
* Preload through a join table (e.g. hasMany("invoiceGroups", {through: "invoiceGroupLinks"})).
|
|
17
32
|
*
|
|
@@ -25,4 +40,5 @@ export default class VelociousDatabaseQueryPreloaderHasMany {
|
|
|
25
40
|
*/
|
|
26
41
|
_runDirect(): Promise<import("../../record/index.js").default[]>;
|
|
27
42
|
}
|
|
43
|
+
import PreloaderSelection from "./selection.js";
|
|
28
44
|
//# sourceMappingURL=has-many.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"has-many.d.ts","sourceRoot":"","sources":["../../../../../src/database/query/preloader/has-many.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"has-many.d.ts","sourceRoot":"","sources":["../../../../../src/database/query/preloader/has-many.js"],"names":[],"mappings":"AAMA;IACE;;;;;OAKG;IACH,8DAJG;QAAwD,MAAM,EAAtD,OAAO,uBAAuB,EAAE,OAAO,EAAE;QACsB,YAAY,EAA3E,OAAO,wCAAwC,EAAE,OAAO;QAC9B,SAAS;KAC7C,EAOA;IAHC,kDAAoB;IACpB,uEAAgC;IAChC,8BAAsD;IAGxD,4FAA4F;IAC5F,OADc,OAAO,CAAC,OAAO,uBAAuB,EAAE,OAAO,EAAE,CAAC,CAO/D;IAED;;;;;;;OAOG;IACH,6BAJW,cAAc,uBAAuB,EAAE,OAAO,kBAC9C,MAAM,EAAE,GACN;QAAC,YAAY,EAAE,OAAO,uBAAuB,EAAE,OAAO,EAAE,CAAC;QAAC,gBAAgB,EAAE,OAAO,uBAAuB,EAAE,OAAO,EAAE,CAAA;KAAC,CAsBlI;IAED;;;;OAIG;IACH,eAFa,OAAO,CAAC,OAAO,uBAAuB,EAAE,OAAO,EAAE,CAAC,CA8H9D;IAED;;;;OAIG;IACH,cAFa,OAAO,CAAC,OAAO,uBAAuB,EAAE,OAAO,EAAE,CAAC,CA8E9D;CACF;+BA9Q8B,gBAAgB"}
|