@decaf-ts/core 0.5.28 → 0.5.30

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.
@@ -0,0 +1,272 @@
1
+ import { QueryClause } from "./types.js";
2
+ import { OperatorsMap } from "./utils.js";
3
+ const lowerFirst = (str) => str.charAt(0).toLowerCase() + str.slice(1);
4
+ /**
5
+ * @description
6
+ * Utility class to build query objects from repository method names.
7
+ *
8
+ * @summary
9
+ * The `MethodQueryBuilder` class parses method names that follow a specific naming convention
10
+ * (e.g., `findByNameAndAgeOrderByCountryAsc`) and converts them into structured query objects
11
+ * (`QueryAssist`). It extracts clauses such as `select`, `where`, `groupBy`, `orderBy`, `limit`,
12
+ * and `offset`, ensuring that developers can declare repository queries using expressive method names.
13
+ *
14
+ * @param methodName {string} - The repository method name to parse and convert into a query.
15
+ * @param values {any[]} - The values corresponding to method parameters used for query conditions.
16
+ *
17
+ * @return {QueryAssist} A structured query object describing the parsed action, select, where,
18
+ * groupBy, orderBy, limit, and offset clauses.
19
+ *
20
+ * @class
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const query = MethodQueryBuilder.build(
25
+ * "findByNameAndAgeOrderByCountryAsc",
26
+ * "John",
27
+ * 25,
28
+ * [["country", "ASC"]]
29
+ * );
30
+ *
31
+ * console.log(query);
32
+ * // {
33
+ * // action: "find",
34
+ * // select: undefined,
35
+ * // where: { ... },
36
+ * // groupBy: undefined,
37
+ * // orderBy: [["country", "ASC"]],
38
+ * // limit: undefined,
39
+ * // offset: undefined
40
+ * // }
41
+ * ```
42
+ *
43
+ * @mermaid
44
+ * sequenceDiagram
45
+ * participant Repo as Repository Method
46
+ * participant MQB as MethodQueryBuilder
47
+ * participant Query as QueryAssist
48
+ *
49
+ * Repo->>MQB: build(methodName, ...values)
50
+ * MQB->>MQB: extractCore(methodName)
51
+ * MQB->>MQB: extractSelect(methodName)
52
+ * MQB->>MQB: extractGroupBy(methodName)
53
+ * MQB->>MQB: buildWhere(core, values)
54
+ * MQB->>MQB: extractOrderLimitOffset(core, values)
55
+ * MQB->>Query: return structured QueryAssist object
56
+ */
57
+ export class MethodQueryBuilder {
58
+ /**
59
+ * @description
60
+ * Builds a `QueryAssist` object by parsing a repository method name and values.
61
+ *
62
+ * @summary
63
+ * The method validates the method name, extracts clauses (core, select, groupBy, where,
64
+ * orderBy, limit, and offset), and assembles them into a structured query object
65
+ * that can be executed against a data source.
66
+ *
67
+ * @param methodName {string} - The repository method name that encodes query information.
68
+ * @param values {any[]} - The values corresponding to conditions and extra clauses.
69
+ *
70
+ * @return {QueryAssist} A structured query object representing the parsed query.
71
+ */
72
+ static build(methodName, ...values) {
73
+ if (!methodName.startsWith(QueryClause.FIND_BY)) {
74
+ throw new Error(`Unsupported method ${methodName}`);
75
+ }
76
+ const core = this.extractCore(methodName);
77
+ const select = this.extractSelect(methodName);
78
+ const groupBy = this.extractGroupBy(methodName);
79
+ // const orderBy = this.extractOrderBy(methodName);
80
+ const where = this.buildWhere(core, values);
81
+ const { orderBy, limit, offset } = this.extractOrderLimitOffset(core, values);
82
+ return {
83
+ action: "find",
84
+ select: select,
85
+ where,
86
+ groupBy,
87
+ orderBy,
88
+ limit,
89
+ offset,
90
+ };
91
+ }
92
+ /**
93
+ * @description
94
+ * Extracts the core part of the method name after `findBy` and before any special clauses.
95
+ *
96
+ * @summary
97
+ * Removes prefixes and detects delimiters (`Then`, `OrderBy`, `GroupBy`, `Limit`, `Offset`)
98
+ * to isolate the main conditional part of the query.
99
+ *
100
+ * @param methodName {string} - The method name to parse.
101
+ *
102
+ * @return {string} The extracted core string used for building conditions.
103
+ */
104
+ static extractCore(methodName) {
105
+ const afterFindBy = methodName.substring(QueryClause.FIND_BY.length);
106
+ const regex = /(Then[A-Z]|OrderBy|GroupBy|Limit|Offset)/;
107
+ const match = afterFindBy.match(regex);
108
+ return match ? afterFindBy.substring(0, match.index) : afterFindBy;
109
+ }
110
+ /**
111
+ * @description
112
+ * Extracts the select clause from a method name.
113
+ *
114
+ * @summary
115
+ * Detects the `Select` keyword in the method name, isolates the fields following it,
116
+ * and returns them as an array of lowercase-first strings.
117
+ *
118
+ * @param methodName {string} - The method name to parse.
119
+ *
120
+ * @return {string[] | undefined} An array of selected fields or `undefined` if no select clause exists.
121
+ */
122
+ static extractSelect(methodName) {
123
+ const selectIndex = methodName.indexOf(QueryClause.SELECT);
124
+ if (selectIndex === -1)
125
+ return undefined;
126
+ const afterSelect = methodName.substring(selectIndex + QueryClause.SELECT.length);
127
+ // Search for next Then, GroupBy, OrderBy...
128
+ const match = afterSelect.match(/(Then[A-Z]|OrderBy|GroupBy|Limit|Offset)/);
129
+ const selectPart = match
130
+ ? afterSelect.substring(0, match.index)
131
+ : afterSelect;
132
+ return selectPart.split(QueryClause.AND).map(lowerFirst).filter(Boolean);
133
+ }
134
+ /**
135
+ * @description
136
+ * Extracts the group by clause from a method name.
137
+ *
138
+ * @summary
139
+ * Detects the `GroupBy` keyword in the method name, isolates the fields following it,
140
+ * and returns them as an array of lowercase-first strings.
141
+ *
142
+ * @param methodName {string} - The method name to parse.
143
+ *
144
+ * @return {string[] | undefined} An array of group by fields or `undefined` if no group by clause exists.
145
+ */
146
+ static extractGroupBy(methodName) {
147
+ const groupByIndex = methodName.indexOf(QueryClause.GROUP_BY);
148
+ if (groupByIndex === -1)
149
+ return undefined;
150
+ const after = methodName.substring(groupByIndex + QueryClause.GROUP_BY.length);
151
+ const groupByPart = after.split(QueryClause.ORDER_BY)[0];
152
+ return groupByPart
153
+ .split(QueryClause.THEN_BY)
154
+ .map(lowerFirst)
155
+ .filter(Boolean);
156
+ }
157
+ // private static extractOrderBy(
158
+ // methodName: string
159
+ // ): OrderBySelector<any>[] | undefined {
160
+ // const orderByIndex = methodName.indexOf(QueryClause.ORDER_BY);
161
+ // if (orderByIndex === -1) return undefined;
162
+ //
163
+ // const after = methodName.substring(
164
+ // orderByIndex + QueryClause.ORDER_BY.length
165
+ // );
166
+ // const orderParts = after.split("ThenBy");
167
+ //
168
+ // return orderParts.map((part) => {
169
+ // const match = part.match(/(.*?)(Asc|Desc|Dsc)$/);
170
+ // if (!match) throw new Error(`Invalid OrderBy part: ${part}`);
171
+ // const [, field, dir] = match;
172
+ // return [
173
+ // lowerFirst(field),
174
+ // dir.toLowerCase() === "dsc"
175
+ // ? OrderDirection.DSC
176
+ // : (dir.toLowerCase() as OrderDirection),
177
+ // ];
178
+ // });
179
+ // }
180
+ /**
181
+ * @description
182
+ * Builds the `where` condition object based on the parsed core string and parameter values.
183
+ *
184
+ * @summary
185
+ * Splits the core string by logical operators (`And`, `Or`), parses each token into a field
186
+ * and operator, and combines them into a `Condition` object using the provided values.
187
+ *
188
+ * @param core {string} - The extracted core string from the method name.
189
+ * @param values {any[]} - The values corresponding to the conditions.
190
+ *
191
+ * @return {Condition<any>} A structured condition object representing the query's where clause.
192
+ */
193
+ static buildWhere(core, values) {
194
+ const parts = core.split(/OrderBy|GroupBy/)[0] || "";
195
+ const conditions = parts.split(/And|Or/);
196
+ const operators = core.match(/And|Or/g) || [];
197
+ let where;
198
+ conditions.forEach((token, idx) => {
199
+ const { field, operator } = this.parseFieldAndOperator(token);
200
+ const parser = operator ? OperatorsMap[operator] : OperatorsMap.Equals;
201
+ if (!parser)
202
+ throw new Error(`Unsupported operator ${operator}`);
203
+ const conditionValue = values[idx];
204
+ if (typeof conditionValue === "undefined") {
205
+ throw new Error(`Invalid value for field ${field}`);
206
+ }
207
+ const condition = parser(field, conditionValue);
208
+ where =
209
+ idx === 0
210
+ ? condition
211
+ : operators[idx - 1] === QueryClause.AND
212
+ ? where.and(condition)
213
+ : where.or(condition);
214
+ });
215
+ if (!where)
216
+ throw new Error("No conditions found in method name");
217
+ return where;
218
+ }
219
+ /**
220
+ * @description
221
+ * Parses a field name and operator from a string token.
222
+ *
223
+ * @summary
224
+ * Identifies the operator suffix (if present) and returns a descriptor containing the field
225
+ * name in lowercase-first format along with the operator.
226
+ *
227
+ * @param str {string} - The token string to parse.
228
+ *
229
+ * @return {FilterDescriptor} An object containing the field name and operator.
230
+ */
231
+ static parseFieldAndOperator(str) {
232
+ for (const operator of Object.keys(OperatorsMap)) {
233
+ if (str.endsWith(operator)) {
234
+ const field = str.slice(0, -operator.length);
235
+ return { field: lowerFirst(field), operator };
236
+ }
237
+ }
238
+ return { field: lowerFirst(str) };
239
+ }
240
+ /**
241
+ * @description
242
+ * Extracts `orderBy`, `limit`, and `offset` clauses from method arguments.
243
+ *
244
+ * @summary
245
+ * Determines the number of condition arguments, then checks the remaining arguments
246
+ * to resolve sorting, limiting, and pagination.
247
+ *
248
+ * @param core {string} - The extracted core string from the method name.
249
+ * @param values {any[]} - The values corresponding to method arguments, including conditions and extras.
250
+ *
251
+ * @return {{
252
+ * orderBy?: OrderBySelector<any>[];
253
+ * limit?: number;
254
+ * offset?: number;
255
+ * }} An object containing orderBy, limit, and offset values if present.
256
+ */
257
+ static extractOrderLimitOffset(core, values) {
258
+ const conditionCount = core.split(/And|Or/).length;
259
+ const extraArgs = values.slice(conditionCount);
260
+ let orderBy;
261
+ let limit;
262
+ let offset;
263
+ if (extraArgs.length >= 1 && Array.isArray(extraArgs[0]))
264
+ orderBy = extraArgs[0];
265
+ if (extraArgs.length >= 2 && typeof extraArgs[1] === "number")
266
+ limit = extraArgs[1];
267
+ if (extraArgs.length >= 3 && typeof extraArgs[2] === "number")
268
+ offset = extraArgs[2];
269
+ return { orderBy, limit, offset };
270
+ }
271
+ }
272
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWV0aG9kUXVlcnlCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3F1ZXJ5L01ldGhvZFF1ZXJ5QnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWlDLFdBQVcsRUFBRSxtQkFBZ0I7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxtQkFBZ0I7QUFFdkMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFXLEVBQVUsRUFBRSxDQUN6QyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvREc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQWtCLEVBQUUsR0FBRyxNQUFhO1FBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELG1EQUFtRDtRQUNuRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1QyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQzdELElBQUksRUFDSixNQUFNLENBQ1AsQ0FBQztRQUVGLE9BQU87WUFDTCxNQUFNLEVBQUUsTUFBTTtZQUNkLE1BQU0sRUFBRSxNQUFNO1lBQ2QsS0FBSztZQUNMLE9BQU87WUFDUCxPQUFPO1lBQ1AsS0FBSztZQUNMLE1BQU07U0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFrQjtRQUMzQyxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckUsTUFBTSxLQUFLLEdBQUcsMENBQTBDLENBQUM7UUFDekQsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFrQjtRQUM3QyxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRCxJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUV6QyxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUN0QyxXQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQ3hDLENBQUM7UUFFRiw0Q0FBNEM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBRTVFLE1BQU0sVUFBVSxHQUFHLEtBQUs7WUFDdEIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDdkMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUVoQixPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFrQjtRQUM5QyxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5RCxJQUFJLFlBQVksS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUUxQyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsU0FBUyxDQUNoQyxZQUFZLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQzNDLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RCxPQUFPLFdBQVc7YUFDZixLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQzthQUMxQixHQUFHLENBQUMsVUFBVSxDQUFDO2FBQ2YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsdUJBQXVCO0lBQ3ZCLDBDQUEwQztJQUMxQyxtRUFBbUU7SUFDbkUsK0NBQStDO0lBQy9DLEVBQUU7SUFDRix3Q0FBd0M7SUFDeEMsaURBQWlEO0lBQ2pELE9BQU87SUFDUCw4Q0FBOEM7SUFDOUMsRUFBRTtJQUNGLHNDQUFzQztJQUN0Qyx3REFBd0Q7SUFDeEQsb0VBQW9FO0lBQ3BFLG9DQUFvQztJQUNwQyxlQUFlO0lBQ2YsMkJBQTJCO0lBQzNCLG9DQUFvQztJQUNwQywrQkFBK0I7SUFDL0IsbURBQW1EO0lBQ25ELFNBQVM7SUFDVCxRQUFRO0lBQ1IsSUFBSTtJQUVKOzs7Ozs7Ozs7Ozs7T0FZRztJQUNLLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBWSxFQUFFLE1BQWE7UUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTlDLElBQUksS0FBaUMsQ0FBQztRQUV0QyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ2hDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxNQUFNO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFakUsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLElBQUksT0FBTyxjQUFjLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDaEQsS0FBSztnQkFDSCxHQUFHLEtBQUssQ0FBQztvQkFDUCxDQUFDLENBQUMsU0FBUztvQkFDWCxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsR0FBRzt3QkFDdEMsQ0FBQyxDQUFDLEtBQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO3dCQUN2QixDQUFDLENBQUMsS0FBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQVc7UUFDOUMsS0FBSyxNQUFNLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDakQsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUNoRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0ssTUFBTSxDQUFDLHVCQUF1QixDQUNwQyxJQUFZLEVBQ1osTUFBYTtRQUViLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ25ELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFL0MsSUFBSSxPQUEyQyxDQUFDO1FBQ2hELElBQUksS0FBeUIsQ0FBQztRQUM5QixJQUFJLE1BQTBCLENBQUM7UUFFL0IsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RCxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBMkIsQ0FBQztRQUVuRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVE7WUFDM0QsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2QixJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVE7WUFDM0QsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25kaXRpb24sIE9yZGVyQnlTZWxlY3RvciB9IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgRmlsdGVyRGVzY3JpcHRvciwgUXVlcnlBc3Npc3QsIFF1ZXJ5Q2xhdXNlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9wZXJhdG9yc01hcCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmNvbnN0IGxvd2VyRmlyc3QgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgc3RyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogVXRpbGl0eSBjbGFzcyB0byBidWlsZCBxdWVyeSBvYmplY3RzIGZyb20gcmVwb3NpdG9yeSBtZXRob2QgbmFtZXMuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgTWV0aG9kUXVlcnlCdWlsZGVyYCBjbGFzcyBwYXJzZXMgbWV0aG9kIG5hbWVzIHRoYXQgZm9sbG93IGEgc3BlY2lmaWMgbmFtaW5nIGNvbnZlbnRpb25cbiAqIChlLmcuLCBgZmluZEJ5TmFtZUFuZEFnZU9yZGVyQnlDb3VudHJ5QXNjYCkgYW5kIGNvbnZlcnRzIHRoZW0gaW50byBzdHJ1Y3R1cmVkIHF1ZXJ5IG9iamVjdHNcbiAqIChgUXVlcnlBc3Npc3RgKS4gSXQgZXh0cmFjdHMgY2xhdXNlcyBzdWNoIGFzIGBzZWxlY3RgLCBgd2hlcmVgLCBgZ3JvdXBCeWAsIGBvcmRlckJ5YCwgYGxpbWl0YCxcbiAqIGFuZCBgb2Zmc2V0YCwgZW5zdXJpbmcgdGhhdCBkZXZlbG9wZXJzIGNhbiBkZWNsYXJlIHJlcG9zaXRvcnkgcXVlcmllcyB1c2luZyBleHByZXNzaXZlIG1ldGhvZCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSB7c3RyaW5nfSAtIFRoZSByZXBvc2l0b3J5IG1ldGhvZCBuYW1lIHRvIHBhcnNlIGFuZCBjb252ZXJ0IGludG8gYSBxdWVyeS5cbiAqIEBwYXJhbSB2YWx1ZXMge2FueVtdfSAtIFRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBtZXRob2QgcGFyYW1ldGVycyB1c2VkIGZvciBxdWVyeSBjb25kaXRpb25zLlxuICpcbiAqIEByZXR1cm4ge1F1ZXJ5QXNzaXN0fSBBIHN0cnVjdHVyZWQgcXVlcnkgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHBhcnNlZCBhY3Rpb24sIHNlbGVjdCwgd2hlcmUsXG4gKiBncm91cEJ5LCBvcmRlckJ5LCBsaW1pdCwgYW5kIG9mZnNldCBjbGF1c2VzLlxuICpcbiAqIEBjbGFzc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgcXVlcnkgPSBNZXRob2RRdWVyeUJ1aWxkZXIuYnVpbGQoXG4gKiAgIFwiZmluZEJ5TmFtZUFuZEFnZU9yZGVyQnlDb3VudHJ5QXNjXCIsXG4gKiAgIFwiSm9oblwiLFxuICogICAyNSxcbiAqICAgW1tcImNvdW50cnlcIiwgXCJBU0NcIl1dXG4gKiApO1xuICpcbiAqIGNvbnNvbGUubG9nKHF1ZXJ5KTtcbiAqIC8vIHtcbiAqIC8vICAgYWN0aW9uOiBcImZpbmRcIixcbiAqIC8vICAgc2VsZWN0OiB1bmRlZmluZWQsXG4gKiAvLyAgIHdoZXJlOiB7IC4uLiB9LFxuICogLy8gICBncm91cEJ5OiB1bmRlZmluZWQsXG4gKiAvLyAgIG9yZGVyQnk6IFtbXCJjb3VudHJ5XCIsIFwiQVNDXCJdXSxcbiAqIC8vICAgbGltaXQ6IHVuZGVmaW5lZCxcbiAqIC8vICAgb2Zmc2V0OiB1bmRlZmluZWRcbiAqIC8vIH1cbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBSZXBvc2l0b3J5IE1ldGhvZFxuICogICBwYXJ0aWNpcGFudCBNUUIgYXMgTWV0aG9kUXVlcnlCdWlsZGVyXG4gKiAgIHBhcnRpY2lwYW50IFF1ZXJ5IGFzIFF1ZXJ5QXNzaXN0XG4gKlxuICogICBSZXBvLT4+TVFCOiBidWlsZChtZXRob2ROYW1lLCAuLi52YWx1ZXMpXG4gKiAgIE1RQi0+Pk1RQjogZXh0cmFjdENvcmUobWV0aG9kTmFtZSlcbiAqICAgTVFCLT4+TVFCOiBleHRyYWN0U2VsZWN0KG1ldGhvZE5hbWUpXG4gKiAgIE1RQi0+Pk1RQjogZXh0cmFjdEdyb3VwQnkobWV0aG9kTmFtZSlcbiAqICAgTVFCLT4+TVFCOiBidWlsZFdoZXJlKGNvcmUsIHZhbHVlcylcbiAqICAgTVFCLT4+TVFCOiBleHRyYWN0T3JkZXJMaW1pdE9mZnNldChjb3JlLCB2YWx1ZXMpXG4gKiAgIE1RQi0+PlF1ZXJ5OiByZXR1cm4gc3RydWN0dXJlZCBRdWVyeUFzc2lzdCBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIE1ldGhvZFF1ZXJ5QnVpbGRlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQnVpbGRzIGEgYFF1ZXJ5QXNzaXN0YCBvYmplY3QgYnkgcGFyc2luZyBhIHJlcG9zaXRvcnkgbWV0aG9kIG5hbWUgYW5kIHZhbHVlcy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogVGhlIG1ldGhvZCB2YWxpZGF0ZXMgdGhlIG1ldGhvZCBuYW1lLCBleHRyYWN0cyBjbGF1c2VzIChjb3JlLCBzZWxlY3QsIGdyb3VwQnksIHdoZXJlLFxuICAgKiBvcmRlckJ5LCBsaW1pdCwgYW5kIG9mZnNldCksIGFuZCBhc3NlbWJsZXMgdGhlbSBpbnRvIGEgc3RydWN0dXJlZCBxdWVyeSBvYmplY3RcbiAgICogdGhhdCBjYW4gYmUgZXhlY3V0ZWQgYWdhaW5zdCBhIGRhdGEgc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB7c3RyaW5nfSAtIFRoZSByZXBvc2l0b3J5IG1ldGhvZCBuYW1lIHRoYXQgZW5jb2RlcyBxdWVyeSBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHZhbHVlcyB7YW55W119IC0gVGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGNvbmRpdGlvbnMgYW5kIGV4dHJhIGNsYXVzZXMuXG4gICAqXG4gICAqIEByZXR1cm4ge1F1ZXJ5QXNzaXN0fSBBIHN0cnVjdHVyZWQgcXVlcnkgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGFyc2VkIHF1ZXJ5LlxuICAgKi9cbiAgc3RhdGljIGJ1aWxkKG1ldGhvZE5hbWU6IHN0cmluZywgLi4udmFsdWVzOiBhbnlbXSk6IFF1ZXJ5QXNzaXN0IHtcbiAgICBpZiAoIW1ldGhvZE5hbWUuc3RhcnRzV2l0aChRdWVyeUNsYXVzZS5GSU5EX0JZKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBtZXRob2QgJHttZXRob2ROYW1lfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvcmUgPSB0aGlzLmV4dHJhY3RDb3JlKG1ldGhvZE5hbWUpO1xuICAgIGNvbnN0IHNlbGVjdCA9IHRoaXMuZXh0cmFjdFNlbGVjdChtZXRob2ROYW1lKTtcbiAgICBjb25zdCBncm91cEJ5ID0gdGhpcy5leHRyYWN0R3JvdXBCeShtZXRob2ROYW1lKTtcbiAgICAvLyBjb25zdCBvcmRlckJ5ID0gdGhpcy5leHRyYWN0T3JkZXJCeShtZXRob2ROYW1lKTtcbiAgICBjb25zdCB3aGVyZSA9IHRoaXMuYnVpbGRXaGVyZShjb3JlLCB2YWx1ZXMpO1xuICAgIGNvbnN0IHsgb3JkZXJCeSwgbGltaXQsIG9mZnNldCB9ID0gdGhpcy5leHRyYWN0T3JkZXJMaW1pdE9mZnNldChcbiAgICAgIGNvcmUsXG4gICAgICB2YWx1ZXNcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJmaW5kXCIsXG4gICAgICBzZWxlY3Q6IHNlbGVjdCxcbiAgICAgIHdoZXJlLFxuICAgICAgZ3JvdXBCeSxcbiAgICAgIG9yZGVyQnksXG4gICAgICBsaW1pdCxcbiAgICAgIG9mZnNldCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFeHRyYWN0cyB0aGUgY29yZSBwYXJ0IG9mIHRoZSBtZXRob2QgbmFtZSBhZnRlciBgZmluZEJ5YCBhbmQgYmVmb3JlIGFueSBzcGVjaWFsIGNsYXVzZXMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIFJlbW92ZXMgcHJlZml4ZXMgYW5kIGRldGVjdHMgZGVsaW1pdGVycyAoYFRoZW5gLCBgT3JkZXJCeWAsIGBHcm91cEJ5YCwgYExpbWl0YCwgYE9mZnNldGApXG4gICAqIHRvIGlzb2xhdGUgdGhlIG1haW4gY29uZGl0aW9uYWwgcGFydCBvZiB0aGUgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2ROYW1lIHtzdHJpbmd9IC0gVGhlIG1ldGhvZCBuYW1lIHRvIHBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBleHRyYWN0ZWQgY29yZSBzdHJpbmcgdXNlZCBmb3IgYnVpbGRpbmcgY29uZGl0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGV4dHJhY3RDb3JlKG1ldGhvZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgYWZ0ZXJGaW5kQnkgPSBtZXRob2ROYW1lLnN1YnN0cmluZyhRdWVyeUNsYXVzZS5GSU5EX0JZLmxlbmd0aCk7XG4gICAgY29uc3QgcmVnZXggPSAvKFRoZW5bQS1aXXxPcmRlckJ5fEdyb3VwQnl8TGltaXR8T2Zmc2V0KS87XG4gICAgY29uc3QgbWF0Y2ggPSBhZnRlckZpbmRCeS5tYXRjaChyZWdleCk7XG4gICAgcmV0dXJuIG1hdGNoID8gYWZ0ZXJGaW5kQnkuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4KSA6IGFmdGVyRmluZEJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFeHRyYWN0cyB0aGUgc2VsZWN0IGNsYXVzZSBmcm9tIGEgbWV0aG9kIG5hbWUuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIERldGVjdHMgdGhlIGBTZWxlY3RgIGtleXdvcmQgaW4gdGhlIG1ldGhvZCBuYW1lLCBpc29sYXRlcyB0aGUgZmllbGRzIGZvbGxvd2luZyBpdCxcbiAgICogYW5kIHJldHVybnMgdGhlbSBhcyBhbiBhcnJheSBvZiBsb3dlcmNhc2UtZmlyc3Qgc3RyaW5ncy5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZE5hbWUge3N0cmluZ30gLSBUaGUgbWV0aG9kIG5hbWUgdG8gcGFyc2UuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBBbiBhcnJheSBvZiBzZWxlY3RlZCBmaWVsZHMgb3IgYHVuZGVmaW5lZGAgaWYgbm8gc2VsZWN0IGNsYXVzZSBleGlzdHMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0U2VsZWN0KG1ldGhvZE5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzZWxlY3RJbmRleCA9IG1ldGhvZE5hbWUuaW5kZXhPZihRdWVyeUNsYXVzZS5TRUxFQ1QpO1xuICAgIGlmIChzZWxlY3RJbmRleCA9PT0gLTEpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBhZnRlclNlbGVjdCA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKFxuICAgICAgc2VsZWN0SW5kZXggKyBRdWVyeUNsYXVzZS5TRUxFQ1QubGVuZ3RoXG4gICAgKTtcblxuICAgIC8vIFNlYXJjaCBmb3IgbmV4dCBUaGVuLCBHcm91cEJ5LCBPcmRlckJ5Li4uXG4gICAgY29uc3QgbWF0Y2ggPSBhZnRlclNlbGVjdC5tYXRjaCgvKFRoZW5bQS1aXXxPcmRlckJ5fEdyb3VwQnl8TGltaXR8T2Zmc2V0KS8pO1xuXG4gICAgY29uc3Qgc2VsZWN0UGFydCA9IG1hdGNoXG4gICAgICA/IGFmdGVyU2VsZWN0LnN1YnN0cmluZygwLCBtYXRjaC5pbmRleClcbiAgICAgIDogYWZ0ZXJTZWxlY3Q7XG5cbiAgICByZXR1cm4gc2VsZWN0UGFydC5zcGxpdChRdWVyeUNsYXVzZS5BTkQpLm1hcChsb3dlckZpcnN0KS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEV4dHJhY3RzIHRoZSBncm91cCBieSBjbGF1c2UgZnJvbSBhIG1ldGhvZCBuYW1lLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBEZXRlY3RzIHRoZSBgR3JvdXBCeWAga2V5d29yZCBpbiB0aGUgbWV0aG9kIG5hbWUsIGlzb2xhdGVzIHRoZSBmaWVsZHMgZm9sbG93aW5nIGl0LFxuICAgKiBhbmQgcmV0dXJucyB0aGVtIGFzIGFuIGFycmF5IG9mIGxvd2VyY2FzZS1maXJzdCBzdHJpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB7c3RyaW5nfSAtIFRoZSBtZXRob2QgbmFtZSB0byBwYXJzZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nW10gfCB1bmRlZmluZWR9IEFuIGFycmF5IG9mIGdyb3VwIGJ5IGZpZWxkcyBvciBgdW5kZWZpbmVkYCBpZiBubyBncm91cCBieSBjbGF1c2UgZXhpc3RzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdEdyb3VwQnkobWV0aG9kTmFtZTogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGdyb3VwQnlJbmRleCA9IG1ldGhvZE5hbWUuaW5kZXhPZihRdWVyeUNsYXVzZS5HUk9VUF9CWSk7XG4gICAgaWYgKGdyb3VwQnlJbmRleCA9PT0gLTEpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBhZnRlciA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKFxuICAgICAgZ3JvdXBCeUluZGV4ICsgUXVlcnlDbGF1c2UuR1JPVVBfQlkubGVuZ3RoXG4gICAgKTtcbiAgICBjb25zdCBncm91cEJ5UGFydCA9IGFmdGVyLnNwbGl0KFF1ZXJ5Q2xhdXNlLk9SREVSX0JZKVswXTtcbiAgICByZXR1cm4gZ3JvdXBCeVBhcnRcbiAgICAgIC5zcGxpdChRdWVyeUNsYXVzZS5USEVOX0JZKVxuICAgICAgLm1hcChsb3dlckZpcnN0KVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIC8vIHByaXZhdGUgc3RhdGljIGV4dHJhY3RPcmRlckJ5KFxuICAvLyAgIG1ldGhvZE5hbWU6IHN0cmluZ1xuICAvLyApOiBPcmRlckJ5U2VsZWN0b3I8YW55PltdIHwgdW5kZWZpbmVkIHtcbiAgLy8gICBjb25zdCBvcmRlckJ5SW5kZXggPSBtZXRob2ROYW1lLmluZGV4T2YoUXVlcnlDbGF1c2UuT1JERVJfQlkpO1xuICAvLyAgIGlmIChvcmRlckJ5SW5kZXggPT09IC0xKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvL1xuICAvLyAgIGNvbnN0IGFmdGVyID0gbWV0aG9kTmFtZS5zdWJzdHJpbmcoXG4gIC8vICAgICBvcmRlckJ5SW5kZXggKyBRdWVyeUNsYXVzZS5PUkRFUl9CWS5sZW5ndGhcbiAgLy8gICApO1xuICAvLyAgIGNvbnN0IG9yZGVyUGFydHMgPSBhZnRlci5zcGxpdChcIlRoZW5CeVwiKTtcbiAgLy9cbiAgLy8gICByZXR1cm4gb3JkZXJQYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgLy8gICAgIGNvbnN0IG1hdGNoID0gcGFydC5tYXRjaCgvKC4qPykoQXNjfERlc2N8RHNjKSQvKTtcbiAgLy8gICAgIGlmICghbWF0Y2gpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBPcmRlckJ5IHBhcnQ6ICR7cGFydH1gKTtcbiAgLy8gICAgIGNvbnN0IFssIGZpZWxkLCBkaXJdID0gbWF0Y2g7XG4gIC8vICAgICByZXR1cm4gW1xuICAvLyAgICAgICBsb3dlckZpcnN0KGZpZWxkKSxcbiAgLy8gICAgICAgZGlyLnRvTG93ZXJDYXNlKCkgPT09IFwiZHNjXCJcbiAgLy8gICAgICAgICA/IE9yZGVyRGlyZWN0aW9uLkRTQ1xuICAvLyAgICAgICAgIDogKGRpci50b0xvd2VyQ2FzZSgpIGFzIE9yZGVyRGlyZWN0aW9uKSxcbiAgLy8gICAgIF07XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEJ1aWxkcyB0aGUgYHdoZXJlYCBjb25kaXRpb24gb2JqZWN0IGJhc2VkIG9uIHRoZSBwYXJzZWQgY29yZSBzdHJpbmcgYW5kIHBhcmFtZXRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIFNwbGl0cyB0aGUgY29yZSBzdHJpbmcgYnkgbG9naWNhbCBvcGVyYXRvcnMgKGBBbmRgLCBgT3JgKSwgcGFyc2VzIGVhY2ggdG9rZW4gaW50byBhIGZpZWxkXG4gICAqIGFuZCBvcGVyYXRvciwgYW5kIGNvbWJpbmVzIHRoZW0gaW50byBhIGBDb25kaXRpb25gIG9iamVjdCB1c2luZyB0aGUgcHJvdmlkZWQgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gY29yZSB7c3RyaW5nfSAtIFRoZSBleHRyYWN0ZWQgY29yZSBzdHJpbmcgZnJvbSB0aGUgbWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSB2YWx1ZXMge2FueVtdfSAtIFRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgY29uZGl0aW9ucy5cbiAgICpcbiAgICogQHJldHVybiB7Q29uZGl0aW9uPGFueT59IEEgc3RydWN0dXJlZCBjb25kaXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcXVlcnkncyB3aGVyZSBjbGF1c2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBidWlsZFdoZXJlKGNvcmU6IHN0cmluZywgdmFsdWVzOiBhbnlbXSk6IENvbmRpdGlvbjxhbnk+IHtcbiAgICBjb25zdCBwYXJ0cyA9IGNvcmUuc3BsaXQoL09yZGVyQnl8R3JvdXBCeS8pWzBdIHx8IFwiXCI7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHBhcnRzLnNwbGl0KC9BbmR8T3IvKTtcblxuICAgIGNvbnN0IG9wZXJhdG9ycyA9IGNvcmUubWF0Y2goL0FuZHxPci9nKSB8fCBbXTtcblxuICAgIGxldCB3aGVyZTogQ29uZGl0aW9uPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25kaXRpb25zLmZvckVhY2goKHRva2VuLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHsgZmllbGQsIG9wZXJhdG9yIH0gPSB0aGlzLnBhcnNlRmllbGRBbmRPcGVyYXRvcih0b2tlbik7XG4gICAgICBjb25zdCBwYXJzZXIgPSBvcGVyYXRvciA/IE9wZXJhdG9yc01hcFtvcGVyYXRvcl0gOiBPcGVyYXRvcnNNYXAuRXF1YWxzO1xuICAgICAgaWYgKCFwYXJzZXIpIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgb3BlcmF0b3IgJHtvcGVyYXRvcn1gKTtcblxuICAgICAgY29uc3QgY29uZGl0aW9uVmFsdWUgPSB2YWx1ZXNbaWR4XTtcbiAgICAgIGlmICh0eXBlb2YgY29uZGl0aW9uVmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciBmaWVsZCAke2ZpZWxkfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb25kaXRpb24gPSBwYXJzZXIoZmllbGQsIGNvbmRpdGlvblZhbHVlKTtcbiAgICAgIHdoZXJlID1cbiAgICAgICAgaWR4ID09PSAwXG4gICAgICAgICAgPyBjb25kaXRpb25cbiAgICAgICAgICA6IG9wZXJhdG9yc1tpZHggLSAxXSA9PT0gUXVlcnlDbGF1c2UuQU5EXG4gICAgICAgICAgICA/IHdoZXJlIS5hbmQoY29uZGl0aW9uKVxuICAgICAgICAgICAgOiB3aGVyZSEub3IoY29uZGl0aW9uKTtcbiAgICB9KTtcblxuICAgIGlmICghd2hlcmUpIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbmRpdGlvbnMgZm91bmQgaW4gbWV0aG9kIG5hbWVcIik7XG4gICAgcmV0dXJuIHdoZXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBQYXJzZXMgYSBmaWVsZCBuYW1lIGFuZCBvcGVyYXRvciBmcm9tIGEgc3RyaW5nIHRva2VuLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJZGVudGlmaWVzIHRoZSBvcGVyYXRvciBzdWZmaXggKGlmIHByZXNlbnQpIGFuZCByZXR1cm5zIGEgZGVzY3JpcHRvciBjb250YWluaW5nIHRoZSBmaWVsZFxuICAgKiBuYW1lIGluIGxvd2VyY2FzZS1maXJzdCBmb3JtYXQgYWxvbmcgd2l0aCB0aGUgb3BlcmF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBzdHIge3N0cmluZ30gLSBUaGUgdG9rZW4gc3RyaW5nIHRvIHBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtGaWx0ZXJEZXNjcmlwdG9yfSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZmllbGQgbmFtZSBhbmQgb3BlcmF0b3IuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwYXJzZUZpZWxkQW5kT3BlcmF0b3Ioc3RyOiBzdHJpbmcpOiBGaWx0ZXJEZXNjcmlwdG9yIHtcbiAgICBmb3IgKGNvbnN0IG9wZXJhdG9yIG9mIE9iamVjdC5rZXlzKE9wZXJhdG9yc01hcCkpIHtcbiAgICAgIGlmIChzdHIuZW5kc1dpdGgob3BlcmF0b3IpKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gc3RyLnNsaWNlKDAsIC1vcGVyYXRvci5sZW5ndGgpO1xuICAgICAgICByZXR1cm4geyBmaWVsZDogbG93ZXJGaXJzdChmaWVsZCksIG9wZXJhdG9yIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGZpZWxkOiBsb3dlckZpcnN0KHN0cikgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRXh0cmFjdHMgYG9yZGVyQnlgLCBgbGltaXRgLCBhbmQgYG9mZnNldGAgY2xhdXNlcyBmcm9tIG1ldGhvZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIERldGVybWluZXMgdGhlIG51bWJlciBvZiBjb25kaXRpb24gYXJndW1lbnRzLCB0aGVuIGNoZWNrcyB0aGUgcmVtYWluaW5nIGFyZ3VtZW50c1xuICAgKiB0byByZXNvbHZlIHNvcnRpbmcsIGxpbWl0aW5nLCBhbmQgcGFnaW5hdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvcmUge3N0cmluZ30gLSBUaGUgZXh0cmFjdGVkIGNvcmUgc3RyaW5nIGZyb20gdGhlIG1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0gdmFsdWVzIHthbnlbXX0gLSBUaGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gbWV0aG9kIGFyZ3VtZW50cywgaW5jbHVkaW5nIGNvbmRpdGlvbnMgYW5kIGV4dHJhcy5cbiAgICpcbiAgICogQHJldHVybiB7e1xuICAgKiAgIG9yZGVyQnk/OiBPcmRlckJ5U2VsZWN0b3I8YW55PltdO1xuICAgKiAgIGxpbWl0PzogbnVtYmVyO1xuICAgKiAgIG9mZnNldD86IG51bWJlcjtcbiAgICogfX0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgb3JkZXJCeSwgbGltaXQsIGFuZCBvZmZzZXQgdmFsdWVzIGlmIHByZXNlbnQuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0T3JkZXJMaW1pdE9mZnNldChcbiAgICBjb3JlOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBhbnlbXVxuICApOiB7IG9yZGVyQnk/OiBPcmRlckJ5U2VsZWN0b3I8YW55PltdOyBsaW1pdD86IG51bWJlcjsgb2Zmc2V0PzogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGNvbmRpdGlvbkNvdW50ID0gY29yZS5zcGxpdCgvQW5kfE9yLykubGVuZ3RoO1xuICAgIGNvbnN0IGV4dHJhQXJncyA9IHZhbHVlcy5zbGljZShjb25kaXRpb25Db3VudCk7XG5cbiAgICBsZXQgb3JkZXJCeTogT3JkZXJCeVNlbGVjdG9yPGFueT5bXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgb2Zmc2V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZXh0cmFBcmdzLmxlbmd0aCA+PSAxICYmIEFycmF5LmlzQXJyYXkoZXh0cmFBcmdzWzBdKSlcbiAgICAgIG9yZGVyQnkgPSBleHRyYUFyZ3NbMF0gYXMgT3JkZXJCeVNlbGVjdG9yPGFueT5bXTtcblxuICAgIGlmIChleHRyYUFyZ3MubGVuZ3RoID49IDIgJiYgdHlwZW9mIGV4dHJhQXJnc1sxXSA9PT0gXCJudW1iZXJcIilcbiAgICAgIGxpbWl0ID0gZXh0cmFBcmdzWzFdO1xuXG4gICAgaWYgKGV4dHJhQXJncy5sZW5ndGggPj0gMyAmJiB0eXBlb2YgZXh0cmFBcmdzWzJdID09PSBcIm51bWJlclwiKVxuICAgICAgb2Zmc2V0ID0gZXh0cmFBcmdzWzJdO1xuXG4gICAgcmV0dXJuIHsgb3JkZXJCeSwgbGltaXQsIG9mZnNldCB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ import { QueryOptions } from "./types";
2
+ export declare function query(options?: QueryOptions): (target: object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<any>) => TypedPropertyDescriptor<any> | void;
@@ -0,0 +1,45 @@
1
+ import { MethodQueryBuilder } from "./MethodQueryBuilder.js";
2
+ import { QueryError } from "./errors.js";
3
+ export function query(options = {}) {
4
+ return (target, propertyKey, descriptor) => {
5
+ // const originalMethod = descriptor.value;
6
+ const methodName = propertyKey.toString();
7
+ descriptor.value = function (...args) {
8
+ const { select, where, groupBy, orderBy, limit, offset } = MethodQueryBuilder.build(methodName, ...args);
9
+ let stmt = this.select(select);
10
+ if (where)
11
+ stmt = stmt.where(where);
12
+ // if (orderBy) stmt = stmt.orderBy(orderBy[0]);
13
+ if (groupBy) {
14
+ // group by not implemented yet
15
+ /* stmt = stmt.groupBy(groupBy); */
16
+ }
17
+ // allow limit and offset by default
18
+ const { allowLimit, allowOffset, allowOrderBy, throws } = {
19
+ allowLimit: true,
20
+ allowOrderBy: true,
21
+ allowOffset: true,
22
+ throws: true,
23
+ ...options,
24
+ };
25
+ const params = [
26
+ // keep the order to ensure the expected behavior
27
+ { key: "orderBy", value: (orderBy || [])[0], allowed: allowOrderBy }, // orderBy only supports one sentence
28
+ { key: "limit", value: limit, allowed: allowLimit },
29
+ { key: "offset", value: offset, allowed: allowOffset },
30
+ ];
31
+ for (const param of params) {
32
+ if (param.value !== undefined) {
33
+ if (!param.allowed && throws) {
34
+ throw new QueryError(`${param.key[0].toUpperCase() + param.key.slice(1)} is not allowed for this query`);
35
+ }
36
+ else if (param.allowed) {
37
+ stmt = stmt[param.key](param.value);
38
+ }
39
+ }
40
+ }
41
+ return stmt.execute();
42
+ };
43
+ };
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9xdWVyeS9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQ0FBNkI7QUFDMUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxvQkFBaUI7QUFFdEMsTUFBTSxVQUFVLEtBQUssQ0FBQyxVQUF3QixFQUFFO0lBQzlDLE9BQU8sQ0FDTCxNQUFjLEVBQ2QsV0FBNEIsRUFDNUIsVUFBd0MsRUFDSCxFQUFFO1FBQ3ZDLDJDQUEyQztRQUMzQyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUMsVUFBVSxDQUFDLEtBQUssR0FBRyxVQUFVLEdBQUcsSUFBVztZQUN6QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FDdEQsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBRWhELElBQUksSUFBSSxHQUFJLElBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFRLENBQUM7WUFDL0MsSUFBSSxLQUFLO2dCQUFFLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BDLGdEQUFnRDtZQUNoRCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLCtCQUErQjtnQkFDL0IsbUNBQW1DO1lBQ3JDLENBQUM7WUFFRCxvQ0FBb0M7WUFDcEMsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHO2dCQUN4RCxVQUFVLEVBQUUsSUFBSTtnQkFDaEIsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixNQUFNLEVBQUUsSUFBSTtnQkFDWixHQUFHLE9BQU87YUFDSyxDQUFDO1lBRWxCLE1BQU0sTUFBTSxHQUFHO2dCQUNiLGlEQUFpRDtnQkFDakQsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUscUNBQXFDO2dCQUMzRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFO2dCQUNuRCxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFO2FBQ3ZELENBQUM7WUFFRixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUMzQixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDO3dCQUM3QixNQUFNLElBQUksVUFBVSxDQUNsQixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdDQUFnQyxDQUNuRixDQUFDO29CQUNKLENBQUM7eUJBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3pCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdEMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBRdWVyeU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTWV0aG9kUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vTWV0aG9kUXVlcnlCdWlsZGVyXCI7XG5pbXBvcnQgeyBRdWVyeUVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeShvcHRpb25zOiBRdWVyeU9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICApOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+IHwgdm9pZCA9PiB7XG4gICAgLy8gY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBwcm9wZXJ0eUtleS50b1N0cmluZygpO1xuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAgIGNvbnN0IHsgc2VsZWN0LCB3aGVyZSwgZ3JvdXBCeSwgb3JkZXJCeSwgbGltaXQsIG9mZnNldCB9ID1cbiAgICAgICAgTWV0aG9kUXVlcnlCdWlsZGVyLmJ1aWxkKG1ldGhvZE5hbWUsIC4uLmFyZ3MpO1xuXG4gICAgICBsZXQgc3RtdCA9ICh0aGlzIGFzIGFueSkuc2VsZWN0KHNlbGVjdCkgYXMgYW55O1xuICAgICAgaWYgKHdoZXJlKSBzdG10ID0gc3RtdC53aGVyZSh3aGVyZSk7XG4gICAgICAvLyBpZiAob3JkZXJCeSkgc3RtdCA9IHN0bXQub3JkZXJCeShvcmRlckJ5WzBdKTtcbiAgICAgIGlmIChncm91cEJ5KSB7XG4gICAgICAgIC8vIGdyb3VwIGJ5IG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgICAgICAgLyogc3RtdCA9IHN0bXQuZ3JvdXBCeShncm91cEJ5KTsgKi9cbiAgICAgIH1cblxuICAgICAgLy8gYWxsb3cgbGltaXQgYW5kIG9mZnNldCBieSBkZWZhdWx0XG4gICAgICBjb25zdCB7IGFsbG93TGltaXQsIGFsbG93T2Zmc2V0LCBhbGxvd09yZGVyQnksIHRocm93cyB9ID0ge1xuICAgICAgICBhbGxvd0xpbWl0OiB0cnVlLFxuICAgICAgICBhbGxvd09yZGVyQnk6IHRydWUsXG4gICAgICAgIGFsbG93T2Zmc2V0OiB0cnVlLFxuICAgICAgICB0aHJvd3M6IHRydWUsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9IGFzIFF1ZXJ5T3B0aW9ucztcblxuICAgICAgY29uc3QgcGFyYW1zID0gW1xuICAgICAgICAvLyBrZWVwIHRoZSBvcmRlciB0byBlbnN1cmUgdGhlIGV4cGVjdGVkIGJlaGF2aW9yXG4gICAgICAgIHsga2V5OiBcIm9yZGVyQnlcIiwgdmFsdWU6IChvcmRlckJ5IHx8IFtdKVswXSwgYWxsb3dlZDogYWxsb3dPcmRlckJ5IH0sIC8vIG9yZGVyQnkgb25seSBzdXBwb3J0cyBvbmUgc2VudGVuY2VcbiAgICAgICAgeyBrZXk6IFwibGltaXRcIiwgdmFsdWU6IGxpbWl0LCBhbGxvd2VkOiBhbGxvd0xpbWl0IH0sXG4gICAgICAgIHsga2V5OiBcIm9mZnNldFwiLCB2YWx1ZTogb2Zmc2V0LCBhbGxvd2VkOiBhbGxvd09mZnNldCB9LFxuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgICAgaWYgKHBhcmFtLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoIXBhcmFtLmFsbG93ZWQgJiYgdGhyb3dzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgICAgICAgYCR7cGFyYW0ua2V5WzBdLnRvVXBwZXJDYXNlKCkgKyBwYXJhbS5rZXkuc2xpY2UoMSl9IGlzIG5vdCBhbGxvd2VkIGZvciB0aGlzIHF1ZXJ5YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLmFsbG93ZWQpIHtcbiAgICAgICAgICAgIHN0bXQgPSBzdG10W3BhcmFtLmtleV0ocGFyYW0udmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RtdC5leGVjdXRlKCk7XG4gICAgfTtcbiAgfTtcbn1cbiJdfQ==
@@ -5,3 +5,7 @@ export * from "./options";
5
5
  export * from "./Paginator";
6
6
  export * from "./selectors";
7
7
  export * from "./Statement";
8
+ export * from "./decorators";
9
+ export * from "./MethodQueryBuilder";
10
+ export * from "./types";
11
+ export * from "./utils";
@@ -5,4 +5,8 @@ export * from "./options.js";
5
5
  export * from "./Paginator.js";
6
6
  export * from "./selectors.js";
7
7
  export * from "./Statement.js";
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcXVlcnkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQTRCO0FBQzVCLCtCQUE0QjtBQUM1Qiw0QkFBeUI7QUFDekIsNkJBQTBCO0FBQzFCLCtCQUE0QjtBQUM1QiwrQkFBNEI7QUFDNUIsK0JBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vQ29uZGl0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUGFnaW5hdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZWxlY3RvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1N0YXRlbWVudFwiO1xuIl19
8
+ export * from "./decorators.js";
9
+ export * from "./MethodQueryBuilder.js";
10
+ export * from "./types.js";
11
+ export * from "./utils.js";
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcXVlcnkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQTRCO0FBQzVCLCtCQUE0QjtBQUM1Qiw0QkFBeUI7QUFDekIsNkJBQTBCO0FBQzFCLCtCQUE0QjtBQUM1QiwrQkFBNEI7QUFDNUIsK0JBQTRCO0FBQzVCLGdDQUE2QjtBQUM3Qix3Q0FBcUM7QUFDckMsMkJBQXdCO0FBQ3hCLDJCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL0NvbmRpdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1BhZ2luYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2VsZWN0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9TdGF0ZW1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL01ldGhvZFF1ZXJ5QnVpbGRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG4iXX0=
@@ -0,0 +1,96 @@
1
+ import { Condition } from "./Condition";
2
+ import { OrderBySelector } from "./selectors";
3
+ /**
4
+ * @description
5
+ * Options for configuring query building behavior.
6
+ *
7
+ * @summary
8
+ * The `QueryOptions` type defines flags that determine whether certain clauses
9
+ * (limit, offset, order by) are permitted, as well as whether violations
10
+ * should throw an error during query construction.
11
+ *
12
+ * @memberOf module:query
13
+ */
14
+ export type QueryOptions = {
15
+ allowLimit?: boolean;
16
+ allowOffset?: boolean;
17
+ allowOrderBy?: boolean;
18
+ throws?: boolean;
19
+ };
20
+ /**
21
+ * @description
22
+ * Structured query object representing parsed query clauses.
23
+ *
24
+ * @summary
25
+ * The `QueryAssist` interface defines the standard structure returned
26
+ * by query builders. It includes actions such as find, optional clauses
27
+ * like select, groupBy, and orderBy, and pagination controls (limit, offset).
28
+ *
29
+ * @template T The entity or record type that conditions may apply to.
30
+ *
31
+ * @interface QueryAssist
32
+ * @memberOf module:query
33
+ */
34
+ export interface QueryAssist {
35
+ action: "find";
36
+ select: undefined | string[];
37
+ where: Condition<any>;
38
+ groupBy?: string[];
39
+ orderBy?: OrderBySelector<any>[];
40
+ limit: number | undefined;
41
+ offset: number | undefined;
42
+ }
43
+ /**
44
+ * @description
45
+ * Enumeration of supported query clauses for building method-based queries.
46
+ *
47
+ * @summary
48
+ * The `QueryClause` enum defines string literals that represent
49
+ * different segments of a query (e.g., `findBy`, `Select`, `And`, `Or`).
50
+ *
51
+ * @enum QueryClause
52
+ * @memberOf module:query
53
+ */
54
+ export declare enum QueryClause {
55
+ FIND_BY = "findBy",
56
+ SELECT = "Select",
57
+ AND = "And",
58
+ OR = "Or",
59
+ GROUP_BY = "GroupBy",
60
+ ORDER_BY = "OrderBy",
61
+ THEN = "Then",
62
+ THEN_BY = "ThenBy"
63
+ }
64
+ /**
65
+ * @description
66
+ * Function signature for parsing operators in query building.
67
+ *
68
+ * @summary
69
+ * The `OperatorParser` type represents a function that takes a field name
70
+ * and arguments, then produces a `Condition` object that can be used in a query.
71
+ *
72
+ * @template T The type of the condition result.
73
+ *
74
+ * @param field {string} - The name of the field being parsed.
75
+ * @param args {any[]} - Additional arguments for operator evaluation.
76
+ *
77
+ * @return {Condition<any>} A condition object representing the parsed operator.
78
+ *
79
+ * @memberOf module:query
80
+ */
81
+ export type OperatorParser = (field: string, ...args: any) => Condition<any>;
82
+ /**
83
+ * @description
84
+ * Descriptor for fields and their associated operators in query parsing.
85
+ *
86
+ * @summary
87
+ * The `FilterDescriptor` interface defines the structure used when parsing
88
+ * method segments into filterable fields and associated operators.
89
+ *
90
+ * @interface FilterDescriptor
91
+ * @memberOf module:query
92
+ */
93
+ export interface FilterDescriptor {
94
+ field: string;
95
+ operator?: string;
96
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @description
3
+ * Enumeration of supported query clauses for building method-based queries.
4
+ *
5
+ * @summary
6
+ * The `QueryClause` enum defines string literals that represent
7
+ * different segments of a query (e.g., `findBy`, `Select`, `And`, `Or`).
8
+ *
9
+ * @enum QueryClause
10
+ * @memberOf module:query
11
+ */
12
+ export var QueryClause;
13
+ (function (QueryClause) {
14
+ QueryClause["FIND_BY"] = "findBy";
15
+ QueryClause["SELECT"] = "Select";
16
+ QueryClause["AND"] = "And";
17
+ QueryClause["OR"] = "Or";
18
+ QueryClause["GROUP_BY"] = "GroupBy";
19
+ QueryClause["ORDER_BY"] = "OrderBy";
20
+ QueryClause["THEN"] = "Then";
21
+ QueryClause["THEN_BY"] = "ThenBy";
22
+ })(QueryClause || (QueryClause = {}));
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcXVlcnkvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNkNBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQU4sSUFBWSxXQVNYO0FBVEQsV0FBWSxXQUFXO0lBQ3JCLGlDQUFrQixDQUFBO0lBQ2xCLGdDQUFpQixDQUFBO0lBQ2pCLDBCQUFXLENBQUE7SUFDWCx3QkFBUyxDQUFBO0lBQ1QsbUNBQW9CLENBQUE7SUFDcEIsbUNBQW9CLENBQUE7SUFDcEIsNEJBQWEsQ0FBQTtJQUNiLGlDQUFrQixDQUFBO0FBQ3BCLENBQUMsRUFUVyxXQUFXLEtBQVgsV0FBVyxRQVN0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCIuL0NvbmRpdGlvblwiO1xuaW1wb3J0IHsgT3JkZXJCeVNlbGVjdG9yIH0gZnJvbSBcIi4vc2VsZWN0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyBxdWVyeSBidWlsZGluZyBiZWhhdmlvci5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBRdWVyeU9wdGlvbnNgIHR5cGUgZGVmaW5lcyBmbGFncyB0aGF0IGRldGVybWluZSB3aGV0aGVyIGNlcnRhaW4gY2xhdXNlc1xuICogKGxpbWl0LCBvZmZzZXQsIG9yZGVyIGJ5KSBhcmUgcGVybWl0dGVkLCBhcyB3ZWxsIGFzIHdoZXRoZXIgdmlvbGF0aW9uc1xuICogc2hvdWxkIHRocm93IGFuIGVycm9yIGR1cmluZyBxdWVyeSBjb25zdHJ1Y3Rpb24uXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpxdWVyeVxuICovXG5leHBvcnQgdHlwZSBRdWVyeU9wdGlvbnMgPSB7XG4gIGFsbG93TGltaXQ/OiBib29sZWFuO1xuICBhbGxvd09mZnNldD86IGJvb2xlYW47XG4gIGFsbG93T3JkZXJCeT86IGJvb2xlYW47XG4gIHRocm93cz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogU3RydWN0dXJlZCBxdWVyeSBvYmplY3QgcmVwcmVzZW50aW5nIHBhcnNlZCBxdWVyeSBjbGF1c2VzLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYFF1ZXJ5QXNzaXN0YCBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgc3RhbmRhcmQgc3RydWN0dXJlIHJldHVybmVkXG4gKiBieSBxdWVyeSBidWlsZGVycy4gSXQgaW5jbHVkZXMgYWN0aW9ucyBzdWNoIGFzIGZpbmQsIG9wdGlvbmFsIGNsYXVzZXNcbiAqIGxpa2Ugc2VsZWN0LCBncm91cEJ5LCBhbmQgb3JkZXJCeSwgYW5kIHBhZ2luYXRpb24gY29udHJvbHMgKGxpbWl0LCBvZmZzZXQpLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSBlbnRpdHkgb3IgcmVjb3JkIHR5cGUgdGhhdCBjb25kaXRpb25zIG1heSBhcHBseSB0by5cbiAqXG4gKiBAaW50ZXJmYWNlIFF1ZXJ5QXNzaXN0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlBc3Npc3Qge1xuICBhY3Rpb246IFwiZmluZFwiO1xuICBzZWxlY3Q6IHVuZGVmaW5lZCB8IHN0cmluZ1tdO1xuICB3aGVyZTogQ29uZGl0aW9uPGFueT47XG4gIGdyb3VwQnk/OiBzdHJpbmdbXTtcbiAgb3JkZXJCeT86IE9yZGVyQnlTZWxlY3Rvcjxhbnk+W107XG4gIGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIG9mZnNldDogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRW51bWVyYXRpb24gb2Ygc3VwcG9ydGVkIHF1ZXJ5IGNsYXVzZXMgZm9yIGJ1aWxkaW5nIG1ldGhvZC1iYXNlZCBxdWVyaWVzLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYFF1ZXJ5Q2xhdXNlYCBlbnVtIGRlZmluZXMgc3RyaW5nIGxpdGVyYWxzIHRoYXQgcmVwcmVzZW50XG4gKiBkaWZmZXJlbnQgc2VnbWVudHMgb2YgYSBxdWVyeSAoZS5nLiwgYGZpbmRCeWAsIGBTZWxlY3RgLCBgQW5kYCwgYE9yYCkuXG4gKlxuICogQGVudW0gUXVlcnlDbGF1c2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6cXVlcnlcbiAqL1xuZXhwb3J0IGVudW0gUXVlcnlDbGF1c2Uge1xuICBGSU5EX0JZID0gXCJmaW5kQnlcIixcbiAgU0VMRUNUID0gXCJTZWxlY3RcIixcbiAgQU5EID0gXCJBbmRcIixcbiAgT1IgPSBcIk9yXCIsXG4gIEdST1VQX0JZID0gXCJHcm91cEJ5XCIsXG4gIE9SREVSX0JZID0gXCJPcmRlckJ5XCIsXG4gIFRIRU4gPSBcIlRoZW5cIixcbiAgVEhFTl9CWSA9IFwiVGhlbkJ5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBGdW5jdGlvbiBzaWduYXR1cmUgZm9yIHBhcnNpbmcgb3BlcmF0b3JzIGluIHF1ZXJ5IGJ1aWxkaW5nLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYE9wZXJhdG9yUGFyc2VyYCB0eXBlIHJlcHJlc2VudHMgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgZmllbGQgbmFtZVxuICogYW5kIGFyZ3VtZW50cywgdGhlbiBwcm9kdWNlcyBhIGBDb25kaXRpb25gIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGluIGEgcXVlcnkuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGNvbmRpdGlvbiByZXN1bHQuXG4gKlxuICogQHBhcmFtIGZpZWxkIHtzdHJpbmd9IC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIHBhcnNlZC5cbiAqIEBwYXJhbSBhcmdzIHthbnlbXX0gLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3Igb3BlcmF0b3IgZXZhbHVhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtDb25kaXRpb248YW55Pn0gQSBjb25kaXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGFyc2VkIG9wZXJhdG9yLlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6cXVlcnlcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0b3JQYXJzZXIgPSAoZmllbGQ6IHN0cmluZywgLi4uYXJnczogYW55KSA9PiBDb25kaXRpb248YW55PjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERlc2NyaXB0b3IgZm9yIGZpZWxkcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBvcGVyYXRvcnMgaW4gcXVlcnkgcGFyc2luZy5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIGBGaWx0ZXJEZXNjcmlwdG9yYCBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgc3RydWN0dXJlIHVzZWQgd2hlbiBwYXJzaW5nXG4gKiBtZXRob2Qgc2VnbWVudHMgaW50byBmaWx0ZXJhYmxlIGZpZWxkcyBhbmQgYXNzb2NpYXRlZCBvcGVyYXRvcnMuXG4gKlxuICogQGludGVyZmFjZSBGaWx0ZXJEZXNjcmlwdG9yXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyRGVzY3JpcHRvciB7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIG9wZXJhdG9yPzogc3RyaW5nO1xufVxuIl19
@@ -0,0 +1,40 @@
1
+ import { OperatorParser } from "./types";
2
+ /**
3
+ * @description
4
+ * Map of supported operators to their corresponding parser functions.
5
+ *
6
+ * @summary
7
+ * The `OperatorsMap` defines a collection of operator names as keys
8
+ * (such as `Equals`, `LessThan`, `Between`, etc.), each mapped to a
9
+ * function that constructs a `Condition` object for that operator.
10
+ * These functions translate query clauses into concrete condition
11
+ * builders, enabling dynamic query construction from method names.
12
+ *
13
+ * @template T The type of the field values used in conditions.
14
+ *
15
+ * @param f {string} - The field name the condition applies to.
16
+ * @param v1 {any} - The value to compare the field against or the lower bound value for range-based operators.
17
+ * @param v2 {any} - The upper bound value for range-based operators.
18
+ *
19
+ * @return {Condition<any>} A condition object representing the operator applied to the field.
20
+ *
21
+ * @function OperatorsMap
22
+ *
23
+ * @mermaid
24
+ * sequenceDiagram
25
+ * participant Client as Caller
26
+ * participant Map as OperatorsMap
27
+ * participant Parser as OperatorParser
28
+ * participant Cond as Condition
29
+ *
30
+ * Client->>Map: Request operator parser ("Between", field, v1, v2)
31
+ * Map->>Parser: Call corresponding operator function
32
+ * Parser->>Cond: Condition.attribute(field)
33
+ * Cond-->>Parser: Condition instance
34
+ * Parser->>Cond: Apply gte(v1)
35
+ * Parser->>Cond: Apply and(lte(v2))
36
+ * Parser-->>Client: Return built Condition
37
+ *
38
+ * @memberOf module:query
39
+ */
40
+ export declare const OperatorsMap: Record<string, OperatorParser>;
@@ -0,0 +1,51 @@
1
+ import { Condition } from "./Condition.js";
2
+ /**
3
+ * @description
4
+ * Map of supported operators to their corresponding parser functions.
5
+ *
6
+ * @summary
7
+ * The `OperatorsMap` defines a collection of operator names as keys
8
+ * (such as `Equals`, `LessThan`, `Between`, etc.), each mapped to a
9
+ * function that constructs a `Condition` object for that operator.
10
+ * These functions translate query clauses into concrete condition
11
+ * builders, enabling dynamic query construction from method names.
12
+ *
13
+ * @template T The type of the field values used in conditions.
14
+ *
15
+ * @param f {string} - The field name the condition applies to.
16
+ * @param v1 {any} - The value to compare the field against or the lower bound value for range-based operators.
17
+ * @param v2 {any} - The upper bound value for range-based operators.
18
+ *
19
+ * @return {Condition<any>} A condition object representing the operator applied to the field.
20
+ *
21
+ * @function OperatorsMap
22
+ *
23
+ * @mermaid
24
+ * sequenceDiagram
25
+ * participant Client as Caller
26
+ * participant Map as OperatorsMap
27
+ * participant Parser as OperatorParser
28
+ * participant Cond as Condition
29
+ *
30
+ * Client->>Map: Request operator parser ("Between", field, v1, v2)
31
+ * Map->>Parser: Call corresponding operator function
32
+ * Parser->>Cond: Condition.attribute(field)
33
+ * Cond-->>Parser: Condition instance
34
+ * Parser->>Cond: Apply gte(v1)
35
+ * Parser->>Cond: Apply and(lte(v2))
36
+ * Parser-->>Client: Return built Condition
37
+ *
38
+ * @memberOf module:query
39
+ */
40
+ export const OperatorsMap = {
41
+ Equals: (f, v) => Condition.attribute(f).eq(v),
42
+ Diff: (f, v) => Condition.attribute(f).dif(v),
43
+ LessThan: (f, v) => Condition.attribute(f).lt(v),
44
+ LessThanEqual: (f, v) => Condition.attribute(f).lte(v),
45
+ GreaterThan: (f, v) => Condition.attribute(f).gt(v),
46
+ GreaterThanEqual: (f, v) => Condition.attribute(f).gte(v),
47
+ Between: (f, v1, v2) => Condition.attribute(f).gte(v1).and(Condition.attribute(f).lte(v2)),
48
+ In: (f, v) => Condition.attribute(f).in(v),
49
+ Matches: (f, v) => Condition.attribute(f).regexp(v),
50
+ };
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcXVlcnkvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSx1QkFBb0I7QUFHeEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQW1DO0lBQzFELE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0MsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hELGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RCxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkQsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekQsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUNyQixTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztDQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4vQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRvclBhcnNlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBNYXAgb2Ygc3VwcG9ydGVkIG9wZXJhdG9ycyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHBhcnNlciBmdW5jdGlvbnMuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgT3BlcmF0b3JzTWFwYCBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBvcGVyYXRvciBuYW1lcyBhcyBrZXlzXG4gKiAoc3VjaCBhcyBgRXF1YWxzYCwgYExlc3NUaGFuYCwgYEJldHdlZW5gLCBldGMuKSwgZWFjaCBtYXBwZWQgdG8gYVxuICogZnVuY3Rpb24gdGhhdCBjb25zdHJ1Y3RzIGEgYENvbmRpdGlvbmAgb2JqZWN0IGZvciB0aGF0IG9wZXJhdG9yLlxuICogVGhlc2UgZnVuY3Rpb25zIHRyYW5zbGF0ZSBxdWVyeSBjbGF1c2VzIGludG8gY29uY3JldGUgY29uZGl0aW9uXG4gKiBidWlsZGVycywgZW5hYmxpbmcgZHluYW1pYyBxdWVyeSBjb25zdHJ1Y3Rpb24gZnJvbSBtZXRob2QgbmFtZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGZpZWxkIHZhbHVlcyB1c2VkIGluIGNvbmRpdGlvbnMuXG4gKlxuICogQHBhcmFtIGYge3N0cmluZ30gLSBUaGUgZmllbGQgbmFtZSB0aGUgY29uZGl0aW9uIGFwcGxpZXMgdG8uXG4gKiBAcGFyYW0gdjEge2FueX0gLSBUaGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgZmllbGQgYWdhaW5zdCBvciB0aGUgbG93ZXIgYm91bmQgdmFsdWUgZm9yIHJhbmdlLWJhc2VkIG9wZXJhdG9ycy5cbiAqIEBwYXJhbSB2MiB7YW55fSAtIFRoZSB1cHBlciBib3VuZCB2YWx1ZSBmb3IgcmFuZ2UtYmFzZWQgb3BlcmF0b3JzLlxuICpcbiAqIEByZXR1cm4ge0NvbmRpdGlvbjxhbnk+fSBBIGNvbmRpdGlvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBvcGVyYXRvciBhcHBsaWVkIHRvIHRoZSBmaWVsZC5cbiAqXG4gKiBAZnVuY3Rpb24gT3BlcmF0b3JzTWFwXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnQgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IE1hcCBhcyBPcGVyYXRvcnNNYXBcbiAqICAgcGFydGljaXBhbnQgUGFyc2VyIGFzIE9wZXJhdG9yUGFyc2VyXG4gKiAgIHBhcnRpY2lwYW50IENvbmQgYXMgQ29uZGl0aW9uXG4gKlxuICogICBDbGllbnQtPj5NYXA6IFJlcXVlc3Qgb3BlcmF0b3IgcGFyc2VyIChcIkJldHdlZW5cIiwgZmllbGQsIHYxLCB2MilcbiAqICAgTWFwLT4+UGFyc2VyOiBDYWxsIGNvcnJlc3BvbmRpbmcgb3BlcmF0b3IgZnVuY3Rpb25cbiAqICAgUGFyc2VyLT4+Q29uZDogQ29uZGl0aW9uLmF0dHJpYnV0ZShmaWVsZClcbiAqICAgQ29uZC0tPj5QYXJzZXI6IENvbmRpdGlvbiBpbnN0YW5jZVxuICogICBQYXJzZXItPj5Db25kOiBBcHBseSBndGUodjEpXG4gKiAgIFBhcnNlci0+PkNvbmQ6IEFwcGx5IGFuZChsdGUodjIpKVxuICogICBQYXJzZXItLT4+Q2xpZW50OiBSZXR1cm4gYnVpbHQgQ29uZGl0aW9uXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpxdWVyeVxuICovXG5leHBvcnQgY29uc3QgT3BlcmF0b3JzTWFwOiBSZWNvcmQ8c3RyaW5nLCBPcGVyYXRvclBhcnNlcj4gPSB7XG4gIEVxdWFsczogKGYsIHYpID0+IENvbmRpdGlvbi5hdHRyaWJ1dGUoZikuZXEodiksXG4gIERpZmY6IChmLCB2KSA9PiBDb25kaXRpb24uYXR0cmlidXRlKGYpLmRpZih2KSxcbiAgTGVzc1RoYW46IChmLCB2KSA9PiBDb25kaXRpb24uYXR0cmlidXRlKGYpLmx0KHYpLFxuICBMZXNzVGhhbkVxdWFsOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmKS5sdGUodiksXG4gIEdyZWF0ZXJUaGFuOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmKS5ndCh2KSxcbiAgR3JlYXRlclRoYW5FcXVhbDogKGYsIHYpID0+IENvbmRpdGlvbi5hdHRyaWJ1dGUoZikuZ3RlKHYpLFxuICBCZXR3ZWVuOiAoZiwgdjEsIHYyKSA9PlxuICAgIENvbmRpdGlvbi5hdHRyaWJ1dGUoZikuZ3RlKHYxKS5hbmQoQ29uZGl0aW9uLmF0dHJpYnV0ZShmKS5sdGUodjIpKSxcbiAgSW46IChmLCB2KSA9PiBDb25kaXRpb24uYXR0cmlidXRlKGYpLmluKHYpLFxuICBNYXRjaGVzOiAoZiwgdikgPT4gQ29uZGl0aW9uLmF0dHJpYnV0ZShmKS5yZWdleHAodiksXG59O1xuIl19
package/lib/index.cjs CHANGED
@@ -42,5 +42,5 @@ __exportStar(require("./persistence/index.cjs"), exports);
42
42
  * @const VERSION
43
43
  * @memberOf module:core
44
44
  */
45
- exports.VERSION = "0.5.28";
45
+ exports.VERSION = "0.5.30";
46
46
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw4REFBK0Q7QUFDL0QsMkVBQThEO0FBRTlELGtGQUFrRjtBQUNsRixtQ0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLGlDQUFtQixFQUFFLENBQUMsQ0FBQztBQUVuRCw0QkFBNEI7QUFDNUIseURBQTZCO0FBRTdCLHVEQUEyQjtBQUMzQix5REFBNkI7QUFDN0Isb0RBQXdCO0FBQ3hCLG9EQUF3QjtBQUN4QixvREFBd0I7QUFDeEIsdURBQWlDO0FBQ2pDLHlCQUF5QjtBQUN6QiwwREFBOEI7QUFFOUI7Ozs7O0dBS0c7QUFDVSxRQUFBLE9BQU8sR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgY29yZVxuICogQGRlc2NyaXB0aW9uIENvcmUgbW9kdWxlIGZvciB0aGUgRGVjYWYgVHlwZVNjcmlwdCBmcmFtZXdvcmtcbiAqIEBzdW1tYXJ5IFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uYWwgY29tcG9uZW50cyBvZiB0aGUgRGVjYWYgZnJhbWV3b3JrLCBpbmNsdWRpbmcgaWRlbnRpdHkgbWFuYWdlbWVudCxcbiAqIG1vZGVsIGRlZmluaXRpb25zLCByZXBvc2l0b3J5IHBhdHRlcm5zLCBwZXJzaXN0ZW5jZSBsYXllciwgcXVlcnkgYnVpbGRpbmcsIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucy5cbiAqIEl0IGV4cG9ydHMgZnVuY3Rpb25hbGl0eSBmcm9tIHZhcmlvdXMgc3VibW9kdWxlcyBhbmQgc2V0cyB1cCB0aGUgaW5qZWN0YWJsZSByZWdpc3RyeSBmb3IgcmVwb3NpdG9yeSBkZWNvcmF0b3JzLlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGVzUmVnaXN0cnkgfSBmcm9tIFwiLi9yZXBvc2l0b3J5L2luamVjdGFibGVzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5cbi8vIG92ZXJyaWRlcyB0aGUgcHJldmlvdXMgSW5qZWN0YWJsZXMgcmVnaXN0cnkgdG8gZW5hYmxlIHRoZSBAcmVwb3NpdG9yeSBkZWNvcmF0b3JcbkluamVjdGFibGVzLnNldFJlZ2lzdHJ5KG5ldyBJbmplY3RhYmxlc1JlZ2lzdHJ5KCkpO1xuXG4vLyBpbXBvcnRlZCBmaXJzdCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9yZXBvc2l0b3J5XCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2lkZW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcXVlcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yYW0vUmFtQWRhcHRlclwiO1xuLy9sZWZ0IHRvIGxhc3Qgb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvblxuICogQHN1bW1hcnkgQSBjb25zdGFudCByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIGNvcmUgcGFja2FnZVxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
package/lib/index.d.ts CHANGED
@@ -19,4 +19,4 @@ export * from "./persistence";
19
19
  * @const VERSION
20
20
  * @memberOf module:core
21
21
  */
22
- export declare const VERSION = "0.5.28";
22
+ export declare const VERSION = "0.5.30";