node-appwrite 12.0.0 → 12.1.0-rc.4

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 (296) hide show
  1. package/.travis.yml +18 -8
  2. package/dist/client.d.mts +131 -0
  3. package/dist/client.d.ts +131 -0
  4. package/dist/client.js +302 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/client.mjs +295 -0
  7. package/dist/client.mjs.map +1 -0
  8. package/dist/enums/authentication-factor.d.mts +8 -0
  9. package/dist/enums/authentication-factor.d.ts +8 -0
  10. package/dist/enums/authentication-factor.js +13 -0
  11. package/dist/enums/authentication-factor.js.map +1 -0
  12. package/dist/enums/authentication-factor.mjs +11 -0
  13. package/dist/enums/authentication-factor.mjs.map +1 -0
  14. package/dist/enums/authenticator-type.d.mts +5 -0
  15. package/dist/enums/authenticator-type.d.ts +5 -0
  16. package/dist/enums/authenticator-type.js +10 -0
  17. package/dist/enums/authenticator-type.js.map +1 -0
  18. package/dist/enums/authenticator-type.mjs +8 -0
  19. package/dist/enums/authenticator-type.mjs.map +1 -0
  20. package/dist/enums/browser.d.mts +18 -0
  21. package/dist/enums/browser.d.ts +18 -0
  22. package/dist/enums/browser.js +23 -0
  23. package/dist/enums/browser.js.map +1 -0
  24. package/dist/enums/browser.mjs +21 -0
  25. package/dist/enums/browser.mjs.map +1 -0
  26. package/dist/enums/compression.d.mts +7 -0
  27. package/dist/enums/compression.d.ts +7 -0
  28. package/dist/enums/compression.js +12 -0
  29. package/dist/enums/compression.js.map +1 -0
  30. package/dist/enums/compression.mjs +10 -0
  31. package/dist/enums/compression.mjs.map +1 -0
  32. package/dist/enums/credit-card.d.mts +20 -0
  33. package/dist/enums/credit-card.d.ts +20 -0
  34. package/dist/enums/credit-card.js +25 -0
  35. package/dist/enums/credit-card.js.map +1 -0
  36. package/dist/enums/credit-card.mjs +23 -0
  37. package/dist/enums/credit-card.mjs.map +1 -0
  38. package/dist/enums/execution-method.d.mts +10 -0
  39. package/dist/enums/execution-method.d.ts +10 -0
  40. package/dist/enums/execution-method.js +15 -0
  41. package/dist/enums/execution-method.js.map +1 -0
  42. package/dist/enums/execution-method.mjs +13 -0
  43. package/dist/enums/execution-method.mjs.map +1 -0
  44. package/dist/enums/flag.d.mts +198 -0
  45. package/dist/enums/flag.d.ts +198 -0
  46. package/dist/enums/flag.js +203 -0
  47. package/dist/enums/flag.js.map +1 -0
  48. package/dist/enums/flag.mjs +201 -0
  49. package/dist/enums/flag.mjs.map +1 -0
  50. package/dist/enums/image-format.d.mts +9 -0
  51. package/dist/enums/image-format.d.ts +9 -0
  52. package/dist/enums/image-format.js +14 -0
  53. package/dist/enums/image-format.js.map +1 -0
  54. package/dist/enums/image-format.mjs +12 -0
  55. package/dist/enums/image-format.mjs.map +1 -0
  56. package/dist/enums/image-gravity.d.mts +13 -0
  57. package/dist/enums/image-gravity.d.ts +13 -0
  58. package/dist/enums/image-gravity.js +18 -0
  59. package/dist/enums/image-gravity.js.map +1 -0
  60. package/dist/enums/image-gravity.mjs +16 -0
  61. package/dist/enums/image-gravity.mjs.map +1 -0
  62. package/dist/enums/index-type.d.mts +7 -0
  63. package/dist/enums/index-type.d.ts +7 -0
  64. package/dist/enums/index-type.js +12 -0
  65. package/dist/enums/index-type.js.map +1 -0
  66. package/dist/enums/index-type.mjs +10 -0
  67. package/dist/enums/index-type.mjs.map +1 -0
  68. package/dist/enums/messaging-provider-type.d.mts +7 -0
  69. package/dist/enums/messaging-provider-type.d.ts +7 -0
  70. package/dist/enums/messaging-provider-type.js +12 -0
  71. package/dist/enums/messaging-provider-type.js.map +1 -0
  72. package/dist/enums/messaging-provider-type.mjs +10 -0
  73. package/dist/enums/messaging-provider-type.mjs.map +1 -0
  74. package/dist/enums/name.d.mts +17 -0
  75. package/dist/enums/name.d.ts +17 -0
  76. package/dist/enums/name.js +22 -0
  77. package/dist/enums/name.js.map +1 -0
  78. package/dist/enums/name.mjs +20 -0
  79. package/dist/enums/name.mjs.map +1 -0
  80. package/dist/enums/o-auth-provider.d.mts +43 -0
  81. package/dist/enums/o-auth-provider.d.ts +43 -0
  82. package/dist/enums/o-auth-provider.js +48 -0
  83. package/dist/enums/o-auth-provider.js.map +1 -0
  84. package/dist/enums/o-auth-provider.mjs +46 -0
  85. package/dist/enums/o-auth-provider.mjs.map +1 -0
  86. package/dist/enums/password-hash.d.mts +15 -0
  87. package/dist/enums/password-hash.d.ts +15 -0
  88. package/dist/enums/password-hash.js +20 -0
  89. package/dist/enums/password-hash.js.map +1 -0
  90. package/dist/enums/password-hash.mjs +18 -0
  91. package/dist/enums/password-hash.mjs.map +1 -0
  92. package/dist/enums/relation-mutate.d.mts +7 -0
  93. package/dist/enums/relation-mutate.d.ts +7 -0
  94. package/dist/enums/relation-mutate.js +12 -0
  95. package/dist/enums/relation-mutate.js.map +1 -0
  96. package/dist/enums/relation-mutate.mjs +10 -0
  97. package/dist/enums/relation-mutate.mjs.map +1 -0
  98. package/dist/enums/relationship-type.d.mts +8 -0
  99. package/dist/enums/relationship-type.d.ts +8 -0
  100. package/dist/enums/relationship-type.js +13 -0
  101. package/dist/enums/relationship-type.js.map +1 -0
  102. package/dist/enums/relationship-type.mjs +11 -0
  103. package/dist/enums/relationship-type.mjs.map +1 -0
  104. package/dist/enums/runtime.d.mts +48 -0
  105. package/dist/enums/runtime.d.ts +48 -0
  106. package/dist/enums/runtime.js +53 -0
  107. package/dist/enums/runtime.js.map +1 -0
  108. package/dist/enums/runtime.mjs +51 -0
  109. package/dist/enums/runtime.mjs.map +1 -0
  110. package/dist/enums/smtp-encryption.d.mts +7 -0
  111. package/dist/enums/smtp-encryption.d.ts +7 -0
  112. package/dist/enums/smtp-encryption.js +12 -0
  113. package/dist/enums/smtp-encryption.js.map +1 -0
  114. package/dist/enums/smtp-encryption.mjs +10 -0
  115. package/dist/enums/smtp-encryption.mjs.map +1 -0
  116. package/dist/id.d.mts +7 -0
  117. package/dist/id.d.ts +7 -0
  118. package/dist/id.js +29 -0
  119. package/dist/id.js.map +1 -0
  120. package/dist/id.mjs +27 -0
  121. package/dist/id.mjs.map +1 -0
  122. package/dist/index.d.mts +35 -0
  123. package/dist/index.d.ts +35 -0
  124. package/dist/index.js +180 -0
  125. package/dist/index.js.map +1 -0
  126. package/dist/index.mjs +35 -0
  127. package/dist/index.mjs.map +1 -0
  128. package/dist/inputFile.d.mts +9 -0
  129. package/dist/inputFile.d.ts +9 -0
  130. package/dist/inputFile.js +23 -0
  131. package/dist/inputFile.js.map +1 -0
  132. package/dist/inputFile.mjs +21 -0
  133. package/dist/inputFile.mjs.map +1 -0
  134. package/dist/models.d.mts +2406 -0
  135. package/dist/models.d.ts +2406 -0
  136. package/dist/models.js +4 -0
  137. package/dist/models.js.map +1 -0
  138. package/dist/models.mjs +3 -0
  139. package/dist/models.mjs.map +1 -0
  140. package/dist/permission.d.mts +9 -0
  141. package/dist/permission.d.ts +9 -0
  142. package/dist/permission.js +23 -0
  143. package/dist/permission.js.map +1 -0
  144. package/dist/permission.mjs +21 -0
  145. package/dist/permission.mjs.map +1 -0
  146. package/dist/query.d.mts +35 -0
  147. package/dist/query.d.ts +35 -0
  148. package/dist/query.js +49 -0
  149. package/dist/query.js.map +1 -0
  150. package/dist/query.mjs +47 -0
  151. package/dist/query.mjs.map +1 -0
  152. package/dist/role.d.mts +72 -0
  153. package/dist/role.d.ts +72 -0
  154. package/dist/role.js +96 -0
  155. package/dist/role.js.map +1 -0
  156. package/dist/role.mjs +94 -0
  157. package/dist/role.mjs.map +1 -0
  158. package/dist/services/account.d.mts +478 -0
  159. package/dist/services/account.d.ts +478 -0
  160. package/dist/services/account.js +1331 -0
  161. package/dist/services/account.js.map +1 -0
  162. package/dist/services/account.mjs +1329 -0
  163. package/dist/services/account.mjs.map +1 -0
  164. package/dist/services/avatars.d.mts +118 -0
  165. package/dist/services/avatars.d.ts +118 -0
  166. package/dist/services/avatars.js +297 -0
  167. package/dist/services/avatars.js.map +1 -0
  168. package/dist/services/avatars.mjs +295 -0
  169. package/dist/services/avatars.mjs.map +1 -0
  170. package/dist/services/databases.d.mts +606 -0
  171. package/dist/services/databases.d.ts +606 -0
  172. package/dist/services/databases.js +1908 -0
  173. package/dist/services/databases.js.map +1 -0
  174. package/dist/services/databases.mjs +1906 -0
  175. package/dist/services/databases.mjs.map +1 -0
  176. package/dist/services/functions.d.mts +287 -0
  177. package/dist/services/functions.d.ts +287 -0
  178. package/dist/services/functions.js +837 -0
  179. package/dist/services/functions.js.map +1 -0
  180. package/dist/services/functions.mjs +835 -0
  181. package/dist/services/functions.mjs.map +1 -0
  182. package/dist/services/graphql.d.mts +30 -0
  183. package/dist/services/graphql.d.ts +30 -0
  184. package/dist/services/graphql.js +73 -0
  185. package/dist/services/graphql.js.map +1 -0
  186. package/dist/services/graphql.mjs +71 -0
  187. package/dist/services/graphql.mjs.map +1 -0
  188. package/dist/services/health.d.mts +235 -0
  189. package/dist/services/health.d.ts +235 -0
  190. package/dist/services/health.js +584 -0
  191. package/dist/services/health.js.map +1 -0
  192. package/dist/services/health.mjs +582 -0
  193. package/dist/services/health.mjs.map +1 -0
  194. package/dist/services/locale.d.mts +84 -0
  195. package/dist/services/locale.d.ts +84 -0
  196. package/dist/services/locale.js +189 -0
  197. package/dist/services/locale.js.map +1 -0
  198. package/dist/services/locale.mjs +187 -0
  199. package/dist/services/locale.mjs.map +1 -0
  200. package/dist/services/messaging.d.mts +688 -0
  201. package/dist/services/messaging.d.ts +688 -0
  202. package/dist/services/messaging.js +2152 -0
  203. package/dist/services/messaging.js.map +1 -0
  204. package/dist/services/messaging.mjs +2150 -0
  205. package/dist/services/messaging.mjs.map +1 -0
  206. package/dist/services/storage.d.mts +193 -0
  207. package/dist/services/storage.d.ts +193 -0
  208. package/dist/services/storage.js +550 -0
  209. package/dist/services/storage.js.map +1 -0
  210. package/dist/services/storage.mjs +548 -0
  211. package/dist/services/storage.mjs.map +1 -0
  212. package/dist/services/teams.d.mts +171 -0
  213. package/dist/services/teams.d.ts +171 -0
  214. package/dist/services/teams.js +466 -0
  215. package/dist/services/teams.js.map +1 -0
  216. package/dist/services/teams.mjs +464 -0
  217. package/dist/services/teams.mjs.map +1 -0
  218. package/dist/services/users.d.mts +490 -0
  219. package/dist/services/users.d.ts +490 -0
  220. package/dist/services/users.js +1464 -0
  221. package/dist/services/users.js.map +1 -0
  222. package/dist/services/users.mjs +1462 -0
  223. package/dist/services/users.mjs.map +1 -0
  224. package/docs/examples/functions/create-deployment.md +1 -1
  225. package/docs/examples/storage/create-file.md +1 -1
  226. package/package.json +35 -5
  227. package/src/client.ts +366 -0
  228. package/src/enums/authentication-factor.ts +6 -0
  229. package/src/enums/authenticator-type.ts +3 -0
  230. package/src/enums/browser.ts +16 -0
  231. package/src/enums/compression.ts +5 -0
  232. package/src/enums/credit-card.ts +18 -0
  233. package/src/enums/execution-method.ts +8 -0
  234. package/src/enums/flag.ts +196 -0
  235. package/src/enums/image-format.ts +7 -0
  236. package/src/enums/image-gravity.ts +11 -0
  237. package/src/enums/index-type.ts +5 -0
  238. package/src/enums/messaging-provider-type.ts +5 -0
  239. package/src/enums/name.ts +15 -0
  240. package/src/enums/o-auth-provider.ts +41 -0
  241. package/src/enums/password-hash.ts +13 -0
  242. package/src/enums/relation-mutate.ts +5 -0
  243. package/src/enums/relationship-type.ts +6 -0
  244. package/src/enums/runtime.ts +46 -0
  245. package/src/enums/smtp-encryption.ts +5 -0
  246. package/src/id.ts +28 -0
  247. package/src/index.ts +35 -0
  248. package/src/inputFile.ts +23 -0
  249. package/src/models.ts +2404 -0
  250. package/src/permission.ts +22 -0
  251. package/src/query.ts +101 -0
  252. package/{lib/role.js → src/role.ts} +23 -25
  253. package/src/services/account.ts +1418 -0
  254. package/src/services/avatars.ts +312 -0
  255. package/{lib/services/databases.js → src/services/databases.ts} +644 -638
  256. package/{lib/services/functions.js → src/services/functions.ts} +317 -369
  257. package/{lib/services/graphql.js → src/services/graphql.ts} +35 -34
  258. package/src/services/health.ts +629 -0
  259. package/src/services/locale.ts +205 -0
  260. package/{lib/services/messaging.js → src/services/messaging.ts} +658 -633
  261. package/{lib/services/storage.js → src/services/storage.ts} +211 -298
  262. package/{lib/services/teams.js → src/services/teams.ts} +211 -200
  263. package/{lib/services/users.js → src/services/users.ts} +603 -519
  264. package/tsconfig.json +18 -0
  265. package/tsup.config.js +19 -0
  266. package/index.d.ts +0 -6656
  267. package/index.js +0 -75
  268. package/lib/client.js +0 -245
  269. package/lib/enums/authentication-factor.js +0 -8
  270. package/lib/enums/authenticator-type.js +0 -5
  271. package/lib/enums/browser.js +0 -18
  272. package/lib/enums/compression.js +0 -7
  273. package/lib/enums/credit-card.js +0 -20
  274. package/lib/enums/execution-method.js +0 -10
  275. package/lib/enums/flag.js +0 -198
  276. package/lib/enums/image-format.js +0 -9
  277. package/lib/enums/image-gravity.js +0 -13
  278. package/lib/enums/index-type.js +0 -7
  279. package/lib/enums/messaging-provider-type.js +0 -7
  280. package/lib/enums/name.js +0 -17
  281. package/lib/enums/o-auth-provider.js +0 -43
  282. package/lib/enums/password-hash.js +0 -15
  283. package/lib/enums/relation-mutate.js +0 -7
  284. package/lib/enums/relationship-type.js +0 -8
  285. package/lib/enums/runtime.js +0 -48
  286. package/lib/enums/smtp-encryption.js +0 -7
  287. package/lib/exception.js +0 -10
  288. package/lib/id.js +0 -12
  289. package/lib/inputFile.js +0 -117
  290. package/lib/permission.js +0 -24
  291. package/lib/query.js +0 -90
  292. package/lib/service.js +0 -10
  293. package/lib/services/account.js +0 -1365
  294. package/lib/services/avatars.js +0 -325
  295. package/lib/services/health.js +0 -513
  296. package/lib/services/locale.js +0 -169
