@onurege3467/zerohelper 7.1.0 → 8.0.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.
- package/README.md +762 -0
- package/database/IDatabase.js +18 -0
- package/database/cacheWrapper.js +526 -62
- package/database/index.js +9 -2
- package/database/json.js +59 -0
- package/database/migration.js +227 -0
- package/database/mongodb.js +45 -0
- package/database/mysql.js +61 -0
- package/database/pg.js +64 -0
- package/database/redis.js +342 -0
- package/database/sqlite.js +69 -0
- package/functions/index.js +267 -0
- package/package.json +11 -7
- package/.snapshots/config.json +0 -151
- package/.snapshots/readme.md +0 -11
- package/.snapshots/sponsors.md +0 -44
- package/1.json +0 -15
- package/readme.md +0 -418
- package/test.js +0 -261
- package/test_mysqlonly.js +0 -144
package/test.js
DELETED
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
const path = require('path');
|
|
2
|
-
const createDatabase = require('./database');
|
|
3
|
-
const helpers = require('./functions');
|
|
4
|
-
|
|
5
|
-
const mysqlConfig = {
|
|
6
|
-
adapter: 'mysql',
|
|
7
|
-
config: {
|
|
8
|
-
host: process.env.MYSQL_HOST || 'localhost',
|
|
9
|
-
user: process.env.MYSQL_USER || 'root',
|
|
10
|
-
password: process.env.MYSQL_PASSWORD || '',
|
|
11
|
-
database: process.env.MYSQL_DATABASE || 'test_db_zerohelper',
|
|
12
|
-
cache: {
|
|
13
|
-
max: 100,
|
|
14
|
-
ttl: 1000 * 10,
|
|
15
|
-
updateAgeOnGet: true,
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const mongoConfig = {
|
|
21
|
-
adapter: 'mongodb',
|
|
22
|
-
config: {
|
|
23
|
-
url: process.env.MONGODB_URL || 'MONGODB_URL',
|
|
24
|
-
database: process.env.MONGODB_DATABASE || 'test_mongo_db_zerohelper',
|
|
25
|
-
cache: {
|
|
26
|
-
max: 100,
|
|
27
|
-
ttl: 1000 * 10,
|
|
28
|
-
updateAgeOnGet: true,
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const jsonConfig = {
|
|
34
|
-
adapter: 'json',
|
|
35
|
-
config: {
|
|
36
|
-
filePath: path.join(__dirname, 'data', 'test_db.json'),
|
|
37
|
-
},
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const sqliteConfig = {
|
|
41
|
-
adapter: 'sqlite',
|
|
42
|
-
config: {
|
|
43
|
-
filePath: path.join(__dirname, 'data', 'test_db.sqlite'),
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const cachedSqliteConfig = {
|
|
48
|
-
adapter: 'sqlite',
|
|
49
|
-
config: {
|
|
50
|
-
filePath: path.join(__dirname, 'data', 'test_db_cached.sqlite'),
|
|
51
|
-
cache: {
|
|
52
|
-
max: 100, // Max 100 items
|
|
53
|
-
ttl: 1000 * 10, // 10 seconds TTL
|
|
54
|
-
updateAgeOnGet: true,
|
|
55
|
-
},
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
const pgConfig = {
|
|
60
|
-
adapter: 'postgres',
|
|
61
|
-
config: {
|
|
62
|
-
host: process.env.PG_HOST || 'localhost',
|
|
63
|
-
user: process.env.PG_USER || 'postgres',
|
|
64
|
-
password: process.env.PG_PASSWORD || '',
|
|
65
|
-
database: process.env.PG_DATABASE || 'test_db_zerohelper_pg',
|
|
66
|
-
cache: {
|
|
67
|
-
max: 100,
|
|
68
|
-
ttl: 1000 * 10,
|
|
69
|
-
updateAgeOnGet: true,
|
|
70
|
-
},
|
|
71
|
-
},
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
// Absurd configurations for testing edge cases
|
|
75
|
-
async function runDatabaseTests() {
|
|
76
|
-
console.log('Starting database tests...');
|
|
77
|
-
|
|
78
|
-
const databases = [
|
|
79
|
-
{ name: 'MySQL', config: mysqlConfig },
|
|
80
|
-
{ name: 'MongoDB', config: mongoConfig },
|
|
81
|
-
{ name: 'PostgreSQL', config: pgConfig },
|
|
82
|
-
{ name: 'JSON', config: jsonConfig },
|
|
83
|
-
{ name: 'SQLite', config: sqliteConfig },
|
|
84
|
-
];
|
|
85
|
-
|
|
86
|
-
for (const dbInfo of databases) {
|
|
87
|
-
const { name, config } = dbInfo;
|
|
88
|
-
console.log(`\n--- Testing ${name} Database ---`);
|
|
89
|
-
let db;
|
|
90
|
-
try {
|
|
91
|
-
db = createDatabase(config);
|
|
92
|
-
console.log(`${name} database connected.`);
|
|
93
|
-
|
|
94
|
-
// Test Insert
|
|
95
|
-
const insertResult = await db.insert('users', { name: 'Test User', email: `test_${name.toLowerCase()}@example.com`, int_age: 30, bool_active: true });
|
|
96
|
-
console.log(`${name} Insert:`, insertResult);
|
|
97
|
-
|
|
98
|
-
// Test SelectOne
|
|
99
|
-
const user = await db.selectOne('users', { name: 'Test User' });
|
|
100
|
-
console.log(`${name} SelectOne:`, user);
|
|
101
|
-
|
|
102
|
-
// Test Update
|
|
103
|
-
if (user) {
|
|
104
|
-
const updateResult = await db.update('users', { int_age: 31 }, { name: 'Test User' });
|
|
105
|
-
console.log(`${name} Update:`, updateResult);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Test Select (all)
|
|
109
|
-
const allUsers = await db.select('users');
|
|
110
|
-
console.log(`${name} Select All:`, allUsers);
|
|
111
|
-
|
|
112
|
-
// Test Set (upsert)
|
|
113
|
-
const setResult = await db.set('users', { city: 'Test City' }, { name: 'Test User' });
|
|
114
|
-
console.log(`${name} Set (upsert):`, setResult);
|
|
115
|
-
|
|
116
|
-
// Test Delete
|
|
117
|
-
const deleteResult = await db.delete('users', { name: 'Test User' });
|
|
118
|
-
console.log(`${name} Delete:`, deleteResult);
|
|
119
|
-
|
|
120
|
-
} catch (error) {
|
|
121
|
-
console.error(`Error testing ${name} database:`, error);
|
|
122
|
-
} finally {
|
|
123
|
-
if (db) {
|
|
124
|
-
try {
|
|
125
|
-
await db.close();
|
|
126
|
-
console.log(`${name} database connection closed.`);
|
|
127
|
-
} catch (closeError) {
|
|
128
|
-
console.error(`Error closing ${name} database connection:`, closeError);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// --- Testing Cached SQLite Database ---
|
|
135
|
-
console.log('\n--- Testing Cached SQLite Database ---');
|
|
136
|
-
let cachedDb;
|
|
137
|
-
try {
|
|
138
|
-
cachedDb = createDatabase(cachedSqliteConfig);
|
|
139
|
-
console.log('Cached SQLite database connected.');
|
|
140
|
-
|
|
141
|
-
// Insert a record
|
|
142
|
-
await cachedDb.insert('products', { name: 'Laptop', price: 1200 });
|
|
143
|
-
console.log('Inserted Laptop into cached DB.');
|
|
144
|
-
|
|
145
|
-
// First select - should be a cache miss
|
|
146
|
-
let product = await cachedDb.selectOne('products', { name: 'Laptop' });
|
|
147
|
-
console.log('First select (should be cache miss): ', product);
|
|
148
|
-
|
|
149
|
-
// Second select - should be a cache hit
|
|
150
|
-
product = await cachedDb.selectOne('products', { name: 'Laptop' });
|
|
151
|
-
console.log('Second select (should be cache hit): ', product);
|
|
152
|
-
|
|
153
|
-
// Update the record - should invalidate cache
|
|
154
|
-
await cachedDb.update('products', { price: 1150 }, { name: 'Laptop' });
|
|
155
|
-
console.log('Updated Laptop price, cache should be invalidated.');
|
|
156
|
-
|
|
157
|
-
// Third select - should be a cache miss again (after invalidation)
|
|
158
|
-
product = await cachedDb.selectOne('products', { name: 'Laptop' });
|
|
159
|
-
console.log('Third select (should be cache miss after update): ', product);
|
|
160
|
-
|
|
161
|
-
// Delete the record
|
|
162
|
-
await cachedDb.delete('products', { name: 'Laptop' });
|
|
163
|
-
console.log('Deleted Laptop from cached DB.');
|
|
164
|
-
|
|
165
|
-
} catch (error) {
|
|
166
|
-
console.error('Error testing Cached SQLite database:', error);
|
|
167
|
-
} finally {
|
|
168
|
-
if (cachedDb) {
|
|
169
|
-
try {
|
|
170
|
-
await cachedDb.close();
|
|
171
|
-
console.log('Cached SQLite database connection closed.');
|
|
172
|
-
} catch (closeError) {
|
|
173
|
-
console.error('Error closing Cached SQLite database connection:', closeError);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
console.log('\nAll database tests completed.');
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
function runHelperFunctionTests() {
|
|
183
|
-
console.log('\nStarting helper function tests...');
|
|
184
|
-
|
|
185
|
-
// Random Functions
|
|
186
|
-
console.log('\n--- Testing Random Functions ---');
|
|
187
|
-
console.log('makeUniqueId:', helpers.random.makeUniqueId());
|
|
188
|
-
console.log('randomArray:', helpers.random.randomArray([1, 2, 3]));
|
|
189
|
-
console.log('randomText (5 chars):', helpers.random.randomText(5));
|
|
190
|
-
console.log('randomNumber (1-10):', helpers.random.randomNumber(1, 10));
|
|
191
|
-
console.log('randomEmoji:', helpers.random.randomEmoji());
|
|
192
|
-
console.log('randomHex:', helpers.random.randomHex());
|
|
193
|
-
console.log('randomFloat (1.0-2.0):', helpers.random.randomFloat(1.0, 2.0));
|
|
194
|
-
|
|
195
|
-
// String Functions
|
|
196
|
-
console.log('\n--- Testing String Functions ---');
|
|
197
|
-
console.log('titleCase:', helpers.string.titleCase('hello world'));
|
|
198
|
-
console.log('generateRandomString (8 chars):', helpers.string.generateRandomString(8));
|
|
199
|
-
|
|
200
|
-
// Array Functions
|
|
201
|
-
console.log('\n--- Testing Array Functions ---');
|
|
202
|
-
console.log('shuffleArray:', helpers.array.shuffleArray([1, 2, 3, 4, 5]));
|
|
203
|
-
console.log('flattenArray:', helpers.array.flattenArray([1, [2, [3]], 4]));
|
|
204
|
-
console.log('removeFalsyValues:', helpers.array.removeFalsyValues([0, 1, false, '', null, undefined, 2]));
|
|
205
|
-
const groupByData = [
|
|
206
|
-
{ type: 'A', value: 1 },
|
|
207
|
-
{ type: 'B', value: 2 },
|
|
208
|
-
{ type: 'A', value: 3 },
|
|
209
|
-
];
|
|
210
|
-
console.log('groupBy:', helpers.array.groupBy(groupByData, 'type'));
|
|
211
|
-
const pluckData = [
|
|
212
|
-
{ name: 'Alice', age: 30 },
|
|
213
|
-
{ name: 'Bob', age: 24 },
|
|
214
|
-
];
|
|
215
|
-
console.log('pluck (name):', helpers.array.pluck(pluckData, 'name'));
|
|
216
|
-
const sortByData = [
|
|
217
|
-
{ age: 30 },
|
|
218
|
-
{ age: 20 },
|
|
219
|
-
{ age: 40 },
|
|
220
|
-
];
|
|
221
|
-
console.log('sortBy (age):', helpers.array.sortBy(sortByData, 'age'));
|
|
222
|
-
|
|
223
|
-
// Object Functions
|
|
224
|
-
console.log('\n--- Testing Object Functions ---');
|
|
225
|
-
const filterObjectData = { a: 1, b: 2, c: 3 };
|
|
226
|
-
console.log('filterObjectByKey:', helpers.object.filterObjectByKey(filterObjectData, ['a', 'c']));
|
|
227
|
-
const deepMergeData1 = { a: 1, b: { c: 2 } };
|
|
228
|
-
const deepMergeData2 = { b: { d: 3 }, e: 4 };
|
|
229
|
-
console.log('deepMerge:', helpers.object.deepMerge(deepMergeData1, deepMergeData2));
|
|
230
|
-
|
|
231
|
-
// Crypto Functions
|
|
232
|
-
console.log('\n--- Testing Crypto Functions ---');
|
|
233
|
-
const secret = 'mySuperSecretKey';
|
|
234
|
-
const textToEncrypt = 'Hello Crypto!';
|
|
235
|
-
const encryptedResult = helpers.crypto.encryptText(textToEncrypt, secret);
|
|
236
|
-
const encryptedText = encryptedResult.encryptedText;
|
|
237
|
-
const iv = encryptedResult.iv;
|
|
238
|
-
console.log('encryptText:', encryptedText);
|
|
239
|
-
console.log('decryptText:', helpers.crypto.decryptText(encryptedText, secret, iv));
|
|
240
|
-
const password = 'mySecurePassword';
|
|
241
|
-
const hashedPassword = helpers.crypto.hashPassword(password);
|
|
242
|
-
console.log('hashPassword:', hashedPassword);
|
|
243
|
-
console.log('verifyPassword (true):', helpers.crypto.verifyPassword(password, hashedPassword));
|
|
244
|
-
console.log('verifyPassword (false):', helpers.crypto.verifyPassword('wrongPassword', hashedPassword));
|
|
245
|
-
const jwtPayload = { userId: 123, username: 'testuser' };
|
|
246
|
-
const jwtToken = helpers.crypto.generateJWT(jwtPayload, secret);
|
|
247
|
-
console.log('generateJWT:', jwtToken);
|
|
248
|
-
console.log('verifyJWT:', helpers.crypto.verifyJWT(jwtToken, secret));
|
|
249
|
-
|
|
250
|
-
// Math Functions
|
|
251
|
-
console.log('\n--- Testing Math Functions ---');
|
|
252
|
-
console.log('mean:', helpers.math.mean([1, 2, 3, 4, 5]));
|
|
253
|
-
console.log('isPrime (7):', helpers.math.isPrime(7));
|
|
254
|
-
console.log('isPrime (10):', helpers.math.isPrime(10));
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
async function main() {
|
|
258
|
-
await runDatabaseTests();
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
main();
|
package/test_mysqlonly.js
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
const path = require('path');
|
|
2
|
-
const createDatabase = require('./database');
|
|
3
|
-
const helpers = require('./functions');
|
|
4
|
-
const { setInterval } = require('timers');
|
|
5
|
-
|
|
6
|
-
const mysqlConfig = {
|
|
7
|
-
adapter: 'mysql',
|
|
8
|
-
config: {
|
|
9
|
-
host: process.env.MYSQL_HOST || 'localhost',
|
|
10
|
-
user: process.env.MYSQL_USER || 'root',
|
|
11
|
-
password: process.env.MYSQL_PASSWORD || '',
|
|
12
|
-
database: process.env.MYSQL_DATABASE || 'test_db_zerohelper',
|
|
13
|
-
cache: {
|
|
14
|
-
max: 100,
|
|
15
|
-
ttl: 1000 * 10,
|
|
16
|
-
updateAgeOnGet: true,
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
// Absurd configurations for testing edge cases
|
|
21
|
-
async function runDatabaseTests() {
|
|
22
|
-
console.log('Starting database tests...');
|
|
23
|
-
|
|
24
|
-
const databases = [
|
|
25
|
-
{ name: 'MySQL', config: mysqlConfig },
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
for (const dbInfo of databases) {
|
|
29
|
-
const { name, config } = dbInfo;
|
|
30
|
-
console.log(`\n--- Testing ${name} Database ---`);
|
|
31
|
-
let db;
|
|
32
|
-
try {
|
|
33
|
-
db = createDatabase(config);
|
|
34
|
-
console.log(`${name} database connected.`);
|
|
35
|
-
|
|
36
|
-
// Test Insert
|
|
37
|
-
const insertResult = await db.insert('users', { name: 'Test User', email: `test_${name.toLowerCase()}@example.com`, int_age: 30, bool_active: true,city: 'Test City' });
|
|
38
|
-
console.log(`${name} Insert:`, insertResult);
|
|
39
|
-
const selectResult = await db.selectOne('users', { _id: insertResult});
|
|
40
|
-
console.log(`${name} Select One:`, selectResult);
|
|
41
|
-
await db.set('users', {city:'Amkara'}, {_id: insertResult });
|
|
42
|
-
|
|
43
|
-
setInterval(async () => {
|
|
44
|
-
const updatedSelectResult = await db.selectOne('users', { _id: insertResult });
|
|
45
|
-
console.log(`${name} Select One after update:`, updatedSelectResult);
|
|
46
|
-
}, 1000);
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
} catch (error) {
|
|
51
|
-
console.error(`Error testing ${name} database:`, error);
|
|
52
|
-
} finally {
|
|
53
|
-
if (db) {
|
|
54
|
-
try {
|
|
55
|
-
} catch (closeError) {
|
|
56
|
-
console.error(`Error closing ${name} database connection:`, closeError);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
console.log('\nAll database tests completed.');
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
function runHelperFunctionTests() {
|
|
66
|
-
console.log('\nStarting helper function tests...');
|
|
67
|
-
|
|
68
|
-
// Random Functions
|
|
69
|
-
console.log('\n--- Testing Random Functions ---');
|
|
70
|
-
console.log('makeUniqueId:', helpers.random.makeUniqueId());
|
|
71
|
-
console.log('randomArray:', helpers.random.randomArray([1, 2, 3]));
|
|
72
|
-
console.log('randomText (5 chars):', helpers.random.randomText(5));
|
|
73
|
-
console.log('randomNumber (1-10):', helpers.random.randomNumber(1, 10));
|
|
74
|
-
console.log('randomEmoji:', helpers.random.randomEmoji());
|
|
75
|
-
console.log('randomHex:', helpers.random.randomHex());
|
|
76
|
-
console.log('randomFloat (1.0-2.0):', helpers.random.randomFloat(1.0, 2.0));
|
|
77
|
-
|
|
78
|
-
// String Functions
|
|
79
|
-
console.log('\n--- Testing String Functions ---');
|
|
80
|
-
console.log('titleCase:', helpers.string.titleCase('hello world'));
|
|
81
|
-
console.log('generateRandomString (8 chars):', helpers.string.generateRandomString(8));
|
|
82
|
-
|
|
83
|
-
// Array Functions
|
|
84
|
-
console.log('\n--- Testing Array Functions ---');
|
|
85
|
-
console.log('shuffleArray:', helpers.array.shuffleArray([1, 2, 3, 4, 5]));
|
|
86
|
-
console.log('flattenArray:', helpers.array.flattenArray([1, [2, [3]], 4]));
|
|
87
|
-
console.log('removeFalsyValues:', helpers.array.removeFalsyValues([0, 1, false, '', null, undefined, 2]));
|
|
88
|
-
const groupByData = [
|
|
89
|
-
{ type: 'A', value: 1 },
|
|
90
|
-
{ type: 'B', value: 2 },
|
|
91
|
-
{ type: 'A', value: 3 },
|
|
92
|
-
];
|
|
93
|
-
console.log('groupBy:', helpers.array.groupBy(groupByData, 'type'));
|
|
94
|
-
const pluckData = [
|
|
95
|
-
{ name: 'Alice', age: 30 },
|
|
96
|
-
{ name: 'Bob', age: 24 },
|
|
97
|
-
];
|
|
98
|
-
console.log('pluck (name):', helpers.array.pluck(pluckData, 'name'));
|
|
99
|
-
const sortByData = [
|
|
100
|
-
{ age: 30 },
|
|
101
|
-
{ age: 20 },
|
|
102
|
-
{ age: 40 },
|
|
103
|
-
];
|
|
104
|
-
console.log('sortBy (age):', helpers.array.sortBy(sortByData, 'age'));
|
|
105
|
-
|
|
106
|
-
// Object Functions
|
|
107
|
-
console.log('\n--- Testing Object Functions ---');
|
|
108
|
-
const filterObjectData = { a: 1, b: 2, c: 3 };
|
|
109
|
-
console.log('filterObjectByKey:', helpers.object.filterObjectByKey(filterObjectData, ['a', 'c']));
|
|
110
|
-
const deepMergeData1 = { a: 1, b: { c: 2 } };
|
|
111
|
-
const deepMergeData2 = { b: { d: 3 }, e: 4 };
|
|
112
|
-
console.log('deepMerge:', helpers.object.deepMerge(deepMergeData1, deepMergeData2));
|
|
113
|
-
|
|
114
|
-
// Crypto Functions
|
|
115
|
-
console.log('\n--- Testing Crypto Functions ---');
|
|
116
|
-
const secret = 'mySuperSecretKey';
|
|
117
|
-
const textToEncrypt = 'Hello Crypto!';
|
|
118
|
-
const encryptedResult = helpers.crypto.encryptText(textToEncrypt, secret);
|
|
119
|
-
const encryptedText = encryptedResult.encryptedText;
|
|
120
|
-
const iv = encryptedResult.iv;
|
|
121
|
-
console.log('encryptText:', encryptedText);
|
|
122
|
-
console.log('decryptText:', helpers.crypto.decryptText(encryptedText, secret, iv));
|
|
123
|
-
const password = 'mySecurePassword';
|
|
124
|
-
const hashedPassword = helpers.crypto.hashPassword(password);
|
|
125
|
-
console.log('hashPassword:', hashedPassword);
|
|
126
|
-
console.log('verifyPassword (true):', helpers.crypto.verifyPassword(password, hashedPassword));
|
|
127
|
-
console.log('verifyPassword (false):', helpers.crypto.verifyPassword('wrongPassword', hashedPassword));
|
|
128
|
-
const jwtPayload = { userId: 123, username: 'testuser' };
|
|
129
|
-
const jwtToken = helpers.crypto.generateJWT(jwtPayload, secret);
|
|
130
|
-
console.log('generateJWT:', jwtToken);
|
|
131
|
-
console.log('verifyJWT:', helpers.crypto.verifyJWT(jwtToken, secret));
|
|
132
|
-
|
|
133
|
-
// Math Functions
|
|
134
|
-
console.log('\n--- Testing Math Functions ---');
|
|
135
|
-
console.log('mean:', helpers.math.mean([1, 2, 3, 4, 5]));
|
|
136
|
-
console.log('isPrime (7):', helpers.math.isPrime(7));
|
|
137
|
-
console.log('isPrime (10):', helpers.math.isPrime(10));
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
async function main() {
|
|
141
|
-
await runDatabaseTests();
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
main();
|