@goatlab/fluent-loki 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/Loki.d.ts +22 -0
  2. package/dist/Loki.js +57 -0
  3. package/dist/LokiConnector.d.ts +32 -13
  4. package/dist/LokiConnector.js +319 -118
  5. package/dist/index.d.ts +2 -1
  6. package/dist/index.js +3 -1
  7. package/dist/{Database.spec.d.ts → test/Database.spec.d.ts} +0 -0
  8. package/dist/{Database.spec.js → test/Database.spec.js} +8 -7
  9. package/dist/{LokiConnector.spec.d.ts → test/LokiConnector.spec.d.ts} +0 -0
  10. package/dist/test/LokiConnector.spec.js +14 -0
  11. package/dist/test/goat.loki.repository.d.ts +5 -0
  12. package/dist/test/goat.loki.repository.js +16 -0
  13. package/dist/test/loki.datasource.d.ts +1 -0
  14. package/dist/test/loki.datasource.js +8 -0
  15. package/dist/tsconfig.tsbuildinfo +1 -1
  16. package/package.json +6 -25
  17. package/dist/Database.d.ts +0 -19
  18. package/dist/Database.js +0 -84
  19. package/dist/LokiConnector.spec.js +0 -21
  20. package/dist/test/advanced/advancedTestSuite.d.ts +0 -1
  21. package/dist/test/advanced/advancedTestSuite.js +0 -114
  22. package/dist/test/advanced/typeOrm.entity.d.ts +0 -16
  23. package/dist/test/advanced/typeOrm.entity.js +0 -57
  24. package/dist/test/advanced/typeOrm.repository.d.ts +0 -5
  25. package/dist/test/advanced/typeOrm.repository.js +0 -11
  26. package/dist/test/basic/basicTestSuite.d.ts +0 -1
  27. package/dist/test/basic/basicTestSuite.js +0 -45
  28. package/dist/test/basic/goat.dto.d.ts +0 -8
  29. package/dist/test/basic/goat.dto.js +0 -18
  30. package/dist/test/basic/goat.entity.d.ts +0 -10
  31. package/dist/test/basic/goat.entity.js +0 -41
  32. package/dist/test/basic/goat.repository.d.ts +0 -6
  33. package/dist/test/basic/goat.repository.js +0 -11
  34. package/dist/test/flock.d.ts +0 -4
  35. package/dist/test/flock.js +0 -25
  36. package/dist/test/relations/car/car.dto.d.ts +0 -5
  37. package/dist/test/relations/car/car.dto.js +0 -12
  38. package/dist/test/relations/car/car.entity.d.ts +0 -7
  39. package/dist/test/relations/car/car.entity.js +0 -32
  40. package/dist/test/relations/car/car.repositoryTypeOrm.d.ts +0 -8
  41. package/dist/test/relations/car/car.repositoryTypeOrm.js +0 -13
  42. package/dist/test/relations/relationsTestsSuite.d.ts +0 -1
  43. package/dist/test/relations/relationsTestsSuite.js +0 -93
  44. package/dist/test/relations/roles/role.dto.d.ts +0 -5
  45. package/dist/test/relations/roles/role.dto.js +0 -12
  46. package/dist/test/relations/roles/roles.entity.d.ts +0 -6
  47. package/dist/test/relations/roles/roles.entity.js +0 -29
  48. package/dist/test/relations/roles/roles.repositoryTypeOrm.d.ts +0 -8
  49. package/dist/test/relations/roles/roles.repositoryTypeOrm.js +0 -14
  50. package/dist/test/relations/roles/roles_user.dto.d.ts +0 -5
  51. package/dist/test/relations/roles/roles_user.dto.js +0 -12
  52. package/dist/test/relations/roles/roles_user.entity.d.ts +0 -5
  53. package/dist/test/relations/roles/roles_user.entity.js +0 -23
  54. package/dist/test/relations/roles/roles_users.repositoryTypeOrm.d.ts +0 -6
  55. package/dist/test/relations/roles/roles_users.repositoryTypeOrm.js +0 -11
  56. package/dist/test/relations/user/user.dto.d.ts +0 -5
  57. package/dist/test/relations/user/user.dto.js +0 -12
  58. package/dist/test/relations/user/user.entity.d.ts +0 -14
  59. package/dist/test/relations/user/user.entity.js +0 -56
  60. package/dist/test/relations/user/user.repositoryTypeOrm.d.ts +0 -10
  61. package/dist/test/relations/user/user.repositoryTypeOrm.js +0 -16
