@goatlab/fluent-firebase 0.6.1 → 0.6.2

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 (54) hide show
  1. package/dist/Firebase.d.ts +5 -0
  2. package/dist/Firebase.js +9 -0
  3. package/dist/FirebaseConnector.d.ts +42 -0
  4. package/dist/FirebaseConnector.js +395 -0
  5. package/dist/FirebaseInit.d.ts +8 -0
  6. package/dist/FirebaseInit.js +30 -0
  7. package/dist/firebaseConnector.http_spec.d.ts +1 -0
  8. package/dist/firebaseConnector.http_spec.js +37 -0
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.js +0 -1
  11. package/dist/test/advanced/advancedTestSuite.d.ts +1 -0
  12. package/dist/test/advanced/advancedTestSuite.js +114 -0
  13. package/dist/test/advanced/firebase.repository.d.ts +5 -0
  14. package/dist/test/advanced/firebase.repository.js +11 -0
  15. package/dist/test/advanced/typeOrm.entity.d.ts +16 -0
  16. package/dist/test/advanced/typeOrm.entity.js +57 -0
  17. package/dist/test/basic/basicTestSuite.d.ts +1 -0
  18. package/dist/test/basic/basicTestSuite.js +45 -0
  19. package/dist/test/basic/goat.dto.d.ts +8 -0
  20. package/dist/test/basic/goat.dto.js +18 -0
  21. package/dist/test/basic/goat.entity.d.ts +10 -0
  22. package/dist/test/basic/goat.entity.js +41 -0
  23. package/dist/test/flock.d.ts +4 -0
  24. package/dist/test/flock.js +25 -0
  25. package/dist/test/goat.repository.d.ts +6 -0
  26. package/dist/test/goat.repository.js +11 -0
  27. package/dist/test/relations/car/car.dto.d.ts +5 -0
  28. package/dist/test/relations/car/car.dto.js +12 -0
  29. package/dist/test/relations/car/car.entity.d.ts +7 -0
  30. package/dist/test/relations/car/car.entity.js +32 -0
  31. package/dist/test/relations/car/car.repositoryFirebase.d.ts +8 -0
  32. package/dist/test/relations/car/car.repositoryFirebase.js +13 -0
  33. package/dist/test/relations/relationsTestsSuite.d.ts +1 -0
  34. package/dist/test/relations/relationsTestsSuite.js +93 -0
  35. package/dist/test/relations/roles/role.dto.d.ts +5 -0
  36. package/dist/test/relations/roles/role.dto.js +12 -0
  37. package/dist/test/relations/roles/roles.entity.d.ts +6 -0
  38. package/dist/test/relations/roles/roles.entity.js +29 -0
  39. package/dist/test/relations/roles/roles.repositoryFirebase.d.ts +8 -0
  40. package/dist/test/relations/roles/roles.repositoryFirebase.js +14 -0
  41. package/dist/test/relations/roles/roles_user.dto.d.ts +5 -0
  42. package/dist/test/relations/roles/roles_user.dto.js +12 -0
  43. package/dist/test/relations/roles/roles_user.entity.d.ts +5 -0
  44. package/dist/test/relations/roles/roles_user.entity.js +23 -0
  45. package/dist/test/relations/roles/roles_users.repositoryFirebase.d.ts +6 -0
  46. package/dist/test/relations/roles/roles_users.repositoryFirebase.js +11 -0
  47. package/dist/test/relations/user/user.dto.d.ts +5 -0
  48. package/dist/test/relations/user/user.dto.js +12 -0
  49. package/dist/test/relations/user/user.entity.d.ts +14 -0
  50. package/dist/test/relations/user/user.entity.js +56 -0
  51. package/dist/test/relations/user/user.repositoryFirebase.d.ts +10 -0
  52. package/dist/test/relations/user/user.repositoryFirebase.js +16 -0
  53. package/dist/tsconfig.tsbuildinfo +1 -0
  54. package/package.json +5 -5
