@decaf-ts/core 0.5.21 → 0.5.23
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/README.md +251 -603
- package/dist/core.cjs +433 -225
- package/dist/core.esm.cjs +434 -226
- package/lib/esm/identity/decorators.js +1 -1
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +3 -3
- package/lib/esm/model/types.d.ts +0 -9
- package/lib/esm/model/types.js +1 -1
- package/lib/esm/persistence/Adapter.d.ts +61 -51
- package/lib/esm/persistence/Adapter.js +120 -47
- package/lib/esm/persistence/Dispatch.d.ts +2 -13
- package/lib/esm/persistence/Dispatch.js +7 -15
- package/lib/esm/persistence/errors.d.ts +2 -2
- package/lib/esm/persistence/errors.js +4 -4
- package/lib/esm/persistence/types.d.ts +2 -0
- package/lib/esm/persistence/types.js +1 -1
- package/lib/esm/query/Condition.d.ts +8 -0
- package/lib/esm/query/Condition.js +9 -1
- package/lib/esm/query/Paginator.d.ts +2 -2
- package/lib/esm/query/Paginator.js +1 -1
- package/lib/esm/query/Statement.d.ts +4 -3
- package/lib/esm/query/Statement.js +4 -2
- package/lib/esm/query/errors.d.ts +3 -3
- package/lib/esm/query/errors.js +6 -6
- package/lib/esm/ram/RamAdapter.d.ts +8 -14
- package/lib/esm/ram/RamAdapter.js +44 -33
- package/lib/esm/ram/RamContext.d.ts +14 -6
- package/lib/esm/ram/RamContext.js +15 -7
- package/lib/esm/ram/constants.d.ts +1 -2
- package/lib/esm/ram/constants.js +2 -3
- package/lib/esm/ram/types.d.ts +3 -0
- package/lib/esm/ram/types.js +1 -1
- package/lib/esm/repository/Repository.d.ts +8 -7
- package/lib/esm/repository/Repository.js +8 -8
- package/lib/esm/repository/constants.d.ts +5 -4
- package/lib/esm/repository/constants.js +6 -5
- package/lib/esm/repository/decorators.js +2 -1
- package/lib/esm/repository/errors.d.ts +2 -2
- package/lib/esm/repository/errors.js +4 -4
- package/lib/esm/repository/injectables.d.ts +82 -11
- package/lib/esm/repository/injectables.js +137 -28
- package/lib/esm/repository/utils.d.ts +28 -6
- package/lib/esm/repository/utils.js +29 -7
- package/lib/esm/utils/errors.d.ts +5 -5
- package/lib/esm/utils/errors.js +9 -9
- package/lib/identity/decorators.cjs +1 -1
- package/lib/index.cjs +4 -4
- package/lib/index.d.ts +1 -1
- package/lib/model/types.cjs +1 -1
- package/lib/model/types.d.ts +0 -9
- package/lib/persistence/Adapter.cjs +119 -46
- package/lib/persistence/Adapter.d.ts +61 -51
- package/lib/persistence/Dispatch.cjs +6 -14
- package/lib/persistence/Dispatch.d.ts +2 -13
- package/lib/persistence/errors.cjs +3 -3
- package/lib/persistence/errors.d.ts +2 -2
- package/lib/persistence/types.cjs +1 -1
- package/lib/persistence/types.d.ts +2 -0
- package/lib/query/Condition.cjs +9 -1
- package/lib/query/Condition.d.ts +8 -0
- package/lib/query/Paginator.cjs +1 -1
- package/lib/query/Paginator.d.ts +2 -2
- package/lib/query/Statement.cjs +4 -2
- package/lib/query/Statement.d.ts +4 -3
- package/lib/query/errors.cjs +5 -5
- package/lib/query/errors.d.ts +3 -3
- package/lib/ram/RamAdapter.cjs +43 -32
- package/lib/ram/RamAdapter.d.ts +8 -14
- package/lib/ram/RamContext.cjs +15 -7
- package/lib/ram/RamContext.d.ts +14 -6
- package/lib/ram/constants.cjs +2 -3
- package/lib/ram/constants.d.ts +1 -2
- package/lib/ram/types.cjs +1 -1
- package/lib/ram/types.d.ts +3 -0
- package/lib/repository/Repository.cjs +8 -8
- package/lib/repository/Repository.d.ts +8 -7
- package/lib/repository/constants.cjs +6 -5
- package/lib/repository/constants.d.ts +5 -4
- package/lib/repository/decorators.cjs +2 -1
- package/lib/repository/errors.cjs +3 -3
- package/lib/repository/errors.d.ts +2 -2
- package/lib/repository/injectables.cjs +137 -28
- package/lib/repository/injectables.d.ts +82 -11
- package/lib/repository/utils.cjs +29 -7
- package/lib/repository/utils.d.ts +28 -6
- package/lib/utils/errors.cjs +8 -8
- package/lib/utils/errors.d.ts +5 -5
- package/package.json +1 -1
@@ -12,7 +12,7 @@ import { WhereOption } from "../query/options";
|
|
12
12
|
import { SelectSelector } from "../query/selectors";
|
13
13
|
import { Logger } from "@decaf-ts/logging";
|
14
14
|
import { ObserverHandler } from "../persistence/ObserverHandler";
|
15
|
-
import
|
15
|
+
import { EventIds, InferredAdapterConfig, type ObserverFilter } from "../persistence";
|
16
16
|
/**
|
17
17
|
* @description Type alias for Repository class with simplified generic parameters.
|
18
18
|
* @summary Provides a more concise way to reference the Repository class with its generic parameters.
|
@@ -24,7 +24,7 @@ import type { EventIds, ObserverFilter } from "../persistence";
|
|
24
24
|
* @typedef Repo
|
25
25
|
* @memberOf module:core
|
26
26
|
*/
|
27
|
-
export type Repo<M extends Model<
|
27
|
+
export type Repo<M extends Model<boolean>, F extends RepositoryFlags = any, C extends Context<F> = any, Q = any, A extends Adapter<any, any, Q, F, C> = any> = Repository<M, Q, A, F, C>;
|
28
28
|
/**
|
29
29
|
* @description Core repository implementation for database operations on models on a table by table way.
|
30
30
|
* @summary Provides CRUD operations, querying capabilities, and observer pattern implementation for model persistence.
|
@@ -78,7 +78,7 @@ export type Repo<M extends Model<true | false>, F extends RepositoryFlags = any,
|
|
78
78
|
* O-->>-R: Notification complete
|
79
79
|
* R-->>-C: created model
|
80
80
|
*/
|
81
|
-
export declare class Repository<M extends Model<
|
81
|
+
export declare class Repository<M extends Model<boolean>, Q, A extends Adapter<any, any, Q, F, C>, F extends RepositoryFlags = RepositoryFlags, C extends Context<F> = Context<F>> extends Rep<M, F, C> implements Observable, Observer, Queriable<M>, IRepository<M, F, C> {
|
82
82
|
private static _cache;
|
83
83
|
protected observers: Observer[];
|
84
84
|
protected observerHandler?: ObserverHandler;
|
@@ -121,19 +121,19 @@ export declare class Repository<M extends Model<true | false>, Q, A extends Adap
|
|
121
121
|
*/
|
122
122
|
override(flags: Partial<F>): Repository<M, Q, A, F, C>;
|
123
123
|
/**
|
124
|
-
* Creates a new instance of the Repository class with a specific adapter and arguments.
|
124
|
+
* @description Creates a new instance of the Repository class with a specific adapter and arguments.
|
125
125
|
*
|
126
126
|
* @template A - The type of the adapter.
|
127
127
|
* @template Q - The type of the query builder.
|
128
128
|
* @template F - The type of the filter.
|
129
129
|
* @template C - The type of the context.
|
130
130
|
*
|
131
|
-
* @param
|
132
|
-
* @param args - Additional arguments to be passed to the new instance.
|
131
|
+
* @param {Partial<InferredAdapterConfig<A>>} conf - adapter configurations to override.
|
132
|
+
* @param [args] - Additional arguments to be passed to the new instance.
|
133
133
|
*
|
134
134
|
* @return A new instance of the Repository class with the specified adapter and arguments.
|
135
135
|
*/
|
136
|
-
for(...args: any[]): Repository<M, Q, A, F, C>;
|
136
|
+
for(conf: Partial<InferredAdapterConfig<A>>, ...args: any[]): Repository<M, Q, A, F, C>;
|
137
137
|
/**
|
138
138
|
* @description Creates a new observer handler.
|
139
139
|
* @summary Factory method for creating an observer handler instance.
|
@@ -376,6 +376,7 @@ export declare class Repository<M extends Model<true | false>, Q, A extends Adap
|
|
376
376
|
* @template M - The model type that extends Model.
|
377
377
|
* @param {Constructor<M>} model - The model constructor.
|
378
378
|
* @param {Constructor<Repo<M>> | Repo<M>} repo - The repository constructor or instance.
|
379
|
+
* @param {string} [alias] the adapter alias/flavour.
|
379
380
|
* @throws {InternalError} If a repository is already registered for the model.
|
380
381
|
*/
|
381
382
|
static register<M extends Model>(model: Constructor<M>, repo: Constructor<Repo<M>> | Repo<M>, alias?: string): void;
|
@@ -30,14 +30,15 @@ var Cascade;
|
|
30
30
|
Cascade["NONE"] = "none";
|
31
31
|
})(Cascade || (exports.Cascade = Cascade = {}));
|
32
32
|
/**
|
33
|
-
* @description
|
34
|
-
* @summary
|
35
|
-
* @
|
36
|
-
* @
|
33
|
+
* @description Shape of the default cascade configuration object used in repositories.
|
34
|
+
* @summary Documents the structure of the cascade configuration with explicit update and delete behaviors.
|
35
|
+
* @property {'cascade'|'none'} update - Determines whether updates cascade to related entities.
|
36
|
+
* @property {'cascade'|'none'} delete - Determines whether deletes cascade to related entities.
|
37
|
+
* @typeDef DefaultCascadeConfig
|
37
38
|
* @memberOf module:core
|
38
39
|
*/
|
39
40
|
exports.DefaultCascade = {
|
40
41
|
update: Cascade.CASCADE,
|
41
42
|
delete: Cascade.NONE,
|
42
43
|
};
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlcG9zaXRvcnkvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBOzs7Ozs7R0FNRztBQUNILElBQVksY0FNWDtBQU5ELFdBQVksY0FBYztJQUN4Qix1Q0FBdUM7SUFDdkMsNkJBQVcsQ0FBQTtJQUVYLHdDQUF3QztJQUN4Qyw4QkFBWSxDQUFBO0FBQ2QsQ0FBQyxFQU5XLGNBQWMsOEJBQWQsY0FBYyxRQU16QjtBQUVEOzs7Ozs7R0FNRztBQUNILElBQVksT0FLWDtBQUxELFdBQVksT0FBTztJQUNqQixvREFBb0Q7SUFDcEQsOEJBQW1CLENBQUE7SUFDbkIsMkRBQTJEO0lBQzNELHdCQUFhLENBQUE7QUFDZixDQUFDLEVBTFcsT0FBTyx1QkFBUCxPQUFPLFFBS2xCO0FBRUQ7Ozs7Ozs7R0FPRztBQUNVLFFBQUEsY0FBYyxHQUFvQjtJQUM3QyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU87SUFDdkIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJO0NBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDYXNjYWRlTWV0YWRhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBzb3J0IGRpcmVjdGlvbnMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBhdmFpbGFibGUgc29ydCBkaXJlY3Rpb25zIGZvciBvcmRlcmluZyBxdWVyeSByZXN1bHRzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIE9yZGVyRGlyZWN0aW9uIHtcbiAgLyoqIEFzY2VuZGluZyBvcmRlciAoQSB0byBaLCAwIHRvIDkpICovXG4gIEFTQyA9IFwiYXNjXCIsXG5cbiAgLyoqIERlc2NlbmRpbmcgb3JkZXIgKFogdG8gQSwgOSB0byAwKSAqL1xuICBEU0MgPSBcImRlc2NcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW51bWVyYXRpb24gb2YgY2FzY2FkZSBvcGVyYXRpb24gdHlwZXMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBhdmFpbGFibGUgY2FzY2FkZSBiZWhhdmlvcnMgZm9yIGVudGl0eSByZWxhdGlvbnNoaXBzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBlbnVtIENhc2NhZGUge1xuICAvKiogUGVyZm9ybSBjYXNjYWRlIG9wZXJhdGlvbiBvbiByZWxhdGVkIGVudGl0aWVzICovXG4gIENBU0NBREUgPSBcImNhc2NhZGVcIixcbiAgLyoqIERvIG5vdCBwZXJmb3JtIGNhc2NhZGUgb3BlcmF0aW9uIG9uIHJlbGF0ZWQgZW50aXRpZXMgKi9cbiAgTk9ORSA9IFwibm9uZVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTaGFwZSBvZiB0aGUgZGVmYXVsdCBjYXNjYWRlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHVzZWQgaW4gcmVwb3NpdG9yaWVzLlxuICogQHN1bW1hcnkgRG9jdW1lbnRzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNhc2NhZGUgY29uZmlndXJhdGlvbiB3aXRoIGV4cGxpY2l0IHVwZGF0ZSBhbmQgZGVsZXRlIGJlaGF2aW9ycy5cbiAqIEBwcm9wZXJ0eSB7J2Nhc2NhZGUnfCdub25lJ30gdXBkYXRlIC0gRGV0ZXJtaW5lcyB3aGV0aGVyIHVwZGF0ZXMgY2FzY2FkZSB0byByZWxhdGVkIGVudGl0aWVzLlxuICogQHByb3BlcnR5IHsnY2FzY2FkZSd8J25vbmUnfSBkZWxldGUgLSBEZXRlcm1pbmVzIHdoZXRoZXIgZGVsZXRlcyBjYXNjYWRlIHRvIHJlbGF0ZWQgZW50aXRpZXMuXG4gKiBAdHlwZURlZiBEZWZhdWx0Q2FzY2FkZUNvbmZpZ1xuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0Q2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhID0ge1xuICB1cGRhdGU6IENhc2NhZGUuQ0FTQ0FERSxcbiAgZGVsZXRlOiBDYXNjYWRlLk5PTkUsXG59O1xuIl19
|
@@ -26,10 +26,11 @@ export declare enum Cascade {
|
|
26
26
|
NONE = "none"
|
27
27
|
}
|
28
28
|
/**
|
29
|
-
* @description
|
30
|
-
* @summary
|
31
|
-
* @
|
32
|
-
* @
|
29
|
+
* @description Shape of the default cascade configuration object used in repositories.
|
30
|
+
* @summary Documents the structure of the cascade configuration with explicit update and delete behaviors.
|
31
|
+
* @property {'cascade'|'none'} update - Determines whether updates cascade to related entities.
|
32
|
+
* @property {'cascade'|'none'} delete - Determines whether deletes cascade to related entities.
|
33
|
+
* @typeDef DefaultCascadeConfig
|
33
34
|
* @memberOf module:core
|
34
35
|
*/
|
35
36
|
export declare const DefaultCascade: CascadeMetadata;
|
@@ -52,8 +52,9 @@ function repository(model, flavour) {
|
|
52
52
|
writable: false,
|
53
53
|
value: model,
|
54
54
|
});
|
55
|
+
return instance;
|
55
56
|
},
|
56
57
|
})(original);
|
57
58
|
});
|
58
59
|
}
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvc2l0b3J5L2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFrQ0EsZ0NBaUNDO0FBbkVELDJFQUFxRTtBQUNyRSwyREFBOEQ7QUFDOUQscURBQWdEO0FBQ2hELHlFQUErRTtBQUMvRSxpREFBMEM7QUFDMUMsNERBQTBEO0FBRTFEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsS0FBcUIsRUFDckIsT0FBZ0I7SUFFaEIsT0FBTyxDQUFDLENBQUMsUUFBYSxFQUFFLFdBQWlCLEVBQUUsRUFBRTtRQUMzQyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBQSw4QkFBTSxFQUFDLEtBQUssQ0FBQyxnQ0FBUyxDQUFDLE1BQTRCLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FDbkUsUUFBUSxFQUNSLFdBQVcsQ0FDWixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUEscUJBQVEsRUFBQyx1QkFBVSxDQUFDLEdBQUcsQ0FBQyxzQkFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRSxPQUFPO1lBQ0wsT0FBTztnQkFDUCxPQUFPLENBQUMsV0FBVyxDQUFDLHFCQUFPLENBQUMsR0FBRyxDQUFDLDZCQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdEUsdUJBQVUsQ0FBQyxRQUFRLENBQ2pCLEtBQUssQ0FBQyxnQ0FBUyxDQUFDLE1BQTRCLENBQUMsSUFBSSxLQUFLLEVBQ3RELFFBQVEsRUFDUixPQUFPLENBQ1IsQ0FBQztRQUNGLE9BQU8sSUFBQSxrQ0FBVSxFQUFDLEtBQUssQ0FBQyxnQ0FBUyxDQUFDLE1BQTRCLENBQUMsSUFBSSxLQUFLLEVBQUU7WUFDeEUsUUFBUSxFQUFFLENBQUMsUUFBd0IsRUFBRSxFQUFFO2dCQUNyQyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxzQkFBTSxDQUFDLEtBQUssRUFBRTtvQkFDNUMsVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLFlBQVksRUFBRSxLQUFLO29CQUNuQixRQUFRLEVBQUUsS0FBSztvQkFDZixLQUFLLEVBQUUsS0FBSztpQkFDYixDQUFDLENBQUM7Z0JBQ0gsT0FBTyxRQUFRLENBQUM7WUFDbEIsQ0FBQztTQUNGLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNmLENBQUMsQ0FBUSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBEQktleXMsIElSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsLCBNb2RlbEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgZGVjb3JhdG9yIGZvciBtb2RlbCBjbGFzc2VzLlxuICogQHN1bW1hcnkgQ3JlYXRlcyBhbmQgcmVnaXN0ZXJzIGEgcmVwb3NpdG9yeSBmb3IgYSBtb2RlbCBjbGFzcy4gQ2FuIGJlIHVzZWQgYXMgYm90aCBhIHByb3BlcnR5IGRlY29yYXRvciBhbmQgYSBjbGFzcyBkZWNvcmF0b3IuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8VD59IG1vZGVsIC0gVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gLSB0aGUgcmVxdWlyZWQgYWRhcHRlcidzIGZsYXZvdXIvYWxpYXMuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbW9kZWwgbWV0YWRhdGEuLlxuICogQHJldHVybiB7YW55fSAtIFRoZSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gKiBAZnVuY3Rpb24gcmVwb3NpdG9yeVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudCBDb2RlXG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBNIGFzIE1ldGFkYXRhXG4gKlxuICogICBDLT4+RDogQXBwbHkgQHJlcG9zaXRvcnkoTW9kZWwpXG4gKiAgIGFsdCBQcm9wZXJ0eSBEZWNvcmF0b3JcbiAqICAgICBELT4+RDogQ2hlY2sgaWYgcHJvcGVydHlLZXkgZXhpc3RzXG4gKiAgICAgRC0+PitDOiBSZXR1cm4gaW5qZWN0KG5hbWUpIGRlY29yYXRvclxuICogICBlbHNlIENsYXNzIERlY29yYXRvclxuICogICAgIEQtPj5NOiBTZXQgcmVwb3NpdG9yeSBtZXRhZGF0YSBvbiBtb2RlbFxuICogICAgIEQtPj5SOiBSZWdpc3RlciBtb2RlbCB3aXRoIFJlcG9zaXRvcnlcbiAqICAgICBELT4+K0M6IFJldHVybiBpbmplY3RhYmxlIGRlY29yYXRvciB3aXRoIGNvbmZpZ1xuICogICAgIEMtPj5DOiBEZWZpbmUgREJLZXlzLkNMQVNTIHByb3BlcnR5XG4gKiAgIGVuZFxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9zaXRvcnk8VCBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPFQ+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBhbnkge1xuICByZXR1cm4gKChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGlmIChwcm9wZXJ0eUtleSkge1xuICAgICAgcmV0dXJuIGluamVjdChtb2RlbFtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHwgbW9kZWwpKFxuICAgICAgICBvcmlnaW5hbCxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbWV0YWRhdGEoUmVwb3NpdG9yeS5rZXkoREJLZXlzLlJFUE9TSVRPUlkpLCBvcmlnaW5hbC5uYW1lKShtb2RlbCk7XG4gICAgZmxhdm91ciA9XG4gICAgICBmbGF2b3VyIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgb3JpZ2luYWwpO1xuICAgIFJlcG9zaXRvcnkucmVnaXN0ZXIoXG4gICAgICBtb2RlbFtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBtb2RlbF0gfHwgbW9kZWwsXG4gICAgICBvcmlnaW5hbCxcbiAgICAgIGZsYXZvdXJcbiAgICApO1xuICAgIHJldHVybiBpbmplY3RhYmxlKG1vZGVsW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIG1vZGVsXSB8fCBtb2RlbCwge1xuICAgICAgY2FsbGJhY2s6IChpbnN0YW5jZTogSVJlcG9zaXRvcnk8VD4pID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlLCBEQktleXMuQ0xBU1MsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogbW9kZWwsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9LFxuICAgIH0pKG9yaWdpbmFsKTtcbiAgfSkgYXMgYW55O1xufVxuIl19
|
@@ -17,10 +17,10 @@ const db_decorators_1 = require("@decaf-ts/db-decorators");
|
|
17
17
|
* }
|
18
18
|
* }
|
19
19
|
*/
|
20
|
-
class ObserverError extends db_decorators_1.
|
20
|
+
class ObserverError extends db_decorators_1.InternalError {
|
21
21
|
constructor(msg) {
|
22
|
-
super(ObserverError.name,
|
22
|
+
super(msg, ObserverError.name, 500);
|
23
23
|
}
|
24
24
|
}
|
25
25
|
exports.ObserverError = ObserverError;
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlcG9zaXRvcnkvZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUF3RDtBQUV4RDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQWEsYUFBYyxTQUFRLDZCQUFhO0lBQzlDLFlBQVksR0FBbUI7UUFDN0IsS0FBSyxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRjtBQUpELHNDQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiBvYnNlcnZlciBjb21tdW5pY2F0aW9uIGZhaWxzLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgaW4gb2JzZXJ2ZXIgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHJlcG9zaXRvcmllcy5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgLSBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3QuXG4gKiBAY2xhc3MgT2JzZXJ2ZXJFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICogQGV4YW1wbGVcbiAqIHRyeSB7XG4gKiAgIC8vIFNvbWUgcmVwb3NpdG9yeSBvYnNlcnZlciBvcGVyYXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE9ic2VydmVyRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdPYnNlcnZlciBjb21tdW5pY2F0aW9uIGZhaWxlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXJFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBPYnNlcnZlckVycm9yLm5hbWUsIDUwMCk7XG4gIH1cbn1cbiJdfQ==
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import {
|
1
|
+
import { InternalError } from "@decaf-ts/db-decorators";
|
2
2
|
/**
|
3
3
|
* @description Error thrown when observer communication fails.
|
4
4
|
* @summary Represents a failure in observer communication between repositories.
|
@@ -14,6 +14,6 @@ import { BaseError } from "@decaf-ts/db-decorators";
|
|
14
14
|
* }
|
15
15
|
* }
|
16
16
|
*/
|
17
|
-
export declare class ObserverError extends
|
17
|
+
export declare class ObserverError extends InternalError {
|
18
18
|
constructor(msg: string | Error);
|
19
19
|
}
|
@@ -7,54 +7,163 @@ const decorator_validation_1 = require("@decaf-ts/decorator-validation");
|
|
7
7
|
const utils_1 = require("./utils.cjs");
|
8
8
|
const constants_1 = require("./../persistence/constants.cjs");
|
9
9
|
const Adapter_1 = require("./../persistence/Adapter.cjs");
|
10
|
+
const logging_1 = require("@decaf-ts/logging");
|
10
11
|
/**
|
11
|
-
* @description Registry for injectable repositories.
|
12
|
-
* @summary
|
13
|
-
*
|
12
|
+
* @description Registry for injectable repositories with auto-resolution.
|
13
|
+
* @summary Provides an InjectableRegistry implementation that resolves repositories by model name or constructor. If a repository
|
14
|
+
* is not explicitly registered, it attempts to infer the correct repository using model metadata and the active or specified adapter flavour.
|
15
|
+
* @param {void} [constructor] No constructor parameters required; the superclass handles internal state.
|
14
16
|
* @class InjectablesRegistry
|
15
17
|
* @example
|
18
|
+
* // Basic usage: retrieve a repository by model name
|
16
19
|
* const registry = new InjectablesRegistry();
|
17
20
|
* const userRepo = registry.get<UserRepository>('User');
|
18
|
-
* // If UserRepository
|
19
|
-
*
|
21
|
+
* // If UserRepository is registered, it will be returned. Otherwise, a repository will be created if a User model exists.
|
22
|
+
*
|
23
|
+
* // Retrieve by constructor and specify adapter flavour
|
24
|
+
* const repoByCtor = registry.get<UserRepository>(UserModel, 'ram');
|
25
|
+
*
|
26
|
+
* // Retrieve by symbol (e.g., injectable token)
|
27
|
+
* const token = Symbol.for('UserRepository');
|
28
|
+
* const byToken = registry.get<UserRepository>(token);
|
29
|
+
* @mermaid
|
30
|
+
* sequenceDiagram
|
31
|
+
* participant C as Consumer
|
32
|
+
* participant R as InjectablesRegistry
|
33
|
+
* participant B as BaseRegistry
|
34
|
+
* participant M as Model
|
35
|
+
* participant A as Adapter
|
36
|
+
* participant RP as Repository
|
37
|
+
* C->>R: get(name, flavour?)
|
38
|
+
* activate R
|
39
|
+
* R->>B: super.get(name)
|
40
|
+
* alt Found in base registry
|
41
|
+
* B-->>R: injectable
|
42
|
+
* R-->>C: injectable
|
43
|
+
* else Not found
|
44
|
+
* R->>M: Model.get(name)
|
45
|
+
* alt Model found
|
46
|
+
* R->>A: resolve flavour (from arg/metadata/current)
|
47
|
+
* R->>RP: Repository.forModel(modelCtor, alias)
|
48
|
+
* alt Repository instance
|
49
|
+
* RP-->>R: repository instance
|
50
|
+
* R-->>C: repository instance
|
51
|
+
* else Repository ctor
|
52
|
+
* R->>A: Adapter.get(resolvedFlavour) or Adapter.current
|
53
|
+
* A-->>R: adapter instance
|
54
|
+
* R->>RP: new repoCtor(adapter, modelCtor)
|
55
|
+
* R-->>C: repository instance
|
56
|
+
* end
|
57
|
+
* else Model not found
|
58
|
+
* R-->>C: undefined
|
59
|
+
* end
|
60
|
+
* end
|
20
61
|
*/
|
21
62
|
class InjectablesRegistry extends injectable_decorators_1.InjectableRegistryImp {
|
63
|
+
get log() {
|
64
|
+
if (!this.logger)
|
65
|
+
this.logger = logging_1.Logging.for(this);
|
66
|
+
return this.logger;
|
67
|
+
}
|
22
68
|
constructor() {
|
23
69
|
super();
|
24
70
|
}
|
25
71
|
/**
|
26
|
-
* @description
|
27
|
-
* @summary
|
28
|
-
*
|
29
|
-
* @
|
30
|
-
* @
|
72
|
+
* @description Retrieve an injectable with repository auto-resolution.
|
73
|
+
* @summary Attempts to get an injectable from the base registry; if not found and the name refers to a known model, it
|
74
|
+
* resolves the appropriate repository using the specified flavour or model metadata, falling back to the current adapter when needed.
|
75
|
+
* @template T The injectable type to be returned.
|
76
|
+
* @param {string | symbol | Constructor<T>} name Token, model name, or constructor associated with the injectable or model.
|
77
|
+
* @param {string} [flavour] Optional adapter flavour (e.g., "ram"). If omitted, derives from metadata or current adapter.
|
78
|
+
* @return {T | undefined} The located or auto-created injectable instance; otherwise undefined if it cannot be resolved.
|
79
|
+
* @mermaid
|
80
|
+
* sequenceDiagram
|
81
|
+
* participant G as get(name, flavour?)
|
82
|
+
* participant BR as BaseRegistry
|
83
|
+
* participant M as Model
|
84
|
+
* participant A as Adapter
|
85
|
+
* participant RP as Repository
|
86
|
+
* G->>BR: super.get(name)
|
87
|
+
* alt Found
|
88
|
+
* BR-->>G: injectable
|
89
|
+
* else Not found
|
90
|
+
* G->>M: derive modelCtor from name
|
91
|
+
* alt modelCtor resolved
|
92
|
+
* G->>A: resolve flavour (arg | metadata | current)
|
93
|
+
* G->>RP: Repository.forModel(modelCtor, alias)
|
94
|
+
* alt returns instance
|
95
|
+
* RP-->>G: Repository instance
|
96
|
+
* else returns ctor
|
97
|
+
* G->>A: Adapter.get(flavour) | Adapter.current
|
98
|
+
* A-->>G: adapter instance
|
99
|
+
* G->>RP: new repoCtor(adapter, modelCtor)
|
100
|
+
* end
|
101
|
+
* else no modelCtor
|
102
|
+
* G-->>G: return undefined
|
103
|
+
* end
|
104
|
+
* end
|
31
105
|
*/
|
32
106
|
get(name, flavour) {
|
33
|
-
|
34
|
-
|
107
|
+
const log = this.log.for(this.get);
|
108
|
+
// First, try base registry, but guard against thrown errors
|
109
|
+
let injectable;
|
110
|
+
try {
|
111
|
+
injectable = super.get(name);
|
112
|
+
}
|
113
|
+
catch {
|
114
|
+
// do nothing. we handle it later
|
115
|
+
}
|
116
|
+
if (!injectable) {
|
117
|
+
let modelCtor;
|
118
|
+
if (typeof name === "function")
|
119
|
+
modelCtor = name;
|
120
|
+
else if (typeof name === "symbol" || typeof name === "string") {
|
121
|
+
modelCtor = decorator_validation_1.Model.get(name.toString());
|
122
|
+
}
|
123
|
+
if (!modelCtor)
|
124
|
+
return undefined;
|
125
|
+
// Resolve flavour from metadata if not provided
|
126
|
+
const metaKey = Adapter_1.Adapter.key(constants_1.PersistenceKeys.ADAPTER);
|
127
|
+
const resolvedFlavour = flavour ||
|
128
|
+
Reflect.getMetadata(metaKey, modelCtor);
|
35
129
|
try {
|
36
|
-
|
37
|
-
|
38
|
-
|
130
|
+
// Determine an alias to use: prefer a directly registered adapter; otherwise, if the current adapter
|
131
|
+
// has the same flavour, use its alias to satisfy Repository.forModel/Adapter.get lookups.
|
132
|
+
let aliasToUse = resolvedFlavour;
|
133
|
+
try {
|
134
|
+
if (resolvedFlavour)
|
135
|
+
Adapter_1.Adapter.get(resolvedFlavour);
|
39
136
|
}
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
return injectable;
|
45
|
-
flavour =
|
46
|
-
flavour ||
|
47
|
-
Reflect.getMetadata(Adapter_1.Adapter.key(constants_1.PersistenceKeys.ADAPTER), injectable.constructor) ||
|
48
|
-
Reflect.getMetadata(Adapter_1.Adapter.key(constants_1.PersistenceKeys.ADAPTER), m);
|
49
|
-
injectable_decorators_1.Injectables.register(injectable, (0, utils_1.generateInjectableNameForRepository)(m, flavour));
|
137
|
+
catch {
|
138
|
+
const current = Adapter_1.Adapter.current;
|
139
|
+
if (current && current.flavour === resolvedFlavour)
|
140
|
+
aliasToUse = current.alias;
|
50
141
|
}
|
51
|
-
|
142
|
+
injectable = Repository_1.Repository.forModel(modelCtor, aliasToUse);
|
143
|
+
if (injectable instanceof Repository_1.Repository)
|
144
|
+
return injectable;
|
145
|
+
// Otherwise, register the resolved injectable name for later retrieval
|
146
|
+
const f = resolvedFlavour ||
|
147
|
+
Reflect.getMetadata(metaKey, injectable.constructor) ||
|
148
|
+
Reflect.getMetadata(metaKey, modelCtor);
|
149
|
+
injectable_decorators_1.Injectables.register(injectable, (0, utils_1.generateInjectableNameForRepository)(modelCtor, f));
|
52
150
|
}
|
53
151
|
catch (e) {
|
54
|
-
|
152
|
+
log.debug(`No registered repository or adapter found. falling back to default adapter`);
|
153
|
+
const repoCtor = Repository_1.Repository["get"](modelCtor, resolvedFlavour);
|
154
|
+
if (typeof repoCtor === "function") {
|
155
|
+
const adapter = resolvedFlavour
|
156
|
+
? Adapter_1.Adapter.get(resolvedFlavour)
|
157
|
+
: Adapter_1.Adapter.current;
|
158
|
+
if (!adapter)
|
159
|
+
return undefined;
|
160
|
+
const instance = new repoCtor(adapter, modelCtor);
|
161
|
+
return instance;
|
162
|
+
}
|
55
163
|
}
|
164
|
+
}
|
56
165
|
return injectable;
|
57
166
|
}
|
58
167
|
}
|
59
168
|
exports.InjectablesRegistry = InjectablesRegistry;
|
60
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3NpdG9yeS9pbmplY3RhYmxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyRUFHeUM7QUFDekMsaURBQTBDO0FBQzFDLHlFQUl3QztBQUN4Qyx1Q0FBOEQ7QUFDOUQsOERBQTJEO0FBQzNELDBEQUFpRDtBQUVqRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSw2Q0FBcUI7SUFDNUQ7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTSxHQUFHLENBQ1YsSUFBNkIsRUFDN0IsT0FBZ0I7UUFFaEIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVTtZQUNiLElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ2IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3pELENBQUMsR0FBRyw0QkFBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQTBCLENBQUM7Z0JBQzFELENBQUM7Z0JBQ0QsSUFBSSxDQUFDO29CQUNILFVBQVUsR0FBRyx1QkFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFxQixFQUFFLE9BQU8sQ0FBTSxDQUFDO2dCQUN4RSxJQUFJLFVBQVUsRUFBRSxDQUFDO29CQUNmLElBQUksVUFBVSxZQUFZLHVCQUFVO3dCQUFFLE9BQU8sVUFBZSxDQUFDO29CQUM3RCxPQUFPO3dCQUNMLE9BQU87NEJBQ1AsT0FBTyxDQUFDLFdBQVcsQ0FDakIsaUJBQU8sQ0FBQyxHQUFHLENBQUMsMkJBQWUsQ0FBQyxPQUFPLENBQUMsRUFDcEMsVUFBVSxDQUFDLFdBQVcsQ0FDdkI7NEJBQ0QsT0FBTyxDQUFDLFdBQVcsQ0FDakIsaUJBQU8sQ0FBQyxHQUFHLENBQUMsMkJBQWUsQ0FBQyxPQUFPLENBQUMsRUFDcEMsQ0FBMEIsQ0FDM0IsQ0FBQztvQkFDSixtQ0FBVyxDQUFDLFFBQVEsQ0FDbEIsVUFBVSxFQUNWLElBQUEsMkNBQW1DLEVBQ2pDLENBQTBCLEVBQzFCLE9BQU8sQ0FDUixDQUNGLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCw2REFBNkQ7WUFDL0QsQ0FBQztZQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7Z0JBQ2hCLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7UUFDSCxPQUFPLFVBQTJCLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBbkRELGtEQW1EQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEluamVjdGFibGVSZWdpc3RyeUltcCxcbiAgSW5qZWN0YWJsZXMsXG59IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4vUmVwb3NpdG9yeVwiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVnaXN0cnkgZm9yIGluamVjdGFibGUgcmVwb3NpdG9yaWVzLlxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBpbmplY3RhYmxlIHJlZ2lzdHJ5IHRvIHByb3ZpZGUgYXV0b21hdGljIHJlcG9zaXRvcnkgcmVzb2x1dGlvbiBmb3IgbW9kZWxzLlxuICogQHBhcmFtIHt2b2lkfSAtIE5vIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgcmVxdWlyZWQuXG4gKiBAY2xhc3MgSW5qZWN0YWJsZXNSZWdpc3RyeVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IEluamVjdGFibGVzUmVnaXN0cnkoKTtcbiAqIGNvbnN0IHVzZXJSZXBvID0gcmVnaXN0cnkuZ2V0PFVzZXJSZXBvc2l0b3J5PignVXNlcicpO1xuICogLy8gSWYgVXNlclJlcG9zaXRvcnkgZXhpc3RzLCBpdCB3aWxsIGJlIHJldHVybmVkXG4gKiAvLyBJZiBub3QsIGJ1dCBVc2VyIG1vZGVsIGV4aXN0cywgYSByZXBvc2l0b3J5IHdpbGwgYmUgY3JlYXRlZCBmb3IgaXRcbiAqL1xuZXhwb3J0IGNsYXNzIEluamVjdGFibGVzUmVnaXN0cnkgZXh0ZW5kcyBJbmplY3RhYmxlUmVnaXN0cnlJbXAge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFuIGluamVjdGFibGUgYnkgbmFtZSB3aXRoIHJlcG9zaXRvcnkgYXV0by1yZXNvbHV0aW9uLlxuICAgKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBiYXNlIGdldCBtZXRob2QgdG8gYXV0b21hdGljYWxseSByZXNvbHZlIHJlcG9zaXRvcmllcyBmb3IgbW9kZWxzIHdoZW4gbm90IGZvdW5kIGRpcmVjdGx5LlxuICAgKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIGluamVjdGFibGUgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBpbmplY3RhYmxlIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJuIHtUIHwgdW5kZWZpbmVkfSAtIFRoZSBpbmplY3RhYmxlIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmQuXG4gICAqL1xuICBvdmVycmlkZSBnZXQ8VD4oXG4gICAgbmFtZTogc3ltYm9sIHwgQ29uc3RydWN0b3I8VD4sXG4gICAgZmxhdm91cj86IHN0cmluZ1xuICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaW5qZWN0YWJsZSA9IHN1cGVyLmdldChuYW1lKTtcbiAgICBpZiAoIWluamVjdGFibGUpXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgbSA9IG5hbWU7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIiB8fCB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIG0gPSBNb2RlbC5nZXQobmFtZS50b1N0cmluZygpKSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG0pXG4gICAgICAgICAgaW5qZWN0YWJsZSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobSBhcyBDb25zdHJ1Y3Rvcjxhbnk+LCBmbGF2b3VyKSBhcyBUO1xuICAgICAgICBpZiAoaW5qZWN0YWJsZSkge1xuICAgICAgICAgIGlmIChpbmplY3RhYmxlIGluc3RhbmNlb2YgUmVwb3NpdG9yeSkgcmV0dXJuIGluamVjdGFibGUgYXMgVDtcbiAgICAgICAgICBmbGF2b3VyID1cbiAgICAgICAgICAgIGZsYXZvdXIgfHxcbiAgICAgICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICAgICAgaW5qZWN0YWJsZS5jb25zdHJ1Y3RvclxuICAgICAgICAgICAgKSB8fFxuICAgICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLkFEQVBURVIpLFxuICAgICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBJbmplY3RhYmxlcy5yZWdpc3RlcihcbiAgICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICAgICBnZW5lcmF0ZUluamVjdGFibGVOYW1lRm9yUmVwb3NpdG9yeShcbiAgICAgICAgICAgICAgbSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgICAgICAgICAgIGZsYXZvdXJcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIHJldHVybiBpbmplY3RhYmxlIGFzIFQgfCB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3NpdG9yeS9pbmplY3RhYmxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyRUFHeUM7QUFDekMsaURBQTBDO0FBQzFDLHlFQUl3QztBQUN4Qyx1Q0FBOEQ7QUFDOUQsOERBQTJEO0FBQzNELDBEQUFpRDtBQUNqRCwrQ0FBb0Q7QUFFcEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0RHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSw2Q0FBcUI7SUFHNUQsSUFBYyxHQUFHO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxJQUFXLENBQUMsQ0FBQztRQUN6RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVEO1FBQ0UsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrQ0c7SUFDTSxHQUFHLENBQ1YsSUFBc0MsRUFDdEMsT0FBZ0I7UUFFaEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLDREQUE0RDtRQUM1RCxJQUFJLFVBQXlCLENBQUM7UUFDOUIsSUFBSSxDQUFDO1lBQ0gsVUFBVSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBVyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLGlDQUFpQztRQUNuQyxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLElBQUksU0FBdUMsQ0FBQztZQUM1QyxJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVU7Z0JBQUUsU0FBUyxHQUFHLElBQXdCLENBQUM7aUJBQ2hFLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM5RCxTQUFTLEdBQUcsNEJBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUEwQixDQUFDO1lBQ2xFLENBQUM7WUFFRCxJQUFJLENBQUMsU0FBUztnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUVqQyxnREFBZ0Q7WUFDaEQsTUFBTSxPQUFPLEdBQUcsaUJBQU8sQ0FBQyxHQUFHLENBQUMsMkJBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyRCxNQUFNLGVBQWUsR0FDbkIsT0FBTztnQkFDTixPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQXdCLENBQUM7WUFFbEUsSUFBSSxDQUFDO2dCQUNILHFHQUFxRztnQkFDckcsMEZBQTBGO2dCQUMxRixJQUFJLFVBQVUsR0FBRyxlQUFlLENBQUM7Z0JBQ2pDLElBQUksQ0FBQztvQkFDSCxJQUFJLGVBQWU7d0JBQUUsaUJBQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ3BELENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLE1BQU0sT0FBTyxHQUFHLGlCQUFPLENBQUMsT0FBYyxDQUFDO29CQUN2QyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLGVBQWU7d0JBQ2hELFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUMvQixDQUFDO2dCQUVELFVBQVUsR0FBRyx1QkFBVSxDQUFDLFFBQVEsQ0FDOUIsU0FBNkIsRUFDN0IsVUFBVSxDQUNOLENBQUM7Z0JBQ1AsSUFBSSxVQUFVLFlBQVksdUJBQVU7b0JBQUUsT0FBTyxVQUFlLENBQUM7Z0JBRTdELHVFQUF1RTtnQkFDdkUsTUFBTSxDQUFDLEdBQ0wsZUFBZTtvQkFDZCxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRyxVQUFrQixDQUFDLFdBQVcsQ0FFL0M7b0JBQ2IsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUF3QixDQUFDO2dCQUNsRSxtQ0FBVyxDQUFDLFFBQVEsQ0FDbEIsVUFBVSxFQUNWLElBQUEsMkNBQW1DLEVBQ2pDLFNBQWtDLEVBQ2xDLENBQVcsQ0FDWixDQUNGLENBQUM7WUFDSixDQUFDO1lBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztnQkFDcEIsR0FBRyxDQUFDLEtBQUssQ0FDUCw0RUFBNEUsQ0FDN0UsQ0FBQztnQkFDRixNQUFNLFFBQVEsR0FBSSx1QkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksT0FBTyxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQ25DLE1BQU0sT0FBTyxHQUFHLGVBQWU7d0JBQzdCLENBQUMsQ0FBRSxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQVM7d0JBQ3ZDLENBQUMsQ0FBRSxpQkFBTyxDQUFDLE9BQWUsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLE9BQU87d0JBQUUsT0FBTyxTQUFTLENBQUM7b0JBQy9CLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDbEQsT0FBTyxRQUFhLENBQUM7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sVUFBMkIsQ0FBQztJQUNyQyxDQUFDO0NBQ0Y7QUE3SEQsa0RBNkhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wLFxuICBJbmplY3RhYmxlcyxcbn0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9SZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsQ29uc3RydWN0b3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5IH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2UvQWRhcHRlclwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlZ2lzdHJ5IGZvciBpbmplY3RhYmxlIHJlcG9zaXRvcmllcyB3aXRoIGF1dG8tcmVzb2x1dGlvbi5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGFuIEluamVjdGFibGVSZWdpc3RyeSBpbXBsZW1lbnRhdGlvbiB0aGF0IHJlc29sdmVzIHJlcG9zaXRvcmllcyBieSBtb2RlbCBuYW1lIG9yIGNvbnN0cnVjdG9yLiBJZiBhIHJlcG9zaXRvcnlcbiAqIGlzIG5vdCBleHBsaWNpdGx5IHJlZ2lzdGVyZWQsIGl0IGF0dGVtcHRzIHRvIGluZmVyIHRoZSBjb3JyZWN0IHJlcG9zaXRvcnkgdXNpbmcgbW9kZWwgbWV0YWRhdGEgYW5kIHRoZSBhY3RpdmUgb3Igc3BlY2lmaWVkIGFkYXB0ZXIgZmxhdm91ci5cbiAqIEBwYXJhbSB7dm9pZH0gW2NvbnN0cnVjdG9yXSBObyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHJlcXVpcmVkOyB0aGUgc3VwZXJjbGFzcyBoYW5kbGVzIGludGVybmFsIHN0YXRlLlxuICogQGNsYXNzIEluamVjdGFibGVzUmVnaXN0cnlcbiAqIEBleGFtcGxlXG4gKiAvLyBCYXNpYyB1c2FnZTogcmV0cmlldmUgYSByZXBvc2l0b3J5IGJ5IG1vZGVsIG5hbWVcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IEluamVjdGFibGVzUmVnaXN0cnkoKTtcbiAqIGNvbnN0IHVzZXJSZXBvID0gcmVnaXN0cnkuZ2V0PFVzZXJSZXBvc2l0b3J5PignVXNlcicpO1xuICogLy8gSWYgVXNlclJlcG9zaXRvcnkgaXMgcmVnaXN0ZXJlZCwgaXQgd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlLCBhIHJlcG9zaXRvcnkgd2lsbCBiZSBjcmVhdGVkIGlmIGEgVXNlciBtb2RlbCBleGlzdHMuXG4gKlxuICogLy8gUmV0cmlldmUgYnkgY29uc3RydWN0b3IgYW5kIHNwZWNpZnkgYWRhcHRlciBmbGF2b3VyXG4gKiBjb25zdCByZXBvQnlDdG9yID0gcmVnaXN0cnkuZ2V0PFVzZXJSZXBvc2l0b3J5PihVc2VyTW9kZWwsICdyYW0nKTtcbiAqXG4gKiAvLyBSZXRyaWV2ZSBieSBzeW1ib2wgKGUuZy4sIGluamVjdGFibGUgdG9rZW4pXG4gKiBjb25zdCB0b2tlbiA9IFN5bWJvbC5mb3IoJ1VzZXJSZXBvc2l0b3J5Jyk7XG4gKiBjb25zdCBieVRva2VuID0gcmVnaXN0cnkuZ2V0PFVzZXJSZXBvc2l0b3J5Pih0b2tlbik7XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ29uc3VtZXJcbiAqICAgcGFydGljaXBhbnQgUiBhcyBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKiAgIHBhcnRpY2lwYW50IEIgYXMgQmFzZVJlZ2lzdHJ5XG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgQSBhcyBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFJQIGFzIFJlcG9zaXRvcnlcbiAqICAgQy0+PlI6IGdldChuYW1lLCBmbGF2b3VyPylcbiAqICAgYWN0aXZhdGUgUlxuICogICBSLT4+Qjogc3VwZXIuZ2V0KG5hbWUpXG4gKiAgIGFsdCBGb3VuZCBpbiBiYXNlIHJlZ2lzdHJ5XG4gKiAgICAgQi0tPj5SOiBpbmplY3RhYmxlXG4gKiAgICAgUi0tPj5DOiBpbmplY3RhYmxlXG4gKiAgIGVsc2UgTm90IGZvdW5kXG4gKiAgICAgUi0+Pk06IE1vZGVsLmdldChuYW1lKVxuICogICAgIGFsdCBNb2RlbCBmb3VuZFxuICogICAgICAgUi0+PkE6IHJlc29sdmUgZmxhdm91ciAoZnJvbSBhcmcvbWV0YWRhdGEvY3VycmVudClcbiAqICAgICAgIFItPj5SUDogUmVwb3NpdG9yeS5mb3JNb2RlbChtb2RlbEN0b3IsIGFsaWFzKVxuICogICAgICAgYWx0IFJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqICAgICAgICAgUlAtLT4+UjogcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogICAgICAgICBSLS0+PkM6IHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqICAgICAgIGVsc2UgUmVwb3NpdG9yeSBjdG9yXG4gKiAgICAgICAgIFItPj5BOiBBZGFwdGVyLmdldChyZXNvbHZlZEZsYXZvdXIpIG9yIEFkYXB0ZXIuY3VycmVudFxuICogICAgICAgICBBLS0+PlI6IGFkYXB0ZXIgaW5zdGFuY2VcbiAqICAgICAgICAgUi0+PlJQOiBuZXcgcmVwb0N0b3IoYWRhcHRlciwgbW9kZWxDdG9yKVxuICogICAgICAgICBSLS0+PkM6IHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqICAgICAgIGVuZFxuICogICAgIGVsc2UgTW9kZWwgbm90IGZvdW5kXG4gKiAgICAgICBSLS0+PkM6IHVuZGVmaW5lZFxuICogICAgIGVuZFxuICogICBlbmRcbiAqL1xuZXhwb3J0IGNsYXNzIEluamVjdGFibGVzUmVnaXN0cnkgZXh0ZW5kcyBJbmplY3RhYmxlUmVnaXN0cnlJbXAge1xuICBwcml2YXRlIGxvZ2dlcj86IExvZ2dlcjtcblxuICBwcm90ZWN0ZWQgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5sb2dnZXIpIHRoaXMubG9nZ2VyID0gTG9nZ2luZy5mb3IodGhpcyBhcyBhbnkpO1xuICAgIHJldHVybiB0aGlzLmxvZ2dlcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlIGFuIGluamVjdGFibGUgd2l0aCByZXBvc2l0b3J5IGF1dG8tcmVzb2x1dGlvbi5cbiAgICogQHN1bW1hcnkgQXR0ZW1wdHMgdG8gZ2V0IGFuIGluamVjdGFibGUgZnJvbSB0aGUgYmFzZSByZWdpc3RyeTsgaWYgbm90IGZvdW5kIGFuZCB0aGUgbmFtZSByZWZlcnMgdG8gYSBrbm93biBtb2RlbCwgaXRcbiAgICogcmVzb2x2ZXMgdGhlIGFwcHJvcHJpYXRlIHJlcG9zaXRvcnkgdXNpbmcgdGhlIHNwZWNpZmllZCBmbGF2b3VyIG9yIG1vZGVsIG1ldGFkYXRhLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGN1cnJlbnQgYWRhcHRlciB3aGVuIG5lZWRlZC5cbiAgICogQHRlbXBsYXRlIFQgVGhlIGluamVjdGFibGUgdHlwZSB0byBiZSByZXR1cm5lZC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RvcjxUPn0gbmFtZSBUb2tlbiwgbW9kZWwgbmFtZSwgb3IgY29uc3RydWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmplY3RhYmxlIG9yIG1vZGVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIE9wdGlvbmFsIGFkYXB0ZXIgZmxhdm91ciAoZS5nLiwgXCJyYW1cIikuIElmIG9taXR0ZWQsIGRlcml2ZXMgZnJvbSBtZXRhZGF0YSBvciBjdXJyZW50IGFkYXB0ZXIuXG4gICAqIEByZXR1cm4ge1QgfCB1bmRlZmluZWR9IFRoZSBsb2NhdGVkIG9yIGF1dG8tY3JlYXRlZCBpbmplY3RhYmxlIGluc3RhbmNlOyBvdGhlcndpc2UgdW5kZWZpbmVkIGlmIGl0IGNhbm5vdCBiZSByZXNvbHZlZC5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRyBhcyBnZXQobmFtZSwgZmxhdm91cj8pXG4gICAqICAgcGFydGljaXBhbnQgQlIgYXMgQmFzZVJlZ2lzdHJ5XG4gICAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFJQIGFzIFJlcG9zaXRvcnlcbiAgICogICBHLT4+QlI6IHN1cGVyLmdldChuYW1lKVxuICAgKiAgIGFsdCBGb3VuZFxuICAgKiAgICAgQlItLT4+RzogaW5qZWN0YWJsZVxuICAgKiAgIGVsc2UgTm90IGZvdW5kXG4gICAqICAgICBHLT4+TTogZGVyaXZlIG1vZGVsQ3RvciBmcm9tIG5hbWVcbiAgICogICAgIGFsdCBtb2RlbEN0b3IgcmVzb2x2ZWRcbiAgICogICAgICAgRy0+PkE6IHJlc29sdmUgZmxhdm91ciAoYXJnIHwgbWV0YWRhdGEgfCBjdXJyZW50KVxuICAgKiAgICAgICBHLT4+UlA6IFJlcG9zaXRvcnkuZm9yTW9kZWwobW9kZWxDdG9yLCBhbGlhcylcbiAgICogICAgICAgYWx0IHJldHVybnMgaW5zdGFuY2VcbiAgICogICAgICAgICBSUC0tPj5HOiBSZXBvc2l0b3J5IGluc3RhbmNlXG4gICAqICAgICAgIGVsc2UgcmV0dXJucyBjdG9yXG4gICAqICAgICAgICAgRy0+PkE6IEFkYXB0ZXIuZ2V0KGZsYXZvdXIpIHwgQWRhcHRlci5jdXJyZW50XG4gICAqICAgICAgICAgQS0tPj5HOiBhZGFwdGVyIGluc3RhbmNlXG4gICAqICAgICAgICAgRy0+PlJQOiBuZXcgcmVwb0N0b3IoYWRhcHRlciwgbW9kZWxDdG9yKVxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVsc2Ugbm8gbW9kZWxDdG9yXG4gICAqICAgICAgIEctLT4+RzogcmV0dXJuIHVuZGVmaW5lZFxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBnZXQ8VD4oXG4gICAgbmFtZTogc3ltYm9sIHwgQ29uc3RydWN0b3I8VD4gfCBzdHJpbmcsXG4gICAgZmxhdm91cj86IHN0cmluZ1xuICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5nZXQpO1xuICAgIC8vIEZpcnN0LCB0cnkgYmFzZSByZWdpc3RyeSwgYnV0IGd1YXJkIGFnYWluc3QgdGhyb3duIGVycm9yc1xuICAgIGxldCBpbmplY3RhYmxlOiBUIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RhYmxlID0gc3VwZXIuZ2V0KG5hbWUgYXMgYW55KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmcuIHdlIGhhbmRsZSBpdCBsYXRlclxuICAgIH1cblxuICAgIGlmICghaW5qZWN0YWJsZSkge1xuICAgICAgbGV0IG1vZGVsQ3RvcjogQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiKSBtb2RlbEN0b3IgPSBuYW1lIGFzIENvbnN0cnVjdG9yPGFueT47XG4gICAgICBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIiB8fCB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBtb2RlbEN0b3IgPSBNb2RlbC5nZXQobmFtZS50b1N0cmluZygpKSBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT47XG4gICAgICB9XG5cbiAgICAgIGlmICghbW9kZWxDdG9yKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAvLyBSZXNvbHZlIGZsYXZvdXIgZnJvbSBtZXRhZGF0YSBpZiBub3QgcHJvdmlkZWRcbiAgICAgIGNvbnN0IG1ldGFLZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUik7XG4gICAgICBjb25zdCByZXNvbHZlZEZsYXZvdXIgPVxuICAgICAgICBmbGF2b3VyIHx8XG4gICAgICAgIChSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFLZXksIG1vZGVsQ3RvcikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGFuIGFsaWFzIHRvIHVzZTogcHJlZmVyIGEgZGlyZWN0bHkgcmVnaXN0ZXJlZCBhZGFwdGVyOyBvdGhlcndpc2UsIGlmIHRoZSBjdXJyZW50IGFkYXB0ZXJcbiAgICAgICAgLy8gaGFzIHRoZSBzYW1lIGZsYXZvdXIsIHVzZSBpdHMgYWxpYXMgdG8gc2F0aXNmeSBSZXBvc2l0b3J5LmZvck1vZGVsL0FkYXB0ZXIuZ2V0IGxvb2t1cHMuXG4gICAgICAgIGxldCBhbGlhc1RvVXNlID0gcmVzb2x2ZWRGbGF2b3VyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChyZXNvbHZlZEZsYXZvdXIpIEFkYXB0ZXIuZ2V0KHJlc29sdmVkRmxhdm91cik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBBZGFwdGVyLmN1cnJlbnQgYXMgYW55O1xuICAgICAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQuZmxhdm91ciA9PT0gcmVzb2x2ZWRGbGF2b3VyKVxuICAgICAgICAgICAgYWxpYXNUb1VzZSA9IGN1cnJlbnQuYWxpYXM7XG4gICAgICAgIH1cblxuICAgICAgICBpbmplY3RhYmxlID0gUmVwb3NpdG9yeS5mb3JNb2RlbChcbiAgICAgICAgICBtb2RlbEN0b3IgYXMgQ29uc3RydWN0b3I8YW55PixcbiAgICAgICAgICBhbGlhc1RvVXNlXG4gICAgICAgICkgYXMgVDtcbiAgICAgICAgaWYgKGluamVjdGFibGUgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSByZXR1cm4gaW5qZWN0YWJsZSBhcyBUO1xuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgcmVnaXN0ZXIgdGhlIHJlc29sdmVkIGluamVjdGFibGUgbmFtZSBmb3IgbGF0ZXIgcmV0cmlldmFsXG4gICAgICAgIGNvbnN0IGYgPVxuICAgICAgICAgIHJlc29sdmVkRmxhdm91ciB8fFxuICAgICAgICAgIChSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFLZXksIChpbmplY3RhYmxlIGFzIGFueSkuY29uc3RydWN0b3IpIGFzXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCB1bmRlZmluZWQpIHx8XG4gICAgICAgICAgKFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YUtleSwgbW9kZWxDdG9yKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICAgICAgICBJbmplY3RhYmxlcy5yZWdpc3RlcihcbiAgICAgICAgICBpbmplY3RhYmxlLFxuICAgICAgICAgIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5KFxuICAgICAgICAgICAgbW9kZWxDdG9yIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAgICAgICAgIGYgYXMgc3RyaW5nXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgYE5vIHJlZ2lzdGVyZWQgcmVwb3NpdG9yeSBvciBhZGFwdGVyIGZvdW5kLiBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCBhZGFwdGVyYFxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZXBvQ3RvciA9IChSZXBvc2l0b3J5IGFzIGFueSlbXCJnZXRcIl0obW9kZWxDdG9yLCByZXNvbHZlZEZsYXZvdXIpO1xuICAgICAgICBpZiAodHlwZW9mIHJlcG9DdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBjb25zdCBhZGFwdGVyID0gcmVzb2x2ZWRGbGF2b3VyXG4gICAgICAgICAgICA/IChBZGFwdGVyLmdldChyZXNvbHZlZEZsYXZvdXIpIGFzIGFueSlcbiAgICAgICAgICAgIDogKEFkYXB0ZXIuY3VycmVudCBhcyBhbnkpO1xuICAgICAgICAgIGlmICghYWRhcHRlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyByZXBvQ3RvcihhZGFwdGVyLCBtb2RlbEN0b3IpO1xuICAgICAgICAgIHJldHVybiBpbnN0YW5jZSBhcyBUO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluamVjdGFibGUgYXMgVCB8IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
@@ -1,24 +1,95 @@
|
|
1
1
|
import { InjectableRegistryImp } from "@decaf-ts/injectable-decorators";
|
2
2
|
import { Constructor } from "@decaf-ts/decorator-validation";
|
3
|
+
import { Logger } from "@decaf-ts/logging";
|
3
4
|
/**
|
4
|
-
* @description Registry for injectable repositories.
|
5
|
-
* @summary
|
6
|
-
*
|
5
|
+
* @description Registry for injectable repositories with auto-resolution.
|
6
|
+
* @summary Provides an InjectableRegistry implementation that resolves repositories by model name or constructor. If a repository
|
7
|
+
* is not explicitly registered, it attempts to infer the correct repository using model metadata and the active or specified adapter flavour.
|
8
|
+
* @param {void} [constructor] No constructor parameters required; the superclass handles internal state.
|
7
9
|
* @class InjectablesRegistry
|
8
10
|
* @example
|
11
|
+
* // Basic usage: retrieve a repository by model name
|
9
12
|
* const registry = new InjectablesRegistry();
|
10
13
|
* const userRepo = registry.get<UserRepository>('User');
|
11
|
-
* // If UserRepository
|
12
|
-
*
|
14
|
+
* // If UserRepository is registered, it will be returned. Otherwise, a repository will be created if a User model exists.
|
15
|
+
*
|
16
|
+
* // Retrieve by constructor and specify adapter flavour
|
17
|
+
* const repoByCtor = registry.get<UserRepository>(UserModel, 'ram');
|
18
|
+
*
|
19
|
+
* // Retrieve by symbol (e.g., injectable token)
|
20
|
+
* const token = Symbol.for('UserRepository');
|
21
|
+
* const byToken = registry.get<UserRepository>(token);
|
22
|
+
* @mermaid
|
23
|
+
* sequenceDiagram
|
24
|
+
* participant C as Consumer
|
25
|
+
* participant R as InjectablesRegistry
|
26
|
+
* participant B as BaseRegistry
|
27
|
+
* participant M as Model
|
28
|
+
* participant A as Adapter
|
29
|
+
* participant RP as Repository
|
30
|
+
* C->>R: get(name, flavour?)
|
31
|
+
* activate R
|
32
|
+
* R->>B: super.get(name)
|
33
|
+
* alt Found in base registry
|
34
|
+
* B-->>R: injectable
|
35
|
+
* R-->>C: injectable
|
36
|
+
* else Not found
|
37
|
+
* R->>M: Model.get(name)
|
38
|
+
* alt Model found
|
39
|
+
* R->>A: resolve flavour (from arg/metadata/current)
|
40
|
+
* R->>RP: Repository.forModel(modelCtor, alias)
|
41
|
+
* alt Repository instance
|
42
|
+
* RP-->>R: repository instance
|
43
|
+
* R-->>C: repository instance
|
44
|
+
* else Repository ctor
|
45
|
+
* R->>A: Adapter.get(resolvedFlavour) or Adapter.current
|
46
|
+
* A-->>R: adapter instance
|
47
|
+
* R->>RP: new repoCtor(adapter, modelCtor)
|
48
|
+
* R-->>C: repository instance
|
49
|
+
* end
|
50
|
+
* else Model not found
|
51
|
+
* R-->>C: undefined
|
52
|
+
* end
|
53
|
+
* end
|
13
54
|
*/
|
14
55
|
export declare class InjectablesRegistry extends InjectableRegistryImp {
|
56
|
+
private logger?;
|
57
|
+
protected get log(): Logger;
|
15
58
|
constructor();
|
16
59
|
/**
|
17
|
-
* @description
|
18
|
-
* @summary
|
19
|
-
*
|
20
|
-
* @
|
21
|
-
* @
|
60
|
+
* @description Retrieve an injectable with repository auto-resolution.
|
61
|
+
* @summary Attempts to get an injectable from the base registry; if not found and the name refers to a known model, it
|
62
|
+
* resolves the appropriate repository using the specified flavour or model metadata, falling back to the current adapter when needed.
|
63
|
+
* @template T The injectable type to be returned.
|
64
|
+
* @param {string | symbol | Constructor<T>} name Token, model name, or constructor associated with the injectable or model.
|
65
|
+
* @param {string} [flavour] Optional adapter flavour (e.g., "ram"). If omitted, derives from metadata or current adapter.
|
66
|
+
* @return {T | undefined} The located or auto-created injectable instance; otherwise undefined if it cannot be resolved.
|
67
|
+
* @mermaid
|
68
|
+
* sequenceDiagram
|
69
|
+
* participant G as get(name, flavour?)
|
70
|
+
* participant BR as BaseRegistry
|
71
|
+
* participant M as Model
|
72
|
+
* participant A as Adapter
|
73
|
+
* participant RP as Repository
|
74
|
+
* G->>BR: super.get(name)
|
75
|
+
* alt Found
|
76
|
+
* BR-->>G: injectable
|
77
|
+
* else Not found
|
78
|
+
* G->>M: derive modelCtor from name
|
79
|
+
* alt modelCtor resolved
|
80
|
+
* G->>A: resolve flavour (arg | metadata | current)
|
81
|
+
* G->>RP: Repository.forModel(modelCtor, alias)
|
82
|
+
* alt returns instance
|
83
|
+
* RP-->>G: Repository instance
|
84
|
+
* else returns ctor
|
85
|
+
* G->>A: Adapter.get(flavour) | Adapter.current
|
86
|
+
* A-->>G: adapter instance
|
87
|
+
* G->>RP: new repoCtor(adapter, modelCtor)
|
88
|
+
* end
|
89
|
+
* else no modelCtor
|
90
|
+
* G-->>G: return undefined
|
91
|
+
* end
|
92
|
+
* end
|
22
93
|
*/
|
23
|
-
get<T>(name: symbol | Constructor<T
|
94
|
+
get<T>(name: symbol | Constructor<T> | string, flavour?: string): T | undefined;
|
24
95
|
}
|
package/lib/repository/utils.cjs
CHANGED
@@ -9,13 +9,35 @@ const decorator_validation_2 = require("@decaf-ts/decorator-validation");
|
|
9
9
|
const Repository_1 = require("./Repository.cjs");
|
10
10
|
/**
|
11
11
|
* @description Generates a unique injectable name for a repository.
|
12
|
-
* @summary Creates a standardized
|
13
|
-
*
|
14
|
-
* @
|
15
|
-
* @param {
|
16
|
-
* @
|
17
|
-
* @
|
12
|
+
* @summary Creates a standardized injectable token for repositories using the adapter flavour and model table name.
|
13
|
+
* This helps the DI system register and resolve repository instances consistently across adapters.
|
14
|
+
* @template T The model type that extends Model.
|
15
|
+
* @param {Constructor<T> | T} model The model constructor or instance from which to derive the table name.
|
16
|
+
* @param {string} [flavour] Optional adapter flavour/alias. If omitted, it is read from model metadata.
|
17
|
+
* @return {string} A namespaced injectable token for the repository (e.g., "db:repo:ram:users").
|
18
|
+
* @throws {InternalError} If the flavour cannot be determined from arguments or metadata.
|
18
19
|
* @function generateInjectableNameForRepository
|
20
|
+
* @mermaid
|
21
|
+
* sequenceDiagram
|
22
|
+
* participant C as Caller
|
23
|
+
* participant U as generateInjectableNameForRepository
|
24
|
+
* participant R as Reflect Metadata
|
25
|
+
* participant A as Adapter
|
26
|
+
* participant S as String Formatter
|
27
|
+
* C->>U: call(model, flavour?)
|
28
|
+
* alt flavour provided
|
29
|
+
* U-->>U: use provided flavour
|
30
|
+
* else flavour not provided
|
31
|
+
* U->>A: Adapter.key(ADAPTER)
|
32
|
+
* U->>R: getMetadata(key, model|model.ctor)
|
33
|
+
* alt metadata present
|
34
|
+
* R-->>U: flavour
|
35
|
+
* else missing
|
36
|
+
* U-->>C: throw InternalError
|
37
|
+
* end
|
38
|
+
* end
|
39
|
+
* U->>S: sf(INJECTABLE, flavour, Repository.table(model))
|
40
|
+
* S-->>C: token string
|
19
41
|
* @memberOf module:core
|
20
42
|
*/
|
21
43
|
function generateInjectableNameForRepository(model, flavour) {
|
@@ -27,4 +49,4 @@ function generateInjectableNameForRepository(model, flavour) {
|
|
27
49
|
}
|
28
50
|
return (0, decorator_validation_1.sf)(constants_1.PersistenceKeys.INJECTABLE, flavour, Repository_1.Repository.table(model));
|
29
51
|
}
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3NpdG9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXdDQSxrRkFnQkM7QUF4REQsMkRBQXdEO0FBQ3hELHlFQUFpRTtBQUNqRSwwREFBaUQ7QUFDakQsOERBQTJEO0FBQzNELHlFQUF1RDtBQUN2RCxpREFBMEM7QUFFMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBQ0gsU0FBZ0IsbUNBQW1DLENBQ2pELEtBQXlCLEVBQ3pCLE9BQWdCO0lBRWhCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE1BQU0sR0FBRyxHQUFHLGlCQUFPLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQzNCLEdBQUcsRUFDSCxLQUFLLFlBQVksNEJBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUNuRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU87WUFDVixNQUFNLElBQUksNkJBQWEsQ0FDckIseUNBQXlDLEtBQUssWUFBWSw0QkFBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUN4RyxDQUFDO0lBQ04sQ0FBQztJQUNELE9BQU8sSUFBQSx5QkFBRSxFQUFDLDJCQUFlLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSx1QkFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3Rvciwgc2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuL1JlcG9zaXRvcnlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgdW5pcXVlIGluamVjdGFibGUgbmFtZSBmb3IgYSByZXBvc2l0b3J5LlxuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBpbmplY3RhYmxlIHRva2VuIGZvciByZXBvc2l0b3JpZXMgdXNpbmcgdGhlIGFkYXB0ZXIgZmxhdm91ciBhbmQgbW9kZWwgdGFibGUgbmFtZS5cbiAqIFRoaXMgaGVscHMgdGhlIERJIHN5c3RlbSByZWdpc3RlciBhbmQgcmVzb2x2ZSByZXBvc2l0b3J5IGluc3RhbmNlcyBjb25zaXN0ZW50bHkgYWNyb3NzIGFkYXB0ZXJzLlxuICogQHRlbXBsYXRlIFQgVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxUPiB8IFR9IG1vZGVsIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZSBmcm9tIHdoaWNoIHRvIGRlcml2ZSB0aGUgdGFibGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gT3B0aW9uYWwgYWRhcHRlciBmbGF2b3VyL2FsaWFzLiBJZiBvbWl0dGVkLCBpdCBpcyByZWFkIGZyb20gbW9kZWwgbWV0YWRhdGEuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEEgbmFtZXNwYWNlZCBpbmplY3RhYmxlIHRva2VuIGZvciB0aGUgcmVwb3NpdG9yeSAoZS5nLiwgXCJkYjpyZXBvOnJhbTp1c2Vyc1wiKS5cbiAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBmbGF2b3VyIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGZyb20gYXJndW1lbnRzIG9yIG1ldGFkYXRhLlxuICogQGZ1bmN0aW9uIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5XG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgZ2VuZXJhdGVJbmplY3RhYmxlTmFtZUZvclJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgUiBhcyBSZWZsZWN0IE1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IEEgYXMgQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBTIGFzIFN0cmluZyBGb3JtYXR0ZXJcbiAqICAgQy0+PlU6IGNhbGwobW9kZWwsIGZsYXZvdXI/KVxuICogICBhbHQgZmxhdm91ciBwcm92aWRlZFxuICogICAgIFUtLT4+VTogdXNlIHByb3ZpZGVkIGZsYXZvdXJcbiAqICAgZWxzZSBmbGF2b3VyIG5vdCBwcm92aWRlZFxuICogICAgIFUtPj5BOiBBZGFwdGVyLmtleShBREFQVEVSKVxuICogICAgIFUtPj5SOiBnZXRNZXRhZGF0YShrZXksIG1vZGVsfG1vZGVsLmN0b3IpXG4gKiAgICAgYWx0IG1ldGFkYXRhIHByZXNlbnRcbiAqICAgICAgIFItLT4+VTogZmxhdm91clxuICogICAgIGVsc2UgbWlzc2luZ1xuICogICAgICAgVS0tPj5DOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICogICBVLT4+Uzogc2YoSU5KRUNUQUJMRSwgZmxhdm91ciwgUmVwb3NpdG9yeS50YWJsZShtb2RlbCkpXG4gKiAgIFMtLT4+QzogdG9rZW4gc3RyaW5nXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSW5qZWN0YWJsZU5hbWVGb3JSZXBvc2l0b3J5PFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxUPiB8IFQsXG4gIGZsYXZvdXI/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGlmICghZmxhdm91cikge1xuICAgIGNvbnN0IGtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKTtcbiAgICBmbGF2b3VyID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIGtleSxcbiAgICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IG1vZGVsXG4gICAgKTtcbiAgICBpZiAoIWZsYXZvdXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCByZXRyaWV2ZSBmbGF2b3VyIGZyb20gbW9kZWwgJHttb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwuY29uc3RydWN0b3IubmFtZSA6IG1vZGVsLm5hbWV9YFxuICAgICAgKTtcbiAgfVxuICByZXR1cm4gc2YoUGVyc2lzdGVuY2VLZXlzLklOSkVDVEFCTEUsIGZsYXZvdXIsIFJlcG9zaXRvcnkudGFibGUobW9kZWwpKTtcbn1cbiJdfQ==
|
@@ -2,13 +2,35 @@ import { Constructor } from "@decaf-ts/decorator-validation";
|
|
2
2
|
import { Model } from "@decaf-ts/decorator-validation";
|
3
3
|
/**
|
4
4
|
* @description Generates a unique injectable name for a repository.
|
5
|
-
* @summary Creates a standardized
|
6
|
-
*
|
7
|
-
* @
|
8
|
-
* @param {
|
9
|
-
* @
|
10
|
-
* @
|
5
|
+
* @summary Creates a standardized injectable token for repositories using the adapter flavour and model table name.
|
6
|
+
* This helps the DI system register and resolve repository instances consistently across adapters.
|
7
|
+
* @template T The model type that extends Model.
|
8
|
+
* @param {Constructor<T> | T} model The model constructor or instance from which to derive the table name.
|
9
|
+
* @param {string} [flavour] Optional adapter flavour/alias. If omitted, it is read from model metadata.
|
10
|
+
* @return {string} A namespaced injectable token for the repository (e.g., "db:repo:ram:users").
|
11
|
+
* @throws {InternalError} If the flavour cannot be determined from arguments or metadata.
|
11
12
|
* @function generateInjectableNameForRepository
|
13
|
+
* @mermaid
|
14
|
+
* sequenceDiagram
|
15
|
+
* participant C as Caller
|
16
|
+
* participant U as generateInjectableNameForRepository
|
17
|
+
* participant R as Reflect Metadata
|
18
|
+
* participant A as Adapter
|
19
|
+
* participant S as String Formatter
|
20
|
+
* C->>U: call(model, flavour?)
|
21
|
+
* alt flavour provided
|
22
|
+
* U-->>U: use provided flavour
|
23
|
+
* else flavour not provided
|
24
|
+
* U->>A: Adapter.key(ADAPTER)
|
25
|
+
* U->>R: getMetadata(key, model|model.ctor)
|
26
|
+
* alt metadata present
|
27
|
+
* R-->>U: flavour
|
28
|
+
* else missing
|
29
|
+
* U-->>C: throw InternalError
|
30
|
+
* end
|
31
|
+
* end
|
32
|
+
* U->>S: sf(INJECTABLE, flavour, Repository.table(model))
|
33
|
+
* S-->>C: token string
|
12
34
|
* @memberOf module:core
|
13
35
|
*/
|
14
36
|
export declare function generateInjectableNameForRepository<T extends Model>(model: Constructor<T> | T, flavour?: string): string;
|