@nlabs/reaktor 0.1.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 (154) hide show
  1. package/.vscode/extensions.json +15 -0
  2. package/.vscode/settings.json +82 -0
  3. package/README.md +211 -0
  4. package/index.d.ts +1 -0
  5. package/index.js +5 -0
  6. package/lex.config.js +4 -0
  7. package/lib/config.d.ts +21 -0
  8. package/lib/config.js +127 -0
  9. package/lib/data/conversations.d.ts +6 -0
  10. package/lib/data/conversations.js +201 -0
  11. package/lib/data/dynamodb.d.ts +8 -0
  12. package/lib/data/dynamodb.js +139 -0
  13. package/lib/data/email.d.ts +7 -0
  14. package/lib/data/email.js +164 -0
  15. package/lib/data/files.d.ts +16 -0
  16. package/lib/data/files.js +407 -0
  17. package/lib/data/groups.d.ts +13 -0
  18. package/lib/data/groups.js +354 -0
  19. package/lib/data/images.d.ts +12 -0
  20. package/lib/data/images.js +668 -0
  21. package/lib/data/index.d.ts +19 -0
  22. package/lib/data/index.js +24 -0
  23. package/lib/data/ios.d.ts +6 -0
  24. package/lib/data/ios.js +302 -0
  25. package/lib/data/locations.d.ts +3 -0
  26. package/lib/data/locations.js +132 -0
  27. package/lib/data/messages.d.ts +9 -0
  28. package/lib/data/messages.js +248 -0
  29. package/lib/data/notifications.d.ts +5 -0
  30. package/lib/data/notifications.js +42 -0
  31. package/lib/data/payments.d.ts +11 -0
  32. package/lib/data/payments.js +748 -0
  33. package/lib/data/posts.d.ts +14 -0
  34. package/lib/data/posts.js +458 -0
  35. package/lib/data/reactions.d.ts +6 -0
  36. package/lib/data/reactions.js +218 -0
  37. package/lib/data/s3.d.ts +6 -0
  38. package/lib/data/s3.js +103 -0
  39. package/lib/data/search.d.ts +3 -0
  40. package/lib/data/search.js +98 -0
  41. package/lib/data/sms.d.ts +3 -0
  42. package/lib/data/sms.js +59 -0
  43. package/lib/data/subscription.d.ts +7 -0
  44. package/lib/data/subscription.js +284 -0
  45. package/lib/data/tags.d.ts +14 -0
  46. package/lib/data/tags.js +304 -0
  47. package/lib/data/users.d.ts +12 -0
  48. package/lib/data/users.js +312 -0
  49. package/lib/index.d.ts +3 -0
  50. package/lib/index.js +8 -0
  51. package/lib/types/apps.d.ts +44 -0
  52. package/lib/types/apps.js +2 -0
  53. package/lib/types/arangodb.d.ts +17 -0
  54. package/lib/types/arangodb.js +2 -0
  55. package/lib/types/auth.d.ts +9 -0
  56. package/lib/types/auth.js +2 -0
  57. package/lib/types/conversations.d.ts +6 -0
  58. package/lib/types/conversations.js +2 -0
  59. package/lib/types/email.d.ts +12 -0
  60. package/lib/types/email.js +2 -0
  61. package/lib/types/files.d.ts +28 -0
  62. package/lib/types/files.js +2 -0
  63. package/lib/types/google.d.ts +27 -0
  64. package/lib/types/google.js +2 -0
  65. package/lib/types/groups.d.ts +22 -0
  66. package/lib/types/groups.js +2 -0
  67. package/lib/types/images.d.ts +25 -0
  68. package/lib/types/images.js +2 -0
  69. package/lib/types/index.d.ts +17 -0
  70. package/lib/types/index.js +22 -0
  71. package/lib/types/locations.d.ts +21 -0
  72. package/lib/types/locations.js +2 -0
  73. package/lib/types/messages.d.ts +12 -0
  74. package/lib/types/messages.js +2 -0
  75. package/lib/types/notifications.d.ts +19 -0
  76. package/lib/types/notifications.js +2 -0
  77. package/lib/types/payments.d.ts +119 -0
  78. package/lib/types/payments.js +2 -0
  79. package/lib/types/posts.d.ts +20 -0
  80. package/lib/types/posts.js +2 -0
  81. package/lib/types/reactions.d.ts +4 -0
  82. package/lib/types/reactions.js +2 -0
  83. package/lib/types/tags.d.ts +10 -0
  84. package/lib/types/tags.js +2 -0
  85. package/lib/types/users.d.ts +78 -0
  86. package/lib/types/users.js +2 -0
  87. package/lib/utils/analytics.d.ts +3 -0
  88. package/lib/utils/analytics.js +47 -0
  89. package/lib/utils/arangodb.d.ts +9 -0
  90. package/lib/utils/arangodb.js +98 -0
  91. package/lib/utils/auth.d.ts +2 -0
  92. package/lib/utils/auth.js +43 -0
  93. package/lib/utils/index.d.ts +5 -0
  94. package/lib/utils/index.js +10 -0
  95. package/lib/utils/objects.d.ts +3 -0
  96. package/lib/utils/objects.js +34 -0
  97. package/lib/utils/redis.d.ts +1 -0
  98. package/lib/utils/redis.js +15 -0
  99. package/package.json +75 -0
  100. package/src/config.ts +121 -0
  101. package/src/data/conversations.ts +183 -0
  102. package/src/data/dynamodb.ts +157 -0
  103. package/src/data/email.ts +164 -0
  104. package/src/data/files.ts +352 -0
  105. package/src/data/groups.ts +308 -0
  106. package/src/data/images.ts +606 -0
  107. package/src/data/index.ts +23 -0
  108. package/src/data/ios.ts +249 -0
  109. package/src/data/locations.ts +114 -0
  110. package/src/data/messages.ts +237 -0
  111. package/src/data/notifications.ts +48 -0
  112. package/src/data/payments.ts +675 -0
  113. package/src/data/posts.ts +508 -0
  114. package/src/data/reactions.ts +186 -0
  115. package/src/data/s3.ts +117 -0
  116. package/src/data/search.ts +74 -0
  117. package/src/data/sms.ts +60 -0
  118. package/src/data/subscription.ts +228 -0
  119. package/src/data/tags.ts +230 -0
  120. package/src/data/users.ts +256 -0
  121. package/src/index.ts +7 -0
  122. package/src/types/apps.ts +57 -0
  123. package/src/types/arangodb.ts +23 -0
  124. package/src/types/auth.ts +19 -0
  125. package/src/types/conversations.ts +11 -0
  126. package/src/types/email.ts +17 -0
  127. package/src/types/files.ts +33 -0
  128. package/src/types/google.ts +37 -0
  129. package/src/types/groups.ts +28 -0
  130. package/src/types/images.ts +33 -0
  131. package/src/types/index.ts +21 -0
  132. package/src/types/locations.ts +25 -0
  133. package/src/types/messages.ts +16 -0
  134. package/src/types/notifications.ts +26 -0
  135. package/src/types/payments.ts +134 -0
  136. package/src/types/posts.ts +25 -0
  137. package/src/types/reactions.ts +8 -0
  138. package/src/types/tags.ts +14 -0
  139. package/src/types/users.ts +89 -0
  140. package/src/utils/analytics.ts +41 -0
  141. package/src/utils/arangodb.ts +100 -0
  142. package/src/utils/auth.ts +28 -0
  143. package/src/utils/index.ts +9 -0
  144. package/src/utils/objects.ts +34 -0
  145. package/src/utils/redis.ts +17 -0
  146. package/templates/email/layout.html +279 -0
  147. package/templates/email/passwordForgot.html +15 -0
  148. package/templates/email/passwordRecovery.html +12 -0
  149. package/templates/email/verifyEmail.html +15 -0
  150. package/templates/sms/passwordForgot.txt +1 -0
  151. package/templates/sms/passwordRecovery.txt +1 -0
  152. package/templates/sms/verifyEmail.txt +1 -0
  153. package/templates/sms/verifyPhone.txt +1 -0
  154. package/tsconfig.json +45 -0
