@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,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TypeORMRepository = void 0;
|
|
13
|
+
const decorator_validation_1 = require("@decaf-ts/decorator-validation");
|
|
14
|
+
const core_1 = require("@decaf-ts/core");
|
|
15
|
+
const db_decorators_1 = require("@decaf-ts/db-decorators");
|
|
16
|
+
const TypeORMAdapter_1 = require("./TypeORMAdapter.cjs");
|
|
17
|
+
const constants_1 = require("./constants.cjs");
|
|
18
|
+
/**
|
|
19
|
+
* @description Repository implementation backed by TypeORM.
|
|
20
|
+
* @summary Provides CRUD operations for a given Model using the {@link TypeORMAdapter}, including bulk operations and query builder access while preserving Decaf.ts repository semantics.
|
|
21
|
+
* @template M Type extending Model that this repository will manage.
|
|
22
|
+
* @param {TypeORMAdapter} adapter The adapter used to execute persistence operations.
|
|
23
|
+
* @param {Constructor<M>} model The Model constructor associated with this repository.
|
|
24
|
+
* @param {...any[]} args Optional arguments forwarded to the base Repository.
|
|
25
|
+
* @class TypeORMRepository
|
|
26
|
+
* @example
|
|
27
|
+
* // Creating a repository
|
|
28
|
+
* const repo = new TypeORMRepository<User>(adapter, User);
|
|
29
|
+
* const created = await repo.create(new User({ name: "Alice" }));
|
|
30
|
+
* const read = await repo.read(created.id);
|
|
31
|
+
*
|
|
32
|
+
* // Bulk create
|
|
33
|
+
* await repo.createAll([new User({ name: "A" }), new User({ name: "B" })]);
|
|
34
|
+
*
|
|
35
|
+
* // Using the query builder
|
|
36
|
+
* const qb = repo.queryBuilder();
|
|
37
|
+
* const rows = await qb.where("name = :name", { name: "Alice" }).getMany();
|
|
38
|
+
*
|
|
39
|
+
* @mermaid
|
|
40
|
+
* sequenceDiagram
|
|
41
|
+
* participant App
|
|
42
|
+
* participant Repo as TypeORMRepository
|
|
43
|
+
* participant Adapter as TypeORMAdapter
|
|
44
|
+
* participant DB as TypeORM/DataSource
|
|
45
|
+
*
|
|
46
|
+
* App->>Repo: create(model)
|
|
47
|
+
* Repo->>Adapter: prepare(model, pk)
|
|
48
|
+
* Adapter-->>Repo: { record, id, transient }
|
|
49
|
+
* Repo->>Adapter: create(table, id, model, ...args)
|
|
50
|
+
* Adapter->>DB: INSERT ...
|
|
51
|
+
* DB-->>Adapter: row
|
|
52
|
+
* Adapter-->>Repo: row
|
|
53
|
+
* Repo->>Adapter: revert(row, clazz, pk, id)
|
|
54
|
+
* Adapter-->>Repo: model
|
|
55
|
+
* Repo-->>App: model
|
|
56
|
+
*/
|
|
57
|
+
let TypeORMRepository = class TypeORMRepository extends core_1.Repository {
|
|
58
|
+
constructor(adapter, model, ...args) {
|
|
59
|
+
super(adapter, model, ...args);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* @description Creates a TypeORM query builder for the repository entity.
|
|
63
|
+
* @summary Returns a SelectQueryBuilder bound to this repository's entity for advanced querying.
|
|
64
|
+
* @return {import("typeorm").SelectQueryBuilder<any>} A TypeORM SelectQueryBuilder instance.
|
|
65
|
+
*/
|
|
66
|
+
queryBuilder() {
|
|
67
|
+
const repo = this.adapter.dataSource.getRepository(this.class[decorator_validation_1.ModelKeys.ANCHOR]);
|
|
68
|
+
return repo.createQueryBuilder();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* @description Creates and persists a model instance.
|
|
72
|
+
* @summary Prepares the model, delegates insertion to the adapter, and rehydrates the persisted state back into a Model instance.
|
|
73
|
+
* @param {M} model The model to create.
|
|
74
|
+
* @param {...any[]} args Optional arguments/context.
|
|
75
|
+
* @return {Promise<M>} The created model instance.
|
|
76
|
+
*/
|
|
77
|
+
async create(model, ...args) {
|
|
78
|
+
// eslint-disable-next-line prefer-const
|
|
79
|
+
let { record, id, transient } = this.adapter.prepare(model, this.pk);
|
|
80
|
+
record = await this.adapter.create(this.class[decorator_validation_1.ModelKeys.ANCHOR], id, model, ...args);
|
|
81
|
+
let c = undefined;
|
|
82
|
+
if (args.length)
|
|
83
|
+
c = args[args.length - 1];
|
|
84
|
+
return this.adapter.revert(record, this.class, this.pk, id, c && c.get("rebuildWithTransient") ? transient : undefined);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* @description Reads a model from the database by ID.
|
|
88
|
+
* @summary Retrieves a model instance from the database using its primary key.
|
|
89
|
+
* @param {string|number|bigint} id - The primary key of the model to read.
|
|
90
|
+
* @param {...any[]} args - Additional arguments.
|
|
91
|
+
* @return {Promise<M>} The retrieved model instance.
|
|
92
|
+
*/
|
|
93
|
+
async read(id,
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
95
|
+
...args) {
|
|
96
|
+
const m = await this.adapter.read(this.class[decorator_validation_1.ModelKeys.ANCHOR], id, this.pk);
|
|
97
|
+
return this.adapter.revert(m, this.class, this.pk, id);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* @description Updates and persists a model instance.
|
|
101
|
+
* @summary Prepares the model, delegates update to the adapter, and rehydrates the persisted state back into a Model instance.
|
|
102
|
+
* @param {M} model The model to update.
|
|
103
|
+
* @param {...any[]} args Optional arguments/context.
|
|
104
|
+
* @return {Promise<M>} The updated model instance.
|
|
105
|
+
*/
|
|
106
|
+
async update(model, ...args) {
|
|
107
|
+
// eslint-disable-next-line prefer-const
|
|
108
|
+
let { record, id, transient } = this.adapter.prepare(model, this.pk);
|
|
109
|
+
record = await this.adapter.update(this.class[decorator_validation_1.ModelKeys.ANCHOR], id, model, ...args);
|
|
110
|
+
return this.adapter.revert(record, this.class, this.pk, id, transient);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* @description Deletes a model from the database by ID.
|
|
114
|
+
* @summary Removes a model instance from the database using its primary key.
|
|
115
|
+
* @param {string|number|bigint} id - The primary key of the model to delete.
|
|
116
|
+
* @param {...any[]} args - Additional arguments.
|
|
117
|
+
* @return {Promise<M>} The deleted model instance.
|
|
118
|
+
*/
|
|
119
|
+
async delete(id, ...args) {
|
|
120
|
+
const m = await this.adapter.delete(this.class[decorator_validation_1.ModelKeys.ANCHOR], id, this.pk, ...args);
|
|
121
|
+
return this.adapter.revert(m, this.class, this.pk, id);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* @description Validates and prepares models for bulk creation.
|
|
125
|
+
* @summary Applies decorator-based validations and returns transformed models with context args for createAll.
|
|
126
|
+
* @param {M[]} models The models to be created.
|
|
127
|
+
* @param {...any[]} args Optional arguments/context.
|
|
128
|
+
* @return {Promise<[M[], ...any[]]>} The prepared models and forwarded args tuple.
|
|
129
|
+
*/
|
|
130
|
+
async createAllPrefix(models, ...args) {
|
|
131
|
+
const contextArgs = await db_decorators_1.Context.args(db_decorators_1.OperationKeys.CREATE, this.class, args, this.adapter, this._overrides || {});
|
|
132
|
+
if (!models.length)
|
|
133
|
+
return [models, ...contextArgs.args];
|
|
134
|
+
models = await Promise.all(models.map(async (m) => {
|
|
135
|
+
m = new this.class(m);
|
|
136
|
+
await (0, db_decorators_1.enforceDBDecorators)(this, contextArgs.context, m, db_decorators_1.OperationKeys.CREATE, db_decorators_1.OperationKeys.ON);
|
|
137
|
+
return m;
|
|
138
|
+
}));
|
|
139
|
+
const errors = models
|
|
140
|
+
.map((m) => m.hasErrors(...(contextArgs.context.get("ignoredValidationProperties") || [])))
|
|
141
|
+
.reduce((accum, e, i) => {
|
|
142
|
+
if (e)
|
|
143
|
+
accum =
|
|
144
|
+
typeof accum === "string"
|
|
145
|
+
? accum + `\n - ${i}: ${e.toString()}`
|
|
146
|
+
: ` - ${i}: ${e.toString()}`;
|
|
147
|
+
return accum;
|
|
148
|
+
}, undefined);
|
|
149
|
+
if (errors)
|
|
150
|
+
throw new db_decorators_1.ValidationError(errors);
|
|
151
|
+
return [models, ...contextArgs.args];
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* @description Creates multiple models at once.
|
|
155
|
+
* @summary Prepares, persists, and rehydrates a batch of models.
|
|
156
|
+
* @param {M[]} models The models to create.
|
|
157
|
+
* @param {...any[]} args Optional arguments/context.
|
|
158
|
+
* @return {Promise<M[]>} The created models.
|
|
159
|
+
*/
|
|
160
|
+
async createAll(models, ...args) {
|
|
161
|
+
if (!models.length)
|
|
162
|
+
return models;
|
|
163
|
+
const prepared = models.map((m) => this.adapter.prepare(m, this.pk));
|
|
164
|
+
const ids = prepared.map((p) => p.id);
|
|
165
|
+
let records = prepared.map((p) => p.record);
|
|
166
|
+
records = await this.adapter.createAll(this.class[decorator_validation_1.ModelKeys.ANCHOR], ids, models, ...args);
|
|
167
|
+
return records.map((r, i) => this.adapter.revert(r, this.class, this.pk, ids[i]));
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* @description Reads multiple models by their primary keys.
|
|
171
|
+
* @summary Retrieves a list of models corresponding to the provided keys.
|
|
172
|
+
* @param {(string[]|number[])} keys The primary keys to read.
|
|
173
|
+
* @param {...any[]} args Optional arguments/context.
|
|
174
|
+
* @return {Promise<M[]>} The retrieved models.
|
|
175
|
+
*/
|
|
176
|
+
async readAll(keys, ...args) {
|
|
177
|
+
const records = await this.adapter.readAll(this.class[decorator_validation_1.ModelKeys.ANCHOR], keys, this.pk, ...args);
|
|
178
|
+
return records.map((r, i) => this.adapter.revert(r, this.class, this.pk, keys[i]));
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* @description Updates multiple models at once.
|
|
182
|
+
* @summary Persists a batch of model updates and returns their rehydrated instances.
|
|
183
|
+
* @param {M[]} models The models to update.
|
|
184
|
+
* @param {...any[]} args Optional arguments/context.
|
|
185
|
+
* @return {Promise<M[]>} The updated models.
|
|
186
|
+
*/
|
|
187
|
+
async updateAll(models, ...args) {
|
|
188
|
+
const records = models.map((m) => this.adapter.prepare(m, this.pk));
|
|
189
|
+
const updated = await this.adapter.updateAll(this.class[decorator_validation_1.ModelKeys.ANCHOR], records.map((r) => r.id), models, this.pk, ...args);
|
|
190
|
+
return updated.map((u, i) => this.adapter.revert(u, this.class, this.pk, records[i].id));
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* @description Deletes multiple models at once.
|
|
194
|
+
* @summary Removes a list of models by their primary keys and returns their last persisted states.
|
|
195
|
+
* @param {(string[]|number[])} keys The primary keys to delete.
|
|
196
|
+
* @param {...any[]} args Optional arguments/context.
|
|
197
|
+
* @return {Promise<M[]>} The deleted models.
|
|
198
|
+
*/
|
|
199
|
+
async deleteAll(keys, ...args) {
|
|
200
|
+
const results = await this.adapter.deleteAll(this.class[decorator_validation_1.ModelKeys.ANCHOR], keys, this.pk, ...args);
|
|
201
|
+
return results.map((r, i) => this.adapter.revert(r, this.class, this.pk, keys[i]));
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
exports.TypeORMRepository = TypeORMRepository;
|
|
205
|
+
exports.TypeORMRepository = TypeORMRepository = __decorate([
|
|
206
|
+
(0, core_1.uses)(constants_1.TypeORMFlavour),
|
|
207
|
+
__metadata("design:paramtypes", [TypeORMAdapter_1.TypeORMAdapter, Object, Object])
|
|
208
|
+
], TypeORMRepository);
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHlwZU9STVJlcG9zaXRvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvVHlwZU9STVJlcG9zaXRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEseUVBSXdDO0FBQ3hDLHlDQUFrRDtBQUNsRCwyREFLaUM7QUFFakMseURBQWtEO0FBQ2xELCtDQUE2QztBQUU3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ0c7QUFFSSxJQUFNLGlCQUFpQixHQUF2QixNQUFNLGlCQUFtQyxTQUFRLGlCQU12RDtJQUNDLFlBQVksT0FBdUIsRUFBRSxLQUFxQixFQUFFLEdBQUcsSUFBVztRQUN4RSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWTtRQUNWLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQ0FBUyxDQUFDLE1BQWlDLENBQUMsQ0FDeEQsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBUSxFQUFFLEdBQUcsSUFBVztRQUM1Qyx3Q0FBd0M7UUFDeEMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDL0IsSUFBSSxDQUFDLEtBQWEsQ0FBQyxnQ0FBUyxDQUFDLE1BQU0sQ0FBUSxFQUM1QyxFQUFFLEVBQ0YsS0FBWSxFQUNaLEdBQUcsSUFBSSxDQUNSLENBQUM7UUFDRixJQUFJLENBQUMsR0FBc0MsU0FBUyxDQUFDO1FBQ3JELElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUEwQixDQUFDO1FBQ3BFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3hCLE1BQU0sRUFDTixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxFQUFFLEVBQ1AsRUFBRSxFQUNGLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUMzRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLEtBQUssQ0FBQyxJQUFJLENBQ2pCLEVBQTRCO0lBQzVCLDZEQUE2RDtJQUM3RCxHQUFHLElBQVc7UUFFZCxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUM5QixJQUFJLENBQUMsS0FBYSxDQUFDLGdDQUFTLENBQUMsTUFBTSxDQUFRLEVBQzVDLEVBQVksRUFDWixJQUFJLENBQUMsRUFBWSxDQUNsQixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQVEsRUFBRSxHQUFHLElBQVc7UUFDNUMsd0NBQXdDO1FBQ3hDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckUsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQy9CLElBQUksQ0FBQyxLQUFhLENBQUMsZ0NBQVMsQ0FBQyxNQUFNLENBQVEsRUFDNUMsRUFBRSxFQUNGLEtBQUssRUFDTCxHQUFHLElBQUksQ0FDUixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBSSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ00sS0FBSyxDQUFDLE1BQU0sQ0FDbkIsRUFBNEIsRUFDNUIsR0FBRyxJQUFXO1FBRWQsTUFBTSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDaEMsSUFBSSxDQUFDLEtBQWEsQ0FBQyxnQ0FBUyxDQUFDLE1BQU0sQ0FBUSxFQUM1QyxFQUFZLEVBQ1osSUFBSSxDQUFDLEVBQVksRUFDakIsR0FBRyxJQUFJLENBQ1IsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ2dCLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBVyxFQUFFLEdBQUcsSUFBVztRQUNsRSxNQUFNLFdBQVcsR0FBRyxNQUFNLHVCQUFPLENBQUMsSUFBSSxDQUNwQyw2QkFBYSxDQUFDLE1BQU0sRUFDcEIsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLEVBQ0osSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FDdEIsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFekQsTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckIsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLElBQUEsbUNBQW1CLEVBQ3ZCLElBQUksRUFDSixXQUFXLENBQUMsT0FBTyxFQUNuQixDQUFDLEVBQ0QsNkJBQWEsQ0FBQyxNQUFNLEVBQ3BCLDZCQUFhLENBQUMsRUFBRSxDQUNqQixDQUFDO1lBQ0YsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTTthQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNULENBQUMsQ0FBQyxTQUFTLENBQ1QsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLElBQUksRUFBRSxDQUFDLENBQ2xFLENBQ0Y7YUFDQSxNQUFNLENBQUMsQ0FBQyxLQUF5QixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUM7Z0JBQ0gsS0FBSztvQkFDSCxPQUFPLEtBQUssS0FBSyxRQUFRO3dCQUN2QixDQUFDLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTt3QkFDdEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hCLElBQUksTUFBTTtZQUFFLE1BQU0sSUFBSSwrQkFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBVyxFQUFFLEdBQUcsSUFBVztRQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUNsQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDbkMsSUFBSSxDQUFDLEtBQWEsQ0FBQyxnQ0FBUyxDQUFDLE1BQU0sQ0FBUSxFQUM1QyxHQUEwQixFQUMxQixNQUFNLEVBQ04sR0FBRyxJQUFJLENBQ1IsQ0FBQztRQUNGLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQW9CLENBQUMsQ0FDdkUsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTSxLQUFLLENBQUMsT0FBTyxDQUNwQixJQUF5QixFQUN6QixHQUFHLElBQVc7UUFFZCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUN2QyxJQUFJLENBQUMsS0FBYSxDQUFDLGdDQUFTLENBQUMsTUFBTSxDQUFRLEVBQzVDLElBQUksRUFDSixJQUFJLENBQUMsRUFBWSxFQUNqQixHQUFHLElBQUksQ0FDUixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBc0IsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUN2RCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBVyxFQUFFLEdBQUcsSUFBVztRQUNsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDekMsSUFBSSxDQUFDLEtBQWEsQ0FBQyxnQ0FBUyxDQUFDLE1BQU0sQ0FBUSxFQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ3hCLE1BQU0sRUFDTixJQUFJLENBQUMsRUFBWSxFQUNqQixHQUFHLElBQUksQ0FDUixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBc0IsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUN2RCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDM0QsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTSxLQUFLLENBQUMsU0FBUyxDQUN0QixJQUF5QixFQUN6QixHQUFHLElBQVc7UUFFZCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN6QyxJQUFJLENBQUMsS0FBYSxDQUFDLGdDQUFTLENBQUMsTUFBTSxDQUFRLEVBQzVDLElBQUksRUFDSixJQUFJLENBQUMsRUFBWSxFQUNqQixHQUFHLElBQUksQ0FDUixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBc0IsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUN2RCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyRCxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUE7QUFwUFksOENBQWlCOzRCQUFqQixpQkFBaUI7SUFEN0IsSUFBQSxXQUFJLEVBQUMsMEJBQWMsQ0FBQztxQ0FRRSwrQkFBYztHQVB4QixpQkFBaUIsQ0FvUDdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gYmFja2VkIGJ5IFR5cGVPUk0uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBDUlVEIG9wZXJhdGlvbnMgZm9yIGEgZ2l2ZW4gTW9kZWwgdXNpbmcgdGhlIHtAbGluayBUeXBlT1JNQWRhcHRlcn0sIGluY2x1ZGluZyBidWxrIG9wZXJhdGlvbnMgYW5kIHF1ZXJ5IGJ1aWxkZXIgYWNjZXNzIHdoaWxlIHByZXNlcnZpbmcgRGVjYWYudHMgcmVwb3NpdG9yeSBzZW1hbnRpY3MuXG4gKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbCB0aGF0IHRoaXMgcmVwb3NpdG9yeSB3aWxsIG1hbmFnZS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIGFkYXB0ZXIgdXNlZCB0byBleGVjdXRlIHBlcnNpc3RlbmNlIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUaGUgTW9kZWwgY29uc3RydWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVwb3NpdG9yeS5cbiAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIGZvcndhcmRlZCB0byB0aGUgYmFzZSBSZXBvc2l0b3J5LlxuICogQGNsYXNzIFR5cGVPUk1SZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRpbmcgYSByZXBvc2l0b3J5XG4gKiBjb25zdCByZXBvID0gbmV3IFR5cGVPUk1SZXBvc2l0b3J5PFVzZXI+KGFkYXB0ZXIsIFVzZXIpO1xuICogY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBVc2VyKHsgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IHJlYWQgPSBhd2FpdCByZXBvLnJlYWQoY3JlYXRlZC5pZCk7XG4gKlxuICogLy8gQnVsayBjcmVhdGVcbiAqIGF3YWl0IHJlcG8uY3JlYXRlQWxsKFtuZXcgVXNlcih7IG5hbWU6IFwiQVwiIH0pLCBuZXcgVXNlcih7IG5hbWU6IFwiQlwiIH0pXSk7XG4gKlxuICogLy8gVXNpbmcgdGhlIHF1ZXJ5IGJ1aWxkZXJcbiAqIGNvbnN0IHFiID0gcmVwby5xdWVyeUJ1aWxkZXIoKTtcbiAqIGNvbnN0IHJvd3MgPSBhd2FpdCBxYi53aGVyZShcIm5hbWUgPSA6bmFtZVwiLCB7IG5hbWU6IFwiQWxpY2VcIiB9KS5nZXRNYW55KCk7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBUeXBlT1JNUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IERCIGFzIFR5cGVPUk0vRGF0YVNvdXJjZVxuICpcbiAqICAgQXBwLT4+UmVwbzogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvLT4+QWRhcHRlcjogcHJlcGFyZShtb2RlbCwgcGspXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfVxuICogICBSZXBvLT4+QWRhcHRlcjogY3JlYXRlKHRhYmxlLCBpZCwgbW9kZWwsIC4uLmFyZ3MpXG4gKiAgIEFkYXB0ZXItPj5EQjogSU5TRVJUIC4uLlxuICogICBEQi0tPj5BZGFwdGVyOiByb3dcbiAqICAgQWRhcHRlci0tPj5SZXBvOiByb3dcbiAqICAgUmVwby0+PkFkYXB0ZXI6IHJldmVydChyb3csIGNsYXp6LCBwaywgaWQpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogbW9kZWxcbiAqICAgUmVwby0tPj5BcHA6IG1vZGVsXG4gKi9cbkB1c2VzKFR5cGVPUk1GbGF2b3VyKVxuZXhwb3J0IGNsYXNzIFR5cGVPUk1SZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICBNLFxuICBUeXBlT1JNUXVlcnk8TSwgYW55PixcbiAgVHlwZU9STUFkYXB0ZXIsXG4gIFR5cGVPUk1GbGFncyxcbiAgQ29udGV4dDxUeXBlT1JNRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogVHlwZU9STUFkYXB0ZXIsIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiwgLi4uYXJnczogYW55W10pIHtcbiAgICBzdXBlcihhZGFwdGVyLCBtb2RlbCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBUeXBlT1JNIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSByZXBvc2l0b3J5IGVudGl0eS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIFNlbGVjdFF1ZXJ5QnVpbGRlciBib3VuZCB0byB0aGlzIHJlcG9zaXRvcnkncyBlbnRpdHkgZm9yIGFkdmFuY2VkIHF1ZXJ5aW5nLlxuICAgKiBAcmV0dXJuIHtpbXBvcnQoXCJ0eXBlb3JtXCIpLlNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+fSBBIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGluc3RhbmNlLlxuICAgKi9cbiAgcXVlcnlCdWlsZGVyKCkge1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLmFkYXB0ZXIuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFxuICAgICAgdGhpcy5jbGFzc1tNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmNsYXNzXVxuICAgICk7XG4gICAgcmV0dXJuIHJlcG8uY3JlYXRlUXVlcnlCdWlsZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW5kIHBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCwgZGVsZWdhdGVzIGluc2VydGlvbiB0byB0aGUgYWRhcHRlciwgYW5kIHJlaHlkcmF0ZXMgdGhlIHBlcnNpc3RlZCBzdGF0ZSBiYWNrIGludG8gYSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCBUaGUgbW9kZWwgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgY3JlYXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQsXG4gICAgICBtb2RlbCBhcyBhbnksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBsZXQgYzogQ29udGV4dDxUeXBlT1JNRmxhZ3M+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChhcmdzLmxlbmd0aCkgYyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXSBhcyBDb250ZXh0PFR5cGVPUk1GbGFncz47XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICByZWNvcmQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgdGhpcy5wayxcbiAgICAgIGlkLFxuICAgICAgYyAmJiBjLmdldChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpID8gdHJhbnNpZW50IDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgcmV0cmlldmVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZChcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGlkIGFzIHN0cmluZyxcbiAgICAgIHRoaXMucGsgYXMgc3RyaW5nXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYW5kIHBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCwgZGVsZWdhdGVzIHVwZGF0ZSB0byB0aGUgYWRhcHRlciwgYW5kIHJlaHlkcmF0ZXMgdGhlIHBlcnNpc3RlZCBzdGF0ZSBiYWNrIGludG8gYSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCBUaGUgbW9kZWwgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQsXG4gICAgICBtb2RlbCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQsIHRyYW5zaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCBhcyBzdHJpbmcsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIGFuZCBwcmVwYXJlcyBtb2RlbHMgZm9yIGJ1bGsgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IEFwcGxpZXMgZGVjb3JhdG9yLWJhc2VkIHZhbGlkYXRpb25zIGFuZCByZXR1cm5zIHRyYW5zZm9ybWVkIG1vZGVscyB3aXRoIGNvbnRleHQgYXJncyBmb3IgY3JlYXRlQWxsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIFRoZSBtb2RlbHMgdG8gYmUgY3JlYXRlZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxbTVtdLCAuLi5hbnlbXV0+fSBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBmb3J3YXJkZWQgYXJncyB0dXBsZS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNcbiAgICAgIC5tYXAoKG0pID0+XG4gICAgICAgIG0uaGFzRXJyb3JzKFxuICAgICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgYXQgb25jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMsIHBlcnNpc3RzLCBhbmQgcmVoeWRyYXRlcyBhIGJhdGNoIG9mIG1vZGVscy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIG1vZGVscyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBsaXN0IG9mIG1vZGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBrZXlzLlxuICAgKiBAcGFyYW0geyhzdHJpbmdbXXxudW1iZXJbXSl9IGtleXMgVGhlIHByaW1hcnkga2V5cyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSByZXRyaWV2ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBrZXlzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHI6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBhIGJhdGNoIG9mIG1vZGVsIHVwZGF0ZXMgYW5kIHJldHVybnMgdGhlaXIgcmVoeWRyYXRlZCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHVwZGF0ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgbW9kZWxzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHU6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbGlzdCBvZiBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzIGFuZCByZXR1cm5zIHRoZWlyIGxhc3QgcGVyc2lzdGVkIHN0YXRlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nW118bnVtYmVyW10pfSBrZXlzIFRoZSBwcmltYXJ5IGtleXMgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBkZWxldGVkIG1vZGVscy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgocjogUmVjb3JkPHN0cmluZywgYW55PiwgaTogbnVtYmVyKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { type Constructor, Model } from "@decaf-ts/decorator-validation";
|
|
2
|
+
import { Repository } from "@decaf-ts/core";
|
|
3
|
+
import { Context } from "@decaf-ts/db-decorators";
|
|
4
|
+
import { TypeORMFlags, TypeORMQuery } from "./types";
|
|
5
|
+
import { TypeORMAdapter } from "./TypeORMAdapter";
|
|
6
|
+
/**
|
|
7
|
+
* @description Repository implementation backed by TypeORM.
|
|
8
|
+
* @summary Provides CRUD operations for a given Model using the {@link TypeORMAdapter}, including bulk operations and query builder access while preserving Decaf.ts repository semantics.
|
|
9
|
+
* @template M Type extending Model that this repository will manage.
|
|
10
|
+
* @param {TypeORMAdapter} adapter The adapter used to execute persistence operations.
|
|
11
|
+
* @param {Constructor<M>} model The Model constructor associated with this repository.
|
|
12
|
+
* @param {...any[]} args Optional arguments forwarded to the base Repository.
|
|
13
|
+
* @class TypeORMRepository
|
|
14
|
+
* @example
|
|
15
|
+
* // Creating a repository
|
|
16
|
+
* const repo = new TypeORMRepository<User>(adapter, User);
|
|
17
|
+
* const created = await repo.create(new User({ name: "Alice" }));
|
|
18
|
+
* const read = await repo.read(created.id);
|
|
19
|
+
*
|
|
20
|
+
* // Bulk create
|
|
21
|
+
* await repo.createAll([new User({ name: "A" }), new User({ name: "B" })]);
|
|
22
|
+
*
|
|
23
|
+
* // Using the query builder
|
|
24
|
+
* const qb = repo.queryBuilder();
|
|
25
|
+
* const rows = await qb.where("name = :name", { name: "Alice" }).getMany();
|
|
26
|
+
*
|
|
27
|
+
* @mermaid
|
|
28
|
+
* sequenceDiagram
|
|
29
|
+
* participant App
|
|
30
|
+
* participant Repo as TypeORMRepository
|
|
31
|
+
* participant Adapter as TypeORMAdapter
|
|
32
|
+
* participant DB as TypeORM/DataSource
|
|
33
|
+
*
|
|
34
|
+
* App->>Repo: create(model)
|
|
35
|
+
* Repo->>Adapter: prepare(model, pk)
|
|
36
|
+
* Adapter-->>Repo: { record, id, transient }
|
|
37
|
+
* Repo->>Adapter: create(table, id, model, ...args)
|
|
38
|
+
* Adapter->>DB: INSERT ...
|
|
39
|
+
* DB-->>Adapter: row
|
|
40
|
+
* Adapter-->>Repo: row
|
|
41
|
+
* Repo->>Adapter: revert(row, clazz, pk, id)
|
|
42
|
+
* Adapter-->>Repo: model
|
|
43
|
+
* Repo-->>App: model
|
|
44
|
+
*/
|
|
45
|
+
export declare class TypeORMRepository<M extends Model> extends Repository<M, TypeORMQuery<M, any>, TypeORMAdapter, TypeORMFlags, Context<TypeORMFlags>> {
|
|
46
|
+
constructor(adapter: TypeORMAdapter, model: Constructor<M>, ...args: any[]);
|
|
47
|
+
/**
|
|
48
|
+
* @description Creates a TypeORM query builder for the repository entity.
|
|
49
|
+
* @summary Returns a SelectQueryBuilder bound to this repository's entity for advanced querying.
|
|
50
|
+
* @return {import("typeorm").SelectQueryBuilder<any>} A TypeORM SelectQueryBuilder instance.
|
|
51
|
+
*/
|
|
52
|
+
queryBuilder(): import("typeorm").SelectQueryBuilder<import("typeorm").ObjectLiteral>;
|
|
53
|
+
/**
|
|
54
|
+
* @description Creates and persists a model instance.
|
|
55
|
+
* @summary Prepares the model, delegates insertion to the adapter, and rehydrates the persisted state back into a Model instance.
|
|
56
|
+
* @param {M} model The model to create.
|
|
57
|
+
* @param {...any[]} args Optional arguments/context.
|
|
58
|
+
* @return {Promise<M>} The created model instance.
|
|
59
|
+
*/
|
|
60
|
+
create(model: M, ...args: any[]): Promise<M>;
|
|
61
|
+
/**
|
|
62
|
+
* @description Reads a model from the database by ID.
|
|
63
|
+
* @summary Retrieves a model instance from the database using its primary key.
|
|
64
|
+
* @param {string|number|bigint} id - The primary key of the model to read.
|
|
65
|
+
* @param {...any[]} args - Additional arguments.
|
|
66
|
+
* @return {Promise<M>} The retrieved model instance.
|
|
67
|
+
*/
|
|
68
|
+
read(id: string | number | bigint, ...args: any[]): Promise<M>;
|
|
69
|
+
/**
|
|
70
|
+
* @description Updates and persists a model instance.
|
|
71
|
+
* @summary Prepares the model, delegates update to the adapter, and rehydrates the persisted state back into a Model instance.
|
|
72
|
+
* @param {M} model The model to update.
|
|
73
|
+
* @param {...any[]} args Optional arguments/context.
|
|
74
|
+
* @return {Promise<M>} The updated model instance.
|
|
75
|
+
*/
|
|
76
|
+
update(model: M, ...args: any[]): Promise<M>;
|
|
77
|
+
/**
|
|
78
|
+
* @description Deletes a model from the database by ID.
|
|
79
|
+
* @summary Removes a model instance from the database using its primary key.
|
|
80
|
+
* @param {string|number|bigint} id - The primary key of the model to delete.
|
|
81
|
+
* @param {...any[]} args - Additional arguments.
|
|
82
|
+
* @return {Promise<M>} The deleted model instance.
|
|
83
|
+
*/
|
|
84
|
+
delete(id: string | number | bigint, ...args: any[]): Promise<M>;
|
|
85
|
+
/**
|
|
86
|
+
* @description Validates and prepares models for bulk creation.
|
|
87
|
+
* @summary Applies decorator-based validations and returns transformed models with context args for createAll.
|
|
88
|
+
* @param {M[]} models The models to be created.
|
|
89
|
+
* @param {...any[]} args Optional arguments/context.
|
|
90
|
+
* @return {Promise<[M[], ...any[]]>} The prepared models and forwarded args tuple.
|
|
91
|
+
*/
|
|
92
|
+
protected createAllPrefix(models: M[], ...args: any[]): Promise<any[]>;
|
|
93
|
+
/**
|
|
94
|
+
* @description Creates multiple models at once.
|
|
95
|
+
* @summary Prepares, persists, and rehydrates a batch of models.
|
|
96
|
+
* @param {M[]} models The models to create.
|
|
97
|
+
* @param {...any[]} args Optional arguments/context.
|
|
98
|
+
* @return {Promise<M[]>} The created models.
|
|
99
|
+
*/
|
|
100
|
+
createAll(models: M[], ...args: any[]): Promise<M[]>;
|
|
101
|
+
/**
|
|
102
|
+
* @description Reads multiple models by their primary keys.
|
|
103
|
+
* @summary Retrieves a list of models corresponding to the provided keys.
|
|
104
|
+
* @param {(string[]|number[])} keys The primary keys to read.
|
|
105
|
+
* @param {...any[]} args Optional arguments/context.
|
|
106
|
+
* @return {Promise<M[]>} The retrieved models.
|
|
107
|
+
*/
|
|
108
|
+
readAll(keys: string[] | number[], ...args: any[]): Promise<M[]>;
|
|
109
|
+
/**
|
|
110
|
+
* @description Updates multiple models at once.
|
|
111
|
+
* @summary Persists a batch of model updates and returns their rehydrated instances.
|
|
112
|
+
* @param {M[]} models The models to update.
|
|
113
|
+
* @param {...any[]} args Optional arguments/context.
|
|
114
|
+
* @return {Promise<M[]>} The updated models.
|
|
115
|
+
*/
|
|
116
|
+
updateAll(models: M[], ...args: any[]): Promise<M[]>;
|
|
117
|
+
/**
|
|
118
|
+
* @description Deletes multiple models at once.
|
|
119
|
+
* @summary Removes a list of models by their primary keys and returns their last persisted states.
|
|
120
|
+
* @param {(string[]|number[])} keys The primary keys to delete.
|
|
121
|
+
* @param {...any[]} args Optional arguments/context.
|
|
122
|
+
* @return {Promise<M[]>} The deleted models.
|
|
123
|
+
*/
|
|
124
|
+
deleteAll(keys: string[] | number[], ...args: any[]): Promise<M[]>;
|
|
125
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TypeORMKeys = exports.TypeORMFlavour = exports.reservedAttributes = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @description Regular expression to identify reserved attributes for SQL contexts.
|
|
6
|
+
* @summary Matches attribute names that conflict with SQL reserved keywords to prevent invalid schema or query generation.
|
|
7
|
+
* @const reservedAttributes
|
|
8
|
+
* @memberOf module:for-typeorm
|
|
9
|
+
*/
|
|
10
|
+
exports.reservedAttributes = /^(select|from|where|and|or|insert|update|delete|drop|create|table|index|primary|key|foreign|references|constraint|unique|check|default|null|not|as|order|by|group|having|limit|offset|join|inner|outer|left|right|full|on|using|values|returning|set|into|case|when|then|else|end|cast|coalesce|exists|any|all|some|in|between|like|ilike|similar|to|is|true|false|asc|desc|distinct|union|intersect|except|natural|lateral|window|over|partition|range|rows|unbounded|preceding|following|current|row|with|recursive|materialized|view|function|trigger|procedure|language|returns|return|declare|begin|commit|rollback|savepoint|transaction|temporary|temp|if|loop|while|for|continue|exit|raise|exception|notice|info|log|debug|assert|execute|perform|get|diagnostics|call|do|alias|comment|vacuum|analyze|explain|copy|grant|revoke|privileges|public|usage|schema|sequence|owned|owner|tablespace|storage|inherits|type|operator|collate|collation|cascade|restrict|add|alter|column|rename|to|enable|disable|force|no|instead|of|before|after|each|statement|row|execute|also|only|exclude|nulls|others|ordinality|ties|nothing|cache|cycle|increment|minvalue|maxvalue|start|restart|by|called|returns|language|immutable|stable|volatile|strict|security|definer|invoker|cost|rows|support|handler|inline|validator|options|storage|inheritance|oids|without|data|dictionary|encoding|lc_collate|lc_ctype|connection|limit|password|valid|until|superuser|nosuperuser|createdb|nocreatedb|createrole|nocreaterole|inherit|noinherit|login|nologin|replication|noreplication|bypassrls|nobypassrls|encrypted|unencrypted|new|old|session_user|current_user|current_role|current_schema|current_catalog|current_date|current_time|current_timestamp|localtime|localtimestamp|current_database|inet|cidr|macaddr|macaddr8|bit|varbit|tsvector|tsquery|uuid|xml|json|jsonb|int|integer|smallint|bigint|decimal|numeric|real|double|precision|float|boolean|bool|char|character|varchar|text|bytea|date|time|timestamp|interval|point|line|lseg|box|path|polygon|circle|money|void)$/i;
|
|
11
|
+
exports.TypeORMFlavour = "type-orm";
|
|
12
|
+
/**
|
|
13
|
+
* @description Shape of the TypeORMKeys constant.
|
|
14
|
+
* @summary Describes the keys and their meanings used by the TypeORM adapter.
|
|
15
|
+
* @typedef TypeORMKeysDef
|
|
16
|
+
* @property {string} SEPARATOR Separator used to join table and column identifiers.
|
|
17
|
+
* @property {string} ID Default primary key field name.
|
|
18
|
+
* @property {string} VERSION Version field used for optimistic locking.
|
|
19
|
+
* @property {string} DELETED Soft-delete timestamp field.
|
|
20
|
+
* @property {string} TABLE Database table identifier key.
|
|
21
|
+
* @property {string} SCHEMA Database schema identifier key.
|
|
22
|
+
* @property {string} SEQUENCE Database sequence name key.
|
|
23
|
+
* @property {string} INDEX Index identifier key.
|
|
24
|
+
* @memberOf module:for-typeorm
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* @description Key constants used by the TypeORM adapter.
|
|
28
|
+
* @summary Collection of string constants that identify common database properties and adapter-specific keys.
|
|
29
|
+
* @const TypeORMKeys
|
|
30
|
+
* @type {TypeORMKeysDef}
|
|
31
|
+
* @memberOf module:for-typeorm
|
|
32
|
+
*/
|
|
33
|
+
exports.TypeORMKeys = {
|
|
34
|
+
SEPARATOR: ".",
|
|
35
|
+
ID: "id",
|
|
36
|
+
VERSION: "version",
|
|
37
|
+
DELETED: "deleted_at",
|
|
38
|
+
TABLE: "table_name",
|
|
39
|
+
SCHEMA: "schema_name",
|
|
40
|
+
SEQUENCE: "sequence_name",
|
|
41
|
+
INDEX: "index",
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7R0FLRztBQUNVLFFBQUEsa0JBQWtCLEdBQzdCLDQ5REFBNDlELENBQUM7QUFFbDlELFFBQUEsY0FBYyxHQUFHLFVBQVUsQ0FBQztBQUV6Qzs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0g7Ozs7OztHQU1HO0FBQ1UsUUFBQSxXQUFXLEdBQUc7SUFDekIsU0FBUyxFQUFFLEdBQUc7SUFDZCxFQUFFLEVBQUUsSUFBSTtJQUNSLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLEtBQUssRUFBRSxZQUFZO0lBQ25CLE1BQU0sRUFBRSxhQUFhO0lBQ3JCLFFBQVEsRUFBRSxlQUFlO0lBQ3pCLEtBQUssRUFBRSxPQUFPO0NBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBpZGVudGlmeSByZXNlcnZlZCBhdHRyaWJ1dGVzIGZvciBTUUwgY29udGV4dHMuXG4gKiBAc3VtbWFyeSBNYXRjaGVzIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGNvbmZsaWN0IHdpdGggU1FMIHJlc2VydmVkIGtleXdvcmRzIHRvIHByZXZlbnQgaW52YWxpZCBzY2hlbWEgb3IgcXVlcnkgZ2VuZXJhdGlvbi5cbiAqIEBjb25zdCByZXNlcnZlZEF0dHJpYnV0ZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2VydmVkQXR0cmlidXRlcyA9XG4gIC9eKHNlbGVjdHxmcm9tfHdoZXJlfGFuZHxvcnxpbnNlcnR8dXBkYXRlfGRlbGV0ZXxkcm9wfGNyZWF0ZXx0YWJsZXxpbmRleHxwcmltYXJ5fGtleXxmb3JlaWdufHJlZmVyZW5jZXN8Y29uc3RyYWludHx1bmlxdWV8Y2hlY2t8ZGVmYXVsdHxudWxsfG5vdHxhc3xvcmRlcnxieXxncm91cHxoYXZpbmd8bGltaXR8b2Zmc2V0fGpvaW58aW5uZXJ8b3V0ZXJ8bGVmdHxyaWdodHxmdWxsfG9ufHVzaW5nfHZhbHVlc3xyZXR1cm5pbmd8c2V0fGludG98Y2FzZXx3aGVufHRoZW58ZWxzZXxlbmR8Y2FzdHxjb2FsZXNjZXxleGlzdHN8YW55fGFsbHxzb21lfGlufGJldHdlZW58bGlrZXxpbGlrZXxzaW1pbGFyfHRvfGlzfHRydWV8ZmFsc2V8YXNjfGRlc2N8ZGlzdGluY3R8dW5pb258aW50ZXJzZWN0fGV4Y2VwdHxuYXR1cmFsfGxhdGVyYWx8d2luZG93fG92ZXJ8cGFydGl0aW9ufHJhbmdlfHJvd3N8dW5ib3VuZGVkfHByZWNlZGluZ3xmb2xsb3dpbmd8Y3VycmVudHxyb3d8d2l0aHxyZWN1cnNpdmV8bWF0ZXJpYWxpemVkfHZpZXd8ZnVuY3Rpb258dHJpZ2dlcnxwcm9jZWR1cmV8bGFuZ3VhZ2V8cmV0dXJuc3xyZXR1cm58ZGVjbGFyZXxiZWdpbnxjb21taXR8cm9sbGJhY2t8c2F2ZXBvaW50fHRyYW5zYWN0aW9ufHRlbXBvcmFyeXx0ZW1wfGlmfGxvb3B8d2hpbGV8Zm9yfGNvbnRpbnVlfGV4aXR8cmFpc2V8ZXhjZXB0aW9ufG5vdGljZXxpbmZvfGxvZ3xkZWJ1Z3xhc3NlcnR8ZXhlY3V0ZXxwZXJmb3JtfGdldHxkaWFnbm9zdGljc3xjYWxsfGRvfGFsaWFzfGNvbW1lbnR8dmFjdXVtfGFuYWx5emV8ZXhwbGFpbnxjb3B5fGdyYW50fHJldm9rZXxwcml2aWxlZ2VzfHB1YmxpY3x1c2FnZXxzY2hlbWF8c2VxdWVuY2V8b3duZWR8b3duZXJ8dGFibGVzcGFjZXxzdG9yYWdlfGluaGVyaXRzfHR5cGV8b3BlcmF0b3J8Y29sbGF0ZXxjb2xsYXRpb258Y2FzY2FkZXxyZXN0cmljdHxhZGR8YWx0ZXJ8Y29sdW1ufHJlbmFtZXx0b3xlbmFibGV8ZGlzYWJsZXxmb3JjZXxub3xpbnN0ZWFkfG9mfGJlZm9yZXxhZnRlcnxlYWNofHN0YXRlbWVudHxyb3d8ZXhlY3V0ZXxhbHNvfG9ubHl8ZXhjbHVkZXxudWxsc3xvdGhlcnN8b3JkaW5hbGl0eXx0aWVzfG5vdGhpbmd8Y2FjaGV8Y3ljbGV8aW5jcmVtZW50fG1pbnZhbHVlfG1heHZhbHVlfHN0YXJ0fHJlc3RhcnR8Ynl8Y2FsbGVkfHJldHVybnN8bGFuZ3VhZ2V8aW1tdXRhYmxlfHN0YWJsZXx2b2xhdGlsZXxzdHJpY3R8c2VjdXJpdHl8ZGVmaW5lcnxpbnZva2VyfGNvc3R8cm93c3xzdXBwb3J0fGhhbmRsZXJ8aW5saW5lfHZhbGlkYXRvcnxvcHRpb25zfHN0b3JhZ2V8aW5oZXJpdGFuY2V8b2lkc3x3aXRob3V0fGRhdGF8ZGljdGlvbmFyeXxlbmNvZGluZ3xsY19jb2xsYXRlfGxjX2N0eXBlfGNvbm5lY3Rpb258bGltaXR8cGFzc3dvcmR8dmFsaWR8dW50aWx8c3VwZXJ1c2VyfG5vc3VwZXJ1c2VyfGNyZWF0ZWRifG5vY3JlYXRlZGJ8Y3JlYXRlcm9sZXxub2NyZWF0ZXJvbGV8aW5oZXJpdHxub2luaGVyaXR8bG9naW58bm9sb2dpbnxyZXBsaWNhdGlvbnxub3JlcGxpY2F0aW9ufGJ5cGFzc3Jsc3xub2J5cGFzc3Jsc3xlbmNyeXB0ZWR8dW5lbmNyeXB0ZWR8bmV3fG9sZHxzZXNzaW9uX3VzZXJ8Y3VycmVudF91c2VyfGN1cnJlbnRfcm9sZXxjdXJyZW50X3NjaGVtYXxjdXJyZW50X2NhdGFsb2d8Y3VycmVudF9kYXRlfGN1cnJlbnRfdGltZXxjdXJyZW50X3RpbWVzdGFtcHxsb2NhbHRpbWV8bG9jYWx0aW1lc3RhbXB8Y3VycmVudF9kYXRhYmFzZXxpbmV0fGNpZHJ8bWFjYWRkcnxtYWNhZGRyOHxiaXR8dmFyYml0fHRzdmVjdG9yfHRzcXVlcnl8dXVpZHx4bWx8anNvbnxqc29uYnxpbnR8aW50ZWdlcnxzbWFsbGludHxiaWdpbnR8ZGVjaW1hbHxudW1lcmljfHJlYWx8ZG91YmxlfHByZWNpc2lvbnxmbG9hdHxib29sZWFufGJvb2x8Y2hhcnxjaGFyYWN0ZXJ8dmFyY2hhcnx0ZXh0fGJ5dGVhfGRhdGV8dGltZXx0aW1lc3RhbXB8aW50ZXJ2YWx8cG9pbnR8bGluZXxsc2VnfGJveHxwYXRofHBvbHlnb258Y2lyY2xlfG1vbmV5fHZvaWQpJC9pO1xuXG5leHBvcnQgY29uc3QgVHlwZU9STUZsYXZvdXIgPSBcInR5cGUtb3JtXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNoYXBlIG9mIHRoZSBUeXBlT1JNS2V5cyBjb25zdGFudC5cbiAqIEBzdW1tYXJ5IERlc2NyaWJlcyB0aGUga2V5cyBhbmQgdGhlaXIgbWVhbmluZ3MgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHR5cGVkZWYgVHlwZU9STUtleXNEZWZcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTRVBBUkFUT1IgU2VwYXJhdG9yIHVzZWQgdG8gam9pbiB0YWJsZSBhbmQgY29sdW1uIGlkZW50aWZpZXJzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IElEIERlZmF1bHQgcHJpbWFyeSBrZXkgZmllbGQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBWRVJTSU9OIFZlcnNpb24gZmllbGQgdXNlZCBmb3Igb3B0aW1pc3RpYyBsb2NraW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IERFTEVURUQgU29mdC1kZWxldGUgdGltZXN0YW1wIGZpZWxkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRBQkxFIERhdGFiYXNlIHRhYmxlIGlkZW50aWZpZXIga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNDSEVNQSBEYXRhYmFzZSBzY2hlbWEgaWRlbnRpZmllciBrZXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0VRVUVOQ0UgRGF0YWJhc2Ugc2VxdWVuY2UgbmFtZSBrZXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU5ERVggSW5kZXggaWRlbnRpZmllciBrZXkuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleSBjb25zdGFudHMgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHN1bW1hcnkgQ29sbGVjdGlvbiBvZiBzdHJpbmcgY29uc3RhbnRzIHRoYXQgaWRlbnRpZnkgY29tbW9uIGRhdGFiYXNlIHByb3BlcnRpZXMgYW5kIGFkYXB0ZXItc3BlY2lmaWMga2V5cy5cbiAqIEBjb25zdCBUeXBlT1JNS2V5c1xuICogQHR5cGUge1R5cGVPUk1LZXlzRGVmfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STUtleXMgPSB7XG4gIFNFUEFSQVRPUjogXCIuXCIsXG4gIElEOiBcImlkXCIsXG4gIFZFUlNJT046IFwidmVyc2lvblwiLFxuICBERUxFVEVEOiBcImRlbGV0ZWRfYXRcIixcbiAgVEFCTEU6IFwidGFibGVfbmFtZVwiLFxuICBTQ0hFTUE6IFwic2NoZW1hX25hbWVcIixcbiAgU0VRVUVOQ0U6IFwic2VxdWVuY2VfbmFtZVwiLFxuICBJTkRFWDogXCJpbmRleFwiLFxufTtcbiJdfQ==
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Regular expression to identify reserved attributes for SQL contexts.
|
|
3
|
+
* @summary Matches attribute names that conflict with SQL reserved keywords to prevent invalid schema or query generation.
|
|
4
|
+
* @const reservedAttributes
|
|
5
|
+
* @memberOf module:for-typeorm
|
|
6
|
+
*/
|
|
7
|
+
export declare const reservedAttributes: RegExp;
|
|
8
|
+
export declare const TypeORMFlavour = "type-orm";
|
|
9
|
+
/**
|
|
10
|
+
* @description Shape of the TypeORMKeys constant.
|
|
11
|
+
* @summary Describes the keys and their meanings used by the TypeORM adapter.
|
|
12
|
+
* @typedef TypeORMKeysDef
|
|
13
|
+
* @property {string} SEPARATOR Separator used to join table and column identifiers.
|
|
14
|
+
* @property {string} ID Default primary key field name.
|
|
15
|
+
* @property {string} VERSION Version field used for optimistic locking.
|
|
16
|
+
* @property {string} DELETED Soft-delete timestamp field.
|
|
17
|
+
* @property {string} TABLE Database table identifier key.
|
|
18
|
+
* @property {string} SCHEMA Database schema identifier key.
|
|
19
|
+
* @property {string} SEQUENCE Database sequence name key.
|
|
20
|
+
* @property {string} INDEX Index identifier key.
|
|
21
|
+
* @memberOf module:for-typeorm
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* @description Key constants used by the TypeORM adapter.
|
|
25
|
+
* @summary Collection of string constants that identify common database properties and adapter-specific keys.
|
|
26
|
+
* @const TypeORMKeys
|
|
27
|
+
* @type {TypeORMKeysDef}
|
|
28
|
+
* @memberOf module:for-typeorm
|
|
29
|
+
*/
|
|
30
|
+
export declare const TypeORMKeys: {
|
|
31
|
+
SEPARATOR: string;
|
|
32
|
+
ID: string;
|
|
33
|
+
VERSION: string;
|
|
34
|
+
DELETED: string;
|
|
35
|
+
TABLE: string;
|
|
36
|
+
SCHEMA: string;
|
|
37
|
+
SEQUENCE: string;
|
|
38
|
+
INDEX: string;
|
|
39
|
+
};
|
package/lib/errors.cjs
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IndexError = void 0;
|
|
4
|
+
const db_decorators_1 = require("@decaf-ts/db-decorators");
|
|
5
|
+
/**
|
|
6
|
+
* @description Error thrown when there is an issue with TypeORM indexes.
|
|
7
|
+
* @summary Represents an error related to index generation or handling within the TypeORM adapter.
|
|
8
|
+
* @param {string|Error} msg The error message or Error object.
|
|
9
|
+
* @class
|
|
10
|
+
* @category Errors
|
|
11
|
+
* @example
|
|
12
|
+
* // Example of using IndexError
|
|
13
|
+
* try {
|
|
14
|
+
* // Some code that might throw an index error
|
|
15
|
+
* throw new IndexError("Index not found");
|
|
16
|
+
* } catch (error) {
|
|
17
|
+
* if (error instanceof IndexError) {
|
|
18
|
+
* console.error("Index error occurred:", error.message);
|
|
19
|
+
* }
|
|
20
|
+
* }
|
|
21
|
+
*/
|
|
22
|
+
class IndexError extends db_decorators_1.BaseError {
|
|
23
|
+
constructor(msg) {
|
|
24
|
+
super(IndexError.name, msg, 404);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.IndexError = IndexError;
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyREFBb0Q7QUFFcEQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFhLFVBQVcsU0FBUSx5QkFBUztJQUN2QyxZQUFZLEdBQW1CO1FBQzdCLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFKRCxnQ0FJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiB0aGVyZSBpcyBhbiBpc3N1ZSB3aXRoIFR5cGVPUk0gaW5kZXhlcy5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gZXJyb3IgcmVsYXRlZCB0byBpbmRleCBnZW5lcmF0aW9uIG9yIGhhbmRsaW5nIHdpdGhpbiB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3QuXG4gKiBAY2xhc3NcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIG9mIHVzaW5nIEluZGV4RXJyb3JcbiAqIHRyeSB7XG4gKiAgIC8vIFNvbWUgY29kZSB0aGF0IG1pZ2h0IHRocm93IGFuIGluZGV4IGVycm9yXG4gKiAgIHRocm93IG5ldyBJbmRleEVycm9yKFwiSW5kZXggbm90IGZvdW5kXCIpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSW5kZXhFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoXCJJbmRleCBlcnJvciBvY2N1cnJlZDpcIiwgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGNsYXNzIEluZGV4RXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoSW5kZXhFcnJvci5uYW1lLCBtc2csIDQwNCk7XG4gIH1cbn1cbiJdfQ==
|
package/lib/errors.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { BaseError } from "@decaf-ts/db-decorators";
|
|
2
|
+
/**
|
|
3
|
+
* @description Error thrown when there is an issue with TypeORM indexes.
|
|
4
|
+
* @summary Represents an error related to index generation or handling within the TypeORM adapter.
|
|
5
|
+
* @param {string|Error} msg The error message or Error object.
|
|
6
|
+
* @class
|
|
7
|
+
* @category Errors
|
|
8
|
+
* @example
|
|
9
|
+
* // Example of using IndexError
|
|
10
|
+
* try {
|
|
11
|
+
* // Some code that might throw an index error
|
|
12
|
+
* throw new IndexError("Index not found");
|
|
13
|
+
* } catch (error) {
|
|
14
|
+
* if (error instanceof IndexError) {
|
|
15
|
+
* console.error("Index error occurred:", error.message);
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
*/
|
|
19
|
+
export declare class IndexError extends BaseError {
|
|
20
|
+
constructor(msg: string | Error);
|
|
21
|
+
}
|