larvituser 0.18.1 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -99
- package/dist/dataWriter.d.ts +27 -0
- package/dist/dataWriter.d.ts.map +1 -0
- package/dist/dataWriter.js +205 -0
- package/dist/dataWriter.js.map +1 -0
- package/dist/helpers.d.ts +19 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +59 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +156 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +418 -0
- package/dist/index.js.map +1 -0
- package/dist/userBase.d.ts +53 -0
- package/dist/userBase.d.ts.map +1 -0
- package/dist/userBase.js +120 -0
- package/dist/userBase.js.map +1 -0
- package/dist/users.d.ts +43 -0
- package/dist/users.d.ts.map +1 -0
- package/dist/users.js +186 -0
- package/dist/users.js.map +1 -0
- package/package.json +27 -12
- package/.eslintignore +0 -1
- package/.eslintrc +0 -35
- package/.travis.yml +0 -22
- package/config/db_travis.json +0 -9
- package/controllers/adminUsers/edit.js +0 -180
- package/controllers/adminUsers/list.js +0 -47
- package/dataWriter.js +0 -715
- package/dbmigration/1.sql +0 -33
- package/dbmigration/2.js +0 -63
- package/helpers.js +0 -110
- package/index.js +0 -955
- package/public/tmpl/adminUsers/edit.tmpl +0 -71
- package/public/tmpl/adminUsers/list.tmpl +0 -22
- package/renovate.json +0 -9
- package/test/00test.js +0 -850
- package/test/98lint.js +0 -9
- package/users.js +0 -281
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":";;;AAAA,6CAAsD;AAGtD,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAQhD,SAAgB,QAAQ,CAAI,KAAmB;IAC9C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC;AAFD,4BAEC;AAED,MAAa,OAAO;IAMnB,YAAY,OAAuB;QAClC,IAAI,CAAC,OAAO,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAEjF,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,iBAAG,CAAC,MAAM,CAAC,CAAC;QAE7C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QAEvB,IAAI,CAAC,MAAM,GAAG,IAAI,mBAAK,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE/C,CAAC;IAED,YAAY,CAAI,KAAkB,EAAE,SAAiB,EAAE,MAAc;QACpE,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;YAC7D,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7C,MAAM,GAAG,CAAC;SACV;QAED,4DAA4D;QAC5D,OAAO,KAAU,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY;QAC9B,MAAM,SAAS,GAAG,GAAG,YAAY,mBAAmB,CAAC;QACrD,MAAM,GAAG,GAAG,kDAAkD,CAAC;QAE/D,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,eAAe,EAAE;YACrB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,SAAS,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,MAAM,GAAG,CAAC;SACV;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;QAE7D,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE/B,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB;QACnC,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,kDAAkD,CAAC;QAE/D,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEzB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAEpD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACjB,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAE9C,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;SAC1C;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;CACD;AAlED,0BAkEC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { Helpers } from './helpers';
|
|
2
|
+
import { LogInstance } from 'larvitutils';
|
|
3
|
+
import { UserBase } from './userBase';
|
|
4
|
+
import { Users, UsersOptions } from './users';
|
|
5
|
+
export { Users } from './users';
|
|
6
|
+
export { UserBase } from './userBase';
|
|
7
|
+
export declare type UserLibOptions = {
|
|
8
|
+
db: any;
|
|
9
|
+
log?: LogInstance;
|
|
10
|
+
};
|
|
11
|
+
export declare class UserLib {
|
|
12
|
+
helpers: Helpers;
|
|
13
|
+
private dataWriter;
|
|
14
|
+
private log;
|
|
15
|
+
private lUtils;
|
|
16
|
+
private options;
|
|
17
|
+
constructor(options: UserLibOptions);
|
|
18
|
+
runDbMigrations(scriptPath?: string): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Add a single user field to database
|
|
21
|
+
*
|
|
22
|
+
* @param {string} userUuid -
|
|
23
|
+
* @param {string} fieldName -
|
|
24
|
+
* @param {string} fieldValue -
|
|
25
|
+
* @returns {Promise<void>} -
|
|
26
|
+
*/
|
|
27
|
+
addUserDataField(userUuid: string, fieldName: string, fieldValue: string | string[]): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Add user fields
|
|
30
|
+
*
|
|
31
|
+
* @param {string} userUuid -
|
|
32
|
+
* @param {object} fields - field name as key, field values as array to that key - ex: {'role': ['admin','user']}
|
|
33
|
+
* @returns {Promise<void>} -
|
|
34
|
+
*/
|
|
35
|
+
addUserDataFields(userUuid: string, fields: Record<string, string | string[]>): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Checks a password for validity
|
|
38
|
+
* @param {string} password - plain text password
|
|
39
|
+
* @param {string} hash - hash to check password against
|
|
40
|
+
* @param {Promise<boolean>} - True if password matches
|
|
41
|
+
*/
|
|
42
|
+
checkPassword(password: string, hash: string): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Creates a new user (and adds to it to db)
|
|
45
|
+
*
|
|
46
|
+
* @param {string} username -
|
|
47
|
+
* @param {string} password (plain text) or false for no password (user will not be able to login at all)
|
|
48
|
+
* @param {object} userFields - key, value pairs, where value can be an array of values
|
|
49
|
+
* @param {string} uuid - if not supplied a random will be generated
|
|
50
|
+
* @returns {Promise<UserBase>} - The newly created user
|
|
51
|
+
*/
|
|
52
|
+
create(username: string, password: string, userFields?: Record<string, string | string[]>, uuid?: string): Promise<UserBase>;
|
|
53
|
+
/**
|
|
54
|
+
* Checks if a unsername is available
|
|
55
|
+
*
|
|
56
|
+
* @param {string} username -
|
|
57
|
+
* @returns {Promise<boolean>} -
|
|
58
|
+
*/
|
|
59
|
+
usernameAvailable(username: string): Promise<boolean>;
|
|
60
|
+
/**
|
|
61
|
+
* Create a user object from a field
|
|
62
|
+
* IMPORTANT! Only fetches first matching user!
|
|
63
|
+
*
|
|
64
|
+
* @param {string} fieldName -
|
|
65
|
+
* @param {string} fieldValue -
|
|
66
|
+
* @returns {Promise<UserBase | boolean>} - "user" being a new user object or boolean false on failed search
|
|
67
|
+
*/
|
|
68
|
+
fromField(fieldName: string, fieldValue: string): Promise<UserBase | boolean>;
|
|
69
|
+
/**
|
|
70
|
+
* Create a user object from fields
|
|
71
|
+
* IMPORTANT! Only fetches first matching user that matches all fields!
|
|
72
|
+
*
|
|
73
|
+
* @param {object} fields - {'fieldName': 'fieldValue', 'fieldName2': 'fieldValue2'}
|
|
74
|
+
* @returns {Promise<UserBase | false>} - "user" being a new user object or boolean false on failed search
|
|
75
|
+
*/
|
|
76
|
+
fromFields(fields: Record<string, string>): Promise<UserBase | boolean>;
|
|
77
|
+
/**
|
|
78
|
+
* Create a user object from username and password
|
|
79
|
+
*
|
|
80
|
+
* @param {string} username -
|
|
81
|
+
* @param {string} password -
|
|
82
|
+
* @returns {Promise<UserBase | boolean>} - "user" being a new user object or boolean false on failed login
|
|
83
|
+
*/
|
|
84
|
+
fromUserAndPass(username: string, password: string): Promise<UserBase | boolean>;
|
|
85
|
+
/**
|
|
86
|
+
* Create a user object from username
|
|
87
|
+
*
|
|
88
|
+
* @param {string} username -
|
|
89
|
+
* @returns {Promise<UserBase | boolean>} - "user" being a new user object
|
|
90
|
+
*/
|
|
91
|
+
fromUsername(username: string): Promise<UserBase | boolean>;
|
|
92
|
+
/**
|
|
93
|
+
* Instanciate user object from user id
|
|
94
|
+
*
|
|
95
|
+
* @param {number} userUuid -
|
|
96
|
+
* @returns {Promise<UserBase>} userObj will be false if no user is found
|
|
97
|
+
*/
|
|
98
|
+
fromUuid(userUuid: string): Promise<UserBase | false>;
|
|
99
|
+
/**
|
|
100
|
+
* Get field data for a user
|
|
101
|
+
*
|
|
102
|
+
* @param {string} userUuid -
|
|
103
|
+
* @param {string} fieldName -
|
|
104
|
+
* @returns {Promise<string[]>} data is always an array of data (or empty array)
|
|
105
|
+
*/
|
|
106
|
+
getFieldData(userUuid: string, fieldName: string): Promise<string[]>;
|
|
107
|
+
/**
|
|
108
|
+
* Hashes a new password
|
|
109
|
+
*
|
|
110
|
+
* @param {string} password -
|
|
111
|
+
* @returns {Promise<string>} Hashed password
|
|
112
|
+
*/
|
|
113
|
+
hashPassword(password: string): Promise<string>;
|
|
114
|
+
/**
|
|
115
|
+
* Replace all fields
|
|
116
|
+
* IMPORTANT!!! Will clear all data not given in the fields parameter
|
|
117
|
+
*
|
|
118
|
+
* @param {string} userUuid -
|
|
119
|
+
* @param {object} fields - field name as key, field values as array to that key - ex: {'role': ['admin','user']}
|
|
120
|
+
* @returns {Promise<void>} -
|
|
121
|
+
*/
|
|
122
|
+
replaceUserFields(userUuid: string, fields: Record<string, string | string[]>): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Remove a user
|
|
125
|
+
*
|
|
126
|
+
* @param {string} userUuid -
|
|
127
|
+
* @returns {Promise<void>} -
|
|
128
|
+
*/
|
|
129
|
+
rmUser(userUuid: string): Promise<void>;
|
|
130
|
+
/**
|
|
131
|
+
* Remove a user field
|
|
132
|
+
*
|
|
133
|
+
* @param {string} userUuid -
|
|
134
|
+
* @param {string} fieldName -
|
|
135
|
+
* @returns {Promise<void>} -
|
|
136
|
+
*/
|
|
137
|
+
rmUserField(userUuid: string, fieldName: string): Promise<void>;
|
|
138
|
+
/**
|
|
139
|
+
* Set password for a user
|
|
140
|
+
*
|
|
141
|
+
* @param {string} userUuid -
|
|
142
|
+
* @param {string} newPassword (plain text) or false for no valid password (user will not be able to login at all)
|
|
143
|
+
* @returns {Promise<void>} -
|
|
144
|
+
*/
|
|
145
|
+
setPassword(userUuid: string, newPassword: string | boolean): Promise<void>;
|
|
146
|
+
/**
|
|
147
|
+
* Set the username for a user
|
|
148
|
+
*
|
|
149
|
+
* @param {string} userUuid -
|
|
150
|
+
* @param {string} newUsername -
|
|
151
|
+
* @returns {Promise<void>} -
|
|
152
|
+
*/
|
|
153
|
+
setUsername(userUuid: string, newUsername: string): Promise<void>;
|
|
154
|
+
getUsers(options?: Omit<UsersOptions, 'log' | 'db'>): ReturnType<Users['get']>;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAO,WAAW,EAAS,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAmB,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM9C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,oBAAY,cAAc,GAAG;IAC5B,EAAE,EAAE,GAAG,CAAC;IACR,GAAG,CAAC,EAAE,WAAW,CAAC;CAClB,CAAA;AAED,qBAAa,OAAO;IACZ,OAAO,EAAE,OAAO,CAAC;IAExB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,OAAO,CAA8B;gBAEjC,OAAO,EAAE,cAAc;IAiB7B,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD;;;;;;;OAOG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GACtF,OAAO,CAAC,IAAI,CAAC;IAQhB;;;;;;OAMG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GAChF,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;;OAKG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrE;;;;;;;;OAQG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAC3G,OAAO,CAAC,QAAQ,CAAC;IA8DpB;;;;;OAKG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ3D;;;;;;;OAOG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;IAMnF;;;;;;OAMG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;IAuB7E;;;;;;OAMG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;IA2BtF;;;;;OAKG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;IAsBjE;;;;;OAKG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC;IAkD3D;;;;;;OAMG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoB1E;;;;;OAKG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQrD;;;;;;;OAOG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAInG;;;;;OAKG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C;;;;;;OAMG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE;;;;;;OAMG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjF;;;;;;OAMG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBjE,QAAQ,CAAC,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,IAAI,CAAM,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;CASxF"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.UserLib = exports.UserBase = exports.Users = void 0;
|
|
26
|
+
const dataWriter_1 = require("./dataWriter");
|
|
27
|
+
const helpers_1 = require("./helpers");
|
|
28
|
+
const larvitutils_1 = require("larvitutils");
|
|
29
|
+
const userBase_1 = require("./userBase");
|
|
30
|
+
const users_1 = require("./users");
|
|
31
|
+
const uuidLib = __importStar(require("uuid"));
|
|
32
|
+
const bcryptjs_1 = __importDefault(require("bcryptjs"));
|
|
33
|
+
const topLogPrefix = 'larvituser: index.ts:';
|
|
34
|
+
var users_2 = require("./users");
|
|
35
|
+
Object.defineProperty(exports, "Users", { enumerable: true, get: function () { return users_2.Users; } });
|
|
36
|
+
var userBase_2 = require("./userBase");
|
|
37
|
+
Object.defineProperty(exports, "UserBase", { enumerable: true, get: function () { return userBase_2.UserBase; } });
|
|
38
|
+
class UserLib {
|
|
39
|
+
constructor(options) {
|
|
40
|
+
if (!options.db)
|
|
41
|
+
throw new Error('Required option db is missing');
|
|
42
|
+
this.log = options.log ?? new larvitutils_1.Log();
|
|
43
|
+
this.options = options;
|
|
44
|
+
this.lUtils = new larvitutils_1.Utils({ log: this.log });
|
|
45
|
+
this.dataWriter = new dataWriter_1.DataWriter({
|
|
46
|
+
log: this.log,
|
|
47
|
+
db: options.db,
|
|
48
|
+
});
|
|
49
|
+
this.helpers = new helpers_1.Helpers({
|
|
50
|
+
dataWriter: this.dataWriter,
|
|
51
|
+
log: this.log,
|
|
52
|
+
db: options.db,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async runDbMigrations(scriptPath) {
|
|
56
|
+
await this.dataWriter.runDbMigrations(scriptPath);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Add a single user field to database
|
|
60
|
+
*
|
|
61
|
+
* @param {string} userUuid -
|
|
62
|
+
* @param {string} fieldName -
|
|
63
|
+
* @param {string} fieldValue -
|
|
64
|
+
* @returns {Promise<void>} -
|
|
65
|
+
*/
|
|
66
|
+
async addUserDataField(userUuid, fieldName, fieldValue) {
|
|
67
|
+
const fields = {
|
|
68
|
+
[fieldName]: fieldValue,
|
|
69
|
+
};
|
|
70
|
+
await this.addUserDataFields(userUuid, fields);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Add user fields
|
|
74
|
+
*
|
|
75
|
+
* @param {string} userUuid -
|
|
76
|
+
* @param {object} fields - field name as key, field values as array to that key - ex: {'role': ['admin','user']}
|
|
77
|
+
* @returns {Promise<void>} -
|
|
78
|
+
*/
|
|
79
|
+
async addUserDataFields(userUuid, fields) {
|
|
80
|
+
await this.dataWriter.addUserDataFields(userUuid, fields);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Checks a password for validity
|
|
84
|
+
* @param {string} password - plain text password
|
|
85
|
+
* @param {string} hash - hash to check password against
|
|
86
|
+
* @param {Promise<boolean>} - True if password matches
|
|
87
|
+
*/
|
|
88
|
+
async checkPassword(password, hash) {
|
|
89
|
+
password = password.trim();
|
|
90
|
+
return await bcryptjs_1.default.compare(password, hash);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Creates a new user (and adds to it to db)
|
|
94
|
+
*
|
|
95
|
+
* @param {string} username -
|
|
96
|
+
* @param {string} password (plain text) or false for no password (user will not be able to login at all)
|
|
97
|
+
* @param {object} userFields - key, value pairs, where value can be an array of values
|
|
98
|
+
* @param {string} uuid - if not supplied a random will be generated
|
|
99
|
+
* @returns {Promise<UserBase>} - The newly created user
|
|
100
|
+
*/
|
|
101
|
+
async create(username, password, userFields, uuid) {
|
|
102
|
+
const logPrefix = `${topLogPrefix} create() -`;
|
|
103
|
+
userFields ?? (userFields = {});
|
|
104
|
+
uuid ?? (uuid = uuidLib.v1());
|
|
105
|
+
username = username.trim();
|
|
106
|
+
password = password?.trim();
|
|
107
|
+
if (!username.length) {
|
|
108
|
+
const err = new Error('Trying to create user with empty username');
|
|
109
|
+
this.log.warn(`${logPrefix} ${err.message}`);
|
|
110
|
+
throw err;
|
|
111
|
+
}
|
|
112
|
+
// Check for username availability
|
|
113
|
+
const isAvailable = await this.usernameAvailable(username);
|
|
114
|
+
if (isAvailable) {
|
|
115
|
+
this.log.debug(`${logPrefix} Username available: "${username}"`);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
const err = new Error('Trying to create user with taken username: "' + username + '"');
|
|
119
|
+
this.log.info(`${logPrefix} ${err.message}`);
|
|
120
|
+
throw err;
|
|
121
|
+
}
|
|
122
|
+
// Hash Password
|
|
123
|
+
let hashedPassword = '';
|
|
124
|
+
if (!password) {
|
|
125
|
+
this.log.debug(`${logPrefix} Password set to empty string for no-login, username: "${username}"`);
|
|
126
|
+
hashedPassword = '';
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
hashedPassword = await this.hashPassword(password);
|
|
130
|
+
this.log.debug(`${logPrefix} Password hashed, username: "${username}"`);
|
|
131
|
+
}
|
|
132
|
+
// Create all fields
|
|
133
|
+
// TODO: Parallel?
|
|
134
|
+
for (const fieldName of Object.keys(userFields)) {
|
|
135
|
+
await this.helpers.getFieldUuid(fieldName);
|
|
136
|
+
}
|
|
137
|
+
// Write new user
|
|
138
|
+
await this.dataWriter.create({
|
|
139
|
+
uuid,
|
|
140
|
+
username,
|
|
141
|
+
password: hashedPassword,
|
|
142
|
+
fields: userFields,
|
|
143
|
+
});
|
|
144
|
+
// Get new user
|
|
145
|
+
const user = await this.fromUuid(uuid);
|
|
146
|
+
// Non-tivial to test
|
|
147
|
+
/* istanbul ignore if */
|
|
148
|
+
if (typeof user === 'boolean') {
|
|
149
|
+
const err = new Error(`Failed to get newly created user, uuid: ${uuid}`);
|
|
150
|
+
this.log.warn(`${logPrefix} ${err.message}`);
|
|
151
|
+
throw err;
|
|
152
|
+
}
|
|
153
|
+
return user;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Checks if a unsername is available
|
|
157
|
+
*
|
|
158
|
+
* @param {string} username -
|
|
159
|
+
* @returns {Promise<boolean>} -
|
|
160
|
+
*/
|
|
161
|
+
async usernameAvailable(username) {
|
|
162
|
+
username = username.trim();
|
|
163
|
+
const { rows } = await this.options.db.query('SELECT uuid FROM user_users WHERE username = ?', [username]);
|
|
164
|
+
return rows.length === 0;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Create a user object from a field
|
|
168
|
+
* IMPORTANT! Only fetches first matching user!
|
|
169
|
+
*
|
|
170
|
+
* @param {string} fieldName -
|
|
171
|
+
* @param {string} fieldValue -
|
|
172
|
+
* @returns {Promise<UserBase | boolean>} - "user" being a new user object or boolean false on failed search
|
|
173
|
+
*/
|
|
174
|
+
async fromField(fieldName, fieldValue) {
|
|
175
|
+
const user = await this.fromFields({ [fieldName]: fieldValue });
|
|
176
|
+
return user;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Create a user object from fields
|
|
180
|
+
* IMPORTANT! Only fetches first matching user that matches all fields!
|
|
181
|
+
*
|
|
182
|
+
* @param {object} fields - {'fieldName': 'fieldValue', 'fieldName2': 'fieldValue2'}
|
|
183
|
+
* @returns {Promise<UserBase | false>} - "user" being a new user object or boolean false on failed search
|
|
184
|
+
*/
|
|
185
|
+
async fromFields(fields) {
|
|
186
|
+
const dbFields = [];
|
|
187
|
+
let sql = 'SELECT uuid FROM user_users u\nWHERE\n 1 + 1\n';
|
|
188
|
+
for (const fieldName of Object.keys(fields)) {
|
|
189
|
+
sql += ' AND uuid IN (SELECT userUuid FROM user_users_data WHERE data = ? AND fieldUuid = (SELECT uuid FROM user_data_fields WHERE name = ?))\n';
|
|
190
|
+
dbFields.push(fields[fieldName].trim());
|
|
191
|
+
dbFields.push(fieldName.trim());
|
|
192
|
+
}
|
|
193
|
+
sql += 'LIMIT 1';
|
|
194
|
+
const { rows } = await this.options.db.query(sql, dbFields);
|
|
195
|
+
if (rows.length === 0)
|
|
196
|
+
return false;
|
|
197
|
+
const userUuid = this.lUtils.formatUuid(rows[0].uuid);
|
|
198
|
+
if (typeof userUuid === 'boolean')
|
|
199
|
+
return false;
|
|
200
|
+
const user = await this.fromUuid(userUuid);
|
|
201
|
+
return user;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Create a user object from username and password
|
|
205
|
+
*
|
|
206
|
+
* @param {string} username -
|
|
207
|
+
* @param {string} password -
|
|
208
|
+
* @returns {Promise<UserBase | boolean>} - "user" being a new user object or boolean false on failed login
|
|
209
|
+
*/
|
|
210
|
+
async fromUserAndPass(username, password) {
|
|
211
|
+
if (typeof username !== 'string')
|
|
212
|
+
throw new Error('Username must be a string');
|
|
213
|
+
if (typeof password !== 'string')
|
|
214
|
+
throw new Error('Password must be a string');
|
|
215
|
+
username = username.trim();
|
|
216
|
+
if (password)
|
|
217
|
+
password = password.trim();
|
|
218
|
+
const dbFields = [username];
|
|
219
|
+
const sql = 'SELECT uuid, password FROM user_users WHERE username = ?';
|
|
220
|
+
const { rows } = await this.options.db.query(sql, dbFields);
|
|
221
|
+
if (!rows.length)
|
|
222
|
+
return false;
|
|
223
|
+
const hashedPassword = rows[0].password;
|
|
224
|
+
const userUuidBuffer = rows[0].uuid;
|
|
225
|
+
if (!hashedPassword)
|
|
226
|
+
return false;
|
|
227
|
+
const isCorrectPassword = await this.checkPassword(password, hashedPassword);
|
|
228
|
+
if (!isCorrectPassword)
|
|
229
|
+
return false;
|
|
230
|
+
const userUuid = this.lUtils.formatUuid(userUuidBuffer);
|
|
231
|
+
if (typeof userUuid === 'boolean')
|
|
232
|
+
return false;
|
|
233
|
+
const user = await this.fromUuid(userUuid);
|
|
234
|
+
return user;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Create a user object from username
|
|
238
|
+
*
|
|
239
|
+
* @param {string} username -
|
|
240
|
+
* @returns {Promise<UserBase | boolean>} - "user" being a new user object
|
|
241
|
+
*/
|
|
242
|
+
async fromUsername(username) {
|
|
243
|
+
const logPrefix = `${topLogPrefix}fromUsername() -`;
|
|
244
|
+
const dbFields = [];
|
|
245
|
+
const sql = 'SELECT uuid FROM user_users WHERE username = ?';
|
|
246
|
+
username = username.trim();
|
|
247
|
+
dbFields.push(username);
|
|
248
|
+
const { rows } = await this.options.db.query(sql, dbFields);
|
|
249
|
+
if (!rows.length) {
|
|
250
|
+
this.log.debug(`${logPrefix}No user found for username: "${username}"`);
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
const userUuid = this.lUtils.formatUuid(rows[0].uuid);
|
|
254
|
+
if (typeof userUuid === 'boolean')
|
|
255
|
+
return false;
|
|
256
|
+
const user = await this.fromUuid(userUuid);
|
|
257
|
+
return user;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Instanciate user object from user id
|
|
261
|
+
*
|
|
262
|
+
* @param {number} userUuid -
|
|
263
|
+
* @returns {Promise<UserBase>} userObj will be false if no user is found
|
|
264
|
+
*/
|
|
265
|
+
async fromUuid(userUuid) {
|
|
266
|
+
var _a;
|
|
267
|
+
const { helpers, lUtils } = this;
|
|
268
|
+
const { db } = this.options;
|
|
269
|
+
const { log } = this;
|
|
270
|
+
const logPrefix = `${topLogPrefix} fromUuid() -`;
|
|
271
|
+
const sql = 'SELECT\n' +
|
|
272
|
+
' u.uuid,\n' +
|
|
273
|
+
' u.username,\n' +
|
|
274
|
+
' u.password,\n' +
|
|
275
|
+
' uf.uuid AS fieldUuid,\n' +
|
|
276
|
+
' uf.name AS fieldName,\n' +
|
|
277
|
+
' ud.data AS fieldData\n' +
|
|
278
|
+
'FROM\n' +
|
|
279
|
+
' user_users u\n' +
|
|
280
|
+
' LEFT JOIN user_users_data ud ON ud.userUuid = u.uuid\n' +
|
|
281
|
+
' LEFT JOIN user_data_fields uf ON uf.uuid = ud.fieldUuid\n' +
|
|
282
|
+
'WHERE u.uuid = ?';
|
|
283
|
+
const userUuidBuf = helpers.valueOrThrow(lUtils.uuidToBuffer(userUuid), logPrefix, 'Invalid userUuid');
|
|
284
|
+
const dbFields = [userUuidBuf];
|
|
285
|
+
const { rows } = await db.query(sql, dbFields);
|
|
286
|
+
if (rows.length === 0) {
|
|
287
|
+
const err = new Error(`No user found for userUuid: "${userUuid}"`);
|
|
288
|
+
log.debug(logPrefix + err.message);
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
const fields = {};
|
|
292
|
+
for (const row of rows) {
|
|
293
|
+
if (row.fieldUuid) {
|
|
294
|
+
fields[_a = row.fieldName] ?? (fields[_a] = []);
|
|
295
|
+
fields[row.fieldName].push(row.fieldData);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
const userBaseOptions = {
|
|
299
|
+
userInstance: this,
|
|
300
|
+
log,
|
|
301
|
+
uuid: userUuid,
|
|
302
|
+
username: rows[0].username,
|
|
303
|
+
passwordIsFalse: !rows[0].password,
|
|
304
|
+
fields,
|
|
305
|
+
};
|
|
306
|
+
return new userBase_1.UserBase(userBaseOptions);
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Get field data for a user
|
|
310
|
+
*
|
|
311
|
+
* @param {string} userUuid -
|
|
312
|
+
* @param {string} fieldName -
|
|
313
|
+
* @returns {Promise<string[]>} data is always an array of data (or empty array)
|
|
314
|
+
*/
|
|
315
|
+
async getFieldData(userUuid, fieldName) {
|
|
316
|
+
const { helpers, lUtils } = this;
|
|
317
|
+
const logPrefix = `${topLogPrefix} getFieldData() -`;
|
|
318
|
+
const userUuidBuffer = helpers.valueOrThrow(lUtils.uuidToBuffer(userUuid), logPrefix, 'Invalid user uuid');
|
|
319
|
+
const fieldUuid = await helpers.getFieldUuid(fieldName);
|
|
320
|
+
const fieldUuidBuffer = helpers.valueOrThrow(lUtils.uuidToBuffer(fieldUuid), logPrefix, 'Invalid field uuid');
|
|
321
|
+
const dbFields = [userUuidBuffer, fieldUuidBuffer];
|
|
322
|
+
const sql = 'SELECT data FROM user_users_data WHERE userUuid = ? AND fieldUuid = ?';
|
|
323
|
+
const { rows } = await this.options.db.query(sql, dbFields);
|
|
324
|
+
const data = [];
|
|
325
|
+
for (const row of rows) {
|
|
326
|
+
data.push(row.data);
|
|
327
|
+
}
|
|
328
|
+
return data;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Hashes a new password
|
|
332
|
+
*
|
|
333
|
+
* @param {string} password -
|
|
334
|
+
* @returns {Promise<string>} Hashed password
|
|
335
|
+
*/
|
|
336
|
+
async hashPassword(password) {
|
|
337
|
+
password = password?.trim() ?? '';
|
|
338
|
+
const hash = await bcryptjs_1.default.hash(password, 10);
|
|
339
|
+
return hash;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Replace all fields
|
|
343
|
+
* IMPORTANT!!! Will clear all data not given in the fields parameter
|
|
344
|
+
*
|
|
345
|
+
* @param {string} userUuid -
|
|
346
|
+
* @param {object} fields - field name as key, field values as array to that key - ex: {'role': ['admin','user']}
|
|
347
|
+
* @returns {Promise<void>} -
|
|
348
|
+
*/
|
|
349
|
+
async replaceUserFields(userUuid, fields) {
|
|
350
|
+
await this.dataWriter.replaceFields(userUuid, fields);
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Remove a user
|
|
354
|
+
*
|
|
355
|
+
* @param {string} userUuid -
|
|
356
|
+
* @returns {Promise<void>} -
|
|
357
|
+
*/
|
|
358
|
+
async rmUser(userUuid) {
|
|
359
|
+
await this.dataWriter.rmUser(userUuid);
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Remove a user field
|
|
363
|
+
*
|
|
364
|
+
* @param {string} userUuid -
|
|
365
|
+
* @param {string} fieldName -
|
|
366
|
+
* @returns {Promise<void>} -
|
|
367
|
+
*/
|
|
368
|
+
async rmUserField(userUuid, fieldName) {
|
|
369
|
+
await this.dataWriter.rmUserField(userUuid, fieldName);
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Set password for a user
|
|
373
|
+
*
|
|
374
|
+
* @param {string} userUuid -
|
|
375
|
+
* @param {string} newPassword (plain text) or false for no valid password (user will not be able to login at all)
|
|
376
|
+
* @returns {Promise<void>} -
|
|
377
|
+
*/
|
|
378
|
+
async setPassword(userUuid, newPassword) {
|
|
379
|
+
const hashedPassword = typeof newPassword === 'string'
|
|
380
|
+
? await this.hashPassword(newPassword.trim())
|
|
381
|
+
: '';
|
|
382
|
+
await this.dataWriter.setPassword(userUuid, hashedPassword);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Set the username for a user
|
|
386
|
+
*
|
|
387
|
+
* @param {string} userUuid -
|
|
388
|
+
* @param {string} newUsername -
|
|
389
|
+
* @returns {Promise<void>} -
|
|
390
|
+
*/
|
|
391
|
+
async setUsername(userUuid, newUsername) {
|
|
392
|
+
const { helpers, lUtils } = this;
|
|
393
|
+
const logPrefix = `${topLogPrefix} setUsername() -`;
|
|
394
|
+
newUsername = newUsername.trim();
|
|
395
|
+
if (!newUsername) {
|
|
396
|
+
const err = new Error('No new username supplied');
|
|
397
|
+
this.log.warn(logPrefix + err.message);
|
|
398
|
+
throw err;
|
|
399
|
+
}
|
|
400
|
+
const userUuidBuf = helpers.valueOrThrow(lUtils.uuidToBuffer(userUuid), logPrefix, 'Invalid user uuid');
|
|
401
|
+
const { rows } = await this.options.db.query('SELECT uuid FROM user_users WHERE username = ? AND uuid != ?', [newUsername, userUuidBuf]);
|
|
402
|
+
if (rows.length && lUtils.formatUuid(rows[0].uuid) !== userUuid) {
|
|
403
|
+
const err = new Error('Username is already taken');
|
|
404
|
+
throw err;
|
|
405
|
+
}
|
|
406
|
+
await this.dataWriter.setUsername(userUuid, newUsername);
|
|
407
|
+
}
|
|
408
|
+
async getUsers(options = {}) {
|
|
409
|
+
const users = new users_1.Users({
|
|
410
|
+
db: this.options.db,
|
|
411
|
+
log: this.log,
|
|
412
|
+
...options,
|
|
413
|
+
});
|
|
414
|
+
return await users.get();
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
exports.UserLib = UserLib;
|
|
418
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { LogInstance } from 'larvitutils';
|
|
2
|
+
import { UserLib } from './index';
|
|
3
|
+
export declare type UserBaseOptions = {
|
|
4
|
+
userInstance: UserLib;
|
|
5
|
+
log: LogInstance;
|
|
6
|
+
uuid: string;
|
|
7
|
+
username: string;
|
|
8
|
+
passwordIsFalse: boolean;
|
|
9
|
+
fields?: Record<string, string[]>;
|
|
10
|
+
};
|
|
11
|
+
export declare class UserBase {
|
|
12
|
+
private userInstance;
|
|
13
|
+
private log;
|
|
14
|
+
uuid: string;
|
|
15
|
+
username: string;
|
|
16
|
+
passwordIsFalse: boolean;
|
|
17
|
+
fields: Record<string, string[]>;
|
|
18
|
+
constructor(options: UserBaseOptions);
|
|
19
|
+
/**
|
|
20
|
+
* Add a field with value
|
|
21
|
+
*
|
|
22
|
+
* @param {string} name -
|
|
23
|
+
* @param {string} value -
|
|
24
|
+
* @returns {Promise<void>} -
|
|
25
|
+
*/
|
|
26
|
+
addField(name: string, value: string | string[]): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Adds one or more fields with values to the user object. Does not overwrite existing values. It is possible to add the same value multiple times
|
|
29
|
+
*
|
|
30
|
+
* @param {object} fields - field name as key, field values as array to that key - ex: {'role': ['admin','user']}
|
|
31
|
+
* @returns {Promise<void>} -
|
|
32
|
+
*/
|
|
33
|
+
addFields(fields: Record<string, string | string[]>): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Replace all fields
|
|
36
|
+
* IMPORTANT!!! Will clear all data not given in the fields parameter
|
|
37
|
+
*
|
|
38
|
+
* @param {object} fields - field name as key, field values as array to that key - ex: {'role': ['admin','user']}
|
|
39
|
+
* @returns {Promise<void>} -
|
|
40
|
+
*/
|
|
41
|
+
replaceFields(fields: Record<string, string | string[]>): Promise<void>;
|
|
42
|
+
rm(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Remove a field from this user
|
|
45
|
+
*
|
|
46
|
+
* @param {string} name -
|
|
47
|
+
* @returns {Promise<void>} -
|
|
48
|
+
*/
|
|
49
|
+
rmField(name: string): Promise<void>;
|
|
50
|
+
setPassword(newPassword: string): Promise<void>;
|
|
51
|
+
setUsername(newUsername: string): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=userBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userBase.d.ts","sourceRoot":"","sources":["../src/userBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAKlC,oBAAY,eAAe,GAAG;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,GAAG,EAAE,WAAW,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAClC,CAAC;AAEF,qBAAa,QAAQ;IACpB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,GAAG,CAAc;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gBAE5B,OAAO,EAAE,eAAe;IAUpC;;;;;;OAMG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE;;;;;OAKG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzE;;;;;;OAMG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBvE,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC;IAezB;;;;;OAKG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/C,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAYrD"}
|