typeorm-extensions 1.2.3 → 1.2.5

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 (85) hide show
  1. package/README.md +4 -2
  2. package/dist/constants/index.d.ts +5 -0
  3. package/dist/constants/index.js +8 -0
  4. package/dist/extensions/get-many-with-totals.extension.d.ts +16 -0
  5. package/dist/extensions/get-many-with-totals.extension.js +30 -0
  6. package/dist/extensions/index.js +20 -0
  7. package/dist/extensions/order.extension.d.ts +15 -0
  8. package/dist/extensions/order.extension.js +48 -0
  9. package/dist/extensions/ordering.extension.js +48 -0
  10. package/dist/extensions/pagination.extension.d.ts +10 -0
  11. package/dist/extensions/pagination.extension.js +13 -0
  12. package/{src/extensions/typed/index.ts → dist/extensions/typed/index.d.ts} +0 -5
  13. package/dist/extensions/typed/index.js +27 -0
  14. package/dist/extensions/typed/typed-distinct/typed-distinct.extension.d.ts +14 -0
  15. package/dist/extensions/typed/typed-distinct/typed-distinct.extension.js +11 -0
  16. package/dist/extensions/typed/typed-joins/typed-joins.extension.d.ts +10 -0
  17. package/dist/extensions/typed/typed-joins/typed-joins.extension.js +32 -0
  18. package/dist/extensions/typed/typed-order-by/typed-order-by.extension.d.ts +17 -0
  19. package/dist/extensions/typed/typed-order-by/typed-order-by.extension.js +25 -0
  20. package/dist/extensions/typed/typed-select/typed-select.extension.d.ts +33 -0
  21. package/dist/extensions/typed/typed-select/typed-select.extension.js +31 -0
  22. package/dist/extensions/typed/typed-where/typed-where.extension.d.ts +89 -0
  23. package/dist/extensions/typed/typed-where/typed-where.extension.js +33 -0
  24. package/dist/extensions/typed/typeorm-querybuilder.types.d.ts +22 -0
  25. package/dist/extensions/typed/typeorm-querybuilder.types.js +56 -0
  26. package/{src/extensions/typed/typeorm.types.ts → dist/extensions/typed/typeorm.types.d.ts} +7 -20
  27. package/dist/extensions/typed/typeorm.types.js +2 -0
  28. package/{src/index.ts → dist/index.d.ts} +0 -1
  29. package/dist/index.js +18 -0
  30. package/dist/types/interfaces/index.js +18 -0
  31. package/{src/types/interfaces/ordering.interface.ts → dist/types/interfaces/ordering.interface.d.ts} +7 -12
  32. package/dist/types/interfaces/ordering.interface.js +2 -0
  33. package/dist/types/interfaces/pagination.interface.d.ts +6 -0
  34. package/dist/types/interfaces/pagination.interface.js +2 -0
  35. package/{src/types/modules/column.types.ts → dist/types/modules/column.types.d.ts} +1 -3
  36. package/dist/types/modules/column.types.js +2 -0
  37. package/{src/types/modules/proxy-types/proxy-callback.types.ts → dist/types/modules/proxy-types/proxy-callback.types.d.ts} +2 -7
  38. package/dist/types/modules/proxy-types/proxy-callback.types.js +2 -0
  39. package/dist/types/modules/relations.types.d.ts +16 -0
  40. package/dist/types/modules/relations.types.js +2 -0
  41. package/dist/types/util-types/index.d.ts +7 -0
  42. package/dist/types/util-types/index.js +2 -0
  43. package/dist/utils/common.utils.d.ts +1 -0
  44. package/dist/utils/common.utils.js +5 -0
  45. package/dist/utils/identifier.utils.d.ts +15 -0
  46. package/dist/utils/identifier.utils.js +45 -0
  47. package/dist/utils/pagination.utils.d.ts +5 -0
  48. package/dist/utils/pagination.utils.js +16 -0
  49. package/dist/utils/proxy-key.utils.d.ts +22 -0
  50. package/dist/utils/proxy-key.utils.js +100 -0
  51. package/dist/utils/sql.utils.d.ts +5 -0
  52. package/dist/utils/sql.utils.js +18 -0
  53. package/dist/utils/string.utils.js +11 -0
  54. package/package.json +4 -1
  55. package/.eslintignore +0 -2
  56. package/.eslintrc +0 -12
  57. package/docs/api_reference/index.html +0 -21
  58. package/docs/api_reference/order/applyOrderFilter.html +0 -77
  59. package/docs/api_reference/order/index.html +0 -36
  60. package/docs/api_reference/pagination/applyPaginationFilter.html +0 -78
  61. package/docs/api_reference/pagination/index.html +0 -35
  62. package/docs/api_reference/typed/index.html +0 -37
  63. package/docs/examples/index.html +0 -21
  64. package/docs/index.html +0 -78
  65. package/src/constants/index.ts +0 -9
  66. package/src/extensions/get-many-with-totals.extension.ts +0 -62
  67. package/src/extensions/order.extension.ts +0 -123
  68. package/src/extensions/pagination.extension.ts +0 -35
  69. package/src/extensions/typed/typed-distinct/typed-distinct.extension.ts +0 -38
  70. package/src/extensions/typed/typed-joins/typed-joins.extension.ts +0 -141
  71. package/src/extensions/typed/typed-order-by/typed-order-by.extension.ts +0 -73
  72. package/src/extensions/typed/typed-select/typed-select.extension.ts +0 -124
  73. package/src/extensions/typed/typed-where/typed-where.extension.ts +0 -268
  74. package/src/extensions/typed/typeorm-querybuilder.types.ts +0 -75
  75. package/src/types/interfaces/pagination.interface.ts +0 -8
  76. package/src/types/modules/relations.types.ts +0 -34
  77. package/src/types/util-types/index.ts +0 -8
  78. package/src/utils/common.utils.ts +0 -2
  79. package/src/utils/identifier.utils.ts +0 -60
  80. package/src/utils/pagination.utils.ts +0 -17
  81. package/src/utils/proxy-key.utils.ts +0 -133
  82. package/src/utils/sql.utils.ts +0 -24
  83. package/tsconfig.json +0 -109
  84. /package/{src/extensions/index.ts → dist/extensions/index.d.ts} +0 -0
  85. /package/{src/types/interfaces/index.ts → dist/types/interfaces/index.d.ts} +0 -0
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KeyProxy = exports.TypedProxy = exports.KeyHolder = void 0;
4
+ class KeyHolder {
5
+ constructor(keys = []) {
6
+ this.keys = keys;
7
+ this.keys = [...keys];
8
+ }
9
+ toSql(length = 2, addDobleQuotes = true) {
10
+ const string = this.toString(length);
11
+ const sql = addDobleQuotes ? `"${string.replace(/\./g, '"."')}"` : string;
12
+ return sql;
13
+ }
14
+ toString(length = 2) {
15
+ const keys = this.keys.slice(0, length);
16
+ const string = keys.join('.');
17
+ return string;
18
+ }
19
+ valueOf() {
20
+ return this.toString();
21
+ }
22
+ [Symbol.toPrimitive]() {
23
+ return this.toString();
24
+ }
25
+ add(key) {
26
+ if (typeof key !== 'symbol' &&
27
+ !Object.getOwnPropertyNames(this).includes(key) && // check of getOwnPropertyNames(this) is questionable
28
+ !Object.getOwnPropertyNames(KeyHolder.prototype).includes(key)) {
29
+ this.keys.push(key);
30
+ }
31
+ return this;
32
+ }
33
+ }
34
+ exports.KeyHolder = KeyHolder;
35
+ class TypedProxy {
36
+ static create(obj, handler = TypedProxy.defaultHandler) {
37
+ return new Proxy(obj, handler);
38
+ }
39
+ }
40
+ exports.TypedProxy = TypedProxy;
41
+ TypedProxy.defaultHandler = {};
42
+ class KeyProxy {
43
+ static create() {
44
+ return TypedProxy.create(new KeyHolder(), KeyProxy.defaultHandler);
45
+ }
46
+ }
47
+ exports.KeyProxy = KeyProxy;
48
+ KeyProxy.defaultHandler = {
49
+ get(target, key, receiver) {
50
+ var _a;
51
+ // for each key create new independent layer of KeyProxy
52
+ const newKeyHolder = new KeyHolder(target.keys).add(key);
53
+ const newLayer = TypedProxy.create(newKeyHolder, KeyProxy.defaultHandler);
54
+ return (_a = Reflect.get(target, key, receiver)) !== null && _a !== void 0 ? _a : newLayer;
55
+ },
56
+ };
@@ -1,30 +1,17 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
1
  import { BaseEntity, ObjectLiteral } from 'typeorm';
