@decaf-ts/core 0.1.3 → 0.2.1

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.
Files changed (210) hide show
  1. package/README.md +4 -4
  2. package/dist/core.bundle.min.js +1 -1
  3. package/dist/esm/core.bundle.min.esm.js +1 -1
  4. package/lib/esm/identity/decorators.d.ts +4 -10
  5. package/lib/esm/identity/decorators.js +57 -1
  6. package/lib/esm/identity/index.js +3 -1
  7. package/lib/esm/identity/utils.d.ts +2 -0
  8. package/lib/esm/identity/utils.js +6 -0
  9. package/lib/esm/index.d.ts +3 -1
  10. package/lib/esm/index.js +30 -1
  11. package/lib/esm/interfaces/Builder.js +3 -0
  12. package/lib/esm/interfaces/Executor.d.ts +3 -1
  13. package/lib/esm/interfaces/Executor.js +3 -0
  14. package/lib/esm/interfaces/Observable.js +3 -0
  15. package/lib/esm/interfaces/Observer.js +3 -0
  16. package/lib/esm/interfaces/Queriable.d.ts +6 -0
  17. package/lib/esm/interfaces/Queriable.js +3 -0
  18. package/lib/esm/interfaces/RawExecutor.d.ts +4 -3
  19. package/lib/esm/interfaces/RawExecutor.js +3 -0
  20. package/lib/esm/interfaces/Sequence.d.ts +3 -2
  21. package/lib/esm/interfaces/Sequence.js +10 -0
  22. package/lib/esm/interfaces/SequenceOptions.d.ts +9 -1
  23. package/lib/esm/interfaces/SequenceOptions.js +20 -0
  24. package/lib/esm/interfaces/index.d.ts +1 -0
  25. package/lib/esm/interfaces/index.js +10 -1
  26. package/lib/esm/model/BaseModel.d.ts +2 -3
  27. package/lib/esm/model/BaseModel.js +28 -1
  28. package/lib/esm/model/decorators.d.ts +6 -5
  29. package/lib/esm/model/decorators.js +52 -1
  30. package/lib/esm/model/index.js +4 -1
  31. package/lib/esm/persistence/Adapter.d.ts +45 -14
  32. package/lib/esm/persistence/Adapter.js +178 -1
  33. package/lib/esm/persistence/constants.d.ts +10 -1
  34. package/lib/esm/persistence/constants.js +13 -1
  35. package/lib/esm/persistence/decorators.d.ts +1 -2
  36. package/lib/esm/persistence/decorators.js +10 -1
  37. package/lib/esm/persistence/errors.d.ts +4 -0
  38. package/lib/esm/persistence/errors.js +8 -0
  39. package/lib/esm/persistence/index.d.ts +1 -1
  40. package/lib/esm/persistence/index.js +6 -1
  41. package/lib/esm/query/Clause.d.ts +43 -0
  42. package/lib/esm/query/Clause.js +76 -0
  43. package/lib/esm/query/ClauseFactory.d.ts +71 -0
  44. package/lib/esm/query/ClauseFactory.js +7 -0
  45. package/lib/esm/query/Condition.d.ts +75 -0
  46. package/lib/esm/query/Condition.js +248 -0
  47. package/lib/esm/query/Query.d.ts +43 -0
  48. package/lib/esm/query/Query.js +55 -0
  49. package/lib/esm/query/Statement.d.ts +49 -0
  50. package/lib/esm/query/Statement.js +158 -0
  51. package/lib/esm/query/clauses/FromClause.d.ts +45 -0
  52. package/lib/esm/query/clauses/FromClause.js +60 -0
  53. package/lib/esm/query/clauses/GroupByClause.d.ts +21 -0
  54. package/lib/esm/query/clauses/GroupByClause.js +20 -0
  55. package/lib/esm/query/clauses/InsertClause.d.ts +37 -0
  56. package/lib/esm/query/clauses/InsertClause.js +56 -0
  57. package/lib/esm/query/clauses/LimitClause.d.ts +29 -0
  58. package/lib/esm/query/clauses/LimitClause.js +28 -0
  59. package/lib/esm/query/clauses/OffsetClause.d.ts +21 -0
  60. package/lib/esm/query/clauses/OffsetClause.js +20 -0
  61. package/lib/esm/query/clauses/OrderByClause.d.ts +37 -0
  62. package/lib/esm/query/clauses/OrderByClause.js +40 -0
  63. package/lib/esm/query/clauses/SelectClause.d.ts +47 -0
  64. package/lib/esm/query/clauses/SelectClause.js +63 -0
  65. package/lib/esm/query/clauses/SelectorBasedClause.d.ts +25 -0
  66. package/lib/esm/query/clauses/SelectorBasedClause.js +45 -0
  67. package/lib/esm/query/clauses/ValuesClause.d.ts +21 -0
  68. package/lib/esm/query/clauses/ValuesClause.js +37 -0
  69. package/lib/esm/query/clauses/WhereClause.d.ts +46 -0
  70. package/lib/esm/query/clauses/WhereClause.js +72 -0
  71. package/lib/esm/query/clauses/index.d.ts +10 -0
  72. package/lib/esm/query/clauses/index.js +12 -0
  73. package/lib/esm/query/constants.d.ts +79 -0
  74. package/lib/esm/query/constants.js +88 -0
  75. package/lib/esm/query/errors.d.ts +4 -0
  76. package/lib/esm/query/errors.js +8 -0
  77. package/lib/esm/query/index.d.ts +11 -0
  78. package/lib/esm/query/index.js +13 -0
  79. package/lib/esm/query/options.d.ts +371 -0
  80. package/lib/esm/query/options.js +3 -0
  81. package/lib/esm/query/selectors.d.ts +38 -0
  82. package/lib/esm/query/selectors.js +3 -0
  83. package/lib/esm/query/types.d.ts +2 -0
  84. package/lib/esm/query/types.js +3 -0
  85. package/lib/esm/repository/Repository.d.ts +31 -11
  86. package/lib/esm/repository/Repository.js +275 -1
  87. package/lib/esm/repository/constants.js +31 -1
  88. package/lib/esm/repository/decorators.d.ts +2 -3
  89. package/lib/esm/repository/decorators.js +23 -1
  90. package/lib/esm/repository/errors.js +16 -1
  91. package/lib/esm/repository/index.d.ts +1 -0
  92. package/lib/esm/repository/index.js +9 -1
  93. package/lib/esm/repository/injectables.d.ts +5 -0
  94. package/lib/esm/repository/injectables.js +32 -0
  95. package/lib/esm/repository/types.d.ts +3 -0
  96. package/lib/esm/repository/types.js +3 -0
  97. package/lib/esm/repository/utils.d.ts +2 -4
  98. package/lib/esm/repository/utils.js +17 -1
  99. package/lib/esm/validators/ClauseSequenceValidator.d.ts +28 -0
  100. package/lib/esm/validators/ClauseSequenceValidator.js +96 -0
  101. package/lib/esm/validators/decorators.d.ts +10 -0
  102. package/lib/esm/validators/decorators.js +25 -0
  103. package/lib/esm/validators/index.d.ts +2 -0
  104. package/lib/esm/validators/index.js +4 -0
  105. package/lib/identity/decorators.cjs +61 -1
  106. package/lib/identity/decorators.d.ts +4 -10
  107. package/lib/identity/index.cjs +19 -1
  108. package/lib/identity/utils.cjs +9 -0
  109. package/lib/identity/utils.d.ts +2 -0
  110. package/lib/index.cjs +47 -1
  111. package/lib/index.d.ts +3 -1
  112. package/lib/interfaces/Builder.cjs +4 -1
  113. package/lib/interfaces/Executor.cjs +4 -1
  114. package/lib/interfaces/Executor.d.ts +3 -1
  115. package/lib/interfaces/Observable.cjs +4 -1
  116. package/lib/interfaces/Observer.cjs +4 -1
  117. package/lib/interfaces/Queriable.cjs +4 -0
  118. package/lib/interfaces/Queriable.d.ts +6 -0
  119. package/lib/interfaces/RawExecutor.cjs +4 -1
  120. package/lib/interfaces/RawExecutor.d.ts +4 -3
  121. package/lib/interfaces/Sequence.cjs +11 -1
  122. package/lib/interfaces/Sequence.d.ts +3 -2
  123. package/lib/interfaces/SequenceOptions.cjs +23 -1
  124. package/lib/interfaces/SequenceOptions.d.ts +9 -1
  125. package/lib/interfaces/index.cjs +26 -1
  126. package/lib/interfaces/index.d.ts +1 -0
  127. package/lib/model/BaseModel.cjs +32 -1
  128. package/lib/model/BaseModel.d.ts +2 -3
  129. package/lib/model/decorators.cjs +59 -1
  130. package/lib/model/decorators.d.ts +6 -5
  131. package/lib/model/index.cjs +20 -1
  132. package/lib/persistence/Adapter.cjs +182 -1
  133. package/lib/persistence/Adapter.d.ts +45 -14
  134. package/lib/persistence/constants.cjs +16 -1
  135. package/lib/persistence/constants.d.ts +10 -1
  136. package/lib/persistence/decorators.cjs +13 -1
  137. package/lib/persistence/decorators.d.ts +1 -2
  138. package/lib/persistence/errors.cjs +12 -0
  139. package/lib/persistence/errors.d.ts +4 -0
  140. package/lib/persistence/index.cjs +22 -1
  141. package/lib/persistence/index.d.ts +1 -1
  142. package/lib/query/Clause.cjs +80 -0
  143. package/lib/query/Clause.d.ts +43 -0
  144. package/lib/query/ClauseFactory.cjs +11 -0
  145. package/lib/query/ClauseFactory.d.ts +71 -0
  146. package/lib/query/Condition.cjs +252 -0
  147. package/lib/query/Condition.d.ts +75 -0
  148. package/lib/query/Query.cjs +59 -0
  149. package/lib/query/Query.d.ts +43 -0
  150. package/lib/query/Statement.cjs +162 -0
  151. package/lib/query/Statement.d.ts +49 -0
  152. package/lib/query/clauses/FromClause.cjs +64 -0
  153. package/lib/query/clauses/FromClause.d.ts +45 -0
  154. package/lib/query/clauses/GroupByClause.cjs +24 -0
  155. package/lib/query/clauses/GroupByClause.d.ts +21 -0
  156. package/lib/query/clauses/InsertClause.cjs +60 -0
  157. package/lib/query/clauses/InsertClause.d.ts +37 -0
  158. package/lib/query/clauses/LimitClause.cjs +32 -0
  159. package/lib/query/clauses/LimitClause.d.ts +29 -0
  160. package/lib/query/clauses/OffsetClause.cjs +24 -0
  161. package/lib/query/clauses/OffsetClause.d.ts +21 -0
  162. package/lib/query/clauses/OrderByClause.cjs +44 -0
  163. package/lib/query/clauses/OrderByClause.d.ts +37 -0
  164. package/lib/query/clauses/SelectClause.cjs +67 -0
  165. package/lib/query/clauses/SelectClause.d.ts +47 -0
  166. package/lib/query/clauses/SelectorBasedClause.cjs +49 -0
  167. package/lib/query/clauses/SelectorBasedClause.d.ts +25 -0
  168. package/lib/query/clauses/ValuesClause.cjs +41 -0
  169. package/lib/query/clauses/ValuesClause.d.ts +21 -0
  170. package/lib/query/clauses/WhereClause.cjs +76 -0
  171. package/lib/query/clauses/WhereClause.d.ts +46 -0
  172. package/lib/query/clauses/index.cjs +28 -0
  173. package/lib/query/clauses/index.d.ts +10 -0
  174. package/lib/query/constants.cjs +91 -0
  175. package/lib/query/constants.d.ts +79 -0
  176. package/lib/query/errors.cjs +12 -0
  177. package/lib/query/errors.d.ts +4 -0
  178. package/lib/query/index.cjs +29 -0
  179. package/lib/query/index.d.ts +11 -0
  180. package/lib/query/options.cjs +4 -0
  181. package/lib/query/options.d.ts +371 -0
  182. package/lib/query/selectors.cjs +4 -0
  183. package/lib/query/selectors.d.ts +38 -0
  184. package/lib/query/types.cjs +4 -0
  185. package/lib/query/types.d.ts +2 -0
  186. package/lib/repository/Repository.cjs +279 -1
  187. package/lib/repository/Repository.d.ts +31 -11
  188. package/lib/repository/constants.cjs +34 -1
  189. package/lib/repository/decorators.cjs +26 -1
  190. package/lib/repository/decorators.d.ts +2 -3
  191. package/lib/repository/errors.cjs +20 -1
  192. package/lib/repository/index.cjs +25 -1
  193. package/lib/repository/index.d.ts +1 -0
  194. package/lib/repository/injectables.cjs +36 -0
  195. package/lib/repository/injectables.d.ts +5 -0
  196. package/lib/repository/types.cjs +4 -1
  197. package/lib/repository/types.d.ts +3 -0
  198. package/lib/repository/utils.cjs +20 -1
  199. package/lib/repository/utils.d.ts +3 -0
  200. package/lib/validators/ClauseSequenceValidator.cjs +99 -0
  201. package/lib/validators/ClauseSequenceValidator.d.ts +28 -0
  202. package/lib/validators/decorators.cjs +28 -0
  203. package/lib/validators/decorators.d.ts +10 -0
  204. package/lib/validators/index.cjs +20 -0
  205. package/lib/validators/index.d.ts +2 -0
  206. package/package.json +14 -11
  207. package/lib/esm/persistence/utils.d.ts +0 -3
  208. package/lib/esm/persistence/utils.js +0 -1
  209. package/lib/persistence/utils.cjs +0 -1
  210. package/lib/persistence/utils.d.ts +0 -3
