@decaf-ts/core 0.5.1 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/LICENSE.md +21 -157
  2. package/README.md +652 -15
  3. package/dist/core.cjs +2110 -132
  4. package/dist/core.esm.cjs +2111 -133
  5. package/lib/esm/identity/decorators.d.ts +52 -7
  6. package/lib/esm/identity/decorators.js +53 -8
  7. package/lib/esm/identity/utils.d.ts +19 -0
  8. package/lib/esm/identity/utils.js +20 -1
  9. package/lib/esm/index.d.ts +9 -2
  10. package/lib/esm/index.js +10 -3
  11. package/lib/esm/interfaces/ErrorParser.d.ts +12 -0
  12. package/lib/esm/interfaces/ErrorParser.js +1 -1
  13. package/lib/esm/interfaces/Executor.d.ts +13 -0
  14. package/lib/esm/interfaces/Executor.js +1 -1
  15. package/lib/esm/interfaces/Observable.d.ts +27 -0
  16. package/lib/esm/interfaces/Observable.js +1 -1
  17. package/lib/esm/interfaces/Observer.d.ts +12 -0
  18. package/lib/esm/interfaces/Observer.js +1 -1
  19. package/lib/esm/interfaces/Paginatable.d.ts +15 -0
  20. package/lib/esm/interfaces/Paginatable.js +1 -1
  21. package/lib/esm/interfaces/Queriable.d.ts +34 -9
  22. package/lib/esm/interfaces/Queriable.js +1 -1
  23. package/lib/esm/interfaces/RawExecutor.d.ts +14 -0
  24. package/lib/esm/interfaces/RawExecutor.js +1 -1
  25. package/lib/esm/interfaces/SequenceOptions.d.ts +52 -0
  26. package/lib/esm/interfaces/SequenceOptions.js +19 -1
  27. package/lib/esm/model/BaseModel.d.ts +31 -0
  28. package/lib/esm/model/BaseModel.js +24 -1
  29. package/lib/esm/model/construction.d.ts +433 -0
  30. package/lib/esm/model/construction.js +441 -2
  31. package/lib/esm/model/decorators.d.ts +159 -29
  32. package/lib/esm/model/decorators.js +160 -30
  33. package/lib/esm/model/types.d.ts +9 -0
  34. package/lib/esm/model/types.js +1 -1
  35. package/lib/esm/persistence/Adapter.d.ts +358 -17
  36. package/lib/esm/persistence/Adapter.js +287 -19
  37. package/lib/esm/persistence/Dispatch.d.ts +114 -1
  38. package/lib/esm/persistence/Dispatch.js +102 -4
  39. package/lib/esm/persistence/ObserverHandler.d.ts +95 -0
  40. package/lib/esm/persistence/ObserverHandler.js +96 -1
  41. package/lib/esm/persistence/Sequence.d.ts +89 -0
  42. package/lib/esm/persistence/Sequence.js +70 -1
  43. package/lib/esm/persistence/constants.d.ts +22 -0
  44. package/lib/esm/persistence/constants.js +23 -1
  45. package/lib/esm/persistence/decorators.d.ts +10 -0
  46. package/lib/esm/persistence/decorators.js +11 -1
  47. package/lib/esm/persistence/errors.d.ts +23 -0
  48. package/lib/esm/persistence/errors.js +24 -1
  49. package/lib/esm/persistence/types.d.ts +18 -0
  50. package/lib/esm/persistence/types.js +1 -1
  51. package/lib/esm/query/Condition.d.ts +78 -31
  52. package/lib/esm/query/Condition.js +132 -53
  53. package/lib/esm/query/Paginator.d.ts +56 -0
  54. package/lib/esm/query/Paginator.js +57 -1
  55. package/lib/esm/query/Statement.d.ts +51 -0
  56. package/lib/esm/query/Statement.js +52 -1
  57. package/lib/esm/query/constants.d.ts +25 -0
  58. package/lib/esm/query/constants.js +26 -1
  59. package/lib/esm/query/errors.d.ts +14 -0
  60. package/lib/esm/query/errors.js +15 -1
  61. package/lib/esm/query/options.d.ts +21 -3
  62. package/lib/esm/query/options.js +1 -1
  63. package/lib/esm/query/selectors.d.ts +26 -0
  64. package/lib/esm/query/selectors.js +1 -1
  65. package/lib/esm/ram/RamAdapter.d.ts +311 -0
  66. package/lib/esm/ram/RamAdapter.js +312 -1
  67. package/lib/esm/ram/RamContext.d.ts +16 -1
  68. package/lib/esm/ram/RamContext.js +18 -3
  69. package/lib/esm/ram/RamPaginator.d.ts +43 -0
  70. package/lib/esm/ram/RamPaginator.js +54 -2
  71. package/lib/esm/ram/RamSequence.d.ts +61 -0
  72. package/lib/esm/ram/RamSequence.js +63 -2
  73. package/lib/esm/ram/RamStatement.d.ts +74 -0
  74. package/lib/esm/ram/RamStatement.js +75 -1
  75. package/lib/esm/ram/constants.d.ts +8 -0
  76. package/lib/esm/ram/constants.js +9 -1
  77. package/lib/esm/ram/handlers.d.ts +19 -0
  78. package/lib/esm/ram/handlers.js +20 -1
  79. package/lib/esm/ram/model/RamSequence.d.ts +25 -0
  80. package/lib/esm/ram/model/RamSequence.js +19 -1
  81. package/lib/esm/ram/types.d.ts +42 -0
  82. package/lib/esm/ram/types.js +1 -1
  83. package/lib/esm/repository/Repository.d.ts +363 -8
  84. package/lib/esm/repository/Repository.js +361 -16
  85. package/lib/esm/repository/constants.d.ts +25 -0
  86. package/lib/esm/repository/constants.js +26 -1
  87. package/lib/esm/repository/decorators.d.ts +27 -0
  88. package/lib/esm/repository/decorators.js +28 -1
  89. package/lib/esm/repository/errors.d.ts +12 -5
  90. package/lib/esm/repository/errors.js +13 -6
  91. package/lib/esm/repository/injectables.d.ts +18 -0
  92. package/lib/esm/repository/injectables.js +19 -1
  93. package/lib/esm/repository/types.d.ts +15 -0
  94. package/lib/esm/repository/types.js +1 -1
  95. package/lib/esm/repository/utils.d.ts +11 -0
  96. package/lib/esm/repository/utils.js +12 -1
  97. package/lib/esm/utils/decorators.d.ts +8 -0
  98. package/lib/esm/utils/decorators.js +9 -1
  99. package/lib/esm/utils/errors.d.ts +46 -0
  100. package/lib/esm/utils/errors.js +47 -1
  101. package/lib/identity/decorators.cjs +53 -8
  102. package/lib/identity/decorators.d.ts +52 -7
  103. package/lib/identity/utils.cjs +20 -1
  104. package/lib/identity/utils.d.ts +19 -0
  105. package/lib/index.cjs +10 -3
  106. package/lib/index.d.ts +9 -2
  107. package/lib/interfaces/ErrorParser.cjs +1 -1
  108. package/lib/interfaces/ErrorParser.d.ts +12 -0
  109. package/lib/interfaces/Executor.cjs +1 -1
  110. package/lib/interfaces/Executor.d.ts +13 -0
  111. package/lib/interfaces/Observable.cjs +1 -1
  112. package/lib/interfaces/Observable.d.ts +27 -0
  113. package/lib/interfaces/Observer.cjs +1 -1
  114. package/lib/interfaces/Observer.d.ts +12 -0
  115. package/lib/interfaces/Paginatable.cjs +1 -1
  116. package/lib/interfaces/Paginatable.d.ts +15 -0
  117. package/lib/interfaces/Queriable.cjs +1 -1
  118. package/lib/interfaces/Queriable.d.ts +34 -9
  119. package/lib/interfaces/RawExecutor.cjs +1 -1
  120. package/lib/interfaces/RawExecutor.d.ts +14 -0
  121. package/lib/interfaces/SequenceOptions.cjs +19 -1
  122. package/lib/interfaces/SequenceOptions.d.ts +52 -0
  123. package/lib/model/BaseModel.cjs +24 -1
  124. package/lib/model/BaseModel.d.ts +31 -0
  125. package/lib/model/construction.cjs +441 -2
  126. package/lib/model/construction.d.ts +433 -0
  127. package/lib/model/decorators.cjs +160 -30
  128. package/lib/model/decorators.d.ts +159 -29
  129. package/lib/model/types.cjs +1 -1
  130. package/lib/model/types.d.ts +9 -0
  131. package/lib/persistence/Adapter.cjs +287 -19
  132. package/lib/persistence/Adapter.d.ts +358 -17
  133. package/lib/persistence/Dispatch.cjs +102 -4
  134. package/lib/persistence/Dispatch.d.ts +114 -1
  135. package/lib/persistence/ObserverHandler.cjs +96 -1
  136. package/lib/persistence/ObserverHandler.d.ts +95 -0
  137. package/lib/persistence/Sequence.cjs +70 -1
  138. package/lib/persistence/Sequence.d.ts +89 -0
  139. package/lib/persistence/constants.cjs +23 -1
  140. package/lib/persistence/constants.d.ts +22 -0
  141. package/lib/persistence/decorators.cjs +11 -1
  142. package/lib/persistence/decorators.d.ts +10 -0
  143. package/lib/persistence/errors.cjs +24 -1
  144. package/lib/persistence/errors.d.ts +23 -0
  145. package/lib/persistence/types.cjs +1 -1
  146. package/lib/persistence/types.d.ts +18 -0
  147. package/lib/query/Condition.cjs +132 -53
  148. package/lib/query/Condition.d.ts +78 -31
  149. package/lib/query/Paginator.cjs +57 -1
  150. package/lib/query/Paginator.d.ts +56 -0
  151. package/lib/query/Statement.cjs +52 -1
  152. package/lib/query/Statement.d.ts +51 -0
  153. package/lib/query/constants.cjs +26 -1
  154. package/lib/query/constants.d.ts +25 -0
  155. package/lib/query/errors.cjs +15 -1
  156. package/lib/query/errors.d.ts +14 -0
  157. package/lib/query/options.cjs +1 -1
  158. package/lib/query/options.d.ts +21 -3
  159. package/lib/query/selectors.cjs +1 -1
  160. package/lib/query/selectors.d.ts +26 -0
  161. package/lib/ram/RamAdapter.cjs +312 -1
  162. package/lib/ram/RamAdapter.d.ts +311 -0
  163. package/lib/ram/RamContext.cjs +18 -3
  164. package/lib/ram/RamContext.d.ts +16 -1
  165. package/lib/ram/RamPaginator.cjs +54 -2
  166. package/lib/ram/RamPaginator.d.ts +43 -0
  167. package/lib/ram/RamSequence.cjs +63 -2
  168. package/lib/ram/RamSequence.d.ts +61 -0
  169. package/lib/ram/RamStatement.cjs +75 -1
  170. package/lib/ram/RamStatement.d.ts +74 -0
  171. package/lib/ram/constants.cjs +9 -1
  172. package/lib/ram/constants.d.ts +8 -0
  173. package/lib/ram/handlers.cjs +20 -1
  174. package/lib/ram/handlers.d.ts +19 -0
  175. package/lib/ram/model/RamSequence.cjs +19 -1
  176. package/lib/ram/model/RamSequence.d.ts +25 -0
  177. package/lib/ram/types.cjs +1 -1
  178. package/lib/ram/types.d.ts +42 -0
  179. package/lib/repository/Repository.cjs +360 -15
  180. package/lib/repository/Repository.d.ts +363 -8
  181. package/lib/repository/constants.cjs +26 -1
  182. package/lib/repository/constants.d.ts +25 -0
  183. package/lib/repository/decorators.cjs +28 -1
  184. package/lib/repository/decorators.d.ts +27 -0
  185. package/lib/repository/errors.cjs +13 -6
  186. package/lib/repository/errors.d.ts +12 -5
  187. package/lib/repository/injectables.cjs +19 -1
  188. package/lib/repository/injectables.d.ts +18 -0
  189. package/lib/repository/types.cjs +1 -1
  190. package/lib/repository/types.d.ts +15 -0
  191. package/lib/repository/utils.cjs +12 -1
  192. package/lib/repository/utils.d.ts +11 -0
  193. package/lib/utils/decorators.cjs +9 -1
  194. package/lib/utils/decorators.d.ts +8 -0
  195. package/lib/utils/errors.cjs +47 -1
  196. package/lib/utils/errors.d.ts +46 -0
  197. package/package.json +5 -5
