@e22m4u/js-repository 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/.mocharc.json +2 -3
  2. package/README.md +123 -164
  3. package/dist/cjs/index.cjs +8 -114
  4. package/eslint.config.js +29 -58
  5. package/jsconfig.json +7 -0
  6. package/package.json +11 -19
  7. package/src/adapter/adapter-loader.js +3 -4
  8. package/src/adapter/adapter.js +8 -5
  9. package/src/adapter/adapter.spec.js +10 -9
  10. package/src/adapter/builtin/memory-adapter.js +8 -7
  11. package/src/adapter/builtin/memory-adapter.spec.js +5 -2
  12. package/src/adapter/decorator/default-values-decorator.spec.js +1 -2
  13. package/src/database-schema.js +1 -2
  14. package/src/{database-schema.spec.ts → database-schema.spec.js} +5 -17
  15. package/src/definition/model/index.js +0 -1
  16. package/src/definition/model/model-definition-utils.js +1 -2
  17. package/src/definition/model/model-definition-utils.spec.js +5 -2
  18. package/src/definition/model/properties/index.js +0 -1
  19. package/src/definition/model/relations/index.js +0 -1
  20. package/src/definition/model/relations/relations-definition-validator.js +4 -5
  21. package/src/filter/include-clause-tool.js +8 -6
  22. package/src/index.js +0 -1
  23. package/src/relations/belongs-to-resolver.js +1 -2
  24. package/src/relations/belongs-to-resolver.spec.js +6 -3
  25. package/src/relations/has-many-resolver.js +1 -2
  26. package/src/relations/has-many-resolver.spec.js +6 -3
  27. package/src/relations/has-one-resolver.js +1 -2
  28. package/src/relations/has-one-resolver.spec.js +6 -3
  29. package/src/relations/references-many-resolver.js +1 -2
  30. package/src/relations/references-many-resolver.spec.js +6 -3
  31. package/src/repository/repository.js +1 -2
  32. package/src/utils/is-plain-object.js +4 -4
  33. package/src/adapter/adapter-loader.d.ts +0 -16
  34. package/src/adapter/adapter-registry.d.ts +0 -14
  35. package/src/adapter/adapter.d.ts +0 -153
  36. package/src/adapter/builtin/memory-adapter.d.ts +0 -148
  37. package/src/adapter/decorator/data-sanitizing-decorator.d.ts +0 -14
  38. package/src/adapter/decorator/default-values-decorator.d.ts +0 -14
  39. package/src/adapter/decorator/fields-filtering-decorator.d.ts +0 -14
  40. package/src/adapter/decorator/inclusion-decorator.d.ts +0 -14
  41. package/src/adapter/decorator/index.d.ts +0 -5
  42. package/src/adapter/decorator/property-uniqueness-decorator.d.ts +0 -14
  43. package/src/adapter/index.d.ts +0 -3
  44. package/src/database-schema.d.ts +0 -37
  45. package/src/definition/datasource/datasource-definition-validator.d.ts +0 -14
  46. package/src/definition/datasource/datasource-definition.d.ts +0 -8
  47. package/src/definition/datasource/index.d.ts +0 -2
  48. package/src/definition/definition-registry.d.ts +0 -50
  49. package/src/definition/index.d.ts +0 -3
  50. package/src/definition/model/index.d.ts +0 -6
  51. package/src/definition/model/model-data-sanitizer.d.ts +0 -15
  52. package/src/definition/model/model-definition-utils.d.ts +0 -180
  53. package/src/definition/model/model-definition-validator.d.ts +0 -14
  54. package/src/definition/model/model-definition.d.ts +0 -28
  55. package/src/definition/model/model-definition.js +0 -1
  56. package/src/definition/model/properties/data-type.d.ts +0 -16
  57. package/src/definition/model/properties/index.d.ts +0 -6
  58. package/src/definition/model/properties/primary-keys-definition-validator.d.ts +0 -15
  59. package/src/definition/model/properties/properties-definition-validator.d.ts +0 -15
  60. package/src/definition/model/properties/property-definition.d.ts +0 -23
  61. package/src/definition/model/properties/property-definition.js +0 -1
  62. package/src/definition/model/properties/property-uniqueness-validator.d.ts +0 -31
  63. package/src/definition/model/properties/property-uniqueness.d.ts +0 -14
  64. package/src/definition/model/relations/index.d.ts +0 -3
  65. package/src/definition/model/relations/relation-definition.d.ts +0 -236
  66. package/src/definition/model/relations/relation-definition.js +0 -1
  67. package/src/definition/model/relations/relation-type.d.ts +0 -14
  68. package/src/definition/model/relations/relations-definition-validator.d.ts +0 -15
  69. package/src/errors/index.d.ts +0 -3
  70. package/src/errors/invalid-argument-error.d.ts +0 -6
  71. package/src/errors/invalid-operator-value-error.d.ts +0 -13
  72. package/src/errors/not-implemented-error.d.ts +0 -6
  73. package/src/filter/fields-clause-tool.d.ts +0 -38
  74. package/src/filter/filter-clause.d.ts +0 -348
  75. package/src/filter/include-clause-tool.d.ts +0 -55
  76. package/src/filter/index.d.ts +0 -7
  77. package/src/filter/operator-clause-tool.d.ts +0 -224
  78. package/src/filter/order-clause-tool.d.ts +0 -32
  79. package/src/filter/slice-clause-tool.d.ts +0 -30
  80. package/src/filter/where-clause-tool.d.ts +0 -23
  81. package/src/index.d.ts +0 -9
  82. package/src/relations/belongs-to-resolver.d.ts +0 -46
  83. package/src/relations/has-many-resolver.d.ts +0 -67
  84. package/src/relations/has-one-resolver.d.ts +0 -67
  85. package/src/relations/index.d.ts +0 -4
  86. package/src/relations/references-many-resolver.d.ts +0 -27
  87. package/src/repository/index.d.ts +0 -2
  88. package/src/repository/repository-registry.d.ts +0 -29
  89. package/src/repository/repository.d.ts +0 -183
  90. package/src/types.d.ts +0 -43
  91. package/src/types.js +0 -1
  92. package/src/utils/capitalize.d.ts +0 -6
  93. package/src/utils/clone-deep.d.ts +0 -6
  94. package/src/utils/exclude-object-keys.d.ts +0 -10
  95. package/src/utils/get-value-by-path.d.ts +0 -12
  96. package/src/utils/index.d.ts +0 -12
  97. package/src/utils/is-deep-equal.d.ts +0 -10
  98. package/src/utils/is-plain-object.d.ts +0 -6
  99. package/src/utils/is-promise.d.ts +0 -10
  100. package/src/utils/like-to-regexp.d.ts +0 -14
  101. package/src/utils/model-name-to-model-key.d.ts +0 -6
  102. package/src/utils/select-object-keys.d.ts +0 -10
  103. package/src/utils/singularize.d.ts +0 -6
  104. package/src/utils/string-to-regexp.d.ts +0 -10
  105. package/tsconfig.json +0 -11