package/dist/Loki.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import LokiJS from 'lokijs';
2
+ export declare enum LokiStorageType {
3
+ indexedDB = "indexedDB",
4
+ memory = "memory",
5
+ fsStructured = "fsStructured",
6
+ file = "file",
7
+ cryptedFile = "cryptedFile"
8
+ }
9
+ export declare type LokiParams = {
10
+ dbName: string;
11
+ storage: LokiStorageType;
12
+ secret?: string;
13
+ };
14
+ export declare type LokiCreateParams<T extends LokiParams> = T extends {
15
+ storage: LokiStorageType.cryptedFile;
16
+ } ? {
17
+ secret: string;
18
+ } & LokiParams : LokiParams;
19
+ export declare class LokiClass {
20
+ createDb<T extends LokiParams>({ dbName, storage, secret }: LokiCreateParams<T>): LokiJS;
21
+ }
22
+ export declare const Loki: LokiClass;
package/dist/Loki.js ADDED
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Loki = exports.LokiClass = exports.LokiStorageType = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const lokijs_1 = tslib_1.__importDefault(require("lokijs"));
6
+ const loki_indexed_adapter_1 = tslib_1.__importDefault(require("lokijs/src/loki-indexed-adapter"));
7
+ const loki_fs_structured_adapter_1 = tslib_1.__importDefault(require("lokijs/src/loki-fs-structured-adapter"));
8
+ const loki_crypted_file_adapter_1 = tslib_1.__importDefault(require("lokijs/src/loki-crypted-file-adapter"));
9
+ var LokiStorageType;
10
+ (function (LokiStorageType) {
11
+ LokiStorageType["indexedDB"] = "indexedDB";
12
+ LokiStorageType["memory"] = "memory";
13
+ LokiStorageType["fsStructured"] = "fsStructured";
14
+ LokiStorageType["file"] = "file";
15
+ LokiStorageType["cryptedFile"] = "cryptedFile";
16
+ })(LokiStorageType = exports.LokiStorageType || (exports.LokiStorageType = {}));
17
+ class LokiClass {
18
+ createDb({ dbName, storage, secret }) {
19
+ const dbConfig = {
20
+ autoload: true,
21
+ autosave: true,
22
+ autosaveInterval: 1000,
23
+ throttledSaves: false
24
+ };
25
+ switch (storage) {
26
+ case LokiStorageType.indexedDB:
27
+ return new lokijs_1.default(dbName, {
28
+ ...dbConfig,
29
+ adapter: new lokijs_1.default.LokiPartitioningAdapter(new loki_indexed_adapter_1.default(dbName), {
30
+ paging: true
31
+ })
32
+ });
33
+ case LokiStorageType.file:
34
+ return new lokijs_1.default(dbName, dbConfig);
35
+ case LokiStorageType.memory:
36
+ return new lokijs_1.default(dbName, {
37
+ ...dbConfig,
38
+ adapter: new lokijs_1.default.LokiPartitioningAdapter(new lokijs_1.default.LokiMemoryAdapter())
39
+ });
40
+ case LokiStorageType.fsStructured:
41
+ return new lokijs_1.default(dbName, {
42
+ ...dbConfig,
43
+ adapter: new loki_fs_structured_adapter_1.default()
44
+ });
45
+ case LokiStorageType.cryptedFile:
46
+ loki_crypted_file_adapter_1.default.setSecret(secret);
47
+ return new lokijs_1.default(dbName, { ...dbConfig, adapter: new loki_crypted_file_adapter_1.default() });
48
+ default:
49
+ return new lokijs_1.default(dbName, {
50
+ ...dbConfig,
51
+ adapter: new lokijs_1.default.LokiPartitioningAdapter(new lokijs_1.default.LokiMemoryAdapter())
52
+ });
53
+ }
54
+ }
55
+ }
56
+ exports.LokiClass = LokiClass;
57
+ exports.Loki = new LokiClass();
@@ -1,18 +1,37 @@
1
- import { BaseDataElement, Sure, Filter, PaginatedData, Paginator, BaseConnector, FluentConnectorInterface } from '@goatlab/fluent';
2
- export declare class LokiConnector<ModelDTO = BaseDataElement, InputDTO = ModelDTO, OutputDTO = ModelDTO> extends BaseConnector<ModelDTO, InputDTO, OutputDTO> implements FluentConnectorInterface<InputDTO, OutputDTO> {
3
- private name;
4
- constructor(name: string);
5
- get(): Promise<OutputDTO[]>;
6
- all(): Promise<OutputDTO[]>;
7
- find(filter: Filter): Promise<OutputDTO[]>;
8
- paginate(paginator: Paginator): Promise<PaginatedData<OutputDTO>>;
9
- deleteById(id: string): Promise<string>;
10
- findById(id: string): Promise<OutputDTO>;
1
+ import { AnyObject, BaseConnector, FluentConnectorInterface, FluentQuery, QueryOutput, LoadedResult, FindByIdFilter, SingleQueryOutput } from '@goatlab/fluent';
2
+ import { z } from 'zod';
3
+ import LokiJS, { Collection } from 'lokijs';
4
+ export interface LokiConnectorParams<Input, Output> {
5
+ entity: any;
6
+ dataSource: LokiJS;
7
+ inputSchema: z.ZodType<Input>;
8
+ outputSchema?: z.ZodType<Output>;
9
+ }
10
+ export interface TypeOrmConnectorParams<Input, Output> {
11
+ entity: any;
12
+ dataSource: LokiJS;
13
+ inputSchema: z.ZodType<Input>;
14
+ outputSchema?: z.ZodType<Output>;
15
+ }
16
+ export declare class LokiConnector<ModelDTO = AnyObject, InputDTO = ModelDTO, OutputDTO = ModelDTO> extends BaseConnector<ModelDTO, InputDTO, OutputDTO> implements FluentConnectorInterface<ModelDTO, InputDTO, OutputDTO> {
17
+ private collection;
18
+ private readonly dataSource;
19
+ private readonly inputSchema;
20
+ private readonly outputSchema;
21
+ private readonly entity;
22
+ constructor({ entity, dataSource, inputSchema, outputSchema }: LokiConnectorParams<InputDTO, OutputDTO>);
11
23
  insert(data: InputDTO): Promise<OutputDTO>;
12
24
  insertMany(data: InputDTO[]): Promise<OutputDTO[]>;
25
+ raw(): Collection;
26
+ findMany<T extends FluentQuery<ModelDTO>>(query?: T): Promise<QueryOutput<T, ModelDTO, OutputDTO>>;
13
27
  updateById(id: string, data: InputDTO): Promise<OutputDTO>;
14
- clear({ sure }: Sure): Promise<any>;
15
- private prepareFilter;
28
+ replaceById(id: string, data: InputDTO): Promise<OutputDTO>;
29
+ getLokiWhere(where?: FluentQuery<ModelDTO>['where']): any;
30
+ loadFirst(query?: FluentQuery<ModelDTO>): LokiConnector<ModelDTO, InputDTO, OutputDTO>;
31
+ protected clone(): any;
32
+ loadById(id: string): LoadedResult<this>;
33
+ findByIds<T extends FindByIdFilter<ModelDTO>>(ids: string[], q?: T): Promise<QueryOutput<T, ModelDTO, OutputDTO>>;
34
+ requireById(id: string, q?: FindByIdFilter<ModelDTO>): Promise<SingleQueryOutput<FindByIdFilter<ModelDTO>, ModelDTO, OutputDTO>>;
35
+ clear(): Promise<boolean>;
16
36
  private getLokiOperator;
17
- private getModel;
18
37
  }
@@ -2,146 +2,351 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LokiConnector = void 0;
4
4
  const js_utils_1 = require("@goatlab/js-utils");
5
- const Database_1 = require("./Database");
6
5
  const dates_1 = require("@goatlab/dates");
7
6
  const fluent_1 = require("@goatlab/fluent");
8
7
  class LokiConnector extends fluent_1.BaseConnector {
9
- constructor(name) {
8
+ constructor({ entity, dataSource, inputSchema, outputSchema }) {
10
9
  super();
11
- this.name = 'baseModel';
12
- this.name = name;
13
- }
14
- async get() {
15
- const filterObject = this.prepareFilter();
16
- let data = await (await this.getModel())
17
- .chain()
18
- .find(filterObject)
19
- .offset(this.offsetNumber)
20
- .limit(this.limitNumber)
21
- .data();
22
- data = this.jsApplyOrderBy(data);
23
- this.reset();
24
- return data;
25
- }
26
- async all() {
27
- return this.get();
28
- }
29
- async find(filter) {
30
- return this.get();
31
- }
32
- async paginate(paginator) {
33
- const results = {
34
- current_page: 1,
35
- data: [],
36
- first_page_url: 'response[0].meta.firstPageUrl,',
37
- next_page_url: 'response[0].meta.nextPageUrl',
38
- path: 'response[0].meta.path',
39
- per_page: 1,
40
- prev_page_url: ' response[0].meta.previousPageUrl',
41
- total: 10
42
- };
43
- return results;
44
- }
45
- async deleteById(id) {
46
- if (!id) {
47
- throw new Error('No id assign to remove().You must give and id to delete');
10
+ this.dataSource = dataSource;
11
+ this.inputSchema = inputSchema;
12
+ this.outputSchema =
13
+ outputSchema || inputSchema;
14
+ this.entity = entity;
15
+ const dbModels = [];
16
+ for (const collection of dataSource.collections) {
17
+ dbModels.push(collection.name);
48
18
  }
49
- const model = await this.getModel();
50
- await model.findAndRemove({ id });
51
- this.reset();
52
- return id;
53
- }
54
- async findById(id) {
55
- if (!id) {
56
- throw new Error('No id assign to remove().You must give and id to delete');
19
+ if (!dbModels.includes(entity.name)) {
20
+ dataSource.addCollection(entity.name);
57
21
  }
58
- const model = await this.getModel();
59
- const result = await model.find({
60
- id
61
- });
62
- this.reset();
63
- return result;
22
+ this.dataSource = dataSource;
23
+ this.collection = dataSource.getCollection(entity.name);
24
+ const relationShipBuilder = fluent_1.modelGeneratorDataSource.getRepository(entity);
25
+ const { relations } = (0, fluent_1.getRelationsFromModelGenerator)(relationShipBuilder);
26
+ this.modelRelations = relations;
27
+ this.outputKeys = (0, fluent_1.getOutputKeys)(relationShipBuilder) || [];
64
28
  }
65
29
  async insert(data) {
66
30
  const _data = js_utils_1.Objects.clone(data);
67
- const model = await this.getModel();
31
+ const validatedData = this.inputSchema.parse(_data);
32
+ const id = js_utils_1.Ids.uuid();
68
33
  const inserted = {
69
- ..._data
34
+ id,
35
+ ...validatedData
70
36
  };
71
- model.insert(inserted);
72
- this.reset();
73
- return inserted;
37
+ await this.collection.insert(inserted);
38
+ return this.outputSchema.parse(this.clearEmpties(js_utils_1.Objects.deleteNulls(inserted)));
74
39
  }
75
40
  async insertMany(data) {
41
+ const validatedData = this.inputSchema.array().parse(data);
76
42
  const insertedElements = [];
77
- for (const element of data) {
78
- const inserted = await this.insert({
79
- ...element
43
+ for (const data of validatedData) {
44
+ insertedElements.push({
45
+ ...data,
46
+ id: js_utils_1.Ids.uuid()
80
47
  });
81
- insertedElements.push(inserted);
82
48
  }
83
- this.reset();
84
- return insertedElements;
49
+ await this.collection.insert(insertedElements);
50
+ return this.outputSchema.array().parse(insertedElements.map(d => {
51
+ return this.clearEmpties(js_utils_1.Objects.deleteNulls(d));
52
+ }));
85
53
  }
86
- async updateById(id, data) {
87
- if (!id) {
88
- throw new Error('Loki connector error. Cannot update a Model without id key');
54
+ raw() {
55
+ return this.collection;
56
+ }
57
+ async findMany(query) {
58
+ const where = this.getLokiWhere(query?.where);
59
+ const sort = [];
60
+ let baseQuery = this.collection
61
+ .chain()
62
+ .find(where)
63
+ .offset(query?.offset || 0)
64
+ .limit(query?.limit || 10);
65
+ if (query?.paginated) {
66
+ baseQuery.limit(query.paginated.perPage);
67
+ baseQuery.offset((query.paginated?.page - 1) * query.paginated.perPage);
68
+ }
69
+ if (query?.orderBy) {
70
+ for (const order of query?.orderBy) {
71
+ const flattenObject = js_utils_1.Objects.flatten(order);
72
+ for (const attribute of Object.keys(flattenObject)) {
73
+ const isDecending = flattenObject[attribute] === 'desc';
74
+ sort.push([attribute, isDecending]);
75
+ }
76
+ }
77
+ baseQuery = baseQuery.compoundsort(sort);
78
+ }
79
+ let found = baseQuery.data();
80
+ found.map(d => {
81
+ this.clearEmpties(js_utils_1.Objects.deleteNulls(d));
82
+ });
83
+ if (query?.paginated) {
84
+ const paginationInfo = {
85
+ total: 0,
86
+ perPage: query.paginated.perPage,
87
+ currentPage: query.paginated.page,
88
+ nextPage: query.paginated.page + 1,
89
+ firstPage: 1,
90
+ lastPage: Math.ceil(1 / query.paginated.perPage),
91
+ prevPage: query.paginated.page === 1 ? null : query.paginated.page - 1,
92
+ from: (query.paginated.page - 1) * query.paginated.perPage + 1,
93
+ to: query.paginated.perPage * query.paginated.page,
94
+ data: found
95
+ };
96
+ return paginationInfo;
97
+ }
98
+ if (query?.select) {
99
+ const selectedAttributes = this.jsApplySelect(query?.select, found);
100
+ return selectedAttributes;
89
101
  }
90
- const model = await this.getModel();
91
- const local = await model.findOne({ id });
102
+ return this.outputSchema?.array().parse(found);
103
+ }
104
+ async updateById(id, data) {
105
+ const dataToInsert = this.outputKeys.includes('updated')
106
+ ? {
107
+ ...data,
108
+ ...{ updated: new Date() }
109
+ }
110
+ : data;
111
+ const validatedData = this.inputSchema.parse(dataToInsert);
112
+ const local = await this.collection.findOne({ id });
92
113
  const mod = {
93
114
  ...local,
94
- ...data,
95
- ...{ modified: dates_1.Dates.currentIsoString() }
115
+ ...validatedData,
116
+ modified: dates_1.Dates.currentIsoString()
96
117
  };
97
- const updated = model.update(mod);
98
- this.reset();
99
- return updated;
118
+ const dbResult = await this.collection.update(mod);
119
+ return this.outputSchema?.parse(this.clearEmpties(js_utils_1.Objects.deleteNulls(dbResult)));
100
120
  }
101
- async clear({ sure }) {
102
- const model = await this.getModel();
103
- return model.clear({ removeIndices: true });
121
+ async replaceById(id, data) {
122
+ let value = await this.collection.findOne({ id });
123
+ const flatValue = js_utils_1.Objects.flatten(JSON.parse(JSON.stringify(value)));
124
+ Object.keys(flatValue).forEach(key => {
125
+ flatValue[key] = null;
126
+ });
127
+ const nullObject = js_utils_1.Objects.nest(flatValue);
128
+ const newValue = { ...nullObject, ...data };
129
+ delete newValue._id;
130
+ delete newValue.id;
131
+ delete newValue.created;
132
+ delete newValue.updated;
133
+ const dataToInsert = this.outputKeys.includes('updated')
134
+ ? {
135
+ ...data,
136
+ ...{ updated: new Date() }
137
+ }
138
+ : data;
139
+ const validatedData = this.inputSchema.parse(dataToInsert);
140
+ value = { ...value, ...validatedData };
141
+ await this.collection.update(value);
142
+ const val = await this.collection.findOne({ id });
143
+ return this.outputSchema.parse(this.clearEmpties(js_utils_1.Objects.deleteNulls(val)));
104
144
  }
105
- prepareFilter() {
106
- const andObject = { $and: [] };
107
- const orObject = { $or: [] };
108
- let globalFilter = {};
109
- if (this.whereArray.length > 0) {
110
- this.whereArray.forEach(c => {
111
- const conditionToObject = {};
112
- if (c[0].includes('[')) {
113
- throw new Error(`Error in: "${c[0]}" "Where" close does not work with Array elements`);
114
- }
115
- conditionToObject[c[0]] = {};
116
- const lokiOperator = this.getLokiOperator(c[1]);
117
- conditionToObject[c[0]][lokiOperator] = c[2];
118
- if (lokiOperator.includes('$regex|')) {
119
- delete conditionToObject[c[0]][lokiOperator];
120
- conditionToObject[c[0]].$regex = lokiOperator
121
- .replace('$regex|', '')
122
- .replace('{{$var}}', c[2]);
123
- }
124
- andObject.$and.push(conditionToObject);
125
- });
126
- globalFilter = andObject;
145
+ getLokiWhere(where) {
146
+ if (!where || Object.keys(where).length === 0) {
147
+ return {};
148
+ }
149
+ const Filters = {
150
+ where: { $or: [{ $and: [] }] }
151
+ };
152
+ const orConditions = this.extractConditions(where['OR']);
153
+ const andConditions = this.extractConditions(where['AND']);
154
+ const copy = js_utils_1.Objects.clone(where);
155
+ if (!!copy['AND']) {
156
+ delete copy['AND'];
157
+ }
158
+ if (!!copy['OR']) {
159
+ delete copy['OR'];
160
+ }
161
+ const rootLevelConditions = this.extractConditions([copy]);
162
+ for (const condition of andConditions) {
163
+ let { element, operator, value } = condition;
164
+ if (element === 'id') {
165
+ element = '_id';
166
+ }
167
+ switch (operator) {
168
+ case fluent_1.LogicOperator.equals:
169
+ Filters.where.$or[0].$and.push({ [element]: { $eq: value } });
170
+ break;
171
+ case fluent_1.LogicOperator.isNot:
172
+ Filters.where.$or[0].$and.push({ [element]: { $neq: value } });
173
+ break;
174
+ case fluent_1.LogicOperator.greaterThan:
175
+ Filters.where.$or[0].$and.push({ [element]: { $gt: value } });
176
+ break;
177
+ case fluent_1.LogicOperator.greaterOrEqualThan:
178
+ Filters.where.$or[0].$and.push({ [element]: { $gte: value } });
179
+ break;
180
+ case fluent_1.LogicOperator.lessThan:
181
+ Filters.where.$or[0].$and.push({ [element]: { $lt: value } });
182
+ break;
183
+ case fluent_1.LogicOperator.lessOrEqualThan:
184
+ Filters.where.$or[0].$and.push({ [element]: { $lte: value } });
185
+ break;
186
+ case fluent_1.LogicOperator.in:
187
+ Filters.where.$or[0].$and.push({ [element]: { $in: value } });
188
+ break;
189
+ case fluent_1.LogicOperator.notIn:
190
+ Filters.where.$or[0].$and.push({
191
+ [element]: { $not: { $in: value } }
192
+ });
193
+ break;
194
+ case fluent_1.LogicOperator.exists:
195
+ Filters.where.$or[0].$and.push({ [element]: { $exists: true } });
196
+ break;
197
+ case fluent_1.LogicOperator.notExists:
198
+ Filters.where.$or[0].$and.push({ [element]: { $exists: false } });
199
+ break;
200
+ case fluent_1.LogicOperator.regexp:
201
+ Filters.where.$or[0].$and.push({ [element]: { $regex: value } });
202
+ break;
203
+ }
204
+ }
205
+ for (const condition of rootLevelConditions) {
206
+ let { element, operator, value } = condition;
207
+ if (element === 'id') {
208
+ element = '_id';
209
+ }
210
+ switch (operator) {
211
+ case fluent_1.LogicOperator.equals:
212
+ Filters.where.$or[0].$and.push({ [element]: { $eq: value } });
213
+ break;
214
+ case fluent_1.LogicOperator.isNot:
215
+ Filters.where.$or[0].$and.push({ [element]: { $neq: value } });
216
+ break;
217
+ case fluent_1.LogicOperator.greaterThan:
218
+ Filters.where.$or[0].$and.push({ [element]: { $gt: value } });
219
+ break;
220
+ case fluent_1.LogicOperator.greaterOrEqualThan:
221
+ Filters.where.$or[0].$and.push({ [element]: { $gte: value } });
222
+ break;
223
+ case fluent_1.LogicOperator.lessThan:
224
+ Filters.where.$or[0].$and.push({ [element]: { $lt: value } });
225
+ break;
226
+ case fluent_1.LogicOperator.lessOrEqualThan:
227
+ Filters.where.$or[0].$and.push({ [element]: { $lte: value } });
228
+ break;
229
+ case fluent_1.LogicOperator.in:
230
+ Filters.where.$or[0].$and.push({ [element]: { $in: value } });
231
+ break;
232
+ case fluent_1.LogicOperator.notIn:
233
+ Filters.where.$or[0].$and.push({
234
+ [element]: { $not: { $in: value } }
235
+ });
236
+ break;
237
+ case fluent_1.LogicOperator.exists:
238
+ Filters.where.$or[0].$and.push({ [element]: { $exists: true } });
239
+ break;
240
+ case fluent_1.LogicOperator.notExists:
241
+ Filters.where.$or[0].$and.push({ [element]: { $exists: false } });
242
+ break;
243
+ case fluent_1.LogicOperator.regexp:
244
+ Filters.where.$or[0].$and.push({ [element]: { $regex: value } });
245
+ break;
246
+ }
127
247
  }
128
- if (this.orWhereArray.length > 0) {
129
- this.orWhereArray.forEach(c => {
130
- const conditionToObject = {};
131
- conditionToObject[c[0]] = {};
132
- const lokiOperator = this.getLokiOperator(c[1]);
133
- conditionToObject[c[0]][lokiOperator] = c[2];
134
- if (lokiOperator.includes('$regex|')) {
135
- delete conditionToObject[c[0]][lokiOperator];
136
- conditionToObject[c[0]].$regex = lokiOperator
137
- .replace('$regex|', '')
138
- .replace('{{$var}}', c[2]);
248
+ for (const condition of orConditions) {
249
+ let { element, operator, value } = condition;
250
+ if (element === 'id') {
251
+ element = 'id';
252
+ }
253
+ switch (operator) {
254
+ case fluent_1.LogicOperator.equals:
255
+ Filters.where.$or.push({ [element]: { $eq: value } });
256
+ break;
257
+ case fluent_1.LogicOperator.isNot:
258
+ Filters.where.$or.push({ [element]: { $neq: value } });
259
+ break;
260
+ case fluent_1.LogicOperator.greaterThan:
261
+ Filters.where.$or.push({ [element]: { $gt: value } });
262
+ break;
263
+ case fluent_1.LogicOperator.greaterOrEqualThan:
264
+ Filters.where.$or.push({ [element]: { $gte: value } });
265
+ break;
266
+ case fluent_1.LogicOperator.lessThan:
267
+ Filters.where.$or.push({ [element]: { $lt: value } });
268
+ break;
269
+ case fluent_1.LogicOperator.lessOrEqualThan:
270
+ Filters.where.$or.push({ [element]: { $lte: value } });
271
+ break;
272
+ case fluent_1.LogicOperator.in:
273
+ Filters.where.$or.push({ [element]: { $in: value } });
274
+ break;
275
+ case fluent_1.LogicOperator.notIn:
276
+ Filters.where.$or.push({
277
+ [element]: { $not: { $in: value } }
278
+ });
279
+ break;
280
+ case fluent_1.LogicOperator.exists:
281
+ Filters.where.$or.push({ [element]: { $exists: true } });
282
+ break;
283
+ case fluent_1.LogicOperator.notExists:
284
+ Filters.where.$or.push({ [element]: { $exists: false } });
285
+ break;
286
+ case fluent_1.LogicOperator.regexp:
287
+ Filters.where.$or.push({ [element]: { $regex: value } });
288
+ break;
289
+ }
290
+ }
291
+ return this.clearEmpties(Filters.where);
292
+ }
293
+ loadFirst(query) {
294
+ const detachedClass = Object.assign(Object.create(Object.getPrototypeOf(this)), this);
295
+ detachedClass.setRelatedQuery({
296
+ entity: this.entity,
297
+ repository: this,
298
+ query
299
+ });
300
+ return detachedClass;
301
+ }
302
+ clone() {
303
+ return new this.constructor();
304
+ }
305
+ loadById(id) {
306
+ const newInstance = this.clone();
307
+ newInstance.setRelatedQuery({
308
+ entity: this.entity,
309
+ repository: this,
310
+ query: {
311
+ where: {
312
+ id
139
313
  }
140
- orObject.$or.push(conditionToObject);
141
- });
142
- globalFilter = { $or: [andObject, orObject] };
314
+ }
315
+ });
316
+ return newInstance;
317
+ }
318
+ async findByIds(ids, q) {
319
+ let data = await this.findMany({
320
+ where: {
321
+ id: {
322
+ in: ids
323
+ }
324
+ },
325
+ limit: q?.limit,
326
+ select: q?.select,
327
+ include: q?.include
328
+ });
329
+ return this.outputSchema?.array().parse(data);
330
+ }
331
+ async requireById(id, q) {
332
+ const found = await this.findByIds([id], {
333
+ select: q?.select,
334
+ include: q?.include,
335
+ limit: 1
336
+ });
337
+ found.map(d => {
338
+ if (this.isMongoDB) {
339
+ d['id'] = d['id'].toString();
340
+ }
341
+ this.clearEmpties(js_utils_1.Objects.deleteNulls(d));
342
+ });
343
+ if (!found[0]) {
344
+ throw new Error(`Object ${id} not found`);
143
345
  }
144
- return globalFilter;
346
+ return this.outputSchema?.parse(found[0]);
347
+ }
348
+ async clear() {
349
+ return true;
145
350
  }
146
351
  getLokiOperator(operator) {
147
352
  const lokiOperators = {
@@ -166,9 +371,5 @@ class LokiConnector extends fluent_1.BaseConnector {
166
371
  }
167
372
  return converted;
168
373
  }
169
- async getModel() {
170
- const DB = await Database_1.Database.get();
171
- return DB.getCollection(this.name);
172
- }
173
374
  }
174
375
  exports.LokiConnector = LokiConnector;
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  import { LokiConnector } from './LokiConnector';
2
- export { LokiConnector };
2
+ import { Loki } from './Loki';
3
+ export { LokiConnector, Loki };
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LokiConnector = void 0;
3
+ exports.Loki = exports.LokiConnector = void 0;
4
4
  const LokiConnector_1 = require("./LokiConnector");
5
5
  Object.defineProperty(exports, "LokiConnector", { enumerable: true, get: function () { return LokiConnector_1.LokiConnector; } });
6
+ const Loki_1 = require("./Loki");
7
+ Object.defineProperty(exports, "Loki", { enumerable: true, get: function () { return Loki_1.Loki; } });
@@ -2,10 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const lokijs_1 = tslib_1.__importDefault(require("lokijs"));
5
- const Database_1 = require("./Database");
5
+ const Loki_1 = require("../Loki");
6
6
  let db;
7
- beforeAll(async () => {
8
- db = await Database_1.Database.get();
7
+ beforeAll(() => {
8
+ db = Loki_1.Loki.createDb({ dbName: 'GOAT', storage: Loki_1.LokiStorageType.memory });
9
9
  });
10
10
  it('Should return and instance of LockiJS DB', () => {
11
11
  const isLoki = db instanceof lokijs_1.default;
@@ -16,10 +16,11 @@ it('Should be named GOAT', () => {
16
16
  });
17
17
  it('Should start with no collections', () => {
18
18
  const expectedCollections = [];
19
- const dbCollections = db.collections.reduce((dbColArray, dbCol) => {
20
- dbColArray.push(dbCol.name);
21
- return dbColArray;
22
- }, []);
19
+ const dbCollections = [];
20
+ for (const collection of db.collections) {
21
+ dbCollections.push(collection.name);
22
+ }
23
+ expect(expectedCollections.length).toBe(dbCollections.length);
23
24
  const uniqueCollections = {};
24
25
  expectedCollections.forEach((collection, index) => {
25
26
  uniqueCollections[collection] = true;