@@ -1 +1,275 @@
1
- import{DBKeys,enforceDBDecorators,findModelId,findPrimaryKey,getDBKey,InternalError,OperationKeys,Repository as Rep,ValidationError}from"@decaf-ts/db-decorators";import{ObserverError}from"./errors";import{Adapter}from"../persistence/Adapter";import{getTableName}from"./utils";import{getPersistenceKey}from"../persistence/decorators";import{PersistenceKeys}from"../persistence/constants";class Repository extends Rep{get adapter(){if(this._adapter)return this._adapter;throw new InternalError("No adapter found for this repository. did you use the @uses decorator or pass it in the constructor?")}get tableName(){return this._tableName||(this._tableName=getTableName(this.class)),this._tableName}get pk(){return this._pk||(this._pk=findPrimaryKey(new this.class).id),this._pk}constructor(e,r){super(r),this.observers=[],e&&(this._adapter=e)}async create(e,...r){var{record:e,id:t}=await this.adapter.prepare(e,this.pk),e=await this.adapter.create(this.tableName,t,e,...r);return this.adapter.revert(e,this.class,this.pk,t)}async read(e,...r){r=await this.adapter.read(this.tableName,e,...r);return this.adapter.revert(r,this.class,this.pk,e)}async update(e,...r){var{record:e,id:t}=await this.adapter.prepare(e,this.pk),e=await this.adapter.update(this.tableName,t,e,...r);return this.adapter.revert(e,this.class,this.pk,t)}async updatePrefix(e,...r){e=new this.class(e);var t=findModelId(e),t=await this.read(t),s=(await enforceDBDecorators(this,e,OperationKeys.UPDATE,OperationKeys.ON,t),e.hasErrors(t));if(s)throw new ValidationError(s.toString());return t[PersistenceKeys.METADATA]&&!e[PersistenceKeys.METADATA]&&Object.defineProperty(e,PersistenceKeys.METADATA,{enumerable:!1,writable:!1,configurable:!0,value:t[PersistenceKeys.METADATA]}),[e,...r]}async delete(e,...r){r=await this.adapter.delete(this.tableName,e,...r);return this.adapter.revert(r,this.class,this.pk,e)}observe(e){if(-1!==this.observers.indexOf(e))throw new InternalError("Observer already registered");this.observers.push(e)}unObserve(e){e=this.observers.indexOf(e);if(-1===e)throw new InternalError("Failed to find Observer");this.observers.splice(e,1)}async updateObservers(...t){return new Promise((e,r)=>{Promise.all(this.observers.map(e=>e.refresh(...t))).then(()=>{e()}).catch(e=>r(new ObserverError(e)))})}static forModel(r){var e=Reflect.getMetadata(getDBKey(DBKeys.REPOSITORY),r.constructor);if(!e)throw new InternalError("No registered repository found for model "+r.constructor.name);var t=Reflect.getMetadata(getPersistenceKey(PersistenceKeys.ADAPTER),e.constructor);if(!t)throw new InternalError("No registered persistence adapter found for model "+r.constructor.name);var s=Adapter.get(t);if(!s)throw new InternalError("No registered persistence adapter found flavour "+t);let a;try{a=e(s)}catch(e){throw new InternalError(`Failed to boot repository for ${r.constructor.name} using persistence adapter `+t)}return a}}export{Repository};
1
+ import { DBKeys, enforceDBDecorators, findModelId, findPrimaryKey, InternalError, OperationKeys, Repository as Rep, ValidationError, wrapMethod, } from "@decaf-ts/db-decorators";
2
+ import { ObserverError } from "./errors";
3
+ import { Adapter } from "../persistence/Adapter";
4
+ import { Model } from "@decaf-ts/decorator-validation";
5
+ import { PersistenceKeys } from "../persistence/constants";
6
+ import { Query, } from "../query";
7
+ import { OrderDirection } from "./constants";
8
+ import { sequenceNameForModel } from "../identity/utils";
9
+ import { getAllPropertyDecorators } from "@decaf-ts/reflection";
10
+ export class Repository extends Rep {
11
+ static { this._cache = {}; }
12
+ get adapter() {
13
+ if (!this._adapter)
14
+ throw new InternalError(`No adapter found for this repository. did you use the @uses decorator or pass it in the constructor?`);
15
+ return this._adapter;
16
+ }
17
+ get tableName() {
18
+ if (!this._tableName)
19
+ this._tableName = Repository.table(this.class);
20
+ return this._tableName;
21
+ }
22
+ get pk() {
23
+ if (!this._pk)
24
+ this._pk = findPrimaryKey(new this.class()).id;
25
+ return this._pk;
26
+ }
27
+ constructor(adapter, clazz) {
28
+ super(clazz);
29
+ this.observers = [];
30
+ if (adapter)
31
+ this._adapter = adapter;
32
+ [this.createAll, this.readAll, this.updateAll, this.deleteAll].forEach((m) => {
33
+ const name = m.name;
34
+ wrapMethod(this, this[name + "Prefix"], m, this[name + "Suffix"]);
35
+ });
36
+ }
37
+ async create(model, ...args) {
38
+ // eslint-disable-next-line prefer-const
39
+ let { record, id } = this.adapter.prepare(model, this.pk);
40
+ record = await this.adapter.create(this.tableName, id, record, ...args);
41
+ return this.adapter.revert(record, this.class, this.pk, id);
42
+ }
43
+ async createAll(models, ...args) {
44
+ if (!models.length)
45
+ return models;
46
+ const prepared = models.map((m) => this.adapter.prepare(m, this.pk));
47
+ const ids = prepared.map((p) => p.id);
48
+ let records = prepared.map((p) => p.record);
49
+ records = await this.adapter.createAll(this.tableName, ids, records, ...args);
50
+ return records.map((r, i) => this.adapter.revert(r, this.class, this.pk, ids[i]));
51
+ }
52
+ async createAllPrefix(models, ...args) {
53
+ if (!models.length)
54
+ return [models, ...args];
55
+ const opts = Repository.getSequenceOptions(models[0]);
56
+ let ids = [];
57
+ if (opts.type) {
58
+ if (!opts.name)
59
+ opts.name = sequenceNameForModel(models[0], "pk");
60
+ ids = await (await this.adapter.Sequence(opts)).range(models.length);
61
+ }
62
+ const pk = findPrimaryKey(models[0]).id;
63
+ models = await Promise.all(models.map(async (m, i) => {
64
+ m = new this.class(m);
65
+ m[pk] = ids[i];
66
+ await enforceDBDecorators(this, m, OperationKeys.CREATE, OperationKeys.ON);
67
+ return m;
68
+ }));
69
+ const errors = models
70
+ .map((m) => m.hasErrors())
71
+ .reduce((accum, e, i) => {
72
+ if (e)
73
+ accum =
74
+ typeof accum === "string"
75
+ ? accum + `\n - ${i}: ${e.toString()}`
76
+ : ` - ${i}: ${e.toString()}`;
77
+ return accum;
78
+ }, undefined);
79
+ if (errors)
80
+ throw new ValidationError(errors);
81
+ return [models, ...args];
82
+ }
83
+ async read(id, ...args) {
84
+ const m = await this.adapter.read(this.tableName, id, ...args);
85
+ return this.adapter.revert(m, this.class, this.pk, id);
86
+ }
87
+ async update(model, ...args) {
88
+ // eslint-disable-next-line prefer-const
89
+ let { record, id } = await this.adapter.prepare(model, this.pk);
90
+ record = await this.adapter.update(this.tableName, id, record, ...args);
91
+ return this.adapter.revert(record, this.class, this.pk, id);
92
+ }
93
+ async updatePrefix(model, ...args) {
94
+ const pk = findModelId(model);
95
+ const oldModel = await this.read(pk);
96
+ model = this.merge(oldModel, model);
97
+ await enforceDBDecorators(this, model, OperationKeys.UPDATE, OperationKeys.ON, oldModel);
98
+ const errors = model.hasErrors(oldModel);
99
+ if (errors)
100
+ throw new ValidationError(errors.toString());
101
+ if (Repository.getMetadata(oldModel)) {
102
+ if (!Repository.getMetadata(model))
103
+ Repository.setMetadata(model, Repository.getMetadata(oldModel));
104
+ }
105
+ return [model, ...args];
106
+ }
107
+ async updateAllPrefix(models, ...args) {
108
+ const ids = models.map((m) => findModelId(m));
109
+ const oldModels = await this.readAll(ids);
110
+ models = models.map((m, i) => {
111
+ m = this.merge(oldModels[i], m);
112
+ if (Repository.getMetadata(oldModels[i])) {
113
+ if (!Repository.getMetadata(m))
114
+ Repository.setMetadata(m, Repository.getMetadata(oldModels[i]));
115
+ }
116
+ return m;
117
+ });
118
+ await Promise.all(models.map((m, i) => enforceDBDecorators(this, m, OperationKeys.UPDATE, OperationKeys.ON, oldModels[i])));
119
+ const errors = models
120
+ .map((m, i) => m.hasErrors(oldModels[i], m))
121
+ .reduce((accum, e, i) => {
122
+ if (e)
123
+ accum =
124
+ typeof accum === "string"
125
+ ? accum + `\n - ${i}: ${e.toString()}`
126
+ : ` - ${i}: ${e.toString()}`;
127
+ return accum;
128
+ }, undefined);
129
+ if (errors)
130
+ throw new ValidationError(errors);
131
+ return [models, ...args];
132
+ }
133
+ async delete(id, ...args) {
134
+ const m = await this.adapter.delete(this.tableName, id, ...args);
135
+ return this.adapter.revert(m, this.class, this.pk, id);
136
+ }
137
+ select(selector) {
138
+ return new Query(this.adapter).select(selector).from(this.class);
139
+ }
140
+ async query(condition, orderBy, order = OrderDirection.ASC, limit, skip) {
141
+ const sort = [orderBy, order];
142
+ const query = this.select().where(condition).orderBy(sort);
143
+ if (limit)
144
+ query.limit(limit);
145
+ if (skip)
146
+ query.offset(skip);
147
+ return query.execute();
148
+ }
149
+ /**
150
+ * @summary Registers an {@link Observer}
151
+ * @param {Observer} observer
152
+ *
153
+ * @see {Observable#observe}
154
+ */
155
+ observe(observer) {
156
+ const index = this.observers.indexOf(observer);
157
+ if (index !== -1)
158
+ throw new InternalError("Observer already registered");
159
+ this.observers.push(observer);
160
+ }
161
+ /**
162
+ * @summary Unregisters an {@link Observer}
163
+ * @param {Observer} observer
164
+ *
165
+ * @see {Observable#unObserve}
166
+ */
167
+ unObserve(observer) {
168
+ const index = this.observers.indexOf(observer);
169
+ if (index === -1)
170
+ throw new InternalError("Failed to find Observer");
171
+ this.observers.splice(index, 1);
172
+ }
173
+ /**
174
+ * @summary calls all registered {@link Observer}s to update themselves
175
+ * @param {any[]} [args] optional arguments to be passed to the {@link Observer#refresh} method
176
+ */
177
+ async updateObservers(...args) {
178
+ return new Promise((resolve, reject) => {
179
+ Promise.all(this.observers.map((o) => o.refresh(...args)))
180
+ .then(() => {
181
+ resolve();
182
+ })
183
+ .catch((e) => reject(new ObserverError(e)));
184
+ });
185
+ }
186
+ static forModel(model) {
187
+ const repoName = Reflect.getMetadata(Repository.key(DBKeys.REPOSITORY), model);
188
+ let flavour = Reflect.getMetadata(Adapter.key(PersistenceKeys.ADAPTER), model);
189
+ let adapter = flavour
190
+ ? Adapter.get(flavour)
191
+ : undefined;
192
+ let repoConstructor;
193
+ if (!repoName) {
194
+ if (!adapter)
195
+ throw new InternalError(`Cannot boot a standard repository without an adapter definition. Did you @use on the model ${model.name}`);
196
+ repoConstructor = Repository;
197
+ }
198
+ else {
199
+ repoConstructor = this.get(repoName);
200
+ flavour =
201
+ flavour ||
202
+ Reflect.getMetadata(Adapter.key(PersistenceKeys.ADAPTER), repoConstructor);
203
+ if (!flavour)
204
+ throw new InternalError(`No registered persistence adapter found for model ${model.name}`);
205
+ adapter = Adapter.get(flavour);
206
+ }
207
+ if (!adapter)
208
+ throw new InternalError(`No registered persistence adapter found flavour ${flavour}`);
209
+ return new repoConstructor(adapter, model);
210
+ }
211
+ static get(name) {
212
+ if (name in this._cache)
213
+ return this._cache[name];
214
+ throw new InternalError(`Could not find repository registered under ${name}`);
215
+ }
216
+ static register(name, repo) {
217
+ if (name in this._cache)
218
+ throw new InternalError(`${name} already registered as a repository`);
219
+ this._cache[name] = repo;
220
+ }
221
+ static setMetadata(model, metadata) {
222
+ Object.defineProperty(model, PersistenceKeys.METADATA, {
223
+ enumerable: false,
224
+ configurable: true,
225
+ writable: false,
226
+ value: metadata,
227
+ });
228
+ }
229
+ static getMetadata(model) {
230
+ const descriptor = Object.getOwnPropertyDescriptor(model, PersistenceKeys.METADATA);
231
+ return descriptor ? descriptor.value : undefined;
232
+ }
233
+ static removeMetadata(model) {
234
+ const descriptor = Object.getOwnPropertyDescriptor(model, PersistenceKeys.METADATA);
235
+ if (descriptor)
236
+ delete model[PersistenceKeys.METADATA];
237
+ }
238
+ static getSequenceOptions(model) {
239
+ const pk = findPrimaryKey(model).id;
240
+ const metadata = Reflect.getMetadata(Repository.key(DBKeys.ID), model, pk);
241
+ if (!metadata)
242
+ throw new InternalError("No sequence options defined for model. did you use the @pk decorator?");
243
+ return metadata;
244
+ }
245
+ static indexes(model) {
246
+ const indexDecorators = getAllPropertyDecorators(model instanceof Model ? model : new model(), DBKeys.REFLECT);
247
+ return Object.entries(indexDecorators || {}).reduce((accum, [k, val]) => {
248
+ const decs = val.filter((v) => v.key.startsWith(PersistenceKeys.INDEX));
249
+ if (decs && decs.length) {
250
+ for (const dec of decs) {
251
+ const { key, props } = dec;
252
+ accum[k] = accum[k] || {};
253
+ accum[k][key] = props;
254
+ }
255
+ }
256
+ return accum;
257
+ }, {});
258
+ }
259
+ static table(model) {
260
+ const metadata = Reflect.getMetadata(Adapter.key(PersistenceKeys.TABLE), model instanceof Model ? model.constructor : model);
261
+ if (metadata) {
262
+ return metadata;
263
+ }
264
+ if (model instanceof Model) {
265
+ return model.constructor.name;
266
+ }
267
+ return model.name;
268
+ }
269
+ static column(model, attribute) {
270
+ const metadata = Reflect.getMetadata(Adapter.key(PersistenceKeys.COLUMN), model, attribute);
271
+ return metadata ? metadata : attribute;
272
+ }
273
+ }
274
+
275
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L1JlcG9zaXRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGNBQWMsRUFDZCxhQUFhLEVBQ2IsYUFBYSxFQUNiLFVBQVUsSUFBSSxHQUFHLEVBQ2pCLGVBQWUsRUFDZixVQUFVLEdBQ1gsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBR3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQWUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFHTCxLQUFLLEdBR04sTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUdoRSxNQUFNLE9BQU8sVUFDWCxTQUFRLEdBQU07YUFHQyxXQUFNLEdBQ25CLEVBRG1CLEFBQ2pCLENBQUM7SUFRTCxJQUFJLE9BQU87UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDaEIsTUFBTSxJQUFJLGFBQWEsQ0FDckIsc0dBQXNHLENBQ3ZHLENBQUM7UUFDSixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQWMsU0FBUztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBYyxFQUFFO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxZQUFZLE9BQXlCLEVBQUUsS0FBc0I7UUFDM0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBekJQLGNBQVMsR0FBZSxFQUFFLENBQUM7UUEwQmpDLElBQUksT0FBTztZQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3JDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FDcEUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNKLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDcEIsVUFBVSxDQUNSLElBQUksRUFDSCxJQUFZLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxFQUM5QixDQUFDLEVBQ0EsSUFBWSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsQ0FDL0IsQ0FBQztRQUNKLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBUSxFQUFFLEdBQUcsSUFBVztRQUNuQyx3Q0FBd0M7UUFDeEMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFELE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFXLEVBQUUsR0FBRyxJQUFXO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRSxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUNwQyxJQUFJLENBQUMsU0FBUyxFQUNkLEdBQTBCLEVBQzFCLE9BQU8sRUFDUCxHQUFHLElBQUksQ0FDUixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBb0IsQ0FBQyxDQUN2RSxDQUFDO0lBQ0osQ0FBQztJQUVTLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBVyxFQUFFLEdBQUcsSUFBVztRQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDN0MsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksR0FBRyxHQUE2QyxFQUFFLENBQUM7UUFDdkQsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUV4QyxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixDQUF5QixDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxNQUFNLG1CQUFtQixDQUN2QixJQUFJLEVBQ0osQ0FBQyxFQUNELGFBQWEsQ0FBQyxNQUFNLEVBQ3BCLGFBQWEsQ0FBQyxFQUFFLENBQ2pCLENBQUM7WUFDRixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNO2FBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ3pCLE1BQU0sQ0FBQyxDQUFDLEtBQXlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQztnQkFDSCxLQUFLO29CQUNILE9BQU8sS0FBSyxLQUFLLFFBQVE7d0JBQ3ZCLENBQUMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO3dCQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbkMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEIsSUFBSSxNQUFNO1lBQUUsTUFBTSxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBNEIsRUFBRSxHQUFHLElBQVc7UUFDckQsTUFBTSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFRLEVBQUUsR0FBRyxJQUFXO1FBQ25DLHdDQUF3QztRQUN4QyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN4RSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVTLEtBQUssQ0FBQyxZQUFZLENBQzFCLEtBQVEsRUFDUixHQUFHLElBQVc7UUFFZCxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwQyxNQUFNLG1CQUFtQixDQUN2QixJQUFJLEVBQ0osS0FBSyxFQUNMLGFBQWEsQ0FBQyxNQUFNLEVBQ3BCLGFBQWEsQ0FBQyxFQUFFLEVBQ2hCLFFBQVEsQ0FDVCxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxJQUFJLE1BQU07WUFBRSxNQUFNLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztnQkFDaEMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVTLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBVyxFQUFFLEdBQUcsSUFBVztRQUN6RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7b0JBQzVCLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ2xCLG1CQUFtQixDQUNqQixJQUFJLEVBQ0osQ0FBQyxFQUNELGFBQWEsQ0FBQyxNQUFNLEVBQ3BCLGFBQWEsQ0FBQyxFQUFFLEVBQ2hCLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FDYixDQUNGLENBQ0YsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU07YUFDbEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDM0MsTUFBTSxDQUFDLENBQUMsS0FBeUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDO2dCQUNILEtBQUs7b0JBQ0gsT0FBTyxLQUFLLEtBQUssUUFBUTt3QkFDdkIsQ0FBQyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7d0JBQ3RDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNuQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoQixJQUFJLE1BQU07WUFBRSxNQUFNLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTlDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUE0QixFQUFFLEdBQUcsSUFBVztRQUN2RCxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxNQUFNLENBQUMsUUFBeUI7UUFDOUIsT0FBTyxJQUFJLEtBQUssQ0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQ1QsU0FBb0IsRUFDcEIsT0FBZSxFQUNmLFFBQXdCLGNBQWMsQ0FBQyxHQUFHLEVBQzFDLEtBQWMsRUFDZCxJQUFhO1FBRWIsTUFBTSxJQUFJLEdBQW9CLENBQUMsT0FBaUIsRUFBRSxLQUF1QixDQUFDLENBQUM7UUFDM0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsSUFBSSxLQUFLO1lBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLElBQUk7WUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBSyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE9BQU8sQ0FBQyxRQUFrQjtRQUN4QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7WUFBRSxNQUFNLElBQUksYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLFFBQWtCO1FBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztZQUFFLE1BQU0sSUFBSSxhQUFhLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFXO1FBQ2xDLE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7aUJBQ2pFLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ1QsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQ2IsS0FBcUI7UUFFckIsTUFBTSxRQUFRLEdBQXVCLE9BQU8sQ0FBQyxXQUFXLENBQ3RELFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUNqQyxLQUFLLENBQ04sQ0FBQztRQUNGLElBQUksT0FBTyxHQUF1QixPQUFPLENBQUMsV0FBVyxDQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFDcEMsS0FBSyxDQUNOLENBQUM7UUFDRixJQUFJLE9BQU8sR0FBa0MsT0FBTztZQUNsRCxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFDdEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLElBQUksZUFBK0IsQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsT0FBTztnQkFDVixNQUFNLElBQUksYUFBYSxDQUNyQiw4RkFBOEYsS0FBSyxDQUFDLElBQUksRUFBRSxDQUMzRyxDQUFDO1lBQ0osZUFBZSxHQUFHLFVBQXVDLENBQUM7UUFDNUQsQ0FBQzthQUFNLENBQUM7WUFDTixlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQThCLENBQUM7WUFDbEUsT0FBTztnQkFDTCxPQUFPO29CQUNQLE9BQU8sQ0FBQyxXQUFXLENBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUNwQyxlQUFlLENBQ2hCLENBQUM7WUFDSixJQUFJLENBQUMsT0FBTztnQkFDVixNQUFNLElBQUksYUFBYSxDQUNyQixxREFBcUQsS0FBSyxDQUFDLElBQUksRUFBRSxDQUNsRSxDQUFDO1lBRUosT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPO1lBQ1YsTUFBTSxJQUFJLGFBQWEsQ0FDckIsbURBQW1ELE9BQU8sRUFBRSxDQUM3RCxDQUFDO1FBRUosT0FBTyxJQUFJLGVBQWUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLE1BQU0sQ0FBQyxHQUFHLENBQ2hCLElBQVk7UUFFWixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTTtZQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUErQixDQUFDO1FBQ3pELE1BQU0sSUFBSSxhQUFhLENBQ3JCLDhDQUE4QyxJQUFJLEVBQUUsQ0FDckQsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUNiLElBQVksRUFDWixJQUFxQztRQUVyQyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTTtZQUNyQixNQUFNLElBQUksYUFBYSxDQUFDLEdBQUcsSUFBSSxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFrQixLQUFRLEVBQUUsUUFBYTtRQUN6RCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFO1lBQ3JELFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsS0FBSyxFQUFFLFFBQVE7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxXQUFXLENBQWtCLEtBQVE7UUFDMUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUNoRCxLQUFLLEVBQ0wsZUFBZSxDQUFDLFFBQVEsQ0FDekIsQ0FBQztRQUNGLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbkQsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQWtCLEtBQVE7UUFDN0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUNoRCxLQUFLLEVBQ0wsZUFBZSxDQUFDLFFBQVEsQ0FDekIsQ0FBQztRQUNGLElBQUksVUFBVTtZQUFFLE9BQVEsS0FBYSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixDQUFrQixLQUFRO1FBQ2pELE1BQU0sRUFBRSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFFBQVE7WUFDWCxNQUFNLElBQUksYUFBYSxDQUNyQix1RUFBdUUsQ0FDeEUsQ0FBQztRQUNKLE9BQU8sUUFBMkIsQ0FBQztJQUNyQyxDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQU8sQ0FBa0IsS0FBeUI7UUFDdkQsTUFBTSxlQUFlLEdBQUcsd0JBQXdCLENBQzlDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsRUFDNUMsTUFBTSxDQUFDLE9BQU8sQ0FDZixDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQ2pELENBQUMsS0FBb0QsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFO1lBQ2pFLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDdkIsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUM7b0JBQzNCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUMxQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBc0IsQ0FBQztnQkFDekMsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFDRCxFQUFFLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFrQixLQUF5QjtRQUNyRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFDbEMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUNuRCxDQUFDO1FBQ0YsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUMzQixPQUFPLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQWtCLEtBQVEsRUFBRSxTQUFpQjtRQUN4RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFDbkMsS0FBSyxFQUNMLFNBQVMsQ0FDVixDQUFDO1FBQ0YsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3pDLENBQUMiLCJmaWxlIjoicmVwb3NpdG9yeS9SZXBvc2l0b3J5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgREJLZXlzLFxuICBlbmZvcmNlREJEZWNvcmF0b3JzLFxuICBmaW5kTW9kZWxJZCxcbiAgZmluZFByaW1hcnlLZXksXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIFJlcG9zaXRvcnkgYXMgUmVwLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIHdyYXBNZXRob2QsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgT2JzZXJ2ZXJFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmFibGVcIjtcbmltcG9ydCB7IE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgQ29uZGl0aW9uLFxuICBPcmRlckJ5U2VsZWN0b3IsXG4gIFF1ZXJ5LFxuICBTZWxlY3RTZWxlY3RvcixcbiAgV2hlcmVPcHRpb24sXG59IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBzZXF1ZW5jZU5hbWVGb3JNb2RlbCB9IGZyb20gXCIuLi9pZGVudGl0eS91dGlsc1wiO1xuaW1wb3J0IHsgUXVlcmlhYmxlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvUXVlcmlhYmxlXCI7XG5pbXBvcnQgeyBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWwsIFEgPSBhbnk+XG4gIGV4dGVuZHMgUmVwPE0+XG4gIGltcGxlbWVudHMgT2JzZXJ2YWJsZSwgUXVlcmlhYmxlXG57XG4gIHByaXZhdGUgc3RhdGljIF9jYWNoZTogUmVjb3JkPHN0cmluZywgQ29uc3RydWN0b3I8UmVwb3NpdG9yeTxNb2RlbCwgYW55Pj4+ID1cbiAgICB7fTtcblxuICBwcml2YXRlIG9ic2VydmVyczogT2JzZXJ2ZXJbXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkYXB0ZXIhOiBBZGFwdGVyPGFueSwgUT47XG4gIHByaXZhdGUgX3RhYmxlTmFtZSE6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGshOiBzdHJpbmc7XG5cbiAgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgaWYgKCF0aGlzLl9hZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyBhZGFwdGVyIGZvdW5kIGZvciB0aGlzIHJlcG9zaXRvcnkuIGRpZCB5b3UgdXNlIHRoZSBAdXNlcyBkZWNvcmF0b3Igb3IgcGFzcyBpdCBpbiB0aGUgY29uc3RydWN0b3I/YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdGFibGVOYW1lKCkge1xuICAgIGlmICghdGhpcy5fdGFibGVOYW1lKSB0aGlzLl90YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuY2xhc3MpO1xuICAgIHJldHVybiB0aGlzLl90YWJsZU5hbWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHBrKCkge1xuICAgIGlmICghdGhpcy5fcGspIHRoaXMuX3BrID0gZmluZFByaW1hcnlLZXkobmV3IHRoaXMuY2xhc3MoKSkuaWQ7XG4gICAgcmV0dXJuIHRoaXMuX3BrO1xuICB9XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcj86IEFkYXB0ZXI8YW55LCBRPiwgY2xheno/OiBDb25zdHJ1Y3RvcjxNPikge1xuICAgIHN1cGVyKGNsYXp6KTtcbiAgICBpZiAoYWRhcHRlcikgdGhpcy5fYWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgW3RoaXMuY3JlYXRlQWxsLCB0aGlzLnJlYWRBbGwsIHRoaXMudXBkYXRlQWxsLCB0aGlzLmRlbGV0ZUFsbF0uZm9yRWFjaChcbiAgICAgIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBtLm5hbWU7XG4gICAgICAgIHdyYXBNZXRob2QoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICAodGhpcyBhcyBhbnkpW25hbWUgKyBcIlByZWZpeFwiXSxcbiAgICAgICAgICBtLFxuICAgICAgICAgICh0aGlzIGFzIGFueSlbbmFtZSArIFwiU3VmZml4XCJdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCB9ID0gdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGUodGhpcy50YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gbW9kZWxzO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgdGhpcy5waykpO1xuICAgIGNvbnN0IGlkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgbGV0IHJlY29yZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAucmVjb3JkKTtcbiAgICByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgaWRzIGFzIChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgICByZWNvcmRzLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZHNbaV0gYXMgc3RyaW5nIHwgbnVtYmVyKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQWxsUHJlZml4KG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIFttb2RlbHMsIC4uLmFyZ3NdO1xuICAgIGNvbnN0IG9wdHMgPSBSZXBvc2l0b3J5LmdldFNlcXVlbmNlT3B0aW9ucyhtb2RlbHNbMF0pO1xuICAgIGxldCBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgfCB1bmRlZmluZWQpW10gPSBbXTtcbiAgICBpZiAob3B0cy50eXBlKSB7XG4gICAgICBpZiAoIW9wdHMubmFtZSkgb3B0cy5uYW1lID0gc2VxdWVuY2VOYW1lRm9yTW9kZWwobW9kZWxzWzBdLCBcInBrXCIpO1xuICAgICAgaWRzID0gYXdhaXQgKGF3YWl0IHRoaXMuYWRhcHRlci5TZXF1ZW5jZShvcHRzKSkucmFuZ2UobW9kZWxzLmxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkobW9kZWxzWzBdKS5pZDtcblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSwgaSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIChtIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3BrXSA9IGlkc1tpXTtcbiAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNcbiAgICAgIC5tYXAoKG0pID0+IG0uaGFzRXJyb3JzKCkpXG4gICAgICAucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICAgIGlmIChlKVxuICAgICAgICAgIGFjY3VtID1cbiAgICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IGFjY3VtICsgYFxcbiAtICR7aX06ICR7ZS50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgOiBgIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YDtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgdW5kZWZpbmVkKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycyk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmFyZ3NdO1xuICB9XG5cbiAgYXN5bmMgcmVhZChpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZCh0aGlzLnRhYmxlTmFtZSwgaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCB9ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnByZXBhcmUobW9kZWwsIHRoaXMucGspO1xuICAgIHJlY29yZCA9IGF3YWl0IHRoaXMuYWRhcHRlci51cGRhdGUodGhpcy50YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZVByZWZpeChcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFtNLCAuLi5hcmdzOiBhbnlbXV0+IHtcbiAgICBjb25zdCBwayA9IGZpbmRNb2RlbElkKG1vZGVsKTtcbiAgICBjb25zdCBvbGRNb2RlbCA9IGF3YWl0IHRoaXMucmVhZChwayk7XG4gICAgbW9kZWwgPSB0aGlzLm1lcmdlKG9sZE1vZGVsLCBtb2RlbCk7XG4gICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgIHRoaXMsXG4gICAgICBtb2RlbCxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5PTixcbiAgICAgIG9sZE1vZGVsXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9ycyA9IG1vZGVsLmhhc0Vycm9ycyhvbGRNb2RlbCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMudG9TdHJpbmcoKSk7XG4gICAgaWYgKFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWwpKSB7XG4gICAgICBpZiAoIVJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEobW9kZWwpKVxuICAgICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG1vZGVsLCBSZXBvc2l0b3J5LmdldE1ldGFkYXRhKG9sZE1vZGVsKSk7XG4gICAgfVxuICAgIHJldHVybiBbbW9kZWwsIC4uLmFyZ3NdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZUFsbFByZWZpeChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueVtdPiB7XG4gICAgY29uc3QgaWRzID0gbW9kZWxzLm1hcCgobSkgPT4gZmluZE1vZGVsSWQobSkpO1xuICAgIGNvbnN0IG9sZE1vZGVscyA9IGF3YWl0IHRoaXMucmVhZEFsbChpZHMpO1xuICAgIG1vZGVscyA9IG1vZGVscy5tYXAoKG0sIGkpID0+IHtcbiAgICAgIG0gPSB0aGlzLm1lcmdlKG9sZE1vZGVsc1tpXSwgbSk7XG4gICAgICBpZiAoUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShvbGRNb2RlbHNbaV0pKSB7XG4gICAgICAgIGlmICghUmVwb3NpdG9yeS5nZXRNZXRhZGF0YShtKSlcbiAgICAgICAgICBSZXBvc2l0b3J5LnNldE1ldGFkYXRhKG0sIFJlcG9zaXRvcnkuZ2V0TWV0YWRhdGEob2xkTW9kZWxzW2ldKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbTtcbiAgICB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1vZGVscy5tYXAoKG0sIGkpID0+XG4gICAgICAgIGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBtLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgIE9wZXJhdGlvbktleXMuT04sXG4gICAgICAgICAgb2xkTW9kZWxzW2ldXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzID0gbW9kZWxzXG4gICAgICAubWFwKChtLCBpKSA9PiBtLmhhc0Vycm9ycyhvbGRNb2RlbHNbaV0sIG0pKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuXG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmFyZ3NdO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGUodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBzZWxlY3Qoc2VsZWN0b3I/OiBTZWxlY3RTZWxlY3Rvcik6IFdoZXJlT3B0aW9uIHtcbiAgICByZXR1cm4gbmV3IFF1ZXJ5PFEsIE0+KHRoaXMuYWRhcHRlcikuc2VsZWN0KHNlbGVjdG9yKS5mcm9tKHRoaXMuY2xhc3MpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnk8Vj4oXG4gICAgY29uZGl0aW9uOiBDb25kaXRpb24sXG4gICAgb3JkZXJCeTogc3RyaW5nLFxuICAgIG9yZGVyOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkFTQyxcbiAgICBsaW1pdD86IG51bWJlcixcbiAgICBza2lwPzogbnVtYmVyXG4gICk6IFByb21pc2U8Vj4ge1xuICAgIGNvbnN0IHNvcnQ6IE9yZGVyQnlTZWxlY3RvciA9IFtvcmRlckJ5IGFzIHN0cmluZywgb3JkZXIgYXMgT3JkZXJEaXJlY3Rpb25dO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zZWxlY3QoKS53aGVyZShjb25kaXRpb24pLm9yZGVyQnkoc29ydCk7XG4gICAgaWYgKGxpbWl0KSBxdWVyeS5saW1pdChsaW1pdCk7XG4gICAgaWYgKHNraXApIHF1ZXJ5Lm9mZnNldChza2lwKTtcbiAgICByZXR1cm4gcXVlcnkuZXhlY3V0ZTxWPigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhbiB7QGxpbmsgT2JzZXJ2ZXJ9XG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAqXG4gICAqIEBzZWUge09ic2VydmFibGUjb2JzZXJ2ZX1cbiAgICovXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk9ic2VydmVyIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5wdXNoKG9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBVbnJlZ2lzdGVycyBhbiB7QGxpbmsgT2JzZXJ2ZXJ9XG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAqXG4gICAqIEBzZWUge09ic2VydmFibGUjdW5PYnNlcnZlfVxuICAgKi9cbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBPYnNlcnZlclwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IGNhbGxzIGFsbCByZWdpc3RlcmVkIHtAbGluayBPYnNlcnZlcn1zIHRvIHVwZGF0ZSB0aGVtc2VsdmVzXG4gICAqIEBwYXJhbSB7YW55W119IFthcmdzXSBvcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgT2JzZXJ2ZXIjcmVmcmVzaH0gbWV0aG9kXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgUHJvbWlzZS5hbGwodGhpcy5vYnNlcnZlcnMubWFwKChvOiBPYnNlcnZlcikgPT4gby5yZWZyZXNoKC4uLmFyZ3MpKSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlOiBhbnkpID0+IHJlamVjdChuZXcgT2JzZXJ2ZXJFcnJvcihlKSkpO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGZvck1vZGVsPE0gZXh0ZW5kcyBNb2RlbCwgUiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgYW55Pj4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4gICk6IFIge1xuICAgIGNvbnN0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgUmVwb3NpdG9yeS5rZXkoREJLZXlzLlJFUE9TSVRPUlkpLFxuICAgICAgbW9kZWxcbiAgICApO1xuICAgIGxldCBmbGF2b3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgbW9kZWxcbiAgICApO1xuICAgIGxldCBhZGFwdGVyOiBBZGFwdGVyPGFueSwgYW55PiB8IHVuZGVmaW5lZCA9IGZsYXZvdXJcbiAgICAgID8gQWRhcHRlci5nZXQoZmxhdm91cilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgbGV0IHJlcG9Db25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8Uj47XG4gICAgaWYgKCFyZXBvTmFtZSkge1xuICAgICAgaWYgKCFhZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGJvb3QgYSBzdGFuZGFyZCByZXBvc2l0b3J5IHdpdGhvdXQgYW4gYWRhcHRlciBkZWZpbml0aW9uLiBEaWQgeW91IEB1c2Ugb24gdGhlIG1vZGVsICR7bW9kZWwubmFtZX1gXG4gICAgICAgICk7XG4gICAgICByZXBvQ29uc3RydWN0b3IgPSBSZXBvc2l0b3J5IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8Uj47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcG9Db25zdHJ1Y3RvciA9IHRoaXMuZ2V0KHJlcG9OYW1lKSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFI+O1xuICAgICAgZmxhdm91ciA9XG4gICAgICAgIGZsYXZvdXIgfHxcbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgcmVwb0NvbnN0cnVjdG9yXG4gICAgICAgICk7XG4gICAgICBpZiAoIWZsYXZvdXIpXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBObyByZWdpc3RlcmVkIHBlcnNpc3RlbmNlIGFkYXB0ZXIgZm91bmQgZm9yIG1vZGVsICR7bW9kZWwubmFtZX1gXG4gICAgICAgICk7XG5cbiAgICAgIGFkYXB0ZXIgPSBBZGFwdGVyLmdldChmbGF2b3VyKTtcbiAgICB9XG5cbiAgICBpZiAoIWFkYXB0ZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgcGVyc2lzdGVuY2UgYWRhcHRlciBmb3VuZCBmbGF2b3VyICR7Zmxhdm91cn1gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIG5ldyByZXBvQ29uc3RydWN0b3IoYWRhcHRlciwgbW9kZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbmFtZTogc3RyaW5nXG4gICk6IENvbnN0cnVjdG9yPFJlcG9zaXRvcnk8TT4+IHtcbiAgICBpZiAobmFtZSBpbiB0aGlzLl9jYWNoZSlcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZVtuYW1lXSBhcyBDb25zdHJ1Y3RvcjxSZXBvc2l0b3J5PE0+PjtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBDb3VsZCBub3QgZmluZCByZXBvc2l0b3J5IHJlZ2lzdGVyZWQgdW5kZXIgJHtuYW1lfWBcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIHJlZ2lzdGVyPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHJlcG86IENvbnN0cnVjdG9yPFJlcG9zaXRvcnk8TSwgYW55Pj5cbiAgKSB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgJHtuYW1lfSBhbHJlYWR5IHJlZ2lzdGVyZWQgYXMgYSByZXBvc2l0b3J5YCk7XG4gICAgdGhpcy5fY2FjaGVbbmFtZV0gPSByZXBvO1xuICB9XG5cbiAgc3RhdGljIHNldE1ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIG1ldGFkYXRhOiBhbnkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kZWwsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogbWV0YWRhdGEsXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0TWV0YWRhdGE8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSkge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgbW9kZWwsXG4gICAgICBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFcbiAgICApO1xuICAgIHJldHVybiBkZXNjcmlwdG9yID8gZGVzY3JpcHRvci52YWx1ZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBtb2RlbCxcbiAgICAgIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQVxuICAgICk7XG4gICAgaWYgKGRlc2NyaXB0b3IpIGRlbGV0ZSAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICB9XG5cbiAgc3RhdGljIGdldFNlcXVlbmNlT3B0aW9uczxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShtb2RlbCkuaWQ7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KERCS2V5cy5JRCksIG1vZGVsLCBwayk7XG4gICAgaWYgKCFtZXRhZGF0YSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk5vIHNlcXVlbmNlIG9wdGlvbnMgZGVmaW5lZCBmb3IgbW9kZWwuIGRpZCB5b3UgdXNlIHRoZSBAcGsgZGVjb3JhdG9yP1wiXG4gICAgICApO1xuICAgIHJldHVybiBtZXRhZGF0YSBhcyBTZXF1ZW5jZU9wdGlvbnM7XG4gIH1cblxuICBzdGF0aWMgaW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4pIHtcbiAgICBjb25zdCBpbmRleERlY29yYXRvcnMgPSBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwgOiBuZXcgbW9kZWwoKSxcbiAgICAgIERCS2V5cy5SRUZMRUNUXG4gICAgKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoaW5kZXhEZWNvcmF0b3JzIHx8IHt9KS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEluZGV4TWV0YWRhdGE+PiwgW2ssIHZhbF0pID0+IHtcbiAgICAgICAgY29uc3QgZGVjcyA9IHZhbC5maWx0ZXIoKHYpID0+IHYua2V5LnN0YXJ0c1dpdGgoUGVyc2lzdGVuY2VLZXlzLklOREVYKSk7XG4gICAgICAgIGlmIChkZWNzICYmIGRlY3MubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBkZWMgb2YgZGVjcykge1xuICAgICAgICAgICAgY29uc3QgeyBrZXksIHByb3BzIH0gPSBkZWM7XG4gICAgICAgICAgICBhY2N1bVtrXSA9IGFjY3VtW2tdIHx8IHt9O1xuICAgICAgICAgICAgYWNjdW1ba11ba2V5XSA9IHByb3BzIGFzIEluZGV4TWV0YWRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgdGFibGU8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKSxcbiAgICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IG1vZGVsXG4gICAgKTtcbiAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICB9XG4gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgTW9kZWwpIHtcbiAgICAgIHJldHVybiBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWwubmFtZTtcbiAgfVxuXG4gIHN0YXRpYyBjb2x1bW48TSBleHRlbmRzIE1vZGVsPihtb2RlbDogTSwgYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKSxcbiAgICAgIG1vZGVsLFxuICAgICAgYXR0cmlidXRlXG4gICAgKTtcbiAgICByZXR1cm4gbWV0YWRhdGEgPyBtZXRhZGF0YSA6IGF0dHJpYnV0ZTtcbiAgfVxufVxuIl19
@@ -1 +1,31 @@
1
- var OrderDirection,Cascade;(e=>{e.ASC="asc",e.DSC="desc"})(OrderDirection=OrderDirection||{}),(e=>{e.CASCADE="cascade",e.NONE="none"})(Cascade=Cascade||{});let DefaultCascade={update:Cascade.CASCADE,delete:Cascade.NONE};export{OrderDirection,Cascade,DefaultCascade};
1
+ /**
2
+ * @summary defines order directions when sorting
3
+ *
4
+ * @constant OrderDirection
5
+ *
6
+ * @category Query
7
+ */
8
+ export var OrderDirection;
9
+ (function (OrderDirection) {
10
+ /**
11
+ * @summary Defines the sort order as ascending
12
+ * @prop ASC
13
+ */
14
+ OrderDirection["ASC"] = "asc";
15
+ /**
16
+ * @summary Defines the sort order as descending
17
+ * @property {string} DSC
18
+ */
19
+ OrderDirection["DSC"] = "desc";
20
+ })(OrderDirection || (OrderDirection = {}));
21
+ export var Cascade;
22
+ (function (Cascade) {
23
+ Cascade["CASCADE"] = "cascade";
24
+ Cascade["NONE"] = "none";
25
+ })(Cascade || (Cascade = {}));
26
+ export const DefaultCascade = {
27
+ update: Cascade.CASCADE,
28
+ delete: Cascade.NONE,
29
+ };
30
+
31
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQU4sSUFBWSxjQVdYO0FBWEQsV0FBWSxjQUFjO0lBQ3hCOzs7T0FHRztJQUNILDZCQUFXLENBQUE7SUFDWDs7O09BR0c7SUFDSCw4QkFBWSxDQUFBO0FBQ2QsQ0FBQyxFQVhXLGNBQWMsS0FBZCxjQUFjLFFBV3pCO0FBRUQsTUFBTSxDQUFOLElBQVksT0FHWDtBQUhELFdBQVksT0FBTztJQUNqQiw4QkFBbUIsQ0FBQTtJQUNuQix3QkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQUhXLE9BQU8sS0FBUCxPQUFPLFFBR2xCO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFvQjtJQUM3QyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU87SUFDdkIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJO0NBQ3JCLENBQUMiLCJmaWxlIjoicmVwb3NpdG9yeS9jb25zdGFudHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDYXNjYWRlTWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IGRlZmluZXMgb3JkZXIgZGlyZWN0aW9ucyB3aGVuIHNvcnRpbmdcbiAqXG4gKiBAY29uc3RhbnQgT3JkZXJEaXJlY3Rpb25cbiAqXG4gKiBAY2F0ZWdvcnkgUXVlcnlcbiAqL1xuZXhwb3J0IGVudW0gT3JkZXJEaXJlY3Rpb24ge1xuICAvKipcbiAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc29ydCBvcmRlciBhcyBhc2NlbmRpbmdcbiAgICogQHByb3AgQVNDXG4gICAqL1xuICBBU0MgPSBcImFzY1wiLFxuICAvKipcbiAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc29ydCBvcmRlciBhcyBkZXNjZW5kaW5nXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEU0NcbiAgICovXG4gIERTQyA9IFwiZGVzY1wiLFxufVxuXG5leHBvcnQgZW51bSBDYXNjYWRlIHtcbiAgQ0FTQ0FERSA9IFwiY2FzY2FkZVwiLFxuICBOT05FID0gXCJub25lXCIsXG59XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0Q2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhID0ge1xuICB1cGRhdGU6IENhc2NhZGUuQ0FTQ0FERSxcbiAgZGVsZXRlOiBDYXNjYWRlLk5PTkUsXG59O1xuIl19
@@ -1,3 +1,2 @@
1
- import { DBModel } from "@decaf-ts/db-decorators";
2
- import { Constructor } from "@decaf-ts/decorator-validation";
3
- export declare function repository<T extends DBModel>(model: Constructor<T>, nameOverride?: string): (original: any, propertyKey?: string) => any;
1
+ import { Constructor, Model } from "@decaf-ts/decorator-validation";
2
+ export declare function repository<T extends Model>(model: Constructor<T>, nameOverride?: string): any;
@@ -1 +1,23 @@
1
- import{inject,injectable}from"@decaf-ts/injectable-decorators";import{DBKeys,getDBKey}from"@decaf-ts/db-decorators";import{metadata}from"@decaf-ts/reflection";import{bootRepository}from"./utils";function repository(o,a){return(e,t)=>{var r;return t?(r=bootRepository(o,e),inject(r)(e,t)):(metadata(getDBKey(DBKeys.REPOSITORY),a||e.name)(o),injectable(a||e.name,!0,e=>{Object.defineProperty(e,DBKeys.CLASS,{enumerable:!1,configurable:!1,writable:!1,value:o})})(e))}}export{repository};
1
+ import { inject, injectable } from "@decaf-ts/injectable-decorators";
2
+ import { DBKeys } from "@decaf-ts/db-decorators";
3
+ import { metadata } from "@decaf-ts/reflection";
4
+ import { Repository } from "./Repository";
5
+ export function repository(model, nameOverride) {
6
+ return ((original, propertyKey) => {
7
+ if (propertyKey) {
8
+ return inject(nameOverride || model.name)(original, propertyKey);
9
+ }
10
+ metadata(Repository.key(DBKeys.REPOSITORY), nameOverride || original.name)(model);
11
+ Repository.register(nameOverride || original.name, original);
12
+ return injectable(nameOverride || original.name, true, (instance) => {
13
+ Object.defineProperty(instance, DBKeys.CLASS, {
14
+ enumerable: false,
15
+ configurable: false,
16
+ writable: false,
17
+ value: model,
18
+ });
19
+ })(original);
20
+ });
21
+ }
22
+
23
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsTUFBTSxFQUFlLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWhELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFMUMsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsS0FBcUIsRUFDckIsWUFBcUI7SUFFckIsT0FBTyxDQUFDLENBQUMsUUFBYSxFQUFFLFdBQWlCLEVBQUUsRUFBRTtRQUMzQyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sTUFBTSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRCxRQUFRLENBQ04sVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQ2pDLFlBQVksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUM5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ1QsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3RCxPQUFPLFVBQVUsQ0FDZixZQUFZLElBQUksUUFBUSxDQUFDLElBQUksRUFDN0IsSUFBSSxFQUNKLENBQUMsUUFBd0IsRUFBRSxFQUFFO1lBQzNCLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUU7Z0JBQzVDLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixZQUFZLEVBQUUsS0FBSztnQkFDbkIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsS0FBSyxFQUFFLEtBQUs7YUFDYixDQUFDLENBQUM7UUFDTCxDQUFDLENBQ0YsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNkLENBQUMsQ0FBUSxDQUFDO0FBQ1osQ0FBQyIsImZpbGUiOiJyZXBvc2l0b3J5L2RlY29yYXRvcnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tIFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgREJLZXlzLCBJUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvc2l0b3J5PFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxUPixcbiAgbmFtZU92ZXJyaWRlPzogc3RyaW5nXG4pOiBhbnkge1xuICByZXR1cm4gKChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGlmIChwcm9wZXJ0eUtleSkge1xuICAgICAgcmV0dXJuIGluamVjdChuYW1lT3ZlcnJpZGUgfHwgbW9kZWwubmFtZSkob3JpZ2luYWwsIHByb3BlcnR5S2V5KTtcbiAgICB9XG5cbiAgICBtZXRhZGF0YShcbiAgICAgIFJlcG9zaXRvcnkua2V5KERCS2V5cy5SRVBPU0lUT1JZKSxcbiAgICAgIG5hbWVPdmVycmlkZSB8fCBvcmlnaW5hbC5uYW1lXG4gICAgKShtb2RlbCk7XG4gICAgUmVwb3NpdG9yeS5yZWdpc3RlcihuYW1lT3ZlcnJpZGUgfHwgb3JpZ2luYWwubmFtZSwgb3JpZ2luYWwpO1xuICAgIHJldHVybiBpbmplY3RhYmxlKFxuICAgICAgbmFtZU92ZXJyaWRlIHx8IG9yaWdpbmFsLm5hbWUsXG4gICAgICB0cnVlLFxuICAgICAgKGluc3RhbmNlOiBJUmVwb3NpdG9yeTxUPikgPT4ge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdGFuY2UsIERCS2V5cy5DTEFTUywge1xuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBtb2RlbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKShvcmlnaW5hbCk7XG4gIH0pIGFzIGFueTtcbn1cbiJdfQ==
@@ -1 +1,16 @@
1
- import{BaseError}from"@decaf-ts/db-decorators";class ObserverError extends BaseError{constructor(r){super(ObserverError.name,r)}}export{ObserverError};
1
+ import { BaseError } from "@decaf-ts/db-decorators";
2
+ /**
3
+ * @summary Represents a failure in observer communication
4
+ *
5
+ * @param {string} msg the error message
6
+ *
7
+ * @class ObserverError
8
+ * @extends BaseError
9
+ */
10
+ export class ObserverError extends BaseError {
11
+ constructor(msg) {
12
+ super(ObserverError.name, msg);
13
+ }
14
+ }
15
+
16
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFcEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsU0FBUztJQUMxQyxZQUFZLEdBQW1CO1FBQzdCLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7Q0FDRiIsImZpbGUiOiJyZXBvc2l0b3J5L2Vycm9ycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBmYWlsdXJlIGluIG9ic2VydmVyIGNvbW11bmljYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRoZSBlcnJvciBtZXNzYWdlXG4gKlxuICogQGNsYXNzIE9ic2VydmVyRXJyb3JcbiAqIEBleHRlbmRzIEJhc2VFcnJvclxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXJFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihPYnNlcnZlckVycm9yLm5hbWUsIG1zZyk7XG4gIH1cbn1cbiJdfQ==
@@ -1,6 +1,7 @@
1
1
  export * from "./constants";