@@ -0,0 +1,5 @@
1
+ import * as admin from 'firebase-admin';
2
+ export declare type FirebaseUser = admin.auth.DecodedIdToken;
3
+ export declare const Firebase: Readonly<{
4
+ verifyIdToken: (token: string) => Promise<import("firebase-admin/lib/auth/token-verifier").DecodedIdToken>;
5
+ }>;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Firebase = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const admin = tslib_1.__importStar(require("firebase-admin"));
6
+ exports.Firebase = (() => {
7
+ const verifyIdToken = (token) => admin.auth().verifyIdToken(token);
8
+ return Object.freeze({ verifyIdToken });
9
+ })();
@@ -0,0 +1,42 @@
1
+ import * as admin from 'firebase-admin';
2
+ import { BaseFirestoreRepository } from 'fireorm';
3
+ import { DataSource as datasource } from 'typeorm';
4
+ import type { Filter, DaoOutput, BaseDataElement, PaginatedData, Paginator, Sure } from '@goatlab/fluent';
5
+ import { BaseConnector, FluentConnectorInterface } from '@goatlab/fluent';
6
+ export declare const DataSource: typeof datasource;
7
+ export declare const createFirebaseRepository: (Entity: any) => {
8
+ repository: BaseFirestoreRepository<import("fireorm").IEntity>;
9
+ name: string;
10
+ path: string;
11
+ keys: string[];
12
+ relations: {};
13
+ };
14
+ export declare class FirebaseConnector<ModelDTO = BaseDataElement, InputDTO = ModelDTO, OutputDTO = InputDTO> extends BaseConnector<ModelDTO, InputDTO, OutputDTO> implements FluentConnectorInterface<InputDTO, DaoOutput<InputDTO, OutputDTO>> {
15
+ private repository;
16
+ private collection;
17
+ constructor(Entity: any, relationQuery?: any);
18
+ get(): Promise<DaoOutput<InputDTO, OutputDTO>[]>;
19
+ getPaginated(): Promise<PaginatedData<DaoOutput<InputDTO, OutputDTO>>>;
20
+ all(): Promise<DaoOutput<InputDTO, OutputDTO>[]>;
21
+ find(filter?: Filter): Promise<DaoOutput<InputDTO, OutputDTO>[]>;
22
+ paginate(paginator: Paginator): Promise<PaginatedData<DaoOutput<InputDTO, OutputDTO>>>;
23
+ raw(): admin.firestore.CollectionReference<ModelDTO>;
24
+ insert(data: InputDTO, forcedId?: string | number): Promise<DaoOutput<InputDTO, OutputDTO>>;
25
+ insertMany(data: InputDTO[], forcedId?: string | number): Promise<DaoOutput<InputDTO, OutputDTO>[]>;
26
+ batchInsert(data: InputDTO[]): Promise<DaoOutput<InputDTO, OutputDTO>[]>;
27
+ updateById(id: string, data: InputDTO): Promise<DaoOutput<InputDTO, OutputDTO>>;
28
+ replaceById(id: string, data: InputDTO): Promise<DaoOutput<InputDTO, OutputDTO>>;
29
+ clear({ sure }: Sure): Promise<unknown>;
30
+ deleteById(id: string): Promise<string>;
31
+ findById(id: string): Promise<DaoOutput<InputDTO, OutputDTO>>;
32
+ private getPage;
33
+ private getPaginatorLimit;
34
+ private getPopulate;
35
+ private getGeneratedQuery;
36
+ private getFilters;
37
+ private getOrderBy;
38
+ private getLimit;
39
+ private getSkip;
40
+ private getSelect;
41
+ private deleteQueryBatch;
42
+ }
@@ -0,0 +1,395 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FirebaseConnector = exports.createFirebaseRepository = exports.DataSource = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const admin = tslib_1.__importStar(require("firebase-admin"));
6
+ const fireorm_1 = require("fireorm");
7
+ const typeorm_1 = require("typeorm");
8
+ const firestore_1 = require("@google-cloud/firestore");
9
+ const fluent_1 = require("@goatlab/fluent");
10
+ const js_utils_1 = require("@goatlab/js-utils");
11
+ const db = admin.firestore();
12
+ exports.DataSource = typeorm_1.DataSource;
13
+ const createFirebaseRepository = Entity => {
14
+ const typeOrmRepo = fluent_1.modelGeneratorDataSource.getRepository(Entity);
15
+ const repository = (0, fireorm_1.getRepository)(Entity);
16
+ let name = '';
17
+ let path = '';
18
+ const relations = {};
19
+ for (const relation of typeOrmRepo.metadata.relations) {
20
+ relations[relation.inverseEntityMetadata.givenTableName.toLowerCase()] = {
21
+ isOneToMany: relation.isOneToMany,
22
+ isManyToOne: relation.isManyToOne,
23
+ isManyToMany: relation.isManyToMany,
24
+ inverseSidePropertyPath: relation.inverseSidePropertyPath,
25
+ propertyPath: relation.propertyName,
26
+ entityName: relation.inverseEntityMetadata.name,
27
+ tableName: relation.inverseEntityMetadata.tableName,
28
+ targetClass: relation.inverseEntityMetadata.target,
29
+ joinColumns: relation.joinColumns,
30
+ inverseJoinColumns: relation.inverseJoinColumns
31
+ };
32
+ }
33
+ try {
34
+ const parsed = JSON.parse(JSON.stringify(repository));
35
+ name = parsed.colMetadata.name;
36
+ path = parsed.path;
37
+ }
38
+ catch (error) {
39
+ name = '';
40
+ }
41
+ return {
42
+ repository,
43
+ name,
44
+ path,
45
+ keys: [...['id', '_id'], ...(0, fluent_1.getOutputKeys)(typeOrmRepo)],
46
+ relations
47
+ };
48
+ };
49
+ exports.createFirebaseRepository = createFirebaseRepository;
50
+ class FirebaseConnector extends fluent_1.BaseConnector {
51
+ constructor(Entity, relationQuery) {
52
+ super();
53
+ const { repository, keys, name, relations } = (0, exports.createFirebaseRepository)(Entity);
54
+ this.relationQuery = relationQuery;
55
+ this.repository = repository;
56
+ this.collection = db.collection(name);
57
+ this.outputKeys = keys || [];
58
+ this.modelRelations = relations;
59
+ }
60
+ async get() {
61
+ let query = this.getGeneratedQuery();
62
+ if (this.relationQuery && this.relationQuery.data) {
63
+ const ids = this.relationQuery.data.map(d => d.id);
64
+ query = query.where(this.relationQuery.relation.inverseSidePropertyPath, 'in', ids);
65
+ }
66
+ const snapshot = await query.get();
67
+ const result = [];
68
+ snapshot.forEach(doc => {
69
+ result.push(doc.data());
70
+ });
71
+ let data = this.jsApplySelect(result);
72
+ data = await (0, fluent_1.loadRelations)({
73
+ data,
74
+ relations: this.relations,
75
+ modelRelations: this.modelRelations,
76
+ provider: 'firebase',
77
+ self: this
78
+ });
79
+ this.reset();
80
+ return data;
81
+ }
82
+ async getPaginated() {
83
+ const response = await this.get();
84
+ const result = this.jsApplySelect(response);
85
+ const results = {
86
+ current_page: 1,
87
+ data: result,
88
+ first_page_url: 'response[0].meta.firstPageUrl,',
89
+ next_page_url: 'response[0].meta.nextPageUrl',
90
+ path: 'response[0].meta.path',
91
+ per_page: 1,
92
+ prev_page_url: ' response[0].meta.previousPageUrl',
93
+ total: 10
94
+ };
95
+ return results;
96
+ }
97
+ async all() {
98
+ return this.get();
99
+ }
100
+ async find(filter = {}) {
101
+ const stringFilter = filter;
102
+ let parsedFilter = {};
103
+ try {
104
+ parsedFilter = JSON.parse(stringFilter);
105
+ }
106
+ catch (error) {
107
+ parsedFilter = {};
108
+ }
109
+ this.selectArray = (parsedFilter && parsedFilter.fields) || [];
110
+ this.whereArray =
111
+ (parsedFilter && parsedFilter.where && parsedFilter.where.and) || [];
112
+ this.orWhereArray =
113
+ (parsedFilter && parsedFilter.where && parsedFilter.where.or) || [];
114
+ this.limit((parsedFilter && (parsedFilter.limit || parsedFilter.take)) || 20);
115
+ this.offset((parsedFilter && (parsedFilter.offset || parsedFilter.skip)) || 0);
116
+ if (parsedFilter && parsedFilter.order) {
117
+ const orderB = [
118
+ parsedFilter.order.field,
119
+ parsedFilter.order.asc ? 'asc' : 'desc',
120
+ parsedFilter.order.type || 'string'
121
+ ];
122
+ this.chainReference.push({ method: 'orderBy', orderB });
123
+ this.orderByArray = orderB;
124
+ }
125
+ return this.get();
126
+ }
127
+ async paginate(paginator) {
128
+ if (!paginator) {
129
+ throw new Error('Paginator cannot be empty');
130
+ }
131
+ this.paginator = paginator;
132
+ const response = await this.getPaginated();
133
+ return response;
134
+ }
135
+ raw() {
136
+ return this.collection;
137
+ }
138
+ async insert(data, forcedId) {
139
+ const id = forcedId || js_utils_1.Ids.objectIdString();
140
+ const datum = await this.repository.create({ id, ...data });
141
+ const result = this.jsApplySelect([datum]);
142
+ this.reset();
143
+ return result[0];
144
+ }
145
+ async insertMany(data, forcedId) {
146
+ const batch = [];
147
+ data.forEach(d => {
148
+ const id = js_utils_1.Ids.objectIdString();
149
+ batch.push(this.repository.create({ id, ...d }));
150
+ });
151
+ const inserted = await Promise.all(batch);
152
+ const result = this.jsApplySelect(inserted);
153
+ this.reset();
154
+ return result;
155
+ }
156
+ async batchInsert(data) {
157
+ const batch = this.repository.createBatch();
158
+ data.forEach(d => {
159
+ const id = js_utils_1.Ids.objectIdString();
160
+ batch.create({ id, ...d });
161
+ });
162
+ const inserted = await batch.commit();
163
+ const result = this.jsApplySelect(inserted);
164
+ this.reset();
165
+ return result;
166
+ }
167
+ async updateById(id, data) {
168
+ const parsedId = id;
169
+ const dbResult = await this.repository.findById(parsedId);
170
+ const updateData = {
171
+ ...dbResult,
172
+ ...data
173
+ };
174
+ const updated = await this.repository.update(updateData);
175
+ const result = this.jsApplySelect([updated]);
176
+ this.reset();
177
+ return result[0];
178
+ }
179
+ async replaceById(id, data) {
180
+ const parsedId = id;
181
+ const value = await this.repository.findById(parsedId);
182
+ const flatValue = js_utils_1.Objects.flatten(JSON.parse(JSON.stringify(value)));
183
+ Object.keys(flatValue).forEach(key => {
184
+ if (key !== 'id') {
185
+ flatValue[key] = null;
186
+ }
187
+ });
188
+ const nullObject = js_utils_1.Objects.nest(flatValue);
189
+ const newValue = { ...nullObject, ...data };
190
+ delete newValue.created;
191
+ delete newValue.updated;
192
+ const entity = { ...newValue };
193
+ await this.repository.update(entity);
194
+ const val = await this.repository.findById(parsedId);
195
+ const returnValue = this.jsApplySelect([val]);
196
+ this.reset();
197
+ return returnValue[0];
198
+ }
199
+ async clear({ sure }) {
200
+ if (!sure || sure !== true) {
201
+ throw new Error('Clear() method will delete everything!, you must set the "sure" parameter "clear({sure:true})" to continue');
202
+ }
203
+ const query = this.collection.orderBy('__name__').limit(300);
204
+ this.reset();
205
+ return new Promise((resolve, reject) => {
206
+ this.deleteQueryBatch(db, query, 300, resolve, reject);
207
+ });
208
+ }
209
+ async deleteById(id) {
210
+ const parsedId = id;
211
+ await this.repository.delete(parsedId);
212
+ this.reset();
213
+ return id;
214
+ }
215
+ async findById(id) {
216
+ const parsedId = id;
217
+ const data = await this.repository.findById(parsedId);
218
+ const result = this.jsApplySelect(data);
219
+ this.reset();
220
+ if (result.length === 0) {
221
+ return Promise.reject(new Error('Entity not found'));
222
+ }
223
+ return result[0];
224
+ }
225
+ getPage() {
226
+ const page = 'page=';
227
+ if (this.paginator && this.paginator.page) {
228
+ return `${page + this.paginator.page}&`;
229
+ }
230
+ return '';
231
+ }
232
+ getPaginatorLimit(filter) {
233
+ if (this.paginator && this.paginator.perPage) {
234
+ return { ...filter, limit: this.paginator.perPage };
235
+ }
236
+ return filter;
237
+ }
238
+ getPopulate() {
239
+ const populate = [];
240
+ this.populateArray.forEach(relation => {
241
+ if (typeof relation === 'string') {
242
+ populate.push({ relation });
243
+ }
244
+ else if (Array.isArray(relation)) {
245
+ relation.forEach(nestedRelation => {
246
+ if (typeof nestedRelation === 'string') {
247
+ populate.push({ relation: nestedRelation });
248
+ }
249
+ else if (typeof nestedRelation === 'object') {
250
+ populate.push(nestedRelation);
251
+ }
252
+ });
253
+ }
254
+ else if (typeof relation === 'object') {
255
+ populate.push(relation);
256
+ }
257
+ });
258
+ return populate;
259
+ }
260
+ getGeneratedQuery() {
261
+ let queryBuilder = this.getFilters();
262
+ const select = this.getSelect();
263
+ if (select.length > 0) {
264
+ queryBuilder = queryBuilder.select(...this.getSelect());
265
+ }
266
+ const limit = this.getLimit();
267
+ if (limit > 0) {
268
+ queryBuilder = queryBuilder.limit(limit);
269
+ }
270
+ const skip = this.getSkip();
271
+ if (skip) {
272
+ queryBuilder = queryBuilder.offset(skip);
273
+ }
274
+ const order = this.getOrderBy();
275
+ if (order[0] && order[0] !== '') {
276
+ const fieldPath = new firestore_1.FieldPath(order[0] || '');
277
+ const orderByOrder = order[1] || 'desc';
278
+ queryBuilder = queryBuilder.orderBy(fieldPath, orderByOrder);
279
+ }
280
+ return queryBuilder;
281
+ }
282
+ getFilters() {
283
+ const andFilters = this.whereArray;
284
+ const orFilters = this.orWhereArray;
285
+ if (!andFilters || andFilters.length === 0) {
286
+ return this.collection;
287
+ }
288
+ let filterQuery;
289
+ andFilters.forEach((condition, index) => {
290
+ const element = condition[0];
291
+ const operator = condition[1];
292
+ const value = condition[2];
293
+ if (index === 0) {
294
+ filterQuery = this.collection;
295
+ }
296
+ switch (operator) {
297
+ case '=':
298
+ filterQuery = filterQuery.where(element, '==', value);
299
+ break;
300
+ case '!=':
301
+ filterQuery = filterQuery.where(element, '!=', value);
302
+ break;
303
+ case '>':
304
+ filterQuery = filterQuery.where(element, operator, value);
305
+ break;
306
+ case '>=':
307
+ filterQuery = filterQuery.where(element, operator, value);
308
+ break;
309
+ case '<':
310
+ filterQuery = filterQuery.where(element, operator, value);
311
+ break;
312
+ case '<=':
313
+ filterQuery = filterQuery.where(element, operator, value);
314
+ break;
315
+ case 'in':
316
+ filterQuery = filterQuery.where(element, 'in', value);
317
+ break;
318
+ case 'array-contains':
319
+ filterQuery = filterQuery.where(element, 'array-contains', value);
320
+ break;
321
+ case 'nin':
322
+ throw new Error('The nin Operator cannot be used in Firabase');
323
+ break;
324
+ case 'exists':
325
+ throw new Error('The nin Operator cannot be used in Firabase');
326
+ break;
327
+ case '!exists':
328
+ throw new Error('The !exists Operator cannot be used in Firabase');
329
+ break;
330
+ case 'regexp':
331
+ throw new Error('The regexp Operator cannot be used in Firabase');
332
+ break;
333
+ }
334
+ });
335
+ return filterQuery;
336
+ }
337
+ getOrderBy() {
338
+ if (!this.orderByArray || this.orderByArray.length === 0) {
339
+ return [];
340
+ }
341
+ return [this.orderByArray[0], this.orderByArray[1].toLowerCase()];
342
+ }
343
+ getLimit() {
344
+ if (!this.limitNumber || this.limitNumber === 0) {
345
+ this.limitNumber = (this.rawQuery && this.rawQuery.limit) || 20;
346
+ }
347
+ return this.limitNumber;
348
+ }
349
+ getSkip() {
350
+ if (!this.offsetNumber) {
351
+ this.offsetNumber = (this.rawQuery && this.rawQuery.skip) || 0;
352
+ }
353
+ return this.offsetNumber;
354
+ }
355
+ getSelect() {
356
+ let select = this.selectArray;
357
+ select = select.map(s => {
358
+ s = s.split(' as ')[0];
359
+ s = s.includes('id') ? 'id' : s;
360
+ return s;
361
+ });
362
+ if (select.find(e => e.startsWith('data.'))) {
363
+ select.unshift('data');
364
+ }
365
+ if (!select) {
366
+ return [];
367
+ }
368
+ return select;
369
+ }
370
+ deleteQueryBatch(db, query, batchSize, resolve, reject) {
371
+ query
372
+ .get()
373
+ .then(snapshot => {
374
+ if (snapshot.size == 0) {
375
+ return 0;
376
+ }
377
+ const batch = db.batch();
378
+ snapshot.docs.forEach(doc => {
379
+ batch.delete(doc.ref);
380
+ });
381
+ return batch.commit().then(() => snapshot.size);
382
+ })
383
+ .then(numDeleted => {
384
+ if (numDeleted === 0) {
385
+ resolve();
386
+ return;
387
+ }
388
+ process.nextTick(() => {
389
+ this.deleteQueryBatch(db, query, batchSize, resolve, reject);
390
+ });
391
+ })
392
+ .catch(reject);
393
+ }
394
+ }
395
+ exports.FirebaseConnector = FirebaseConnector;
@@ -0,0 +1,8 @@
1
+ interface ConnectionOptions {
2
+ host?: string;
3
+ port?: number;
4
+ databaseName?: string;
5
+ serviceAccountPath?: string;
6
+ }
7
+ export declare const FirebaseInit: ({ host, port, databaseName, serviceAccountPath }: ConnectionOptions) => void;
8
+ export {};
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FirebaseInit = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const admin = tslib_1.__importStar(require("firebase-admin"));
6
+ const fireorm = tslib_1.__importStar(require("fireorm"));
7
+ const FirebaseInit = ({ host, port, databaseName, serviceAccountPath }) => {
8
+ if (admin.apps.length) {
9
+ return;
10
+ }
11
+ if (host && port) {
12
+ process.env.FIRESTORE_EMULATOR_HOST = `${host}:${port}`;
13
+ }
14
+ const serviceAccount = serviceAccountPath
15
+ ? require(serviceAccountPath)
16
+ : undefined;
17
+ admin.initializeApp({
18
+ projectId: databaseName,
19
+ credential: serviceAccount
20
+ ? admin.credential.cert(serviceAccount)
21
+ : admin.credential.applicationDefault()
22
+ });
23
+ const fireStore = admin.firestore();
24
+ fireStore.settings({ ignoreUndefinedProperties: true });
25
+ fireorm.initialize(fireStore);
26
+ if (!fireStore) {
27
+ throw new Error('Could not initialize FireStore');
28
+ }
29
+ };
30
+ exports.FirebaseInit = FirebaseInit;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const car_entity_1 = require("./test/relations/car/car.entity");
4
+ const car_repositoryFirebase_1 = require("./test/relations/car/car.repositoryFirebase");
5
+ const firebase_repository_1 = require("./test/advanced/firebase.repository");
6
+ const fluent_1 = require("@goatlab/fluent");
7
+ const goat_entity_1 = require("./test/basic/goat.entity");
8
+ const goat_repository_1 = require("./test/goat.repository");
9
+ const roles_entity_1 = require("./test/relations/roles/roles.entity");
10
+ const roles_repositoryFirebase_1 = require("./test/relations/roles/roles.repositoryFirebase");
11
+ const roles_user_entity_1 = require("./test/relations/roles/roles_user.entity");
12
+ const typeOrm_entity_1 = require("./test/advanced/typeOrm.entity");
13
+ const user_repositoryFirebase_1 = require("./test/relations/user/user.repositoryFirebase");
14
+ const user_entity_1 = require("./test/relations/user/user.entity");
15
+ const advancedTestSuite_1 = require("./test/advanced/advancedTestSuite");
16
+ const basicTestSuite_1 = require("./test/basic/basicTestSuite");
17
+ const relationsTestsSuite_1 = require("./test/relations/relationsTestsSuite");
18
+ jest.setTimeout(3 * 60 * 1000);
19
+ beforeAll(async () => {
20
+ await fluent_1.Fluent.models([
21
+ goat_entity_1.GoatEntity,
22
+ typeOrm_entity_1.TypeORMDataModel,
23
+ car_entity_1.CarsEntity,
24
+ user_entity_1.UsersEntity,
25
+ roles_entity_1.RoleEntity,
26
+ roles_user_entity_1.RolesUser
27
+ ]);
28
+ });
29
+ describe('Execute all basic test Suite', () => {
30
+ (0, basicTestSuite_1.basicTestSuite)(goat_repository_1.GoatEntityRepository);
31
+ });
32
+ describe('Execute all advanced', () => {
33
+ (0, advancedTestSuite_1.advancedTestSuite)(firebase_repository_1.FirebaseRepository);
34
+ });
35
+ describe('Execute all relations test suite', () => {
36
+ (0, relationsTestsSuite_1.relationsTestSuite)(user_repositoryFirebase_1.UserRepository, car_repositoryFirebase_1.CarsRepository, roles_repositoryFirebase_1.RoleRepository);
37
+ });
@@ -0,0 +1,3 @@
1
+ import { FirebaseConnector } from './FirebaseConnector';
2
+ import { FirebaseInit } from './FirebaseInit';
3
+ export { FirebaseConnector, FirebaseInit };
package/dist/index.js CHANGED
@@ -5,4 +5,3 @@ const FirebaseConnector_1 = require("./FirebaseConnector");
5
5
  Object.defineProperty(exports, "FirebaseConnector", { enumerable: true, get: function () { return FirebaseConnector_1.FirebaseConnector; } });
