@decaf-ts/core 0.4.1 → 0.5.0
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/dist/core.cjs +179 -168
- package/dist/core.esm.cjs +134 -134
- package/lib/esm/identity/decorators.d.ts +3 -2
- package/lib/esm/identity/decorators.js +7 -5
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/interfaces/ErrorParser.d.ts +4 -0
- package/lib/esm/interfaces/ErrorParser.js +2 -0
- package/lib/esm/interfaces/index.d.ts +1 -0
- package/lib/esm/interfaces/index.js +2 -1
- package/lib/esm/model/construction.d.ts +13 -10
- package/lib/esm/model/construction.js +8 -3
- package/lib/esm/model/decorators.d.ts +9 -8
- package/lib/esm/model/decorators.js +34 -14
- package/lib/esm/model/index.d.ts +1 -1
- package/lib/esm/model/index.js +3 -2
- package/lib/esm/persistence/Adapter.d.ts +14 -13
- package/lib/esm/persistence/Adapter.js +37 -26
- package/lib/esm/query/Clause.d.ts +2 -2
- package/lib/esm/query/ClauseFactory.d.ts +3 -3
- package/lib/esm/query/ClauseFactory.js +1 -1
- package/lib/esm/query/Paginator.d.ts +2 -2
- package/lib/esm/query/Paginator.js +4 -3
- package/lib/esm/query/Query.d.ts +1 -1
- package/lib/esm/query/Query.js +1 -1
- package/lib/esm/query/Statement.d.ts +3 -3
- package/lib/esm/query/Statement.js +1 -1
- package/lib/esm/query/errors.js +3 -3
- package/lib/esm/ram/RamAdapter.d.ts +41 -0
- package/lib/esm/ram/RamAdapter.js +230 -0
- package/lib/esm/ram/RamClauseFactory.d.ts +17 -0
- package/lib/esm/ram/RamClauseFactory.js +92 -0
- package/lib/esm/ram/RamContext.d.ts +5 -0
- package/lib/esm/ram/RamContext.js +7 -0
- package/lib/esm/ram/RamPaginator.d.ts +7 -0
- package/lib/esm/ram/RamPaginator.js +20 -0
- package/lib/esm/ram/RamSequence.d.ts +50 -0
- package/lib/esm/ram/RamSequence.js +130 -0
- package/lib/esm/ram/RamStatement.d.ts +8 -0
- package/lib/esm/ram/RamStatement.js +18 -0
- package/lib/esm/ram/clauses/FromClause.d.ts +7 -0
- package/lib/esm/ram/clauses/FromClause.js +11 -0
- package/lib/esm/ram/clauses/InsertClause.d.ts +7 -0
- package/lib/esm/ram/clauses/InsertClause.js +13 -0
- package/lib/esm/ram/clauses/OrderByClause.d.ts +7 -0
- package/lib/esm/ram/clauses/OrderByClause.js +39 -0
- package/lib/esm/ram/clauses/SelectClause.d.ts +7 -0
- package/lib/esm/ram/clauses/SelectClause.js +16 -0
- package/lib/esm/ram/clauses/ValuesClause.d.ts +7 -0
- package/lib/esm/ram/clauses/ValuesClause.js +12 -0
- package/lib/esm/ram/clauses/WhereClause.d.ts +7 -0
- package/lib/esm/ram/clauses/WhereClause.js +11 -0
- package/lib/esm/ram/clauses/index.d.ts +6 -0
- package/lib/esm/ram/clauses/index.js +7 -0
- package/lib/esm/ram/index.d.ts +9 -0
- package/lib/esm/ram/index.js +10 -0
- package/lib/esm/ram/model/RamSequence.d.ts +20 -0
- package/lib/esm/ram/model/RamSequence.js +33 -0
- package/lib/esm/ram/model/index.d.ts +1 -0
- package/lib/esm/ram/model/index.js +2 -0
- package/lib/esm/ram/types.d.ts +17 -0
- package/lib/esm/ram/types.js +2 -0
- package/lib/esm/repository/Repository.d.ts +6 -3
- package/lib/esm/repository/Repository.js +27 -15
- package/lib/esm/repository/errors.d.ts +6 -0
- package/lib/esm/repository/errors.js +12 -2
- package/lib/esm/repository/index.d.ts +0 -1
- package/lib/esm/repository/index.js +1 -2
- package/lib/identity/decorators.cjs +10 -8
- package/lib/identity/decorators.d.ts +3 -2
- package/lib/identity/index.cjs +1 -1
- package/lib/identity/utils.cjs +3 -3
- package/lib/index.cjs +2 -2
- package/lib/index.d.ts +1 -1
- package/lib/interfaces/ErrorParser.cjs +3 -0
- package/lib/interfaces/ErrorParser.d.ts +4 -0
- package/lib/interfaces/index.cjs +2 -1
- package/lib/interfaces/index.d.ts +1 -0
- package/lib/model/IdentifiedBaseModel.cjs +1 -1
- package/lib/model/construction.cjs +11 -6
- package/lib/model/construction.d.ts +13 -10
- package/lib/model/decorators.cjs +39 -19
- package/lib/model/decorators.d.ts +9 -8
- package/lib/model/index.cjs +3 -2
- package/lib/model/index.d.ts +1 -1
- package/lib/persistence/Adapter.cjs +37 -26
- package/lib/persistence/Adapter.d.ts +14 -13
- package/lib/persistence/Sequence.cjs +2 -2
- package/lib/persistence/decorators.cjs +1 -1
- package/lib/persistence/index.cjs +1 -1
- package/lib/query/Clause.cjs +1 -1
- package/lib/query/Clause.d.ts +2 -2
- package/lib/query/ClauseFactory.cjs +1 -1
- package/lib/query/ClauseFactory.d.ts +3 -3
- package/lib/query/Condition.cjs +1 -1
- package/lib/query/Paginator.cjs +4 -3
- package/lib/query/Paginator.d.ts +2 -2
- package/lib/query/Query.cjs +1 -1
- package/lib/query/Query.d.ts +1 -1
- package/lib/query/Statement.cjs +3 -3
- package/lib/query/Statement.d.ts +3 -3
- package/lib/query/clauses/FromClause.cjs +3 -3
- package/lib/query/clauses/GroupByClause.cjs +2 -2
- package/lib/query/clauses/InsertClause.cjs +3 -3
- package/lib/query/clauses/LimitClause.cjs +2 -2
- package/lib/query/clauses/OffsetClause.cjs +2 -2
- package/lib/query/clauses/OrderByClause.cjs +2 -2
- package/lib/query/clauses/SelectClause.cjs +2 -2
- package/lib/query/clauses/SelectorBasedClause.cjs +2 -2
- package/lib/query/clauses/ValuesClause.cjs +3 -3
- package/lib/query/clauses/WhereClause.cjs +4 -4
- package/lib/query/clauses/index.cjs +1 -1
- package/lib/query/errors.cjs +3 -3
- package/lib/query/index.cjs +1 -1
- package/lib/ram/RamAdapter.cjs +268 -0
- package/lib/ram/RamAdapter.d.ts +41 -0
- package/lib/ram/RamClauseFactory.cjs +96 -0
- package/lib/ram/RamClauseFactory.d.ts +17 -0
- package/lib/ram/RamContext.cjs +11 -0
- package/lib/ram/RamContext.d.ts +5 -0
- package/lib/ram/RamPaginator.cjs +24 -0
- package/lib/ram/RamPaginator.d.ts +7 -0
- package/lib/ram/RamSequence.cjs +135 -0
- package/lib/ram/RamSequence.d.ts +50 -0
- package/lib/ram/RamStatement.cjs +22 -0
- package/lib/ram/RamStatement.d.ts +8 -0
- package/lib/ram/clauses/FromClause.cjs +15 -0
- package/lib/ram/clauses/FromClause.d.ts +7 -0
- package/lib/ram/clauses/InsertClause.cjs +17 -0
- package/lib/ram/clauses/InsertClause.d.ts +7 -0
- package/lib/ram/clauses/OrderByClause.cjs +43 -0
- package/lib/ram/clauses/OrderByClause.d.ts +7 -0
- package/lib/ram/clauses/SelectClause.cjs +20 -0
- package/lib/ram/clauses/SelectClause.d.ts +7 -0
- package/lib/ram/clauses/ValuesClause.cjs +16 -0
- package/lib/ram/clauses/ValuesClause.d.ts +7 -0
- package/lib/ram/clauses/WhereClause.cjs +15 -0
- package/lib/ram/clauses/WhereClause.d.ts +7 -0
- package/lib/ram/clauses/index.cjs +23 -0
- package/lib/ram/clauses/index.d.ts +6 -0
- package/lib/ram/index.cjs +26 -0
- package/lib/ram/index.d.ts +9 -0
- package/lib/ram/model/RamSequence.cjs +36 -0
- package/lib/ram/model/RamSequence.d.ts +20 -0
- package/lib/ram/model/index.cjs +18 -0
- package/lib/ram/model/index.d.ts +1 -0
- package/lib/ram/types.cjs +3 -0
- package/lib/ram/types.d.ts +17 -0
- package/lib/repository/Repository.cjs +32 -20
- package/lib/repository/Repository.d.ts +6 -3
- package/lib/repository/decorators.cjs +1 -1
- package/lib/repository/errors.cjs +15 -3
- package/lib/repository/errors.d.ts +6 -0
- package/lib/repository/index.cjs +1 -2
- package/lib/repository/index.d.ts +0 -1
- package/lib/repository/injectables.cjs +3 -3
- package/lib/repository/utils.cjs +3 -3
- package/lib/validators/ClauseSequenceValidator.cjs +5 -5
- package/lib/validators/decorators.cjs +2 -2
- package/lib/validators/index.cjs +1 -1
- package/package.json +10 -3
- package/lib/esm/model/User.d.ts +0 -9
- package/lib/esm/model/User.js +0 -34
- package/lib/esm/repository/Context.d.ts +0 -10
- package/lib/esm/repository/Context.js +0 -12
- package/lib/model/User.cjs +0 -37
- package/lib/model/User.d.ts +0 -9
- package/lib/repository/Context.cjs +0 -16
- package/lib/repository/Context.d.ts +0 -10
@@ -0,0 +1,230 @@
|
|
1
|
+
import { RamStatement } from "./RamStatement";
|
2
|
+
import { RamClauseFactory } from "./RamClauseFactory";
|
3
|
+
import * as crypto from "node:crypto";
|
4
|
+
import { RamContext } from "./RamContext";
|
5
|
+
import { Repository } from "../repository/Repository";
|
6
|
+
import { UnsupportedError } from "../persistence/errors";
|
7
|
+
import { Adapter, PersistenceKeys } from "../persistence";
|
8
|
+
import { Paginator } from "../query/Paginator";
|
9
|
+
import { GroupOperator, Operator, QueryError, } from "../query";
|
10
|
+
import { Lock } from "@decaf-ts/transactional-decorators";
|
11
|
+
import { Decoration, Model, propMetadata, } from "@decaf-ts/decorator-validation";
|
12
|
+
import { BaseError, ConflictError, DefaultRepositoryFlags, findPrimaryKey, InternalError, NotFoundError, onCreate, OperationKeys, } from "@decaf-ts/db-decorators";
|
13
|
+
import { RamSequence } from "./RamSequence";
|
14
|
+
export async function createdByOnRamCreateUpdate(context, data, key, model) {
|
15
|
+
const uuid = context.get("UUID");
|
16
|
+
if (!uuid)
|
17
|
+
throw new UnsupportedError("This adapter does not support user identification");
|
18
|
+
model[key] = uuid;
|
19
|
+
}
|
20
|
+
const createdByKey = Repository.key(PersistenceKeys.CREATED_BY);
|
21
|
+
const updatedByKey = Repository.key(PersistenceKeys.UPDATED_BY);
|
22
|
+
Decoration.flavouredAs("ram")
|
23
|
+
.for(createdByKey)
|
24
|
+
.define(onCreate(createdByOnRamCreateUpdate), propMetadata(createdByKey, {}))
|
25
|
+
.apply();
|
26
|
+
Decoration.flavouredAs("ram")
|
27
|
+
.for(updatedByKey)
|
28
|
+
.define(onCreate(createdByOnRamCreateUpdate), propMetadata(updatedByKey, {}))
|
29
|
+
.apply();
|
30
|
+
export class RamAdapter extends Adapter {
|
31
|
+
constructor(flavour = "ram") {
|
32
|
+
super({}, flavour);
|
33
|
+
this.indexes = {};
|
34
|
+
this.lock = new Lock();
|
35
|
+
this.sequences = {};
|
36
|
+
}
|
37
|
+
async context(operation, overrides, model,
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
39
|
+
...args) {
|
40
|
+
return new RamContext(Object.assign({}, DefaultRepositoryFlags, overrides, {
|
41
|
+
affectedTables: [model.name],
|
42
|
+
writeOperation: operation !== OperationKeys.READ,
|
43
|
+
timestamp: new Date(),
|
44
|
+
operation: operation,
|
45
|
+
UUID: crypto.randomUUID(),
|
46
|
+
}));
|
47
|
+
}
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
49
|
+
async initialize(...args) {
|
50
|
+
return Promise.resolve(undefined);
|
51
|
+
}
|
52
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
53
|
+
async index(...models) {
|
54
|
+
return Promise.resolve(undefined);
|
55
|
+
}
|
56
|
+
prepare(model, pk) {
|
57
|
+
const prepared = super.prepare(model, pk);
|
58
|
+
delete prepared.record[pk];
|
59
|
+
return prepared;
|
60
|
+
}
|
61
|
+
revert(obj, clazz, pk, id) {
|
62
|
+
const res = super.revert(obj, clazz, pk, id);
|
63
|
+
return res;
|
64
|
+
}
|
65
|
+
async create(tableName, id, model) {
|
66
|
+
await this.lock.acquire();
|
67
|
+
if (!this.native[tableName])
|
68
|
+
this.native[tableName] = {};
|
69
|
+
if (id in this.native[tableName])
|
70
|
+
throw new ConflictError(`Record with id ${id} already exists in table ${tableName}`);
|
71
|
+
this.native[tableName][id] = model;
|
72
|
+
this.lock.release();
|
73
|
+
return model;
|
74
|
+
}
|
75
|
+
async read(tableName, id) {
|
76
|
+
if (!(tableName in this.native))
|
77
|
+
throw new NotFoundError(`Table ${tableName} not found`);
|
78
|
+
if (!(id in this.native[tableName]))
|
79
|
+
throw new NotFoundError(`Record with id ${id} not found in table ${tableName}`);
|
80
|
+
return this.native[tableName][id];
|
81
|
+
}
|
82
|
+
async update(tableName, id, model) {
|
83
|
+
await this.lock.acquire();
|
84
|
+
if (!(tableName in this.native))
|
85
|
+
throw new NotFoundError(`Table ${tableName} not found`);
|
86
|
+
if (!(id in this.native[tableName]))
|
87
|
+
throw new NotFoundError(`Record with id ${id} not found in table ${tableName}`);
|
88
|
+
this.native[tableName][id] = model;
|
89
|
+
this.lock.release();
|
90
|
+
return model;
|
91
|
+
}
|
92
|
+
async delete(tableName, id) {
|
93
|
+
await this.lock.acquire();
|
94
|
+
if (!(tableName in this.native))
|
95
|
+
throw new NotFoundError(`Table ${tableName} not found`);
|
96
|
+
if (!(id in this.native[tableName]))
|
97
|
+
throw new NotFoundError(`Record with id ${id} not found in table ${tableName}`);
|
98
|
+
const natived = this.native[tableName][id];
|
99
|
+
delete this.native[tableName][id];
|
100
|
+
this.lock.release();
|
101
|
+
return natived;
|
102
|
+
}
|
103
|
+
tableFor(from) {
|
104
|
+
if (typeof from === "string")
|
105
|
+
from = Model.get(from);
|
106
|
+
const table = Repository.table(from);
|
107
|
+
if (!(table in this.native))
|
108
|
+
this.native[table] = {};
|
109
|
+
return this.native[table];
|
110
|
+
}
|
111
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
112
|
+
async raw(rawInput, process) {
|
113
|
+
const { where, sort, limit, skip, from } = rawInput;
|
114
|
+
let { select } = rawInput;
|
115
|
+
const collection = this.tableFor(from);
|
116
|
+
const clazz = typeof from === "string" ? Model.get(from) : from;
|
117
|
+
const { id, props } = findPrimaryKey(new clazz());
|
118
|
+
function parseId(id) {
|
119
|
+
let result = id;
|
120
|
+
switch (props.type) {
|
121
|
+
case "Number":
|
122
|
+
result = parseInt(result);
|
123
|
+
if (isNaN(result))
|
124
|
+
throw new Error(`Invalid id ${id}`);
|
125
|
+
break;
|
126
|
+
case "BigInt":
|
127
|
+
result = BigInt(parseInt(result));
|
128
|
+
break;
|
129
|
+
case "String":
|
130
|
+
break;
|
131
|
+
default:
|
132
|
+
throw new InternalError(`Invalid id type ${props.type}. should be impossible`);
|
133
|
+
}
|
134
|
+
return result;
|
135
|
+
}
|
136
|
+
let result = Object.entries(collection).map(([pk, r]) => this.revert(r, clazz, id, parseId(pk)));
|
137
|
+
result = where ? result.filter(where) : result;
|
138
|
+
if (sort)
|
139
|
+
result = result.sort(sort);
|
140
|
+
if (skip)
|
141
|
+
result = result.slice(skip);
|
142
|
+
if (limit)
|
143
|
+
result = result.slice(0, limit);
|
144
|
+
if (select) {
|
145
|
+
select = Array.isArray(select) ? select : [select];
|
146
|
+
result = result.map((r) => Object.entries(r).reduce((acc, [key, val]) => {
|
147
|
+
if (select.includes(key))
|
148
|
+
acc[key] = val;
|
149
|
+
return acc;
|
150
|
+
}, {}));
|
151
|
+
}
|
152
|
+
return result;
|
153
|
+
}
|
154
|
+
async paginate(rawInput) {
|
155
|
+
return new (class extends Paginator {
|
156
|
+
constructor(size) {
|
157
|
+
super(undefined, size, rawInput);
|
158
|
+
}
|
159
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
160
|
+
prepare(rawStatement) {
|
161
|
+
throw new Error("Method not implemented.");
|
162
|
+
}
|
163
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
164
|
+
page(page) {
|
165
|
+
throw new Error("Method not implemented.");
|
166
|
+
}
|
167
|
+
})(10);
|
168
|
+
}
|
169
|
+
parseError(err) {
|
170
|
+
if (err instanceof BaseError)
|
171
|
+
return err;
|
172
|
+
return new InternalError(err);
|
173
|
+
}
|
174
|
+
get Clauses() {
|
175
|
+
if (!this.factory)
|
176
|
+
this.factory = new RamClauseFactory(this);
|
177
|
+
return this.factory;
|
178
|
+
}
|
179
|
+
get Statement() {
|
180
|
+
return new RamStatement(this);
|
181
|
+
}
|
182
|
+
async Sequence(options) {
|
183
|
+
return new RamSequence(options, this);
|
184
|
+
}
|
185
|
+
parseCondition(condition) {
|
186
|
+
return {
|
187
|
+
where: (m) => {
|
188
|
+
const { attr1, operator, comparison } = condition;
|
189
|
+
if ([GroupOperator.AND, GroupOperator.OR, Operator.NOT].indexOf(operator) === -1) {
|
190
|
+
switch (operator) {
|
191
|
+
case Operator.BIGGER:
|
192
|
+
return m[attr1] > comparison;
|
193
|
+
case Operator.BIGGER_EQ:
|
194
|
+
return m[attr1] >= comparison;
|
195
|
+
case Operator.DIFFERENT:
|
196
|
+
return m[attr1] !== comparison;
|
197
|
+
case Operator.EQUAL:
|
198
|
+
return m[attr1] === comparison;
|
199
|
+
case Operator.REGEXP:
|
200
|
+
if (typeof m[attr1] !== "string")
|
201
|
+
throw new QueryError(`Invalid regexp comparison on a non string attribute: ${m[attr1]}`);
|
202
|
+
return !!m[attr1].match(new RegExp(comparison, "g"));
|
203
|
+
case Operator.SMALLER:
|
204
|
+
return m[attr1] < comparison;
|
205
|
+
case Operator.SMALLER_EQ:
|
206
|
+
return m[attr1] <= comparison;
|
207
|
+
default:
|
208
|
+
throw new InternalError(`Invalid operator for standard comparisons: ${operator}`);
|
209
|
+
}
|
210
|
+
}
|
211
|
+
else if (operator === Operator.NOT) {
|
212
|
+
throw new InternalError("Not implemented");
|
213
|
+
}
|
214
|
+
else {
|
215
|
+
const op1 = this.parseCondition(attr1);
|
216
|
+
const op2 = this.parseCondition(comparison);
|
217
|
+
switch (operator) {
|
218
|
+
case GroupOperator.AND:
|
219
|
+
return op1.where(m) && op2.where(m);
|
220
|
+
case GroupOperator.OR:
|
221
|
+
return op1.where(m) || op2.where(m);
|
222
|
+
default:
|
223
|
+
throw new InternalError(`Invalid operator for And/Or comparisons: ${operator}`);
|
224
|
+
}
|
225
|
+
}
|
226
|
+
},
|
227
|
+
};
|
228
|
+
}
|
229
|
+
}
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYW0vUmFtQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQVEsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQVksTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUdMLGFBQWEsRUFDYixRQUFRLEVBQ1IsVUFBVSxHQUNYLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMxRCxPQUFPLEVBRUwsVUFBVSxFQUNWLEtBQUssRUFDTCxZQUFZLEdBQ2IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsU0FBUyxFQUNULGFBQWEsRUFDYixzQkFBc0IsRUFDdEIsY0FBYyxFQUNkLGFBQWEsRUFDYixhQUFhLEVBQ2IsUUFBUSxFQUNSLGFBQWEsR0FDZCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUMsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FROUMsT0FBbUIsRUFDbkIsSUFBTyxFQUNQLEdBQVksRUFDWixLQUFRO0lBRVIsTUFBTSxJQUFJLEdBQVcsT0FBTyxDQUFDLEdB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QUM7U0FDZSxDQUFDO0lBQ3JCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJhbUZsYWdzLCBSYW1RdWVyeSwgUmFtU3RvcmFnZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSYW1TdGF0ZW1lbnQgfSBmcm9tIFwiLi9SYW1TdGF0ZW1lbnRcIjtcbmltcG9ydCB7IFJhbUNsYXVzZUZhY3RvcnkgfSBmcm9tIFwiLi9SYW1DbGF1c2VGYWN0b3J5XCI7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBSYW1Db250ZXh0IH0gZnJvbSBcIi4vUmFtQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFJlbGF0aW9uc01ldGFkYXRhIH0gZnJvbSBcIi4uL21vZGVsL3R5cGVzXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2Vycm9yc1wiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VLZXlzLCBTZXF1ZW5jZSB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgUGFnaW5hdG9yIH0gZnJvbSBcIi4uL3F1ZXJ5L1BhZ2luYXRvclwiO1xuaW1wb3J0IHtcbiAgQ2xhdXNlRmFjdG9yeSxcbiAgQ29uZGl0aW9uLFxuICBHcm91cE9wZXJhdG9yLFxuICBPcGVyYXRvcixcbiAgUXVlcnlFcnJvcixcbn0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgTG9jayB9IGZyb20gXCJAZGVjYWYtdHMvdHJhbnNhY3Rpb25hbC1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgTW9kZWwsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmFtU2VxdWVuY2UgfSBmcm9tIFwiLi9SYW1TZXF1ZW5jZVwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgQywgRj4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJhbUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1dWlkOiBzdHJpbmcgPSBjb250ZXh0LmdldChcIlVVSURcIik7XG4gIGlmICghdXVpZClcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiVGhpcyBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgdXNlciBpZGVudGlmaWNhdGlvblwiXG4gICAgKTtcbiAgbW9kZWxba2V5XSA9IHV1aWQgYXMgTVtrZXlvZiBNXTtcbn1cblxuY29uc3QgY3JlYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuY29uc3QgdXBkYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhcInJhbVwiKVxuICAuZm9yKGNyZWF0ZWRCeUtleSlcbiAgLmRlZmluZShvbkNyZWF0ZShjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShjcmVhdGVkQnlLZXksIHt9KSlcbiAgLmFwcGx5KCk7XG5EZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFwicmFtXCIpXG4gIC5mb3IodXBkYXRlZEJ5S2V5KVxuICAuZGVmaW5lKG9uQ3JlYXRlKGNyZWF0ZWRCeU9uUmFtQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKHVwZGF0ZWRCeUtleSwge30pKVxuICAuYXBwbHkoKTtcblxuZXhwb3J0IGNsYXNzIFJhbUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPFxuICBSYW1TdG9yYWdlLFxuICBSYW1RdWVyeTxhbnk+LFxuICBSYW1GbGFncyxcbiAgQ29udGV4dDxSYW1GbGFncz5cbj4ge1xuICBwcm90ZWN0ZWQgZmFjdG9yeT86IFJhbUNsYXVzZUZhY3Rvcnk7XG5cbiAgY29uc3RydWN0b3IoZmxhdm91cjogc3RyaW5nID0gXCJyYW1cIikge1xuICAgIHN1cGVyKHt9LCBmbGF2b3VyKTtcbiAgfVxuXG4gIGFzeW5jIGNvbnRleHQ8TSBleHRlbmRzIE1vZGVsLCBDIGV4dGVuZHMgUmFtQ29udGV4dCwgRiBleHRlbmRzIFJhbUZsYWdzPihcbiAgICBvcGVyYXRpb246IGFueSxcbiAgICBvdmVycmlkZXM6IFBhcnRpYWw8UmFtRmxhZ3M+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxDPiB7XG4gICAgcmV0dXJuIG5ldyBSYW1Db250ZXh0KFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdFJlcG9zaXRvcnlGbGFncywgb3ZlcnJpZGVzLCB7XG4gICAgICAgIGFmZmVjdGVkVGFibGVzOiBbbW9kZWwubmFtZV0sXG4gICAgICAgIHdyaXRlT3BlcmF0aW9uOiBvcGVyYXRpb24gIT09IE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgVVVJRDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgIH0pIGFzIEZcbiAgICApIGFzIEM7XG4gIH1cbiAgcHJpdmF0ZSBpbmRleGVzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIFJlY29yZDxzdHJpbmcsIGFueT4+XG4gID4gPSB7fTtcblxuICBwcml2YXRlIGxvY2sgPSBuZXcgTG9jaygpO1xuXG4gIHByaXZhdGUgc2VxdWVuY2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+ID0ge307XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyBpbmRleCguLi5tb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIHBrOiBrZXlvZiBNXG4gICk6IHsgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyBpZDogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHByZXBhcmVkID0gc3VwZXIucHJlcGFyZShtb2RlbCwgcGspO1xuICAgIGRlbGV0ZSBwcmVwYXJlZC5yZWNvcmRbcGsgYXMgc3RyaW5nXTtcbiAgICByZXR1cm4gcHJlcGFyZWQ7XG4gIH1cblxuICByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+LFxuICAgIHBrOiBrZXlvZiBNLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogTSB7XG4gICAgY29uc3QgcmVzID0gc3VwZXIucmV2ZXJ0KG9iaiwgY2xhenosIHBrLCBpZCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZVt0YWJsZU5hbWVdKSB0aGlzLm5hdGl2ZVt0YWJsZU5hbWVdID0ge307XG4gICAgaWYgKGlkIGluIHRoaXMubmF0aXZlW3RhYmxlTmFtZV0pXG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IGFscmVhZHkgZXhpc3RzIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgdGhpcy5uYXRpdmVbdGFibGVOYW1lXVtpZF0gPSBtb2RlbDtcbiAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIGFzeW5jIHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBpZiAoISh0YWJsZU5hbWUgaW4gdGhpcy5uYXRpdmUpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRhYmxlICR7dGFibGVOYW1lfSBub3QgZm91bmRgKTtcbiAgICBpZiAoIShpZCBpbiB0aGlzLm5hdGl2ZVt0YWJsZU5hbWVdKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMubmF0aXZlW3RhYmxlTmFtZV1baWRdO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgYXdhaXQgdGhpcy5sb2NrLmFjcXVpcmUoKTtcbiAgICBpZiAoISh0YWJsZU5hbWUgaW4gdGhpcy5uYXRpdmUpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRhYmxlICR7dGFibGVOYW1lfSBub3QgZm91bmRgKTtcbiAgICBpZiAoIShpZCBpbiB0aGlzLm5hdGl2ZVt0YWJsZU5hbWVdKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgdGhpcy5uYXRpdmVbdGFibGVOYW1lXVtpZF0gPSBtb2RlbDtcbiAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCEodGFibGVOYW1lIGluIHRoaXMubmF0aXZlKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCEoaWQgaW4gdGhpcy5uYXRpdmVbdGFibGVOYW1lXSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IG5hdGl2ZWQgPSB0aGlzLm5hdGl2ZVt0YWJsZU5hbWVdW2lkXTtcbiAgICBkZWxldGUgdGhpcy5uYXRpdmVbdGFibGVOYW1lXVtpZF07XG4gICAgdGhpcy5sb2NrLnJlbGVhc2UoKTtcbiAgICByZXR1cm4gbmF0aXZlZDtcbiAgfVxuXG4gIHByb3RlY3RlZCB0YWJsZUZvcjxNIGV4dGVuZHMgTW9kZWw+KGZyb206IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgaWYgKHR5cGVvZiBmcm9tID09PSBcInN0cmluZ1wiKSBmcm9tID0gTW9kZWwuZ2V0KGZyb20pIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGNvbnN0IHRhYmxlID0gUmVwb3NpdG9yeS50YWJsZShmcm9tKTtcbiAgICBpZiAoISh0YWJsZSBpbiB0aGlzLm5hdGl2ZSkpIHRoaXMubmF0aXZlW3RhYmxlXSA9IHt9O1xuICAgIHJldHVybiB0aGlzLm5hdGl2ZVt0YWJsZV07XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIHJhdzxaPihyYXdJbnB1dDogUmFtUXVlcnk8YW55PiwgcHJvY2VzczogYm9vbGVhbik6IFByb21pc2U8Wj4ge1xuICAgIGNvbnN0IHsgd2hlcmUsIHNvcnQsIGxpbWl0LCBza2lwLCBmcm9tIH0gPSByYXdJbnB1dDtcbiAgICBsZXQgeyBzZWxlY3QgfSA9IHJhd0lucHV0O1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSB0aGlzLnRhYmxlRm9yKGZyb20pO1xuXG4gICAgY29uc3QgY2xhenogPSB0eXBlb2YgZnJvbSA9PT0gXCJzdHJpbmdcIiA/IE1vZGVsLmdldChmcm9tKSA6IGZyb207XG4gICAgY29uc3QgeyBpZCwgcHJvcHMgfSA9IGZpbmRQcmltYXJ5S2V5KG5ldyBjbGF6eigpKTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSWQoaWQ6IGFueSkge1xuICAgICAgbGV0IHJlc3VsdCA9IGlkO1xuICAgICAgc3dpdGNoIChwcm9wcy50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICAgICAgICByZXN1bHQgPSBwYXJzZUludChyZXN1bHQpO1xuICAgICAgICAgIGlmIChpc05hTihyZXN1bHQpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWQgJHtpZH1gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkJpZ0ludFwiOlxuICAgICAgICAgIHJlc3VsdCA9IEJpZ0ludChwYXJzZUludChyZXN1bHQpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgaWQgdHlwZSAke3Byb3BzLnR5cGV9LiBzaG91bGQgYmUgaW1wb3NzaWJsZWBcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IE9iamVjdC5lbnRyaWVzKGNvbGxlY3Rpb24pLm1hcCgoW3BrLCByXSkgPT5cbiAgICAgIHRoaXMucmV2ZXJ0KHIsIGNsYXp6LCBpZCBhcyBhbnksIHBhcnNlSWQocGspKVxuICAgICk7XG5cbiAgICByZXN1bHQgPSB3aGVyZSA/IHJlc3VsdC5maWx0ZXIod2hlcmUpIDogcmVzdWx0O1xuXG4gICAgaWYgKHNvcnQpIHJlc3VsdCA9IHJlc3VsdC5zb3J0KHNvcnQpO1xuXG4gICAgaWYgKHNraXApIHJlc3VsdCA9IHJlc3VsdC5zbGljZShza2lwKTtcbiAgICBpZiAobGltaXQpIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBsaW1pdCk7XG5cbiAgICBpZiAoc2VsZWN0KSB7XG4gICAgICBzZWxlY3QgPSBBcnJheS5pc0FycmF5KHNlbGVjdCkgPyBzZWxlY3QgOiBbc2VsZWN0XTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5tYXAoKHIpID0+XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHIpLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKChzZWxlY3QgYXMgc3RyaW5nW10pLmluY2x1ZGVzKGtleSkpIGFjY1trZXldID0gdmFsO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIHVua25vd24gYXMgWjtcbiAgfVxuXG4gIGFzeW5jIHBhZ2luYXRlPFo+KHJhd0lucHV0OiBzdHJpbmcpOiBQcm9taXNlPFBhZ2luYXRvcjxaLCBzdHJpbmc+PiB7XG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBQYWdpbmF0b3I8Wiwgc3RyaW5nPiB7XG4gICAgICBjb25zdHJ1Y3RvcihzaXplOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIodW5kZWZpbmVkIGFzIHVua25vd24gYXMgYW55LCBzaXplLCByYXdJbnB1dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBwYWdlKHBhZ2U6IG51bWJlcik6IFByb21pc2U8WltdPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgICAgfVxuICAgIH0pKDEwKTtcbiAgfVxuXG4gIHBhcnNlRXJyb3I8ViBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvcik6IFYge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnIgYXMgVjtcbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKSBhcyBWO1xuICB9XG5cbiAgZ2V0IENsYXVzZXMoKTogQ2xhdXNlRmFjdG9yeTxSYW1TdG9yYWdlLCBSYW1RdWVyeTxhbnk+LCB0eXBlb2YgdGhpcz4ge1xuICAgIGlmICghdGhpcy5mYWN0b3J5KSB0aGlzLmZhY3RvcnkgPSBuZXcgUmFtQ2xhdXNlRmFjdG9yeSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5mYWN0b3J5IGFzIGFueTtcbiAgfVxuXG4gIGdldCBTdGF0ZW1lbnQoKTogUmFtU3RhdGVtZW50PGFueT4ge1xuICAgIHJldHVybiBuZXcgUmFtU3RhdGVtZW50KHRoaXMpO1xuICB9XG5cbiAgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgUmFtU2VxdWVuY2Uob3B0aW9ucywgdGhpcyk7XG4gIH1cblxuICBwYXJzZUNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbik6IFJhbVF1ZXJ5PGFueT4ge1xuICAgIHJldHVybiB7XG4gICAgICB3aGVyZTogKG06IE1vZGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjtcbiAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yO1xuICAgICAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgICAgICBvcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yXG4gICAgICAgICAgKSA9PT0gLTFcbiAgICAgICAgKSB7XG4gICAgICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5CSUdHRVI6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA+IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkJJR0dFUl9FUTpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdID49IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkRJRkZFUkVOVDpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdICE9PSBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5FUVVBTDpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdID09PSBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5SRUdFWFA6XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gIT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgICAgICAgICAgICBgSW52YWxpZCByZWdleHAgY29tcGFyaXNvbiBvbiBhIG5vbiBzdHJpbmcgYXR0cmlidXRlOiAke21bYXR0cjEgYXMga2V5b2YgTW9kZWxdfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gISEobVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gYXMgdW5rbm93biBhcyBzdHJpbmcpLm1hdGNoKFxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoY29tcGFyaXNvbiwgXCJnXCIpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLlNNQUxMRVI6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA8IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLlNNQUxMRVJfRVE6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA8PSBjb21wYXJpc29uO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgYEludmFsaWQgb3BlcmF0b3IgZm9yIHN0YW5kYXJkIGNvbXBhcmlzb25zOiAke29wZXJhdG9yfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLk5PVCkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG9wMTogUmFtUXVlcnk8YW55PiA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uKTtcbiAgICAgICAgICBjb25zdCBvcDI6IFJhbVF1ZXJ5PGFueT4gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICAgICAgY29tcGFyaXNvbiBhcyBDb25kaXRpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgR3JvdXBPcGVyYXRvci5BTkQ6XG4gICAgICAgICAgICAgIHJldHVybiBvcDEud2hlcmUobSkgJiYgb3AyLndoZXJlKG0pO1xuICAgICAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLk9SOlxuICAgICAgICAgICAgICByZXR1cm4gb3AxLndoZXJlKG0pIHx8IG9wMi53aGVyZShtKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgIGBJbnZhbGlkIG9wZXJhdG9yIGZvciBBbmQvT3IgY29tcGFyaXNvbnM6ICR7b3BlcmF0b3J9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9IGFzIFJhbVF1ZXJ5PGFueT47XG4gIH1cbn1cbiJdfQ==
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { ClauseFactory, Condition, FromClause, FromSelector, GroupByClause, GroupBySelector, InsertClause, LimitClause, LimitSelector, OffsetClause, OffsetSelector, OrderByClause, OrderBySelector, SelectClause, SelectSelector, ValuesClause, WhereClause } from "../query";
|
2
|
+
import { RamQuery, RamStorage } from "./types";
|
3
|
+
import { RamAdapter } from "./RamAdapter";
|
4
|
+
import { RamStatement } from "./RamStatement";
|
5
|
+
import { Model } from "@decaf-ts/decorator-validation";
|
6
|
+
export declare class RamClauseFactory extends ClauseFactory<RamStorage, RamQuery<any>, RamAdapter> {
|
7
|
+
constructor(adapter: RamAdapter);
|
8
|
+
from<M extends Model>(statement: RamStatement<M>, selector: FromSelector<M>): FromClause<RamQuery<any>, M>;
|
9
|
+
groupBy(statement: RamStatement<any>, selector: GroupBySelector): GroupByClause<RamQuery<any>>;
|
10
|
+
insert<M extends Model>(): InsertClause<RamQuery<any>, M>;
|
11
|
+
limit(statement: RamStatement<any>, selector: LimitSelector): LimitClause<RamQuery<any>>;
|
12
|
+
offset(statement: RamStatement<any>, selector: OffsetSelector): OffsetClause<RamQuery<any>>;
|
13
|
+
orderBy(statement: RamStatement<any>, selector: OrderBySelector[]): OrderByClause<RamQuery<any>>;
|
14
|
+
select<M extends Model>(selector: SelectSelector | undefined): SelectClause<RamQuery<any>, M>;
|
15
|
+
values<M extends Model>(statement: RamStatement<any>, values: M[]): ValuesClause<RamQuery<any>, M>;
|
16
|
+
where(statement: RamStatement<any>, condition: Condition): WhereClause<RamQuery<any>>;
|
17
|
+
}
|
@@ -0,0 +1,92 @@
|
|
1
|
+
import { ClauseFactory, GroupByClause, LimitClause, OffsetClause, QueryError, } from "../query";
|
2
|
+
import { RamStatement } from "./RamStatement";
|
3
|
+
import { InternalError } from "@decaf-ts/db-decorators";
|
4
|
+
import { RamInsertClause } from "./clauses/InsertClause";
|
5
|
+
import { RamOrderByClause } from "./clauses/OrderByClause";
|
6
|
+
import { RamSelectClause } from "./clauses/SelectClause";
|
7
|
+
import { RamValuesClause } from "./clauses/ValuesClause";
|
8
|
+
import { RamWhereClause } from "./clauses/WhereClause";
|
9
|
+
import { RamFromClause } from "./clauses/FromClause";
|
10
|
+
export class RamClauseFactory extends ClauseFactory {
|
11
|
+
constructor(adapter) {
|
12
|
+
super(adapter);
|
13
|
+
}
|
14
|
+
from(statement, selector) {
|
15
|
+
return new RamFromClause({ statement: statement, selector: selector });
|
16
|
+
}
|
17
|
+
groupBy(statement, selector) {
|
18
|
+
return new (class extends GroupByClause {
|
19
|
+
constructor(clause) {
|
20
|
+
super(clause);
|
21
|
+
}
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
23
|
+
build(query) {
|
24
|
+
throw new InternalError("Not implemented");
|
25
|
+
}
|
26
|
+
})({
|
27
|
+
statement: statement,
|
28
|
+
selector: selector,
|
29
|
+
});
|
30
|
+
}
|
31
|
+
insert() {
|
32
|
+
return new RamInsertClause({
|
33
|
+
statement: new RamStatement(this.adapter),
|
34
|
+
});
|
35
|
+
}
|
36
|
+
limit(statement, selector) {
|
37
|
+
return new (class extends LimitClause {
|
38
|
+
constructor(clause) {
|
39
|
+
super(clause);
|
40
|
+
}
|
41
|
+
build(query) {
|
42
|
+
query.limit = this.selector;
|
43
|
+
return query;
|
44
|
+
}
|
45
|
+
})({
|
46
|
+
statement: statement,
|
47
|
+
selector: selector,
|
48
|
+
});
|
49
|
+
}
|
50
|
+
offset(statement, selector) {
|
51
|
+
return new (class extends OffsetClause {
|
52
|
+
constructor(clause) {
|
53
|
+
super(clause);
|
54
|
+
}
|
55
|
+
build(query) {
|
56
|
+
const skip = parseInt(this.selector);
|
57
|
+
if (isNaN(skip))
|
58
|
+
throw new QueryError("Failed to parse offset");
|
59
|
+
query.skip = skip;
|
60
|
+
return query;
|
61
|
+
}
|
62
|
+
})({
|
63
|
+
statement: statement,
|
64
|
+
selector: selector,
|
65
|
+
});
|
66
|
+
}
|
67
|
+
orderBy(statement, selector) {
|
68
|
+
return new RamOrderByClause({
|
69
|
+
statement: statement,
|
70
|
+
selector: selector,
|
71
|
+
});
|
72
|
+
}
|
73
|
+
select(selector) {
|
74
|
+
return new RamSelectClause({
|
75
|
+
statement: new RamStatement(this.adapter),
|
76
|
+
selector: selector,
|
77
|
+
});
|
78
|
+
}
|
79
|
+
values(statement, values) {
|
80
|
+
return new RamValuesClause({
|
81
|
+
statement: statement,
|
82
|
+
values: values,
|
83
|
+
});
|
84
|
+
}
|
85
|
+
where(statement, condition) {
|
86
|
+
return new RamWhereClause({
|
87
|
+
statement: statement,
|
88
|
+
condition: condition,
|
89
|
+
});
|
90
|
+
}
|
91
|
+
}
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtQ2xhdXNlRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYW0vUmFtQ2xhdXNlRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsYUFBYSxFQUliLGFBQWEsRUFHYixXQUFXLEVBRVgsWUFBWSxFQUlaLFVBQVUsR0FLWCxNQUFNLFVBQVUsQ0FBQztBQUdsQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxPQUFPLGdCQUFpQixTQUFRLGFBSXJDO0lBQ0MsWUFBWSxPQUFtQjtRQUM3QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVELElBQUksQ0FDRixTQUEwQixFQUMxQixRQUF5QjtRQUV6QixPQUFPLElBQUksYUFBYSxDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsT0FBTyxDQUNMLFNBQTRCLEVBQzVCLFFBQXlCO1FBRXpCLE9BQU8sSUFBSSxDQUFDLEtBQU0sU0FBUSxhQUE0QjtZQUNwRCxZQUFZLE1BQThDO2dCQUN4RCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEIsQ0FBQztZQUVELDZEQUE2RDtZQUM3RCxLQUFLLENBQUMsS0FBb0I7Z0JBQ3hCLE1BQU0sSUFBSSxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM3QyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1lBQ0QsU0FBUyxFQUFFLFNBQVM7WUFDcEIsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksZUFBZSxDQUFDO1lBQ3pCLFNBQVMsRUFBRSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQzFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQ0gsU0FBNEIsRUFDNUIsUUFBdUI7UUFFdkIsT0FBTyxJQUFJLENBQUMsS0FBTSxTQUFRLFdBQTBCO1lBQ2xELFlBQVksTUFBNEM7Z0JBQ3RELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoQixDQUFDO1lBRUQsS0FBSyxDQUFDLEtBQW9CO2dCQUN4QixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFrQixDQUFDO2dCQUN0QyxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7U0FDRixDQUFDLENBQUM7WUFDRCxTQUFTLEVBQUUsU0FBUztZQUNwQixRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUNKLFNBQTRCLEVBQzVCLFFBQXdCO1FBRXhCLE9BQU8sSUFBSSxDQUFDLEtBQU0sU0FBUSxZQUEyQjtZQUNuRCxZQUFZLE1BQTZDO2dCQUN2RCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEIsQ0FBQztZQUVELEtBQUssQ0FBQyxLQUFvQjtnQkFDeEIsTUFBTSxJQUFJLEdBQVcsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUE2QixDQUFDLENBQUM7Z0JBQ2xFLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQztvQkFBRSxNQUFNLElBQUksVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUM7Z0JBQ2hFLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7U0FDRixDQUFDLENBQUM7WUFDRCxTQUFTLEVBQUUsU0FBUztZQUNwQixRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUNMLFNBQTRCLEVBQzVCLFFBQTJCO1FBRTNCLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQztZQUMxQixTQUFTLEVBQUUsU0FBUztZQUNwQixRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUNKLFFBQW9DO1FBRXBDLE9BQU8sSUFBSSxlQUFlLENBQUM7WUFDekIsU0FBUyxFQUFFLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDekMsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FDSixTQUE0QixFQUM1QixNQUFXO1FBRVgsT0FBTyxJQUFJLGVBQWUsQ0FBSTtZQUM1QixTQUFTLEVBQUUsU0FBUztZQUNwQixNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQ0gsU0FBNEIsRUFDNUIsU0FBb0I7UUFFcEIsT0FBTyxJQUFJLGNBQWMsQ0FBQztZQUN4QixTQUFTLEVBQUUsU0FBUztZQUNwQixTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDbGF1c2VGYWN0b3J5LFxuICBDb25kaXRpb24sXG4gIEZyb21DbGF1c2UsXG4gIEZyb21TZWxlY3RvcixcbiAgR3JvdXBCeUNsYXVzZSxcbiAgR3JvdXBCeVNlbGVjdG9yLFxuICBJbnNlcnRDbGF1c2UsXG4gIExpbWl0Q2xhdXNlLFxuICBMaW1pdFNlbGVjdG9yLFxuICBPZmZzZXRDbGF1c2UsXG4gIE9mZnNldFNlbGVjdG9yLFxuICBPcmRlckJ5Q2xhdXNlLFxuICBPcmRlckJ5U2VsZWN0b3IsXG4gIFF1ZXJ5RXJyb3IsXG4gIFNlbGVjdENsYXVzZSxcbiAgU2VsZWN0U2VsZWN0b3IsXG4gIFZhbHVlc0NsYXVzZSxcbiAgV2hlcmVDbGF1c2UsXG59IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgUmFtUXVlcnksIFJhbVN0b3JhZ2UgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUmFtQWRhcHRlciB9IGZyb20gXCIuL1JhbUFkYXB0ZXJcIjtcbmltcG9ydCB7IFJhbVN0YXRlbWVudCB9IGZyb20gXCIuL1JhbVN0YXRlbWVudFwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsQXJnIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmFtSW5zZXJ0Q2xhdXNlIH0gZnJvbSBcIi4vY2xhdXNlcy9JbnNlcnRDbGF1c2VcIjtcbmltcG9ydCB7IFJhbU9yZGVyQnlDbGF1c2UgfSBmcm9tIFwiLi9jbGF1c2VzL09yZGVyQnlDbGF1c2VcIjtcbmltcG9ydCB7IFJhbVNlbGVjdENsYXVzZSB9IGZyb20gXCIuL2NsYXVzZXMvU2VsZWN0Q2xhdXNlXCI7XG5pbXBvcnQgeyBSYW1WYWx1ZXNDbGF1c2UgfSBmcm9tIFwiLi9jbGF1c2VzL1ZhbHVlc0NsYXVzZVwiO1xuaW1wb3J0IHsgUmFtV2hlcmVDbGF1c2UgfSBmcm9tIFwiLi9jbGF1c2VzL1doZXJlQ2xhdXNlXCI7XG5pbXBvcnQgeyBSYW1Gcm9tQ2xhdXNlIH0gZnJvbSBcIi4vY2xhdXNlcy9Gcm9tQ2xhdXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBSYW1DbGF1c2VGYWN0b3J5IGV4dGVuZHMgQ2xhdXNlRmFjdG9yeTxcbiAgUmFtU3RvcmFnZSxcbiAgUmFtUXVlcnk8YW55PixcbiAgUmFtQWRhcHRlclxuPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IFJhbUFkYXB0ZXIpIHtcbiAgICBzdXBlcihhZGFwdGVyKTtcbiAgfVxuXG4gIGZyb208TSBleHRlbmRzIE1vZGVsPihcbiAgICBzdGF0ZW1lbnQ6IFJhbVN0YXRlbWVudDxNPixcbiAgICBzZWxlY3RvcjogRnJvbVNlbGVjdG9yPE0+XG4gICk6IEZyb21DbGF1c2U8UmFtUXVlcnk8YW55PiwgTT4ge1xuICAgIHJldHVybiBuZXcgUmFtRnJvbUNsYXVzZSh7IHN0YXRlbWVudDogc3RhdGVtZW50LCBzZWxlY3Rvcjogc2VsZWN0b3IgfSk7XG4gIH1cblxuICBncm91cEJ5KFxuICAgIHN0YXRlbWVudDogUmFtU3RhdGVtZW50PGFueT4sXG4gICAgc2VsZWN0b3I6IEdyb3VwQnlTZWxlY3RvclxuICApOiBHcm91cEJ5Q2xhdXNlPFJhbVF1ZXJ5PGFueT4+IHtcbiAgICByZXR1cm4gbmV3IChjbGFzcyBleHRlbmRzIEdyb3VwQnlDbGF1c2U8UmFtUXVlcnk8YW55Pj4ge1xuICAgICAgY29uc3RydWN0b3IoY2xhdXNlOiBNb2RlbEFyZzxHcm91cEJ5Q2xhdXNlPFJhbVF1ZXJ5PGFueT4+Pikge1xuICAgICAgICBzdXBlcihjbGF1c2UpO1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBidWlsZChxdWVyeTogUmFtUXVlcnk8YW55Pik6IFJhbVF1ZXJ5PGFueT4ge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICBzdGF0ZW1lbnQ6IHN0YXRlbWVudCxcbiAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICB9KTtcbiAgfVxuXG4gIGluc2VydDxNIGV4dGVuZHMgTW9kZWw+KCk6IEluc2VydENsYXVzZTxSYW1RdWVyeTxhbnk+LCBNPiB7XG4gICAgcmV0dXJuIG5ldyBSYW1JbnNlcnRDbGF1c2Uoe1xuICAgICAgc3RhdGVtZW50OiBuZXcgUmFtU3RhdGVtZW50KHRoaXMuYWRhcHRlciksXG4gICAgfSk7XG4gIH1cblxuICBsaW1pdChcbiAgICBzdGF0ZW1lbnQ6IFJhbVN0YXRlbWVudDxhbnk+LFxuICAgIHNlbGVjdG9yOiBMaW1pdFNlbGVjdG9yXG4gICk6IExpbWl0Q2xhdXNlPFJhbVF1ZXJ5PGFueT4+IHtcbiAgICByZXR1cm4gbmV3IChjbGFzcyBleHRlbmRzIExpbWl0Q2xhdXNlPFJhbVF1ZXJ5PGFueT4+IHtcbiAgICAgIGNvbnN0cnVjdG9yKGNsYXVzZTogTW9kZWxBcmc8TGltaXRDbGF1c2U8UmFtUXVlcnk8YW55Pj4+KSB7XG4gICAgICAgIHN1cGVyKGNsYXVzZSk7XG4gICAgICB9XG5cbiAgICAgIGJ1aWxkKHF1ZXJ5OiBSYW1RdWVyeTxhbnk+KTogUmFtUXVlcnk8YW55PiB7XG4gICAgICAgIHF1ZXJ5LmxpbWl0ID0gdGhpcy5zZWxlY3RvciBhcyBudW1iZXI7XG4gICAgICAgIHJldHVybiBxdWVyeTtcbiAgICAgIH1cbiAgICB9KSh7XG4gICAgICBzdGF0ZW1lbnQ6IHN0YXRlbWVudCxcbiAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICB9KTtcbiAgfVxuXG4gIG9mZnNldChcbiAgICBzdGF0ZW1lbnQ6IFJhbVN0YXRlbWVudDxhbnk+LFxuICAgIHNlbGVjdG9yOiBPZmZzZXRTZWxlY3RvclxuICApOiBPZmZzZXRDbGF1c2U8UmFtUXVlcnk8YW55Pj4ge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgT2Zmc2V0Q2xhdXNlPFJhbVF1ZXJ5PGFueT4+IHtcbiAgICAgIGNvbnN0cnVjdG9yKGNsYXVzZTogTW9kZWxBcmc8T2Zmc2V0Q2xhdXNlPFJhbVF1ZXJ5PGFueT4+Pikge1xuICAgICAgICBzdXBlcihjbGF1c2UpO1xuICAgICAgfVxuXG4gICAgICBidWlsZChxdWVyeTogUmFtUXVlcnk8YW55Pik6IFJhbVF1ZXJ5PGFueT4ge1xuICAgICAgICBjb25zdCBza2lwOiBudW1iZXIgPSBwYXJzZUludCh0aGlzLnNlbGVjdG9yIGFzIHVua25vd24gYXMgc3RyaW5nKTtcbiAgICAgICAgaWYgKGlzTmFOKHNraXApKSB0aHJvdyBuZXcgUXVlcnlFcnJvcihcIkZhaWxlZCB0byBwYXJzZSBvZmZzZXRcIik7XG4gICAgICAgIHF1ZXJ5LnNraXAgPSBza2lwO1xuICAgICAgICByZXR1cm4gcXVlcnk7XG4gICAgICB9XG4gICAgfSkoe1xuICAgICAgc3RhdGVtZW50OiBzdGF0ZW1lbnQsXG4gICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgfSk7XG4gIH1cblxuICBvcmRlckJ5KFxuICAgIHN0YXRlbWVudDogUmFtU3RhdGVtZW50PGFueT4sXG4gICAgc2VsZWN0b3I6IE9yZGVyQnlTZWxlY3RvcltdXG4gICk6IE9yZGVyQnlDbGF1c2U8UmFtUXVlcnk8YW55Pj4ge1xuICAgIHJldHVybiBuZXcgUmFtT3JkZXJCeUNsYXVzZSh7XG4gICAgICBzdGF0ZW1lbnQ6IHN0YXRlbWVudCxcbiAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICB9KTtcbiAgfVxuXG4gIHNlbGVjdDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHNlbGVjdG9yOiBTZWxlY3RTZWxlY3RvciB8IHVuZGVmaW5lZFxuICApOiBTZWxlY3RDbGF1c2U8UmFtUXVlcnk8YW55PiwgTT4ge1xuICAgIHJldHVybiBuZXcgUmFtU2VsZWN0Q2xhdXNlKHtcbiAgICAgIHN0YXRlbWVudDogbmV3IFJhbVN0YXRlbWVudCh0aGlzLmFkYXB0ZXIpLFxuICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIH0pO1xuICB9XG5cbiAgdmFsdWVzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgc3RhdGVtZW50OiBSYW1TdGF0ZW1lbnQ8YW55PixcbiAgICB2YWx1ZXM6IE1bXVxuICApOiBWYWx1ZXNDbGF1c2U8UmFtUXVlcnk8YW55PiwgTT4ge1xuICAgIHJldHVybiBuZXcgUmFtVmFsdWVzQ2xhdXNlPE0+KHtcbiAgICAgIHN0YXRlbWVudDogc3RhdGVtZW50LFxuICAgICAgdmFsdWVzOiB2YWx1ZXMsXG4gICAgfSk7XG4gIH1cblxuICB3aGVyZShcbiAgICBzdGF0ZW1lbnQ6IFJhbVN0YXRlbWVudDxhbnk+LFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uXG4gICk6IFdoZXJlQ2xhdXNlPFJhbVF1ZXJ5PGFueT4+IHtcbiAgICByZXR1cm4gbmV3IFJhbVdoZXJlQ2xhdXNlKHtcbiAgICAgIHN0YXRlbWVudDogc3RhdGVtZW50LFxuICAgICAgY29uZGl0aW9uOiBjb25kaXRpb24sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import { Context } from "@decaf-ts/db-decorators";
|
2
|
+
export class RamContext extends Context {
|
3
|
+
constructor(obj) {
|
4
|
+
super(obj);
|
5
|
+
}
|
6
|
+
}
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtQ29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYW0vUmFtQ29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHbEQsTUFBTSxPQUFPLFVBQVcsU0FBUSxPQUFpQjtJQUMvQyxZQUFZLEdBQWE7UUFDdkIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmFtRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgUmFtQ29udGV4dCBleHRlbmRzIENvbnRleHQ8UmFtRmxhZ3M+IHtcbiAgY29uc3RydWN0b3Iob2JqOiBSYW1GbGFncykge1xuICAgIHN1cGVyKG9iaik7XG4gIH1cbn1cbiJdfQ==
|
@@ -0,0 +1,7 @@
|
|
1
|
+
import { RamQuery } from "./types";
|
2
|
+
import { Paginator, Statement } from "../query";
|
3
|
+
export declare class RamPaginator<V> extends Paginator<V, RamQuery<any>> {
|
4
|
+
constructor(statement: Statement<RamQuery<any>>, size: number, rawStatement: RamQuery<any>);
|
5
|
+
protected prepare(rawStatement: RamQuery<any>): RamQuery<any>;
|
6
|
+
page(page?: number, ...args: any[]): Promise<V[]>;
|
7
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import { Paginator } from "../query";
|
2
|
+
export class RamPaginator extends Paginator {
|
3
|
+
constructor(statement, size, rawStatement) {
|
4
|
+
super(statement, size, rawStatement);
|
5
|
+
}
|
6
|
+
prepare(rawStatement) {
|
7
|
+
const query = Object.assign({}, rawStatement);
|
8
|
+
query.limit = this.size;
|
9
|
+
return query;
|
10
|
+
}
|
11
|
+
async page(page = 1, ...args) {
|
12
|
+
page = this.validatePage(page);
|
13
|
+
const statement = this.prepare(this.statement);
|
14
|
+
statement.skip = (page - 1) * this.size;
|
15
|
+
const results = await this.adapter.raw(statement, false, ...args);
|
16
|
+
this._currentPage = page;
|
17
|
+
return results;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtUGFnaW5hdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JhbS9SYW1QYWdpbmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBYSxNQUFNLFVBQVUsQ0FBQztBQUVoRCxNQUFNLE9BQU8sWUFBZ0IsU0FBUSxTQUEyQjtJQUM5RCxZQUNFLFNBQW1DLEVBQ25DLElBQVksRUFDWixZQUEyQjtRQUUzQixLQUFLLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRVMsT0FBTyxDQUFDLFlBQTJCO1FBQzNDLE1BQU0sS0FBSyxHQUFrQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM3RCxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDeEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFlLENBQUMsRUFBRSxHQUFHLElBQVc7UUFDekMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3hDLE1BQU0sT0FBTyxHQUFVLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJhbVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBhZ2luYXRvciwgU3RhdGVtZW50IH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5cbmV4cG9ydCBjbGFzcyBSYW1QYWdpbmF0b3I8Vj4gZXh0ZW5kcyBQYWdpbmF0b3I8ViwgUmFtUXVlcnk8YW55Pj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBzdGF0ZW1lbnQ6IFN0YXRlbWVudDxSYW1RdWVyeTxhbnk+PixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgcmF3U3RhdGVtZW50OiBSYW1RdWVyeTxhbnk+XG4gICkge1xuICAgIHN1cGVyKHN0YXRlbWVudCwgc2l6ZSwgcmF3U3RhdGVtZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogUmFtUXVlcnk8YW55Pik6IFJhbVF1ZXJ5PGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBSYW1RdWVyeTxhbnk+ID0gT2JqZWN0LmFzc2lnbih7fSwgcmF3U3RhdGVtZW50KTtcbiAgICBxdWVyeS5saW1pdCA9IHRoaXMuc2l6ZTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICBhc3luYyBwYWdlKHBhZ2U6IG51bWJlciA9IDEsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxWW10+IHtcbiAgICBwYWdlID0gdGhpcy52YWxpZGF0ZVBhZ2UocGFnZSk7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gdGhpcy5wcmVwYXJlKHRoaXMuc3RhdGVtZW50KTtcbiAgICBzdGF0ZW1lbnQuc2tpcCA9IChwYWdlIC0gMSkgKiB0aGlzLnNpemU7XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHN0YXRlbWVudCwgZmFsc2UsIC4uLmFyZ3MpO1xuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gcGFnZTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIl19
|
@@ -0,0 +1,50 @@
|
|
1
|
+
import { Sequence as Seq } from "./model/RamSequence";
|
2
|
+
import { Sequence } from "../persistence";
|
3
|
+
import { SequenceOptions } from "../interfaces";
|
4
|
+
import { RamAdapter } from "./RamAdapter";
|
5
|
+
import { Repo } from "../repository";
|
6
|
+
export declare function parseSequenceValue(type: "Number" | "BigInt" | undefined, value: string | number | bigint): string | number | bigint;
|
7
|
+
/**
|
8
|
+
* @summary Abstract implementation of a Sequence
|
9
|
+
* @description provides the basic functionality for {@link Sequence}s
|
10
|
+
*
|
11
|
+
* @param {SequenceOptions} options
|
12
|
+
*
|
13
|
+
* @class CouchDBSequence
|
14
|
+
* @implements Sequence
|
15
|
+
*
|
16
|
+
* @category Sequences
|
17
|
+
*/
|
18
|
+
export declare class RamSequence extends Sequence {
|
19
|
+
protected repo: Repo<Seq>;
|
20
|
+
constructor(options: SequenceOptions, adapter: RamAdapter);
|
21
|
+
/**
|
22
|
+
* @summary Retrieves the current value for the sequence
|
23
|
+
* @protected
|
24
|
+
*/
|
25
|
+
current(): Promise<string | number | bigint>;
|
26
|
+
/**
|
27
|
+
* @summary Parses the {@link Sequence} value
|
28
|
+
*
|
29
|
+
* @protected
|
30
|
+
* @param value
|
31
|
+
*/
|
32
|
+
private parse;
|
33
|
+
/**
|
34
|
+
* @summary increments the sequence
|
35
|
+
* @description Sequence specific implementation
|
36
|
+
*
|
37
|
+
* @param {string | number | bigint} current
|
38
|
+
* @param count
|
39
|
+
* @protected
|
40
|
+
*/
|
41
|
+
private increment;
|
42
|
+
/**
|
43
|
+
* @summary Generates the next value in th sequence
|
44
|
+
* @description calls {@link Sequence#parse} on the current value
|
45
|
+
* followed by {@link Sequence#increment}
|
46
|
+
*
|
47
|
+
*/
|
48
|
+
next(): Promise<number | string | bigint>;
|
49
|
+
range(count: number): Promise<(number | string | bigint)[]>;
|
50
|
+
}
|