2
2
  export * from "./decorators";
3
3
  export * from "./errors";
4
+ export * from "./injectables";
4
5
  export * from "./Repository";
5
6
  export * from "./types";
6
7
  export * from "./utils";
@@ -1 +1,9 @@
1
- export*from"./constants";export*from"./decorators";export*from"./errors";export*from"./Repository";export*from"./types";export*from"./utils";
1
+ export * from "./constants";
2
+ export * from "./decorators";
3
+ export * from "./errors";
4
+ export * from "./injectables";
5
+ export * from "./Repository";
6
+ export * from "./types";
7
+ export * from "./utils";
8
+
9
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsU0FBUyxDQUFDIiwiZmlsZSI6InJlcG9zaXRvcnkvaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW5qZWN0YWJsZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JlcG9zaXRvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuIl19
@@ -0,0 +1,5 @@
1
+ import { InjectableRegistryImp } from "@decaf-ts/injectable-decorators";
2
+ export declare class InjectablesRegistry extends InjectableRegistryImp {
3
+ constructor();
4
+ get<T>(name: string): T | undefined;
5
+ }
@@ -0,0 +1,32 @@
1
+ import { InjectableRegistryImp, Injectables, } from "@decaf-ts/injectable-decorators";
2
+ import { Repository } from "./Repository";
3
+ import { Model } from "@decaf-ts/decorator-validation";
4
+ import { generateInjectableNameForRepository } from "./utils";
5
+ import { PersistenceKeys } from "../persistence/constants";
6
+ import { Adapter } from "../persistence/Adapter";
7
+ export class InjectablesRegistry extends InjectableRegistryImp {
8
+ constructor() {
9
+ super();
10
+ }
11
+ get(name) {
12
+ let injectable = super.get(name);
13
+ if (!injectable)
14
+ try {
15
+ const m = Model.get(name);
16
+ if (m)
17
+ injectable = Repository.forModel(m);
18
+ if (injectable) {
19
+ const flavour = Reflect.getMetadata(Adapter.key(PersistenceKeys.ADAPTER), injectable.constructor) ||
20
+ Reflect.getMetadata(Adapter.key(PersistenceKeys.ADAPTER), m);
21
+ Injectables.register(injectable, generateInjectableNameForRepository(m, flavour));
22
+ }
23
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
24
+ }
25
+ catch (e) {
26
+ return undefined;
27
+ }
28
+ return injectable;
29
+ }
30
+ }
31
+
32
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L2luamVjdGFibGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsV0FBVyxHQUNaLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsS0FBSyxFQUFvQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxxQkFBcUI7SUFDNUQ7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFRCxHQUFHLENBQUksSUFBWTtRQUNqQixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVO1lBQ2IsSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQztvQkFBRSxVQUFVLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDZixNQUFNLE9BQU8sR0FDWCxPQUFPLENBQUMsV0FBVyxDQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFDcEMsVUFBVSxDQUFDLFdBQVcsQ0FDdkI7d0JBQ0QsT0FBTyxDQUFDLFdBQVcsQ0FDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQ3BDLENBQTBCLENBQzNCLENBQUM7b0JBQ0osV0FBVyxDQUFDLFFBQVEsQ0FDbEIsVUFBVSxFQUNWLG1DQUFtQyxDQUNqQyxDQUEwQixFQUMxQixPQUFPLENBQ1IsQ0FDRixDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsNkRBQTZEO1lBQy9ELENBQUM7WUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO2dCQUNoQixPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsT0FBTyxVQUEyQixDQUFDO0lBQ3JDLENBQUM7Q0FDRiIsImZpbGUiOiJyZXBvc2l0b3J5L2luamVjdGFibGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wLFxuICBJbmplY3RhYmxlcyxcbn0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5IH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuXG5leHBvcnQgY2xhc3MgSW5qZWN0YWJsZXNSZWdpc3RyeSBleHRlbmRzIEluamVjdGFibGVSZWdpc3RyeUltcCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQ8VD4obmFtZTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGluamVjdGFibGUgPSBzdXBlci5nZXQobmFtZSk7XG4gICAgaWYgKCFpbmplY3RhYmxlKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbSA9IE1vZGVsLmdldChuYW1lKTtcbiAgICAgICAgaWYgKG0pIGluamVjdGFibGUgPSBSZXBvc2l0b3J5LmZvck1vZGVsKG0pO1xuICAgICAgICBpZiAoaW5qZWN0YWJsZSkge1xuICAgICAgICAgIGNvbnN0IGZsYXZvdXIgPVxuICAgICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgICAgICBpbmplY3RhYmxlLmNvbnN0cnVjdG9yXG4gICAgICAgICAgICApIHx8XG4gICAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIEluamVjdGFibGVzLnJlZ2lzdGVyKFxuICAgICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICAgIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5KFxuICAgICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAgICAgICAgICAgZmxhdm91clxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgcmV0dXJuIGluamVjdGFibGUgYXMgVCB8IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
@@ -10,3 +10,6 @@ export type IndexMetadata = {
10
10
  directions?: OrderDirection[2];
11
11
  compositions?: string[];
12
12
  };
