@decaf-ts/for-typeorm 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +93 -0
- package/dist/for-typeorm.cjs +2553 -0
- package/dist/for-typeorm.esm.cjs +2538 -0
- package/lib/TypeORMAdapter.cjs +1129 -0
- package/lib/TypeORMAdapter.d.ts +221 -0
- package/lib/TypeORMDispatch.cjs +134 -0
- package/lib/TypeORMDispatch.d.ts +87 -0
- package/lib/TypeORMEventSubscriber.cjs +96 -0
- package/lib/TypeORMEventSubscriber.d.ts +56 -0
- package/lib/TypeORMRepository.cjs +209 -0
- package/lib/TypeORMRepository.d.ts +125 -0
- package/lib/constants.cjs +43 -0
- package/lib/constants.d.ts +39 -0
- package/lib/errors.cjs +28 -0
- package/lib/errors.d.ts +21 -0
- package/lib/esm/TypeORMAdapter.d.ts +221 -0
- package/lib/esm/TypeORMAdapter.js +1124 -0
- package/lib/esm/TypeORMDispatch.d.ts +87 -0
- package/lib/esm/TypeORMDispatch.js +130 -0
- package/lib/esm/TypeORMEventSubscriber.d.ts +56 -0
- package/lib/esm/TypeORMEventSubscriber.js +93 -0
- package/lib/esm/TypeORMRepository.d.ts +125 -0
- package/lib/esm/TypeORMRepository.js +206 -0
- package/lib/esm/constants.d.ts +39 -0
- package/lib/esm/constants.js +40 -0
- package/lib/esm/errors.d.ts +21 -0
- package/lib/esm/errors.js +24 -0
- package/lib/esm/index.d.ts +22 -0
- package/lib/esm/index.js +25 -0
- package/lib/esm/indexes/generator.d.ts +50 -0
- package/lib/esm/indexes/generator.js +95 -0
- package/lib/esm/indexes/index.d.ts +1 -0
- package/lib/esm/indexes/index.js +2 -0
- package/lib/esm/overrides/Column.d.ts +74 -0
- package/lib/esm/overrides/Column.js +70 -0
- package/lib/esm/overrides/CreateDateColumn.d.ts +2 -0
- package/lib/esm/overrides/CreateDateColumn.js +9 -0
- package/lib/esm/overrides/Entity.d.ts +11 -0
- package/lib/esm/overrides/Entity.js +28 -0
- package/lib/esm/overrides/PrimaryColumn.d.ts +20 -0
- package/lib/esm/overrides/PrimaryColumn.js +53 -0
- package/lib/esm/overrides/PrimaryGeneratedColumn.d.ts +24 -0
- package/lib/esm/overrides/PrimaryGeneratedColumn.js +51 -0
- package/lib/esm/overrides/UpdateDateColumn.d.ts +2 -0
- package/lib/esm/overrides/UpdateDateColumn.js +9 -0
- package/lib/esm/overrides/utils.d.ts +2 -0
- package/lib/esm/overrides/utils.js +29 -0
- package/lib/esm/query/Paginator.d.ts +86 -0
- package/lib/esm/query/Paginator.js +124 -0
- package/lib/esm/query/Statement.d.ts +131 -0
- package/lib/esm/query/Statement.js +242 -0
- package/lib/esm/query/constants.d.ts +52 -0
- package/lib/esm/query/constants.js +74 -0
- package/lib/esm/query/index.d.ts +4 -0
- package/lib/esm/query/index.js +5 -0
- package/lib/esm/query/translate.d.ts +34 -0
- package/lib/esm/query/translate.js +42 -0
- package/lib/esm/raw/postgres.d.ts +36 -0
- package/lib/esm/raw/postgres.js +2 -0
- package/lib/esm/sequences/Sequence.d.ts +67 -0
- package/lib/esm/sequences/Sequence.js +117 -0
- package/lib/esm/sequences/index.d.ts +1 -0
- package/lib/esm/sequences/index.js +2 -0
- package/lib/esm/types.d.ts +67 -0
- package/lib/esm/types.js +28 -0
- package/lib/esm/utils.d.ts +16 -0
- package/lib/esm/utils.js +29 -0
- package/lib/index.cjs +42 -0
- package/lib/index.d.ts +22 -0
- package/lib/indexes/generator.cjs +98 -0
- package/lib/indexes/generator.d.ts +50 -0
- package/lib/indexes/index.cjs +18 -0
- package/lib/indexes/index.d.ts +1 -0
- package/lib/overrides/Column.cjs +73 -0
- package/lib/overrides/Column.d.ts +74 -0
- package/lib/overrides/CreateDateColumn.cjs +12 -0
- package/lib/overrides/CreateDateColumn.d.ts +2 -0
- package/lib/overrides/Entity.cjs +31 -0
- package/lib/overrides/Entity.d.ts +11 -0
- package/lib/overrides/PrimaryColumn.cjs +56 -0
- package/lib/overrides/PrimaryColumn.d.ts +20 -0
- package/lib/overrides/PrimaryGeneratedColumn.cjs +54 -0
- package/lib/overrides/PrimaryGeneratedColumn.d.ts +24 -0
- package/lib/overrides/UpdateDateColumn.cjs +12 -0
- package/lib/overrides/UpdateDateColumn.d.ts +2 -0
- package/lib/overrides/utils.cjs +32 -0
- package/lib/overrides/utils.d.ts +2 -0
- package/lib/query/Paginator.cjs +128 -0
- package/lib/query/Paginator.d.ts +86 -0
- package/lib/query/Statement.cjs +246 -0
- package/lib/query/Statement.d.ts +131 -0
- package/lib/query/constants.cjs +77 -0
- package/lib/query/constants.d.ts +52 -0
- package/lib/query/index.cjs +21 -0
- package/lib/query/index.d.ts +4 -0
- package/lib/query/translate.cjs +45 -0
- package/lib/query/translate.d.ts +34 -0
- package/lib/raw/postgres.cjs +3 -0
- package/lib/raw/postgres.d.ts +36 -0
- package/lib/sequences/Sequence.cjs +121 -0
- package/lib/sequences/Sequence.d.ts +67 -0
- package/lib/sequences/index.cjs +18 -0
- package/lib/sequences/index.d.ts +1 -0
- package/lib/types.cjs +31 -0
- package/lib/types.d.ts +67 -0
- package/lib/utils.cjs +32 -0
- package/lib/utils.d.ts +16 -0
- package/package.json +128 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { Condition, GroupOperator, Operator, Paginator, Statement } from "@decaf-ts/core";
|
|
2
|
+
import { Model } from "@decaf-ts/decorator-validation";
|
|
3
|
+
import { TypeORMQuery } from "../types";
|
|
4
|
+
import { TypeORMAdapter } from "../TypeORMAdapter";
|
|
5
|
+
import { SelectQueryBuilder } from "typeorm";
|
|
6
|
+
import { FindOptionsWhere } from "typeorm/find-options/FindOptionsWhere";
|
|
7
|
+
/**
|
|
8
|
+
* @description Statement builder for TypeORM-backed queries.
|
|
9
|
+
* @summary Provides a fluent interface for building SQL queries via TypeORM's SelectQueryBuilder with type safety and Decaf.ts abstractions.
|
|
10
|
+
* @template M The model type that extends Model.
|
|
11
|
+
* @template R The result type returned from execution.
|
|
12
|
+
* @param {TypeORMAdapter} adapter The TypeORM adapter.
|
|
13
|
+
* @class TypeORMStatement
|
|
14
|
+
* @example
|
|
15
|
+
* // Example using TypeORMStatement
|
|
16
|
+
* const statement = new TypeORMStatement<User, User[]>(adapter);
|
|
17
|
+
* const users = await statement
|
|
18
|
+
* .from(User)
|
|
19
|
+
* .where(Condition.attribute<User>('age').gt(18))
|
|
20
|
+
* .orderBy('lastName', 'asc')
|
|
21
|
+
* .limit(10)
|
|
22
|
+
* .execute();
|
|
23
|
+
*/
|
|
24
|
+
export declare class TypeORMStatement<M extends Model, R> extends Statement<TypeORMQuery<M>, M, R> {
|
|
25
|
+
protected adapter: TypeORMAdapter;
|
|
26
|
+
constructor(adapter: TypeORMAdapter);
|
|
27
|
+
/**
|
|
28
|
+
* @description Builds a TypeORM SelectQueryBuilder from the statement.
|
|
29
|
+
* @summary Converts the statement's conditions, selectors, and options into a TypeORM-backed query object.
|
|
30
|
+
* @return {TypeORMQuery} The built TypeORM query container.
|
|
31
|
+
* @throws {Error} If there are invalid query conditions.
|
|
32
|
+
* @mermaid
|
|
33
|
+
* sequenceDiagram
|
|
34
|
+
* participant Statement
|
|
35
|
+
* participant Repository
|
|
36
|
+
* participant parseCondition
|
|
37
|
+
*
|
|
38
|
+
* Statement->>Statement: build()
|
|
39
|
+
* Note over Statement: Initialize query
|
|
40
|
+
* Statement->>Repository: Get table name
|
|
41
|
+
* Repository-->>Statement: Return table name
|
|
42
|
+
* Statement->>Statement: Create base query
|
|
43
|
+
*
|
|
44
|
+
* alt Has selectSelector
|
|
45
|
+
* Statement->>Statement: Add columns to query
|
|
46
|
+
* end
|
|
47
|
+
*
|
|
48
|
+
* alt Has whereCondition
|
|
49
|
+
* Statement->>Statement: Create combined condition with table
|
|
50
|
+
* Statement->>parseCondition: Parse condition
|
|
51
|
+
* parseCondition-->>Statement: Return parsed conditions
|
|
52
|
+
* Statement->>Statement: Add conditions to query
|
|
53
|
+
* end
|
|
54
|
+
*
|
|
55
|
+
* alt Has orderBySelector
|
|
56
|
+
* Statement->>Statement: Add orderBy to query
|
|
57
|
+
* end
|
|
58
|
+
*
|
|
59
|
+
* alt Has limitSelector
|
|
60
|
+
* Statement->>Statement: Set limit
|
|
61
|
+
* else
|
|
62
|
+
* Statement->>Statement: Use default limit
|
|
63
|
+
* end
|
|
64
|
+
*
|
|
65
|
+
* alt Has offsetSelector
|
|
66
|
+
* Statement->>Statement: Set offset
|
|
67
|
+
* end
|
|
68
|
+
*
|
|
69
|
+
* Statement-->>Statement: Return query
|
|
70
|
+
*/
|
|
71
|
+
protected build(): TypeORMQuery<M>;
|
|
72
|
+
/**
|
|
73
|
+
* @description Creates a paginator for the statement.
|
|
74
|
+
* @summary Builds the query and returns a TypeORMPaginator for paginated results.
|
|
75
|
+
* @template R The result type.
|
|
76
|
+
* @param {number} size The page size.
|
|
77
|
+
* @return {Promise<Paginator<M, R, TypeORMQuery>>} A promise that resolves to a paginator.
|
|
78
|
+
* @throws {InternalError} If there's an error building the query.
|
|
79
|
+
*/
|
|
80
|
+
paginate<R>(size: number): Promise<Paginator<M, R, TypeORMQuery>>;
|
|
81
|
+
/**
|
|
82
|
+
* @description Processes a record.
|
|
83
|
+
* @summary Converts a raw result row to a model instance using the adapter.
|
|
84
|
+
* @param {any} r The raw record.
|
|
85
|
+
* @param {keyof M} pkAttr The primary key attribute of the model.
|
|
86
|
+
* @param {"Number" | "BigInt" | undefined} sequenceType The type of the sequence.
|
|
87
|
+
* @return {any} The processed record.
|
|
88
|
+
*/
|
|
89
|
+
private processRecord;
|
|
90
|
+
/**
|
|
91
|
+
* @description Executes a raw TypeORM query builder.
|
|
92
|
+
* @summary Sends the built SelectQueryBuilder to the database via TypeORM and returns the results.
|
|
93
|
+
* @template R The result type.
|
|
94
|
+
* @param {TypeORMQuery} rawInput The query container to execute.
|
|
95
|
+
* @return {Promise<R>} A promise that resolves to the query results.
|
|
96
|
+
*/
|
|
97
|
+
raw<R>(rawInput: TypeORMQuery<M>): Promise<R>;
|
|
98
|
+
protected parseConditionForPagination(condition: Condition<M>, tableName: string, counter?: number, conditionalOp?: GroupOperator | Operator): FindOptionsWhere<M>[] | FindOptionsWhere<M>;
|
|
99
|
+
/**
|
|
100
|
+
* @description Parses a condition into PostgreSQL conditions
|
|
101
|
+
* @summary Converts a Condition object into PostgreSQL condition structures
|
|
102
|
+
* @param {Condition<M>} condition - The condition to parse
|
|
103
|
+
* @param {string} [tableName] - the positional index of the arguments
|
|
104
|
+
* @return {TypeORMQuery} The PostgresSQL condition
|
|
105
|
+
* @mermaid
|
|
106
|
+
* sequenceDiagram
|
|
107
|
+
* participant Statement
|
|
108
|
+
* participant translateOperators
|
|
109
|
+
* participant parseCondition
|
|
110
|
+
*
|
|
111
|
+
* Statement->>Statement: parseCondition(condition)
|
|
112
|
+
*
|
|
113
|
+
* Note over Statement: Extract condition parts
|
|
114
|
+
*
|
|
115
|
+
* alt Simple comparison operator
|
|
116
|
+
* Statement->>translateOperators: translateOperators(operator)
|
|
117
|
+
* translateOperators-->>Statement: Return PostgreSQL operator
|
|
118
|
+
* Statement->>Statement: Create condition with column, operator, and value
|
|
119
|
+
* else NOT operator
|
|
120
|
+
* Statement->>Statement: parseCondition(attr1)
|
|
121
|
+
* Statement->>Statement: Add NOT to conditions
|
|
122
|
+
* else AND/OR operator
|
|
123
|
+
* Statement->>Statement: parseCondition(attr1)
|
|
124
|
+
* Statement->>Statement: parseCondition(comparison)
|
|
125
|
+
* Statement->>Statement: Combine conditions with AND/OR
|
|
126
|
+
* end
|
|
127
|
+
*
|
|
128
|
+
* Statement-->>Statement: Return conditions array
|
|
129
|
+
*/
|
|
130
|
+
protected parseCondition(condition: Condition<M>, tableName: string, qb: SelectQueryBuilder<any>, counter?: number, conditionalOp?: GroupOperator | Operator): TypeORMQuery<M>;
|
|
131
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TypeORMConst = exports.TypeORMGroupOperator = exports.TypeORMOperator = exports.TypeORMQueryLimit = void 0;
|
|
4
|
+
const types_1 = require("./../types.cjs");
|
|
5
|
+
/**
|
|
6
|
+
* @description Default query limit for TypeORM-backed queries.
|
|
7
|
+
* @summary Maximum number of records to return in a single page when paginating results.
|
|
8
|
+
* @const TypeORMQueryLimit
|
|
9
|
+
* @memberOf module:for-typeorm
|
|
10
|
+
*/
|
|
11
|
+
exports.TypeORMQueryLimit = 250;
|
|
12
|
+
/**
|
|
13
|
+
* @description Mapping of operator names to SQL operators.
|
|
14
|
+
* @summary Constants for comparison operators used when translating high-level filters into SQL via TypeORM.
|
|
15
|
+
* @typedef {Object} PostgreSQLOperatorType
|
|
16
|
+
* @property {string} EQUAL Equality operator (=)
|
|
17
|
+
* @property {string} DIFFERENT Inequality operator (<>)
|
|
18
|
+
* @property {string} BIGGER Greater than operator (>)
|
|
19
|
+
* @property {string} BIGGER_EQ Greater than or equal operator (>=)
|
|
20
|
+
* @property {string} SMALLER Less than operator (<)
|
|
21
|
+
* @property {string} SMALLER_EQ Less than or equal operator (<=)
|
|
22
|
+
* @property {string} NOT Negation operator (NOT)
|
|
23
|
+
* @property {string} IN In array operator (IN)
|
|
24
|
+
* @property {string} REGEXP Regular expression operator (~)
|
|
25
|
+
* @property {string} IREGEXP Case-insensitive regular expression operator (~*)
|
|
26
|
+
* @property {string} LIKE Pattern matching operator (LIKE)
|
|
27
|
+
* @property {string} ILIKE Case-insensitive pattern matching operator (ILIKE)
|
|
28
|
+
* @property {string} BETWEEN Range operator (BETWEEN)
|
|
29
|
+
* @property {string} IS_NULL NULL check operator (IS NULL)
|
|
30
|
+
* @property {string} IS_NOT_NULL NOT NULL check operator (IS NOT NULL)
|
|
31
|
+
* @const TypeORMOperator
|
|
32
|
+
* @type {PostgreSQLOperatorType}
|
|
33
|
+
* @memberOf module:for-typeorm
|
|
34
|
+
*/
|
|
35
|
+
exports.TypeORMOperator = {
|
|
36
|
+
EQUAL: types_1.SQLOperator.EQUAL,
|
|
37
|
+
DIFFERENT: types_1.SQLOperator.NOT_EQUAL,
|
|
38
|
+
BIGGER: types_1.SQLOperator.GREATER_THAN,
|
|
39
|
+
BIGGER_EQ: types_1.SQLOperator.GREATER_THAN_OR_EQUAL,
|
|
40
|
+
SMALLER: types_1.SQLOperator.LESS_THAN,
|
|
41
|
+
SMALLER_EQ: types_1.SQLOperator.LESS_THAN_OR_EQUAL,
|
|
42
|
+
BETWEEN: types_1.SQLOperator.BETWEEN,
|
|
43
|
+
NOT: "NOT",
|
|
44
|
+
IN: types_1.SQLOperator.IN,
|
|
45
|
+
IS_NULL: types_1.SQLOperator.IS_NULL,
|
|
46
|
+
IS_NOT_NULL: types_1.SQLOperator.IS_NOT_NULL,
|
|
47
|
+
REGEXP: "~",
|
|
48
|
+
IREGEXP: "~*",
|
|
49
|
+
LIKE: types_1.SQLOperator.LIKE,
|
|
50
|
+
ILIKE: types_1.SQLOperator.ILIKE,
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* @description Mapping of logical operator names to SQL operators.
|
|
54
|
+
* @summary Constants for logical operators used when building WHERE clause groups in TypeORM queries.
|
|
55
|
+
* @typedef {Object} PostgreSQLGroupOperatorType
|
|
56
|
+
* @property {string} AND Logical AND operator (AND)
|
|
57
|
+
* @property {string} OR Logical OR operator (OR)
|
|
58
|
+
* @const TypeORMGroupOperator
|
|
59
|
+
* @type {PostgreSQLGroupOperatorType}
|
|
60
|
+
* @memberOf module:for-typeorm
|
|
61
|
+
*/
|
|
62
|
+
exports.TypeORMGroupOperator = {
|
|
63
|
+
AND: "AND",
|
|
64
|
+
OR: "OR",
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* @description Special constant values used in queries.
|
|
68
|
+
* @summary String constants representing special values used while composing SQL with TypeORM.
|
|
69
|
+
* @typedef {Object} PostgreSQLConstType
|
|
70
|
+
* @property {string} NULL String representation of null value.
|
|
71
|
+
* @const TypeORMConst
|
|
72
|
+
* @memberOf module:for-typeorm
|
|
73
|
+
*/
|
|
74
|
+
exports.TypeORMConst = {
|
|
75
|
+
NULL: "NULL",
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3F1ZXJ5L2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwQ0FBdUM7QUFFdkM7Ozs7O0dBS0c7QUFDVSxRQUFBLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztBQUVyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNVLFFBQUEsZUFBZSxHQUF5QztJQUNuRSxLQUFLLEVBQUUsbUJBQVcsQ0FBQyxLQUFLO0lBQ3hCLFNBQVMsRUFBRSxtQkFBVyxDQUFDLFNBQVM7SUFDaEMsTUFBTSxFQUFFLG1CQUFXLENBQUMsWUFBWTtJQUNoQyxTQUFTLEVBQUUsbUJBQVcsQ0FBQyxxQkFBcUI7SUFDNUMsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztJQUM5QixVQUFVLEVBQUUsbUJBQVcsQ0FBQyxrQkFBa0I7SUFDMUMsT0FBTyxFQUFFLG1CQUFXLENBQUMsT0FBTztJQUM1QixHQUFHLEVBQUUsS0FBSztJQUNWLEVBQUUsRUFBRSxtQkFBVyxDQUFDLEVBQUU7SUFDbEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsT0FBTztJQUM1QixXQUFXLEVBQUUsbUJBQVcsQ0FBQyxXQUFXO0lBQ3BDLE1BQU0sRUFBRSxHQUFHO0lBQ1gsT0FBTyxFQUFFLElBQUk7SUFDYixJQUFJLEVBQUUsbUJBQVcsQ0FBQyxJQUFJO0lBQ3RCLEtBQUssRUFBRSxtQkFBVyxDQUFDLEtBQUs7Q0FDekIsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNVLFFBQUEsb0JBQW9CLEdBQTJCO0lBQzFELEdBQUcsRUFBRSxLQUFLO0lBQ1YsRUFBRSxFQUFFLElBQUk7Q0FDVCxDQUFDO0FBRUY7Ozs7Ozs7R0FPRztBQUNVLFFBQUEsWUFBWSxHQUEyQjtJQUNsRCxJQUFJLEVBQUUsTUFBTTtDQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTUUxPcGVyYXRvciB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHF1ZXJ5IGxpbWl0IGZvciBUeXBlT1JNLWJhY2tlZCBxdWVyaWVzLlxuICogQHN1bW1hcnkgTWF4aW11bSBudW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4gaW4gYSBzaW5nbGUgcGFnZSB3aGVuIHBhZ2luYXRpbmcgcmVzdWx0cy5cbiAqIEBjb25zdCBUeXBlT1JNUXVlcnlMaW1pdFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STVF1ZXJ5TGltaXQgPSAyNTA7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcHBpbmcgb2Ygb3BlcmF0b3IgbmFtZXMgdG8gU1FMIG9wZXJhdG9ycy5cbiAqIEBzdW1tYXJ5IENvbnN0YW50cyBmb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgdXNlZCB3aGVuIHRyYW5zbGF0aW5nIGhpZ2gtbGV2ZWwgZmlsdGVycyBpbnRvIFNRTCB2aWEgVHlwZU9STS5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc3RncmVTUUxPcGVyYXRvclR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFUVVBTCBFcXVhbGl0eSBvcGVyYXRvciAoPSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBESUZGRVJFTlQgSW5lcXVhbGl0eSBvcGVyYXRvciAoPD4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHR0VSIEdyZWF0ZXIgdGhhbiBvcGVyYXRvciAoPilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCSUdHRVJfRVEgR3JlYXRlciB0aGFuIG9yIGVxdWFsIG9wZXJhdG9yICg+PSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTTUFMTEVSIExlc3MgdGhhbiBvcGVyYXRvciAoPClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTTUFMTEVSX0VRIExlc3MgdGhhbiBvciBlcXVhbCBvcGVyYXRvciAoPD0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTk9UIE5lZ2F0aW9uIG9wZXJhdG9yIChOT1QpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU4gSW4gYXJyYXkgb3BlcmF0b3IgKElOKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFR0VYUCBSZWd1bGFyIGV4cHJlc3Npb24gb3BlcmF0b3IgKH4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSVJFR0VYUCBDYXNlLWluc2Vuc2l0aXZlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvcGVyYXRvciAofiopXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTElLRSBQYXR0ZXJuIG1hdGNoaW5nIG9wZXJhdG9yIChMSUtFKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElMSUtFIENhc2UtaW5zZW5zaXRpdmUgcGF0dGVybiBtYXRjaGluZyBvcGVyYXRvciAoSUxJS0UpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQkVUV0VFTiBSYW5nZSBvcGVyYXRvciAoQkVUV0VFTilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJU19OVUxMIE5VTEwgY2hlY2sgb3BlcmF0b3IgKElTIE5VTEwpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSVNfTk9UX05VTEwgTk9UIE5VTEwgY2hlY2sgb3BlcmF0b3IgKElTIE5PVCBOVUxMKVxuICogQGNvbnN0IFR5cGVPUk1PcGVyYXRvclxuICogQHR5cGUge1Bvc3RncmVTUUxPcGVyYXRvclR5cGV9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNT3BlcmF0b3I6IFJlY29yZDxzdHJpbmcsIFNRTE9wZXJhdG9yIHwgc3RyaW5nPiA9IHtcbiAgRVFVQUw6IFNRTE9wZXJhdG9yLkVRVUFMLFxuICBESUZGRVJFTlQ6IFNRTE9wZXJhdG9yLk5PVF9FUVVBTCxcbiAgQklHR0VSOiBTUUxPcGVyYXRvci5HUkVBVEVSX1RIQU4sXG4gIEJJR0dFUl9FUTogU1FMT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMLFxuICBTTUFMTEVSOiBTUUxPcGVyYXRvci5MRVNTX1RIQU4sXG4gIFNNQUxMRVJfRVE6IFNRTE9wZXJhdG9yLkxFU1NfVEhBTl9PUl9FUVVBTCxcbiAgQkVUV0VFTjogU1FMT3BlcmF0b3IuQkVUV0VFTixcbiAgTk9UOiBcIk5PVFwiLFxuICBJTjogU1FMT3BlcmF0b3IuSU4sXG4gIElTX05VTEw6IFNRTE9wZXJhdG9yLklTX05VTEwsXG4gIElTX05PVF9OVUxMOiBTUUxPcGVyYXRvci5JU19OT1RfTlVMTCxcbiAgUkVHRVhQOiBcIn5cIixcbiAgSVJFR0VYUDogXCJ+KlwiLFxuICBMSUtFOiBTUUxPcGVyYXRvci5MSUtFLFxuICBJTElLRTogU1FMT3BlcmF0b3IuSUxJS0UsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIGxvZ2ljYWwgb3BlcmF0b3IgbmFtZXMgdG8gU1FMIG9wZXJhdG9ycy5cbiAqIEBzdW1tYXJ5IENvbnN0YW50cyBmb3IgbG9naWNhbCBvcGVyYXRvcnMgdXNlZCB3aGVuIGJ1aWxkaW5nIFdIRVJFIGNsYXVzZSBncm91cHMgaW4gVHlwZU9STSBxdWVyaWVzLlxuICogQHR5cGVkZWYge09iamVjdH0gUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQU5EIExvZ2ljYWwgQU5EIG9wZXJhdG9yIChBTkQpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gT1IgTG9naWNhbCBPUiBvcGVyYXRvciAoT1IpXG4gKiBAY29uc3QgVHlwZU9STUdyb3VwT3BlcmF0b3JcbiAqIEB0eXBlIHtQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvclR5cGV9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNR3JvdXBPcGVyYXRvcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgQU5EOiBcIkFORFwiLFxuICBPUjogXCJPUlwiLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lhbCBjb25zdGFudCB2YWx1ZXMgdXNlZCBpbiBxdWVyaWVzLlxuICogQHN1bW1hcnkgU3RyaW5nIGNvbnN0YW50cyByZXByZXNlbnRpbmcgc3BlY2lhbCB2YWx1ZXMgdXNlZCB3aGlsZSBjb21wb3NpbmcgU1FMIHdpdGggVHlwZU9STS5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc3RncmVTUUxDb25zdFR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOVUxMIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBudWxsIHZhbHVlLlxuICogQGNvbnN0IFR5cGVPUk1Db25zdFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STUNvbnN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBOVUxMOiBcIk5VTExcIixcbn07XG4iXX0=
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { SQLOperator } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* @description Default query limit for TypeORM-backed queries.
|
|
4
|
+
* @summary Maximum number of records to return in a single page when paginating results.
|
|
5
|
+
* @const TypeORMQueryLimit
|
|
6
|
+
* @memberOf module:for-typeorm
|
|
7
|
+
*/
|
|
8
|
+
export declare const TypeORMQueryLimit = 250;
|
|
9
|
+
/**
|
|
10
|
+
* @description Mapping of operator names to SQL operators.
|
|
11
|
+
* @summary Constants for comparison operators used when translating high-level filters into SQL via TypeORM.
|
|
12
|
+
* @typedef {Object} PostgreSQLOperatorType
|
|
13
|
+
* @property {string} EQUAL Equality operator (=)
|
|
14
|
+
* @property {string} DIFFERENT Inequality operator (<>)
|
|
15
|
+
* @property {string} BIGGER Greater than operator (>)
|
|
16
|
+
* @property {string} BIGGER_EQ Greater than or equal operator (>=)
|
|
17
|
+
* @property {string} SMALLER Less than operator (<)
|
|
18
|
+
* @property {string} SMALLER_EQ Less than or equal operator (<=)
|
|
19
|
+
* @property {string} NOT Negation operator (NOT)
|
|
20
|
+
* @property {string} IN In array operator (IN)
|
|
21
|
+
* @property {string} REGEXP Regular expression operator (~)
|
|
22
|
+
* @property {string} IREGEXP Case-insensitive regular expression operator (~*)
|
|
23
|
+
* @property {string} LIKE Pattern matching operator (LIKE)
|
|
24
|
+
* @property {string} ILIKE Case-insensitive pattern matching operator (ILIKE)
|
|
25
|
+
* @property {string} BETWEEN Range operator (BETWEEN)
|
|
26
|
+
* @property {string} IS_NULL NULL check operator (IS NULL)
|
|
27
|
+
* @property {string} IS_NOT_NULL NOT NULL check operator (IS NOT NULL)
|
|
28
|
+
* @const TypeORMOperator
|
|
29
|
+
* @type {PostgreSQLOperatorType}
|
|
30
|
+
* @memberOf module:for-typeorm
|
|
31
|
+
*/
|
|
32
|
+
export declare const TypeORMOperator: Record<string, SQLOperator | string>;
|
|
33
|
+
/**
|
|
34
|
+
* @description Mapping of logical operator names to SQL operators.
|
|
35
|
+
* @summary Constants for logical operators used when building WHERE clause groups in TypeORM queries.
|
|
36
|
+
* @typedef {Object} PostgreSQLGroupOperatorType
|
|
37
|
+
* @property {string} AND Logical AND operator (AND)
|
|
38
|
+
* @property {string} OR Logical OR operator (OR)
|
|
39
|
+
* @const TypeORMGroupOperator
|
|
40
|
+
* @type {PostgreSQLGroupOperatorType}
|
|
41
|
+
* @memberOf module:for-typeorm
|
|
42
|
+
*/
|
|
43
|
+
export declare const TypeORMGroupOperator: Record<string, string>;
|
|
44
|
+
/**
|
|
45
|
+
* @description Special constant values used in queries.
|
|
46
|
+
* @summary String constants representing special values used while composing SQL with TypeORM.
|
|
47
|
+
* @typedef {Object} PostgreSQLConstType
|
|
48
|
+
* @property {string} NULL String representation of null value.
|
|
49
|
+
* @const TypeORMConst
|
|
50
|
+
* @memberOf module:for-typeorm
|
|
51
|
+
*/
|
|
52
|
+
export declare const TypeORMConst: Record<string, string>;
|
|
@@ -0,0 +1,21 @@
|
|
|
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("./constants.cjs"), exports);
|
|
18
|
+
__exportStar(require("./Paginator.cjs"), exports);
|
|
19
|
+
__exportStar(require("./Statement.cjs"), exports);
|
|
20
|
+
__exportStar(require("./translate.cjs"), exports);
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcXVlcnkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtEQUE0QjtBQUM1QixrREFBNEI7QUFDNUIsa0RBQTRCO0FBQzVCLGtEQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUGFnaW5hdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9TdGF0ZW1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RyYW5zbGF0ZVwiO1xuIl19
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.translateOperators = translateOperators;
|
|
4
|
+
const constants_1 = require("./constants.cjs");
|
|
5
|
+
const core_1 = require("@decaf-ts/core");
|
|
6
|
+
/**
|
|
7
|
+
* @description Translates core operators to TypeORM SQL operators.
|
|
8
|
+
* @summary Converts Decaf.ts core operators to their equivalent SQL operators used by the TypeORM adapter.
|
|
9
|
+
* @param {GroupOperator | Operator} operator The core operator to translate.
|
|
10
|
+
* @return {SQLOperator | string} The equivalent SQL operator.
|
|
11
|
+
* @throws {QueryError} If no translation exists for the given operator.
|
|
12
|
+
* @function translateOperators
|
|
13
|
+
* @memberOf module:for-typeorm
|
|
14
|
+
* @mermaid
|
|
15
|
+
* sequenceDiagram
|
|
16
|
+
* participant Caller
|
|
17
|
+
* participant translateOperators
|
|
18
|
+
* participant PostgreSQLOperator
|
|
19
|
+
* participant PostgreSQLGroupOperator
|
|
20
|
+
*
|
|
21
|
+
* Caller->>translateOperators: operator
|
|
22
|
+
*
|
|
23
|
+
* translateOperators->>PostgreSQLOperator: Check for match
|
|
24
|
+
* alt Found in PostgreSQLOperator
|
|
25
|
+
* PostgreSQLOperator-->>translateOperators: Return matching operator
|
|
26
|
+
* translateOperators-->>Caller: Return SQLOperator
|
|
27
|
+
* else Not found
|
|
28
|
+
* translateOperators->>PostgreSQLGroupOperator: Check for match
|
|
29
|
+
* alt Found in PostgreSQLGroupOperator
|
|
30
|
+
* PostgreSQLGroupOperator-->>translateOperators: Return matching operator
|
|
31
|
+
* translateOperators-->>Caller: Return string
|
|
32
|
+
* else Not found
|
|
33
|
+
* translateOperators-->>Caller: Throw QueryError
|
|
34
|
+
* end
|
|
35
|
+
* end
|
|
36
|
+
*/
|
|
37
|
+
function translateOperators(operator) {
|
|
38
|
+
for (const operators of [constants_1.TypeORMOperator, constants_1.TypeORMGroupOperator]) {
|
|
39
|
+
const el = Object.keys(operators).find((k) => k === operator);
|
|
40
|
+
if (el)
|
|
41
|
+
return operators[el];
|
|
42
|
+
}
|
|
43
|
+
throw new core_1.QueryError(`Could not find adapter translation for operator ${operator}`);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3F1ZXJ5L3RyYW5zbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW9DQSxnREFVQztBQTdDRCwrQ0FBb0U7QUFDcEUseUNBQTRDO0FBRzVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxTQUFnQixrQkFBa0IsQ0FDaEMsUUFBa0M7SUFFbEMsS0FBSyxNQUFNLFNBQVMsSUFBSSxDQUFDLDJCQUFlLEVBQUUsZ0NBQW9CLENBQUMsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDOUQsSUFBSSxFQUFFO1lBQUUsT0FBTyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELE1BQU0sSUFBSSxpQkFBVSxDQUNsQixtREFBbUQsUUFBUSxFQUFFLENBQzlELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR3JvdXBPcGVyYXRvciwgT3BlcmF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFR5cGVPUk1Hcm91cE9wZXJhdG9yLCBUeXBlT1JNT3BlcmF0b3IgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFF1ZXJ5RXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFNRTE9wZXJhdG9yIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRyYW5zbGF0ZXMgY29yZSBvcGVyYXRvcnMgdG8gVHlwZU9STSBTUUwgb3BlcmF0b3JzLlxuICogQHN1bW1hcnkgQ29udmVydHMgRGVjYWYudHMgY29yZSBvcGVyYXRvcnMgdG8gdGhlaXIgZXF1aXZhbGVudCBTUUwgb3BlcmF0b3JzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7R3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yfSBvcGVyYXRvciBUaGUgY29yZSBvcGVyYXRvciB0byB0cmFuc2xhdGUuXG4gKiBAcmV0dXJuIHtTUUxPcGVyYXRvciB8IHN0cmluZ30gVGhlIGVxdWl2YWxlbnQgU1FMIG9wZXJhdG9yLlxuICogQHRocm93cyB7UXVlcnlFcnJvcn0gSWYgbm8gdHJhbnNsYXRpb24gZXhpc3RzIGZvciB0aGUgZ2l2ZW4gb3BlcmF0b3IuXG4gKiBAZnVuY3Rpb24gdHJhbnNsYXRlT3BlcmF0b3JzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCB0cmFuc2xhdGVPcGVyYXRvcnNcbiAqICAgcGFydGljaXBhbnQgUG9zdGdyZVNRTE9wZXJhdG9yXG4gKiAgIHBhcnRpY2lwYW50IFBvc3RncmVTUUxHcm91cE9wZXJhdG9yXG4gKlxuICogICBDYWxsZXItPj50cmFuc2xhdGVPcGVyYXRvcnM6IG9wZXJhdG9yXG4gKlxuICogICB0cmFuc2xhdGVPcGVyYXRvcnMtPj5Qb3N0Z3JlU1FMT3BlcmF0b3I6IENoZWNrIGZvciBtYXRjaFxuICogICBhbHQgRm91bmQgaW4gUG9zdGdyZVNRTE9wZXJhdG9yXG4gKiAgICAgUG9zdGdyZVNRTE9wZXJhdG9yLS0+PnRyYW5zbGF0ZU9wZXJhdG9yczogUmV0dXJuIG1hdGNoaW5nIG9wZXJhdG9yXG4gKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PkNhbGxlcjogUmV0dXJuIFNRTE9wZXJhdG9yXG4gKiAgIGVsc2UgTm90IGZvdW5kXG4gKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLT4+UG9zdGdyZVNRTEdyb3VwT3BlcmF0b3I6IENoZWNrIGZvciBtYXRjaFxuICogICAgIGFsdCBGb3VuZCBpbiBQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvclxuICogICAgICAgUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3ItLT4+dHJhbnNsYXRlT3BlcmF0b3JzOiBSZXR1cm4gbWF0Y2hpbmcgb3BlcmF0b3JcbiAqICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0tPj5DYWxsZXI6IFJldHVybiBzdHJpbmdcbiAqICAgICBlbHNlIE5vdCBmb3VuZFxuICogICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PkNhbGxlcjogVGhyb3cgUXVlcnlFcnJvclxuICogICAgIGVuZFxuICogICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZU9wZXJhdG9ycyhcbiAgb3BlcmF0b3I6IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuKTogU1FMT3BlcmF0b3IgfCBzdHJpbmcge1xuICBmb3IgKGNvbnN0IG9wZXJhdG9ycyBvZiBbVHlwZU9STU9wZXJhdG9yLCBUeXBlT1JNR3JvdXBPcGVyYXRvcl0pIHtcbiAgICBjb25zdCBlbCA9IE9iamVjdC5rZXlzKG9wZXJhdG9ycykuZmluZCgoaykgPT4gayA9PT0gb3BlcmF0b3IpO1xuICAgIGlmIChlbCkgcmV0dXJuIG9wZXJhdG9yc1tlbF07XG4gIH1cbiAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgYENvdWxkIG5vdCBmaW5kIGFkYXB0ZXIgdHJhbnNsYXRpb24gZm9yIG9wZXJhdG9yICR7b3BlcmF0b3J9YFxuICApO1xufVxuIl19
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { GroupOperator, Operator } from "@decaf-ts/core";
|
|
2
|
+
import { SQLOperator } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* @description Translates core operators to TypeORM SQL operators.
|
|
5
|
+
* @summary Converts Decaf.ts core operators to their equivalent SQL operators used by the TypeORM adapter.
|
|
6
|
+
* @param {GroupOperator | Operator} operator The core operator to translate.
|
|
7
|
+
* @return {SQLOperator | string} The equivalent SQL operator.
|
|
8
|
+
* @throws {QueryError} If no translation exists for the given operator.
|
|
9
|
+
* @function translateOperators
|
|
10
|
+
* @memberOf module:for-typeorm
|
|
11
|
+
* @mermaid
|
|
12
|
+
* sequenceDiagram
|
|
13
|
+
* participant Caller
|
|
14
|
+
* participant translateOperators
|
|
15
|
+
* participant PostgreSQLOperator
|
|
16
|
+
* participant PostgreSQLGroupOperator
|
|
17
|
+
*
|
|
18
|
+
* Caller->>translateOperators: operator
|
|
19
|
+
*
|
|
20
|
+
* translateOperators->>PostgreSQLOperator: Check for match
|
|
21
|
+
* alt Found in PostgreSQLOperator
|
|
22
|
+
* PostgreSQLOperator-->>translateOperators: Return matching operator
|
|
23
|
+
* translateOperators-->>Caller: Return SQLOperator
|
|
24
|
+
* else Not found
|
|
25
|
+
* translateOperators->>PostgreSQLGroupOperator: Check for match
|
|
26
|
+
* alt Found in PostgreSQLGroupOperator
|
|
27
|
+
* PostgreSQLGroupOperator-->>translateOperators: Return matching operator
|
|
28
|
+
* translateOperators-->>Caller: Return string
|
|
29
|
+
* else Not found
|
|
30
|
+
* translateOperators-->>Caller: Throw QueryError
|
|
31
|
+
* end
|
|
32
|
+
* end
|
|
33
|
+
*/
|
|
34
|
+
export declare function translateOperators(operator: GroupOperator | Operator): SQLOperator | string;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmF3L3Bvc3RncmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZpbml0aW9uIG9mIGEgUG9zdGdyZVNRTCByZXN1bHQgZmllbGQuXG4gKiBAc3VtbWFyeSBEZXNjcmliZXMgbWV0YWRhdGEgZm9yIGEgY29sdW1uIHJldHVybmVkIGluIGEgUG9zdGdyZVNRTCBxdWVyeSByZXN1bHQsIGluY2x1ZGluZyBpZGVudGlmaWVycyBhbmQgdHlwZSBpbmZvcm1hdGlvbi5cbiAqIEBpbnRlcmZhY2UgRmllbGREZWZcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWVsZERlZiB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFibGVJRDogbnVtYmVyO1xuICBjb2x1bW5JRDogbnVtYmVyO1xuICBkYXRhVHlwZUlEOiBudW1iZXI7XG4gIGRhdGFUeXBlU2l6ZTogbnVtYmVyO1xuICBkYXRhVHlwZU1vZGlmaWVyOiBudW1iZXI7XG4gIGZvcm1hdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIHNoYXBlIGZvciBQb3N0Z3JlU1FMIHF1ZXJ5IHJlc3VsdHMuXG4gKiBAc3VtbWFyeSBDb250YWlucyBjb21tb24gcHJvcGVydGllcyBwcmVzZW50IGluIGFsbCBQb3N0Z3JlU1FMIHF1ZXJ5IHJlc3VsdHMgc3VjaCBhcyB0aGUgZXhlY3V0ZWQgY29tbWFuZCwgcm93IGNvdW50LCBvaWQsIGFuZCBmaWVsZHMgbWV0YWRhdGEuXG4gKiBAaW50ZXJmYWNlIFF1ZXJ5UmVzdWx0QmFzZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5UmVzdWx0QmFzZSB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgcm93Q291bnQ6IG51bWJlciB8IG51bGw7XG4gIG9pZDogbnVtYmVyO1xuICBmaWVsZHM6IEZpZWxkRGVmW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlSZXN1bHRSb3cge1xuICBbY29sdW1uOiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlSZXN1bHQ8UiBleHRlbmRzIFF1ZXJ5UmVzdWx0Um93ID0gYW55PlxuICBleHRlbmRzIFF1ZXJ5UmVzdWx0QmFzZSB7XG4gIHJvd3M6IFJbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUFycmF5UmVzdWx0PFIgZXh0ZW5kcyBhbnlbXSA9IGFueVtdPlxuICBleHRlbmRzIFF1ZXJ5UmVzdWx0QmFzZSB7XG4gIHJvd3M6IFJbXTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Definition of a PostgreSQL result field.
|
|
3
|
+
* @summary Describes metadata for a column returned in a PostgreSQL query result, including identifiers and type information.
|
|
4
|
+
* @interface FieldDef
|
|
5
|
+
* @memberOf module:for-typeorm
|
|
6
|
+
*/
|
|
7
|
+
export interface FieldDef {
|
|
8
|
+
name: string;
|
|
9
|
+
tableID: number;
|
|
10
|
+
columnID: number;
|
|
11
|
+
dataTypeID: number;
|
|
12
|
+
dataTypeSize: number;
|
|
13
|
+
dataTypeModifier: number;
|
|
14
|
+
format: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* @description Base shape for PostgreSQL query results.
|
|
18
|
+
* @summary Contains common properties present in all PostgreSQL query results such as the executed command, row count, oid, and fields metadata.
|
|
19
|
+
* @interface QueryResultBase
|
|
20
|
+
* @memberOf module:for-typeorm
|
|
21
|
+
*/
|
|
22
|
+
export interface QueryResultBase {
|
|
23
|
+
command: string;
|
|
24
|
+
rowCount: number | null;
|
|
25
|
+
oid: number;
|
|
26
|
+
fields: FieldDef[];
|
|
27
|
+
}
|
|
28
|
+
export interface QueryResultRow {
|
|
29
|
+
[column: string]: any;
|
|
30
|
+
}
|
|
31
|
+
export interface QueryResult<R extends QueryResultRow = any> extends QueryResultBase {
|
|
32
|
+
rows: R[];
|
|
33
|
+
}
|
|
34
|
+
export interface QueryArrayResult<R extends any[] = any[]> extends QueryResultBase {
|
|
35
|
+
rows: R[];
|
|
36
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TypeORMSequence = void 0;
|
|
4
|
+
const db_decorators_1 = require("@decaf-ts/db-decorators");
|
|
5
|
+
const core_1 = require("@decaf-ts/core");
|
|
6
|
+
/**
|
|
7
|
+
* @description Abstract implementation of a database sequence for TypeORM.
|
|
8
|
+
* @summary Provides the basic functionality for {@link Sequence}s, delegating to the {@link TypeORMAdapter} to fetch and increment values while handling type parsing and error translation.
|
|
9
|
+
* @param {SequenceOptions} options The sequence configuration options (name, type, startWith, incrementBy, etc.).
|
|
10
|
+
* @param {TypeORMAdapter} adapter The TypeORM adapter used to execute sequence operations.
|
|
11
|
+
* @class TypeORMSequence
|
|
12
|
+
* @implements Sequence
|
|
13
|
+
* @example
|
|
14
|
+
* // Create and use a TypeORM-backed sequence
|
|
15
|
+
* const seq = new TypeORMSequence({ name: "user_id_seq", type: "Number", startWith: 1, incrementBy: 1 }, adapter);
|
|
16
|
+
* const nextId = await seq.next();
|
|
17
|
+
*
|
|
18
|
+
* @mermaid
|
|
19
|
+
* sequenceDiagram
|
|
20
|
+
* participant App
|
|
21
|
+
* participant Seq as TypeORMSequence
|
|
22
|
+
* participant Adapter as TypeORMAdapter
|
|
23
|
+
* participant DB as Database
|
|
24
|
+
* App->>Seq: next()
|
|
25
|
+
* Seq->>Seq: current()
|
|
26
|
+
* Seq->>Adapter: raw(SELECT current_value ...)
|
|
27
|
+
* Adapter->>DB: Query current value
|
|
28
|
+
* DB-->>Adapter: current_value
|
|
29
|
+
* Adapter-->>Seq: value
|
|
30
|
+
* Seq->>Seq: increment(current)
|
|
31
|
+
* Seq->>Adapter: raw(nextval(name))
|
|
32
|
+
* Adapter->>DB: nextval()
|
|
33
|
+
* DB-->>Adapter: next value
|
|
34
|
+
* Adapter-->>Seq: value
|
|
35
|
+
* Seq-->>App: parsed next value
|
|
36
|
+
*/
|
|
37
|
+
class TypeORMSequence extends core_1.Sequence {
|
|
38
|
+
constructor(options, adapter) {
|
|
39
|
+
super(options);
|
|
40
|
+
this.adapter = adapter;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* @summary Retrieves the current value for the sequence
|
|
44
|
+
* @protected
|
|
45
|
+
*/
|
|
46
|
+
async current() {
|
|
47
|
+
const { name } = this.options;
|
|
48
|
+
try {
|
|
49
|
+
const seq = await this.adapter.raw({
|
|
50
|
+
query: `SELECT current_value FROM information_schema.sequences WHERE sequence_name = $1`,
|
|
51
|
+
values: [name],
|
|
52
|
+
});
|
|
53
|
+
return this.parse(seq.current_value);
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
throw this.adapter.parseError(e);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* @summary Parses the {@link Sequence} value
|
|
61
|
+
*
|
|
62
|
+
* @protected
|
|
63
|
+
* @param value
|
|
64
|
+
*/
|
|
65
|
+
parse(value) {
|
|
66
|
+
return core_1.Sequence.parseValue(this.options.type, value);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* @summary increments the sequence
|
|
70
|
+
* @description Sequence specific implementation
|
|
71
|
+
*
|
|
72
|
+
* @param {string | number | bigint} current
|
|
73
|
+
* @param count
|
|
74
|
+
* @protected
|
|
75
|
+
*/
|
|
76
|
+
async increment(current, count) {
|
|
77
|
+
const { type, incrementBy, name, startWith } = this.options;
|
|
78
|
+
if (type !== "Number" && type !== "BigInt")
|
|
79
|
+
throw new db_decorators_1.InternalError(`Cannot increment sequence of type ${type} with ${count}`);
|
|
80
|
+
let next;
|
|
81
|
+
try {
|
|
82
|
+
next = await this.adapter.raw({
|
|
83
|
+
query: `SELECT nextval($1);`,
|
|
84
|
+
values: [name],
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
if (!(e instanceof db_decorators_1.NotFoundError))
|
|
89
|
+
throw e;
|
|
90
|
+
next = await this.adapter.raw({
|
|
91
|
+
query: `CREATE SEQUENCE IF NOT EXISTS $1 START WITH $2 INCREMENT BY $3 NO CYCLE;`,
|
|
92
|
+
values: [name, startWith, incrementBy],
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return next;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* @summary Generates the next value in th sequence
|
|
99
|
+
* @description calls {@link Sequence#parse} on the current value
|
|
100
|
+
* followed by {@link Sequence#increment}
|
|
101
|
+
*
|
|
102
|
+
*/
|
|
103
|
+
async next() {
|
|
104
|
+
const current = await this.current();
|
|
105
|
+
return this.increment(current);
|
|
106
|
+
}
|
|
107
|
+
async range(count) {
|
|
108
|
+
const current = (await this.current());
|
|
109
|
+
const incrementBy = this.parse(this.options.incrementBy);
|
|
110
|
+
const next = await this.increment(current, this.parse(count) * incrementBy);
|
|
111
|
+
const range = [];
|
|
112
|
+
for (let i = 1; i <= count; i++) {
|
|
113
|
+
range.push(current + incrementBy * this.parse(i));
|
|
114
|
+
}
|
|
115
|
+
if (range[range.length - 1] !== next)
|
|
116
|
+
throw new db_decorators_1.InternalError("Miscalculation of range");
|
|
117
|
+
return range;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.TypeORMSequence = TypeORMSequence;
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VxdWVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VzL1NlcXVlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUF1RTtBQUV2RSx5Q0FBMEM7QUFHMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxlQUFRO0lBQzNDLFlBQ0UsT0FBd0IsRUFDZCxPQUF1QjtRQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFGTCxZQUFPLEdBQVAsT0FBTyxDQUFnQjtJQUduQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBUSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUN0QyxLQUFLLEVBQUUsaUZBQWlGO2dCQUN4RixNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7YUFDZixDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGFBQWdDLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxLQUFLLENBQUMsS0FBK0I7UUFDM0MsT0FBTyxlQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxDQUFDLFNBQVMsQ0FDckIsT0FBaUMsRUFDakMsS0FBYztRQUVkLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVELElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssUUFBUTtZQUN4QyxNQUFNLElBQUksNkJBQWEsQ0FDckIscUNBQXFDLElBQUksU0FBUyxLQUFLLEVBQUUsQ0FDMUQsQ0FBQztRQUNKLElBQUksSUFBOEIsQ0FBQztRQUNuQyxJQUFJLENBQUM7WUFDSCxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDNUIsS0FBSyxFQUFFLHFCQUFxQjtnQkFDNUIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO2FBQ2YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLDZCQUFhLENBQUM7Z0JBQUUsTUFBTSxDQUFDLENBQUM7WUFDM0MsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQzVCLEtBQUssRUFBRSwwRUFBMEU7Z0JBQ2pGLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDO2FBQ3ZDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLElBQWdDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBYTtRQUN2QixNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFXLENBQUM7UUFDakQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBVyxDQUFDO1FBQ25FLE1BQU0sSUFBSSxHQUE2QixNQUFNLElBQUksQ0FBQyxTQUFTLENBQ3pELE9BQU8sRUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBWSxHQUFHLFdBQVcsQ0FDNUMsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFpQyxFQUFFLENBQUM7UUFDL0MsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsR0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBWSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSTtZQUNsQyxNQUFNLElBQUksNkJBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBL0ZELDBDQStGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludGVybmFsRXJyb3IsIE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgZGF0YWJhc2Ugc2VxdWVuY2UgZm9yIFR5cGVPUk0uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBmb3Ige0BsaW5rIFNlcXVlbmNlfXMsIGRlbGVnYXRpbmcgdG8gdGhlIHtAbGluayBUeXBlT1JNQWRhcHRlcn0gdG8gZmV0Y2ggYW5kIGluY3JlbWVudCB2YWx1ZXMgd2hpbGUgaGFuZGxpbmcgdHlwZSBwYXJzaW5nIGFuZCBlcnJvciB0cmFuc2xhdGlvbi5cbiAqIEBwYXJhbSB7U2VxdWVuY2VPcHRpb25zfSBvcHRpb25zIFRoZSBzZXF1ZW5jZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKG5hbWUsIHR5cGUsIHN0YXJ0V2l0aCwgaW5jcmVtZW50QnksIGV0Yy4pLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyIHVzZWQgdG8gZXhlY3V0ZSBzZXF1ZW5jZSBvcGVyYXRpb25zLlxuICogQGNsYXNzIFR5cGVPUk1TZXF1ZW5jZVxuICogQGltcGxlbWVudHMgU2VxdWVuY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYW5kIHVzZSBhIFR5cGVPUk0tYmFja2VkIHNlcXVlbmNlXG4gKiBjb25zdCBzZXEgPSBuZXcgVHlwZU9STVNlcXVlbmNlKHsgbmFtZTogXCJ1c2VyX2lkX3NlcVwiLCB0eXBlOiBcIk51bWJlclwiLCBzdGFydFdpdGg6IDEsIGluY3JlbWVudEJ5OiAxIH0sIGFkYXB0ZXIpO1xuICogY29uc3QgbmV4dElkID0gYXdhaXQgc2VxLm5leHQoKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBTZXEgYXMgVHlwZU9STVNlcXVlbmNlXG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgREIgYXMgRGF0YWJhc2VcbiAqICAgQXBwLT4+U2VxOiBuZXh0KClcbiAqICAgU2VxLT4+U2VxOiBjdXJyZW50KClcbiAqICAgU2VxLT4+QWRhcHRlcjogcmF3KFNFTEVDVCBjdXJyZW50X3ZhbHVlIC4uLilcbiAqICAgQWRhcHRlci0+PkRCOiBRdWVyeSBjdXJyZW50IHZhbHVlXG4gKiAgIERCLS0+PkFkYXB0ZXI6IGN1cnJlbnRfdmFsdWVcbiAqICAgQWRhcHRlci0tPj5TZXE6IHZhbHVlXG4gKiAgIFNlcS0+PlNlcTogaW5jcmVtZW50KGN1cnJlbnQpXG4gKiAgIFNlcS0+PkFkYXB0ZXI6IHJhdyhuZXh0dmFsKG5hbWUpKVxuICogICBBZGFwdGVyLT4+REI6IG5leHR2YWwoKVxuICogICBEQi0tPj5BZGFwdGVyOiBuZXh0IHZhbHVlXG4gKiAgIEFkYXB0ZXItLT4+U2VxOiB2YWx1ZVxuICogICBTZXEtLT4+QXBwOiBwYXJzZWQgbmV4dCB2YWx1ZVxuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STVNlcXVlbmNlIGV4dGVuZHMgU2VxdWVuY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMsXG4gICAgcHJvdGVjdGVkIGFkYXB0ZXI6IFR5cGVPUk1BZGFwdGVyXG4gICkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIHNlcXVlbmNlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIGFzeW5jIGN1cnJlbnQoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IHRoaXMub3B0aW9ucztcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VxOiBhbnkgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHtcbiAgICAgICAgcXVlcnk6IGBTRUxFQ1QgY3VycmVudF92YWx1ZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5zZXF1ZW5jZXMgV0hFUkUgc2VxdWVuY2VfbmFtZSA9ICQxYCxcbiAgICAgICAgdmFsdWVzOiBbbmFtZV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlKHNlcS5jdXJyZW50X3ZhbHVlIGFzIHN0cmluZyB8IG51bWJlcik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5hZGFwdGVyLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFBhcnNlcyB0aGUge0BsaW5rIFNlcXVlbmNlfSB2YWx1ZVxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KTogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50IHtcbiAgICByZXR1cm4gU2VxdWVuY2UucGFyc2VWYWx1ZSh0aGlzLm9wdGlvbnMudHlwZSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IGluY3JlbWVudHMgdGhlIHNlcXVlbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBTZXF1ZW5jZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IGJpZ2ludH0gY3VycmVudFxuICAgKiBAcGFyYW0gY291bnRcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbmNyZW1lbnQoXG4gICAgY3VycmVudDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIGNvdW50PzogbnVtYmVyXG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PiB7XG4gICAgY29uc3QgeyB0eXBlLCBpbmNyZW1lbnRCeSwgbmFtZSwgc3RhcnRXaXRoIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKHR5cGUgIT09IFwiTnVtYmVyXCIgJiYgdHlwZSAhPT0gXCJCaWdJbnRcIilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQ2Fubm90IGluY3JlbWVudCBzZXF1ZW5jZSBvZiB0eXBlICR7dHlwZX0gd2l0aCAke2NvdW50fWBcbiAgICAgICk7XG4gICAgbGV0IG5leHQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbiAgICB0cnkge1xuICAgICAgbmV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYFNFTEVDVCBuZXh0dmFsKCQxKTtgLFxuICAgICAgICB2YWx1ZXM6IFtuYW1lXSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSkgdGhyb3cgZTtcbiAgICAgIG5leHQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHtcbiAgICAgICAgcXVlcnk6IGBDUkVBVEUgU0VRVUVOQ0UgSUYgTk9UIEVYSVNUUyAkMSBTVEFSVCBXSVRIICQyIElOQ1JFTUVOVCBCWSAkMyBOTyBDWUNMRTtgLFxuICAgICAgICB2YWx1ZXM6IFtuYW1lLCBzdGFydFdpdGgsIGluY3JlbWVudEJ5XSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0IGFzIHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgdGhlIG5leHQgdmFsdWUgaW4gdGggc2VxdWVuY2VcbiAgICogQGRlc2NyaXB0aW9uIGNhbGxzIHtAbGluayBTZXF1ZW5jZSNwYXJzZX0gb24gdGhlIGN1cnJlbnQgdmFsdWVcbiAgICogZm9sbG93ZWQgYnkge0BsaW5rIFNlcXVlbmNlI2luY3JlbWVudH1cbiAgICpcbiAgICovXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5jdXJyZW50KCk7XG4gICAgcmV0dXJuIHRoaXMuaW5jcmVtZW50KGN1cnJlbnQpO1xuICB9XG5cbiAgYXN5bmMgcmFuZ2UoY291bnQ6IG51bWJlcik6IFByb21pc2U8KG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXT4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSAoYXdhaXQgdGhpcy5jdXJyZW50KCkpIGFzIG51bWJlcjtcbiAgICBjb25zdCBpbmNyZW1lbnRCeSA9IHRoaXMucGFyc2UodGhpcy5vcHRpb25zLmluY3JlbWVudEJ5KSBhcyBudW1iZXI7XG4gICAgY29uc3QgbmV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50ID0gYXdhaXQgdGhpcy5pbmNyZW1lbnQoXG4gICAgICBjdXJyZW50LFxuICAgICAgKHRoaXMucGFyc2UoY291bnQpIGFzIG51bWJlcikgKiBpbmNyZW1lbnRCeVxuICAgICk7XG4gICAgY29uc3QgcmFuZ2U6IChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10gPSBbXTtcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAxOyBpIDw9IGNvdW50OyBpKyspIHtcbiAgICAgIHJhbmdlLnB1c2goY3VycmVudCArIGluY3JlbWVudEJ5ICogKHRoaXMucGFyc2UoaSkgYXMgbnVtYmVyKSk7XG4gICAgfVxuICAgIGlmIChyYW5nZVtyYW5nZS5sZW5ndGggLSAxXSAhPT0gbmV4dClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWlzY2FsY3VsYXRpb24gb2YgcmFuZ2VcIik7XG4gICAgcmV0dXJuIHJhbmdlO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { SequenceOptions } from "@decaf-ts/core";
|
|
2
|
+
import { Sequence } from "@decaf-ts/core";
|
|
3
|
+
import { TypeORMAdapter } from "../TypeORMAdapter";
|
|
4
|
+
/**
|
|
5
|
+
* @description Abstract implementation of a database sequence for TypeORM.
|
|
6
|
+
* @summary Provides the basic functionality for {@link Sequence}s, delegating to the {@link TypeORMAdapter} to fetch and increment values while handling type parsing and error translation.
|
|
7
|
+
* @param {SequenceOptions} options The sequence configuration options (name, type, startWith, incrementBy, etc.).
|
|
8
|
+
* @param {TypeORMAdapter} adapter The TypeORM adapter used to execute sequence operations.
|
|
9
|
+
* @class TypeORMSequence
|
|
10
|
+
* @implements Sequence
|
|
11
|
+
* @example
|
|
12
|
+
* // Create and use a TypeORM-backed sequence
|
|
13
|
+
* const seq = new TypeORMSequence({ name: "user_id_seq", type: "Number", startWith: 1, incrementBy: 1 }, adapter);
|
|
14
|
+
* const nextId = await seq.next();
|
|
15
|
+
*
|
|
16
|
+
* @mermaid
|
|
17
|
+
* sequenceDiagram
|
|
18
|
+
* participant App
|
|
19
|
+
* participant Seq as TypeORMSequence
|
|
20
|
+
* participant Adapter as TypeORMAdapter
|
|
21
|
+
* participant DB as Database
|
|
22
|
+
* App->>Seq: next()
|
|
23
|
+
* Seq->>Seq: current()
|
|
24
|
+
* Seq->>Adapter: raw(SELECT current_value ...)
|
|
25
|
+
* Adapter->>DB: Query current value
|
|
26
|
+
* DB-->>Adapter: current_value
|
|
27
|
+
* Adapter-->>Seq: value
|
|
28
|
+
* Seq->>Seq: increment(current)
|
|
29
|
+
* Seq->>Adapter: raw(nextval(name))
|
|
30
|
+
* Adapter->>DB: nextval()
|
|
31
|
+
* DB-->>Adapter: next value
|
|
32
|
+
* Adapter-->>Seq: value
|
|
33
|
+
* Seq-->>App: parsed next value
|
|
34
|
+
*/
|
|
35
|
+
export declare class TypeORMSequence extends Sequence {
|
|
36
|
+
protected adapter: TypeORMAdapter;
|
|
37
|
+
constructor(options: SequenceOptions, adapter: TypeORMAdapter);
|
|
38
|
+
/**
|
|
39
|
+
* @summary Retrieves the current value for the sequence
|
|
40
|
+
* @protected
|
|
41
|
+
*/
|
|
42
|
+
current(): Promise<string | number | bigint>;
|
|
43
|
+
/**
|
|
44
|
+
* @summary Parses the {@link Sequence} value
|
|
45
|
+
*
|
|
46
|
+
* @protected
|
|
47
|
+
* @param value
|
|
48
|
+
*/
|
|
49
|
+
private parse;
|
|
50
|
+
/**
|
|
51
|
+
* @summary increments the sequence
|
|
52
|
+
* @description Sequence specific implementation
|
|
53
|
+
*
|
|
54
|
+
* @param {string | number | bigint} current
|
|
55
|
+
* @param count
|
|
56
|
+
* @protected
|
|
57
|
+
*/
|
|
58
|
+
private increment;
|
|
59
|
+
/**
|
|
60
|
+
* @summary Generates the next value in th sequence
|
|
61
|
+
* @description calls {@link Sequence#parse} on the current value
|
|
62
|
+
* followed by {@link Sequence#increment}
|
|
63
|
+
*
|
|
64
|
+
*/
|
|
65
|
+
next(): Promise<number | string | bigint>;
|
|
66
|
+
range(count: number): Promise<(number | string | bigint)[]>;
|
|
67
|
+
}
|
|
@@ -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("./Sequence.cjs"), exports);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9TZXF1ZW5jZVwiO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./Sequence";
|