@@ -1,38 +0,0 @@
1
- import {ModelData} from '../types.js';
2
- import {Service} from '@e22m4u/js-service';
3
- import {FieldsClause} from './filter-clause.js';
4
- import {NormalizedFieldsClause} from './filter-clause.js';
5
-
6
- /**
7
- * Field clause tool.
8
- */
9
- export declare class FieldsClauseTool extends Service {
10
- /**
11
- * Filter.
12
- *
13
- * @param input
14
- * @param modelName
15
- * @param clause
16
- */
17
- filter<T extends ModelData | ModelData[]>(
18
- input: T,
19
- modelName: string,
20
- clause: FieldsClause | undefined,
21
- ): T;
22
-
23
- /**
24
- * Validate fields clause.
25
- *
26
- * @param clause
27
- */
28
- static validateFieldsClause(clause: FieldsClause | undefined): void;
29
-
30
- /**
31
- * Normalize fields clause.
32
- *
33
- * @param clause
34
- */
35
- static normalizeFieldsClause(
36
- clause: FieldsClause | undefined,
37
- ): NormalizedFieldsClause | undefined;
38
- }
@@ -1,348 +0,0 @@
1
- import {ModelData} from '../types.js';
2
-
3
- /**
4
- * Filter clause.
5
- */
6
- export declare type FilterClause<M extends object = ModelData> = {
7
- where?: WhereClause<M>;
8
- order?: OrderClause<M>;
9
- limit?: number;
10
- skip?: number;
11
- fields?: FieldsClause<M>;
12
- include?: IncludeClause<M>;
13
- };
14
-
15
- /**
16
- * Item filter clause.
17
- */
18
- export declare type ItemFilterClause<M extends object = ModelData> = Pick<
19
- FilterClause<M>,
20
- 'fields' | 'include'
21
- >;
22
-
23
- /**
24
- * Where clause.
25
- *
26
- * @example
27
- * ```ts
28
- * value => value.featured === true
29
- * {foo: 'bar'}
30
- * {foo: {eq: 'bar'}}
31
- * {foo: {neq: 'bar'}}
32
- * {foo: {gt: 5}}
33
- * {foo: {lt: 10}}
34
- * {foo: {gte: 5}}
35
- * {foo: {lte: 10}}
36
- * {foo: {inq: ['bar', 'baz']}}
37
- * {foo: {nin: ['bar', 'baz']}}
38
- * {foo: {between: [5, 10]}}
39
- * {foo: {exists: true}}
40
- * {foo: {like: 'bar'}}
41
- * {foo: {ilike: 'BaR'}}
42
- * {foo: {nlike: 'bar'}}
43
- * {foo: {nilike: 'BaR'}}
44
- * {foo: {regexp: 'ba.+'}}
45
- * {foo: {regexp: 'ba.+', flags: 'i'}}
46
- * {and: [...]}
47
- * {or: [...]}
48
- * ```
49
- */
50
- export declare type WhereClause<M extends object = ModelData> =
51
- Partial<AndClause<M>> |
52
- Partial<OrClause<M>> |
53
- PropertiesClause<M>;
54
-
55
- /**
56
- * Primitive values.
57
- */
58
- export declare type PrimitiveValue =
59
- | string
60
- | number
61
- | boolean
62
- | null
63
- | undefined;
64
-
65
- /**
66
- * Properties clause.
67
- *
68
- * @example
69
- * ```ts
70
- * {
71
- * name: {inq: ['John', 'Mary']},
72
- * status: 'ACTIVE',
73
- * age: {gte: 40}
74
- * }
75
- * ```
76
- */
77
- export declare type PropertiesClause<M extends object = ModelData> = {
78
- [property in keyof M]?: OperatorClause | PrimitiveValue | RegExp;
79
- };
80
-
81
- /**
82
- * Operator clause.
83
- *
84
- * @example
85
- * ```ts
86
- * {eq: 'bar'}
87
- * {neq: 'bar'}
88
- * {gt: 5}
89
- * {lt: 10}
90
- * {gte: 5}
91
- * {lte: 10}
92
- * {inq: ['bar', 'baz']}
93
- * {nin: ['bar', 'baz']}
94
- * {between: [5, 10]}
95
- * {exists: true}
96
- * {like: 'bar'}
97
- * {ilike: 'BaR'}
98
- * {nlike: 'bar'}
99
- * {nilike: 'BaR'}
100
- * {regexp: 'ba.+'}
101
- * {regexp: 'ba.+', flags: 'i'}
102
- * ```
103
- */
104
- export declare type OperatorClause = {
105
- eq?: PrimitiveValue;
106
- neq?: PrimitiveValue;
107
- gt?: string | number;
108
- gte?: string | number;
109
- lt?: string | number;
110
- lte?: string | number;
111
- inq?: PrimitiveValue[];
112
- nin?: PrimitiveValue[];
113
- between?: readonly [string | number, string | number];
114
- exists?: boolean;
115
- like?: string;
116
- nlike?: string;
117
- ilike?: string;
118
- nilike?: string;
119
- regexp?: string | RegExp;
120
- flags?: string;
121
- };
122
-
123
- /**
124
- * And clause.
125
- *
126
- * @example
127
- * ```ts
128
- * {
129
- * and: [...],
130
- * }
131
- * ```
132
- */
133
- export interface AndClause<M extends object = ModelData> {
134
- and: WhereClause<M>[];
135
- }
136
-
137
- /**
138
- * Or clause.
139
- *
140
- * @example
141
- * ```ts
142
- * {
143
- * or: [...],
144
- * }
145
- * ```
146
- */
147
- export interface OrClause<M extends object = ModelData> {
148
- or: WhereClause<M>[];
149
- }
150
-
151
- /**
152
- * Order clause item.
153
- *
154
- * @example
155
- * ```ts
156
- * 'prop'
157
- * 'prop ASC'
158
- * 'prop DESC';
159
- * ```
160
- */
161
- export declare type OrderClauseItem<M extends object = ModelData> = {
162
- [prop in keyof M]: prop | `${prop & string} ASC` | `${prop & string} DESC`;
163
- }[keyof M];
164
-
165
- /**
166
- * Order clause.
167
- *
168
- * @example
169
- * ```ts
170
- * 'prop'
171
- * 'prop ASC'
172
- * 'prop DESC';
173
- * ['prop1', 'prop2'];
174
- * ['prop1 ASC', 'prop2 DESC'];
175
- * ```
176
- */
177
- export declare type OrderClause<M extends object = ModelData> =
178
- | OrderClauseItem<M>
179
- | OrderClauseItem<M>[];
180
-
181
- /**
182
- * Fields.
183
- *
184
- * @example
185
- * ```ts
186
- * 'prop'
187
- * ['prop1', 'prop2']
188
- * ```
189
- */
190
- export declare type FieldsClause<M extends object = ModelData> =
191
- | keyof M
192
- | NormalizedFieldsClause<M>;
193
-
194
- /**
195
- * Normalized fields clause.
196
- *
197
- * @example
198
- * ```ts
199
- * [
200
- * 'prop1',
201
- * 'prop2',
202
- * ]
203
- * ```
204
- */
205
- export declare type NormalizedFieldsClause<M extends object = ModelData> =
206
- (keyof M)[];
207
-
208
- /**
209
- * Include clause.
210
- *
211
- * @example
212
- * ```ts
213
- * 'customers'
214
- * ```
215
- *
216
- * @example
217
- * ```ts
218
- * [
219
- * 'customers',
220
- * 'orders',
221
- * ]
222
- * ```
223
- *
224
- * @example
225
- * ```ts
226
- * {
227
- * customer: 'orders'
228
- * }
229
- * ```
230
- *
231
- * @example
232
- * ```ts
233
- * {
234
- * customer: {
235
- * address: 'city',
236
- * },
237
- * }
238
- * ```
239
- *
240
- * @example
241
- * ```ts
242
- * {
243
- * customer: [
244
- * 'orders',
245
- * {address: 'city'},
246
- * ],
247
- * }
248
- * ```
249
- *
250
- * @example
251
- * ```ts
252
- * {
253
- * relation: 'customer',
254
- * scope: {
255
- * where: {removed: false},
256
- * order: 'createdAt DESC',
257
- * skip: 0,
258
- * limit: 16,
259
- * fields: ['id', 'name', 'removed'],
260
- * include: 'address',
261
- * }
262
- * }
263
- * ```
264
- */
265
- export declare type IncludeClause<M extends object = ModelData> =
266
- | keyof M
267
- | (keyof M)[]
268
- | NestedIncludeClause<M>
269
- | NormalizedIncludeClause<M>
270
- | IncludeClause[];
271
-
272
- /**
273
- * Nested include clause.
274
- *
275
- * @example
276
- * ```ts
277
- * {
278
- * customer: 'orders'
279
- * }
280
- * ```
281
- *
282
- * @example
283
- * ```ts
284
- * {
285
- * customer: {
286
- * address: 'city',
287
- * },
288
- * }
289
- * ```
290
- *
291
- * @example
292
- * ```ts
293
- * {
294
- * customer: [
295
- * 'orders',
296
- * {address: 'city'},
297
- * ],
298
- * }
299
- * ```
300
- *
301
- * @example
302
- * ```ts
303
- * {
304
- * relation: 'customer',
305
- * scope: {
306
- * where: {removed: false},
307
- * order: 'createdAt DESC',
308
- * skip: 0,
309
- * limit: 16,
310
- * fields: ['id', 'name', 'removed'],
311
- * include: 'address',
312
- * }
313
- * }
314
- * ```
315
- */
316
- export declare type NestedIncludeClause<M extends object = ModelData> = {
317
- [property in keyof M]?: IncludeClause;
318
- };
319
-
320
- /**
321
- * Inclusion.
322
- *
323
- * @example
324
- * ```ts
325
- * {
326
- * relation: 'customer',
327
- * }
328
- * ```
329
- *
330
- * @example
331
- * ```ts
332
- * {
333
- * relation: 'customer',
334
- * scope: {
335
- * where: {removed: false},
336
- * order: 'createdAt DESC',
337
- * skip: 0,
338
- * limit: 16,
339
- * fields: ['id', 'name', 'removed'],
340
- * include: 'address',
341
- * }
342
- * }
343
- * ```
344
- */
345
- export declare interface NormalizedIncludeClause<M extends object = ModelData> {
346
- relation: keyof M;
347
- scope?: FilterClause;
348
- }
@@ -1,55 +0,0 @@
1
- import {ModelData} from '../types.js';
2
- import {Service} from '@e22m4u/js-service';
3
- import {FilterClause} from './filter-clause.js';
4
- import {IncludeClause} from './filter-clause.js';
5
- import {NormalizedIncludeClause} from './filter-clause.js';
6
-
7
- /**
8
- * Include clause tool.
9
- */
10
- export declare class IncludeClauseTool extends Service {
11
- /**
12
- * Include to.
13
- *
14
- * @param entities
15
- * @param modelName
16
- * @param clause
17
- */
18
- includeTo(
19
- entities: ModelData[],
20
- modelName: string,
21
- clause: IncludeClause | undefined,
22
- ): Promise<void>;
23
-
24
- /**
25
- * Validate include clause.
26
- *
27
- * @param clause
28
- */
29
- static validateIncludeClause(clause: IncludeClause | undefined): void;
30
-
31
- /**
32
- * Validate scope clause.
33
- *
34
- * @param clause
35
- */
36
- static validateScopeClause(clause: FilterClause | undefined): void;
37
-
38
- /**
39
- * Normalize include clause.
40
- *
41
- * @param clause
42
- */
43
- static normalizeIncludeClause(
44
- clause: IncludeClause | undefined,
45
- ): NormalizedIncludeClause[];
46
-
47
- /**
48
- * Normalize scope clause.
49
- *
50
- * @param clause
51
- */
52
- static normalizeScopeClause(
53
- clause: FilterClause | undefined,
54
- ): FilterClause | undefined;
55
- }
@@ -1,7 +0,0 @@
1
- export * from './filter-clause.js';
2
- export * from './slice-clause-tool.js';
3
- export * from './order-clause-tool.js';
4
- export * from './where-clause-tool.js';
5
- export * from './fields-clause-tool.js';
6
- export * from './include-clause-tool.js';
7
- export * from './operator-clause-tool.js';
@@ -1,224 +0,0 @@
1
- import {Service} from '@e22m4u/js-service';
2
-
3
- /**
4
- * Operator clause tool.
5
- */
6
- export declare class OperatorClauseTool extends Service {
7
- /**
8
- * Compare.
9
- *
10
- * @param val1
11
- * @param val2
12
- * @param noTypeConversion
13
- */
14
- compare(val1: unknown, val2: unknown, noTypeConversion?: boolean): number;
15
-
16
- /**
17
- * Test all operators.
18
- *
19
- * @param clause
20
- * @param value
21
- */
22
- testAll(clause: object, value: unknown): boolean | undefined;
23
-
24
- /**
25
- * Test eq/neq operator.
26
- *
27
- * @example
28
- * ```ts
29
- * {
30
- * eq: 'foo',
31
- * }
32
- * ```
33
- *
34
- * @example
35
- * ```ts
36
- * {
37
- * neq: 'foo',
38
- * }
39
- * ```
40
- *
41
- * @param clause
42
- * @param value
43
- */
44
- testEqNeq(clause: object, value: unknown): boolean | undefined;
45
-
46
- /**
47
- * Test lt/gt/lte/gte operator.
48
- *
49
- * @example
50
- * ```ts
51
- * {
52
- * lt: 10,
53
- * }
54
- * ```
55
- *
56
- * @example
57
- * ```ts
58
- * {
59
- * lte: 10,
60
- * }
61
- * ```
62
- *
63
- * @example
64
- * ```ts
65
- * {
66
- * gt: 10,
67
- * }
68
- * ```
69
- *
70
- * @example
71
- * ```ts
72
- * {
73
- * gte: 10,
74
- * }
75
- * ```
76
- *
77
- * @param clause
78
- * @param value
79
- */
80
- testGtLt(clause: object, value: unknown): boolean | undefined;
81
-
82
- /**
83
- * Test inc operator.
84
- *
85
- * @example
86
- * ```ts
87
- * {
88
- * inc: ['foo', 'bar'],
89
- * }
90
- * ```
91
- *
92
- * @param clause
93
- * @param value
94
- */
95
- testInq(clause: object, value: unknown): boolean | undefined;
96
-
97
- /**
98
- * Test nin operator.
99
- *
100
- * @example
101
- * ```ts
102
- * {
103
- * nin: ['foo', 'bar'],
104
- * }
105
- * ```
106
- *
107
- * @param clause
108
- * @param value
109
- */
110
- testNin(clause: object, value: unknown): boolean | undefined;
111
-
112
- /**
113
- * Test between operator.
114
- *
115
- * @example
116
- * ```ts
117
- * {
118
- * between: [10, 20],
119
- * }
120
- * ```
121
- *
122
- * @param clause
123
- * @param value
124
- */
125
- testBetween(clause: object, value: unknown): boolean | undefined;
126
-
127
- /**
128
- * Test exists operator.
129
- *
130
- * @example
131
- * ```ts
132
- * {
133
- * exists: true,
134
- * }
135
- * ```
136
- *
137
- * @param clause
138
- * @param value
139
- */
140
- testExists(clause: object, value: unknown): boolean | undefined;
141
-
142
- /**
143
- * Test like operator.
144
- *
145
- * @example
146
- * ```ts
147
- * {
148
- * like: 'foo',
149
- * }
150
- * ```
151
- *
152
- * @param clause
153
- * @param value
154
- */
155
- testLike(clause: object, value: unknown): boolean | undefined;
156
-
157
- /**
158
- * Test nlike operator.
159
- *
160
- * @example
161
- * ```ts
162
- * {
163
- * nlike: 'foo',
164
- * }
165
- * ```
166
- *
167
- * @param clause
168
- * @param value
169
- */
170
- testNlike(clause: object, value: unknown): boolean | undefined;
171
-
172
- /**
173
- * Test ilike operator.
174
- *
175
- * @example
176
- * ```ts
177
- * {
178
- * ilike: 'foo',
179
- * }
180
- * ```
181
- *
182
- * @param clause
183
- * @param value
184
- */
185
- testIlike(clause: object, value: unknown): boolean | undefined;
186
-
187
- /**
188
- * Test nilike operator.
189
- *
190
- * @example
191
- * ```ts
192
- * {
193
- * nilike: 'foo',
194
- * }
195
- * ```
196
- *
197
- * @param clause
198
- * @param value
199
- */
200
- testNilike(clause: object, value: unknown): boolean | undefined;
201
-
202
- /**
203
- * Test regexp.
204
- *
205
- * @example
206
- * ```ts
207
- * {
208
- * regexp: 'foo.*',
209
- * }
210
- * ```
211
- *
212
- * @example
213
- * ```ts
214
- * {
215
- * regexp: 'foo.*',
216
- * flags: 'i',
217
- * }
218
- * ```
219
- *
220
- * @param clause
221
- * @param value
222
- */
223
- testRegexp(clause: object, value: unknown): boolean | undefined;
224
- }
@@ -1,32 +0,0 @@
1
- import {ModelData} from '../types.js';
2
- import {Service} from '@e22m4u/js-service';
3
- import {OrderClause} from './filter-clause.js';
4
-
5
- /**
6
- * Order clause tool.
7
- */
8
- export declare class OrderClauseTool extends Service {
9
- /**
10
- * Sort.
11
- *
12
- * @param entities
13
- * @param clause
14
- */
15
- sort(entities: ModelData[], clause: OrderClause | undefined): void;
16
-
17
- /**
18
- * Validate order clause.
19
- *
20
- * @param clause
21
- */
22
- static validateOrderClause(clause: OrderClause | undefined): void;
23
-
24
- /**
25
- * Normalize order clause.
26
- *
27
- * @param clause
28
- */
29
- static normalizeOrderClause(
30
- clause: OrderClause | undefined,
31
- ): string[] | undefined;
32
- }