@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.
Files changed (109) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +93 -0
  3. package/dist/for-typeorm.cjs +2553 -0
  4. package/dist/for-typeorm.esm.cjs +2538 -0
  5. package/lib/TypeORMAdapter.cjs +1129 -0
  6. package/lib/TypeORMAdapter.d.ts +221 -0
  7. package/lib/TypeORMDispatch.cjs +134 -0
  8. package/lib/TypeORMDispatch.d.ts +87 -0
  9. package/lib/TypeORMEventSubscriber.cjs +96 -0
  10. package/lib/TypeORMEventSubscriber.d.ts +56 -0
  11. package/lib/TypeORMRepository.cjs +209 -0
  12. package/lib/TypeORMRepository.d.ts +125 -0
  13. package/lib/constants.cjs +43 -0
  14. package/lib/constants.d.ts +39 -0
  15. package/lib/errors.cjs +28 -0
  16. package/lib/errors.d.ts +21 -0
  17. package/lib/esm/TypeORMAdapter.d.ts +221 -0
  18. package/lib/esm/TypeORMAdapter.js +1124 -0
  19. package/lib/esm/TypeORMDispatch.d.ts +87 -0
  20. package/lib/esm/TypeORMDispatch.js +130 -0
  21. package/lib/esm/TypeORMEventSubscriber.d.ts +56 -0
  22. package/lib/esm/TypeORMEventSubscriber.js +93 -0
  23. package/lib/esm/TypeORMRepository.d.ts +125 -0
  24. package/lib/esm/TypeORMRepository.js +206 -0
  25. package/lib/esm/constants.d.ts +39 -0
  26. package/lib/esm/constants.js +40 -0
  27. package/lib/esm/errors.d.ts +21 -0
  28. package/lib/esm/errors.js +24 -0
  29. package/lib/esm/index.d.ts +22 -0
  30. package/lib/esm/index.js +25 -0
  31. package/lib/esm/indexes/generator.d.ts +50 -0
  32. package/lib/esm/indexes/generator.js +95 -0
  33. package/lib/esm/indexes/index.d.ts +1 -0
  34. package/lib/esm/indexes/index.js +2 -0
  35. package/lib/esm/overrides/Column.d.ts +74 -0
  36. package/lib/esm/overrides/Column.js +70 -0
  37. package/lib/esm/overrides/CreateDateColumn.d.ts +2 -0
  38. package/lib/esm/overrides/CreateDateColumn.js +9 -0
  39. package/lib/esm/overrides/Entity.d.ts +11 -0
  40. package/lib/esm/overrides/Entity.js +28 -0
  41. package/lib/esm/overrides/PrimaryColumn.d.ts +20 -0
  42. package/lib/esm/overrides/PrimaryColumn.js +53 -0
  43. package/lib/esm/overrides/PrimaryGeneratedColumn.d.ts +24 -0
  44. package/lib/esm/overrides/PrimaryGeneratedColumn.js +51 -0
  45. package/lib/esm/overrides/UpdateDateColumn.d.ts +2 -0
  46. package/lib/esm/overrides/UpdateDateColumn.js +9 -0
  47. package/lib/esm/overrides/utils.d.ts +2 -0
  48. package/lib/esm/overrides/utils.js +29 -0
  49. package/lib/esm/query/Paginator.d.ts +86 -0
  50. package/lib/esm/query/Paginator.js +124 -0
  51. package/lib/esm/query/Statement.d.ts +131 -0
  52. package/lib/esm/query/Statement.js +242 -0
  53. package/lib/esm/query/constants.d.ts +52 -0
  54. package/lib/esm/query/constants.js +74 -0
  55. package/lib/esm/query/index.d.ts +4 -0
  56. package/lib/esm/query/index.js +5 -0
  57. package/lib/esm/query/translate.d.ts +34 -0
  58. package/lib/esm/query/translate.js +42 -0
  59. package/lib/esm/raw/postgres.d.ts +36 -0
  60. package/lib/esm/raw/postgres.js +2 -0
  61. package/lib/esm/sequences/Sequence.d.ts +67 -0
  62. package/lib/esm/sequences/Sequence.js +117 -0
  63. package/lib/esm/sequences/index.d.ts +1 -0
  64. package/lib/esm/sequences/index.js +2 -0
  65. package/lib/esm/types.d.ts +67 -0
  66. package/lib/esm/types.js +28 -0
  67. package/lib/esm/utils.d.ts +16 -0
  68. package/lib/esm/utils.js +29 -0
  69. package/lib/index.cjs +42 -0
  70. package/lib/index.d.ts +22 -0
  71. package/lib/indexes/generator.cjs +98 -0
  72. package/lib/indexes/generator.d.ts +50 -0
  73. package/lib/indexes/index.cjs +18 -0
  74. package/lib/indexes/index.d.ts +1 -0
  75. package/lib/overrides/Column.cjs +73 -0
  76. package/lib/overrides/Column.d.ts +74 -0
  77. package/lib/overrides/CreateDateColumn.cjs +12 -0
  78. package/lib/overrides/CreateDateColumn.d.ts +2 -0
  79. package/lib/overrides/Entity.cjs +31 -0
  80. package/lib/overrides/Entity.d.ts +11 -0
  81. package/lib/overrides/PrimaryColumn.cjs +56 -0
  82. package/lib/overrides/PrimaryColumn.d.ts +20 -0
  83. package/lib/overrides/PrimaryGeneratedColumn.cjs +54 -0
  84. package/lib/overrides/PrimaryGeneratedColumn.d.ts +24 -0
  85. package/lib/overrides/UpdateDateColumn.cjs +12 -0
  86. package/lib/overrides/UpdateDateColumn.d.ts +2 -0
  87. package/lib/overrides/utils.cjs +32 -0
  88. package/lib/overrides/utils.d.ts +2 -0
  89. package/lib/query/Paginator.cjs +128 -0
  90. package/lib/query/Paginator.d.ts +86 -0
  91. package/lib/query/Statement.cjs +246 -0
  92. package/lib/query/Statement.d.ts +131 -0
  93. package/lib/query/constants.cjs +77 -0
  94. package/lib/query/constants.d.ts +52 -0
  95. package/lib/query/index.cjs +21 -0
  96. package/lib/query/index.d.ts +4 -0
  97. package/lib/query/translate.cjs +45 -0
  98. package/lib/query/translate.d.ts +34 -0
  99. package/lib/raw/postgres.cjs +3 -0
  100. package/lib/raw/postgres.d.ts +36 -0
  101. package/lib/sequences/Sequence.cjs +121 -0
  102. package/lib/sequences/Sequence.d.ts +67 -0
  103. package/lib/sequences/index.cjs +18 -0
  104. package/lib/sequences/index.d.ts +1 -0
  105. package/lib/types.cjs +31 -0
  106. package/lib/types.d.ts +67 -0
  107. package/lib/utils.cjs +32 -0
  108. package/lib/utils.d.ts +16 -0
  109. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHlwZU9STVJlcG9zaXRvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvVHlwZU9STVJlcG9zaXRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEseUVBSXdDO0FBQ3hDLHlDQUFrRDtBQUNsRCwyREFLaUM7QUFFakMseURBQWtEO0FBQ2xELCtDQUE2QztBQUU3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ0c7QUFFSSxJQUFNLGlCQUFpQixHQUF2QixNQUFNLGlCQUFtQyxTQUFRLGlCQU12RDtJQUNDLFlBQVksT0FBdUIsRUFBRSxLQUFxQixFQUFFLEdBQUcsSUFBVztRQUN4RSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWTtRQUNWLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQ0FBUyxDQUFDLE1BQWlDLENBQUMsQ0FDeEQsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBUSxFQUFFLEdBQUcsSUFBVztRQUM1Qyx3Q0FBd0M7UUFDeEMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDL0IsSUFBSSxDQUFDLEtBQWEsQ0FBQyxnQ0FBUyxDQUFDLE1BQU0sQ0FBUSxFQUM1QyxFQUFFLEVBQ0YsS0FBWSxFQUNaLEdB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LElBQVc7UUFFZCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN6QyxJQUFJLENBQUMsS0FBYSxDQUFDLGdDQUFTLENBQUMsTUFBTSxDQUFRLEVBQzVDLElBQUksRUFDSixJQUFJLENBQUMsRUFBWSxFQUNqQixHQUFHLElBQUksQ0FDUixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBc0IsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUN2RCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyRCxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUE7QUFwUFksOENBQWlCOzRCQUFqQixpQkFBaUI7SUFEN0IsSUFBQSxXQUFJLEVBQUMsMEJBQWMsQ0FBQztxQ0FRRSwrQkFBYztHQVB4QixpQkFBaUIsQ0FvUDdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gYmFja2VkIGJ5IFR5cGVPUk0uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBDUlVEIG9wZXJhdGlvbnMgZm9yIGEgZ2l2ZW4gTW9kZWwgdXNpbmcgdGhlIHtAbGluayBUeXBlT1JNQWRhcHRlcn0sIGluY2x1ZGluZyBidWxrIG9wZXJhdGlvbnMgYW5kIHF1ZXJ5IGJ1aWxkZXIgYWNjZXNzIHdoaWxlIHByZXNlcnZpbmcgRGVjYWYudHMgcmVwb3NpdG9yeSBzZW1hbnRpY3MuXG4gKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbCB0aGF0IHRoaXMgcmVwb3NpdG9yeSB3aWxsIG1hbmFnZS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIGFkYXB0ZXIgdXNlZCB0byBleGVjdXRlIHBlcnNpc3RlbmNlIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+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==
@@ -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
+ }