@@ -21,21 +21,36 @@ const Repository_1 = require("./../repository/Repository.cjs");
21
21
  const Condition_1 = require("./../query/Condition.cjs");
22
22
  const construction_1 = require("./construction.cjs");
23
23
  const utils_1 = require("./../utils/index.cjs");
24
+ /**
25
+ * @description Specifies the database table name for a model
26
+ * @summary Decorator that sets the table name for a model class in the database
27
+ * @param {string} tableName - The name of the table in the database
28
+ * @return {Function} A decorator function that can be applied to a class
29
+ * @function table
30
+ * @category Class Decorators
31
+ */
24
32
  function table(tableName) {
25
33
  return (0, reflection_1.metadata)(Adapter_1.Adapter.key(constants_1.PersistenceKeys.TABLE), tableName);
26
34
  }
35
+ /**
36
+ * @description Specifies the database column name for a model property
37
+ * @summary Decorator that maps a model property to a specific column name in the database
38
+ * @param {string} columnName - The name of the column in the database
39
+ * @return {Function} A decorator function that can be applied to a class property
40
+ * @function column
41
+ * @category Property Decorators
42
+ */
27
43
  function column(columnName) {
28
44
  return (0, decorator_validation_1.propMetadata)(Adapter_1.Adapter.key(constants_1.PersistenceKeys.COLUMN), columnName);
29
45
  }
30
46
  /**
31
- * @summary Index Decorator
32
- * @description properties decorated will the index in the
33
- * DB for performance in queries
34
- *
35
- * @param {OrderDirection[]} [directions]
36
- * @param {string[]} [compositions]
37
- *
47
+ * @description Creates an index on a model property for improved query performance
48
+ * @summary Decorator that marks a property to be indexed in the database, optionally with specific directions and compositions
49
+ * @param {OrderDirection[]} [directions] - Optional array of sort directions for the index
50
+ * @param {string[]} [compositions] - Optional array of property names to create a composite index
51
+ * @return {Function} A decorator function that can be applied to a class property
38
52
  * @function index
53
+ * @category Property Decorators
39
54
  */
