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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}
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"}