3
-
4
2
  export type SimpleColumnType = string | number | boolean | Date | null;
5
-
6
3
  export type ColumnValueType = SimpleColumnType | undefined | object | ObjectLiteral | ':value';
7
-
8
- export type RelationColumnsType<ColumnType, Key> = ColumnType extends SimpleColumnType | ((...args: any[]) => any)
9
- ? never
10
- : ColumnType extends BaseEntity | BaseEntity[] | ObjectLiteral | ObjectLiteral[]
11
- ? Key
12
- : never;
4
+ export type RelationColumnsType<ColumnType, Key> = ColumnType extends SimpleColumnType | ((...args: any[]) => any) ? never : ColumnType extends BaseEntity | BaseEntity[] | ObjectLiteral | ObjectLiteral[] ? Key : never;
13
5
  export type NonRelationColumnsType<ColumnType, Key> = ColumnType extends SimpleColumnType ? Key : never;
14
-
15
6
  export type RelationPropertyNames<Type> = {
16
- [Key in keyof Type]: RelationColumnsType<Type[Key], Key>;
17
- }[keyof Type] &
18
- string;
7
+ [Key in keyof Type]: RelationColumnsType<Type[Key], Key>;
8
+ }[keyof Type] & string;
19
9
  export type NonRelationPropertyNames<Type> = {
20
- [Key in keyof Type]: NonRelationColumnsType<Type[Key], Key>;
21
- }[keyof Type] &
22
- string;
23
-
10
+ [Key in keyof Type]: NonRelationColumnsType<Type[Key], Key>;
11
+ }[keyof Type] & string;
24
12
  export type EntityOnlyWithRelations<Entity extends ObjectLiteral> = {
25
- [Key in RelationPropertyNames<Entity>]: Entity[Key];
13
+ [Key in RelationPropertyNames<Entity>]: Entity[Key];
26
14
  };