@@ -0,0 +1,312 @@
1
+ function _templateObject6() {
2
+ var data = _taggedTemplateLiteral(["FOR u, r IN INBOUND ", " hasRelation\n FILTER r._from == ", "\n RETURN r"]);
3
+
4
+ _templateObject6 = function _templateObject6() {
5
+ return data;
6
+ };
7
+
8
+ return data;
9
+ }
10
+
11
+ function _templateObject5() {
12
+ var data = _taggedTemplateLiteral(["FOR r IN hasRelation\n FILTER r.value == ", " && r._from == ", " && r._to == ", "\n LIMIT 1\n RETURN r"]);
13
+
14
+ _templateObject5 = function _templateObject5() {
15
+ return data;
16
+ };
17
+
18
+ return data;
19
+ }
20
+
21
+ function _templateObject4() {
22
+ var data = _taggedTemplateLiteral(["FOR u IN users\n FILTER u._key == ", "\n LIMIT 1\n RETURN u"]);
23
+
24
+ _templateObject4 = function _templateObject4() {
25
+ return data;
26
+ };
27
+
28
+ return data;
29
+ }
30
+
31
+ function _templateObject3() {
32
+ var data = _taggedTemplateLiteral(["UPDATE ", " WITH ", " IN users LIMIT 1 RETURN NEW"]);
33
+
34
+ _templateObject3 = function _templateObject3() {
35
+ return data;
36
+ };
37
+
38
+ return data;
39
+ }
40
+
41
+ function _templateObject2() {
42
+ var data = _taggedTemplateLiteral(["FOR u IN users\n FILTER u._key == ", "\n LIMIT 1\n REMOVE u IN users\n RETURN OLD"]);
43
+
44
+ _templateObject2 = function _templateObject2() {
45
+ return data;
46
+ };
47
+
48
+ return data;
49
+ }
50
+
51
+ function _templateObject() {
52
+ var data = _taggedTemplateLiteral(["INSERT ", " IN users RETURN NEW"]);
53
+
54
+ _templateObject = function _templateObject() {
55
+ return data;
56
+ };
57
+
58
+ return data;
59
+ }
60
+
61
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
62
+
63
+ /**
64
+ * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
65
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
66
+ */
67
+ import { createHash, parseChar, parseEmail, parseId, parseUsername, parseVarChar } from '@nlabs/utils';
68
+ import { aql } from 'arangojs';
69
+ import isEmpty from 'lodash/isEmpty';
70
+ import * as stripe from 'stripe';
71
+ import { getLimit, logError, logException, useDb } from '../utils';
72
+ var eventCategory = 'users';
73
+ export var addUser = function addUser(context, user) {
74
+ var database = context.database;
75
+ var email = user.email,
76
+ phone = user.phone,
77
+ sub = user.sub,
78
+ username = user.username; // Add new user properties
79
+
80
+ var insert = {
81
+ _key: createHash(sub, null),
82
+ added: Date.now(),
83
+ email: email !== undefined ? parseEmail(email) : undefined,
84
+ modified: Date.now(),
85
+ phone: phone !== undefined ? parseVarChar(phone, 15) : undefined,
86
+ sub: parseVarChar(sub, 32),
87
+ username: parseUsername(username)
88
+ }; // Add new user in ArangoDB
89
+
90
+ var aqlQry = aql(_templateObject(), insert);
91
+ return useDb(database).query(aqlQry).then(function (cursor) {
92
+ return cursor.next();
93
+ });
94
+ };
95
+ export var deleteUser = function deleteUser(context, userId) {
96
+ var action = 'delete';
97
+ var database = context.database,
98
+ sessionId = context.userId,
99
+ sessionType = context.userType;
100
+ var isAdmin = sessionType > 2;
101
+
102
+ if (!isAdmin && sessionId !== userId) {
103
+ logException({
104
+ action: action,
105
+ category: eventCategory,
106
+ label: 'unauthorized',
107
+ value: 'invalid_session'
108
+ }, context);
109
+ return null;
110
+ }
111
+
112
+ var aqlQry = aql(_templateObject2(), userId);
113
+ return useDb(database).query(aqlQry).then(function (cursor) {
114
+ return cursor.next();
115
+ }).then(function () {
116
+ var user = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
117
+ return stripe.customers.del(user.stripeCustomerId).then(function () {
118
+ return stripe.accounts.del(user.stripeAccountId);
119
+ }).then(function () {
120
+ return user;
121
+ });
122
+ }).catch(function (error) {
123
+ throw error;
124
+ });
125
+ };
126
+ export var deactivateUser = function deactivateUser(context, userId) {
127
+ var action = 'delete';
128
+ var database = context.database,
129
+ sessionId = context.userId,
130
+ sessionType = context.userType;
131
+ var isAdmin = sessionType > 2;
132
+
133
+ if (!isAdmin && sessionId !== userId) {
134
+ logException({
135
+ action: action,
136
+ category: eventCategory,
137
+ label: 'unauthorized',
138
+ value: 'invalid_session'
139
+ }, context);
140
+ return null;
141
+ }
142
+
143
+ var updated = {
144
+ userType: 0
145
+ };
146
+ var aqlQry = aql(_templateObject3(), userId, updated);
147
+ return useDb(database).query(aqlQry).then(function (cursor) {
148
+ return cursor.next();
149
+ }).catch(function (error) {
150
+ throw error;
151
+ });
152
+ };
153
+ export var getUser = function getUser(context, userId) {
154
+ var action = 'getItem';
155
+ var formatUserId = parseId(userId);
156
+ var database = context.database; // Get data from database
157
+
158
+ var aqlQry = aql(_templateObject4(), formatUserId);
159
+ return useDb(database).query(aqlQry).then(function (cursor) {
160
+ return cursor.next();
161
+ }).then(function () {
162
+ var user = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
163
+ return user;
164
+ }).catch(function (error) {
165
+ return logError({
166
+ action: action,
167
+ category: eventCategory,
168
+ label: 'db_error'
169
+ }, error, context).then(function () {});
170
+ });
171
+ };
172
+ export var getUserList = function getUserList(context) {
173
+ var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
174
+ var to = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 15;
175
+ var action = 'getItem';
176
+ var database = context.database;
177
+ var limit = getLimit(from, to); // Get data from database
178
+
179
+ var aqlQry = "FOR u IN users\n ".concat(limit.aql, "\n SORT u.username\n RETURN u");
180
+ return useDb(database).query(aqlQry).then(function (cursor) {
181
+ return cursor.all();
182
+ }).catch(function (error) {
183
+ return logError({
184
+ action: action,
185
+ category: eventCategory,
186
+ label: 'db_error'
187
+ }, error, context).then(function () {
188
+ return [];
189
+ });
190
+ });
191
+ };
192
+ export var addUserRelation = function addUserRelation(context, userId, value) {
193
+ var action = 'addRelation';
194
+ var database = context.database,
195
+ sessionId = context.userId;
196
+ var formatUserId = parseId(userId);
197
+ var formatValue = parseChar(value, 32);
198
+ var db = useDb(database);
199
+ var aqlQry = aql(_templateObject5(), formatValue, sessionId, formatUserId);
200
+ return db.query(aqlQry).then(function (cursor) {
201
+ return cursor.next();
202
+ }).then(function (relation) {
203
+ // If a relationship between two users with the value exists, just return
204
+ if (relation) {
205
+ return relation;
206
+ } // Otherwise, create the new relationship
207
+
208
+
209
+ var edgeId = createHash("relation-".concat(sessionId, "-").concat(formatUserId, "-").concat(formatValue));
210
+ var edge = {
211
+ _key: edgeId,
212
+ added: Date.now(),
213
+ value: formatValue
214
+ };
215
+ var edgeCollection = db.edgeCollection('hasRelation');
216
+ return edgeCollection.save(edge, "users/".concat(sessionId), "users/".concat(formatUserId)).then(function () {
217
+ return edgeCollection.edge(edgeId);
218
+ }).catch(function (error) {
219
+ throw error;
220
+ });
221
+ }).catch(function (error) {
222
+ return logError({
223
+ action: action,
224
+ category: eventCategory,
225
+ label: 'db_error'
226
+ }, error, context).then(function () {
227
+ return null;
228
+ });
229
+ });
230
+ };
231
+ export var deleteUserRelation = function deleteUserRelation(context, userId, value) {
232
+ var action = 'getRelationsByUser';
233
+ var database = context.database,
234
+ sessionId = context.userId;
235
+ var formatUserId = parseId(userId);
236
+ var formatValue = parseChar(value, 32);
237
+ var aqlQry = "FOR u, r IN INBOUND \"".concat("users/".concat(formatUserId), "\" hasRelation\n FILTER r._from == \"", "users/".concat(sessionId), "\" && r.value == \"", formatValue, "\"\n REMOVE r IN hasRelation\n RETURN OLD");
238
+ return useDb(database).query(aqlQry).then(function (cursor) {
239
+ return cursor.next();
240
+ }).then(function () {
241
+ var relation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
242
+ return relation;
243
+ }).catch(function (error) {
244
+ return logError({
245
+ action: action,
246
+ category: eventCategory,
247
+ label: 'db_error'
248
+ }, error, context).then(function () {
249
+ return null;
250
+ });
251
+ });
252
+ };
253
+ export var getUsersByRelations = function getUsersByRelations(context, userId, type, from, to) {
254
+ var action = 'getUsersByRelations';
255
+ var database = context.database;
256
+ var formatUserId = parseId(userId);
257
+ var formatType = parseChar(type, 32);
258
+ var limit = getLimit(from, to);
259
+ console.log('context', context);
260
+ var aqlQry = "FOR u, r IN INBOUND \"".concat("users/".concat(formatUserId), "\" hasRelation\n FILTER r.type == \"", formatType, "\"\n ").concat(limit.aql, "\n RETURN u");
261
+ console.log('getUsersByRelations::aqlQry', aqlQry);
262
+ return useDb(database).query(aqlQry).then(function (cursor) {
263
+ return cursor.all();
264
+ }).catch(function (error) {
265
+ return logError({
266
+ action: action,
267
+ category: eventCategory,
268
+ label: 'db_error'
269
+ }, error, context).then(function () {
270
+ return null;
271
+ });
272
+ });
273
+ };
274
+ export var getRelationsByUser = function getRelationsByUser(context, userId) {
275
+ var action = 'getRelationsByUser';
276
+ var database = context.database,
277
+ sessionId = context.userId;
278
+ var formatUserId = parseId(userId);
279
+ var aqlQry = aql(_templateObject6(), "users/".concat(formatUserId), "users/".concat(sessionId));
280
+ return useDb(database).query(aqlQry).then(function (cursor) {
281
+ return cursor.all();
282
+ }).catch(function (error) {
283
+ return logError({
284
+ action: action,
285
+ category: eventCategory,
286
+ label: 'db_error'
287
+ }, error, context).then(function () {
288
+ return null;
289
+ });
290
+ });
291
+ };
292
+ export var getDisplayName = function getDisplayName() {
293
+ var user = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
294
+ var first = user.first,
295
+ last = user.last,
296
+ _user$name = user.name,
297
+ name = _user$name === void 0 ? '' : _user$name,
298
+ _user$username = user.username,
299
+ username = _user$username === void 0 ? '' : _user$username;
300
+ var fullname = [first, last].join(' ').trim();
301
+
302
+ if (!isEmpty(name)) {
303
+ return name;
304
+ } else if (fullname !== '') {
305
+ return fullname;
306
+ } else if (!isEmpty(username)) {
307
+ return username;
308
+ }
309
+
310
+ return 'Unknown';
311
+ };
312
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL3VzZXJzLnRzIl0sIm5hbWVzIjpbImNyZWF0ZUhhc2giLCJwYXJzZUNoYXIiLCJwYXJzZUVtYWlsIiwicGFyc2VJZCIsInBhcnNlVXNlcm5hbWUiLCJwYXJzZVZhckNoYXIiLCJhcWwiLCJpc0VtcHR5Iiwic3RyaXBlIiwiZ2V0TGltaXQiLCJsb2dFcnJvciIsImxvZ0V4Y2VwdGlvbiIsInVzZURiIiwiZXZlbnRDYXRlZ29yeSIsImFkZFVzZXIiLCJjb250ZXh0IiwidXNlciIsImRhdGFiYXNlIiwiZW1haWwiLCJwaG9uZSIsInN1YiIsInVzZXJuYW1lIiwiaW5zZXJ0IiwiX2tleSIsImFkZGVkIiwiRGF0ZSIsIm5vdyIsInVuZGVmaW5lZCIsIm1vZGlmaWVkIiwiYXFsUXJ5IiwicXVlcnkiLCJ0aGVuIiwiY3Vyc29yIiwibmV4dCIsImRlbGV0ZVVzZXIiLCJ1c2VySWQiLCJhY3Rpb24iLCJzZXNzaW9uSWQiLCJzZXNzaW9uVHlwZSIsInVzZXJUeXBlIiwiaXNBZG1pbiIsImNhdGVnb3J5IiwibGFiZWwiLCJ2YWx1ZSIsImN1c3RvbWVycyIsImRlbCIsInN0cmlwZUN1c3RvbWVySWQiLCJhY2NvdW50cyIsInN0cmlwZUFjY291bnRJZCIsImNhdGNoIiwiZXJyb3IiLCJkZWFjdGl2YXRlVXNlciIsInVwZGF0ZWQiLCJnZXRVc2VyIiwiZm9ybWF0VXNlcklkIiwiZ2V0VXNlckxpc3QiLCJmcm9tIiwidG8iLCJsaW1pdCIsImFsbCIsImFkZFVzZXJSZWxhdGlvbiIsImZvcm1hdFZhbHVlIiwiZGIiLCJyZWxhdGlvbiIsImVkZ2VJZCIsImVkZ2UiLCJlZGdlQ29sbGVjdGlvbiIsInNhdmUiLCJkZWxldGVVc2VyUmVsYXRpb24iLCJnZXRVc2Vyc0J5UmVsYXRpb25zIiwidHlwZSIsImZvcm1hdFR5cGUiLCJjb25zb2xlIiwibG9nIiwiZ2V0UmVsYXRpb25zQnlVc2VyIiwiZ2V0RGlzcGxheU5hbWUiLCJmaXJzdCIsImxhc3QiLCJuYW1l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QUQsQ0FBWCxFQUF1QjtBQUM1QixXQUFPQSxRQUFQO0FBQ0Q7O0FBRUQsU0FBTyxTQUFQO0FBQ0QsQ0FiTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQ2hhciwgcGFyc2VFbWFpbCwgcGFyc2VJZCwgcGFyc2VVc2VybmFtZSwgcGFyc2VWYXJDaGFyfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWwsIERhdGFiYXNlLCBFZGdlQ29sbGVjdGlvbn0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvbGliL2Nqcy9hcWwtcXVlcnknO1xuaW1wb3J0IHtBcnJheUN1cnNvcn0gZnJvbSAnYXJhbmdvanMvbGliL2Nqcy9jdXJzb3InO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoL2lzRW1wdHknO1xuaW1wb3J0ICogYXMgc3RyaXBlIGZyb20gJ3N0cmlwZSc7XG5cbmltcG9ydCB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aCc7XG5pbXBvcnQge1VzZXJSZWxhdGlvblR5cGUsIFVzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycyc7XG5pbXBvcnQge2dldExpbWl0LCBsb2dFcnJvciwgbG9nRXhjZXB0aW9uLCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAndXNlcnMnO1xuXG5leHBvcnQgY29uc3QgYWRkVXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtlbWFpbCwgcGhvbmUsIHN1YiwgdXNlcm5hbWV9ID0gdXNlcjtcblxuICAvLyBBZGQgbmV3IHVzZXIgcHJvcGVydGllc1xuICBjb25zdCBpbnNlcnQ6IFVzZXJUeXBlID0ge1xuICAgIF9rZXk6IGNyZWF0ZUhhc2goc3ViLCBudWxsKSxcbiAgICBhZGRlZDogRGF0ZS5ub3coKSxcbiAgICBlbWFpbDogZW1haWwgIT09IHVuZGVmaW5lZCA/IHBhcnNlRW1haWwoZW1haWwpIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiBEYXRlLm5vdygpLFxuICAgIHBob25lOiBwaG9uZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VWYXJDaGFyKHBob25lLCAxNSkgOiB1bmRlZmluZWQsXG4gICAgc3ViOiBwYXJzZVZhckNoYXIoc3ViLCAzMiksXG4gICAgdXNlcm5hbWU6IHBhcnNlVXNlcm5hbWUodXNlcm5hbWUpXG4gIH07XG5cbiAgLy8gQWRkIG5ldyB1c2VyIGluIEFyYW5nb0RCXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiB1c2VycyBSRVRVUk4gTkVXYDtcbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWQsIHVzZXJUeXBlOiBzZXNzaW9uVHlwZX0gPSBjb250ZXh0O1xuICBjb25zdCBpc0FkbWluOiBib29sZWFuID0gc2Vzc2lvblR5cGUgPiAyO1xuXG4gIGlmKCFpc0FkbWluICYmIChzZXNzaW9uSWQgIT09IHVzZXJJZCkpIHtcbiAgICBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ3VuYXV0aG9yaXplZCcsXG4gICAgICB2YWx1ZTogJ2ludmFsaWRfc2Vzc2lvbidcbiAgICB9LCBjb250ZXh0KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHUgSU4gdXNlcnNcbiAgICAgIEZJTFRFUiB1Ll9rZXkgPT0gJHt1c2VySWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRU1PVkUgdSBJTiB1c2Vyc1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXI6IFVzZXJUeXBlID0ge30pID0+IHN0cmlwZS5jdXN0b21lcnMuZGVsKHVzZXIuc3RyaXBlQ3VzdG9tZXJJZClcbiAgICAgIC50aGVuKCgpID0+IHN0cmlwZS5hY2NvdW50cy5kZWwodXNlci5zdHJpcGVBY2NvdW50SWQpKVxuICAgICAgLnRoZW4oKCkgPT4gdXNlcikpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYWN0aXZhdGVVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGUnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkLCB1c2VyVHlwZTogc2Vzc2lvblR5cGV9ID0gY29udGV4dDtcbiAgY29uc3QgaXNBZG1pbjogYm9vbGVhbiA9IHNlc3Npb25UeXBlID4gMjtcblxuICBpZighaXNBZG1pbiAmJiAoc2Vzc2lvbklkICE9PSB1c2VySWQpKSB7XG4gICAgbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICd1bmF1dGhvcml6ZWQnLFxuICAgICAgdmFsdWU6ICdpbnZhbGlkX3Nlc3Npb24nXG4gICAgfSwgY29udGV4dCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB1cGRhdGVkOiBVc2VyVHlwZSA9IHtcbiAgICB1c2VyVHlwZTogMFxuICB9O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3VzZXJJZH0gV0lUSCAke3VwZGF0ZWR9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcklkKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRJdGVtJztcbiAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSIHUuX2tleSA9PSAke2Zvcm1hdFVzZXJJZH1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHVgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyID0ge30pID0+IHVzZXIpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiB7fSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJMaXN0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGZyb206IG51bWJlciA9IDAsIHRvOiBudW1iZXIgPSAxNSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBsaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcblxuICAvLyBHZXQgZGF0YSBmcm9tIGRhdGFiYXNlXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiB1IElOIHVzZXJzXG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCB1LnVzZXJuYW1lXG4gICAgUkVUVVJOIHVgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBbXSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXJSZWxhdGlvbiA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VySWQsIHZhbHVlKTogUHJvbWlzZTxVc2VyUmVsYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFJlbGF0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRVc2VySWQ6IHN0cmluZyA9IHBhcnNlSWQodXNlcklkKTtcbiAgY29uc3QgZm9ybWF0VmFsdWU6IHN0cmluZyA9IHBhcnNlQ2hhcih2YWx1ZSwgMzIpO1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZSk7XG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgciBJTiBoYXNSZWxhdGlvblxuICAgIEZJTFRFUiByLnZhbHVlID09ICR7Zm9ybWF0VmFsdWV9ICYmIHIuX2Zyb20gPT0gJHtzZXNzaW9uSWR9ICYmIHIuX3RvID09ICR7Zm9ybWF0VXNlcklkfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gcmA7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocmVsYXRpb246IFVzZXJSZWxhdGlvblR5cGUpID0+IHtcbiAgICAgIC8vIElmIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIHVzZXJzIHdpdGggdGhlIHZhbHVlIGV4aXN0cywganVzdCByZXR1cm5cbiAgICAgIGlmKHJlbGF0aW9uKSB7XG4gICAgICAgIHJldHVybiByZWxhdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgdGhlIG5ldyByZWxhdGlvbnNoaXBcbiAgICAgIGNvbnN0IGVkZ2VJZCA9IGNyZWF0ZUhhc2goYHJlbGF0aW9uLSR7c2Vzc2lvbklkfS0ke2Zvcm1hdFVzZXJJZH0tJHtmb3JtYXRWYWx1ZX1gKTtcbiAgICAgIGNvbnN0IGVkZ2UgPSB7XG4gICAgICAgIF9rZXk6IGVkZ2VJZCxcbiAgICAgICAgYWRkZWQ6IERhdGUubm93KCksXG4gICAgICAgIHZhbHVlOiBmb3JtYXRWYWx1ZVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGVkZ2VDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IGRiLmVkZ2VDb2xsZWN0aW9uKCdoYXNSZWxhdGlvbicpIGFzIGFueTtcblxuICAgICAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwgYHVzZXJzLyR7c2Vzc2lvbklkfWAsIGB1c2Vycy8ke2Zvcm1hdFVzZXJJZH1gKVxuICAgICAgICAudGhlbigoKSA9PiBlZGdlQ29sbGVjdGlvbi5lZGdlKGVkZ2VJZCkpXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVXNlclJlbGF0aW9uID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXJJZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTxVc2VyUmVsYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFJlbGF0aW9uc0J5VXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IGZvcm1hdFZhbHVlOiBzdHJpbmcgPSBwYXJzZUNoYXIodmFsdWUsIDMyKTtcbiAgY29uc3QgYXFsUXJ5ID0gYEZPUiB1LCByIElOIElOQk9VTkQgXCIke2B1c2Vycy8ke2Zvcm1hdFVzZXJJZH1gfVwiIGhhc1JlbGF0aW9uXG4gICAgRklMVEVSIHIuX2Zyb20gPT0gXCIke2B1c2Vycy8ke3Nlc3Npb25JZH1gfVwiICYmIHIudmFsdWUgPT0gXCIke2Zvcm1hdFZhbHVlfVwiXG4gICAgUkVNT1ZFIHIgSU4gaGFzUmVsYXRpb25cbiAgICBSRVRVUk4gT0xEYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocmVsYXRpb24gPSB7fSkgPT4gcmVsYXRpb24pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeVJlbGF0aW9ucyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHR5cGU6IHN0cmluZyxcbiAgZnJvbTogbnVtYmVyLFxuICB0bzogbnVtYmVyXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0VXNlcnNCeVJlbGF0aW9ucyc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRVc2VySWQ6IHN0cmluZyA9IHBhcnNlSWQodXNlcklkKTtcbiAgY29uc3QgZm9ybWF0VHlwZTogc3RyaW5nID0gcGFyc2VDaGFyKHR5cGUsIDMyKTtcbiAgY29uc3QgbGltaXQgPSBnZXRMaW1pdChmcm9tLCB0byk7XG4gIGNvbnNvbGUubG9nKCdjb250ZXh0JywgY29udGV4dCk7XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiB1LCByIElOIElOQk9VTkQgXCIke2B1c2Vycy8ke2Zvcm1hdFVzZXJJZH1gfVwiIGhhc1JlbGF0aW9uXG4gICAgRklMVEVSIHIudHlwZSA9PSBcIiR7Zm9ybWF0VHlwZX1cIlxuICAgICR7bGltaXQuYXFsfVxuICAgIFJFVFVSTiB1YDtcblxuICBjb25zb2xlLmxvZygnZ2V0VXNlcnNCeVJlbGF0aW9uczo6YXFsUXJ5JywgYXFsUXJ5KTtcbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGlvbnNCeVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJSZWxhdGlvblR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRSZWxhdGlvbnNCeVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB1LCByIElOIElOQk9VTkQgJHtgdXNlcnMvJHtmb3JtYXRVc2VySWR9YH0gaGFzUmVsYXRpb25cbiAgICAgIEZJTFRFUiByLl9mcm9tID09ICR7YHVzZXJzLyR7c2Vzc2lvbklkfWB9XG4gICAgICBSRVRVUk4gcmA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREaXNwbGF5TmFtZSA9ICh1c2VyOiBVc2VyVHlwZSA9IHt9KTogc3RyaW5nID0+IHtcbiAgY29uc3Qge2ZpcnN0LCBsYXN0LCBuYW1lID0gJycsIHVzZXJuYW1lID0gJyd9ID0gdXNlcjtcbiAgY29uc3QgZnVsbG5hbWU6IHN0cmluZyA9IChbZmlyc3QsIGxhc3RdKS5qb2luKCcgJykudHJpbSgpO1xuXG4gIGlmKCFpc0VtcHR5KG5hbWUpKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH0gZWxzZSBpZihmdWxsbmFtZSAhPT0gJycpIHtcbiAgICByZXR1cm4gZnVsbG5hbWU7XG4gIH0gZWxzZSBpZighaXNFbXB0eSh1c2VybmFtZSkpIHtcbiAgICByZXR1cm4gdXNlcm5hbWU7XG4gIH1cblxuICByZXR1cm4gJ1Vua25vd24nO1xufTtcbiJdfQ==
package/lib/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './data';
2
+ export * from './utils';
3
+ export * from './types';
package/lib/index.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */
5
+ export * from './data';
6
+ export * from './utils';
7
+ export * from './types';
8
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLGNBQWMsUUFBZDtBQUNBLGNBQWMsU0FBZDtBQUNBLGNBQWMsU0FBZCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5leHBvcnQgKiBmcm9tICcuL2RhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
@@ -0,0 +1,44 @@
1
+ import { UserType } from './users';
2
+ export interface TestType {
3
+ }
4
+ export interface AppSessionType {
5
+ readonly active?: boolean;
6
+ readonly added?: number;
7
+ readonly appId?: string;
8
+ readonly exp?: number;
9
+ readonly modified?: number;
10
+ readonly name?: string;
11
+ }
12
+ export interface AppType {
13
+ readonly _id?: string;
14
+ readonly _key?: string;
15
+ readonly active?: boolean;
16
+ readonly currency?: string;
17
+ readonly displayName?: string;
18
+ readonly email?: string;
19
+ readonly hasCustomEmail?: boolean;
20
+ readonly iap?: string;
21
+ readonly id?: string;
22
+ readonly key?: string;
23
+ readonly name?: string;
24
+ readonly photo?: string;
25
+ readonly secret?: string;
26
+ readonly supportName?: string;
27
+ readonly url?: string;
28
+ readonly urlFacebook?: string;
29
+ readonly urlTwitter?: string;
30
+ }
31
+ export interface AppStatsType {
32
+ readonly numUsers?: number;
33
+ }
34
+ export interface EmailParamsType {
35
+ readonly type?: string;
36
+ readonly user?: UserType;
37
+ }
38
+ export interface QueryFilter {
39
+ readonly conditional?: string;
40
+ readonly name?: string;
41
+ readonly value?: string;
42
+ }
43
+ export interface AccessTokenType {
44
+ }
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbXX0=
@@ -0,0 +1,17 @@
1
+ export interface RangeType {
2
+ readonly from: number;
3
+ readonly to: number;
4
+ }
5
+ export interface ArangoDBPathObject {
6
+ readonly collection?: string;
7
+ readonly itemObj?: any;
8
+ readonly keys?: string[];
9
+ readonly props?: any;
10
+ readonly ranges?: any;
11
+ readonly routeKey: string;
12
+ }
13
+ export interface ArangoDBLimit {
14
+ readonly aql: string;
15
+ readonly start: number;
16
+ readonly num: number;
17
+ }
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbXX0=
@@ -0,0 +1,9 @@
1
+ export interface ApiContext {
2
+ readonly appId: string;
3
+ readonly database: string;
4
+ readonly email: string;
5
+ readonly ipAddress: string;
6
+ readonly userId: string;
7
+ readonly username: string;
8
+ readonly userType: number;
9
+ }
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbXX0=
@@ -0,0 +1,6 @@
1
+ import { UserType } from './users';
2
+ export interface ConversationType {
3
+ readonly _key?: string;
4
+ readonly id?: string;
5
+ users?: UserType[];
6
+ }
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbXX0=
@@ -0,0 +1,12 @@
1
+ import { AppType } from './apps';
2
+ import { UserType } from './users';
3
+ export interface EmailType {
4
+ readonly app?: AppType;
5
+ readonly html?: string;
6
+ readonly subject?: string;
7
+ readonly subTitle?: string;
8
+ readonly text?: string;
9
+ readonly title?: string;
10
+ readonly user?: UserType;
11
+ readonly vars?: any;
12
+ }
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbXX0=
@@ -0,0 +1,28 @@
1
+ /// <reference types="node" />
2
+ export interface FileType {
3
+ readonly _key?: string;
4
+ readonly added?: number;
5
+ readonly appId?: string;
6
+ readonly base64?: string;
7
+ readonly buffer?: Buffer;
8
+ readonly description?: string;
9
+ fileSize?: number;
10
+ readonly fileType?: string;
11
+ readonly id?: string;
12
+ readonly itemId?: string;
13
+ readonly itemType?: string;
14
+ readonly modified?: number;
15
+ readonly name?: string;
16
+ readonly url?: string;
17
+ readonly userId?: string;
18
+ }
19
+ export interface FileDecodedType {
20
+ data?: Buffer;
21
+ type?: string;
22
+ }
23
+ export interface FileEdgeType {
24
+ readonly appId?: string;
25
+ readonly imgId?: string;
26
+ readonly itemId?: string;
27
+ readonly itemType?: string;
28
+ }
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbXX0=
@@ -0,0 +1,27 @@
1
+ export interface GoogleMapsType {
2
+ results: GoogleMapsResultType[];
3
+ status: string;
4
+ }
5
+ export interface GoogleMapsAddressType {
6
+ long_name: string;
7
+ short_name: string;
8
+ types: string[];
9
+ }
10
+ export interface GoogleTimezoneType {
11
+ dstOffset: string;
12
+ rawOffset: string;
13
+ status: string;
14
+ timeZoneId: string;
15
+ timeZoneName: string;
16
+ }
17
+ export interface GoogleLatLngType {
18
+ lat: number;
19
+ lng: number;
20
+ }
21
+ export interface GoogleMapsLocationType {
22
+ location: GoogleLatLngType;
23
+ }
24
+ export interface GoogleMapsResultType {
25
+ address_components: GoogleMapsAddressType[];
26
+ geometry: GoogleMapsLocationType;
27
+ }
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbXX0=
@@ -0,0 +1,22 @@
1
+ export interface GroupType {
2
+ readonly _key?: string;
3
+ readonly added?: number;
4
+ readonly appId?: string;
5
+ readonly description?: string;
6
+ readonly groupId?: string;
7
+ readonly id?: string;
8
+ readonly modified?: number;
9
+ readonly name?: string;
10
+ readonly privacy?: string;
11
+ readonly type?: string;
12
+ }
13
+ export interface GroupUserType {
14
+ readonly groupId?: string;
15
+ readonly isValid?: boolean;
16
+ readonly userId?: string;
17
+ }
18
+ export interface GroupEdgeType {
19
+ readonly groupId?: string;
20
+ readonly isValid?: boolean;
21
+ readonly userId?: string;
22
+ }
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbXX0=
@@ -0,0 +1,25 @@
1
+ import { FileType } from './files';
2
+ export interface ImageType extends FileType {
3
+ color?: string;
4
+ readonly height?: number;
5
+ readonly id?: string;
6
+ readonly model?: string;
7
+ readonly make?: string;
8
+ readonly taken?: number;
9
+ readonly width?: number;
10
+ }
11
+ export interface ImageIdentifyType {
12
+ readonly datetimeoriginal?: number;
13
+ readonly model?: string;
14
+ readonly make?: string;
15
+ }
16
+ export declare type ImageUrlTypes = 'app' | 'events' | 'groups' | 'users';
17
+ export interface ImageUrlData {
18
+ readonly appId?: string;
19
+ readonly directory?: string;
20
+ readonly imgId?: string;
21
+ readonly imgType?: string;
22
+ readonly isThumb?: boolean;
23
+ readonly type?: ImageUrlTypes;
24
+ readonly typeId?: string;
25
+ }
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbXX0=
@@ -0,0 +1,17 @@
1
+ export * from './apps';
2
+ export * from './arangodb';
3
+ export * from './auth';
4
+ export * from './conversations';
5
+ export * from './email';
6
+ export * from './files';
7
+ export * from './google';
8
+ export * from './groups';
9
+ export * from './images';
10
+ export * from './locations';
11
+ export * from './messages';
12
+ export * from './notifications';
13
+ export * from './payments';
14
+ export * from './posts';
15
+ export * from './reactions';
16
+ export * from './tags';
17
+ export * from './users';
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */
5
+ export * from './apps';
6
+ export * from './arangodb';
7
+ export * from './auth';
8
+ export * from './conversations';
9
+ export * from './email';
10
+ export * from './files';
11
+ export * from './google';
12
+ export * from './groups';
13
+ export * from './images';
14
+ export * from './locations';
15
+ export * from './messages';
16
+ export * from './notifications';
17
+ export * from './payments';
18
+ export * from './posts';
19
+ export * from './reactions';
20
+ export * from './tags';
21
+ export * from './users';
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLGNBQWMsUUFBZDtBQUNBLGNBQWMsWUFBZDtBQUNBLGNBQWMsUUFBZDtBQUNBLGNBQWMsaUJBQWQ7QUFDQSxjQUFjLFNBQWQ7QUFDQSxjQUFjLFNBQWQ7QUFDQSxjQUFjLFVBQWQ7QUFDQSxjQUFjLFVBQWQ7QUFDQSxjQUFjLFVBQWQ7QUFDQSxjQUFjLGFBQWQ7QUFDQSxjQUFjLFlBQWQ7QUFDQSxjQUFjLGlCQUFkO0FBQ0EsY0FBYyxZQUFkO0FBQ0EsY0FBYyxTQUFkO0FBQ0EsY0FBYyxhQUFkO0FBQ0EsY0FBYyxRQUFkO0FBQ0EsY0FBYyxTQUFkIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vYXBwcyc7XG5leHBvcnQgKiBmcm9tICcuL2FyYW5nb2RiJztcbmV4cG9ydCAqIGZyb20gJy4vYXV0aCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnNhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9lbWFpbCc7XG5leHBvcnQgKiBmcm9tICcuL2ZpbGVzJztcbmV4cG9ydCAqIGZyb20gJy4vZ29vZ2xlJztcbmV4cG9ydCAqIGZyb20gJy4vZ3JvdXBzJztcbmV4cG9ydCAqIGZyb20gJy4vaW1hZ2VzJztcbmV4cG9ydCAqIGZyb20gJy4vbG9jYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3RpZmljYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vcGF5bWVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9wb3N0cyc7XG5leHBvcnQgKiBmcm9tICcuL3JlYWN0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL3RhZ3MnO1xuZXhwb3J0ICogZnJvbSAnLi91c2Vycyc7XG4iXX0=