@@ -0,0 +1,22 @@
1
+ export class Permission {
2
+
3
+ static read = (role: string): string => {
4
+ return `read("${role}")`
5
+ }
6
+
7
+ static write = (role: string): string => {
8
+ return `write("${role}")`
9
+ }
10
+
11
+ static create = (role: string): string => {
12
+ return `create("${role}")`
13
+ }
14
+
15
+ static update = (role: string): string => {
16
+ return `update("${role}")`
17
+ }
18
+
19
+ static delete = (role: string): string => {
20
+ return `delete("${role}")`
21
+ }
22
+ }
package/src/query.ts ADDED
@@ -0,0 +1,101 @@
1
+ type QueryTypesSingle = string | number | boolean;
2
+ export type QueryTypesList = string[] | number[] | boolean[] | Query[];
3
+ export type QueryTypes = QueryTypesSingle | QueryTypesList;
4
+ type AttributesTypes = string | string[];
5
+
6
+ export class Query {
7
+ method: string;
8
+ attribute: AttributesTypes | undefined;
9
+ values: QueryTypesList | undefined;
10
+
11
+ constructor(
12
+ method: string,
13
+ attribute?: AttributesTypes,
14
+ values?: QueryTypes
15
+ ) {
16
+ this.method = method;
17
+ this.attribute = attribute;
18
+
19
+ if (values !== undefined) {
20
+ if (Array.isArray(values)) {
21
+ this.values = values;
22
+ } else {
23
+ this.values = [values] as QueryTypesList;
24
+ }
25
+ }
26
+ }
27
+
28
+ toString(): string {
29
+ return JSON.stringify({
30
+ method: this.method,
31
+ attribute: this.attribute,
32
+ values: this.values,
33
+ });
34
+ }
35
+
36
+ static equal = (attribute: string, value: QueryTypes): string =>
37
+ new Query("equal", attribute, value).toString();
38
+
39
+ static notEqual = (attribute: string, value: QueryTypes): string =>
40
+ new Query("notEqual", attribute, value).toString();
41
+
42
+ static lessThan = (attribute: string, value: QueryTypes): string =>
43
+ new Query("lessThan", attribute, value).toString();
44
+
45
+ static lessThanEqual = (attribute: string, value: QueryTypes): string =>
46
+ new Query("lessThanEqual", attribute, value).toString();
47
+
48
+ static greaterThan = (attribute: string, value: QueryTypes): string =>
49
+ new Query("greaterThan", attribute, value).toString();
50
+
51
+ static greaterThanEqual = (attribute: string, value: QueryTypes): string =>
52
+ new Query("greaterThanEqual", attribute, value).toString();
53
+
54
+ static isNull = (attribute: string): string =>
55
+ new Query("isNull", attribute).toString();
56
+
57
+ static isNotNull = (attribute: string): string =>
58
+ new Query("isNotNull", attribute).toString();
59
+
60
+ static between = (attribute: string, start: string | number, end: string | number) =>
61
+ new Query("between", attribute, [start, end] as QueryTypesList).toString();
62
+
63
+ static startsWith = (attribute: string, value: string): string =>
64
+ new Query("startsWith", attribute, value).toString();
65
+
66
+ static endsWith = (attribute: string, value: string): string =>
67
+ new Query("endsWith", attribute, value).toString();
68
+
69
+ static select = (attributes: string[]): string =>
70
+ new Query("select", undefined, attributes).toString();
71
+
72
+ static search = (attribute: string, value: string): string =>
73
+ new Query("search", attribute, value).toString();
74
+
75
+ static orderDesc = (attribute: string): string =>
76
+ new Query("orderDesc", attribute).toString();
77
+
78
+ static orderAsc = (attribute: string): string =>
79
+ new Query("orderAsc", attribute).toString();
80
+
81
+ static cursorAfter = (documentId: string): string =>
82
+ new Query("cursorAfter", undefined, documentId).toString();
83
+
84
+ static cursorBefore = (documentId: string): string =>
85
+ new Query("cursorBefore", undefined, documentId).toString();
86
+
87
+ static limit = (limit: number): string =>
88
+ new Query("limit", undefined, limit).toString();
89
+
90
+ static offset = (offset: number): string =>
91
+ new Query("offset", undefined, offset).toString();
92
+
93
+ static contains = (attribute: string, value: string | string[]): string =>
94
+ new Query("contains", attribute, value).toString();
95
+
96
+ static or = (queries: string[]) =>
97
+ new Query("or", undefined, queries.map((query) => JSON.parse(query))).toString();
98
+
99
+ static and = (queries: string[]) =>
100
+ new Query("and", undefined, queries.map((query) => JSON.parse(query))).toString();
101
+ }
@@ -1,22 +1,22 @@
1
1
  /**
2
2
  * Helper class to generate role strings for `Permission`.
3
3
  */