27
-
28
15
  export type EntityWithoutRelations<Entity extends ObjectLiteral> = {
29
- [Key in NonRelationPropertyNames<Entity>]: Entity[Key];
16
+ [Key in NonRelationPropertyNames<Entity>]: Entity[Key];
30
17
  };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,3 +1,2 @@
1
1
  export * from './extensions';
2
-
3
2
  export * from './types/interfaces';
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./extensions"), exports);
18
+ __exportStar(require("./types/interfaces"), exports);
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./ordering.interface"), exports);
18
+ __exportStar(require("./pagination.interface"), exports);
@@ -1,21 +1,16 @@
1
1
  import { NonFunctionPropertyNames } from "../util-types";
2
-
3
2
  export type OrderDirection = 'asc' | 'desc' | 'ASC' | 'DESC';
4
-
5
3
  export type NullsOrder = 'first' | 'last' | 'FIRST' | 'LAST';
6
-
7
4
  export type OrderParam<Entity> = {
8
- field: NonFunctionPropertyNames<Required<Entity>> | string;
9
- direction?: OrderDirection;
10
- nulls?: NullsOrder;
5
+ field: NonFunctionPropertyNames<Required<Entity>> | string;
6
+ direction?: OrderDirection;
7
+ nulls?: NullsOrder;
11
8
  };
