@goatlab/fluent 0.7.6 → 0.7.11

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 (86) hide show
  1. package/dist/BaseConnector.d.ts +8 -31
  2. package/dist/BaseConnector.js +11 -104
  3. package/dist/FluentConnectorInterface.d.ts +17 -0
  4. package/dist/FluentConnectorInterface.js +2 -0
  5. package/dist/TypeOrmConnector/TypeOrmConnector.d.ts +8 -12
  6. package/dist/TypeOrmConnector/TypeOrmConnector.js +183 -546
  7. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.d.ts +7 -0
  8. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.js +148 -0
  9. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.d.ts +6 -0
  10. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.js +34 -0
  11. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.d.ts +4 -0
  12. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.js +12 -0
  13. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.d.ts +6 -0
  14. package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.js +166 -0
  15. package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.d.ts +8 -0
  16. package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.js +200 -0
  17. package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.d.ts +6 -0
  18. package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.js +207 -0
  19. package/dist/TypeOrmConnector/test/basic/basicTestSuite.js +164 -0
  20. package/dist/TypeOrmConnector/test/basic/goat.entity.d.ts +3 -3
  21. package/dist/TypeOrmConnector/test/basic/goat.entity.js +1 -1
  22. package/dist/TypeOrmConnector/test/docker/docker.d.ts +1 -1
  23. package/dist/TypeOrmConnector/test/docker/docker.js +3 -4
  24. package/dist/TypeOrmConnector/test/docker/mongo.d.ts +16 -0
  25. package/dist/TypeOrmConnector/test/docker/mongo.js +93 -0
  26. package/dist/TypeOrmConnector/test/docker/mysql.js +1 -1
  27. package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.d.ts +4 -2
  28. package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.js +6 -1
  29. package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.d.ts +3 -2
  30. package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.js +3 -1
  31. package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.d.ts +2 -2
  32. package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.js +2 -1
  33. package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.d.ts +6 -2
  34. package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.js +10 -1
  35. package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.js +1 -1
  36. package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.d.ts +3 -2
  37. package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.js +3 -1
  38. package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.d.ts +2 -2
  39. package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.js +2 -1
  40. package/dist/TypeOrmConnector/test/relations/car/car.entity.d.ts +0 -1
  41. package/dist/TypeOrmConnector/test/relations/car/car.entity.js +0 -8
  42. package/dist/TypeOrmConnector/test/relations/car/car.output.schema.d.ts +511 -0
  43. package/dist/TypeOrmConnector/test/relations/car/car.output.schema.js +8 -0
  44. package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.d.ts +4 -2
  45. package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.js +6 -1
  46. package/dist/TypeOrmConnector/test/relations/car/car.schema.d.ts +2 -25
  47. package/dist/TypeOrmConnector/test/relations/car/car.schema.js +3 -8
  48. package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.d.ts +1 -1
  49. package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.js +435 -35
  50. package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.d.ts +152 -0
  51. package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.js +14 -0
  52. package/dist/TypeOrmConnector/test/relations/roles/role.schema.d.ts +2 -25
  53. package/dist/TypeOrmConnector/test/relations/roles/role.schema.js +2 -10
  54. package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.d.ts +3 -2
  55. package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.js +3 -1
  56. package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.d.ts +2 -2
  57. package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.js +2 -1
  58. package/dist/TypeOrmConnector/test/relations/user/user.schema.d.ts +465 -69
  59. package/dist/TypeOrmConnector/test/relations/user/user.schema.js +54 -5
  60. package/dist/TypeOrmConnector/util/clearEmpties.d.ts +1 -0
  61. package/dist/TypeOrmConnector/util/clearEmpties.js +25 -0
  62. package/dist/TypeOrmConnector/util/extractConditions.d.ts +6 -0
  63. package/dist/TypeOrmConnector/util/extractConditions.js +80 -0
  64. package/dist/TypeOrmConnector/util/extractInclude.d.ts +2 -0
  65. package/dist/TypeOrmConnector/util/extractInclude.js +25 -0
  66. package/dist/TypeOrmConnector/util/extractMetadataFromKeys.d.ts +12 -0
  67. package/dist/TypeOrmConnector/util/extractMetadataFromKeys.js +42 -0
  68. package/dist/TypeOrmConnector/util/extractOrderBy.d.ts +4 -0
  69. package/dist/TypeOrmConnector/util/extractOrderBy.js +18 -0
  70. package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.d.ts +19 -0
  71. package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.js +26 -0
  72. package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.d.ts +1 -0
  73. package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.js +20 -0
  74. package/dist/TypeOrmConnector/util/isAnyObject.d.ts +1 -0
  75. package/dist/TypeOrmConnector/util/isAnyObject.js +7 -0
  76. package/dist/TypeOrmConnector/util/nestQueryResults.d.ts +2 -0
  77. package/dist/TypeOrmConnector/util/nestQueryResults.js +31 -0
  78. package/dist/index.d.ts +12 -5
  79. package/dist/index.js +15 -2
  80. package/dist/loadRelations.js +8 -10
  81. package/dist/tsconfig.tsbuildinfo +1 -1
  82. package/dist/types.d.ts +37 -20
  83. package/package.json +4 -3
  84. package/CHANGELOG.md +0 -1072
  85. package/dist/TypeOrmConnector/test/mongo/mongo.memory.d.ts +0 -4
  86. package/dist/TypeOrmConnector/test/mongo/mongo.memory.js +0 -43
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clearEmpties = void 0;
4
+ const bson_1 = require("bson");
5
+ const clearEmpties = object => {
6
+ Object.entries(object).forEach(([k, v]) => {
7
+ if (v && typeof v === 'object')
8
+ (0, exports.clearEmpties)(v);
9
+ if ((v && typeof v === 'object' && !Object.keys(v).length) ||
10
+ v === null ||
11
+ v === undefined ||
12
+ v.length === 0) {
13
+ if (Array.isArray(object)) {
14
+ if (!(object[k] instanceof bson_1.ObjectId)) {
15
+ object.splice(k, 1);
16
+ }
17
+ }
18
+ else if (!(v instanceof Date) && !(v instanceof bson_1.ObjectId)) {
19
+ delete object[k];
20
+ }
21
+ }
22
+ });
23
+ return object;
24
+ };
25
+ exports.clearEmpties = clearEmpties;
@@ -0,0 +1,6 @@
1
+ import { FluentQuery, LogicOperator, Primitives, PrimitivesArray } from '../../types';
2
+ export declare const extractConditions: (conditions: FluentQuery<any>['where'][]) => {
3
+ operator: LogicOperator;
4
+ element: string;
5
+ value: Primitives | PrimitivesArray;
6
+ }[];
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractConditions = void 0;
4
+ const js_utils_1 = require("@goatlab/js-utils");
5
+ const types_1 = require("../../types");
6
+ const isAnyObject_1 = require("./isAnyObject");
7
+ const extractConditions = (conditions) => {
8
+ const accumulatedClauses = [];
9
+ if (!conditions) {
10
+ return accumulatedClauses;
11
+ }
12
+ for (const clause of conditions) {
13
+ if (!clause) {
14
+ continue;
15
+ }
16
+ for (const el of Object.keys(clause)) {
17
+ const value = clause[el];
18
+ if ((0, isAnyObject_1.isAnyObject)(value)) {
19
+ const initialKey = el;
20
+ const flatten = js_utils_1.Objects.flatten(value);
21
+ for (const key of Object.keys(flatten)) {
22
+ const transformedKey = key.replace(new RegExp('.[0-9]', 'g'), '');
23
+ if (types_1.LogicOperator[transformedKey]) {
24
+ if (types_1.LogicOperator[transformedKey] === types_1.LogicOperator.in ||
25
+ types_1.LogicOperator[transformedKey] === types_1.LogicOperator.notIn) {
26
+ accumulatedClauses.push({
27
+ operator: types_1.LogicOperator[transformedKey],
28
+ element: `${initialKey}`,
29
+ value: value[transformedKey]
30
+ });
31
+ }
32
+ else {
33
+ accumulatedClauses.push({
34
+ operator: types_1.LogicOperator[transformedKey],
35
+ element: `${initialKey}`,
36
+ value: flatten[key]
37
+ });
38
+ }
39
+ }
40
+ else if (transformedKey.includes('.')) {
41
+ const op = key.split('.').slice(-1).pop();
42
+ if (!op) {
43
+ continue;
44
+ }
45
+ if (types_1.LogicOperator[op]) {
46
+ accumulatedClauses.push({
47
+ operator: types_1.LogicOperator[op],
48
+ element: `${initialKey}.${key.replace(`.${op}`, '')}`,
49
+ value: flatten[key]
50
+ });
51
+ }
52
+ else {
53
+ accumulatedClauses.push({
54
+ operator: types_1.LogicOperator.equals,
55
+ element: `${initialKey}.${key}`,
56
+ value: flatten[key]
57
+ });
58
+ }
59
+ }
60
+ else {
61
+ accumulatedClauses.push({
62
+ operator: types_1.LogicOperator.equals,
63
+ element: `${initialKey}.${transformedKey}`,
64
+ value: flatten[key]
65
+ });
66
+ }
67
+ }
68
+ }
69
+ else {
70
+ accumulatedClauses.push({
71
+ operator: types_1.LogicOperator.equals,
72
+ element: el,
73
+ value
74
+ });
75
+ }
76
+ }
77
+ }
78
+ return accumulatedClauses.filter((v, i, a) => a.findIndex(v2 => JSON.stringify(v2) === JSON.stringify(v)) === i);
79
+ };
80
+ exports.extractConditions = extractConditions;
@@ -0,0 +1,2 @@
1
+ import { AnyObject, FluentQuery } from '../../types';
2
+ export declare const extractInclude: <T>(include?: import("../../types").QueryIncludeRelation<T> | undefined) => AnyObject | undefined;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractInclude = void 0;
4
+ const js_utils_1 = require("@goatlab/js-utils");
5
+ const extractInclude = (include) => {
6
+ if (!include) {
7
+ return undefined;
8
+ }
9
+ const flatten = js_utils_1.Objects.flatten(include);
10
+ const extractedInclude = {};
11
+ for (const key of Object.keys(flatten)) {
12
+ if (key.includes('include')) {
13
+ const parsedKey = key.split('.include');
14
+ let acc = '';
15
+ for (const entity of parsedKey) {
16
+ extractedInclude[`${acc}${entity}`] = true;
17
+ acc = acc + entity;
18
+ }
19
+ continue;
20
+ }
21
+ extractedInclude[key] = true;
22
+ }
23
+ return extractedInclude;
24
+ };
25
+ exports.extractInclude = extractInclude;
@@ -0,0 +1,12 @@
1
+ export interface KeysMetadata {
2
+ keyName: string;
3
+ nestableKey: string;
4
+ relation?: string;
5
+ parentRelation?: string;
6
+ level?: number;
7
+ cardinality?: string;
8
+ }
9
+ export interface KeysMetadataResponse {
10
+ [key: string]: KeysMetadata;
11
+ }
12
+ export declare const extractMetadataFromKeys: (keys: string[]) => KeysMetadataResponse;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractMetadataFromKeys = void 0;
4
+ const extractMetadataFromKeys = (keys) => {
5
+ const keyToNestedKeyMap = {};
6
+ for (const key of keys) {
7
+ const preAttributeIndex = key.lastIndexOf('_');
8
+ const fullTableAlias = key.slice(0, preAttributeIndex).replace('_', '');
9
+ const keyName = key.slice(preAttributeIndex + 1, key.length);
10
+ const flattened = fullTableAlias
11
+ .replace(/___XXManyToOneXX/g, '')
12
+ .replace(/___XXOneToManyXX/g, '')
13
+ .replace(/___/g, '.')
14
+ .replace('__', '.')
15
+ .replace('.XXOneToManyXX', '');
16
+ const possibleCurrentTableKey = key.lastIndexOf('___');
17
+ const relation = possibleCurrentTableKey <= 0
18
+ ? undefined
19
+ : key.slice(possibleCurrentTableKey + 3, preAttributeIndex);
20
+ const possibleParentTableKeyInit = key.lastIndexOf('___XX');
21
+ const possibleParentTableKeyEnd = key.lastIndexOf('XX__');
22
+ const cardinality = key.slice(possibleParentTableKeyInit, possibleParentTableKeyEnd) ||
23
+ undefined;
24
+ const parentRelationKey = key
25
+ .substring(0, possibleParentTableKeyInit)
26
+ .lastIndexOf('___');
27
+ const parentRelation = key
28
+ .substring(parentRelationKey, possibleParentTableKeyInit)
29
+ .replace(/___/g, '') || undefined;
30
+ var level = (key.match(/XX___/g) || []).length;
31
+ keyToNestedKeyMap[key] = {
32
+ keyName,
33
+ nestableKey: `${flattened}.${keyName}`,
34
+ relation,
35
+ parentRelation,
36
+ level,
37
+ cardinality: cardinality && cardinality.replace(/XX/g, '').replace(/___/g, '')
38
+ };
39
+ }
40
+ return keyToNestedKeyMap;
41
+ };
42
+ exports.extractMetadataFromKeys = extractMetadataFromKeys;
@@ -0,0 +1,4 @@
1
+ import { FluentQuery } from 'types';
2
+ export declare const extractOrderBy: <T>(orderBy?: Partial<{ [K in keyof import("types").Concrete<T>]: import("types").Concrete<T>[K] extends object ? Partial<Partial<{ [K_1 in keyof import("types").Concrete<import("types").Concrete<T>[K]>]: import("types").Concrete<import("types").Concrete<T>[K]>[K_1] extends object ? Partial<Partial<{ [K_2 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2] extends object ? Partial<Partial<{ [K_3 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3] extends object ? Partial<Partial<{ [K_4 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4] extends object ? Partial<Partial<{ [K_5 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5] extends object ? Partial<Partial<{ [K_6 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6] extends object ? Partial<Partial<{ [K_7 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6]>[K_7] extends object ? Partial<Partial<{ [K_8 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6]>[K_7]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6]>[K_7]>[K_8] extends object ? Partial<Partial<{ [K_9 in keyof import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6]>[K_7]>[K_8]>]: import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<import("types").Concrete<T>[K]>[K_1]>[K_2]>[K_3]>[K_4]>[K_5]>[K_6]>[K_7]>[K_8]>[K_9] extends object ? any : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>> : "asc" | "desc" | undefined; }>[] | undefined) => {
3
+ [key: string]: any;
4
+ };
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractOrderBy = void 0;
4
+ const js_utils_1 = require("@goatlab/js-utils");
5
+ const extractOrderBy = (orderBy) => {
6
+ if (!orderBy || !Array.isArray(orderBy) || orderBy.length === 0) {
7
+ return {};
8
+ }
9
+ const order = {};
10
+ for (const orderElement of orderBy) {
11
+ const flattenOrder = js_utils_1.Objects.flatten(orderElement);
12
+ for (const k of Object.keys(flattenOrder)) {
13
+ order[k] = flattenOrder[k];
14
+ }
15
+ }
16
+ return js_utils_1.Objects.nest(order);
17
+ };
18
+ exports.extractOrderBy = extractOrderBy;
@@ -0,0 +1,19 @@
1
+ import { Repository } from 'typeorm';
2
+ export interface GeneratedModelRelations {
3
+ relations: {
4
+ [key: string]: {
5
+ isOneToMany: boolean;
6
+ isManyToOne: boolean;
7
+ isManyToMany: boolean;
8
+ inverseSidePropertyRelationPath?: string;
9
+ inverseSidePropertyPath?: string;
10
+ propertyName: string;
11
+ entityName: string;
12
+ tableName: string;
13
+ targetClass: string;
14
+ joinColumns: any[];
15
+ inverseJoinColumns: any[];
16
+ };
17
+ };
18
+ }
19
+ export declare const getRelationsFromModelGenerator: (typeOrmRepo: Repository<any>) => GeneratedModelRelations;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRelationsFromModelGenerator = void 0;
4
+ const getRelationsFromModelGenerator = (typeOrmRepo) => {
5
+ const relations = {};
6
+ for (const relation of typeOrmRepo.metadata.relations) {
7
+ const pPath = relation.inverseRelation?.joinColumns[0];
8
+ relations[relation.propertyName] = {
9
+ isOneToMany: relation.isOneToMany,
10
+ isManyToOne: relation.isManyToOne,
11
+ isManyToMany: relation.isManyToMany,
12
+ inverseSidePropertyRelationPath: relation.inverseSidePropertyPath,
13
+ inverseSidePropertyPath: pPath?.propertyPath,
14
+ propertyName: relation.propertyName,
15
+ entityName: relation.inverseEntityMetadata.name,
16
+ tableName: relation.inverseEntityMetadata.tableName,
17
+ targetClass: relation.inverseEntityMetadata.target,
18
+ joinColumns: relation.joinColumns,
19
+ inverseJoinColumns: relation.inverseJoinColumns
20
+ };
21
+ }
22
+ return {
23
+ relations
24
+ };
25
+ };
26
+ exports.getRelationsFromModelGenerator = getRelationsFromModelGenerator;
@@ -0,0 +1 @@
1
+ export declare const getSelectedKeysFromRawSql: (sql: string) => string[];
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSelectedKeysFromRawSql = void 0;
4
+ const getSelectedKeysFromRawSql = (sql) => {
5
+ const possibleKeys = sql.split('AS');
6
+ const keys = new Set([]);
7
+ for (const stringKey of possibleKeys) {
8
+ if (stringKey.includes('SELECT')) {
9
+ const key = stringKey.split('"')[1];
10
+ if (key.includes('___') || !key.includes('_')) {
11
+ continue;
12
+ }
13
+ keys.add(key.replace('_id', 'id').replace('_', '.'));
14
+ continue;
15
+ }
16
+ keys.add(stringKey.split('"')[1].replace('_id', 'id').replace('_', '.'));
17
+ }
18
+ return Array.from(keys);
19
+ };
20
+ exports.getSelectedKeysFromRawSql = getSelectedKeysFromRawSql;
@@ -0,0 +1 @@
1
+ export declare const isAnyObject: (val: any) => boolean;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isAnyObject = void 0;
4
+ const isAnyObject = (val) => {
5
+ return typeof val === 'object' && !Array.isArray(val) && val !== null;
6
+ };
7
+ exports.isAnyObject = isAnyObject;
@@ -0,0 +1,2 @@
1
+ import { AnyObject } from '../../types';
2
+ export declare const nestQueryResults: (results: AnyObject[], keyToNestedKeyMap: AnyObject) => AnyObject[];
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.nestQueryResults = void 0;
4
+ const js_utils_1 = require("@goatlab/js-utils");
5
+ const nestQueryResults = (results, keyToNestedKeyMap) => {
6
+ let nestableObject = {};
7
+ let currentLevel = 0;
8
+ for (const key of Object.keys(keyToNestedKeyMap)) {
9
+ if (!key.endsWith('_id')) {
10
+ continue;
11
+ }
12
+ const currentLevelMetadata = keyToNestedKeyMap[key];
13
+ currentLevel = currentLevelMetadata.level;
14
+ const grouped = js_utils_1.Arrays.groupBy(results, r => r[key]);
15
+ const resultCount = Object.keys(grouped)?.length || 0;
16
+ for (const [index, k] of Object.keys(grouped).entries()) {
17
+ const prefixindex = currentLevelMetadata.nestableKey.lastIndexOf('.');
18
+ const prefix = currentLevelMetadata.nestableKey.substring(0, prefixindex);
19
+ const currentIndex = `${prefix}.${index}.${currentLevelMetadata.keyName}`;
20
+ const results = grouped[k];
21
+ console.log(currentLevelMetadata);
22
+ if (currentLevelMetadata.level === currentLevel) {
23
+ nestableObject[`${currentIndex}`] = k;
24
+ }
25
+ for (const result of results) {
26
+ }
27
+ }
28
+ }
29
+ return results;
30
+ };
31
+ exports.nestQueryResults = nestQueryResults;
package/dist/index.d.ts CHANGED
@@ -1,22 +1,29 @@
1
1
  import { ApiHideProperty, ApiProperty, Column, HideField, InputType, ObjectType, OmitType, PartialType, getModelSchemaRef } from './core/types';
2
- import type { AnyObject, Deleted, PaginatedData, Paginator, Primitives, PrimitivesArray, FluentQuery, QueryOutput, LoadedResult, FindByIdFilter, SingleQueryOutput } from './types';
2
+ import type { AnyObject, Deleted, PaginatedData, Paginator, Primitives, PrimitivesArray, FluentQuery, QueryOutput, LoadedResult, FindByIdFilter } from './types';
3
3
  import { LogicOperator } from './types';
4
4
  import { BaseConnector } from './BaseConnector';
5
5
  import { Collection } from '@goatlab/js-utils';
6
6
  import { f } from './decorators';
7
7
  import { Fluent } from './Fluent';
8
- import type { FluentConnectorInterface } from './BaseConnector';
8
+ import type { FluentConnectorInterface } from './FluentConnectorInterface';
9
9
  import type { SchemaObject } from './core/types';
10
- import { getRelationsFromModelGenerator, TypeOrmConnector } from './TypeOrmConnector/TypeOrmConnector';
10
+ import { TypeOrmConnector } from './TypeOrmConnector/TypeOrmConnector';
11
11
  import { getOutputKeys } from './outputKeys';
12
12
  import { loadRelations } from './loadRelations';
13
13
  import { modelGeneratorDataSource } from './generatorDatasource';
14
14
  import { Cache } from './cache';
15
15
  import { ValidationError } from 'class-validator';
16
+ import { extractConditions } from './TypeOrmConnector/util/extractConditions';
17
+ import { extractInclude } from './TypeOrmConnector/util/extractInclude';
18
+ import { extractMetadataFromKeys } from './TypeOrmConnector/util/extractMetadataFromKeys';
19
+ import { extractOrderBy } from './TypeOrmConnector/util/extractOrderBy';
20
+ import { getRelationsFromModelGenerator } from './TypeOrmConnector/util/getRelationsFromModelGenerator';
21
+ import { getSelectedKeysFromRawSql } from './TypeOrmConnector/util/getSelectedKeysFromRawSql';
22
+ import { nestQueryResults } from './TypeOrmConnector/util/nestQueryResults';
16
23
  export { DataSource } from 'typeorm';
17
- export { ApiHideProperty, ApiProperty, BaseConnector, Collection, Column, f, Fluent, getModelSchemaRef, getOutputKeys, HideField, InputType, loadRelations, modelGeneratorDataSource, ObjectType, OmitType, PartialType, TypeOrmConnector, Cache, getRelationsFromModelGenerator, LogicOperator };
24
+ export { ApiHideProperty, ApiProperty, BaseConnector, Collection, Column, f, Fluent, getModelSchemaRef, getOutputKeys, HideField, InputType, loadRelations, modelGeneratorDataSource, ObjectType, OmitType, PartialType, TypeOrmConnector, Cache, getRelationsFromModelGenerator, LogicOperator, extractConditions, extractInclude, extractMetadataFromKeys, extractOrderBy, getSelectedKeysFromRawSql, nestQueryResults };
18
25
  interface ValidatedInput<T> {
19
26
  errors: ValidationError[] | null;
20
27
  result: Awaited<T>;
21
28
  }
22
- export type { AnyObject, Deleted, FluentConnectorInterface, PaginatedData, Paginator, Primitives, PrimitivesArray, SchemaObject, ValidatedInput, FluentQuery, QueryOutput, LoadedResult, FindByIdFilter, SingleQueryOutput };
29
+ export type { AnyObject, Deleted, FluentConnectorInterface, PaginatedData, Paginator, Primitives, PrimitivesArray, SchemaObject, ValidatedInput, FluentQuery, QueryOutput, LoadedResult, FindByIdFilter };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LogicOperator = exports.getRelationsFromModelGenerator = exports.Cache = exports.TypeOrmConnector = exports.PartialType = exports.OmitType = exports.ObjectType = exports.modelGeneratorDataSource = exports.loadRelations = exports.InputType = exports.HideField = exports.getOutputKeys = exports.getModelSchemaRef = exports.Fluent = exports.f = exports.Column = exports.Collection = exports.BaseConnector = exports.ApiProperty = exports.ApiHideProperty = exports.DataSource = void 0;
3
+ exports.nestQueryResults = exports.getSelectedKeysFromRawSql = exports.extractOrderBy = exports.extractMetadataFromKeys = exports.extractInclude = exports.extractConditions = exports.LogicOperator = exports.getRelationsFromModelGenerator = exports.Cache = exports.TypeOrmConnector = exports.PartialType = exports.OmitType = exports.ObjectType = exports.modelGeneratorDataSource = exports.loadRelations = exports.InputType = exports.HideField = exports.getOutputKeys = exports.getModelSchemaRef = exports.Fluent = exports.f = exports.Column = exports.Collection = exports.BaseConnector = exports.ApiProperty = exports.ApiHideProperty = exports.DataSource = void 0;
4
4
  const types_1 = require("./core/types");
5
5
  Object.defineProperty(exports, "ApiHideProperty", { enumerable: true, get: function () { return types_1.ApiHideProperty; } });
6
6
  Object.defineProperty(exports, "ApiProperty", { enumerable: true, get: function () { return types_1.ApiProperty; } });
@@ -22,7 +22,6 @@ Object.defineProperty(exports, "f", { enumerable: true, get: function () { retur
22
22
  const Fluent_1 = require("./Fluent");
23
23
  Object.defineProperty(exports, "Fluent", { enumerable: true, get: function () { return Fluent_1.Fluent; } });
24
24
  const TypeOrmConnector_1 = require("./TypeOrmConnector/TypeOrmConnector");
25
- Object.defineProperty(exports, "getRelationsFromModelGenerator", { enumerable: true, get: function () { return TypeOrmConnector_1.getRelationsFromModelGenerator; } });
26
25
  Object.defineProperty(exports, "TypeOrmConnector", { enumerable: true, get: function () { return TypeOrmConnector_1.TypeOrmConnector; } });
27
26
  const outputKeys_1 = require("./outputKeys");
28
27
  Object.defineProperty(exports, "getOutputKeys", { enumerable: true, get: function () { return outputKeys_1.getOutputKeys; } });
@@ -32,5 +31,19 @@ const generatorDatasource_1 = require("./generatorDatasource");
32
31
  Object.defineProperty(exports, "modelGeneratorDataSource", { enumerable: true, get: function () { return generatorDatasource_1.modelGeneratorDataSource; } });
33
32
  const cache_1 = require("./cache");
34
33
  Object.defineProperty(exports, "Cache", { enumerable: true, get: function () { return cache_1.Cache; } });
34
+ const extractConditions_1 = require("./TypeOrmConnector/util/extractConditions");
35
+ Object.defineProperty(exports, "extractConditions", { enumerable: true, get: function () { return extractConditions_1.extractConditions; } });
36
+ const extractInclude_1 = require("./TypeOrmConnector/util/extractInclude");
37
+ Object.defineProperty(exports, "extractInclude", { enumerable: true, get: function () { return extractInclude_1.extractInclude; } });
38
+ const extractMetadataFromKeys_1 = require("./TypeOrmConnector/util/extractMetadataFromKeys");
39
+ Object.defineProperty(exports, "extractMetadataFromKeys", { enumerable: true, get: function () { return extractMetadataFromKeys_1.extractMetadataFromKeys; } });
40
+ const extractOrderBy_1 = require("./TypeOrmConnector/util/extractOrderBy");
41
+ Object.defineProperty(exports, "extractOrderBy", { enumerable: true, get: function () { return extractOrderBy_1.extractOrderBy; } });
42
+ const getRelationsFromModelGenerator_1 = require("./TypeOrmConnector/util/getRelationsFromModelGenerator");
43
+ Object.defineProperty(exports, "getRelationsFromModelGenerator", { enumerable: true, get: function () { return getRelationsFromModelGenerator_1.getRelationsFromModelGenerator; } });
44
+ const getSelectedKeysFromRawSql_1 = require("./TypeOrmConnector/util/getSelectedKeysFromRawSql");
45
+ Object.defineProperty(exports, "getSelectedKeysFromRawSql", { enumerable: true, get: function () { return getSelectedKeysFromRawSql_1.getSelectedKeysFromRawSql; } });
46
+ const nestQueryResults_1 = require("./TypeOrmConnector/util/nestQueryResults");
47
+ Object.defineProperty(exports, "nestQueryResults", { enumerable: true, get: function () { return nestQueryResults_1.nestQueryResults; } });
35
48
  var typeorm_1 = require("typeorm");
36
49
  Object.defineProperty(exports, "DataSource", { enumerable: true, get: function () { return typeorm_1.DataSource; } });
@@ -21,14 +21,13 @@ const loadRelations = async ({ data, relations, modelRelations, provider, self,
21
21
  const chunks = js_utils_1.Arrays.chunk(Array.from(ids), chunkSize);
22
22
  const promises = [];
23
23
  for (const relatedIds of chunks) {
24
- const results = await Repository.findMany({
24
+ promises.push(Repository.findMany({
25
25
  where: {
26
26
  [relationModel.inverseSidePropertyPath]: {
27
27
  in: relatedIds
28
28
  }
29
29
  }
30
- });
31
- promises.push(results);
30
+ }));
32
31
  }
33
32
  const relatedResults = js_utils_1.Arrays.collapse(await Promise.all(promises));
34
33
  const grouped = js_utils_1.Arrays.groupBy(relatedResults, r => r[relationModel.inverseSidePropertyPath]);
@@ -45,14 +44,13 @@ const loadRelations = async ({ data, relations, modelRelations, provider, self,
45
44
  const chunks = js_utils_1.Arrays.chunk(ids, chunkSize);
46
45
  const promises = [];
47
46
  for (const relatedIds of chunks) {
48
- const results = await Repository.findMany({
47
+ promises.push(Repository.findMany({
49
48
  where: {
50
49
  id: {
51
50
  in: relatedIds
52
51
  }
53
52
  }
54
- });
55
- promises.push(results);
53
+ }));
56
54
  }
57
55
  const relatedResults = js_utils_1.Arrays.collapse(await Promise.all(promises));
58
56
  const grouped = js_utils_1.Arrays.groupBy(relatedResults, r => r.id);
@@ -121,10 +119,10 @@ const loadRelations = async ({ data, relations, modelRelations, provider, self,
121
119
  if (!d[calleeKey]) {
122
120
  d[calleeKey] = [];
123
121
  }
124
- d[calleeKey] = [
125
- ...d[calleeKey],
126
- ...groupedRelated[gp[relationModel.inverseJoinColumns[0].propertyName]]
127
- ];
122
+ const mapped = groupedRelated[gp[relationModel.inverseJoinColumns[0].propertyName]];
123
+ if (mapped) {
124
+ d[calleeKey] = [...d[calleeKey], ...mapped];
125
+ }
128
126
  });
129
127
  });
130
128
  return data;