13
+ export type NamedIndexMetadata = IndexMetadata & {
14
+ suffix: string;
15
+ };
@@ -0,0 +1,3 @@
1
+ export {};
2
+
3
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJmaWxlIjoicmVwb3NpdG9yeS90eXBlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhc2NhZGUsIE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgZGVmaW5lcyB0aGUgY2FzY2FkaW5nIGJlaGF2aW91clxuICovXG5leHBvcnQgdHlwZSBDYXNjYWRlTWV0YWRhdGEgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZTtcbiAgZGVsZXRlOiBDYXNjYWRlO1xufTtcblxuZXhwb3J0IHR5cGUgSW5kZXhNZXRhZGF0YSA9IHtcbiAgZGlyZWN0aW9ucz86IE9yZGVyRGlyZWN0aW9uWzJdO1xuICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIE5hbWVkSW5kZXhNZXRhZGF0YSA9IEluZGV4TWV0YWRhdGEgJiB7XG4gIHN1ZmZpeDogc3RyaW5nO1xufTtcbiJdfQ==
@@ -1,5 +1,3 @@
1
- import { DBModel } from "@decaf-ts/db-decorators";
2
- import { Repository } from "./Repository";
3
1
  import { Constructor } from "@decaf-ts/decorator-validation";
4
- export declare function bootRepository<T extends DBModel>(model: Constructor<T>, original: (...args: any[]) => Repository<T>): string;
5
- export declare function getTableName<T extends DBModel>(model: T | any): any;
2
+ import { Model } from "@decaf-ts/decorator-validation";
3
+ export declare function generateInjectableNameForRepository<T extends Model>(model: Constructor<T> | T, flavour?: string): string;
@@ -1 +1,17 @@
1
- import{DBKeys,DBModel,getDBKey,InternalError}from"@decaf-ts/db-decorators";import{Injectables}from"@decaf-ts/injectable-decorators";import{Adapter}from"../persistence/Adapter";import{getPersistenceKey}from"../persistence/decorators";import{PersistenceKeys}from"../persistence/constants";function bootRepository(e,t){var r=Reflect.getMetadata(getDBKey(DBKeys.REPOSITORY),e);if(!r)throw new InternalError("No Repository defined for model "+e.constructor.name);e=Reflect.getMetadata(getPersistenceKey(PersistenceKeys.ADAPTER),t);if(!e)throw new InternalError("Could not find persistence adapter definition for repository "+t.name);try{var o=Adapter.get(e);Injectables.get(r,o)}catch(e){throw new InternalError(e)}return r}function getTableName(e){var t=Reflect.getMetadata(getPersistenceKey(PersistenceKeys.TABLE),e instanceof DBModel?e.constructor:e);return t||(e instanceof DBModel?e.constructor:e).name}export{bootRepository,getTableName};
1
+ import { InternalError } from "@decaf-ts/db-decorators";
2
+ import { sf } from "@decaf-ts/decorator-validation";
3
+ import { Adapter } from "../persistence/Adapter";
4
+ import { PersistenceKeys } from "../persistence/constants";
5
+ import { Model } from "@decaf-ts/decorator-validation";
6
+ import { Repository } from "./Repository";
7
+ export function generateInjectableNameForRepository(model, flavour) {
8
+ if (!flavour) {
9
+ const key = Adapter.key(PersistenceKeys.ADAPTER);
10
+ flavour = Reflect.getMetadata(key, model instanceof Model ? model.constructor : model);
11
+ if (!flavour)
12
+ throw new InternalError(`Could not retrieve flavour from model ${model instanceof Model ? model.constructor.name : model.name}`);
13
+ }
14
+ return sf(PersistenceKeys.INJECTABLE, flavour, Repository.table(model));
15
+ }
16
+
17
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9yZXBvc2l0b3J5L3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQWUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUUxQyxNQUFNLFVBQVUsbUNBQW1DLENBQ2pELEtBQXlCLEVBQ3pCLE9BQWdCO0lBRWhCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUMzQixHQUFHLEVBQ0gsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUNuRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU87WUFDVixNQUFNLElBQUksYUFBYSxDQUNyQix5Q0FBeUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FDeEcsQ0FBQztJQUNOLENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDMUUsQ0FBQyIsImZpbGUiOiJyZXBvc2l0b3J5L3V0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIHNmIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8VD4gfCBULFxuICBmbGF2b3VyPzogc3RyaW5nXG4pIHtcbiAgaWYgKCFmbGF2b3VyKSB7XG4gICAgY29uc3Qga2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpO1xuICAgIGZsYXZvdXIgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAga2V5LFxuICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IG1vZGVsLmNvbnN0cnVjdG9yIDogbW9kZWxcbiAgICApO1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IHJldHJpZXZlIGZsYXZvdXIgZnJvbSBtb2RlbCAke21vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lIDogbW9kZWwubmFtZX1gXG4gICAgICApO1xuICB9XG4gIHJldHVybiBzZihQZXJzaXN0ZW5jZUtleXMuSU5KRUNUQUJMRSwgZmxhdm91ciwgUmVwb3NpdG9yeS50YWJsZShtb2RlbCkpO1xufVxuIl19
@@ -0,0 +1,28 @@
1
+ import { Validator } from "@decaf-ts/decorator-validation";
2
+ /**
3
+ * @summary Validates a {@link Sequence}'s {@link Clause}s
4
+ *
5
+ * @param {string} [message]
6
+ *
7
+ * @class ClauseSequenceValidator
8
+ * @extends Validator
9
+ *
10
+ * @category Validation
11
+ * @subcategory Validators
12
+ */
13
+ export declare class ClauseSequenceValidator extends Validator {
14
+ constructor(message?: string);
15
+ private validateSequence;
16
+ /**
17
+ * @summary Verifies the model for errors
18
+ * @param {string} value
19
+ * @param {string} [message]
20
+ *
21
+ * @return Errors
22
+ *
23
+ * @override
24
+ *
25
+ * @see Validator
26
+ */
27
+ hasErrors(value: any, message?: string): string | undefined;
28
+ }