@decaf-ts/for-couchdb 0.3.0 → 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 +907 -326
- package/dist/for-couchdb.esm.cjs +910 -329
- package/lib/adapter.cjs +249 -41
- package/lib/adapter.d.ts +243 -17
- package/lib/constants.cjs +30 -2
- package/lib/constants.d.ts +28 -0
- package/lib/errors.cjs +19 -2
- package/lib/errors.d.ts +17 -0
- package/lib/esm/adapter.d.ts +243 -17
- package/lib/esm/adapter.js +249 -41
- package/lib/esm/constants.d.ts +28 -0
- package/lib/esm/constants.js +30 -2
- package/lib/esm/errors.d.ts +17 -0
- package/lib/esm/errors.js +19 -2
- 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 +15 -9
- package/lib/esm/model/CouchDBSequence.js +12 -1
- package/lib/esm/query/Paginator.d.ts +117 -4
- package/lib/esm/query/Paginator.js +128 -23
- package/lib/esm/query/Statement.d.ts +141 -8
- package/lib/esm/query/Statement.js +256 -28
- package/lib/esm/query/constants.d.ts +43 -0
- package/lib/esm/query/constants.js +44 -1
- package/lib/esm/query/index.d.ts +4 -1
- package/lib/esm/query/index.js +5 -2
- 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 +5 -9
- 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 +15 -9
- package/lib/query/Paginator.cjs +126 -21
- package/lib/query/Paginator.d.ts +117 -4
- package/lib/query/Statement.cjs +255 -27
- package/lib/query/Statement.d.ts +141 -8
- package/lib/query/constants.cjs +45 -2
- package/lib/query/constants.d.ts +43 -0
- package/lib/query/index.cjs +5 -2
- package/lib/query/index.d.ts +4 -1
- package/lib/query/translate.cjs +32 -1
- package/lib/query/translate.d.ts +31 -0
- package/lib/sequences/Sequence.cjs +5 -9
- 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/esm/query/FromClause.d.ts +0 -7
- package/lib/esm/query/FromClause.js +0 -20
- package/lib/esm/query/InsertClause.d.ts +0 -7
- package/lib/esm/query/InsertClause.js +0 -13
- package/lib/esm/query/SelectClause.d.ts +0 -7
- package/lib/esm/query/SelectClause.js +0 -16
- package/lib/esm/query/ValuesClause.d.ts +0 -7
- package/lib/esm/query/ValuesClause.js +0 -12
- package/lib/esm/query/WhereClause.d.ts +0 -7
- package/lib/esm/query/WhereClause.js +0 -57
- package/lib/esm/query/factory.d.ts +0 -25
- package/lib/esm/query/factory.js +0 -117
- package/lib/esm/sequences/utils.d.ts +0 -1
- package/lib/esm/sequences/utils.js +0 -16
- package/lib/query/FromClause.cjs +0 -24
- package/lib/query/FromClause.d.ts +0 -7
- package/lib/query/InsertClause.cjs +0 -17
- package/lib/query/InsertClause.d.ts +0 -7
- package/lib/query/SelectClause.cjs +0 -20
- package/lib/query/SelectClause.d.ts +0 -7
- package/lib/query/ValuesClause.cjs +0 -16
- package/lib/query/ValuesClause.d.ts +0 -7
- package/lib/query/WhereClause.cjs +0 -61
- package/lib/query/WhereClause.d.ts +0 -7
- package/lib/query/factory.cjs +0 -121
- package/lib/query/factory.d.ts +0 -25
- package/lib/sequences/utils.cjs +0 -19
- package/lib/sequences/utils.d.ts +0 -1
|
@@ -1,16 +1,64 @@
|
|
|
1
|
-
import { Paginator, PagingError, } from "@decaf-ts/core";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { Paginator, PagingError, Sequence } from "@decaf-ts/core";
|
|
2
|
+
import { findPrimaryKey, InternalError } from "@decaf-ts/db-decorators";
|
|
3
|
+
import { CouchDBKeys } from "../constants";
|
|
4
|
+
/**
|
|
5
|
+
* @description Paginator for CouchDB query results
|
|
6
|
+
* @summary Implements pagination for CouchDB queries using bookmarks for efficient navigation through result sets
|
|
7
|
+
* @template M - The model type that extends Model
|
|
8
|
+
* @template R - The result type
|
|
9
|
+
* @param {CouchDBAdapter<any, any, any>} adapter - The CouchDB adapter
|
|
10
|
+
* @param {MangoQuery} query - The Mango query to paginate
|
|
11
|
+
* @param {number} size - The page size
|
|
12
|
+
* @param {Constructor<M>} clazz - The model constructor
|
|
13
|
+
* @class CouchDBPaginator
|
|
14
|
+
* @example
|
|
15
|
+
* // Example of using CouchDBPaginator
|
|
16
|
+
* const adapter = new MyCouchDBAdapter(scope);
|
|
17
|
+
* const query = { selector: { type: "user" } };
|
|
18
|
+
* const paginator = new CouchDBPaginator(adapter, query, 10, User);
|
|
19
|
+
*
|
|
20
|
+
* // Get the first page
|
|
21
|
+
* const page1 = await paginator.page(1);
|
|
22
|
+
*
|
|
23
|
+
* // Get the next page
|
|
24
|
+
* const page2 = await paginator.page(2);
|
|
25
|
+
*/
|
|
4
26
|
export class CouchDBPaginator extends Paginator {
|
|
27
|
+
/**
|
|
28
|
+
* @description Gets the total number of pages
|
|
29
|
+
* @summary Not supported in CouchDB - throws an error when accessed
|
|
30
|
+
* @return {number} Never returns as it throws an error
|
|
31
|
+
* @throws {InternalError} Always throws as this functionality is not available in CouchDB
|
|
32
|
+
*/
|
|
5
33
|
get total() {
|
|
6
34
|
throw new InternalError(`The total pages api is not available for couchdb`);
|
|
7
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* @description Gets the total record count
|
|
38
|
+
* @summary Not supported in CouchDB - throws an error when accessed
|
|
39
|
+
* @return {number} Never returns as it throws an error
|
|
40
|
+
* @throws {InternalError} Always throws as this functionality is not available in CouchDB
|
|
41
|
+
*/
|
|
8
42
|
get count() {
|
|
9
43
|
throw new InternalError(`The record count api is not available for couchdb`);
|
|
10
44
|
}
|
|
11
|
-
|
|
12
|
-
|
|
45
|
+
/**
|
|
46
|
+
* @description Creates a new CouchDBPaginator instance
|
|
47
|
+
* @summary Initializes a paginator for CouchDB query results
|
|
48
|
+
* @param {CouchDBAdapter<any, any, any>} adapter - The CouchDB adapter
|
|
49
|
+
* @param {MangoQuery} query - The Mango query to paginate
|
|
50
|
+
* @param {number} size - The page size
|
|
51
|
+
* @param {Constructor<M>} clazz - The model constructor
|
|
52
|
+
*/
|
|
53
|
+
constructor(adapter, query, size, clazz) {
|
|
54
|
+
super(adapter, query, size, clazz);
|
|
13
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* @description Prepares a query for pagination
|
|
58
|
+
* @summary Modifies the raw query to include pagination parameters
|
|
59
|
+
* @param {MangoQuery} rawStatement - The original Mango query
|
|
60
|
+
* @return {MangoQuery} The prepared query with pagination parameters
|
|
61
|
+
*/
|
|
14
62
|
prepare(rawStatement) {
|
|
15
63
|
const query = Object.assign({}, rawStatement);
|
|
16
64
|
if (query.limit)
|
|
@@ -18,43 +66,100 @@ export class CouchDBPaginator extends Paginator {
|
|
|
18
66
|
query.limit = this.size;
|
|
19
67
|
return query;
|
|
20
68
|
}
|
|
21
|
-
|
|
69
|
+
/**
|
|
70
|
+
* @description Retrieves a specific page of results
|
|
71
|
+
* @summary Executes the query with pagination and processes the results
|
|
72
|
+
* @param {number} [page=1] - The page number to retrieve
|
|
73
|
+
* @return {Promise<R[]>} A promise that resolves to an array of results
|
|
74
|
+
* @throws {PagingError} If trying to access a page other than the first without a bookmark, or if no class is defined
|
|
75
|
+
* @mermaid
|
|
76
|
+
* sequenceDiagram
|
|
77
|
+
* participant Client
|
|
78
|
+
* participant CouchDBPaginator
|
|
79
|
+
* participant Adapter
|
|
80
|
+
* participant CouchDB
|
|
81
|
+
*
|
|
82
|
+
* Client->>CouchDBPaginator: page(pageNumber)
|
|
83
|
+
* Note over CouchDBPaginator: Clone statement
|
|
84
|
+
* CouchDBPaginator->>CouchDBPaginator: validatePage(page)
|
|
85
|
+
*
|
|
86
|
+
* alt page !== 1
|
|
87
|
+
* CouchDBPaginator->>CouchDBPaginator: Check bookmark
|
|
88
|
+
* alt No bookmark
|
|
89
|
+
* CouchDBPaginator-->>Client: Throw PagingError
|
|
90
|
+
* else Has bookmark
|
|
91
|
+
* CouchDBPaginator->>CouchDBPaginator: Add bookmark to statement
|
|
92
|
+
* end
|
|
93
|
+
* end
|
|
94
|
+
*
|
|
95
|
+
* CouchDBPaginator->>Adapter: raw(statement, false)
|
|
96
|
+
* Adapter->>CouchDB: Execute query
|
|
97
|
+
* CouchDB-->>Adapter: Return results
|
|
98
|
+
* Adapter-->>CouchDBPaginator: Return MangoResponse
|
|
99
|
+
*
|
|
100
|
+
* Note over CouchDBPaginator: Process results
|
|
101
|
+
*
|
|
102
|
+
* alt Has warning
|
|
103
|
+
* CouchDBPaginator->>CouchDBPaginator: Log warning
|
|
104
|
+
* end
|
|
105
|
+
*
|
|
106
|
+
* CouchDBPaginator->>CouchDBPaginator: Check for clazz
|
|
107
|
+
*
|
|
108
|
+
* alt No clazz
|
|
109
|
+
* CouchDBPaginator-->>Client: Throw PagingError
|
|
110
|
+
* else Has clazz
|
|
111
|
+
* CouchDBPaginator->>CouchDBPaginator: Find primary key
|
|
112
|
+
*
|
|
113
|
+
* alt Has fields in statement
|
|
114
|
+
* CouchDBPaginator->>CouchDBPaginator: Use docs directly
|
|
115
|
+
* else No fields
|
|
116
|
+
* CouchDBPaginator->>CouchDBPaginator: Process each document
|
|
117
|
+
* loop For each document
|
|
118
|
+
* CouchDBPaginator->>CouchDBPaginator: Extract original ID
|
|
119
|
+
* CouchDBPaginator->>Adapter: revert(doc, clazz, pkDef.id, parsedId)
|
|
120
|
+
* end
|
|
121
|
+
* end
|
|
122
|
+
*
|
|
123
|
+
* CouchDBPaginator->>CouchDBPaginator: Store bookmark
|
|
124
|
+
* CouchDBPaginator->>CouchDBPaginator: Update currentPage
|
|
125
|
+
* CouchDBPaginator-->>Client: Return results
|
|
126
|
+
* end
|
|
127
|
+
*/
|
|
128
|
+
async page(page = 1) {
|
|
22
129
|
const statement = Object.assign({}, this.statement);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
130
|
+
if (!this._recordCount || !this._totalPages) {
|
|
131
|
+
this._totalPages = this._recordCount = 0;
|
|
132
|
+
const results = await this.adapter.raw({ ...statement, limit: undefined }) || [];
|
|
133
|
+
this._recordCount = results.length;
|
|
134
|
+
if (this._recordCount > 0) {
|
|
135
|
+
const size = statement?.limit || this.size;
|
|
136
|
+
this._totalPages = Math.ceil(this._recordCount / size);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
31
139
|
this.validatePage(page);
|
|
32
140
|
if (page !== 1) {
|
|
33
141
|
if (!this.bookMark)
|
|
34
142
|
throw new PagingError("No bookmark. Did you start in the first page?");
|
|
35
143
|
statement["bookmark"] = this.bookMark;
|
|
36
144
|
}
|
|
37
|
-
const rawResult = await this.adapter.raw(statement, false
|
|
145
|
+
const rawResult = await this.adapter.raw(statement, false);
|
|
38
146
|
const { docs, bookmark, warning } = rawResult;
|
|
39
147
|
if (warning)
|
|
40
148
|
console.warn(warning);
|
|
41
|
-
if (!
|
|
149
|
+
if (!this.clazz)
|
|
42
150
|
throw new PagingError("No statement target defined");
|
|
43
|
-
const pkDef = findPrimaryKey(new
|
|
151
|
+
const pkDef = findPrimaryKey(new this.clazz());
|
|
44
152
|
const results = statement.fields && statement.fields.length
|
|
45
153
|
? docs // has fields means its not full model
|
|
46
154
|
: docs.map((d) => {
|
|
47
155
|
//no fields means we need to revert to saving process
|
|
48
|
-
|
|
49
|
-
throw new PagingError("No statement target defined");
|
|
50
|
-
const pk = pkDef.id;
|
|
51
|
-
const originalId = d._id.split(DefaultSeparator);
|
|
156
|
+
const originalId = d._id.split(CouchDBKeys.SEPARATOR);
|
|
52
157
|
originalId.splice(0, 1); // remove the table name
|
|
53
|
-
return this.adapter.revert(d,
|
|
158
|
+
return this.adapter.revert(d, this.clazz, pkDef.id, Sequence.parseValue(pkDef.props.type, originalId.join(CouchDBKeys.SEPARATOR)));
|
|
54
159
|
});
|
|
55
160
|
this.bookMark = bookmark;
|
|
56
161
|
this._currentPage = page;
|
|
57
162
|
return results;
|
|
58
163
|
}
|
|
59
164
|
}
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFnaW5hdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3F1ZXJ5L1BhZ2luYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFdBQVcsR0FHWixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLGFBQWEsR0FDZCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3hELE1BQU0sT0FBTyxnQkFBb0IsU0FBUSxTQUF3QjtJQUcvRCxJQUFJLEtBQUs7UUFDUCxNQUFNLElBQUksYUFBYSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE1BQU0sSUFBSSxhQUFhLENBQ3JCLG1EQUFtRCxDQUNwRCxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQ0UsU0FBZ0MsRUFDaEMsSUFBWSxFQUNaLFlBQXdCO1FBRXhCLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFUyxPQUFPLENBQUMsWUFBd0I7UUFDeEMsTUFBTSxLQUFLLEdBQWUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUQsSUFBSSxLQUFLLENBQUMsS0FBSztZQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUUxQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFeEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFlLENBQUMsRUFBRSxHQUFHLElBQVc7UUFDekMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsaURBQWlEO1FBQ2pELDhDQUE4QztRQUM5QyxrQkFBa0I7UUFDbEIsa0JBQWtCO1FBQ2xCLHVCQUF1QjtRQUN2Qiw2QkFBNkI7UUFDN0IsSUFBSTtRQUNKLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEIsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7Z0JBQ2hCLE1BQU0sSUFBSSxXQUFXLENBQUMsK0NBQStDLENBQUMsQ0FBQztZQUN6RSxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQXVCLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQzFELFNBQVMsRUFDVCxLQUFLLEVBQ0wsR0FBRyxJQUFJLENBQ1IsQ0FBQztRQUVGLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUM5QyxJQUFJLE9BQU87WUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxJQUFJLFdBQVcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUd4QyxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQ1gsU0FBUyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU07WUFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQ0FBc0M7WUFDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDbEIscURBQXFEO2dCQUNyRCxJQUFJLENBQUMsTUFBTTtvQkFBRSxNQUFNLElBQUksV0FBVyxDQUFDLDZCQUE2QixDQUFDLENBQUM7Z0JBQ2xFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ2pELFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsd0JBQXdCO2dCQUNqRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUN4QixDQUFDLEVBQ0QsTUFBTSxFQUNOLEVBQUUsRUFDRixrQkFBa0IsQ0FDaEIsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQ2hCLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FDbEMsQ0FDRixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDVCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQYWdpbmF0b3IsXG4gIFBhZ2luZ0Vycm9yLFxuICBTZXF1ZW5jZU9wdGlvbnMsXG4gIFN0YXRlbWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBEZWZhdWx0U2VwYXJhdG9yLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBwYXJzZVNlcXVlbmNlVmFsdWUgfSBmcm9tIFwiLi4vc2VxdWVuY2VzL3V0aWxzXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5LCBNYW5nb1Jlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBDb3VjaERCUGFnaW5hdG9yPFY+IGV4dGVuZHMgUGFnaW5hdG9yPFYsIE1hbmdvUXVlcnk+IHtcbiAgcHJpdmF0ZSBib29rTWFyaz86IHN0cmluZztcblxuICBnZXQgdG90YWwoKTogbnVtYmVyIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVGhlIHRvdGFsIHBhZ2VzIGFwaSBpcyBub3QgYXZhaWxhYmxlIGZvciBjb3VjaGRiYCk7XG4gIH1cblxuICBnZXQgY291bnQoKTogbnVtYmVyIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBUaGUgcmVjb3JkIGNvdW50IGFwaSBpcyBub3QgYXZhaWxhYmxlIGZvciBjb3VjaGRiYFxuICAgICk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdGF0ZW1lbnQ6IFN0YXRlbWVudDxNYW5nb1F1ZXJ5PixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgcmF3U3RhdGVtZW50OiBNYW5nb1F1ZXJ5XG4gICkge1xuICAgIHN1cGVyKHN0YXRlbWVudCwgc2l6ZSwgcmF3U3RhdGVtZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogTWFuZ29RdWVyeSk6IE1hbmdvUXVlcnkge1xuICAgIGNvbnN0IHF1ZXJ5OiBNYW5nb1F1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgcmF3U3RhdGVtZW50KTtcbiAgICBpZiAocXVlcnkubGltaXQpIHRoaXMubGltaXQgPSBxdWVyeS5saW1pdDtcblxuICAgIHF1ZXJ5LmxpbWl0ID0gdGhpcy5zaXplO1xuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgYXN5bmMgcGFnZShwYWdlOiBudW1iZXIgPSAxLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VltdPiB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZW1lbnQpO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuc3RhdC5nZXRUYXJnZXQoKTtcbiAgICAvLyBpZiAoIXRoaXMuX3JlY29yZENvdW50IHx8ICF0aGlzLl90b3RhbFBhZ2VzKSB7XG4gICAgLy8gICAvLyB0aGlzLl9yZWNvcmRDb3VudCA9IGF3YWl0IHRoaXMuYWRhcHRlclxuICAgIC8vICAgLy8gICAuUXVlcnkoKVxuICAgIC8vICAgLy8gICAuY291bnQoKVxuICAgIC8vICAgLy8gICAuZnJvbSh0YXJnZXQpXG4gICAgLy8gICAvLyAgIC5leGVjdXRlPG51bWJlcj4oKTtcbiAgICAvLyB9XG4gICAgdGhpcy52YWxpZGF0ZVBhZ2UocGFnZSk7XG5cbiAgICBpZiAocGFnZSAhPT0gMSkge1xuICAgICAgaWYgKCF0aGlzLmJvb2tNYXJrKVxuICAgICAgICB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXCJObyBib29rbWFyay4gRGlkIHlvdSBzdGFydCBpbiB0aGUgZmlyc3QgcGFnZT9cIik7XG4gICAgICBzdGF0ZW1lbnRbXCJib29rbWFya1wiXSA9IHRoaXMuYm9va01hcms7XG4gICAgfVxuICAgIGNvbnN0IHJhd1Jlc3VsdDogTWFuZ29SZXNwb25zZTxhbnk+ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyhcbiAgICAgIHN0YXRlbWVudCxcbiAgICAgIGZhbHNlLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG5cbiAgICBjb25zdCB7IGRvY3MsIGJvb2ttYXJrLCB3YXJuaW5nIH0gPSByYXdSZXN1bHQ7XG4gICAgaWYgKHdhcm5pbmcpIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICBpZiAoIXRhcmdldCkgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFwiTm8gc3RhdGVtZW50IHRhcmdldCBkZWZpbmVkXCIpO1xuICAgIGNvbnN0IHBrRGVmID0gZmluZFByaW1hcnlLZXkobmV3IHRhcmdldCgpKSBhcyB7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgcHJvcHM6IFNlcXVlbmNlT3B0aW9ucztcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdHMgPVxuICAgICAgc3RhdGVtZW50LmZpZWxkcyAmJiBzdGF0ZW1lbnQuZmllbGRzLmxlbmd0aFxuICAgICAgICA/IGRvY3MgLy8gaGFzIGZpZWxkcyBtZWFucyBpdHMgbm90IGZ1bGwgbW9kZWxcbiAgICAgICAgOiBkb2NzLm1hcCgoZDogYW55KSA9PiB7XG4gICAgICAgICAgICAvL25vIGZpZWxkcyBtZWFucyB3ZSBuZWVkIHRvIHJldmVydCB0byBzYXZpbmcgcHJvY2Vzc1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHRocm93IG5ldyBQYWdpbmdFcnJvcihcIk5vIHN0YXRlbWVudCB0YXJnZXQgZGVmaW5lZFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHBrID0gcGtEZWYuaWQ7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbElkID0gZC5faWQuc3BsaXQoRGVmYXVsdFNlcGFyYXRvcik7XG4gICAgICAgICAgICBvcmlnaW5hbElkLnNwbGljZSgwLCAxKTsgLy8gcmVtb3ZlIHRoZSB0YWJsZSBuYW1lXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChcbiAgICAgICAgICAgICAgZCxcbiAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICBwayxcbiAgICAgICAgICAgICAgcGFyc2VTZXF1ZW5jZVZhbHVlKFxuICAgICAgICAgICAgICAgIHBrRGVmLnByb3BzLnR5cGUsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxJZC5qb2luKERlZmF1bHRTZXBhcmF0b3IpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgdGhpcy5ib29rTWFyayA9IGJvb2ttYXJrO1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gcGFnZTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIl19
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFnaW5hdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3F1ZXJ5L1BhZ2luYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXhFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sT0FBTyxnQkFBcUMsU0FBUSxTQUl6RDtJQU9DOzs7OztPQUtHO0lBQ0gsSUFBYSxLQUFLO1FBQ2hCLE1BQU0sSUFBSSxhQUFhLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFhLEtBQUs7UUFDaEIsTUFBTSxJQUFJLGFBQWEsQ0FDckIsbURBQW1ELENBQ3BELENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFlBQ0UsT0FBc0MsRUFDdEMsS0FBaUIsRUFDakIsSUFBWSxFQUNaLEtBQXFCO1FBRXJCLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxPQUFPLENBQUMsWUFBd0I7UUFDeEMsTUFBTSxLQUFLLEdBQWUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUQsSUFBSSxLQUFLLENBQUMsS0FBSztZQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUUxQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFeEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EwREc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWUsQ0FBQztRQUN6QixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztZQUN6QyxNQUFNLE9BQU8sR0FBUSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3RGLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUNuQyxJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sSUFBSSxHQUFHLFNBQVMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDM0QsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhCLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO2dCQUNoQixNQUFNLElBQUksV0FBVyxDQUFDLCtDQUErQyxDQUFDLENBQUM7WUFDekUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDeEMsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUF1QixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUMxRCxTQUFTLEVBQ1QsS0FBSyxDQUNOLENBQUM7UUFFRixNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUM7UUFDOUMsSUFBSSxPQUFPO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxNQUFNLElBQUksV0FBVyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDdEUsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDL0MsTUFBTSxPQUFPLEdBQ1gsU0FBUyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU07WUFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQ0FBc0M7WUFDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDbEIscURBQXFEO2dCQUNyRCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3RELFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsd0JBQXdCO2dCQUNqRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUN4QixDQUFDLEVBQ0QsSUFBSSxDQUFDLEtBQUssRUFDVixLQUFLLENBQUMsRUFBRSxFQUNSLFFBQVEsQ0FBQyxVQUFVLENBQ2pCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUNoQixVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FDdkMsQ0FDRixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDVCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQYWdpbmF0b3IsIFBhZ2luZ0Vycm9yLCBTZXF1ZW5jZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXksIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1hbmdvUXVlcnksIE1hbmdvUmVzcG9uc2UgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvdWNoREJBZGFwdGVyIH0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB7IENvdWNoREJLZXlzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYWdpbmF0b3IgZm9yIENvdWNoREIgcXVlcnkgcmVzdWx0c1xuICogQHN1bW1hcnkgSW1wbGVtZW50cyBwYWdpbmF0aW9uIGZvciBDb3VjaERCIHF1ZXJpZXMgdXNpbmcgYm9va21hcmtzIGZvciBlZmZpY2llbnQgbmF2aWdhdGlvbiB0aHJvdWdoIHJlc3VsdCBzZXRzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVzdWx0IHR5cGVcbiAqIEBwYXJhbSB7Q291Y2hEQkFkYXB0ZXI8YW55LCBhbnksIGFueT59IGFkYXB0ZXIgLSBUaGUgQ291Y2hEQiBhZGFwdGVyXG4gKiBAcGFyYW0ge01hbmdvUXVlcnl9IHF1ZXJ5IC0gVGhlIE1hbmdvIHF1ZXJ5IHRvIHBhZ2luYXRlXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBwYWdlIHNpemVcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gKiBAY2xhc3MgQ291Y2hEQlBhZ2luYXRvclxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgb2YgdXNpbmcgQ291Y2hEQlBhZ2luYXRvclxuICogY29uc3QgYWRhcHRlciA9IG5ldyBNeUNvdWNoREJBZGFwdGVyKHNjb3BlKTtcbiAqIGNvbnN0IHF1ZXJ5ID0geyBzZWxlY3RvcjogeyB0eXBlOiBcInVzZXJcIiB9IH07XG4gKiBjb25zdCBwYWdpbmF0b3IgPSBuZXcgQ291Y2hEQlBhZ2luYXRvcihhZGFwdGVyLCBxdWVyeSwgMTAsIFVzZXIpO1xuICpcbiAqIC8vIEdldCB0aGUgZmlyc3QgcGFnZVxuICogY29uc3QgcGFnZTEgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgxKTtcbiAqXG4gKiAvLyBHZXQgdGhlIG5leHQgcGFnZVxuICogY29uc3QgcGFnZTIgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgyKTtcbiAqL1xuZXhwb3J0IGNsYXNzIENvdWNoREJQYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFBhZ2luYXRvcjxcbiAgTSxcbiAgUixcbiAgTWFuZ29RdWVyeVxuPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQm9va21hcmsgZm9yIENvdWNoREIgcGFnaW5hdGlvblxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGJvb2ttYXJrIHJldHVybmVkIGJ5IENvdWNoREIgZm9yIGNvbnRpbnVpbmcgcGFnaW5hdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBib29rTWFyaz86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlc1xuICAgKiBAc3VtbWFyeSBOb3Qgc3VwcG9ydGVkIGluIENvdWNoREIgLSB0aHJvd3MgYW4gZXJyb3Igd2hlbiBhY2Nlc3NlZFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IE5ldmVyIHJldHVybnMgYXMgaXQgdGhyb3dzIGFuIGVycm9yXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IEFsd2F5cyB0aHJvd3MgYXMgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBhdmFpbGFibGUgaW4gQ291Y2hEQlxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IHRvdGFsKCk6IG51bWJlciB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFRoZSB0b3RhbCBwYWdlcyBhcGkgaXMgbm90IGF2YWlsYWJsZSBmb3IgY291Y2hkYmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0b3RhbCByZWNvcmQgY291bnRcbiAgICogQHN1bW1hcnkgTm90IHN1cHBvcnRlZCBpbiBDb3VjaERCIC0gdGhyb3dzIGFuIGVycm9yIHdoZW4gYWNjZXNzZWRcbiAgICogQHJldHVybiB7bnVtYmVyfSBOZXZlciByZXR1cm5zIGFzIGl0IHRocm93cyBhbiBlcnJvclxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBBbHdheXMgdGhyb3dzIGFzIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgYXZhaWxhYmxlIGluIENvdWNoREJcbiAgICovXG4gIG92ZXJyaWRlIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYFRoZSByZWNvcmQgY291bnQgYXBpIGlzIG5vdCBhdmFpbGFibGUgZm9yIGNvdWNoZGJgXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBDb3VjaERCUGFnaW5hdG9yIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgcGFnaW5hdG9yIGZvciBDb3VjaERCIHF1ZXJ5IHJlc3VsdHNcbiAgICogQHBhcmFtIHtDb3VjaERCQWRhcHRlcjxhbnksIGFueSwgYW55Pn0gYWRhcHRlciAtIFRoZSBDb3VjaERCIGFkYXB0ZXJcbiAgICogQHBhcmFtIHtNYW5nb1F1ZXJ5fSBxdWVyeSAtIFRoZSBNYW5nbyBxdWVyeSB0byBwYWdpbmF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBwYWdlIHNpemVcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI6IENvdWNoREJBZGFwdGVyPGFueSwgYW55LCBhbnk+LFxuICAgIHF1ZXJ5OiBNYW5nb1F1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBxdWVyeSBmb3IgcGFnaW5hdGlvblxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyB0aGUgcmF3IHF1ZXJ5IHRvIGluY2x1ZGUgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7TWFuZ29RdWVyeX0gcmF3U3RhdGVtZW50IC0gVGhlIG9yaWdpbmFsIE1hbmdvIHF1ZXJ5XG4gICAqIEByZXR1cm4ge01hbmdvUXVlcnl9IFRoZSBwcmVwYXJlZCBxdWVyeSB3aXRoIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBNYW5nb1F1ZXJ5KTogTWFuZ29RdWVyeSB7XG4gICAgY29uc3QgcXVlcnk6IE1hbmdvUXVlcnkgPSBPYmplY3QuYXNzaWduKHt9LCByYXdTdGF0ZW1lbnQpO1xuICAgIGlmIChxdWVyeS5saW1pdCkgdGhpcy5saW1pdCA9IHF1ZXJ5LmxpbWl0O1xuXG4gICAgcXVlcnkubGltaXQgPSB0aGlzLnNpemU7XG5cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHNwZWNpZmljIHBhZ2Ugb2YgcmVzdWx0c1xuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwYWdlPTFdIC0gVGhlIHBhZ2UgbnVtYmVyIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UltdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmVzdWx0c1xuICAgKiBAdGhyb3dzIHtQYWdpbmdFcnJvcn0gSWYgdHJ5aW5nIHRvIGFjY2VzcyBhIHBhZ2Ugb3RoZXIgdGhhbiB0aGUgZmlyc3Qgd2l0aG91dCBhIGJvb2ttYXJrLCBvciBpZiBubyBjbGFzcyBpcyBkZWZpbmVkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IENvdWNoREJQYWdpbmF0b3JcbiAgICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgQ291Y2hEQlxuICAgKlxuICAgKiAgIENsaWVudC0+PkNvdWNoREJQYWdpbmF0b3I6IHBhZ2UocGFnZU51bWJlcilcbiAgICogICBOb3RlIG92ZXIgQ291Y2hEQlBhZ2luYXRvcjogQ2xvbmUgc3RhdGVtZW50XG4gICAqICAgQ291Y2hEQlBhZ2luYXRvci0+PkNvdWNoREJQYWdpbmF0b3I6IHZhbGlkYXRlUGFnZShwYWdlKVxuICAgKlxuICAgKiAgIGFsdCBwYWdlICE9PSAxXG4gICAqICAgICBDb3VjaERCUGFnaW5hdG9yLT4+Q291Y2hEQlBhZ2luYXRvcjogQ2hlY2sgYm9va21hcmtcbiAgICogICAgIGFsdCBObyBib29rbWFya1xuICAgKiAgICAgICBDb3VjaERCUGFnaW5hdG9yLS0+PkNsaWVudDogVGhyb3cgUGFnaW5nRXJyb3JcbiAgICogICAgIGVsc2UgSGFzIGJvb2ttYXJrXG4gICAqICAgICAgIENvdWNoREJQYWdpbmF0b3ItPj5Db3VjaERCUGFnaW5hdG9yOiBBZGQgYm9va21hcmsgdG8gc3RhdGVtZW50XG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBDb3VjaERCUGFnaW5hdG9yLT4+QWRhcHRlcjogcmF3KHN0YXRlbWVudCwgZmFsc2UpXG4gICAqICAgQWRhcHRlci0+PkNvdWNoREI6IEV4ZWN1dGUgcXVlcnlcbiAgICogICBDb3VjaERCLS0+PkFkYXB0ZXI6IFJldHVybiByZXN1bHRzXG4gICAqICAgQWRhcHRlci0tPj5Db3VjaERCUGFnaW5hdG9yOiBSZXR1cm4gTWFuZ29SZXNwb25zZVxuICAgKlxuICAgKiAgIE5vdGUgb3ZlciBDb3VjaERCUGFnaW5hdG9yOiBQcm9jZXNzIHJlc3VsdHNcbiAgICpcbiAgICogICBhbHQgSGFzIHdhcm5pbmdcbiAgICogICAgIENvdWNoREJQYWdpbmF0b3ItPj5Db3VjaERCUGFnaW5hdG9yOiBMb2cgd2FybmluZ1xuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIENvdWNoREJQYWdpbmF0b3ItPj5Db3VjaERCUGFnaW5hdG9yOiBDaGVjayBmb3IgY2xhenpcbiAgICpcbiAgICogICBhbHQgTm8gY2xhenpcbiAgICogICAgIENvdWNoREJQYWdpbmF0b3ItLT4+Q2xpZW50OiBUaHJvdyBQYWdpbmdFcnJvclxuICAgKiAgIGVsc2UgSGFzIGNsYXp6XG4gICAqICAgICBDb3VjaERCUGFnaW5hdG9yLT4+Q291Y2hEQlBhZ2luYXRvcjogRmluZCBwcmltYXJ5IGtleVxuICAgKlxuICAgKiAgICAgYWx0IEhhcyBmaWVsZHMgaW4gc3RhdGVtZW50XG4gICAqICAgICAgIENvdWNoREJQYWdpbmF0b3ItPj5Db3VjaERCUGFnaW5hdG9yOiBVc2UgZG9jcyBkaXJlY3RseVxuICAgKiAgICAgZWxzZSBObyBmaWVsZHNcbiAgICogICAgICAgQ291Y2hEQlBhZ2luYXRvci0+PkNvdWNoREJQYWdpbmF0b3I6IFByb2Nlc3MgZWFjaCBkb2N1bWVudFxuICAgKiAgICAgICBsb29wIEZvciBlYWNoIGRvY3VtZW50XG4gICAqICAgICAgICAgQ291Y2hEQlBhZ2luYXRvci0+PkNvdWNoREJQYWdpbmF0b3I6IEV4dHJhY3Qgb3JpZ2luYWwgSURcbiAgICogICAgICAgICBDb3VjaERCUGFnaW5hdG9yLT4+QWRhcHRlcjogcmV2ZXJ0KGRvYywgY2xhenosIHBrRGVmLmlkLCBwYXJzZWRJZClcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbmRcbiAgICpcbiAgICogICAgIENvdWNoREJQYWdpbmF0b3ItPj5Db3VjaERCUGFnaW5hdG9yOiBTdG9yZSBib29rbWFya1xuICAgKiAgICAgQ291Y2hEQlBhZ2luYXRvci0+PkNvdWNoREJQYWdpbmF0b3I6IFVwZGF0ZSBjdXJyZW50UGFnZVxuICAgKiAgICAgQ291Y2hEQlBhZ2luYXRvci0tPj5DbGllbnQ6IFJldHVybiByZXN1bHRzXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyBwYWdlKHBhZ2U6IG51bWJlciA9IDEpOiBQcm9taXNlPFJbXT4ge1xuICAgIGNvbnN0IHN0YXRlbWVudCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGVtZW50KTtcblxuICAgaWYgKCF0aGlzLl9yZWNvcmRDb3VudCB8fCAhdGhpcy5fdG90YWxQYWdlcykge1xuICAgICAgICB0aGlzLl90b3RhbFBhZ2VzID0gdGhpcy5fcmVjb3JkQ291bnQgPSAwO1xuICAgICAgICBjb25zdCByZXN1bHRzOiBSW10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHsgLi4uc3RhdGVtZW50LCBsaW1pdDogdW5kZWZpbmVkIH0pIHx8IFtdO1xuICAgICAgICB0aGlzLl9yZWNvcmRDb3VudCA9IHJlc3VsdHMubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5fcmVjb3JkQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaXplID0gc3RhdGVtZW50Py5saW1pdCB8fCB0aGlzLnNpemU7XG4gICAgICAgICAgICB0aGlzLl90b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuX3JlY29yZENvdW50IC8gc2l6ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlUGFnZShwYWdlKTtcblxuICAgIGlmIChwYWdlICE9PSAxKSB7XG4gICAgICBpZiAoIXRoaXMuYm9va01hcmspXG4gICAgICAgIHRocm93IG5ldyBQYWdpbmdFcnJvcihcIk5vIGJvb2ttYXJrLiBEaWQgeW91IHN0YXJ0IGluIHRoZSBmaXJzdCBwYWdlP1wiKTtcbiAgICAgIHN0YXRlbWVudFtcImJvb2ttYXJrXCJdID0gdGhpcy5ib29rTWFyaztcbiAgICB9XG4gICAgY29uc3QgcmF3UmVzdWx0OiBNYW5nb1Jlc3BvbnNlPGFueT4gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KFxuICAgICAgc3RhdGVtZW50LFxuICAgICAgZmFsc2VcbiAgICApO1xuXG4gICAgY29uc3QgeyBkb2NzLCBib29rbWFyaywgd2FybmluZyB9ID0gcmF3UmVzdWx0O1xuICAgIGlmICh3YXJuaW5nKSBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgaWYgKCF0aGlzLmNsYXp6KSB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXCJObyBzdGF0ZW1lbnQgdGFyZ2V0IGRlZmluZWRcIik7XG4gICAgY29uc3QgcGtEZWYgPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGF6eigpKTtcbiAgICBjb25zdCByZXN1bHRzID1cbiAgICAgIHN0YXRlbWVudC5maWVsZHMgJiYgc3RhdGVtZW50LmZpZWxkcy5sZW5ndGhcbiAgICAgICAgPyBkb2NzIC8vIGhhcyBmaWVsZHMgbWVhbnMgaXRzIG5vdCBmdWxsIG1vZGVsXG4gICAgICAgIDogZG9jcy5tYXAoKGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy9ubyBmaWVsZHMgbWVhbnMgd2UgbmVlZCB0byByZXZlcnQgdG8gc2F2aW5nIHByb2Nlc3NcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSWQgPSBkLl9pZC5zcGxpdChDb3VjaERCS2V5cy5TRVBBUkFUT1IpO1xuICAgICAgICAgICAgb3JpZ2luYWxJZC5zcGxpY2UoMCwgMSk7IC8vIHJlbW92ZSB0aGUgdGFibGUgbmFtZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQoXG4gICAgICAgICAgICAgIGQsXG4gICAgICAgICAgICAgIHRoaXMuY2xhenosXG4gICAgICAgICAgICAgIHBrRGVmLmlkLFxuICAgICAgICAgICAgICBTZXF1ZW5jZS5wYXJzZVZhbHVlKFxuICAgICAgICAgICAgICAgIHBrRGVmLnByb3BzLnR5cGUsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxJZC5qb2luKENvdWNoREJLZXlzLlNFUEFSQVRPUilcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICB0aGlzLmJvb2tNYXJrID0gYm9va21hcms7XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iXX0=
|
|
@@ -1,13 +1,146 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Paginator } from "@decaf-ts/core";
|
|
1
|
+
import { Condition, Paginator, Statement } from "@decaf-ts/core";
|
|
3
2
|
import { MangoQuery } from "../types";
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import { Model } from "@decaf-ts/decorator-validation";
|
|
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
|
+
*/
|
|
25
|
+
export declare class CouchDBStatement<M extends Model, R> extends Statement<MangoQuery, M, R> {
|
|
26
|
+
constructor(adapter: CouchDBAdapter<any, any, any>);
|
|
6
27
|
/**
|
|
7
|
-
* @
|
|
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
|
+
*/
|
|
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
|
+
*/
|
|
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
|
|
8
100
|
*/
|
|
9
|
-
execute<Y>(): Promise<Y>;
|
|
10
|
-
paginate<R>(size: number): Promise<Paginator<R, MangoQuery>>;
|
|
11
101
|
private processRecord;
|
|
12
|
-
|
|
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
|
+
*/
|
|
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
|
+
*/
|
|
145
|
+
protected parseCondition(condition: Condition<M>): MangoQuery;
|
|
13
146
|
}
|