40
55
  function index(directions, compositions) {
41
56
  return (0, decorator_validation_1.propMetadata)(Repository_1.Repository.key(`${constants_1.PersistenceKeys.INDEX}${compositions && compositions.length ? `.${compositions.join(".")}` : ""}`), {
@@ -43,6 +58,23 @@ function index(directions, compositions) {
43
58
  compositions: compositions,
44
59
  });
45
60
  }
61
+ /**
62
+ * @description Enforces uniqueness constraint during model creation and update
63
+ * @summary Internal function used by the unique decorator to check if a property value already exists in the database
64
+ * @template M - The model type extending Model
65
+ * @template R - The repository type extending Repo<M, F, C>
66
+ * @template V - The metadata type
67
+ * @template F - The repository flags type
68
+ * @template C - The context type extending Context<F>
69
+ * @param {R} this - The repository instance
70
+ * @param {Context<F>} context - The context for the operation
71
+ * @param {V} data - The metadata for the property
72
+ * @param key - The property key to check for uniqueness
73
+ * @param {M} model - The model instance being created or updated
74
+ * @return {Promise<void>} A promise that resolves when the check is complete or rejects with a ConflictError
75
+ * @function uniqueOnCreateUpdate
76
+ * @memberOf module:core
77
+ */
46
78
  async function uniqueOnCreateUpdate(context, data, key, model) {
47
79
  if (!model[key])
48
80
  return;
@@ -53,16 +85,40 @@ async function uniqueOnCreateUpdate(context, data, key, model) {
53
85
  throw new db_decorators_1.ConflictError(`model already exists with property ${key} equal to ${JSON.stringify(model[key], undefined, 2)}`);
54
86
  }
55
87
  /**
56
- * @summary Unique Decorator
57
- * @description Tags a property as unique.
58
- * No other elements in that table can have the same property value
59
- *
88
+ * @description Tags a property as unique
89
+ * @summary Decorator that ensures a property value is unique across all instances of a model in the database
90
+ * @return {Function} A decorator function that can be applied to a class property
60
91
  * @function unique
61
- *
92
+ * @category Property Decorators
93
+ * @example
94
+ * ```typescript
95
+ * class User extends BaseModel {
96
+ * @unique()
97
+ * @required()
98
+ * username!: string;
99
+ * }
100
+ * ```
62
101
  */
63
102
  function unique() {
64
103
  return (0, reflection_1.apply)((0, db_decorators_1.onCreateUpdate)(uniqueOnCreateUpdate), (0, decorator_validation_1.propMetadata)(Repository_1.Repository.key(constants_1.PersistenceKeys.UNIQUE), {}));
65
104
  }
105
+ /**
106
+ * @description Handles user identification for ownership tracking
107
+ * @summary Internal function used by the createdBy and updatedBy decorators to set ownership information
108
+ * @template M - The model type extending Model
109
+ * @template R - The repository type extending Repo<M, F, C>
110
+ * @template V - The relations metadata type extending RelationsMetadata
111
+ * @template F - The repository flags type
112
+ * @template C - The context type extending Context<F>
113
+ * @param {R} this - The repository instance
114
+ * @param {Context<F>} context - The context for the operation
115
+ * @param {V} data - The metadata for the property
116
+ * @param key - The property key to store the user identifier
117
+ * @param {M} model - The model instance being created or updated
118
+ * @return {Promise<void>} A promise that rejects with an AuthorizationError if user identification is not supported
119
+ * @function createdByOnCreateUpdate
120
+ * @memberOf module:core
121
+ */
66
122
  async function createdByOnCreateUpdate(
67
123
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
68
124
  context,
@@ -74,12 +130,40 @@ key,
74
130
  model) {
75
131
  throw new utils_1.AuthorizationError("This adapter does not support user identification");
76
132
  }
133
+ /**
134
+ * @description Tracks the creator of a model instance
135
+ * @summary Decorator that marks a property to store the identifier of the user who created the model instance
136
+ * @return {Function} A decorator function that can be applied to a class property
137
+ * @function createdBy
138
+ * @category Property Decorators
139
+ * @example
140
+ * ```typescript
141
+ * class Document extends BaseModel {
142
+ * @createdBy()
143
+ * creator!: string;
144
+ * }
145
+ * ```
146
+ */
77
147
  function createdBy() {
78
148
  const key = Repository_1.Repository.key(constants_1.PersistenceKeys.CREATED_BY);
79
149
  return decorator_validation_1.Decoration.for(key)
80
150
  .define((0, db_decorators_1.onCreate)(createdByOnCreateUpdate), (0, decorator_validation_1.propMetadata)(key, {}))
81
151
  .apply();
82
152
  }
153
+ /**
154
+ * @description Tracks the last updater of a model instance
155
+ * @summary Decorator that marks a property to store the identifier of the user who last updated the model instance
156
+ * @return {Function} A decorator function that can be applied to a class property
157
+ * @function updatedBy
158
+ * @category Property Decorators
159
+ * @example
160
+ * ```typescript
161
+ * class Document extends BaseModel {
162
+ * @updatedBy()
163
+ * lastEditor!: string;
164
+ * }
165
+ * ```
166
+ */
83
167
  function updatedBy() {
84
168
  const key = Repository_1.Repository.key(constants_1.PersistenceKeys.UPDATED_BY);
85
169
  return decorator_validation_1.Decoration.for(key)
@@ -87,15 +171,27 @@ function updatedBy() {
87
171
  .apply();
88
172
  }
89
173
  /**
90
- * @summary One To One relation Decorators
91
- *
92
- * @param {Constructor<any>} clazz the {@link Sequence}
93
- * @param {CascadeMetadata} [cascadeOptions]
94
- * @param {boolean} populate If true, replaces the specified key in the document with the corresponding record from the database
95
- *
174
+ * @description Defines a one-to-one relationship between models
175
+ * @summary Decorator that establishes a one-to-one relationship between the current model and another model
176
+ * @template M - The related model type extending Model
177
+ * @param {Constructor<M>} clazz - The constructor of the related model class
178
+ * @param {CascadeMetadata} [cascadeOptions=DefaultCascade] - Options for cascading operations (create, update, delete)
179
+ * @param {boolean} [populate=true] - If true, automatically populates the relationship when the model is retrieved
180
+ * @return {Function} A decorator function that can be applied to a class property
96
181
  * @function oneToOne
182
+ * @category Property Decorators
183
+ * @example
184
+ * ```typescript
185
+ * class User extends BaseModel {
186
+ * @oneToOne(Profile)
187
+ * profile!: string | Profile;
188
+ * }
97
189
  *
98
- *
190
+ * class Profile extends BaseModel {
191
+ * @required()
192
+ * bio!: string;
193
+ * }
194
+ * ```
99
195
  * @see oneToMany
100
196
  * @see manyToOne
101
197
  */
@@ -112,13 +208,30 @@ function oneToOne(clazz, cascadeOptions = constants_2.DefaultCascade, populate =
112
208
  .apply();
113
209
  }
114
210
  /**
115
- * @summary One To Many relation Decorators
116
- *
117
- * @param {Constructor<any>} clazz the {@link Sequence} to use.
118
- * @param {CascadeMetadata} [cascadeOptions]
119
- *
211
+ * @description Defines a one-to-many relationship between models
212
+ * @summary Decorator that establishes a one-to-many relationship between the current model and multiple instances of another model
213
+ * @template M - The related model type extending Model
214
+ * @param {Constructor<M>} clazz - The constructor of the related model class
215
+ * @param {CascadeMetadata} [cascadeOptions=DefaultCascade] - Options for cascading operations (create, update, delete)
216
+ * @param {boolean} [populate=true] - If true, automatically populates the relationship when the model is retrieved
217
+ * @return {Function} A decorator function that can be applied to a class property
120
218
  * @function oneToMany
219
+ * @category Property Decorators
220
+ * @example
221
+ * ```typescript
222
+ * class Author extends BaseModel {
223
+ * @required()
224
+ * name!: string;
225
+ *
226
+ * @oneToMany(Book)
227
+ * books!: string[] | Book[];
228
+ * }
121
229
  *
230
+ * class Book extends BaseModel {
231
+ * @required()
232
+ * title!: string;
233
+ * }
234
+ * ```
122
235
  * @see oneToOne
123
236
  * @see manyToOne
124
237
  */
@@ -137,13 +250,30 @@ function oneToMany(clazz, cascadeOptions = constants_2.DefaultCascade, populate
137
250
  .apply();
138
251
  }
139
252
  /**
140
- * @summary Many To One relation Decorators
141
- *
142
- * @param {Constructor<any>} clazz the {@link Sequence} to use. Defaults to {@link NoneSequence}
143
- * @param {CascadeMetadata} [cascadeOptions]
144
- *
253
+ * @description Defines a many-to-one relationship between models
254
+ * @summary Decorator that establishes a many-to-one relationship between multiple instances of the current model and another model
255
+ * @template M - The related model type extending Model
256
+ * @param {Constructor<M>} clazz - The constructor of the related model class
257
+ * @param {CascadeMetadata} [cascadeOptions=DefaultCascade] - Options for cascading operations (create, update, delete)
258
+ * @param {boolean} [populate=true] - If true, automatically populates the relationship when the model is retrieved
259
+ * @return {Function} A decorator function that can be applied to a class property
145
260
  * @function manyToOne
261
+ * @category Property Decorators
262
+ * @example
263
+ * ```typescript
264
+ * class Book extends BaseModel {
265
+ * @required()
266
+ * title!: string;
267
+ *
268
+ * @manyToOne(Author)
269
+ * author!: string | Author;
270
+ * }
146
271
  *
272
+ * class Author extends BaseModel {
273
+ * @required()
274
+ * name!: string;
275
+ * }
276
+ * ```
147
277
  * @see oneToMany
148
278
  * @see oneToOne
149
279
  */
@@ -164,4 +294,4 @@ function manyToOne(clazz, cascadeOptions = constants_2.DefaultCascade, populate
164
294
  (0, decorator_validation_1.propMetadata)(key, metadata))
165
295
  .apply();
166
296
  }
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBc0NBLHNCQUVDO0FBRUQsd0JBRUM7QUFZRCxzQkFVQztBQUVELG9EQXFCQztBQVVELHdCQUtDO0FBRUQsMERBb0JDO0FBRUQsOEJBS0M7QUFFRCw4QkFLQztBQWVELDRCQXVCQztBQWFELDhCQXdCQztBQWFELDhCQXVCQztBQTNQRCwyREFTaUM7QUFDakMscURBQXVEO0FBQ3ZELDhEQUEyRDtBQUUzRCw2REFBeUU7QUFDekUseUVBUXdDO0FBQ3hDLDBEQUFpRDtBQUNqRCwrREFBNEQ7QUFDNUQsd0RBQStDO0FBRS9DLHFEQVF3QjtBQUN4QixnREFBOEM7QUFFOUMsU0FBZ0IsS0FBSyxDQUFDLFNBQWlCO0lBQ3JDLE9BQU8sSUFBQSxxQkFBUSxFQUFDLGlCQUFPLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELFNBQWdCLE1BQU0sQ0FBQyxVQUFrQjtJQUN2QyxPQUFPLElBQUEsbUNBQVksRUFBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQywyQkFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixLQUFLLENBQUMsVUFBNkIsRUFBRSxZQUF1QjtJQUMxRSxPQUFPLElBQUEsbUNBQVksRUFDakIsdUJBQVUsQ0FBQyxHQUFHLENBQ1osR0FBRywyQkFBZSxDQUFDLEtBQUssR0FBRyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNyRyxFQUNEO1FBQ0UsVUFBVSxFQUFFLFVBQVU7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LEVBQ3JDLElBQUEsd0JBQVEsRUFBQyx1QkFBRyxFQUFFLFFBQVEsQ0FBQyxFQUN2QixJQUFBLG1DQUFZLEVBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUM1QjtTQUNBLEtBQUssRUFBRSxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixTQUFTLENBQ3ZCLEtBQXFCLEVBQ3JCLGlCQUFrQywwQkFBYyxFQUNoRCxRQUFRLEdBQUcsSUFBSTtJQUVmLDRCQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RCLE1BQU0sUUFBUSxHQUFzQjtRQUNsQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUk7UUFDakIsT0FBTyxFQUFFLGNBQWM7UUFDdkIsUUFBUSxFQUFFLFFBQVE7S0FDbkIsQ0FBQztJQUNGLE1BQU0sR0FBRyxHQUFHLHVCQUFVLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEQsT0FBTyxpQ0FBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7U0FDdkIsTUFBTSxDQUNMLElBQUEsMkJBQUksRUFBQywyQkFBZSxDQUFDLFNBQVMsQ0FBQyxFQUMvQixJQUFBLDJCQUFJLEVBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekQseUNBQXlDO0lBQ3pDLHlDQUF5QztJQUN6Qyx5Q0FBeUM7SUFDekMsZ0NBQWdDO0lBQ2hDLElBQUEsbUNBQVksRUFBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQzVCO1NBQ0EsS0FBSyxFQUFFLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uQ3JlYXRlVXBkYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25VcGRhdGUsXG4gIGFmdGVyQW55LFxuICBSZXBvc2l0b3J5RmxhZ3MsXG4gIENvbnRleHQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDYXNjYWRlTWV0YWRhdGEsIEluZGV4TWV0YWRhdGEgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdENhc2NhZGUsIE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgbGlzdCxcbiAgTW9kZWwsXG4gIHByb3AsXG4gIHByb3BNZXRhZGF0YSxcbiAgdHlwZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9BZGFwdGVyXCI7XG5pbXBvcnQgeyBSZXBvLCBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSBcIi4uL3F1ZXJ5L0NvbmRpdGlvblwiO1xuaW1wb3J0IHsgUmVsYXRpb25zTWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgb25lVG9NYW55T25DcmVhdGUsXG4gIG9uZVRvTWFueU9uRGVsZXRlLFxuICBvbmVUb01hbnlPblVwZGF0ZSxcbiAgb25lVG9PbmVPbkNyZWF0ZSxcbiAgb25lVG9PbmVPbkRlbGV0ZSxcbiAgb25lVG9PbmVPblVwZGF0ZSxcbiAgcG9wdWxhdGUgYXMgcG9wLFxufSBmcm9tIFwiLi9jb25zdHJ1Y3Rpb25cIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gdGFibGUodGFibGVOYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIG1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5UQUJMRSksIHRhYmxlTmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2x1bW4oY29sdW1uTmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBwcm9wTWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTiksIGNvbHVtbk5hbWUpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEluZGV4IERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpbGwgdGhlIGluZGV4IGluIHRoZVxuICogREIgZm9yIHBlcmZvcm1hbmNlIGluIHF1ZXJpZXNcbiAqXG4gKiBAcGFyYW0ge09yZGVyRGlyZWN0aW9uW119IFtkaXJlY3Rpb25zXVxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2NvbXBvc2l0aW9uc11cbiAqXG4gKiBAZnVuY3Rpb24gaW5kZXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KGRpcmVjdGlvbnM/OiBPcmRlckRpcmVjdGlvbltdLCBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSkge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhKFxuICAgIFJlcG9zaXRvcnkua2V5KFxuICAgICAgYCR7UGVyc2lzdGVuY2VLZXlzLklOREVYfSR7Y29tcG9zaXRpb25zICYmIGNvbXBvc2l0aW9ucy5sZW5ndGggPyBgLiR7Y29tcG9zaXRpb25zLmpvaW4oXCIuXCIpfWAgOiBcIlwifWBcbiAgICApLFxuICAgIHtcbiAgICAgIGRpcmVjdGlvbnM6IGRpcmVjdGlvbnMsXG4gICAgICBjb21wb3NpdGlvbnM6IGNvbXBvc2l0aW9ucyxcbiAgICB9IGFzIEluZGV4TWV0YWRhdGFcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVuaXF1ZU9uQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgb2JqZWN0LFxuICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShtb2RlbCBhcyBhbnkpW2tleV0pIHJldHVybjtcbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnNlbGVjdCgpXG4gICAgLndoZXJlKENvbmRpdGlvbi5hdHRyaWJ1dGUoa2V5KS5lcShtb2RlbFtrZXldKSlcbiAgICAuZXhlY3V0ZSgpO1xuICBpZiAoZXhpc3RpbmcubGVuZ3RoKVxuICAgIHRocm93IG5ldyBDb25mbGljdEVycm9yKFxuICAgICAgYG1vZGVsIGFscmVhZHkgZXhpc3RzIHdpdGggcHJvcGVydHkgJHtrZXkgYXMgc3RyaW5nfSBlcXVhbCB0byAke0pTT04uc3RyaW5naWZ5KChtb2RlbCBhcyBhbnkpW2tleV0sIHVuZGVmaW5lZCwgMil9YFxuICAgICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVW5pcXVlIERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIFRhZ3MgYSBwcm9wZXJ0eSBhcyB1bmlxdWUuXG4gKiAgTm8gb3RoZXIgZWxlbWVudHMgaW4gdGhhdCB0YWJsZSBjYW4gaGF2ZSB0aGUgc2FtZSBwcm9wZXJ0eSB2YWx1ZVxuICpcbiAqIEBmdW5jdGlvbiB1bmlxdWVcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWUoKSB7XG4gIHJldHVybiBhcHBseShcbiAgICBvbkNyZWF0ZVVwZGF0ZSh1bmlxdWVPbkNyZWF0ZVVwZGF0ZSksXG4gICAgcHJvcE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VTklRVUUpLCB7fSlcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZWRCeU9uQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvPE0sIEYsIEM+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBjb250ZXh0OiBDb250ZXh0PEY+LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGRhdGE6IFYsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAga2V5OiBrZXlvZiBNLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICBcIlRoaXMgYWRhcHRlciBkb2VzIG5vdCBzdXBwb3J0IHVzZXIgaWRlbnRpZmljYXRpb25cIlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlZEJ5KCkge1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSk7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZShvbkNyZWF0ZShjcmVhdGVkQnlPbkNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShrZXksIHt9KSlcbiAgICAuYXBwbHkoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZWRCeSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUob25DcmVhdGVVcGRhdGUoY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEoa2V5LCB7fSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgT25lIFRvIE9uZSByZWxhdGlvbiBEZWNvcmF0b3JzXG4gKlxuICogQHBhcmFtIHtDb25zdHJ1Y3Rvcjxhbnk+fSBjbGF6eiB0aGUge0BsaW5rIFNlcXVlbmNlfVxuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcG9wdWxhdGUgSWYgdHJ1ZSwgcmVwbGFjZXMgdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhlIGRvY3VtZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gKlxuICogQGZ1bmN0aW9uIG9uZVRvT25lXG4gKlxuICpcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG1hbnlUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lVG9PbmU8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlOiBib29sZWFuID0gdHJ1ZVxuKSB7XG4gIE1vZGVsLnJlZ2lzdGVyKGNsYXp6KTtcbiAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgIGNsYXNzOiBjbGF6ei5uYW1lLFxuICAgIGNhc2NhZGU6IGNhc2NhZGVPcHRpb25zLFxuICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgfTtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkUpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgdHlwZShbY2xhenoubmFtZSwgU3RyaW5nLm5hbWUsIE51bWJlci5uYW1lLCBCaWdJbnQubmFtZV0pLFxuICAgICAgb25DcmVhdGUob25lVG9PbmVPbkNyZWF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25VcGRhdGUob25lVG9PbmVPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25EZWxldGUob25lVG9PbmVPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgYWZ0ZXJBbnkocG9wLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgT25lIFRvIE1hbnkgcmVsYXRpb24gRGVjb3JhdG9yc1xuICpcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8YW55Pn0gY2xhenogdGhlIHtAbGluayBTZXF1ZW5jZX0gdG8gdXNlLlxuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9uc11cbiAqXG4gKiBAZnVuY3Rpb24gb25lVG9NYW55XG4gKlxuICogQHNlZSBvbmVUb09uZVxuICogQHNlZSBtYW55VG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZVRvTWFueTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGU6IGJvb2xlYW4gPSB0cnVlXG4pIHtcbiAgTW9kZWwucmVnaXN0ZXIoY2xhenopO1xuICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgY2xhc3M6IGNsYXp6Lm5hbWUsXG4gICAgY2FzY2FkZTogY2FzY2FkZU9wdGlvbnMsXG4gICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICB9O1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX01BTlkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwdXJwb3NlZnVsIG92ZXJyaWRlXG4gICAgICBsaXN0KFtjbGF6eiwgU3RyaW5nLCBOdW1iZXIsIEJpZ0ludF0pLFxuICAgICAgb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgYWZ0ZXJBbnkocG9wLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgTWFueSBUbyBPbmUgcmVsYXRpb24gRGVjb3JhdG9yc1xuICpcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8YW55Pn0gY2xhenogdGhlIHtAbGluayBTZXF1ZW5jZX0gdG8gdXNlLiBEZWZhdWx0cyB0byB7QGxpbmsgTm9uZVNlcXVlbmNlfVxuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9uc11cbiAqXG4gKiBAZnVuY3Rpb24gbWFueVRvT25lXG4gKlxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgb25lVG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbnlUb09uZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGUgPSB0cnVlXG4pIHtcbiAgTW9kZWwucmVnaXN0ZXIoY2xhenopO1xuICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgY2xhc3M6IGNsYXp6Lm5hbWUsXG4gICAgY2FzY2FkZTogY2FzY2FkZU9wdGlvbnMsXG4gICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICB9O1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgdHlwZShbY2xhenoubmFtZSwgU3RyaW5nLm5hbWUsIE51bWJlci5uYW1lLCBCaWdJbnQubmFtZV0pLFxuICAgICAgLy8gb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gYWZ0ZXJBbGwocG9wdWxhdGUsIG1ldGFkYXRhKSxcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIG1ldGFkYXRhKVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cbiJdfQ==
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOENBLHNCQUVDO0FBVUQsd0JBRUM7QUFXRCxzQkFVQztBQW1CRCxvREFxQkM7QUFpQkQsd0JBS0M7QUFtQkQsMERBb0JDO0FBZ0JELDhCQUtDO0FBZ0JELDhCQUtDO0FBMkJELDRCQXVCQztBQThCRCw4QkF3QkM7QUE4QkQsOEJBdUJDO0FBN1hELDJEQVNpQztBQUNqQyxxREFBdUQ7QUFDdkQsOERBQTJEO0FBRTNELDZEQUF5RTtBQUN6RSx5RUFRd0M7QUFDeEMsMERBQWlEO0FBQ2pELCtEQUE0RDtBQUM1RCx3REFBK0M7QUFFL0MscURBUXdCO0FBQ3hCLGdEQUE4QztBQUU5Qzs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsS0FBSyxDQUFDLFNBQWlCO0lBQ3JDLE9BQU8sSUFBQSxxQkFBUSxFQUFDLGlCQUFPLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixNQUFNLENBQUMsVUFBa0I7SUFDdkMsT0FBTyxJQUFBLG1DQUFZLEVBQUMsaUJBQU8sQ0FBQyxHQUFHLENBQUMsMkJBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixLQUFLLENBQUMsVUFBNkIsRUFBRSxZQUF1QjtJQUMxRSxPQUFPLElBQUEsbUNBQVksRUFDakIsdUJBQVUsQ0FBQyxHQUFHLENBQ1osR0FBRywyQkFBZSxDQUFDLEtBQUssR0FBRyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVB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RUFBRSxRQUFRLENBQUMsQ0FDNUI7U0FDQSxLQUFLLEVBQUUsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25mbGljdEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25DcmVhdGVVcGRhdGUsXG4gIG9uRGVsZXRlLFxuICBvblVwZGF0ZSxcbiAgYWZ0ZXJBbnksXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgQ29udGV4dCxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IENhc2NhZGVNZXRhZGF0YSwgSW5kZXhNZXRhZGF0YSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Q2FzY2FkZSwgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBsaXN0LFxuICBNb2RlbCxcbiAgcHJvcCxcbiAgcHJvcE1ldGFkYXRhLFxuICB0eXBlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tIFwiLi4vcXVlcnkvQ29uZGl0aW9uXCI7XG5pbXBvcnQgeyBSZWxhdGlvbnNNZXRhZGF0YSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBvbmVUb01hbnlPbkNyZWF0ZSxcbiAgb25lVG9NYW55T25EZWxldGUsXG4gIG9uZVRvTWFueU9uVXBkYXRlLFxuICBvbmVUb09uZU9uQ3JlYXRlLFxuICBvbmVUb09uZU9uRGVsZXRlLFxuICBvbmVUb09uZU9uVXBkYXRlLFxuICBwb3B1bGF0ZSBhcyBwb3AsXG59IGZyb20gXCIuL2NvbnN0cnVjdGlvblwiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgZGF0YWJhc2UgdGFibGUgbmFtZSBmb3IgYSBtb2RlbFxuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgc2V0cyB0aGUgdGFibGUgbmFtZSBmb3IgYSBtb2RlbCBjbGFzcyBpbiB0aGUgZGF0YWJhc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzXG4gKiBAZnVuY3Rpb24gdGFibGVcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWJsZSh0YWJsZU5hbWU6IHN0cmluZykge1xuICByZXR1cm4gbWV0YWRhdGEoQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKSwgdGFibGVOYW1lKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBkYXRhYmFzZSBjb2x1bW4gbmFtZSBmb3IgYSBtb2RlbCBwcm9wZXJ0eVxuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgc3BlY2lmaWMgY29sdW1uIG5hbWUgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gaW4gdGhlIGRhdGFiYXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gY29sdW1uXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZykge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pLCBjb2x1bW5OYW1lKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbmRleCBvbiBhIG1vZGVsIHByb3BlcnR5IGZvciBpbXByb3ZlZCBxdWVyeSBwZXJmb3JtYW5jZVxuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBwcm9wZXJ0eSB0byBiZSBpbmRleGVkIGluIHRoZSBkYXRhYmFzZSwgb3B0aW9uYWxseSB3aXRoIHNwZWNpZmljIGRpcmVjdGlvbnMgYW5kIGNvbXBvc2l0aW9uc1xuICogQHBhcmFtIHtPcmRlckRpcmVjdGlvbltdfSBbZGlyZWN0aW9uc10gLSBPcHRpb25hbCBhcnJheSBvZiBzb3J0IGRpcmVjdGlvbnMgZm9yIHRoZSBpbmRleFxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2NvbXBvc2l0aW9uc10gLSBPcHRpb25hbCBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0byBjcmVhdGUgYSBjb21wb3NpdGUgaW5kZXhcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBpbmRleFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4KGRpcmVjdGlvbnM/OiBPcmRlckRpcmVjdGlvbltdLCBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSkge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhKFxuICAgIFJlcG9zaXRvcnkua2V5KFxuICAgICAgYCR7UGVyc2lzdGVuY2VLZXlzLklOREVYfSR7Y29tcG9zaXRpb25zICYmIGNvbXBvc2l0aW9ucy5sZW5ndGggPyBgLiR7Y29tcG9zaXRpb25zLmpvaW4oXCIuXCIpfWAgOiBcIlwifWBcbiAgICApLFxuICAgIHtcbiAgICAgIGRpcmVjdGlvbnM6IGRpcmVjdGlvbnMsXG4gICAgICBjb21wb3NpdGlvbnM6IGNvbXBvc2l0aW9ucyxcbiAgICB9IGFzIEluZGV4TWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW5mb3JjZXMgdW5pcXVlbmVzcyBjb25zdHJhaW50IGR1cmluZyBtb2RlbCBjcmVhdGlvbiBhbmQgdXBkYXRlXG4gKiBAc3VtbWFyeSBJbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGJ5IHRoZSB1bmlxdWUgZGVjb3JhdG9yIHRvIGNoZWNrIGlmIGEgcHJvcGVydHkgdmFsdWUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGRhdGFiYXNlXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSBtZXRhZGF0YSB0eXBlXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gY2hlY2sgZm9yIHVuaXF1ZW5lc3NcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjaGVjayBpcyBjb21wbGV0ZSBvciByZWplY3RzIHdpdGggYSBDb25mbGljdEVycm9yXG4gKiBAZnVuY3Rpb24gdW5pcXVlT25DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdW5pcXVlT25DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBvYmplY3QsXG4gIEYgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghKG1vZGVsIGFzIGFueSlba2V5XSkgcmV0dXJuO1xuICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuc2VsZWN0KClcbiAgICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZShrZXkpLmVxKG1vZGVsW2tleV0pKVxuICAgIC5leGVjdXRlKCk7XG4gIGlmIChleGlzdGluZy5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICBgbW9kZWwgYWxyZWFkeSBleGlzdHMgd2l0aCBwcm9wZXJ0eSAke2tleSBhcyBzdHJpbmd9IGVxdWFsIHRvICR7SlNPTi5zdHJpbmdpZnkoKG1vZGVsIGFzIGFueSlba2V5XSwgdW5kZWZpbmVkLCAyKX1gXG4gICAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVGFncyBhIHByb3BlcnR5IGFzIHVuaXF1ZVxuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZW5zdXJlcyBhIHByb3BlcnR5IHZhbHVlIGlzIHVuaXF1ZSBhY3Jvc3MgYWxsIGluc3RhbmNlcyBvZiBhIG1vZGVsIGluIHRoZSBkYXRhYmFzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIHVuaXF1ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHVuaXF1ZSgpXG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHVzZXJuYW1lITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWUoKSB7XG4gIHJldHVybiBhcHBseShcbiAgICBvbkNyZWF0ZVVwZGF0ZSh1bmlxdWVPbkNyZWF0ZVVwZGF0ZSksXG4gICAgcHJvcE1ldGFkYXRhKFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VTklRVUUpLCB7fSlcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB1c2VyIGlkZW50aWZpY2F0aW9uIGZvciBvd25lcnNoaXAgdHJhY2tpbmdcbiAqIEBzdW1tYXJ5IEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGNyZWF0ZWRCeSBhbmQgdXBkYXRlZEJ5IGRlY29yYXRvcnMgdG8gc2V0IG93bmVyc2hpcCBpbmZvcm1hdGlvblxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc3RvcmUgdGhlIHVzZXIgaWRlbnRpZmllclxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2l0aCBhbiBBdXRob3JpemF0aW9uRXJyb3IgaWYgdXNlciBpZGVudGlmaWNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkXG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgRiwgQz4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4sXG4+KFxuICB0aGlzOiBSLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZGF0YTogVixcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBrZXk6IGtleW9mIE0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgIFwiVGhpcyBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgdXNlciBpZGVudGlmaWNhdGlvblwiXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRyYWNrcyB0aGUgY3JlYXRvciBvZiBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBjcmVhdGVkIHRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjbGFzcyBwcm9wZXJ0eVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBEb2N1bWVudCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gKiAgIEBjcmVhdGVkQnkoKVxuICogICBjcmVhdG9yITogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVkQnkoKSB7XG4gIGNvbnN0IGtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKG9uQ3JlYXRlKGNyZWF0ZWRCeU9uQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKGtleSwge30pKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUcmFja3MgdGhlIGxhc3QgdXBkYXRlciBvZiBhIG1vZGVsIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIHByb3BlcnR5IHRvIHN0b3JlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBsYXN0IHVwZGF0ZWQgdGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gdXBkYXRlZEJ5XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIERvY3VtZW50IGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHVwZGF0ZWRCeSgpXG4gKiAgIGxhc3RFZGl0b3IhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZWRCeSgpIHtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUob25DcmVhdGVVcGRhdGUoY3JlYXRlZEJ5T25DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEoa2V5LCB7fSkpXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1vZGVsc1xuICogQHN1bW1hcnkgRGVjb3JhdG9yIHRoYXQgZXN0YWJsaXNoZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBjdXJyZW50IG1vZGVsIGFuZCBhbm90aGVyIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSByZWxhdGVkIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcmVsYXRlZCBtb2RlbCBjbGFzc1xuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9ucz1EZWZhdWx0Q2FzY2FkZV0gLSBPcHRpb25zIGZvciBjYXNjYWRpbmcgb3BlcmF0aW9ucyAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BvcHVsYXRlPXRydWVdIC0gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBwb3B1bGF0ZXMgdGhlIHJlbGF0aW9uc2hpcCB3aGVuIHRoZSBtb2RlbCBpcyByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBvbmVUb09uZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQG9uZVRvT25lKFByb2ZpbGUpXG4gKiAgIHByb2ZpbGUhOiBzdHJpbmcgfCBQcm9maWxlO1xuICogfVxuICpcbiAqIGNsYXNzIFByb2ZpbGUgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICBiaW8hOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9NYW55XG4gKiBAc2VlIG1hbnlUb09uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lVG9PbmU8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlOiBib29sZWFuID0gdHJ1ZVxuKSB7XG4gIE1vZGVsLnJlZ2lzdGVyKGNsYXp6KTtcbiAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgIGNsYXNzOiBjbGF6ei5uYW1lLFxuICAgIGNhc2NhZGU6IGNhc2NhZGVPcHRpb25zLFxuICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgfTtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19PTkUpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgdHlwZShbY2xhenoubmFtZSwgU3RyaW5nLm5hbWUsIE51bWJlci5uYW1lLCBCaWdJbnQubmFtZV0pLFxuICAgICAgb25DcmVhdGUob25lVG9PbmVPbkNyZWF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25VcGRhdGUob25lVG9PbmVPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25EZWxldGUob25lVG9PbmVPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgYWZ0ZXJBbnkocG9wLCBtZXRhZGF0YSksXG4gICAgICBwcm9wTWV0YWRhdGEoa2V5LCBtZXRhZGF0YSlcbiAgICApXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtb2RlbHNcbiAqIEBzdW1tYXJ5IERlY29yYXRvciB0aGF0IGVzdGFibGlzaGVzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGN1cnJlbnQgbW9kZWwgYW5kIG11bHRpcGxlIGluc3RhbmNlcyBvZiBhbm90aGVyIG1vZGVsXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSByZWxhdGVkIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcmVsYXRlZCBtb2RlbCBjbGFzc1xuICogQHBhcmFtIHtDYXNjYWRlTWV0YWRhdGF9IFtjYXNjYWRlT3B0aW9ucz1EZWZhdWx0Q2FzY2FkZV0gLSBPcHRpb25zIGZvciBjYXNjYWRpbmcgb3BlcmF0aW9ucyAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BvcHVsYXRlPXRydWVdIC0gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBwb3B1bGF0ZXMgdGhlIHJlbGF0aW9uc2hpcCB3aGVuIHRoZSBtb2RlbCBpcyByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgY2xhc3MgcHJvcGVydHlcbiAqIEBmdW5jdGlvbiBvbmVUb01hbnlcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQXV0aG9yIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgbmFtZSE6IHN0cmluZztcbiAqXG4gKiAgIEBvbmVUb01hbnkoQm9vaylcbiAqICAgYm9va3MhOiBzdHJpbmdbXSB8IEJvb2tbXTtcbiAqIH1cbiAqXG4gKiBjbGFzcyBCb29rIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgdGl0bGUhOiBzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqIEBzZWUgb25lVG9PbmVcbiAqIEBzZWUgbWFueVRvT25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVUb01hbnk8TSBleHRlbmRzIE1vZGVsPihcbiAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICBjYXNjYWRlT3B0aW9uczogQ2FzY2FkZU1ldGFkYXRhID0gRGVmYXVsdENhc2NhZGUsXG4gIHBvcHVsYXRlOiBib29sZWFuID0gdHJ1ZVxuKSB7XG4gIE1vZGVsLnJlZ2lzdGVyKGNsYXp6KTtcbiAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgIGNsYXNzOiBjbGF6ei5uYW1lLFxuICAgIGNhc2NhZGU6IGNhc2NhZGVPcHRpb25zLFxuICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgfTtcbiAgY29uc3Qga2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19NQU5ZKTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKFxuICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcHVycG9zZWZ1bCBvdmVycmlkZVxuICAgICAgbGlzdChbY2xhenosIFN0cmluZywgTnVtYmVyLCBCaWdJbnRdKSxcbiAgICAgIG9uQ3JlYXRlKG9uZVRvTWFueU9uQ3JlYXRlLCBtZXRhZGF0YSksXG4gICAgICBvblVwZGF0ZShvbmVUb01hbnlPblVwZGF0ZSwgbWV0YWRhdGEpLFxuICAgICAgb25EZWxldGUob25lVG9NYW55T25EZWxldGUsIG1ldGFkYXRhKSxcbiAgICAgIGFmdGVyQW55KHBvcCwgbWV0YWRhdGEpLFxuICAgICAgcHJvcE1ldGFkYXRhKGtleSwgbWV0YWRhdGEpXG4gICAgKVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgbWFueS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbW9kZWxzXG4gKiBAc3VtbWFyeSBEZWNvcmF0b3IgdGhhdCBlc3RhYmxpc2hlcyBhIG1hbnktdG8tb25lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgY3VycmVudCBtb2RlbCBhbmQgYW5vdGhlciBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgcmVsYXRlZCBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwYXJhbSB7Q2FzY2FkZU1ldGFkYXRhfSBbY2FzY2FkZU9wdGlvbnM9RGVmYXVsdENhc2NhZGVdIC0gT3B0aW9ucyBmb3IgY2FzY2FkaW5nIG9wZXJhdGlvbnMgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3B1bGF0ZT10cnVlXSAtIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVzIHRoZSByZWxhdGlvbnNoaXAgd2hlbiB0aGUgbW9kZWwgaXMgcmV0cmlldmVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGNsYXNzIHByb3BlcnR5XG4gKiBAZnVuY3Rpb24gbWFueVRvT25lXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEJvb2sgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICogICBAcmVxdWlyZWQoKVxuICogICB0aXRsZSE6IHN0cmluZztcbiAqXG4gKiAgIEBtYW55VG9PbmUoQXV0aG9yKVxuICogICBhdXRob3IhOiBzdHJpbmcgfCBBdXRob3I7XG4gKiB9XG4gKlxuICogY2xhc3MgQXV0aG9yIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAqICAgQHJlcXVpcmVkKClcbiAqICAgbmFtZSE6IHN0cmluZztcbiAqIH1cbiAqIGBgYFxuICogQHNlZSBvbmVUb01hbnlcbiAqIEBzZWUgb25lVG9PbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbnlUb09uZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gIGNhc2NhZGVPcHRpb25zOiBDYXNjYWRlTWV0YWRhdGEgPSBEZWZhdWx0Q2FzY2FkZSxcbiAgcG9wdWxhdGUgPSB0cnVlXG4pIHtcbiAgTW9kZWwucmVnaXN0ZXIoY2xhenopO1xuICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgY2xhc3M6IGNsYXp6Lm5hbWUsXG4gICAgY2FzY2FkZTogY2FzY2FkZU9wdGlvbnMsXG4gICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICB9O1xuICBjb25zdCBrZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpO1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoXG4gICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgdHlwZShbY2xhenoubmFtZSwgU3RyaW5nLm5hbWUsIE51bWJlci5uYW1lLCBCaWdJbnQubmFtZV0pLFxuICAgICAgLy8gb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUsIG1ldGFkYXRhKSxcbiAgICAgIC8vIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICAvLyBvbkRlbGV0ZShvbmVUb01hbnlPbkRlbGV0ZSwgbWV0YWRhdGEpLFxuICAgICAgLy8gYWZ0ZXJBbGwocG9wdWxhdGUsIG1ldGFkYXRhKSxcbiAgICAgIHByb3BNZXRhZGF0YShrZXksIG1ldGFkYXRhKVxuICAgIClcbiAgICAuYXBwbHkoKTtcbn1cbiJdfQ==
@@ -4,66 +4,196 @@ import { OrderDirection } from "../repository/constants";
4
4
  import { Constructor, Model } from "@decaf-ts/decorator-validation";
5
5
  import { Repo } from "../repository/Repository";
6
6
  import { RelationsMetadata } from "./types";
7
+ /**
8
+ * @description Specifies the database table name for a model
9
+ * @summary Decorator that sets the table name for a model class in the database
10
+ * @param {string} tableName - The name of the table in the database
11
+ * @return {Function} A decorator function that can be applied to a class
12
+ * @function table
13
+ * @category Class Decorators
14
+ */
7
15
  export declare function table(tableName: string): (target: object, propertyKey?: string | symbol | unknown, descriptor?: PropertyDescriptor) => void;
16
+ /**
17
+ * @description Specifies the database column name for a model property
18
+ * @summary Decorator that maps a model property to a specific column name in the database
19
+ * @param {string} columnName - The name of the column in the database
20
+ * @return {Function} A decorator function that can be applied to a class property
21
+ * @function column
22
+ * @category Property Decorators
23
+ */
8
24
  export declare function column(columnName: string): (target: object, propertyKey?: string | symbol | unknown, descriptor?: PropertyDescriptor) => void;
9
25
  /**
10
- * @summary Index Decorator
11
- * @description properties decorated will the index in the
12
- * DB for performance in queries
13
- *
14
- * @param {OrderDirection[]} [directions]
15
- * @param {string[]} [compositions]
16
- *
26
+ * @description Creates an index on a model property for improved query performance
27
+ * @summary Decorator that marks a property to be indexed in the database, optionally with specific directions and compositions
28
+ * @param {OrderDirection[]} [directions] - Optional array of sort directions for the index
29
+ * @param {string[]} [compositions] - Optional array of property names to create a composite index
30
+ * @return {Function} A decorator function that can be applied to a class property
17
31
  * @function index
32
+ * @category Property Decorators
18
33
  */
19
34
  export declare function index(directions?: OrderDirection[], compositions?: string[]): (target: object, propertyKey?: string | symbol | unknown, descriptor?: PropertyDescriptor) => void;
35
+ /**
36
+ * @description Enforces uniqueness constraint during model creation and update
37
+ * @summary Internal function used by the unique decorator to check if a property value already exists in the database
38
+ * @template M - The model type extending Model
39
+ * @template R - The repository type extending Repo<M, F, C>
40
+ * @template V - The metadata type
41
+ * @template F - The repository flags type
42
+ * @template C - The context type extending Context<F>
43
+ * @param {R} this - The repository instance
44
+ * @param {Context<F>} context - The context for the operation
45
+ * @param {V} data - The metadata for the property
46
+ * @param key - The property key to check for uniqueness
47
+ * @param {M} model - The model instance being created or updated
48
+ * @return {Promise<void>} A promise that resolves when the check is complete or rejects with a ConflictError
49
+ * @function uniqueOnCreateUpdate
50
+ * @memberOf module:core
51
+ */
20
52
  export declare function uniqueOnCreateUpdate<M extends Model, R extends Repo<M, F, C>, V extends object, F extends RepositoryFlags, C extends Context<F>>(this: R, context: Context<F>, data: V, key: keyof M, model: M): Promise<void>;
21
53
  /**
22
- * @summary Unique Decorator
23
- * @description Tags a property as unique.
24
- * No other elements in that table can have the same property value
25
- *
54
+ * @description Tags a property as unique
55
+ * @summary Decorator that ensures a property value is unique across all instances of a model in the database
56
+ * @return {Function} A decorator function that can be applied to a class property
26
57
  * @function unique
27
- *
58
+ * @category Property Decorators
59
+ * @example
60
+ * ```typescript
61
+ * class User extends BaseModel {
62
+ * @unique()
63
+ * @required()
64
+ * username!: string;
65
+ * }
66
+ * ```
28
67
  */
29
68
  export declare function unique(): (target: object, propertyKey?: string | symbol | unknown, descriptor?: PropertyDescriptor) => void;
69
+ /**
70
+ * @description Handles user identification for ownership tracking
71
+ * @summary Internal function used by the createdBy and updatedBy decorators to set ownership information
72
+ * @template M - The model type extending Model
73
+ * @template R - The repository type extending Repo<M, F, C>
74
+ * @template V - The relations metadata type extending RelationsMetadata
75
+ * @template F - The repository flags type
76
+ * @template C - The context type extending Context<F>
77
+ * @param {R} this - The repository instance
78
+ * @param {Context<F>} context - The context for the operation
79
+ * @param {V} data - The metadata for the property
80
+ * @param key - The property key to store the user identifier
81
+ * @param {M} model - The model instance being created or updated
82
+ * @return {Promise<void>} A promise that rejects with an AuthorizationError if user identification is not supported
83
+ * @function createdByOnCreateUpdate
84
+ * @memberOf module:core
85
+ */
30
86
  export declare function createdByOnCreateUpdate<M extends Model, R extends Repo<M, F, C>, V extends RelationsMetadata, F extends RepositoryFlags, C extends Context<F>>(this: R, context: Context<F>, data: V, key: keyof M, model: M): Promise<void>;
87
+ /**
88
+ * @description Tracks the creator of a model instance
89
+ * @summary Decorator that marks a property to store the identifier of the user who created the model instance
90
+ * @return {Function} A decorator function that can be applied to a class property
91
+ * @function createdBy
92
+ * @category Property Decorators
93
+ * @example
94
+ * ```typescript
95
+ * class Document extends BaseModel {
96
+ * @createdBy()
97
+ * creator!: string;
98
+ * }
99
+ * ```
100
+ */
31
101
  export declare function createdBy(): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any;
102
+ /**
103
+ * @description Tracks the last updater of a model instance
104
+ * @summary Decorator that marks a property to store the identifier of the user who last updated the model instance
105
+ * @return {Function} A decorator function that can be applied to a class property
106
+ * @function updatedBy
107
+ * @category Property Decorators
108
+ * @example
109
+ * ```typescript
110
+ * class Document extends BaseModel {
111
+ * @updatedBy()
112
+ * lastEditor!: string;
113
+ * }
114
+ * ```
115
+ */
32
116
  export declare function updatedBy(): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any;
33
117
  /**
34
- * @summary One To One relation Decorators
35
- *
36
- * @param {Constructor<any>} clazz the {@link Sequence}
37
- * @param {CascadeMetadata} [cascadeOptions]
38
- * @param {boolean} populate If true, replaces the specified key in the document with the corresponding record from the database
39
- *
118
+ * @description Defines a one-to-one relationship between models
119
+ * @summary Decorator that establishes a one-to-one relationship between the current model and another model
120
+ * @template M - The related model type extending Model
121
+ * @param {Constructor<M>} clazz - The constructor of the related model class
122
+ * @param {CascadeMetadata} [cascadeOptions=DefaultCascade] - Options for cascading operations (create, update, delete)
123
+ * @param {boolean} [populate=true] - If true, automatically populates the relationship when the model is retrieved
124
+ * @return {Function} A decorator function that can be applied to a class property
40
125
  * @function oneToOne
126
+ * @category Property Decorators
127
+ * @example
128
+ * ```typescript
129
+ * class User extends BaseModel {
130
+ * @oneToOne(Profile)
131
+ * profile!: string | Profile;
132
+ * }
41
133
  *
42
- *
134
+ * class Profile extends BaseModel {
135
+ * @required()
136
+ * bio!: string;
137
+ * }
138
+ * ```
43
139
  * @see oneToMany
44
140
  * @see manyToOne
45
141
  */
46
142
  export declare function oneToOne<M extends Model>(clazz: Constructor<M>, cascadeOptions?: CascadeMetadata, populate?: boolean): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any;
47
143
  /**
48
- * @summary One To Many relation Decorators
49
- *
50
- * @param {Constructor<any>} clazz the {@link Sequence} to use.
51
- * @param {CascadeMetadata} [cascadeOptions]
52
- *
144
+ * @description Defines a one-to-many relationship between models
145
+ * @summary Decorator that establishes a one-to-many relationship between the current model and multiple instances of another model
146
+ * @template M - The related model type extending Model
147
+ * @param {Constructor<M>} clazz - The constructor of the related model class
148
+ * @param {CascadeMetadata} [cascadeOptions=DefaultCascade] - Options for cascading operations (create, update, delete)
149
+ * @param {boolean} [populate=true] - If true, automatically populates the relationship when the model is retrieved
150
+ * @return {Function} A decorator function that can be applied to a class property
53
151
  * @function oneToMany
152
+ * @category Property Decorators
153
+ * @example
154
+ * ```typescript
155
+ * class Author extends BaseModel {
156
+ * @required()
157
+ * name!: string;
158
+ *
159
+ * @oneToMany(Book)
160
+ * books!: string[] | Book[];
161
+ * }
54
162
  *
163
+ * class Book extends BaseModel {
164
+ * @required()
165
+ * title!: string;
166
+ * }
167
+ * ```
55
168
  * @see oneToOne
56
169
  * @see manyToOne
57
170
  */
58
171
  export declare function oneToMany<M extends Model>(clazz: Constructor<M>, cascadeOptions?: CascadeMetadata, populate?: boolean): (target: any, propertyKey?: any, descriptor?: TypedPropertyDescriptor<any>) => any;
59
172
  /**
60
- * @summary Many To One relation Decorators
61
- *
62
- * @param {Constructor<any>} clazz the {@link Sequence} to use. Defaults to {@link NoneSequence}
63
- * @param {CascadeMetadata} [cascadeOptions]
64
- *
173
+ * @description Defines a many-to-one relationship between models
174
+ * @summary Decorator that establishes a many-to-one relationship between multiple instances of the current model and another model
175
+ * @template M - The related model type extending Model
176
+ * @param {Constructor<M>} clazz - The constructor of the related model class
177
+ * @param {CascadeMetadata} [cascadeOptions=DefaultCascade] - Options for cascading operations (create, update, delete)
178
+ * @param {boolean} [populate=true] - If true, automatically populates the relationship when the model is retrieved
179
+ * @return {Function} A decorator function that can be applied to a class property
65
180
  * @function manyToOne
181
+ * @category Property Decorators
182
+ * @example
183
+ * ```typescript
184
+ * class Book extends BaseModel {
185
+ * @required()
186
+ * title!: string;
187
+ *
188
+ * @manyToOne(Author)
189
+ * author!: string | Author;
190
+ * }
66
191
  *
192
+ * class Author extends BaseModel {
193
+ * @required()
194
+ * name!: string;
195
+ * }
196
+ * ```
67
197
  * @see oneToMany
68
198
  * @see oneToOne
69
199
  */
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhc2NhZGVNZXRhZGF0YSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5cbmV4cG9ydCB0eXBlIFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICBjbGFzczogc3RyaW5nO1xuICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGE7XG4gIHBvcHVsYXRlOiBib29sZWFuO1xufTtcbiJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhc2NhZGVNZXRhZGF0YSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGFkYXRhIGZvciBtb2RlbCByZWxhdGlvbnNoaXBzXG4gKiBAc3VtbWFyeSBUeXBlIGRlZmluaXRpb24gZm9yIHN0b3JpbmcgbWV0YWRhdGEgYWJvdXQgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIG1vZGVsc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGNsYXNzIC0gVGhlIG5hbWUgb2YgdGhlIHJlbGF0ZWQgbW9kZWwgY2xhc3NcbiAqIEBwcm9wZXJ0eSB7Q2FzY2FkZU1ldGFkYXRhfSBjYXNjYWRlIC0gQ29uZmlndXJhdGlvbiBmb3IgY2FzY2FkZSBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHByb3BlcnR5IHtib29sZWFufSBwb3B1bGF0ZSAtIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBwb3B1bGF0ZSB0aGUgcmVsYXRpb25zaGlwIHdoZW4gcmV0cmlldmluZyB0aGUgbW9kZWxcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAbWVtYmVyT2YgbW9kdWxlOm1vZGVsXG4gKi9cbmV4cG9ydCB0eXBlIFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICBjbGFzczogc3RyaW5nO1xuICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGE7XG4gIHBvcHVsYXRlOiBib29sZWFuO1xufTtcbiJdfQ==
@@ -1,4 +1,13 @@
1
1
  import { CascadeMetadata } from "../repository";
2
+ /**
3
+ * @description Metadata for model relationships
4
+ * @summary Type definition for storing metadata about relationships between models
5
+ * @property {string} class - The name of the related model class
6
+ * @property {CascadeMetadata} cascade - Configuration for cascade operations (create, update, delete)
7
+ * @property {boolean} populate - Whether to automatically populate the relationship when retrieving the model
8
+ * @typedef {Object} RelationsMetadata
9
+ * @memberOf module:model
10
+ */
2
11
  export type RelationsMetadata = {
3
12
  class: string;
4
13
  cascade: CascadeMetadata;