6
6
  const FirebaseInit_1 = require("./FirebaseInit");
7
7
  Object.defineProperty(exports, "FirebaseInit", { enumerable: true, get: function () { return FirebaseInit_1.FirebaseInit; } });
8
- //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ export declare const advancedTestSuite: (Model: any) => void;
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.advancedTestSuite = void 0;
4
+ const advancedTestSuite = Model => {
5
+ beforeAll(() => {
6
+ try {
7
+ Model = new Model();
8
+ }
9
+ catch (error) { }
10
+ });
11
+ const insertTestData = async (Repository) => {
12
+ await Repository.insert({
13
+ created: '2018-12-03',
14
+ nestedTest: {
15
+ a: [6, 5, 4],
16
+ b: { c: true, d: [2, 1, 0] },
17
+ c: 4
18
+ },
19
+ order: 1,
20
+ test: true
21
+ });
22
+ await Repository.insert({
23
+ created: '2017-12-03',
24
+ nestedTest: {
25
+ a: [3, 2, 1],
26
+ b: { c: true, d: [1, 1, 0] },
27
+ c: 3
28
+ },
29
+ order: 2,
30
+ test: false
31
+ });
32
+ await Repository.insert({
33
+ created: '2016-12-03',
34
+ nestedTest: {
35
+ a: [0, -1, -2],
36
+ b: { c: true, d: [0, 1, 0] },
37
+ c: 2
38
+ },
39
+ order: 3,
40
+ test: false
41
+ });
42
+ };
43
+ it('Should get local data', async () => {
44
+ await insertTestData(Model);
45
+ const data = await Model.all();
46
+ expect(Array.isArray(data)).toBe(true);
47
+ expect(typeof data[0].nestedTest.b.c).toBe('boolean');
48
+ });
49
+ it('pluck() should return a single array', async () => {
50
+ await insertTestData(Model);
51
+ const data = await Model.pluck(Model._keys.test);
52
+ expect(typeof data[0]).toBe('boolean');
53
+ });
54
+ it('orderBy() should order results desc', async () => {
55
+ await insertTestData(Model);
56
+ const forms = await Model.select(Model._keys.test, Model._keys.nestedTest.b.c, Model._keys.order)
57
+ .orderBy(Model._keys.order, 'desc')
58
+ .get();
59
+ expect(forms[0].order).toBe(3);
60
+ expect(forms[0].nestedTest.b.c).toBe(true);
61
+ });
62
+ it('orderBy() should order results asc', async () => {
63
+ await insertTestData(Model);
64
+ const forms = await Model.select(Model._keys.test, Model._keys.nestedTest.b.c, Model._keys.order)
65
+ .orderBy(Model._keys.order, 'asc')
66
+ .get();
67
+ expect(forms[0].order).toBe(1);
68
+ });
69
+ it('orderBy() should order by Dates with Select()', async () => {
70
+ await insertTestData(Model);
71
+ const forms = await Model.select(Model._keys.created, Model._keys.order)
72
+ .orderBy(Model._keys.created, 'asc', 'date')
73
+ .get();
74
+ expect(forms[0].order).toBe(3);
75
+ });
76
+ it('orderBy() should order by Dates without Select()', async () => {
77
+ await insertTestData(Model);
78
+ const forms = await Model.orderBy(Model._keys.created, 'asc', 'date').get();
79
+ expect(forms[0].order).toBe(3);
80
+ });
81
+ it('limit() should limit the amount of results', async () => {
82
+ await insertTestData(Model);
83
+ const forms = await Model.select(Model._keys.created, Model._keys.order)
84
+ .orderBy(Model._keys.created, 'asc', 'date')
85
+ .limit(2)
86
+ .get();
87
+ expect(forms.length > 0).toBe(true);
88
+ expect(forms.length <= 2).toBe(true);
89
+ });
90
+ it('offset() should start at the given position', async () => {
91
+ await insertTestData(Model);
92
+ const forms = await Model.select(Model._keys.created, Model._keys.order)
93
+ .offset(1)
94
+ .limit(1)
95
+ .get();
96
+ expect(forms.length).toBe(1);
97
+ });
98
+ it('where() should filter the data', async () => {
99
+ await insertTestData(Model);
100
+ const forms = await Model.where(Model._keys.nestedTest.c, '>=', 3).get();
101
+ expect(forms.length > 0).toBe(true);
102
+ forms.forEach(form => {
103
+ expect(form.nestedTest.c >= 3).toBe(true);
104
+ });
105
+ });
106
+ it('first() should take the first result from data', async () => {
107
+ await insertTestData(Model);
108
+ const form = await Model.select(Model._keys.nestedTest.c, Model._keys.id)
109
+ .where(Model._keys.nestedTest.c, '>=', 3)
110
+ .first();
111
+ expect(typeof form.nestedTest.c).toBe('number');
112
+ });
113
+ };
114
+ exports.advancedTestSuite = advancedTestSuite;
@@ -0,0 +1,5 @@
1
+ import { FirebaseConnector } from '../../FirebaseConnector';
2
+ import { TypeORMDataModel } from './typeOrm.entity';
3
+ export declare class FirebaseRepository extends FirebaseConnector<TypeORMDataModel> {
4
+ constructor(relations?: any);
5
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FirebaseRepository = void 0;
4
+ const FirebaseConnector_1 = require("../../FirebaseConnector");
5
+ const typeOrm_entity_1 = require("./typeOrm.entity");
6
+ class FirebaseRepository extends FirebaseConnector_1.FirebaseConnector {
7
+ constructor(relations) {
8
+ super(typeOrm_entity_1.TypeORMDataModel, 'runningTest');
9
+ }
10
+ }
11
+ exports.FirebaseRepository = FirebaseRepository;