@decaf-ts/for-couchdb 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +646 -144
- package/README.md +371 -1
- package/dist/for-couchdb.cjs +733 -24
- package/dist/for-couchdb.esm.cjs +733 -24
- package/lib/adapter.cjs +186 -1
- package/lib/adapter.d.ts +234 -0
- package/lib/constants.cjs +29 -1
- package/lib/constants.d.ts +28 -0
- package/lib/errors.cjs +18 -1
- package/lib/errors.d.ts +17 -0
- package/lib/esm/adapter.d.ts +234 -0
- package/lib/esm/adapter.js +186 -1
- package/lib/esm/constants.d.ts +28 -0
- package/lib/esm/constants.js +29 -1
- package/lib/esm/errors.d.ts +17 -0
- package/lib/esm/errors.js +18 -1
- package/lib/esm/index.d.ts +6 -13
- package/lib/esm/index.js +7 -14
- package/lib/esm/indexes/generator.d.ts +47 -0
- package/lib/esm/indexes/generator.js +58 -1
- package/lib/esm/interfaces/CouchDBRepository.d.ts +10 -0
- package/lib/esm/interfaces/CouchDBRepository.js +1 -1
- package/lib/esm/model/CouchDBSequence.d.ts +19 -0
- package/lib/esm/model/CouchDBSequence.js +12 -1
- package/lib/esm/query/Paginator.d.ts +111 -0
- package/lib/esm/query/Paginator.js +117 -8
- package/lib/esm/query/Statement.d.ts +134 -0
- package/lib/esm/query/Statement.js +143 -1
- package/lib/esm/query/constants.d.ts +42 -0
- package/lib/esm/query/constants.js +43 -1
- package/lib/esm/query/translate.d.ts +31 -0
- package/lib/esm/query/translate.js +32 -1
- package/lib/esm/sequences/Sequence.d.ts +0 -2
- package/lib/esm/sequences/Sequence.js +2 -4
- package/lib/esm/types.d.ts +55 -12
- package/lib/esm/types.js +1 -1
- package/lib/esm/utils.d.ts +105 -0
- package/lib/esm/utils.js +106 -1
- package/lib/index.cjs +7 -14
- package/lib/index.d.ts +6 -13
- package/lib/indexes/generator.cjs +58 -1
- package/lib/indexes/generator.d.ts +47 -0
- package/lib/interfaces/CouchDBRepository.cjs +1 -1
- package/lib/interfaces/CouchDBRepository.d.ts +10 -0
- package/lib/model/CouchDBSequence.cjs +12 -1
- package/lib/model/CouchDBSequence.d.ts +19 -0
- package/lib/query/Paginator.cjs +117 -8
- package/lib/query/Paginator.d.ts +111 -0
- package/lib/query/Statement.cjs +143 -1
- package/lib/query/Statement.d.ts +134 -0
- package/lib/query/constants.cjs +43 -1
- package/lib/query/constants.d.ts +42 -0
- package/lib/query/translate.cjs +32 -1
- package/lib/query/translate.d.ts +31 -0
- package/lib/sequences/Sequence.cjs +2 -4
- package/lib/sequences/Sequence.d.ts +0 -2
- package/lib/types.cjs +1 -1
- package/lib/types.d.ts +55 -12
- package/lib/utils.cjs +106 -1
- package/lib/utils.d.ts +105 -0
- package/package.json +2 -2
package/lib/query/Statement.cjs
CHANGED
|
@@ -7,10 +7,86 @@ const constants_1 = require("./../constants.cjs");
|
|
|
7
7
|
const constants_2 = require("./constants.cjs");
|
|
8
8
|
const Paginator_1 = require("./Paginator.cjs");
|
|
9
9
|
const db_decorators_1 = require("@decaf-ts/db-decorators");
|
|
10
|
+
/**
|
|
11
|
+
* @description Statement builder for CouchDB Mango queries
|
|
12
|
+
* @summary Provides a fluent interface for building CouchDB Mango queries with type safety
|
|
13
|
+
* @template M - The model type that extends Model
|
|
14
|
+
* @template R - The result type
|
|
15
|
+
* @param adapter - The CouchDB adapter
|
|
16
|
+
* @class CouchDBStatement
|
|
17
|
+
* @example
|
|
18
|
+
* // Example of using CouchDBStatement
|
|
19
|
+
* const adapter = new MyCouchDBAdapter(scope);
|
|
20
|
+
* const statement = new CouchDBStatement<User, User[]>(adapter);
|
|
21
|
+
*
|
|
22
|
+
* // Build a query
|
|
23
|
+
* const users = await statement
|
|
24
|
+
* .from(User)
|
|
25
|
+
* .where(Condition.attribute<User>('age').gt(18))
|
|
26
|
+
* .orderBy('lastName', 'asc')
|
|
27
|
+
* .limit(10)
|
|
28
|
+
* .execute();
|
|
29
|
+
*/
|
|
10
30
|
class CouchDBStatement extends core_1.Statement {
|
|
11
31
|
constructor(adapter) {
|
|
12
32
|
super(adapter);
|
|
13
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* @description Builds a CouchDB Mango query from the statement
|
|
36
|
+
* @summary Converts the statement's conditions, selectors, and options into a CouchDB Mango query
|
|
37
|
+
* @return {MangoQuery} The built Mango query
|
|
38
|
+
* @throws {Error} If there are invalid query conditions
|
|
39
|
+
* @mermaid
|
|
40
|
+
* sequenceDiagram
|
|
41
|
+
* participant Statement
|
|
42
|
+
* participant Repository
|
|
43
|
+
* participant parseCondition
|
|
44
|
+
*
|
|
45
|
+
* Statement->>Statement: build()
|
|
46
|
+
* Note over Statement: Initialize selectors
|
|
47
|
+
* Statement->>Repository: Get table name
|
|
48
|
+
* Repository-->>Statement: Return table name
|
|
49
|
+
* Statement->>Statement: Create base query
|
|
50
|
+
*
|
|
51
|
+
* alt Has selectSelector
|
|
52
|
+
* Statement->>Statement: Add fields to query
|
|
53
|
+
* end
|
|
54
|
+
*
|
|
55
|
+
* alt Has whereCondition
|
|
56
|
+
* Statement->>Statement: Create combined condition with table
|
|
57
|
+
* Statement->>parseCondition: Parse condition
|
|
58
|
+
* parseCondition-->>Statement: Return parsed condition
|
|
59
|
+
*
|
|
60
|
+
* alt Is group operator
|
|
61
|
+
* alt Is AND operator
|
|
62
|
+
* Statement->>Statement: Flatten nested AND conditions
|
|
63
|
+
* else Is OR operator
|
|
64
|
+
* Statement->>Statement: Combine with table condition
|
|
65
|
+
* else
|
|
66
|
+
* Statement->>Statement: Throw error
|
|
67
|
+
* end
|
|
68
|
+
* else
|
|
69
|
+
* Statement->>Statement: Merge conditions with existing selector
|
|
70
|
+
* end
|
|
71
|
+
* end
|
|
72
|
+
*
|
|
73
|
+
* alt Has orderBySelector
|
|
74
|
+
* Statement->>Statement: Add sort to query
|
|
75
|
+
* Statement->>Statement: Ensure field exists in selector
|
|
76
|
+
* end
|
|
77
|
+
*
|
|
78
|
+
* alt Has limitSelector
|
|
79
|
+
* Statement->>Statement: Set limit
|
|
80
|
+
* else
|
|
81
|
+
* Statement->>Statement: Use default limit
|
|
82
|
+
* end
|
|
83
|
+
*
|
|
84
|
+
* alt Has offsetSelector
|
|
85
|
+
* Statement->>Statement: Set skip
|
|
86
|
+
* end
|
|
87
|
+
*
|
|
88
|
+
* Statement-->>Statement: Return query
|
|
89
|
+
*/
|
|
14
90
|
build() {
|
|
15
91
|
const selectors = {};
|
|
16
92
|
selectors[constants_1.CouchDBKeys.TABLE] = {};
|
|
@@ -88,6 +164,14 @@ class CouchDBStatement extends core_1.Statement {
|
|
|
88
164
|
query.skip = this.offsetSelector;
|
|
89
165
|
return query;
|
|
90
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* @description Creates a paginator for the statement
|
|
169
|
+
* @summary Builds the query and returns a CouchDBPaginator for paginated results
|
|
170
|
+
* @template R - The result type
|
|
171
|
+
* @param {number} size - The page size
|
|
172
|
+
* @return {Promise<Paginator<M, R, MangoQuery>>} A promise that resolves to a paginator
|
|
173
|
+
* @throws {InternalError} If there's an error building the query
|
|
174
|
+
*/
|
|
91
175
|
async paginate(size) {
|
|
92
176
|
try {
|
|
93
177
|
const query = this.build();
|
|
@@ -97,6 +181,14 @@ class CouchDBStatement extends core_1.Statement {
|
|
|
97
181
|
throw new db_decorators_1.InternalError(e);
|
|
98
182
|
}
|
|
99
183
|
}
|
|
184
|
+
/**
|
|
185
|
+
* @description Processes a record from CouchDB
|
|
186
|
+
* @summary Extracts the ID from a CouchDB document and reverts it to a model instance
|
|
187
|
+
* @param {any} r - The raw record from CouchDB
|
|
188
|
+
* @param pkAttr - The primary key attribute of the model
|
|
189
|
+
* @param {"Number" | "BigInt" | undefined} sequenceType - The type of the sequence
|
|
190
|
+
* @return {any} The processed record
|
|
191
|
+
*/
|
|
100
192
|
processRecord(r, pkAttr, sequenceType) {
|
|
101
193
|
if (r[constants_1.CouchDBKeys.ID]) {
|
|
102
194
|
const [, ...keyArgs] = r[constants_1.CouchDBKeys.ID].split(constants_1.CouchDBKeys.SEPARATOR);
|
|
@@ -105,6 +197,13 @@ class CouchDBStatement extends core_1.Statement {
|
|
|
105
197
|
}
|
|
106
198
|
return r;
|
|
107
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* @description Executes a raw Mango query
|
|
202
|
+
* @summary Sends a raw Mango query to CouchDB and processes the results
|
|
203
|
+
* @template R - The result type
|
|
204
|
+
* @param {MangoQuery} rawInput - The raw Mango query to execute
|
|
205
|
+
* @return {Promise<R>} A promise that resolves to the query results
|
|
206
|
+
*/
|
|
108
207
|
async raw(rawInput) {
|
|
109
208
|
const results = await this.adapter.raw(rawInput, true);
|
|
110
209
|
const pkDef = (0, db_decorators_1.findPrimaryKey)(new this.fromSelector());
|
|
@@ -114,7 +213,50 @@ class CouchDBStatement extends core_1.Statement {
|
|
|
114
213
|
return results.map((r) => this.processRecord(r, pkAttr, type));
|
|
115
214
|
return results;
|
|
116
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* @description Parses a condition into a CouchDB Mango query selector
|
|
218
|
+
* @summary Converts a Condition object into a CouchDB Mango query selector structure
|
|
219
|
+
* @param {Condition<M>} condition - The condition to parse
|
|
220
|
+
* @return {MangoQuery} The Mango query with the parsed condition as its selector
|
|
221
|
+
* @mermaid
|
|
222
|
+
* sequenceDiagram
|
|
223
|
+
* participant Statement
|
|
224
|
+
* participant translateOperators
|
|
225
|
+
* participant merge
|
|
226
|
+
*
|
|
227
|
+
* Statement->>Statement: parseCondition(condition)
|
|
228
|
+
*
|
|
229
|
+
* Note over Statement: Extract condition parts
|
|
230
|
+
*
|
|
231
|
+
* alt Simple comparison operator
|
|
232
|
+
* Statement->>translateOperators: translateOperators(operator)
|
|
233
|
+
* translateOperators-->>Statement: Return CouchDB operator
|
|
234
|
+
* Statement->>Statement: Create selector with attribute and operator
|
|
235
|
+
* else NOT operator
|
|
236
|
+
* Statement->>Statement: parseCondition(attr1)
|
|
237
|
+
* Statement->>translateOperators: translateOperators(Operator.NOT)
|
|
238
|
+
* translateOperators-->>Statement: Return CouchDB NOT operator
|
|
239
|
+
* Statement->>Statement: Create negated selector
|
|
240
|
+
* else AND/OR operator
|
|
241
|
+
* Statement->>Statement: parseCondition(attr1)
|
|
242
|
+
* Statement->>Statement: parseCondition(comparison)
|
|
243
|
+
* Statement->>translateOperators: translateOperators(operator)
|
|
244
|
+
* translateOperators-->>Statement: Return CouchDB group operator
|
|
245
|
+
* Statement->>merge: merge(operator, op1, op2)
|
|
246
|
+
* merge-->>Statement: Return merged selector
|
|
247
|
+
* end
|
|
248
|
+
*
|
|
249
|
+
* Statement-->>Statement: Return query with selector
|
|
250
|
+
*/
|
|
117
251
|
parseCondition(condition) {
|
|
252
|
+
/**
|
|
253
|
+
* @description Merges two selectors with a logical operator
|
|
254
|
+
* @summary Helper function to combine two selectors with a logical operator
|
|
255
|
+
* @param {MangoOperator} op - The operator to use for merging
|
|
256
|
+
* @param {MangoSelector} obj1 - The first selector
|
|
257
|
+
* @param {MangoSelector} obj2 - The second selector
|
|
258
|
+
* @return {MangoQuery} The merged query
|
|
259
|
+
*/
|
|
118
260
|
function merge(op, obj1, obj2) {
|
|
119
261
|
const result = { selector: {} };
|
|
120
262
|
result.selector[op] = [obj1, obj2];
|
|
@@ -141,4 +283,4 @@ class CouchDBStatement extends core_1.Statement {
|
|
|
141
283
|
}
|
|
142
284
|
}
|
|
143
285
|
exports.CouchDBStatement = CouchDBStatement;
|
|
144
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhdGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3F1ZXJ5L1N0YXRlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FTd0I7QUFJeEIsK0NBQWlEO0FBQ2pELGtEQUEyQztBQUMzQywrQ0FJcUI7QUFDckIsK0NBQStDO0FBQy9DLDJEQUF3RTtBQUV4RSxNQUFhLGdCQUFxQyxTQUFRLGdCQUl6RDtJQUNDLFlBQVksT0FBc0M7UUFDaEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFUyxLQUFLO1FBQ2IsTUFBTSxTQUFTLEdBQWtCLEVBQUUsQ0FBQztRQUNwQyxTQUFTLENBQUMsdUJBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbEMsU0FBUyxDQUFDLHVCQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsaUJBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25FLE1BQU0sS0FBSyxHQUFlLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ2xELElBQUksSUFBSSxDQUFDLGNBQWM7WUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUEwQixDQUFDO1FBRXhFLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sU0FBUyxHQUFrQixJQUFJLENBQUMsY0FBYyxDQUNsRCxnQkFBUyxDQUFDLEdBQUcsQ0FDWCxJQUFJLENBQUMsY0FBYyxFQUNuQixnQkFBUyxDQUFDLFNBQVMsQ0FBSSx1QkFBVyxDQUFDLEtBQWdCLENBQUMsQ0FBQyxFQUFFLENBQ3JELEtBQUssQ0FBQyxRQUFRLENBQUMsdUJBQVcsQ0FBQyxLQUFLLENBQUMsQ0FDbEMsQ0FDRixDQUNGLENBQUMsUUFBUSxDQUFDO1lBQ1gsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQW9CLENBQUM7WUFD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VSxDQUFDO1FBQ2pCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLEdBQVEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFxQixDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3JFLE1BQU0sR0FBRyxHQUFRLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBMEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUMxRSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUEsOEJBQWtCLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUM5RCxDQUFDO1FBRUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFqTUQsNENBaU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uZGl0aW9uLFxuICBHcm91cE9wZXJhdG9yLFxuICBPcGVyYXRvcixcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBhZ2luYXRvcixcbiAgUmVwb3NpdG9yeSxcbiAgU2VxdWVuY2UsXG4gIFN0YXRlbWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNYW5nb09wZXJhdG9yLCBNYW5nb1F1ZXJ5LCBNYW5nb1NlbGVjdG9yIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvdWNoREJBZGFwdGVyIH0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB7IHRyYW5zbGF0ZU9wZXJhdG9ycyB9IGZyb20gXCIuL3RyYW5zbGF0ZVwiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBDb3VjaERCR3JvdXBPcGVyYXRvcixcbiAgQ291Y2hEQk9wZXJhdG9yLFxuICBDb3VjaERCUXVlcnlMaW1pdCxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb3VjaERCUGFnaW5hdG9yIH0gZnJvbSBcIi4vUGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBmaW5kUHJpbWFyeUtleSwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgY2xhc3MgQ291Y2hEQlN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBNYW5nb1F1ZXJ5LFxuICBNLFxuICBSXG4+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogQ291Y2hEQkFkYXB0ZXI8YW55LCBhbnksIGFueT4pIHtcbiAgICBzdXBlcihhZGFwdGVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZCgpOiBNYW5nb1F1ZXJ5IHtcbiAgICBjb25zdCBzZWxlY3RvcnM6IE1hbmdvU2VsZWN0b3IgPSB7fTtcbiAgICBzZWxlY3RvcnNbQ291Y2hEQktleXMuVEFCTEVdID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IFJlcG9zaXRvcnkudGFibGUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHF1ZXJ5OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjogc2VsZWN0b3JzIH07XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpIHF1ZXJ5LmZpZWxkcyA9IHRoaXMuc2VsZWN0U2VsZWN0b3IgYXMgc3RyaW5nW107XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbikge1xuICAgICAgY29uc3QgY29uZGl0aW9uOiBNYW5nb1NlbGVjdG9yID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIENvbmRpdGlvbi5hdHRyaWJ1dGU8TT4oQ291Y2hEQktleXMuVEFCTEUgYXMga2V5b2YgTSkuZXEoXG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvcltDb3VjaERCS2V5cy5UQUJMRV1cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICkuc2VsZWN0b3I7XG4gICAgICBjb25zdCBzZWxlY3RvcktleXMgPSBPYmplY3Qua2V5cyhjb25kaXRpb24pIGFzIE1hbmdvT3BlcmF0b3JbXTtcbiAgICAgIGlmIChcbiAgICAgICAgc2VsZWN0b3JLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBPYmplY3QudmFsdWVzKENvdWNoREJHcm91cE9wZXJhdG9yKS5pbmRleE9mKHNlbGVjdG9yS2V5c1swXSkgIT09IC0xXG4gICAgICApXG4gICAgICAgIHN3aXRjaCAoc2VsZWN0b3JLZXlzWzBdKSB7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQ6XG4gICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSBhcyBNYW5nb1NlbGVjdG9yXG4gICAgICAgICAgICAgICkucmVkdWNlKChhY2N1bTogTWFuZ29TZWxlY3RvcltdLCB2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJUb28gbWFueSBrZXlzIGluIHF1ZXJ5IHNlbGVjdG9yLiBzaG91bGQgYmUgb25lXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IGtleXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGsgPT09IENvdWNoREJHcm91cE9wZXJhdG9yLkFORClcbiAgICAgICAgICAgICAgICAgIGFjY3VtLnB1c2goLi4uKHZhbFtrXSBhcyBhbnlbXSkpO1xuICAgICAgICAgICAgICAgIGVsc2UgYWNjdW0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgICAgfSwgW10pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gY29uZGl0aW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5PUjoge1xuICAgICAgICAgICAgY29uc3QgczogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgc1tDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHF1ZXJ5LnNlbGVjdG9yKS5tYXAoKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IHM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgc2hvdWxkIGJlIGltcG9zc2libGVcIik7XG4gICAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBPYmplY3QuZW50cmllcyhjb25kaXRpb24pLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAocXVlcnkuc2VsZWN0b3Jba2V5XSlcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYEEgJHtrZXl9IHF1ZXJ5IHBhcmFtIGlzIGFib3V0IHRvIGJlIG92ZXJyaWRkZW46ICR7cXVlcnkuc2VsZWN0b3Jba2V5XX0gYnkgJHt2YWx9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltrZXldID0gdmFsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3IpIHtcbiAgICAgIHF1ZXJ5LnNvcnQgPSBxdWVyeS5zb3J0IHx8IFtdO1xuICAgICAgcXVlcnkuc2VsZWN0b3IgPSBxdWVyeS5zZWxlY3RvciB8fCAoe30gYXMgTWFuZ29TZWxlY3Rvcik7XG4gICAgICBjb25zdCBbc2VsZWN0b3IsIHZhbHVlXSA9IHRoaXMub3JkZXJCeVNlbGVjdG9yIGFzIFtcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBPcmRlckRpcmVjdGlvbixcbiAgICAgIF07XG4gICAgICBjb25zdCByZWM6IGFueSA9IHt9O1xuICAgICAgcmVjW3NlbGVjdG9yXSA9IHZhbHVlO1xuICAgICAgKHF1ZXJ5LnNvcnQgYXMgYW55W10pLnB1c2gocmVjIGFzIGFueSk7XG4gICAgICBpZiAoIXF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSkge1xuICAgICAgICBxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgICAocXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJdID1cbiAgICAgICAgICBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmxpbWl0U2VsZWN0b3IpIHtcbiAgICAgIHF1ZXJ5LmxpbWl0ID0gdGhpcy5saW1pdFNlbGVjdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBObyBsaW1pdCBzZWxlY3RvciBkZWZpbmVkLiBVc2luZyBkZWZhdWx0IGNvdWNoZGIgbGltaXQgb2YgJHtDb3VjaERCUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcXVlcnkubGltaXQgPSBDb3VjaERCUXVlcnlMaW1pdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vZmZzZXRTZWxlY3RvcikgcXVlcnkuc2tpcCA9IHRoaXMub2Zmc2V0U2VsZWN0b3I7XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICBhc3luYyBwYWdpbmF0ZTxSPihzaXplOiBudW1iZXIpOiBQcm9taXNlPFBhZ2luYXRvcjxNLCBSLCBNYW5nb1F1ZXJ5Pj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeTogTWFuZ29RdWVyeSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIHJldHVybiBuZXcgQ291Y2hEQlBhZ2luYXRvcihcbiAgICAgICAgdGhpcy5hZGFwdGVyIGFzIGFueSxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHNpemUsXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzUmVjb3JkKFxuICAgIHI6IGFueSxcbiAgICBwa0F0dHI6IGtleW9mIE0sXG4gICAgc2VxdWVuY2VUeXBlOiBcIk51bWJlclwiIHwgXCJCaWdJbnRcIiB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAocltDb3VjaERCS2V5cy5JRF0pIHtcbiAgICAgIGNvbnN0IFssIC4uLmtleUFyZ3NdID0gcltDb3VjaERCS2V5cy5JRF0uc3BsaXQoQ291Y2hEQktleXMuU0VQQVJBVE9SKTtcblxuICAgICAgY29uc3QgaWQgPSBrZXlBcmdzLmpvaW4oXCJfXCIpO1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQoXG4gICAgICAgIHIsXG4gICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yLFxuICAgICAgICBwa0F0dHIsXG4gICAgICAgIFNlcXVlbmNlLnBhcnNlVmFsdWUoc2VxdWVuY2VUeXBlLCBpZClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmF3PFI+KHJhd0lucHV0OiBNYW5nb1F1ZXJ5KTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHJhd0lucHV0LCB0cnVlKTtcblxuICAgIGNvbnN0IHBrRGVmID0gZmluZFByaW1hcnlLZXkobmV3IHRoaXMuZnJvbVNlbGVjdG9yKCkpO1xuICAgIGNvbnN0IHBrQXR0ciA9IHBrRGVmLmlkO1xuICAgIGNvbnN0IHR5cGUgPSBwa0RlZi5wcm9wcy50eXBlO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdFNlbGVjdG9yKVxuICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKChyKSA9PiB0aGlzLnByb2Nlc3NSZWNvcmQociwgcGtBdHRyLCB0eXBlKSkgYXMgUjtcbiAgICByZXR1cm4gcmVzdWx0cyBhcyBSO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+KTogTWFuZ29RdWVyeSB7XG4gICAgZnVuY3Rpb24gbWVyZ2UoXG4gICAgICBvcDogTWFuZ29PcGVyYXRvcixcbiAgICAgIG9iajE6IE1hbmdvU2VsZWN0b3IsXG4gICAgICBvYmoyOiBNYW5nb1NlbGVjdG9yXG4gICAgKTogTWFuZ29RdWVyeSB7XG4gICAgICBjb25zdCByZXN1bHQ6IE1hbmdvUXVlcnkgPSB7IHNlbGVjdG9yOiB7fSBhcyBNYW5nb1NlbGVjdG9yIH07XG4gICAgICByZXN1bHQuc2VsZWN0b3Jbb3BdID0gW29iajEsIG9iajJdO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvbiB9ID0gY29uZGl0aW9uIGFzIHVua25vd24gYXMge1xuICAgICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjxNPjtcbiAgICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3I7XG4gICAgICBjb21wYXJpc29uOiBhbnk7XG4gICAgfTtcblxuICAgIGxldCBvcDogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICBvcFthdHRyMSBhcyBzdHJpbmddID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFthdHRyMSBhcyBzdHJpbmddIGFzIE1hbmdvU2VsZWN0b3IpW3RyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcildID1cbiAgICAgICAgY29tcGFyaXNvbjtcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIG9wID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yIGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgKGF0dHIxIGFzIHVua25vd24gYXMgeyBhdHRyMTogc3RyaW5nIH0pLmF0dHIxXG4gICAgICBdID0gY29tcGFyaXNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3AxOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBjb25zdCBvcDI6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oY29tcGFyaXNvbiBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgb3AgPSBtZXJnZSh0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpLCBvcDEsIG9wMikuc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wIH07XG4gIH1cbn1cbiJdfQ==
|
|
286
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhdGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3F1ZXJ5L1N0YXRlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FTd0I7QUFJeEIsK0NBQWlEO0FBQ2pELGtEQUEyQztBQUMzQywrQ0FJcUI7QUFDckIsK0NBQStDO0FBQy9DLDJEQUF3RTtBQUV4RTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQWEsZ0JBQXFDLFNBQVEsZ0JBSXpEO0lBQ0MsWUFBWSxPQUFzQztRQUNoRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BdURHO0lBQ08sS0FBSztRQUNiLE1BQU0sU0FBUyxHQUFrQixFQUFFLENBQUM7UUFDcEMsU0FBUyxDQUFDLHVCQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xDLFNBQVMsQ0FBQyx1QkFBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLGlCQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRSxNQUFNLEtBQUssR0FBZSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUNsRCxJQUFJLElBQUksQ0FBQyxjQUFjO1lBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBMEIsQ0FBQztRQUV4RSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixNQUFNLFNBQVMsR0FBa0IsSUFBSSxDQUFDLGNBQWMsQ0FDbEQsZ0JBQVMsQ0FBQyxHQUFHLENBQ1gsSUFBSSxDQUFDLGNBQWMsRUFDbkIsZ0JBQVMsQ0FBQyxTQUFTLENBQUksdUJBQVcsQ0FBQyxLQUFnQixDQUFDLENBQUMsRUFBRSxDQUNyRCxLQUFLLENBQUMsUUFBUSxDQUFDLHVCQUFXLENBQUMsS0FBSyxD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Q0FBQyxLQUFxQixDQUFDLENBQUMsUUFBeUIsQ0FBQztZQUMxRSxFQUFFLENBQUMsSUFBQSw4QkFBa0IsRUFBQyxlQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFtQixDQUFDO1lBQzFELEVBQUUsQ0FBQyxJQUFBLDhCQUFrQixFQUFDLGVBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBbUIsQ0FDcEQsS0FBc0MsQ0FBQyxLQUFLLENBQzlDLEdBQUcsVUFBVSxDQUFDO1FBQ2pCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLEdBQVEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFxQixDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3JFLE1BQU0sR0FBRyxHQUFRLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBMEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUMxRSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUEsOEJBQWtCLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUM5RCxDQUFDO1FBRUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUEzVEQsNENBMlRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uZGl0aW9uLFxuICBHcm91cE9wZXJhdG9yLFxuICBPcGVyYXRvcixcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBhZ2luYXRvcixcbiAgUmVwb3NpdG9yeSxcbiAgU2VxdWVuY2UsXG4gIFN0YXRlbWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNYW5nb09wZXJhdG9yLCBNYW5nb1F1ZXJ5LCBNYW5nb1NlbGVjdG9yIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvdWNoREJBZGFwdGVyIH0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB7IHRyYW5zbGF0ZU9wZXJhdG9ycyB9IGZyb20gXCIuL3RyYW5zbGF0ZVwiO1xuaW1wb3J0IHsgQ291Y2hEQktleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBDb3VjaERCR3JvdXBPcGVyYXRvcixcbiAgQ291Y2hEQk9wZXJhdG9yLFxuICBDb3VjaERCUXVlcnlMaW1pdCxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb3VjaERCUGFnaW5hdG9yIH0gZnJvbSBcIi4vUGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBmaW5kUHJpbWFyeUtleSwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGF0ZW1lbnQgYnVpbGRlciBmb3IgQ291Y2hEQiBNYW5nbyBxdWVyaWVzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIGZsdWVudCBpbnRlcmZhY2UgZm9yIGJ1aWxkaW5nIENvdWNoREIgTWFuZ28gcXVlcmllcyB3aXRoIHR5cGUgc2FmZXR5XG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVzdWx0IHR5cGVcbiAqIEBwYXJhbSBhZGFwdGVyIC0gVGhlIENvdWNoREIgYWRhcHRlclxuICogQGNsYXNzIENvdWNoREJTdGF0ZW1lbnRcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIG9mIHVzaW5nIENvdWNoREJTdGF0ZW1lbnRcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgTXlDb3VjaERCQWRhcHRlcihzY29wZSk7XG4gKiBjb25zdCBzdGF0ZW1lbnQgPSBuZXcgQ291Y2hEQlN0YXRlbWVudDxVc2VyLCBVc2VyW10+KGFkYXB0ZXIpO1xuICpcbiAqIC8vIEJ1aWxkIGEgcXVlcnlcbiAqIGNvbnN0IHVzZXJzID0gYXdhaXQgc3RhdGVtZW50XG4gKiAgIC5mcm9tKFVzZXIpXG4gKiAgIC53aGVyZShDb25kaXRpb24uYXR0cmlidXRlPFVzZXI+KCdhZ2UnKS5ndCgxOCkpXG4gKiAgIC5vcmRlckJ5KCdsYXN0TmFtZScsICdhc2MnKVxuICogICAubGltaXQoMTApXG4gKiAgIC5leGVjdXRlKCk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDb3VjaERCU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBTdGF0ZW1lbnQ8XG4gIE1hbmdvUXVlcnksXG4gIE0sXG4gIFJcbj4ge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBDb3VjaERCQWRhcHRlcjxhbnksIGFueSwgYW55Pikge1xuICAgIHN1cGVyKGFkYXB0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IGZyb20gdGhlIHN0YXRlbWVudFxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgc3RhdGVtZW50J3MgY29uZGl0aW9ucywgc2VsZWN0b3JzLCBhbmQgb3B0aW9ucyBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeVxuICAgKiBAcmV0dXJuIHtNYW5nb1F1ZXJ5fSBUaGUgYnVpbHQgTWFuZ28gcXVlcnlcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIGFyZSBpbnZhbGlkIHF1ZXJ5IGNvbmRpdGlvbnNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgU3RhdGVtZW50XG4gICAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICAgKiAgIHBhcnRpY2lwYW50IHBhcnNlQ29uZGl0aW9uXG4gICAqXG4gICAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBidWlsZCgpXG4gICAqICAgTm90ZSBvdmVyIFN0YXRlbWVudDogSW5pdGlhbGl6ZSBzZWxlY3RvcnNcbiAgICogICBTdGF0ZW1lbnQtPj5SZXBvc2l0b3J5OiBHZXQgdGFibGUgbmFtZVxuICAgKiAgIFJlcG9zaXRvcnktLT4+U3RhdGVtZW50OiBSZXR1cm4gdGFibGUgbmFtZVxuICAgKiAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGJhc2UgcXVlcnlcbiAgICpcbiAgICogICBhbHQgSGFzIHNlbGVjdFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBmaWVsZHMgdG8gcXVlcnlcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIHdoZXJlQ29uZGl0aW9uXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENyZWF0ZSBjb21iaW5lZCBjb25kaXRpb24gd2l0aCB0YWJsZVxuICAgKiAgICAgU3RhdGVtZW50LT4+cGFyc2VDb25kaXRpb246IFBhcnNlIGNvbmRpdGlvblxuICAgKiAgICAgcGFyc2VDb25kaXRpb24tLT4+U3RhdGVtZW50OiBSZXR1cm4gcGFyc2VkIGNvbmRpdGlvblxuICAgKlxuICAgKiAgICAgYWx0IElzIGdyb3VwIG9wZXJhdG9yXG4gICAqICAgICAgIGFsdCBJcyBBTkQgb3BlcmF0b3JcbiAgICogICAgICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEZsYXR0ZW4gbmVzdGVkIEFORCBjb25kaXRpb25zXG4gICAqICAgICAgIGVsc2UgSXMgT1Igb3BlcmF0b3JcbiAgICogICAgICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENvbWJpbmUgd2l0aCB0YWJsZSBjb25kaXRpb25cbiAgICogICAgICAgZWxzZVxuICAgKiAgICAgICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogVGhyb3cgZXJyb3JcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbHNlXG4gICAqICAgICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogTWVyZ2UgY29uZGl0aW9ucyB3aXRoIGV4aXN0aW5nIHNlbGVjdG9yXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIG9yZGVyQnlTZWxlY3RvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgc29ydCB0byBxdWVyeVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBFbnN1cmUgZmllbGQgZXhpc3RzIGluIHNlbGVjdG9yXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyBsaW1pdFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBsaW1pdFxuICAgKiAgIGVsc2VcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogVXNlIGRlZmF1bHQgbGltaXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIG9mZnNldFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBza2lwXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgU3RhdGVtZW50LS0+PlN0YXRlbWVudDogUmV0dXJuIHF1ZXJ5XG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGQoKTogTWFuZ29RdWVyeSB7XG4gICAgY29uc3Qgc2VsZWN0b3JzOiBNYW5nb1NlbGVjdG9yID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBxdWVyeTogTWFuZ29RdWVyeSA9IHsgc2VsZWN0b3I6IHNlbGVjdG9ycyB9O1xuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKSBxdWVyeS5maWVsZHMgPSB0aGlzLnNlbGVjdFNlbGVjdG9yIGFzIHN0cmluZ1tdO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbjogTWFuZ29TZWxlY3RvciA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIENvbmRpdGlvbi5hbmQoXG4gICAgICAgICAgdGhpcy53aGVyZUNvbmRpdGlvbixcbiAgICAgICAgICBDb25kaXRpb24uYXR0cmlidXRlPE0+KENvdWNoREJLZXlzLlRBQkxFIGFzIGtleW9mIE0pLmVxKFxuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3JbQ291Y2hEQktleXMuVEFCTEVdXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnNlbGVjdG9yO1xuICAgICAgY29uc3Qgc2VsZWN0b3JLZXlzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uKSBhcyBNYW5nb09wZXJhdG9yW107XG4gICAgICBpZiAoXG4gICAgICAgIHNlbGVjdG9yS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhDb3VjaERCR3JvdXBPcGVyYXRvcikuaW5kZXhPZihzZWxlY3RvcktleXNbMF0pICE9PSAtMVxuICAgICAgKVxuICAgICAgICBzd2l0Y2ggKHNlbGVjdG9yS2V5c1swXSkge1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gPSBbXG4gICAgICAgICAgICAgIC4uLk9iamVjdC52YWx1ZXMoXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uW0NvdWNoREJHcm91cE9wZXJhdG9yLkFORF0gYXMgTWFuZ29TZWxlY3RvclxuICAgICAgICAgICAgICApLnJlZHVjZSgoYWNjdW06IE1hbmdvU2VsZWN0b3JbXSwgdmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiVG9vIG1hbnkga2V5cyBpbiBxdWVyeSBzZWxlY3Rvci4gc2hvdWxkIGJlIG9uZVwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGsgPSBrZXlzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChrID09PSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQpXG4gICAgICAgICAgICAgICAgICBhY2N1bS5wdXNoKC4uLih2YWxba10gYXMgYW55W10pKTtcbiAgICAgICAgICAgICAgICBlbHNlIGFjY3VtLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICAgIH0sIFtdKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IGNvbmRpdGlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgQ291Y2hEQkdyb3VwT3BlcmF0b3IuT1I6IHtcbiAgICAgICAgICAgIGNvbnN0IHM6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgIHNbQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhxdWVyeS5zZWxlY3RvcikubWFwKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8YW55LCBhbnk+ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcXVlcnkuc2VsZWN0b3IgPSBzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKHF1ZXJ5LnNlbGVjdG9yW2tleV0pXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBBICR7a2V5fSBxdWVyeSBwYXJhbSBpcyBhYm91dCB0byBiZSBvdmVycmlkZGVuOiAke3F1ZXJ5LnNlbGVjdG9yW2tleV19IGJ5ICR7dmFsfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcXVlcnkuc2VsZWN0b3Jba2V5XSA9IHZhbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9yKSB7XG4gICAgICBxdWVyeS5zb3J0ID0gcXVlcnkuc29ydCB8fCBbXTtcbiAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gcXVlcnkuc2VsZWN0b3IgfHwgKHt9IGFzIE1hbmdvU2VsZWN0b3IpO1xuICAgICAgY29uc3QgW3NlbGVjdG9yLCB2YWx1ZV0gPSB0aGlzLm9yZGVyQnlTZWxlY3RvciBhcyBbXG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgT3JkZXJEaXJlY3Rpb24sXG4gICAgICBdO1xuICAgICAgY29uc3QgcmVjOiBhbnkgPSB7fTtcbiAgICAgIHJlY1tzZWxlY3Rvcl0gPSB2YWx1ZTtcbiAgICAgIChxdWVyeS5zb3J0IGFzIGFueVtdKS5wdXNoKHJlYyBhcyBhbnkpO1xuICAgICAgaWYgKCFxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0pIHtcbiAgICAgICAgcXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgICAgKHF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSBhcyBNYW5nb1NlbGVjdG9yKVtDb3VjaERCT3BlcmF0b3IuQklHR0VSXSA9XG4gICAgICAgICAgbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxdWVyeS5saW1pdCA9IHRoaXMubGltaXRTZWxlY3RvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgTm8gbGltaXQgc2VsZWN0b3IgZGVmaW5lZC4gVXNpbmcgZGVmYXVsdCBjb3VjaGRiIGxpbWl0IG9mICR7Q291Y2hEQlF1ZXJ5TGltaXR9YFxuICAgICAgKTtcbiAgICAgIHF1ZXJ5LmxpbWl0ID0gQ291Y2hEQlF1ZXJ5TGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub2Zmc2V0U2VsZWN0b3IpIHF1ZXJ5LnNraXAgPSB0aGlzLm9mZnNldFNlbGVjdG9yO1xuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcGFnaW5hdG9yIGZvciB0aGUgc3RhdGVtZW50XG4gICAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgYSBDb3VjaERCUGFnaW5hdG9yIGZvciBwYWdpbmF0ZWQgcmVzdWx0c1xuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXN1bHQgdHlwZVxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBwYWdlIHNpemVcbiAgICogQHJldHVybiB7UHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgTWFuZ29RdWVyeT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIHBhZ2luYXRvclxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSdzIGFuIGVycm9yIGJ1aWxkaW5nIHRoZSBxdWVyeVxuICAgKi9cbiAgYXN5bmMgcGFnaW5hdGU8Uj4oc2l6ZTogbnVtYmVyKTogUHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgTWFuZ29RdWVyeT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnk6IE1hbmdvUXVlcnkgPSB0aGlzLmJ1aWxkKCk7XG4gICAgICByZXR1cm4gbmV3IENvdWNoREJQYWdpbmF0b3IoXG4gICAgICAgIHRoaXMuYWRhcHRlciBhcyBhbnksXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBzaXplLFxuICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGEgcmVjb3JkIGZyb20gQ291Y2hEQlxuICAgKiBAc3VtbWFyeSBFeHRyYWN0cyB0aGUgSUQgZnJvbSBhIENvdWNoREIgZG9jdW1lbnQgYW5kIHJldmVydHMgaXQgdG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge2FueX0gciAtIFRoZSByYXcgcmVjb3JkIGZyb20gQ291Y2hEQlxuICAgKiBAcGFyYW0gcGtBdHRyIC0gVGhlIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBvZiB0aGUgbW9kZWxcbiAgICogQHBhcmFtIHtcIk51bWJlclwiIHwgXCJCaWdJbnRcIiB8IHVuZGVmaW5lZH0gc2VxdWVuY2VUeXBlIC0gVGhlIHR5cGUgb2YgdGhlIHNlcXVlbmNlXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHByb2Nlc3NlZCByZWNvcmRcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1JlY29yZChcbiAgICByOiBhbnksXG4gICAgcGtBdHRyOiBrZXlvZiBNLFxuICAgIHNlcXVlbmNlVHlwZTogXCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgaWYgKHJbQ291Y2hEQktleXMuSURdKSB7XG4gICAgICBjb25zdCBbLCAuLi5rZXlBcmdzXSA9IHJbQ291Y2hEQktleXMuSURdLnNwbGl0KENvdWNoREJLZXlzLlNFUEFSQVRPUik7XG5cbiAgICAgIGNvbnN0IGlkID0ga2V5QXJncy5qb2luKFwiX1wiKTtcbiAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KFxuICAgICAgICByLFxuICAgICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgICAgcGtBdHRyLFxuICAgICAgICBTZXF1ZW5jZS5wYXJzZVZhbHVlKHNlcXVlbmNlVHlwZSwgaWQpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgTWFuZ28gcXVlcnlcbiAgICogQHN1bW1hcnkgU2VuZHMgYSByYXcgTWFuZ28gcXVlcnkgdG8gQ291Y2hEQiBhbmQgcHJvY2Vzc2VzIHRoZSByZXN1bHRzXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlc3VsdCB0eXBlXG4gICAqIEBwYXJhbSB7TWFuZ29RdWVyeX0gcmF3SW5wdXQgLSBUaGUgcmF3IE1hbmdvIHF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogTWFuZ29RdWVyeSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IGFueVtdID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyhyYXdJbnB1dCwgdHJ1ZSk7XG5cbiAgICBjb25zdCBwa0RlZiA9IGZpbmRQcmltYXJ5S2V5KG5ldyB0aGlzLmZyb21TZWxlY3RvcigpKTtcbiAgICBjb25zdCBwa0F0dHIgPSBwa0RlZi5pZDtcbiAgICBjb25zdCB0eXBlID0gcGtEZWYucHJvcHMudHlwZTtcblxuICAgIGlmICghdGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocikgPT4gdGhpcy5wcm9jZXNzUmVjb3JkKHIsIHBrQXR0ciwgdHlwZSkpIGFzIFI7XG4gICAgcmV0dXJuIHJlc3VsdHMgYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29uZGl0aW9uIGludG8gYSBDb3VjaERCIE1hbmdvIHF1ZXJ5IHNlbGVjdG9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgQ29uZGl0aW9uIG9iamVjdCBpbnRvIGEgQ291Y2hEQiBNYW5nbyBxdWVyeSBzZWxlY3RvciBzdHJ1Y3R1cmVcbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gcGFyc2VcbiAgICogQHJldHVybiB7TWFuZ29RdWVyeX0gVGhlIE1hbmdvIHF1ZXJ5IHdpdGggdGhlIHBhcnNlZCBjb25kaXRpb24gYXMgaXRzIHNlbGVjdG9yXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICAgKiAgIHBhcnRpY2lwYW50IG1lcmdlXG4gICAqXG4gICAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihjb25kaXRpb24pXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIFN0YXRlbWVudDogRXh0cmFjdCBjb25kaXRpb24gcGFydHNcbiAgICpcbiAgICogICBhbHQgU2ltcGxlIGNvbXBhcmlzb24gb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PnRyYW5zbGF0ZU9wZXJhdG9yczogdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKVxuICAgKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PlN0YXRlbWVudDogUmV0dXJuIENvdWNoREIgb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIHNlbGVjdG9yIHdpdGggYXR0cmlidXRlIGFuZCBvcGVyYXRvclxuICAgKiAgIGVsc2UgTk9UIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGF0dHIxKVxuICAgKiAgICAgU3RhdGVtZW50LT4+dHJhbnNsYXRlT3BlcmF0b3JzOiB0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKVxuICAgKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PlN0YXRlbWVudDogUmV0dXJuIENvdWNoREIgTk9UIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENyZWF0ZSBuZWdhdGVkIHNlbGVjdG9yXG4gICAqICAgZWxzZSBBTkQvT1Igb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oYXR0cjEpXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGNvbXBhcmlzb24pXG4gICAqICAgICBTdGF0ZW1lbnQtPj50cmFuc2xhdGVPcGVyYXRvcnM6IHRyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcilcbiAgICogICAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0tPj5TdGF0ZW1lbnQ6IFJldHVybiBDb3VjaERCIGdyb3VwIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5tZXJnZTogbWVyZ2Uob3BlcmF0b3IsIG9wMSwgb3AyKVxuICAgKiAgICAgbWVyZ2UtLT4+U3RhdGVtZW50OiBSZXR1cm4gbWVyZ2VkIHNlbGVjdG9yXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgU3RhdGVtZW50LS0+PlN0YXRlbWVudDogUmV0dXJuIHF1ZXJ5IHdpdGggc2VsZWN0b3JcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZUNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbjxNPik6IE1hbmdvUXVlcnkge1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBNZXJnZXMgdHdvIHNlbGVjdG9ycyB3aXRoIGEgbG9naWNhbCBvcGVyYXRvclxuICAgICAqIEBzdW1tYXJ5IEhlbHBlciBmdW5jdGlvbiB0byBjb21iaW5lIHR3byBzZWxlY3RvcnMgd2l0aCBhIGxvZ2ljYWwgb3BlcmF0b3JcbiAgICAgKiBAcGFyYW0ge01hbmdvT3BlcmF0b3J9IG9wIC0gVGhlIG9wZXJhdG9yIHRvIHVzZSBmb3IgbWVyZ2luZ1xuICAgICAqIEBwYXJhbSB7TWFuZ29TZWxlY3Rvcn0gb2JqMSAtIFRoZSBmaXJzdCBzZWxlY3RvclxuICAgICAqIEBwYXJhbSB7TWFuZ29TZWxlY3Rvcn0gb2JqMiAtIFRoZSBzZWNvbmQgc2VsZWN0b3JcbiAgICAgKiBAcmV0dXJuIHtNYW5nb1F1ZXJ5fSBUaGUgbWVyZ2VkIHF1ZXJ5XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVyZ2UoXG4gICAgICBvcDogTWFuZ29PcGVyYXRvcixcbiAgICAgIG9iajE6IE1hbmdvU2VsZWN0b3IsXG4gICAgICBvYmoyOiBNYW5nb1NlbGVjdG9yXG4gICAgKTogTWFuZ29RdWVyeSB7XG4gICAgICBjb25zdCByZXN1bHQ6IE1hbmdvUXVlcnkgPSB7IHNlbGVjdG9yOiB7fSBhcyBNYW5nb1NlbGVjdG9yIH07XG4gICAgICByZXN1bHQuc2VsZWN0b3Jbb3BdID0gW29iajEsIG9iajJdO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGF0dHIxLCBvcGVyYXRvciwgY29tcGFyaXNvbiB9ID0gY29uZGl0aW9uIGFzIHVua25vd24gYXMge1xuICAgICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjxNPjtcbiAgICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3I7XG4gICAgICBjb21wYXJpc29uOiBhbnk7XG4gICAgfTtcblxuICAgIGxldCBvcDogTWFuZ29TZWxlY3RvciA9IHt9IGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICBvcFthdHRyMSBhcyBzdHJpbmddID0ge30gYXMgTWFuZ29TZWxlY3RvcjtcbiAgICAgIChvcFthdHRyMSBhcyBzdHJpbmddIGFzIE1hbmdvU2VsZWN0b3IpW3RyYW5zbGF0ZU9wZXJhdG9ycyhvcGVyYXRvcildID1cbiAgICAgICAgY29tcGFyaXNvbjtcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIG9wID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yIGFzIE1hbmdvU2VsZWN0b3I7XG4gICAgICBvcFt0cmFuc2xhdGVPcGVyYXRvcnMoT3BlcmF0b3IuTk9UKV0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgKG9wW3RyYW5zbGF0ZU9wZXJhdG9ycyhPcGVyYXRvci5OT1QpXSBhcyBNYW5nb1NlbGVjdG9yKVtcbiAgICAgICAgKGF0dHIxIGFzIHVua25vd24gYXMgeyBhdHRyMTogc3RyaW5nIH0pLmF0dHIxXG4gICAgICBdID0gY29tcGFyaXNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3AxOiBhbnkgPSB0aGlzLnBhcnNlQ29uZGl0aW9uKGF0dHIxIGFzIENvbmRpdGlvbjxNPikuc2VsZWN0b3I7XG4gICAgICBjb25zdCBvcDI6IGFueSA9IHRoaXMucGFyc2VDb25kaXRpb24oY29tcGFyaXNvbiBhcyBDb25kaXRpb248TT4pLnNlbGVjdG9yO1xuICAgICAgb3AgPSBtZXJnZSh0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpLCBvcDEsIG9wMikuc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2VsZWN0b3I6IG9wIH07XG4gIH1cbn1cbiJdfQ==
|
package/lib/query/Statement.d.ts
CHANGED
|
@@ -2,11 +2,145 @@ import { Condition, Paginator, Statement } from "@decaf-ts/core";
|
|
|
2
2
|
import { MangoQuery } from "../types";
|
|
3
3
|
import { Model } from "@decaf-ts/decorator-validation";
|
|
4
4
|
import { CouchDBAdapter } from "../adapter";
|
|
5
|
+
/**
|
|
6
|
+
* @description Statement builder for CouchDB Mango queries
|
|
7
|
+
* @summary Provides a fluent interface for building CouchDB Mango queries with type safety
|
|
8
|
+
* @template M - The model type that extends Model
|
|
9
|
+
* @template R - The result type
|
|
10
|
+
* @param adapter - The CouchDB adapter
|
|
11
|
+
* @class CouchDBStatement
|
|
12
|
+
* @example
|
|
13
|
+
* // Example of using CouchDBStatement
|
|
14
|
+
* const adapter = new MyCouchDBAdapter(scope);
|
|
15
|
+
* const statement = new CouchDBStatement<User, User[]>(adapter);
|
|
16
|
+
*
|
|
17
|
+
* // Build a query
|
|
18
|
+
* const users = await statement
|
|
19
|
+
* .from(User)
|
|
20
|
+
* .where(Condition.attribute<User>('age').gt(18))
|
|
21
|
+
* .orderBy('lastName', 'asc')
|
|
22
|
+
* .limit(10)
|
|
23
|
+
* .execute();
|
|
24
|
+
*/
|
|
5
25
|
export declare class CouchDBStatement<M extends Model, R> extends Statement<MangoQuery, M, R> {
|
|
6
26
|
constructor(adapter: CouchDBAdapter<any, any, any>);
|
|
27
|
+
/**
|
|
28
|
+
* @description Builds a CouchDB Mango query from the statement
|
|
29
|
+
* @summary Converts the statement's conditions, selectors, and options into a CouchDB Mango query
|
|
30
|
+
* @return {MangoQuery} The built Mango query
|
|
31
|
+
* @throws {Error} If there are invalid query conditions
|
|
32
|
+
* @mermaid
|
|
33
|
+
* sequenceDiagram
|
|
34
|
+
* participant Statement
|
|
35
|
+
* participant Repository
|
|
36
|
+
* participant parseCondition
|
|
37
|
+
*
|
|
38
|
+
* Statement->>Statement: build()
|
|
39
|
+
* Note over Statement: Initialize selectors
|
|
40
|
+
* Statement->>Repository: Get table name
|
|
41
|
+
* Repository-->>Statement: Return table name
|
|
42
|
+
* Statement->>Statement: Create base query
|
|
43
|
+
*
|
|
44
|
+
* alt Has selectSelector
|
|
45
|
+
* Statement->>Statement: Add fields to query
|
|
46
|
+
* end
|
|
47
|
+
*
|
|
48
|
+
* alt Has whereCondition
|
|
49
|
+
* Statement->>Statement: Create combined condition with table
|
|
50
|
+
* Statement->>parseCondition: Parse condition
|
|
51
|
+
* parseCondition-->>Statement: Return parsed condition
|
|
52
|
+
*
|
|
53
|
+
* alt Is group operator
|
|
54
|
+
* alt Is AND operator
|
|
55
|
+
* Statement->>Statement: Flatten nested AND conditions
|
|
56
|
+
* else Is OR operator
|
|
57
|
+
* Statement->>Statement: Combine with table condition
|
|
58
|
+
* else
|
|
59
|
+
* Statement->>Statement: Throw error
|
|
60
|
+
* end
|
|
61
|
+
* else
|
|
62
|
+
* Statement->>Statement: Merge conditions with existing selector
|
|
63
|
+
* end
|
|
64
|
+
* end
|
|
65
|
+
*
|
|
66
|
+
* alt Has orderBySelector
|
|
67
|
+
* Statement->>Statement: Add sort to query
|
|
68
|
+
* Statement->>Statement: Ensure field exists in selector
|
|
69
|
+
* end
|
|
70
|
+
*
|
|
71
|
+
* alt Has limitSelector
|
|
72
|
+
* Statement->>Statement: Set limit
|
|
73
|
+
* else
|
|
74
|
+
* Statement->>Statement: Use default limit
|
|
75
|
+
* end
|
|
76
|
+
*
|
|
77
|
+
* alt Has offsetSelector
|
|
78
|
+
* Statement->>Statement: Set skip
|
|
79
|
+
* end
|
|
80
|
+
*
|
|
81
|
+
* Statement-->>Statement: Return query
|
|
82
|
+
*/
|
|
7
83
|
protected build(): MangoQuery;
|
|
84
|
+
/**
|
|
85
|
+
* @description Creates a paginator for the statement
|
|
86
|
+
* @summary Builds the query and returns a CouchDBPaginator for paginated results
|
|
87
|
+
* @template R - The result type
|
|
88
|
+
* @param {number} size - The page size
|
|
89
|
+
* @return {Promise<Paginator<M, R, MangoQuery>>} A promise that resolves to a paginator
|
|
90
|
+
* @throws {InternalError} If there's an error building the query
|
|
91
|
+
*/
|
|
8
92
|
paginate<R>(size: number): Promise<Paginator<M, R, MangoQuery>>;
|
|
93
|
+
/**
|
|
94
|
+
* @description Processes a record from CouchDB
|
|
95
|
+
* @summary Extracts the ID from a CouchDB document and reverts it to a model instance
|
|
96
|
+
* @param {any} r - The raw record from CouchDB
|
|
97
|
+
* @param pkAttr - The primary key attribute of the model
|
|
98
|
+
* @param {"Number" | "BigInt" | undefined} sequenceType - The type of the sequence
|
|
99
|
+
* @return {any} The processed record
|
|
100
|
+
*/
|
|
9
101
|
private processRecord;
|
|
102
|
+
/**
|
|
103
|
+
* @description Executes a raw Mango query
|
|
104
|
+
* @summary Sends a raw Mango query to CouchDB and processes the results
|
|
105
|
+
* @template R - The result type
|
|
106
|
+
* @param {MangoQuery} rawInput - The raw Mango query to execute
|
|
107
|
+
* @return {Promise<R>} A promise that resolves to the query results
|
|
108
|
+
*/
|
|
10
109
|
raw<R>(rawInput: MangoQuery): Promise<R>;
|
|
110
|
+
/**
|
|
111
|
+
* @description Parses a condition into a CouchDB Mango query selector
|
|
112
|
+
* @summary Converts a Condition object into a CouchDB Mango query selector structure
|
|
113
|
+
* @param {Condition<M>} condition - The condition to parse
|
|
114
|
+
* @return {MangoQuery} The Mango query with the parsed condition as its selector
|
|
115
|
+
* @mermaid
|
|
116
|
+
* sequenceDiagram
|
|
117
|
+
* participant Statement
|
|
118
|
+
* participant translateOperators
|
|
119
|
+
* participant merge
|
|
120
|
+
*
|
|
121
|
+
* Statement->>Statement: parseCondition(condition)
|
|
122
|
+
*
|
|
123
|
+
* Note over Statement: Extract condition parts
|
|
124
|
+
*
|
|
125
|
+
* alt Simple comparison operator
|
|
126
|
+
* Statement->>translateOperators: translateOperators(operator)
|
|
127
|
+
* translateOperators-->>Statement: Return CouchDB operator
|
|
128
|
+
* Statement->>Statement: Create selector with attribute and operator
|
|
129
|
+
* else NOT operator
|
|
130
|
+
* Statement->>Statement: parseCondition(attr1)
|
|
131
|
+
* Statement->>translateOperators: translateOperators(Operator.NOT)
|
|
132
|
+
* translateOperators-->>Statement: Return CouchDB NOT operator
|
|
133
|
+
* Statement->>Statement: Create negated selector
|
|
134
|
+
* else AND/OR operator
|
|
135
|
+
* Statement->>Statement: parseCondition(attr1)
|
|
136
|
+
* Statement->>Statement: parseCondition(comparison)
|
|
137
|
+
* Statement->>translateOperators: translateOperators(operator)
|
|
138
|
+
* translateOperators-->>Statement: Return CouchDB group operator
|
|
139
|
+
* Statement->>merge: merge(operator, op1, op2)
|
|
140
|
+
* merge-->>Statement: Return merged selector
|
|
141
|
+
* end
|
|
142
|
+
*
|
|
143
|
+
* Statement-->>Statement: Return query with selector
|
|
144
|
+
*/
|
|
11
145
|
protected parseCondition(condition: Condition<M>): MangoQuery;
|
|
12
146
|
}
|
package/lib/query/constants.cjs
CHANGED
|
@@ -1,7 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CouchDBConst = exports.CouchDBGroupOperator = exports.CouchDBOperator = exports.CouchDBQueryLimit = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @description Default query limit for CouchDB queries
|
|
6
|
+
* @summary Maximum number of documents to return in a single query
|
|
7
|
+
* @const CouchDBQueryLimit
|
|
8
|
+
* @memberOf module:for-couchdb
|
|
9
|
+
*/
|
|
4
10
|
exports.CouchDBQueryLimit = 250;
|
|
11
|
+
/**
|
|
12
|
+
* @description Mapping of operator names to CouchDB Mango query operators
|
|
13
|
+
* @summary Constants for CouchDB comparison operators used in Mango queries
|
|
14
|
+
* @typedef {Object} CouchDBOperatorType
|
|
15
|
+
* @property {string} EQUAL - Equality operator ($eq)
|
|
16
|
+
* @property {string} DIFFERENT - Inequality operator ($ne)
|
|
17
|
+
* @property {string} BIGGER - Greater than operator ($gt)
|
|
18
|
+
* @property {string} BIGGER_EQ - Greater than or equal operator ($gte)
|
|
19
|
+
* @property {string} SMALLER - Less than operator ($lt)
|
|
20
|
+
* @property {string} SMALLER_EQ - Less than or equal operator ($lte)
|
|
21
|
+
* @property {string} NOT - Negation operator ($not)
|
|
22
|
+
* @property {string} IN - In array operator ($in)
|
|
23
|
+
* @property {string} REGEXP - Regular expression operator ($regex)
|
|
24
|
+
* @const CouchDBOperator
|
|
25
|
+
* @type {CouchDBOperatorType}
|
|
26
|
+
* @memberOf module:for-couchdb
|
|
27
|
+
*/
|
|
5
28
|
exports.CouchDBOperator = {
|
|
6
29
|
EQUAL: "$eq",
|
|
7
30
|
DIFFERENT: "$ne",
|
|
@@ -15,11 +38,30 @@ exports.CouchDBOperator = {
|
|
|
15
38
|
// IS = "IS",
|
|
16
39
|
REGEXP: "$regex",
|
|
17
40
|
};
|
|
41
|
+
/**
|
|
42
|
+
* @description Mapping of logical operator names to CouchDB Mango query operators
|
|
43
|
+
* @summary Constants for CouchDB logical operators used in Mango queries
|
|
44
|
+
* @typedef {Object} CouchDBGroupOperatorType
|
|
45
|
+
* @property {string} AND - Logical AND operator ($and)
|
|
46
|
+
* @property {string} OR - Logical OR operator ($or)
|
|
47
|
+
* @const CouchDBGroupOperator
|
|
48
|
+
* @type {CouchDBGroupOperatorType}
|
|
49
|
+
* @memberOf module:for-couchdb
|
|
50
|
+
*/
|
|
18
51
|
exports.CouchDBGroupOperator = {
|
|
19
52
|
AND: "$and",
|
|
20
53
|
OR: "$or",
|
|
21
54
|
};
|
|
55
|
+
/**
|
|
56
|
+
* @description Special constant values used in CouchDB queries
|
|
57
|
+
* @summary String constants representing special values in CouchDB
|
|
58
|
+
* @typedef {Object} CouchDBConstType
|
|
59
|
+
* @property {string} NULL - String representation of null value
|
|
60
|
+
* @const CouchDBConst
|
|
61
|
+
* @type {CouchDBConstType}
|
|
62
|
+
* @memberOf module:for-couchdb
|
|
63
|
+
*/
|
|
22
64
|
exports.CouchDBConst = {
|
|
23
65
|
NULL: "null",
|
|
24
66
|
};
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3F1ZXJ5L2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQTs7Ozs7R0FLRztBQUNVLFFBQUEsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO0FBRXJDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ1UsUUFBQSxlQUFlLEdBQWtDO0lBQzVELEtBQUssRUFBRSxLQUFLO0lBQ1osU0FBUyxFQUFFLEtBQUs7SUFDaEIsTUFBTSxFQUFFLEtBQUs7SUFDYixTQUFTLEVBQUUsTUFBTTtJQUNqQixPQUFPLEVBQUUsS0FBSztJQUNkLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLHVCQUF1QjtJQUN2QixHQUFHLEVBQUUsTUFBTTtJQUNYLEVBQUUsRUFBRSxLQUFLO0lBQ1QsYUFBYTtJQUNiLE1BQU0sRUFBRSxRQUFRO0NBQ2pCLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDVSxRQUFBLG9CQUFvQixHQUFrQztJQUNqRSxHQUFHLEVBQUUsTUFBTTtJQUNYLEVBQUUsRUFBRSxLQUFLO0NBQ1YsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ1UsUUFBQSxZQUFZLEdBQTJCO0lBQ2xELElBQUksRUFBRSxNQUFNO0NBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1hbmdvT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBxdWVyeSBsaW1pdCBmb3IgQ291Y2hEQiBxdWVyaWVzXG4gKiBAc3VtbWFyeSBNYXhpbXVtIG51bWJlciBvZiBkb2N1bWVudHMgdG8gcmV0dXJuIGluIGEgc2luZ2xlIHF1ZXJ5XG4gKiBAY29uc3QgQ291Y2hEQlF1ZXJ5TGltaXRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqL1xuZXhwb3J0IGNvbnN0IENvdWNoREJRdWVyeUxpbWl0ID0gMjUwO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIG9wZXJhdG9yIG5hbWVzIHRvIENvdWNoREIgTWFuZ28gcXVlcnkgb3BlcmF0b3JzXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIENvdWNoREIgY29tcGFyaXNvbiBvcGVyYXRvcnMgdXNlZCBpbiBNYW5nbyBxdWVyaWVzXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb3VjaERCT3BlcmF0b3JUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRVFVQUwgLSBFcXVhbGl0eSBvcGVyYXRvciAoJGVxKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IERJRkZFUkVOVCAtIEluZXF1YWxpdHkgb3BlcmF0b3IgKCRuZSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCSUdHRVIgLSBHcmVhdGVyIHRoYW4gb3BlcmF0b3IgKCRndClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCSUdHRVJfRVEgLSBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IgKCRndGUpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU01BTExFUiAtIExlc3MgdGhhbiBvcGVyYXRvciAoJGx0KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNNQUxMRVJfRVEgLSBMZXNzIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IgKCRsdGUpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTk9UIC0gTmVnYXRpb24gb3BlcmF0b3IgKCRub3QpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU4gLSBJbiBhcnJheSBvcGVyYXRvciAoJGluKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFR0VYUCAtIFJlZ3VsYXIgZXhwcmVzc2lvbiBvcGVyYXRvciAoJHJlZ2V4KVxuICogQGNvbnN0IENvdWNoREJPcGVyYXRvclxuICogQHR5cGUge0NvdWNoREJPcGVyYXRvclR5cGV9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKi9cbmV4cG9ydCBjb25zdCBDb3VjaERCT3BlcmF0b3I6IFJlY29yZDxzdHJpbmcsIE1hbmdvT3BlcmF0b3I+ID0ge1xuICBFUVVBTDogXCIkZXFcIixcbiAgRElGRkVSRU5UOiBcIiRuZVwiLFxuICBCSUdHRVI6IFwiJGd0XCIsXG4gIEJJR0dFUl9FUTogXCIkZ3RlXCIsXG4gIFNNQUxMRVI6IFwiJGx0XCIsXG4gIFNNQUxMRVJfRVE6IFwiJGx0ZVwiLFxuICAvLyBCRVRXRUVOID0gXCJCRVRXRUVOXCIsXG4gIE5PVDogXCIkbm90XCIsXG4gIElOOiBcIiRpblwiLFxuICAvLyBJUyA9IFwiSVNcIixcbiAgUkVHRVhQOiBcIiRyZWdleFwiLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiBsb2dpY2FsIG9wZXJhdG9yIG5hbWVzIHRvIENvdWNoREIgTWFuZ28gcXVlcnkgb3BlcmF0b3JzXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIENvdWNoREIgbG9naWNhbCBvcGVyYXRvcnMgdXNlZCBpbiBNYW5nbyBxdWVyaWVzXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb3VjaERCR3JvdXBPcGVyYXRvclR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBBTkQgLSBMb2dpY2FsIEFORCBvcGVyYXRvciAoJGFuZClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPUiAtIExvZ2ljYWwgT1Igb3BlcmF0b3IgKCRvcilcbiAqIEBjb25zdCBDb3VjaERCR3JvdXBPcGVyYXRvclxuICogQHR5cGUge0NvdWNoREJHcm91cE9wZXJhdG9yVHlwZX1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqL1xuZXhwb3J0IGNvbnN0IENvdWNoREJHcm91cE9wZXJhdG9yOiBSZWNvcmQ8c3RyaW5nLCBNYW5nb09wZXJhdG9yPiA9IHtcbiAgQU5EOiBcIiRhbmRcIixcbiAgT1I6IFwiJG9yXCIsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWFsIGNvbnN0YW50IHZhbHVlcyB1c2VkIGluIENvdWNoREIgcXVlcmllc1xuICogQHN1bW1hcnkgU3RyaW5nIGNvbnN0YW50cyByZXByZXNlbnRpbmcgc3BlY2lhbCB2YWx1ZXMgaW4gQ291Y2hEQlxuICogQHR5cGVkZWYge09iamVjdH0gQ291Y2hEQkNvbnN0VHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5VTEwgLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVsbCB2YWx1ZVxuICogQGNvbnN0IENvdWNoREJDb25zdFxuICogQHR5cGUge0NvdWNoREJDb25zdFR5cGV9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKi9cbmV4cG9ydCBjb25zdCBDb3VjaERCQ29uc3Q6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIE5VTEw6IFwibnVsbFwiLFxufTtcbiJdfQ==
|
package/lib/query/constants.d.ts
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
import { MangoOperator } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* @description Default query limit for CouchDB queries
|
|
4
|
+
* @summary Maximum number of documents to return in a single query
|
|
5
|
+
* @const CouchDBQueryLimit
|
|
6
|
+
* @memberOf module:for-couchdb
|
|
7
|
+
*/
|
|
2
8
|
export declare const CouchDBQueryLimit = 250;
|
|
9
|
+
/**
|
|
10
|
+
* @description Mapping of operator names to CouchDB Mango query operators
|
|
11
|
+
* @summary Constants for CouchDB comparison operators used in Mango queries
|
|
12
|
+
* @typedef {Object} CouchDBOperatorType
|
|
13
|
+
* @property {string} EQUAL - Equality operator ($eq)
|
|
14
|
+
* @property {string} DIFFERENT - Inequality operator ($ne)
|
|
15
|
+
* @property {string} BIGGER - Greater than operator ($gt)
|
|
16
|
+
* @property {string} BIGGER_EQ - Greater than or equal operator ($gte)
|
|
17
|
+
* @property {string} SMALLER - Less than operator ($lt)
|
|
18
|
+
* @property {string} SMALLER_EQ - Less than or equal operator ($lte)
|
|
19
|
+
* @property {string} NOT - Negation operator ($not)
|
|
20
|
+
* @property {string} IN - In array operator ($in)
|
|
21
|
+
* @property {string} REGEXP - Regular expression operator ($regex)
|
|
22
|
+
* @const CouchDBOperator
|
|
23
|
+
* @type {CouchDBOperatorType}
|
|
24
|
+
* @memberOf module:for-couchdb
|
|
25
|
+
*/
|
|
3
26
|
export declare const CouchDBOperator: Record<string, MangoOperator>;
|
|
27
|
+
/**
|
|
28
|
+
* @description Mapping of logical operator names to CouchDB Mango query operators
|
|
29
|
+
* @summary Constants for CouchDB logical operators used in Mango queries
|
|
30
|
+
* @typedef {Object} CouchDBGroupOperatorType
|
|
31
|
+
* @property {string} AND - Logical AND operator ($and)
|
|
32
|
+
* @property {string} OR - Logical OR operator ($or)
|
|
33
|
+
* @const CouchDBGroupOperator
|
|
34
|
+
* @type {CouchDBGroupOperatorType}
|
|
35
|
+
* @memberOf module:for-couchdb
|
|
36
|
+
*/
|
|
4
37
|
export declare const CouchDBGroupOperator: Record<string, MangoOperator>;
|
|
38
|
+
/**
|
|
39
|
+
* @description Special constant values used in CouchDB queries
|
|
40
|
+
* @summary String constants representing special values in CouchDB
|
|
41
|
+
* @typedef {Object} CouchDBConstType
|
|
42
|
+
* @property {string} NULL - String representation of null value
|
|
43
|
+
* @const CouchDBConst
|
|
44
|
+
* @type {CouchDBConstType}
|
|
45
|
+
* @memberOf module:for-couchdb
|
|
46
|
+
*/
|
|
5
47
|
export declare const CouchDBConst: Record<string, string>;
|
package/lib/query/translate.cjs
CHANGED
|
@@ -3,6 +3,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.translateOperators = translateOperators;
|
|
4
4
|
const constants_1 = require("./constants.cjs");
|
|
5
5
|
const core_1 = require("@decaf-ts/core");
|
|
6
|
+
/**
|
|
7
|
+
* @description Translates core operators to CouchDB Mango operators
|
|
8
|
+
* @summary Converts Decaf.ts core operators to their equivalent CouchDB Mango query operators
|
|
9
|
+
* @param {GroupOperator | Operator} operator - The core operator to translate
|
|
10
|
+
* @return {MangoOperator} The equivalent CouchDB Mango operator
|
|
11
|
+
* @throws {QueryError} If no translation exists for the given operator
|
|
12
|
+
* @function translateOperators
|
|
13
|
+
* @memberOf module:for-couchdb
|
|
14
|
+
* @mermaid
|
|
15
|
+
* sequenceDiagram
|
|
16
|
+
* participant Caller
|
|
17
|
+
* participant translateOperators
|
|
18
|
+
* participant CouchDBOperator
|
|
19
|
+
* participant CouchDBGroupOperator
|
|
20
|
+
*
|
|
21
|
+
* Caller->>translateOperators: operator
|
|
22
|
+
*
|
|
23
|
+
* translateOperators->>CouchDBOperator: Check for match
|
|
24
|
+
* alt Found in CouchDBOperator
|
|
25
|
+
* CouchDBOperator-->>translateOperators: Return matching operator
|
|
26
|
+
* translateOperators-->>Caller: Return MangoOperator
|
|
27
|
+
* else Not found
|
|
28
|
+
* translateOperators->>CouchDBGroupOperator: Check for match
|
|
29
|
+
* alt Found in CouchDBGroupOperator
|
|
30
|
+
* CouchDBGroupOperator-->>translateOperators: Return matching operator
|
|
31
|
+
* translateOperators-->>Caller: Return MangoOperator
|
|
32
|
+
* else Not found
|
|
33
|
+
* translateOperators-->>Caller: Throw QueryError
|
|
34
|
+
* end
|
|
35
|
+
* end
|
|
36
|
+
*/
|
|
6
37
|
function translateOperators(operator) {
|
|
7
38
|
for (const operators of [constants_1.CouchDBOperator, constants_1.CouchDBGroupOperator]) {
|
|
8
39
|
const el = Object.keys(operators).find((k) => k === operator);
|
|
@@ -11,4 +42,4 @@ function translateOperators(operator) {
|
|
|
11
42
|
}
|
|
12
43
|
throw new core_1.QueryError(`Could not find adapter translation for operator ${operator}`);
|
|
13
44
|
}
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3F1ZXJ5L3RyYW5zbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW9DQSxnREFVQztBQTdDRCwrQ0FBb0U7QUFDcEUseUNBQTRDO0FBRzVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxTQUFnQixrQkFBa0IsQ0FDaEMsUUFBa0M7SUFFbEMsS0FBSyxNQUFNLFNBQVMsSUFBSSxDQUFDLDJCQUFlLEVBQUUsZ0NBQW9CLENBQUMsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDOUQsSUFBSSxFQUFFO1lBQUUsT0FBTyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELE1BQU0sSUFBSSxpQkFBVSxDQUNsQixtREFBbUQsUUFBUSxFQUFFLENBQzlELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR3JvdXBPcGVyYXRvciwgT3BlcmF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvdWNoREJHcm91cE9wZXJhdG9yLCBDb3VjaERCT3BlcmF0b3IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1hbmdvT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRlcyBjb3JlIG9wZXJhdG9ycyB0byBDb3VjaERCIE1hbmdvIG9wZXJhdG9yc1xuICogQHN1bW1hcnkgQ29udmVydHMgRGVjYWYudHMgY29yZSBvcGVyYXRvcnMgdG8gdGhlaXIgZXF1aXZhbGVudCBDb3VjaERCIE1hbmdvIHF1ZXJ5IG9wZXJhdG9yc1xuICogQHBhcmFtIHtHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3J9IG9wZXJhdG9yIC0gVGhlIGNvcmUgb3BlcmF0b3IgdG8gdHJhbnNsYXRlXG4gKiBAcmV0dXJuIHtNYW5nb09wZXJhdG9yfSBUaGUgZXF1aXZhbGVudCBDb3VjaERCIE1hbmdvIG9wZXJhdG9yXG4gKiBAdGhyb3dzIHtRdWVyeUVycm9yfSBJZiBubyB0cmFuc2xhdGlvbiBleGlzdHMgZm9yIHRoZSBnaXZlbiBvcGVyYXRvclxuICogQGZ1bmN0aW9uIHRyYW5zbGF0ZU9wZXJhdG9yc1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItY291Y2hkYlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgdHJhbnNsYXRlT3BlcmF0b3JzXG4gKiAgIHBhcnRpY2lwYW50IENvdWNoREJPcGVyYXRvclxuICogICBwYXJ0aWNpcGFudCBDb3VjaERCR3JvdXBPcGVyYXRvclxuICogICBcbiAqICAgQ2FsbGVyLT4+dHJhbnNsYXRlT3BlcmF0b3JzOiBvcGVyYXRvclxuICogICBcbiAqICAgdHJhbnNsYXRlT3BlcmF0b3JzLT4+Q291Y2hEQk9wZXJhdG9yOiBDaGVjayBmb3IgbWF0Y2hcbiAqICAgYWx0IEZvdW5kIGluIENvdWNoREJPcGVyYXRvclxuICogICAgIENvdWNoREJPcGVyYXRvci0tPj50cmFuc2xhdGVPcGVyYXRvcnM6IFJldHVybiBtYXRjaGluZyBvcGVyYXRvclxuICogICAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0tPj5DYWxsZXI6IFJldHVybiBNYW5nb09wZXJhdG9yXG4gKiAgIGVsc2UgTm90IGZvdW5kXG4gKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLT4+Q291Y2hEQkdyb3VwT3BlcmF0b3I6IENoZWNrIGZvciBtYXRjaFxuICogICAgIGFsdCBGb3VuZCBpbiBDb3VjaERCR3JvdXBPcGVyYXRvclxuICogICAgICAgQ291Y2hEQkdyb3VwT3BlcmF0b3ItLT4+dHJhbnNsYXRlT3BlcmF0b3JzOiBSZXR1cm4gbWF0Y2hpbmcgb3BlcmF0b3JcbiAqICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0tPj5DYWxsZXI6IFJldHVybiBNYW5nb09wZXJhdG9yXG4gKiAgICAgZWxzZSBOb3QgZm91bmRcbiAqICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0tPj5DYWxsZXI6IFRocm93IFF1ZXJ5RXJyb3JcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVPcGVyYXRvcnMoXG4gIG9wZXJhdG9yOiBHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3Jcbik6IE1hbmdvT3BlcmF0b3Ige1xuICBmb3IgKGNvbnN0IG9wZXJhdG9ycyBvZiBbQ291Y2hEQk9wZXJhdG9yLCBDb3VjaERCR3JvdXBPcGVyYXRvcl0pIHtcbiAgICBjb25zdCBlbCA9IE9iamVjdC5rZXlzKG9wZXJhdG9ycykuZmluZCgoaykgPT4gayA9PT0gb3BlcmF0b3IpO1xuICAgIGlmIChlbCkgcmV0dXJuIG9wZXJhdG9yc1tlbF07XG4gIH1cbiAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgYENvdWxkIG5vdCBmaW5kIGFkYXB0ZXIgdHJhbnNsYXRpb24gZm9yIG9wZXJhdG9yICR7b3BlcmF0b3J9YFxuICApO1xufVxuIl19
|
package/lib/query/translate.d.ts
CHANGED
|
@@ -1,3 +1,34 @@
|
|
|
1
1
|
import { GroupOperator, Operator } from "@decaf-ts/core";
|
|
2
2
|
import { MangoOperator } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* @description Translates core operators to CouchDB Mango operators
|
|
5
|
+
* @summary Converts Decaf.ts core operators to their equivalent CouchDB Mango query operators
|
|
6
|
+
* @param {GroupOperator | Operator} operator - The core operator to translate
|
|
7
|
+
* @return {MangoOperator} The equivalent CouchDB Mango operator
|
|
8
|
+
* @throws {QueryError} If no translation exists for the given operator
|
|
9
|
+
* @function translateOperators
|
|
10
|
+
* @memberOf module:for-couchdb
|
|
11
|
+
* @mermaid
|
|
12
|
+
* sequenceDiagram
|
|
13
|
+
* participant Caller
|
|
14
|
+
* participant translateOperators
|
|
15
|
+
* participant CouchDBOperator
|
|
16
|
+
* participant CouchDBGroupOperator
|
|
17
|
+
*
|
|
18
|
+
* Caller->>translateOperators: operator
|
|
19
|
+
*
|
|
20
|
+
* translateOperators->>CouchDBOperator: Check for match
|
|
21
|
+
* alt Found in CouchDBOperator
|
|
22
|
+
* CouchDBOperator-->>translateOperators: Return matching operator
|
|
23
|
+
* translateOperators-->>Caller: Return MangoOperator
|
|
24
|
+
* else Not found
|
|
25
|
+
* translateOperators->>CouchDBGroupOperator: Check for match
|
|
26
|
+
* alt Found in CouchDBGroupOperator
|
|
27
|
+
* CouchDBGroupOperator-->>translateOperators: Return matching operator
|
|
28
|
+
* translateOperators-->>Caller: Return MangoOperator
|
|
29
|
+
* else Not found
|
|
30
|
+
* translateOperators-->>Caller: Throw QueryError
|
|
31
|
+
* end
|
|
32
|
+
* end
|
|
33
|
+
*/
|
|
3
34
|
export declare function translateOperators(operator: GroupOperator | Operator): MangoOperator;
|