4
- class Role {
4
+ export class Role {
5
5
 
6
6
  /**
7
7
  * Grants access to anyone.
8
- *
8
+ *
9
9
  * This includes authenticated and unauthenticated users.
10
- *
10
+ *
11
11
  * @returns {string}
12
12
  */
13
- static any = () => {
13
+ public static any(): string {
14
14
  return 'any'
15
15
  }
16
16
 
17
17
  /**
18
18
  * Grants access to a specific user by user ID.
19
- *
19
+ *
20
20
  * You can optionally pass verified or unverified for
21
21
  * `status` to target specific types of users.
22
22
  *
@@ -24,7 +24,7 @@ class Role {
24
24
  * @param {string} status
25
25
  * @returns {string}
26
26
  */
27
- static user = (id, status = '') => {
27
+ public static user(id: string, status: string = ''): string {
28
28
  if (status === '') {
29
29
  return `user:${id}`
30
30
  }
@@ -33,14 +33,14 @@ class Role {
33
33
 
34
34
  /**
35
35
  * Grants access to any authenticated or anonymous user.
36
- *
36
+ *
37
37
  * You can optionally pass verified or unverified for
38
38
  * `status` to target specific types of users.
39
- *
39
+ *
40
40
  * @param {string} status
41
41
  * @returns {string}
42
42
  */
43
- static users = (status = '') => {
43
+ public static users(status: string = ''): string {
44
44
  if (status === '') {
45
45
  return 'users'
46
46
  }
@@ -49,18 +49,18 @@ class Role {
49
49
 
50
50
  /**
51
51
  * Grants access to any guest user without a session.
52
- *
52
+ *
53
53
  * Authenticated users don't have access to this role.
54
- *
54
+ *
55
55
  * @returns {string}
56
56
  */
57
- static guests = () => {
57
+ public static guests(): string {
58
58
  return 'guests'
59
59
  }
60
60
 
61
61
  /**
62
62
  * Grants access to a team by team ID.
63
- *
63
+ *
64
64
  * You can optionally pass a role for `role` to target
65
65
  * team members with the specified role.
66
66
  *
@@ -68,35 +68,33 @@ class Role {
68
68
  * @param {string} role
69
69
  * @returns {string}
70
70
  */
71
- static team = (id, role = '') => {
71
+ public static team(id: string, role: string = ''): string {
72
72
  if (role === '') {
73
- return 'team:' + id
73
+ return `team:${id}`
74
74
  }
75
- return 'team:' + id + '/' + role
75
+ return `team:${id}/${role}`
76
76
  }
77
77
 
78
78
  /**
79
79
  * Grants access to a specific member of a team.
80
- *
80
+ *
81
81
  * When the member is removed from the team, they will
82
82
  * no longer have access.
83
83
  *
84
84
  * @param {string} id
85
85
  * @returns {string}
86
86
  */
87
- static member = (id) => {
88
- return 'member:' + id
87
+ public static member(id: string): string {
88
+ return `member:${id}`
89
89
  }
90
90
 
91
91
  /**
92
92
  * Grants access to a user with the specified label.
93
- *
93
+ *
94
94
  * @param {string} name
95
95
  * @returns {string}
96
96
  */
97
- static label = (name) => {
98
- return 'label:' + name;
97
+ public static label(name: string): string {
98
+ return `label:${name}`
99
99
  }
100
- }
101
-
102
- module.exports = Role;
100
+ }