12
-
13
9
  export type OrderType = {
14
- selector: string;
15
- order: 'ASC' | 'DESC';
16
- nulls?: 'NULLS FIRST' | 'NULLS LAST';
10
+ selector: string;
11
+ order: 'ASC' | 'DESC';
12
+ nulls?: 'NULLS FIRST' | 'NULLS LAST';
17
13
  };
18
-
19
14
  export interface OrderFilter<Entity> {
20
- orderBy?: Array<OrderParam<Entity>>;
15
+ orderBy?: Array<OrderParam<Entity>>;
21
16
  }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ export type PageSize = number;
2
+ export type PageNumber = number;
3
+ export interface PaginationFilter {
4
+ page?: PageNumber;
5
+ pageSize?: PageSize;
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,5 +1,3 @@
1
1
  import { ObjectLiteral } from "typeorm";
2
-
3
2
  export type SimpleColumnType = string | number | boolean | Date | null;
4
-
5
- export type ColumnValueType = SimpleColumnType | undefined | object | ObjectLiteral;
3
+ export type ColumnValueType = SimpleColumnType | undefined | object | ObjectLiteral;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,11 +1,6 @@
1
1
  import { ObjectLiteral } from "typeorm";
2
2
  import { ColumnValueType } from "../column.types";
3
3
  import { EntityOnlyWithRelations, EntityWithoutRelations } from "../relations.types";
4
-
5
4
  export type KeyProxyCallback<T extends ObjectLiteral> = (proxy: T) => ColumnValueType | Array<ColumnValueType>;
6
- export type RelationalKeyProxyCallback<T extends ObjectLiteral> = (
7
- proxy: EntityOnlyWithRelations<T>
8
- ) => ColumnValueType;
9
- export type NonRelationalKeyProxyCallback<T extends ObjectLiteral> = (
10
- proxy: EntityWithoutRelations<T>
11
- ) => ColumnValueType;
5
+ export type RelationalKeyProxyCallback<T extends ObjectLiteral> = (proxy: EntityOnlyWithRelations<T>) => ColumnValueType;
6
+ export type NonRelationalKeyProxyCallback<T extends ObjectLiteral> = (proxy: EntityWithoutRelations<T>) => ColumnValueType;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,16 @@
1
+ import { BaseEntity, ObjectLiteral } from 'typeorm';
2
+ import { SimpleColumnType } from './column.types';
3
+ export type RelationColumnsType<ColumnType, Key> = ColumnType extends SimpleColumnType | ((...args: any[]) => any) ? never : ColumnType extends BaseEntity | BaseEntity[] | ObjectLiteral | ObjectLiteral[] ? Key : never;
4
+ export type NonRelationColumnsType<ColumnType, Key> = ColumnType extends SimpleColumnType ? Key : never;
5
+ export type RelationPropertyNames<Type> = {
6
+ [Key in keyof Type]: RelationColumnsType<Type[Key], Key>;
7
+ }[keyof Type] & string;
8
+ export type NonRelationPropertyNames<Type> = {
9
+ [Key in keyof Type]: NonRelationColumnsType<Type[Key], Key>;
10
+ }[keyof Type] & string;
11
+ export type EntityOnlyWithRelations<Entity extends ObjectLiteral> = {
12
+ [Key in RelationPropertyNames<Entity>]: Entity[Key];
13
+ };
14
+ export type EntityWithoutRelations<Entity extends ObjectLiteral> = {
15
+ [Key in NonRelationPropertyNames<Entity>]: Entity[Key];
16
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ export type FunctionPropertyNames<T> = {
2
+ [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never;
3
+ }[keyof T] & string;
4
+ export type NonFunctionPropertyNames<T> = {
5
+ [K in keyof T]: T[K] extends (...args: any[]) => any ? never : K;
6
+ }[keyof T] & string;
7
+ export type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export declare const isNil: (val: unknown) => boolean;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isNil = void 0;
4
+ const isNil = (val) => typeof val === 'undefined' || val === null;
5
+ exports.isNil = isNil;
@@ -0,0 +1,15 @@
1
+ export declare class Identifier {
2
+ readonly field: string;
3
+ readonly alias?: string | undefined;
4
+ private readonly useDoubleQuotes?;
5
+ private readonly useAlias;
6
+ constructor(field: string, alias?: string | undefined, useDoubleQuotes?: boolean | undefined);
7
+ fieldAsAlias(): string;
8
+ fieldIdentifier(): string;
9
+ get aliasSql(): string | undefined;
10
+ get fieldSql(): string;
11
+ private calcUseAlias;
12
+ static fieldToSql(field: string, useDoubleQuotes?: boolean): string;
13
+ static aliasToSql(alias: string | undefined, useDoubleQuotes?: boolean): string | undefined;
14
+ static toIdentifier(value: string, useDoubleQuotes?: boolean): string;
15
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Identifier = void 0;
4
+ const sql_utils_1 = require("./sql.utils");
5
+ class Identifier {
6
+ constructor(field, alias, useDoubleQuotes) {
7
+ this.field = field;
8
+ this.alias = alias;
9
+ this.useDoubleQuotes = useDoubleQuotes;
10
+ this.useAlias = this.calcUseAlias();
11
+ }
12
+ fieldAsAlias() {
13
+ if (this.useAlias) {
14
+ return `${this.fieldSql} AS ${this.aliasSql}`;
15
+ }
16
+ return this.fieldSql;
17
+ }
18
+ fieldIdentifier() {
19
+ if (this.useAlias) {
20
+ return `${this.aliasSql}.${this.fieldSql}`;
21
+ }
22
+ return this.fieldSql;
23
+ }
24
+ get aliasSql() {
25
+ return Identifier.aliasToSql(this.alias, this.useDoubleQuotes);
26
+ }
27
+ get fieldSql() {
28
+ return Identifier.fieldToSql(this.field, this.useDoubleQuotes);
29
+ }
30
+ /* PRIVATE */
31
+ calcUseAlias() {
32
+ return !!this.alias && !this.field.includes('.');
33
+ }
34
+ /* STATIC */
35
+ static fieldToSql(field, useDoubleQuotes) {
36
+ return this.toIdentifier(field, useDoubleQuotes);
37
+ }
38
+ static aliasToSql(alias, useDoubleQuotes) {
39
+ return alias ? this.toIdentifier(alias, useDoubleQuotes) : undefined;
40
+ }
41
+ static toIdentifier(value, useDoubleQuotes) {
42
+ return useDoubleQuotes ? (0, sql_utils_1.stringToSQLIdentifier)(value) : value;
43
+ }
44
+ }
45
+ exports.Identifier = Identifier;
@@ -0,0 +1,5 @@
1
+ import { PaginationFilter } from "../types/interfaces/pagination.interface";
2
+ export declare const getLimitAndOffset: ({ page, pageSize }: PaginationFilter) => {
3
+ limit: number;
4
+ offset: number;
5
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLimitAndOffset = void 0;
4
+ const constants_1 = require("../constants");
5
+ const getLimitAndOffset = ({ page, pageSize }) => {
6
+ if (!page || page < 1) {
7
+ page = 1;
8
+ }
9
+ if (!pageSize || pageSize < 1) {
10
+ pageSize = constants_1.defaultPageSize;
11
+ }
12
+ const offset = (page >= 1 ? page - 1 : 0) * pageSize;
13
+ const limit = pageSize;
14
+ return { limit, offset };
15
+ };
16
+ exports.getLimitAndOffset = getLimitAndOffset;
@@ -0,0 +1,22 @@
1
+ import { ObjectLiteral } from 'typeorm';
2
+ import { KeyProxyCallback } from '../types/modules/proxy-types/proxy-callback.types';
3
+ export declare class KeyHolder {
4
+ keys: string[];
5
+ constructor(keys?: string[]);
6
+ toSql(length?: number, addDobleQuotes?: boolean): string;
7
+ toString(length?: number): string;
8
+ valueOf(): string;
9
+ [Symbol.toPrimitive](): string;
10
+ add(key: string | symbol): this;
11
+ }
12
+ export declare class TypedProxy {
13
+ static defaultHandler: {};
14
+ static create<T extends ObjectLiteral>(obj: object, handler?: {}): T;
15
+ }
16
+ export declare class KeyProxy {
17
+ static defaultHandler: ProxyHandler<KeyHolder>;
18
+ static create<T extends ObjectLiteral>(): T;
19
+ }
20
+ export declare const getKeyHolder: <Type extends ObjectLiteral>(callback: KeyHolder | KeyProxyCallback<Type>) => KeyHolder | Array<KeyHolder>;
21
+ export declare const getKey: <Type extends ObjectLiteral>(callback: string | KeyHolder | KeyProxyCallback<Type>) => string;
22
+ export declare const getSqlKey: <Type extends ObjectLiteral>(callback: string | KeyHolder | KeyProxyCallback<Type>, addPrefix?: string, addDobleQuotes?: boolean) => string | string[];
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSqlKey = exports.getKey = exports.getKeyHolder = exports.KeyProxy = exports.TypedProxy = exports.KeyHolder = void 0;
4
+ const sql_utils_1 = require("./sql.utils");
5
+ class KeyHolder {
6
+ constructor(keys = []) {
7
+ this.keys = keys;
8
+ this.keys = [...keys];
9
+ }
10
+ toSql(length = 2, addDobleQuotes = true) {
11
+ const string = this.toString(length);
12
+ const sql = addDobleQuotes ? (0, sql_utils_1.stringToSQLIdentifier)(string) : string;
13
+ return sql;
14
+ }
15
+ toString(length = 2) {
16
+ const keys = this.keys.slice(0, length);
17
+ const string = keys.join('.');
18
+ return string;
19
+ }
20
+ valueOf() {
21
+ return this.toString();
22
+ }
23
+ [Symbol.toPrimitive]() {
24
+ return this.toString();
25
+ }
26
+ add(key) {
27
+ if (typeof key !== 'symbol' &&
28
+ !Object.getOwnPropertyNames(this).includes(key) && // check of getOwnPropertyNames(this) is questionable
29
+ !Object.getOwnPropertyNames(KeyHolder.prototype).includes(key)) {
30
+ this.keys.push(key);
31
+ }
32
+ return this;
33
+ }
34
+ }
35
+ exports.KeyHolder = KeyHolder;
36
+ class TypedProxy {
37
+ static create(obj, handler = TypedProxy.defaultHandler) {
38
+ return new Proxy(obj, handler);
39
+ }
40
+ }
41
+ exports.TypedProxy = TypedProxy;
42
+ TypedProxy.defaultHandler = {};
43
+ class KeyProxy {
44
+ static create() {
45
+ return TypedProxy.create(new KeyHolder(), KeyProxy.defaultHandler);
46
+ }
47
+ }
48
+ exports.KeyProxy = KeyProxy;
49
+ KeyProxy.defaultHandler = {
50
+ get(target, key, receiver) {
51
+ const value = Reflect.get(target, key, receiver);
52
+ if (value) {
53
+ return value;
54
+ }
55
+ // for each key create new independent layer of KeyProxy
56
+ const newKeyHolder = new KeyHolder(target.keys).add(key);
57
+ const newLayer = TypedProxy.create(newKeyHolder, KeyProxy.defaultHandler);
58
+ return newLayer;
59
+ },
60
+ };
61
+ const getKeyHolder = (callback) => {
62
+ if (typeof callback !== 'function') {
63
+ if (callback instanceof KeyHolder) {
64
+ return callback;
65
+ }
66
+ }
67
+ const keyHolder = callback(KeyProxy.create());
68
+ return keyHolder;
69
+ };
70
+ exports.getKeyHolder = getKeyHolder;
71
+ const getKey = (callback) => {
72
+ if (typeof callback === 'string')
73
+ return callback;
74
+ const keyHolder = (0, exports.getKeyHolder)(callback);
75
+ return keyHolder.toString();
76
+ };
77
+ exports.getKey = getKey;
78
+ const getSqlKey = (callback, addPrefix, addDobleQuotes = true) => {
79
+ if (typeof callback === 'string')
80
+ return callback;
81
+ const keyHolder = (0, exports.getKeyHolder)(callback);
82
+ if (Array.isArray(keyHolder)) {
83
+ return keyHolder.map((holder) => (0, exports.getSqlKey)(holder, addPrefix));
84
+ }
85
+ // if select is like this: (proxy) => proxy.relation.column
86
+ if (keyHolder.keys.length > 1) {
87
+ // return unchanged
88
+ return keyHolder.toSql(undefined, addDobleQuotes);
89
+ }
90
+ // else if select is one layer depth like this: (proxy) => proxy.column
91
+ // then add alias before the key
92
+ if (typeof addPrefix === 'string' && addPrefix.length >= 1) {
93
+ keyHolder.keys.unshift(addPrefix);
94
+ }
95
+ return keyHolder.toSql(undefined, addDobleQuotes);
96
+ };
97
+ exports.getSqlKey = getSqlKey;
98
+ // example of typed select
99
+ // const key = getSqlKey<UserEntity>((proxy) => proxy.sessions);
100
+ // console.log(key);
@@ -0,0 +1,5 @@
1
+ import { DatabaseType } from 'typeorm';
2
+ export declare const wrapWithDoubleQoutes: (str: string) => string;
3
+ export declare const wrapWithBackQoutes: (str: string) => string;
4
+ export declare const stringToSQLIdentifier: (str: string, driver?: DatabaseType) => string;
5
+ export declare const stringToSQLValue: (str: string) => string;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stringToSQLValue = exports.stringToSQLIdentifier = exports.wrapWithBackQoutes = exports.wrapWithDoubleQoutes = void 0;
4
+ const wrapWithDoubleQoutes = (str) => str.includes('"') ? str : `"${str}"`;
5
+ exports.wrapWithDoubleQoutes = wrapWithDoubleQoutes;
6
+ const wrapWithBackQoutes = (str) => str.includes('`') ? str : '`' + str + '`';
7
+ exports.wrapWithBackQoutes = wrapWithBackQoutes;
8
+ const stringToSQLIdentifier = (str, driver) => str.includes('.')
9
+ ? str
10
+ .split('.')
11
+ .map((val) => (driver === null || driver === void 0 ? void 0 : driver.includes('mysql'))
12
+ ? (0, exports.wrapWithBackQoutes)(val)
13
+ : (0, exports.wrapWithDoubleQoutes)(val))
14
+ .join('.')
15
+ : (0, exports.wrapWithDoubleQoutes)(str);
16
+ exports.stringToSQLIdentifier = stringToSQLIdentifier;
17
+ const stringToSQLValue = (str) => `'${str}'`;
18
+ exports.stringToSQLValue = stringToSQLValue;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stringToSQLValue = exports.stringToSQLIdentifier = exports.wrapWithDblQoutes = void 0;
4
+ const wrapWithDblQoutes = (str) => str.includes('"') ? str : `"${str}"`;
5
+ exports.wrapWithDblQoutes = wrapWithDblQoutes;
6
+ const stringToSQLIdentifier = (str) => str.includes('.')
7
+ ? str.split('.').map(exports.wrapWithDblQoutes).join('.')
8
+ : (0, exports.wrapWithDblQoutes)(str);
9
+ exports.stringToSQLIdentifier = stringToSQLIdentifier;
10
+ const stringToSQLValue = (str) => `'${str}'`;
11
+ exports.stringToSQLValue = stringToSQLValue;
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "typeorm-extensions",
3
- "version": "1.2.3",
3
+ "version": "1.2.5",
4
4
  "description": "typeorm commonly used extensions",
5
5
  "main": "./dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": ["dist", "LICENSE", "README.md", "package.json"],
8
+ "type": "module",
6
9
  "repository": {
7
10
  "type": "git",
8
11
  "url": "https://github.com/koenigstag/typeorm-extensions.git"
package/.eslintignore DELETED
@@ -1,2 +0,0 @@
1
- node_modules
2
- dist
package/.eslintrc DELETED
@@ -1,12 +0,0 @@
1
- {
2
- "root": true,
3
- "parser": "@typescript-eslint/parser",
4
- "plugins": [
5
- "@typescript-eslint"
6
- ],
7
- "extends": [
8
- "eslint:recommended",
9
- "plugin:@typescript-eslint/eslint-recommended",
10
- "plugin:@typescript-eslint/recommended"
11
- ]
12
- }
@@ -1,21 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>API reference / typeorm-extensions</title>
7
- </head>
8
- <body>
9
- <header>
10
- <h1>API Reference</h1>
11
- </header>
12
-
13
- <nav>
14
- <ul>
15
- <li><a href="pagination">Pagination</a></li>
16
- <li><a href="order">Order</a></li>
17
- <li><a href="typed">Typed Extensions</a></li>
18
- </ul>
19
- </nav>
20
- </body>
21
- </html>
@@ -1,77 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>applyOrderFilter / API reference / typeorm-extensions</title>
7
- </head>
8
- <body>
9
- <header>
10
- <h1>applyOrderFilter</h1>
11
-
12
- </header>
13
-
14
- <nav>
15
- <ul>
16
- <li><a href="../pagination">Pagination</a></li>
17
- <li><a href="../order">Order</a></li>
18
- <li><a href="../typed">Typed Extensions</a></li>
19
- </ul>
20
- </nav>
21
-
22
- <main>
23
- <section>
24
- <h2>Description</h2>
25
- <p>
26
- <code>applyOrderFilter</code> is a method that applies order to a query.
27
- </p>
28
- </section>
29
- <section>
30
- <h2>Signature</h2>
31
- <p>
32
- <pre><code>applyOrderFilter(orderFilter: OrderFilter, orderOptions?: ApplyOrderOptions): void</code></pre>
33
- </p>
34
- </section>
35
- <section>
36
- <h2>Arguments</h2>
37
- <ul>
38
- <li>
39
- <h3>orderFilter: OrderFilter</h3>
40
- <p>The order options to apply to the query.</p>
41
- <p>
42
- <h4>Properties</h4>
43
- <ul>
44
- <li>
45
- <h5>orderBy: Array< OrderParam ></h5>
46
- <p>Order configurations.</p>
47
- </li>
48
- </ul>
49
- </p>
50
- </li>
51
- <li>
52
- <h3>(optional) orderOptions?: ApplyOrderOptions</h3>
53
- <p>Additional options to apply to the order filter.</p>
54
- <p>
55
- <h4>Properties</h4>
56
- <ul>
57
- <li>
58
- <h5>useDoubleQuotes?: boolean</h5>
59
- <p>
60
- Whether to wrap the order field with double qoutes (defaults to false).
61
- </p>
62
- </li>
63
- <li>
64
- ...TBD...
65
- </li>
66
- </ul>
67
- </p>
68
- </li>
69
- </ul>
70
- </section>
71
- <section>
72
- <h2>Usage</h2>
73
- <pre><code>query.applyOrderFilter({ orderBy: [{ field: 'name', direction: 'asc', nulls: 'last' }] }, { useDoubleQuotes: true })</code></pre>
74
- </section>
75
- </main>
76
- </body>
77
- </html>