@decaf-ts/for-nest 0.0.2 → 0.0.4

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 (47) hide show
  1. package/dist/for-nest.cjs +549 -15
  2. package/dist/for-nest.esm.cjs +549 -14
  3. package/lib/RepoFactory.cjs +27 -0
  4. package/lib/RepoFactory.d.ts +6 -0
  5. package/lib/core-module.cjs +27 -7
  6. package/lib/core-module.d.ts +7 -2
  7. package/lib/decoration.cjs +123 -0
  8. package/lib/decoration.d.ts +1 -0
  9. package/lib/decorators/ApiProperty.cjs +63 -0
  10. package/lib/decorators/ApiProperty.d.ts +27 -0
  11. package/lib/decorators/helpers.cjs +140 -0
  12. package/lib/decorators/helpers.d.ts +8 -0
  13. package/lib/decorators/index.cjs +19 -0
  14. package/lib/decorators/index.d.ts +2 -0
  15. package/lib/esm/RepoFactory.d.ts +6 -0
  16. package/lib/esm/RepoFactory.js +24 -0
  17. package/lib/esm/core-module.d.ts +7 -2
  18. package/lib/esm/core-module.js +27 -7
  19. package/lib/esm/decoration.d.ts +1 -0
  20. package/lib/esm/decoration.js +121 -0
  21. package/lib/esm/decorators/ApiProperty.d.ts +27 -0
  22. package/lib/esm/decorators/ApiProperty.js +57 -0
  23. package/lib/esm/decorators/helpers.d.ts +8 -0
  24. package/lib/esm/decorators/helpers.js +132 -0
  25. package/lib/esm/decorators/index.d.ts +2 -0
  26. package/lib/esm/decorators/index.js +3 -0
  27. package/lib/esm/index.d.ts +7 -2
  28. package/lib/esm/index.js +8 -3
  29. package/lib/esm/model-module.d.ts +8 -0
  30. package/lib/esm/model-module.js +199 -0
  31. package/lib/esm/module.d.ts +1 -1
  32. package/lib/esm/module.js +11 -3
  33. package/lib/esm/types.d.ts +1 -0
  34. package/lib/esm/types.js +1 -1
  35. package/lib/esm/utils.d.ts +2 -0
  36. package/lib/esm/utils.js +11 -0
  37. package/lib/index.cjs +8 -3
  38. package/lib/index.d.ts +7 -2
  39. package/lib/model-module.cjs +202 -0
  40. package/lib/model-module.d.ts +8 -0
  41. package/lib/module.cjs +11 -3
  42. package/lib/module.d.ts +1 -1
  43. package/lib/types.cjs +1 -1
  44. package/lib/types.d.ts +1 -0
  45. package/lib/utils.cjs +14 -0
  46. package/lib/utils.d.ts +2 -0
  47. package/package.json +4 -2
@@ -0,0 +1,199 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ var DecafModelModule_1;
14
+ import { Body, Controller, Delete, Get, Module, Param, Post, Put, } from "@nestjs/common";
15
+ import { ApiBadRequestResponse, ApiBody, ApiCreatedResponse, ApiExtraModels, ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiParam, ApiTags, ApiUnprocessableEntityResponse, getSchemaPath, } from "@nestjs/swagger";
16
+ import { Adapter, Repository } from "@decaf-ts/core";
17
+ import { Model } from "@decaf-ts/decorator-validation";
18
+ import { LoggedClass, Logging, toKebabCase } from "@decaf-ts/logging";
19
+ import { RepoFactory } from "./RepoFactory.js";
20
+ let DecafModelModule = class DecafModelModule {
21
+ static { DecafModelModule_1 = this; }
22
+ static get log() {
23
+ if (!this._logger)
24
+ this._logger = Logging.for(DecafModelModule_1);
25
+ return this._logger;
26
+ }
27
+ static toModelController(ModelClazz) {
28
+ const log = this.log.for(this.toModelController);
29
+ const tableName = Repository.table(ModelClazz);
30
+ const routePath = toKebabCase(tableName);
31
+ const modelClazzName = ModelClazz.name;
32
+ log.debug(`Creating controller for model: ${modelClazzName}`);
33
+ let DynamicModelController = class DynamicModelController extends LoggedClass {
34
+ constructor(repoFactory) {
35
+ super();
36
+ this.repoFactory = repoFactory;
37
+ log.info(`Registering dynamic controller for model: ${modelClazzName} route: /${routePath}`);
38
+ try {
39
+ this.repo = this.repoFactory.for(ModelClazz.name);
40
+ this.pk = this.repo.pk;
41
+ }
42
+ catch (e) {
43
+ this.log.error(`Failed to initialize repository for model "${ModelClazz.name}".`, e);
44
+ }
45
+ }
46
+ async create(data) {
47
+ const log = this.log.for(this.create);
48
+ log.verbose(`creating new ${modelClazzName}`);
49
+ let created;
50
+ try {
51
+ created = await this.repo.create(data);
52
+ }
53
+ catch (e) {
54
+ log.error(`Failed to create new ${modelClazzName}`, e);
55
+ throw e;
56
+ }
57
+ log.info(`created new ${modelClazzName} with id ${created[this.pk]}`);
58
+ return created;
59
+ }
60
+ async read(id) {
61
+ const log = this.log.for(this.read);
62
+ let read;
63
+ try {
64
+ log.debug(`reading ${modelClazzName} with ${this.pk} ${id}`);
65
+ read = await this.repo.read(id);
66
+ }
67
+ catch (e) {
68
+ log.error(`Failed to read ${modelClazzName} with id ${id}`, e);
69
+ throw e;
70
+ }
71
+ log.info(`read ${modelClazzName} with id ${read[this.pk]}`);
72
+ return read;
73
+ }
74
+ async update(data) {
75
+ const log = this.log.for(this.update);
76
+ let updated;
77
+ try {
78
+ log.info(`updating ${modelClazzName} with ${this.pk} ${data[this.pk]}`);
79
+ updated = await this.repo.create(data);
80
+ }
81
+ catch (e) {
82
+ throw e;
83
+ }
84
+ return updated;
85
+ }
86
+ async delete(id) {
87
+ const log = this.log.for(this.delete);
88
+ let read;
89
+ try {
90
+ log.debug(`deleting ${modelClazzName} with ${this.pk} ${id}`);
91
+ read = await this.repo.read(id);
92
+ }
93
+ catch (e) {
94
+ log.error(`Failed to delete ${modelClazzName} with id ${id}`, e);
95
+ throw e;
96
+ }
97
+ log.info(`deleted ${modelClazzName} with id ${read[this.pk]}`);
98
+ return read;
99
+ }
100
+ };
101
+ __decorate([
102
+ Post(),
103
+ ApiOperation({ summary: `Create a new ${modelClazzName}.` }),
104
+ ApiBody({
105
+ description: `Payload for ${modelClazzName}`,
106
+ schema: { $ref: getSchemaPath(ModelClazz) },
107
+ }),
108
+ ApiCreatedResponse({
109
+ description: `${modelClazzName} created successfully.`,
110
+ }),
111
+ ApiBadRequestResponse({ description: "Payload validation failed." }),
112
+ ApiUnprocessableEntityResponse({
113
+ description: "Repository rejected the provided payload.",
114
+ }),
115
+ __param(0, Body()),
116
+ __metadata("design:type", Function),
117
+ __metadata("design:paramtypes", [Object]),
118
+ __metadata("design:returntype", Promise)
119
+ ], DynamicModelController.prototype, "create", null);
120
+ __decorate([
121
+ Get(":id"),
122
+ ApiOperation({ summary: `Retrieve a ${modelClazzName} record by id.` }),
123
+ ApiParam({ name: "id", description: "Primary key" }),
124
+ ApiOkResponse({
125
+ description: `${modelClazzName} retrieved successfully.`,
126
+ }),
127
+ ApiNotFoundResponse({
128
+ description: `No ${modelClazzName} record matches the provided identifier.`,
129
+ }),
130
+ __param(0, Param("id")),
131
+ __metadata("design:type", Function),
132
+ __metadata("design:paramtypes", [String]),
133
+ __metadata("design:returntype", Promise)
134
+ ], DynamicModelController.prototype, "read", null);
135
+ __decorate([
136
+ Put(":id"),
137
+ ApiOperation({
138
+ summary: `Replace an existing ${modelClazzName} record with a new payload.`,
139
+ }),
140
+ ApiBody({
141
+ description: `Payload for replace a existing record of ${modelClazzName}`,
142
+ schema: { $ref: getSchemaPath(ModelClazz) },
143
+ }),
144
+ ApiOkResponse({
145
+ description: `${ModelClazz} record replaced successfully.`,
146
+ }),
147
+ ApiNotFoundResponse({
148
+ description: `No ${modelClazzName} record matches the provided identifier.`,
149
+ }),
150
+ ApiBadRequestResponse({ description: "Payload validation failed." }),
151
+ __param(0, Body()),
152
+ __metadata("design:type", Function),
153
+ __metadata("design:paramtypes", [Model]),
154
+ __metadata("design:returntype", Promise)
155
+ ], DynamicModelController.prototype, "update", null);
156
+ __decorate([
157
+ Delete(":id"),
158
+ ApiOperation({ summary: `Delete a ${modelClazzName} record by id.` }),
159
+ ApiParam({
160
+ name: "id",
161
+ description: `Primary key value of the ${modelClazzName} record to delete.`,
162
+ }),
163
+ ApiOkResponse({
164
+ description: `${modelClazzName} record deleted successfully.`,
165
+ }),
166
+ ApiNotFoundResponse({
167
+ description: `No ${modelClazzName} record matches the provided identifier.`,
168
+ }),
169
+ __param(0, Param("id")),
170
+ __metadata("design:type", Function),
171
+ __metadata("design:paramtypes", [String]),
172
+ __metadata("design:returntype", Promise)
173
+ ], DynamicModelController.prototype, "delete", null);
174
+ DynamicModelController = __decorate([
175
+ Controller(routePath),
176
+ ApiTags(modelClazzName),
177
+ ApiExtraModels(ModelClazz),
178
+ __metadata("design:paramtypes", [RepoFactory])
179
+ ], DynamicModelController);
180
+ return DynamicModelController;
181
+ }
182
+ static forRoot(flavour) {
183
+ const log = this.log.for(this.forRoot);
184
+ log.info(`Generating controllers for flavour...`);
185
+ const trackedModels = Adapter.models(flavour);
186
+ const controllers = trackedModels.map(this.toModelController.bind(this));
187
+ log.info(`Generated ${controllers.length} controllers`);
188
+ return {
189
+ module: DecafModelModule_1,
190
+ controllers,
191
+ providers: [RepoFactory],
192
+ };
193
+ }
194
+ };
195
+ DecafModelModule = DecafModelModule_1 = __decorate([
196
+ Module({})
197
+ ], DecafModelModule);
198
+ export { DecafModelModule };
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtbW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsLW1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUNMLElBQUksRUFDSixVQUFVLEVBQ1YsTUFBTSxFQUVOLEdBQUcsRUFDSCxNQUFNLEVBQ04sS0FBSyxFQUNMLElBQUksRUFDSixHQUFHLEdBQ0osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCxrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsWUFBWSxFQUNaLFFBQVEsRUFDUixPQUFPLEVBQ1AsOEJBQThCLEVBQzlCLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxPQUFPLEVBQVEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssRUFBb0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsV0FBVyxFQUFVLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsV0FBVyxFQUFFLHlCQUFzQjtBQUdyQyxJQUFNLGdCQUFnQixHQUF0QixNQUFNLGdCQUFnQjs7SUFHakIsTUFBTSxLQUFLLEdBQUc7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFnQixDQUFDLENBQUM7UUFDaEUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFYyxBQUFQLE1BQU0sQ0FBQyxpQkFBaUIsQ0FDOUIsVUFBaUM7UUFFakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7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dkMsR0FBRyxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBRWxELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFekUsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLFdBQVcsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxDQUFDO1FBRXhELE9BQU87WUFDTCxNQUFNLEVBQUUsa0JBQWdCO1lBQ3hCLFdBQVc7WUFDWCxTQUFTLEVBQUUsQ0FBQyxXQUFXLENBQUM7U0FDekIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFBO0FBaExZLGdCQUFnQjtJQUQ1QixNQUFNLENBQUMsRUFBRSxDQUFDO0dBQ0UsZ0JBQWdCLENBZ0w1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJvZHksXG4gIENvbnRyb2xsZXIsXG4gIERlbGV0ZSxcbiAgRHluYW1pY01vZHVsZSxcbiAgR2V0LFxuICBNb2R1bGUsXG4gIFBhcmFtLFxuICBQb3N0LFxuICBQdXQsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlLFxuICBBcGlCb2R5LFxuICBBcGlDcmVhdGVkUmVzcG9uc2UsXG4gIEFwaUV4dHJhTW9kZWxzLFxuICBBcGlOb3RGb3VuZFJlc3BvbnNlLFxuICBBcGlPa1Jlc3BvbnNlLFxuICBBcGlPcGVyYXRpb24sXG4gIEFwaVBhcmFtLFxuICBBcGlUYWdzLFxuICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UsXG4gIGdldFNjaGVtYVBhdGgsXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MsIExvZ2dlciwgTG9nZ2luZywgdG9LZWJhYkNhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFJlcG9GYWN0b3J5IH0gZnJvbSBcIi4vUmVwb0ZhY3RvcnlcIjtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZk1vZGVsTW9kdWxlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5fbG9nZ2VyKSB0aGlzLl9sb2dnZXIgPSBMb2dnaW5nLmZvcihEZWNhZk1vZGVsTW9kdWxlKTtcbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdG9Nb2RlbENvbnRyb2xsZXI8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ2xheno6IE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICApIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50b01vZGVsQ29udHJvbGxlcik7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShNb2RlbENsYXp6KTtcbiAgICBjb25zdCByb3V0ZVBhdGggPSB0b0tlYmFiQ2FzZSh0YWJsZU5hbWUpO1xuICAgIGNvbnN0IG1vZGVsQ2xhenpOYW1lID0gTW9kZWxDbGF6ei5uYW1lO1xuXG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBjb250cm9sbGVyIGZvciBtb2RlbDogJHttb2RlbENsYXp6TmFtZX1gKTtcblxuICAgIEBDb250cm9sbGVyKHJvdXRlUGF0aClcbiAgICBAQXBpVGFncyhtb2RlbENsYXp6TmFtZSlcbiAgICBAQXBpRXh0cmFNb2RlbHMoTW9kZWxDbGF6eilcbiAgICBjbGFzcyBEeW5hbWljTW9kZWxDb250cm9sbGVyIGV4dGVuZHMgTG9nZ2VkQ2xhc3Mge1xuICAgICAgLy8gcHJpdmF0ZSByZWFkb25seSByZXBvID0gdGhpcy5yZXBvRmFjdG9yeS5mb3IoTW9kZWxDbGF6eik7XG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHBrITogc3RyaW5nO1xuICAgICAgcHJpdmF0ZSByZWFkb25seSByZXBvITogUmVwbzxUPjsgLy9SZXBvc2l0b3J5PE1vZGVsPGFueT4sIGFueSwgYW55LCBhbnksIGFueT47XG5cbiAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVwb0ZhY3Rvcnk6IFJlcG9GYWN0b3J5KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBSZWdpc3RlcmluZyBkeW5hbWljIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke21vZGVsQ2xhenpOYW1lfSByb3V0ZTogLyR7cm91dGVQYXRofWBcbiAgICAgICAgKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucmVwbyA9IHRoaXMucmVwb0ZhY3RvcnkuZm9yKE1vZGVsQ2xhenoubmFtZSk7XG4gICAgICAgICAgdGhpcy5wayA9IHRoaXMucmVwby5wayBhcyBzdHJpbmc7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBpbml0aWFsaXplIHJlcG9zaXRvcnkgZm9yIG1vZGVsIFwiJHtNb2RlbENsYXp6Lm5hbWV9XCIuYCxcbiAgICAgICAgICAgIGVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIEBQb3N0KClcbiAgICAgIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSlcbiAgICAgIEBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ2xhenopIH0sXG4gICAgICB9KVxuICAgICAgQEFwaUNyZWF0ZWRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgIH0pXG4gICAgICBAQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KVxuICAgICAgQEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJlcG9zaXRvcnkgcmVqZWN0ZWQgdGhlIHByb3ZpZGVkIHBheWxvYWQuXCIsXG4gICAgICB9KVxuICAgICAgYXN5bmMgY3JlYXRlKEBCb2R5KCkgZGF0YTogVCk6IFByb21pc2U8TW9kZWw8YW55Pj4ge1xuICAgICAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jcmVhdGUpO1xuICAgICAgICBsb2cudmVyYm9zZShgY3JlYXRpbmcgbmV3ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICAgIGxldCBjcmVhdGVkOiBNb2RlbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjcmVhdGVkID0gYXdhaXQgdGhpcy5yZXBvLmNyZWF0ZShkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGxvZy5pbmZvKGBjcmVhdGVkIG5ldyAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7Y3JlYXRlZFt0aGlzLnBrXX1gKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgICB9XG5cbiAgICAgIEBHZXQoXCI6aWRcIilcbiAgICAgIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KVxuICAgICAgQEFwaVBhcmFtKHsgbmFtZTogXCJpZFwiLCBkZXNjcmlwdGlvbjogXCJQcmltYXJ5IGtleVwiIH0pXG4gICAgICBAQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSlcbiAgICAgIGFzeW5jIHJlYWQoQFBhcmFtKFwiaWRcIikgaWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZWFkKTtcbiAgICAgICAgbGV0IHJlYWQ6IE1vZGVsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgcmVhZGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wa30gJHtpZH1gKTtcbiAgICAgICAgICByZWFkID0gYXdhaXQgdGhpcy5yZXBvLnJlYWQoaWQpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZWFkICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtpZH1gLFxuICAgICAgICAgICAgZSBhcyBFcnJvclxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZy5pbmZvKGByZWFkICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtyZWFkW3RoaXMucGtdfWApO1xuICAgICAgICByZXR1cm4gcmVhZDtcbiAgICAgIH1cblxuICAgICAgQFB1dChcIjppZFwiKVxuICAgICAgQEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBSZXBsYWNlIGFuIGV4aXN0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCB3aXRoIGEgbmV3IHBheWxvYWQuYCxcbiAgICAgIH0pXG4gICAgICBAQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgcmVwbGFjZSBhIGV4aXN0aW5nIHJlY29yZCBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ2xhenopIH0sXG4gICAgICB9KVxuICAgICAgQEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7TW9kZWxDbGF6en0gcmVjb3JkIHJlcGxhY2VkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pXG4gICAgICBhc3luYyB1cGRhdGUoQEJvZHkoKSBkYXRhOiBNb2RlbDxhbnk+KSB7XG4gICAgICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnVwZGF0ZSk7XG4gICAgICAgIGxldCB1cGRhdGVkOiBNb2RlbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICAgIGB1cGRhdGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wa30gJHtkYXRhW3RoaXMucGtdfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnJlcG8uY3JlYXRlKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICAgIH1cblxuICAgICAgQERlbGV0ZShcIjppZFwiKVxuICAgICAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KVxuICAgICAgQEFwaVBhcmFtKHtcbiAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFByaW1hcnkga2V5IHZhbHVlIG9mIHRoZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgdG8gZGVsZXRlLmAsXG4gICAgICB9KVxuICAgICAgQEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBkZWxldGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSlcbiAgICAgIGFzeW5jIGRlbGV0ZShAUGFyYW0oXCJpZFwiKSBpZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmRlbGV0ZSk7XG4gICAgICAgIGxldCByZWFkOiBNb2RlbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgICBgZGVsZXRpbmcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCAke3RoaXMucGsgYXMgc3RyaW5nfSAke2lkfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlYWQgPSBhd2FpdCB0aGlzLnJlcG8ucmVhZChpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGRlbGV0ZSAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YCxcbiAgICAgICAgICAgIGUgYXMgRXJyb3JcbiAgICAgICAgICApO1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLmluZm8oYGRlbGV0ZWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke3JlYWRbdGhpcy5wa119YCk7XG4gICAgICAgIHJldHVybiByZWFkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBEeW5hbWljTW9kZWxDb250cm9sbGVyO1xuICB9XG5cbiAgc3RhdGljIGZvclJvb3QoZmxhdm91cjogc3RyaW5nKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZm9yUm9vdCk7XG4gICAgbG9nLmluZm8oYEdlbmVyYXRpbmcgY29udHJvbGxlcnMgZm9yIGZsYXZvdXIuLi5gKTtcblxuICAgIGNvbnN0IHRyYWNrZWRNb2RlbHMgPSBBZGFwdGVyLm1vZGVscyhmbGF2b3VyKTtcbiAgICBjb25zdCBjb250cm9sbGVycyA9IHRyYWNrZWRNb2RlbHMubWFwKHRoaXMudG9Nb2RlbENvbnRyb2xsZXIuYmluZCh0aGlzKSk7XG5cbiAgICBsb2cuaW5mbyhgR2VuZXJhdGVkICR7Y29udHJvbGxlcnMubGVuZ3RofSBjb250cm9sbGVyc2ApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZNb2RlbE1vZHVsZSxcbiAgICAgIGNvbnRyb2xsZXJzLFxuICAgICAgcHJvdmlkZXJzOiBbUmVwb0ZhY3RvcnldLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -4,5 +4,5 @@ import { DecafModuleOptions } from "./types";
4
4
  * @publicApi
5
5
  */
6
6
  export declare class DecafModule {
7
- static forRoot(options: DecafModuleOptions): DynamicModule;
7
+ static forRootAsync(options: DecafModuleOptions): Promise<DynamicModule>;
8
8
  }
package/lib/esm/module.js CHANGED
@@ -7,14 +7,22 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var DecafModule_1;
8
8
  import { Module } from "@nestjs/common";
9
9
  import { DecafCoreModule } from "./core-module.js";
10
+ import { DecafModelModule } from "./model-module.js";
10
11
  /**
11
12
  * @publicApi
12
13
  */
13
14
  let DecafModule = DecafModule_1 = class DecafModule {
14
- static forRoot(options) {
15
+ static async forRootAsync(options) {
16
+ const { autoControllers } = options;
17
+ const adapter = await DecafCoreModule.createAdapter(options);
18
+ const flavour = adapter.flavour;
19
+ const imports = [DecafCoreModule.forRoot(options)];
20
+ if (autoControllers) {
21
+ imports.push(DecafModelModule.forRoot(flavour));
22
+ }
15
23
  return {
16
24
  module: DecafModule_1,
17
- imports: [DecafCoreModule.forRoot(options)],
25
+ imports: imports,
18
26
  };
19
27
  }
20
28
  };
@@ -22,4 +30,4 @@ DecafModule = DecafModule_1 = __decorate([
22
30
  Module({})
23
31
  ], DecafModule);
24
32
  export { DecafModule };
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsT0FBTyxFQUFpQixNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUFzQjtBQUVoRDs7R0FFRztBQUVJLElBQU0sV0FBVyxtQkFBakIsTUFBTSxXQUFXO0lBQ3RCLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBMkI7UUFDeEMsT0FBTztZQUNMLE1BQU0sRUFBRSxhQUFXO1lBQ25CLE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDNUMsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFBO0FBUFksV0FBVztJQUR2QixNQUFNLENBQUMsRUFBRSxDQUFDO0dBQ0UsV0FBVyxDQU92QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmQ29yZU1vZHVsZSB9IGZyb20gXCIuL2NvcmUtbW9kdWxlXCI7XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3Qob3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zKTogRHluYW1pY01vZHVsZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZNb2R1bGUsXG4gICAgICBpbXBvcnRzOiBbRGVjYWZDb3JlTW9kdWxlLmZvclJvb3Qob3B0aW9ucyldLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsT0FBTyxFQUFtQyxNQUFNLEVBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUFzQjtBQUNoRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsMEJBQXVCO0FBRWxEOztHQUVHO0FBRUksSUFBTSxXQUFXLG1CQUFqQixNQUFNLFdBQVc7SUFDdEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQ3ZCLE9BQTJCO1FBRTNCLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFcEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxlQUFlLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFFaEMsTUFBTSxPQUFPLEdBT0csQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFbkQsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFFRCxPQUFPO1lBQ0wsTUFBTSxFQUFFLGFBQVc7WUFDbkIsT0FBTyxFQUFFLE9BQU87U0FDakIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFBO0FBM0JZLFdBQVc7SUFEdkIsTUFBTSxDQUFDLEVBQUUsQ0FBQztHQUNFLFdBQVcsQ0EyQnZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgRm9yd2FyZFJlZmVyZW5jZSwgTW9kdWxlLCBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZDb3JlTW9kdWxlIH0gZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmltcG9ydCB7IERlY2FmTW9kZWxNb2R1bGUgfSBmcm9tIFwiLi9tb2RlbC1tb2R1bGVcIjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZNb2R1bGUge1xuICBzdGF0aWMgYXN5bmMgZm9yUm9vdEFzeW5jKFxuICAgIG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uc1xuICApOiBQcm9taXNlPER5bmFtaWNNb2R1bGU+IHtcbiAgICBjb25zdCB7IGF1dG9Db250cm9sbGVycyB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGFkYXB0ZXIgPSBhd2FpdCBEZWNhZkNvcmVNb2R1bGUuY3JlYXRlQWRhcHRlcihvcHRpb25zKTtcbiAgICBjb25zdCBmbGF2b3VyID0gYWRhcHRlci5mbGF2b3VyO1xuXG4gICAgY29uc3QgaW1wb3J0czpcbiAgICAgIHwgKFxuICAgICAgICAgIHwgRHluYW1pY01vZHVsZVxuICAgICAgICAgIHwgVHlwZTxhbnk+XG4gICAgICAgICAgfCBQcm9taXNlPER5bmFtaWNNb2R1bGU+XG4gICAgICAgICAgfCBGb3J3YXJkUmVmZXJlbmNlPGFueT5cbiAgICAgICAgKVtdXG4gICAgICB8IHVuZGVmaW5lZCA9IFtEZWNhZkNvcmVNb2R1bGUuZm9yUm9vdChvcHRpb25zKV07XG5cbiAgICBpZiAoYXV0b0NvbnRyb2xsZXJzKSB7XG4gICAgICBpbXBvcnRzLnB1c2goRGVjYWZNb2RlbE1vZHVsZS5mb3JSb290KGZsYXZvdXIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZk1vZHVsZSxcbiAgICAgIGltcG9ydHM6IGltcG9ydHMsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -7,4 +7,5 @@ export type DecafModuleOptions<CONF = any, A extends Adapter<CONF, any, any, any
7
7
  adapter: Constructor<A>;
8
8
  conf: CONF;
9
9
  alias?: string;
10
+ autoControllers: boolean;
10
11
  };
package/lib/esm/types.js CHANGED
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgdHlwZSBEZWNhZk1vZHVsZU9wdGlvbnM8XG4gIENPTkYgPSBhbnksXG4gIEEgZXh0ZW5kcyBBZGFwdGVyPENPTkYsIGFueSwgYW55LCBhbnksIGFueT4gPSBBZGFwdGVyPENPTkYsIGFueSwgYW55Pixcbj4gPSB7XG4gIGFkYXB0ZXI6IENvbnN0cnVjdG9yPEE+O1xuICBjb25mOiBDT05GO1xuICBhbGlhcz86IHN0cmluZztcbn07XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgdHlwZSBEZWNhZk1vZHVsZU9wdGlvbnM8XG4gIENPTkYgPSBhbnksXG4gIEEgZXh0ZW5kcyBBZGFwdGVyPENPTkYsIGFueSwgYW55LCBhbnksIGFueT4gPSBBZGFwdGVyPENPTkYsIGFueSwgYW55Pixcbj4gPSB7XG4gIGFkYXB0ZXI6IENvbnN0cnVjdG9yPEE+O1xuICBjb25mOiBDT05GO1xuICBhbGlhcz86IHN0cmluZztcbiAgYXV0b0NvbnRyb2xsZXJzOiBib29sZWFuO1xufTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import { Model } from "@decaf-ts/decorator-validation";
2
+ export declare function repoForModel(model: string): import("@decaf-ts/core").Repo<Model<false>, any, any, any, any>;
@@ -0,0 +1,11 @@
1
+ import { Model } from "@decaf-ts/decorator-validation";
2
+ import { InternalError } from "@decaf-ts/db-decorators";
3
+ import { Repository } from "@decaf-ts/core";
4
+ export function repoForModel(model) {
5
+ const m = Model.get(model);
6
+ if (!m)
7
+ throw new InternalError(`Failed to find repository for ${model}`);
8
+ const repo = Repository.forModel(m);
9
+ return repo;
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUMsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFhO0lBQ3pDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsSUFBSSxDQUFDLENBQUM7UUFDTCxNQUFNLElBQUksYUFBYSxDQUFDLGlDQUFpQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ2xFLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsT0FBTyxJQUFJLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNb2RlbH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtJbnRlcm5hbEVycm9yfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7UmVwb3NpdG9yeX0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvRm9yTW9kZWwobW9kZWw6IHN0cmluZykge1xuXHRjb25zdCBtID0gTW9kZWwuZ2V0KG1vZGVsKTtcblx0aWYgKCFtKVxuXHRcdHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gZmluZCByZXBvc2l0b3J5IGZvciAke21vZGVsfWApXG5cdGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKG0pO1xuXHRyZXR1cm4gcmVwbztcbn0iXX0=
package/lib/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * @module ts-workspace
3
+ * @module for-nest
4
4
  * @description This module serves as the main entry point for the ts-workspace library. It aggregates and exports
5
5
  * functionality from various submodules and utilities within the project.
6
6
  *
@@ -37,16 +37,21 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
37
37
  Object.defineProperty(exports, "__esModule", { value: true });
38
38
  exports.PACKAGE_NAME = exports.VERSION = void 0;
39
39
  const decoration_1 = require("@decaf-ts/decoration");
40
+ require("./decoration.cjs");
41
+ __exportStar(require("./decorators/index.cjs"), exports);
40
42
  __exportStar(require("./constants.cjs"), exports);
43
+ __exportStar(require("./decoration.cjs"), exports);
41
44
  __exportStar(require("./module.cjs"), exports);
45
+ __exportStar(require("./RepoFactory.cjs"), exports);
42
46
  __exportStar(require("./types.cjs"), exports);
47
+ __exportStar(require("./utils.cjs"), exports);
43
48
  /**
44
49
  * Represents the current version of the ts-workspace module.
45
50
  * The actual version number is replaced during the build process.
46
51
  * @constant
47
52
  * @type {string}
48
53
  */
49
- exports.VERSION = "0.0.1";
54
+ exports.VERSION = "0.0.4";
50
55
  exports.PACKAGE_NAME = "##PACKAGE_NAME##";
51
56
  decoration_1.Metadata.registerLibrary(exports.PACKAGE_NAME, exports.VERSION);
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxxREFBZ0Q7QUFFaEQsa0RBQTRCO0FBQzVCLCtDQUF5QjtBQUN6Qiw4Q0FBd0I7QUFFeEI7Ozs7O0dBS0c7QUFDVSxRQUFBLE9BQU8sR0FBRyxhQUFhLENBQUM7QUFDeEIsUUFBQSxZQUFZLEdBQUcsa0JBQWtCLENBQUM7QUFFL0MscUJBQVEsQ0FBQyxlQUFlLENBQUMsb0JBQVksRUFBRSxlQUFPLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSB0cy13b3Jrc3BhY2VcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIG1vZHVsZSBzZXJ2ZXMgYXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSB0cy13b3Jrc3BhY2UgbGlicmFyeS4gSXQgYWdncmVnYXRlcyBhbmQgZXhwb3J0c1xuICogZnVuY3Rpb25hbGl0eSBmcm9tIHZhcmlvdXMgc3VibW9kdWxlcyBhbmQgdXRpbGl0aWVzIHdpdGhpbiB0aGUgcHJvamVjdC5cbiAqXG4gKiBUaGUgbW9kdWxlIGluY2x1ZGVzOlxuICogMS4gVXRpbGl0eSBmdW5jdGlvbnMgYW5kIHR5cGVzIGZyb20gdGhlIFwiLi91dGlsc1wiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhlc2UgbGlrZWx5IGNvbnRhaW4gaGVscGVyIGZ1bmN0aW9ucywgY29tbW9uIHR5cGVzLCBhbmQgc2hhcmVkIGZ1bmN0aW9uYWxpdHkgdXNlZCB0aHJvdWdob3V0IHRoZSBwcm9qZWN0LlxuICogICAgLSBNYXkgaW5jbHVkZSBvcGVyYXRpb25zIGZvciBkYXRhIG1hbmlwdWxhdGlvbiwgdHlwZSBjaGVja2luZywgb3Igb3RoZXIgZ2VuZXJhbC1wdXJwb3NlIHV0aWxpdGllcy5cbiAqXG4gKiAyLiBBIG5hbWVzcGFjZSBhbmQgcmVsYXRlZCB0eXBlcyBmcm9tIHRoZSBcIi4vbmFtZXNwYWNlXCIgZGlyZWN0b3J5OlxuICogICAgLSBUaGlzIGNvdWxkIGNvbnRhaW4gZG9tYWluLXNwZWNpZmljIGNvZGUgb3IgYSBjb2xsZWN0aW9uIG9mIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS5cbiAqICAgIC0gTWlnaHQgaW5jbHVkZSBpbnRlcmZhY2VzLCB0eXBlcywgb3IgY2xhc3NlcyB0aGF0IHJlcHJlc2VudCBjb3JlIGNvbmNlcHRzIGluIHRoZSBsaWJyYXJ5LlxuICpcbiAqIDMuIEEgVkVSU0lPTiBjb25zdGFudDpcbiAqICAgIC0gUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUuXG4gKiAgICAtIFVzZWZ1bCBmb3IgdmVyc2lvbiBjaGVja2luZyBhbmQgY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAqXG4gKiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyBhIGNsZWFuIGFuZCBvcmdhbml6ZWQgZXhwb3J0IG9mIHRoZSBtb2R1bGUncyBmdW5jdGlvbmFsaXR5LCBhbGxvd2luZyBjb25zdW1lcnNcbiAqIHRvIGVhc2lseSBpbXBvcnQgYW5kIHVzZSBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbGlicmFyeSBhcyBuZWVkZWQuXG4gKi9cblxuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSB0cy13b3Jrc3BhY2UgbW9kdWxlLlxuICogVGhlIGFjdHVhbCB2ZXJzaW9uIG51bWJlciBpcyByZXBsYWNlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuXG4gKiBAY29uc3RhbnRcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFX05BTUUjI1wiO1xuXG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbiJdfQ==
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxxREFBZ0Q7QUFDaEQsNEJBQXNCO0FBRXRCLHlEQUE2QjtBQUM3QixrREFBNEI7QUFDNUIsbURBQTZCO0FBQzdCLCtDQUF5QjtBQUN6QixvREFBOEI7QUFDOUIsOENBQXdCO0FBQ3hCLDhDQUF3QjtBQUV4Qjs7Ozs7R0FLRztBQUNVLFFBQUEsT0FBTyxHQUFHLGFBQWEsQ0FBQztBQUN4QixRQUFBLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztBQUUvQyxxQkFBUSxDQUFDLGVBQWUsQ0FBQyxvQkFBWSxFQUFFLGVBQU8sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGZvci1uZXN0XG4gKiBAZGVzY3JpcHRpb24gVGhpcyBtb2R1bGUgc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgdHMtd29ya3NwYWNlIGxpYnJhcnkuIEl0IGFnZ3JlZ2F0ZXMgYW5kIGV4cG9ydHNcbiAqIGZ1bmN0aW9uYWxpdHkgZnJvbSB2YXJpb3VzIHN1Ym1vZHVsZXMgYW5kIHV0aWxpdGllcyB3aXRoaW4gdGhlIHByb2plY3QuXG4gKlxuICogVGhlIG1vZHVsZSBpbmNsdWRlczpcbiAqIDEuIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCB0eXBlcyBmcm9tIHRoZSBcIi4vdXRpbHNcIiBkaXJlY3Rvcnk6XG4gKiAgICAtIFRoZXNlIGxpa2VseSBjb250YWluIGhlbHBlciBmdW5jdGlvbnMsIGNvbW1vbiB0eXBlcywgYW5kIHNoYXJlZCBmdW5jdGlvbmFsaXR5IHVzZWQgdGhyb3VnaG91dCB0aGUgcHJvamVjdC5cbiAqICAgIC0gTWF5IGluY2x1ZGUgb3BlcmF0aW9ucyBmb3IgZGF0YSBtYW5pcHVsYXRpb24sIHR5cGUgY2hlY2tpbmcsIG9yIG90aGVyIGdlbmVyYWwtcHVycG9zZSB1dGlsaXRpZXMuXG4gKlxuICogMi4gQSBuYW1lc3BhY2UgYW5kIHJlbGF0ZWQgdHlwZXMgZnJvbSB0aGUgXCIuL25hbWVzcGFjZVwiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhpcyBjb3VsZCBjb250YWluIGRvbWFpbi1zcGVjaWZpYyBjb2RlIG9yIGEgY29sbGVjdGlvbiBvZiByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuXG4gKiAgICAtIE1pZ2h0IGluY2x1ZGUgaW50ZXJmYWNlcywgdHlwZXMsIG9yIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgY29yZSBjb25jZXB0cyBpbiB0aGUgbGlicmFyeS5cbiAqXG4gKiAzLiBBIFZFUlNJT04gY29uc3RhbnQ6XG4gKiAgICAtIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLlxuICogICAgLSBVc2VmdWwgZm9yIHZlcnNpb24gY2hlY2tpbmcgYW5kIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gKlxuICogVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBjbGVhbiBhbmQgb3JnYW5pemVkIGV4cG9ydCBvZiB0aGUgbW9kdWxlJ3MgZnVuY3Rpb25hbGl0eSwgYWxsb3dpbmcgY29uc3VtZXJzXG4gKiB0byBlYXNpbHkgaW1wb3J0IGFuZCB1c2Ugc3BlY2lmaWMgcGFydHMgb2YgdGhlIGxpYnJhcnkgYXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgXCIuL2RlY29yYXRpb25cIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JlcG9GYWN0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRzLXdvcmtzcGFjZSBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAqIEBjb25zdGFudFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0VfTkFNRSMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl19
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @module ts-workspace
2
+ * @module for-nest
3
3
  * @description This module serves as the main entry point for the ts-workspace library. It aggregates and exports
4
4
  * functionality from various submodules and utilities within the project.
5
5
  *
@@ -19,14 +19,19 @@
19
19
  * This structure provides a clean and organized export of the module's functionality, allowing consumers
20
20
  * to easily import and use specific parts of the library as needed.
21
21
  */
22
+ import "./decoration";
23
+ export * from "./decorators";
22
24
  export * from "./constants";
25
+ export * from "./decoration";
23
26
  export * from "./module";
27
+ export * from "./RepoFactory";
24
28
  export * from "./types";
29
+ export * from "./utils";
25
30
  /**
26
31
  * Represents the current version of the ts-workspace module.
27
32
  * The actual version number is replaced during the build process.
28
33
  * @constant
29
34
  * @type {string}
30
35
  */
31
- export declare const VERSION = "0.0.1";
36
+ export declare const VERSION = "0.0.4";
32
37
  export declare const PACKAGE_NAME = "##PACKAGE_NAME##";
@@ -0,0 +1,202 @@
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
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var DecafModelModule_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.DecafModelModule = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const swagger_1 = require("@nestjs/swagger");
19
+ const core_1 = require("@decaf-ts/core");
20
+ const decorator_validation_1 = require("@decaf-ts/decorator-validation");
21
+ const logging_1 = require("@decaf-ts/logging");
22
+ const RepoFactory_1 = require("./RepoFactory.cjs");
23
+ let DecafModelModule = class DecafModelModule {
24
+ static { DecafModelModule_1 = this; }
25
+ static get log() {
26
+ if (!this._logger)
27
+ this._logger = logging_1.Logging.for(DecafModelModule_1);
28
+ return this._logger;
29
+ }
30
+ static toModelController(ModelClazz) {
31
+ const log = this.log.for(this.toModelController);
32
+ const tableName = core_1.Repository.table(ModelClazz);
33
+ const routePath = (0, logging_1.toKebabCase)(tableName);
34
+ const modelClazzName = ModelClazz.name;
35
+ log.debug(`Creating controller for model: ${modelClazzName}`);
36
+ let DynamicModelController = class DynamicModelController extends logging_1.LoggedClass {
37
+ constructor(repoFactory) {
38
+ super();
39
+ this.repoFactory = repoFactory;
40
+ log.info(`Registering dynamic controller for model: ${modelClazzName} route: /${routePath}`);
41
+ try {
42
+ this.repo = this.repoFactory.for(ModelClazz.name);
43
+ this.pk = this.repo.pk;
44
+ }
45
+ catch (e) {
46
+ this.log.error(`Failed to initialize repository for model "${ModelClazz.name}".`, e);
47
+ }
48
+ }
49
+ async create(data) {
50
+ const log = this.log.for(this.create);
51
+ log.verbose(`creating new ${modelClazzName}`);
52
+ let created;
53
+ try {
54
+ created = await this.repo.create(data);
55
+ }
56
+ catch (e) {
57
+ log.error(`Failed to create new ${modelClazzName}`, e);
58
+ throw e;
59
+ }
60
+ log.info(`created new ${modelClazzName} with id ${created[this.pk]}`);
61
+ return created;
62
+ }
63
+ async read(id) {
64
+ const log = this.log.for(this.read);
65
+ let read;
66
+ try {
67
+ log.debug(`reading ${modelClazzName} with ${this.pk} ${id}`);
68
+ read = await this.repo.read(id);
69
+ }
70
+ catch (e) {
71
+ log.error(`Failed to read ${modelClazzName} with id ${id}`, e);
72
+ throw e;
73
+ }
74
+ log.info(`read ${modelClazzName} with id ${read[this.pk]}`);
75
+ return read;
76
+ }
77
+ async update(data) {
78
+ const log = this.log.for(this.update);
79
+ let updated;
80
+ try {
81
+ log.info(`updating ${modelClazzName} with ${this.pk} ${data[this.pk]}`);
82
+ updated = await this.repo.create(data);
83
+ }
84
+ catch (e) {
85
+ throw e;
86
+ }
87
+ return updated;
88
+ }
89
+ async delete(id) {
90
+ const log = this.log.for(this.delete);
91
+ let read;
92
+ try {
93
+ log.debug(`deleting ${modelClazzName} with ${this.pk} ${id}`);
94
+ read = await this.repo.read(id);
95
+ }
96
+ catch (e) {
97
+ log.error(`Failed to delete ${modelClazzName} with id ${id}`, e);
98
+ throw e;
99
+ }
100
+ log.info(`deleted ${modelClazzName} with id ${read[this.pk]}`);
101
+ return read;
102
+ }
103
+ };
104
+ __decorate([
105
+ (0, common_1.Post)(),
106
+ (0, swagger_1.ApiOperation)({ summary: `Create a new ${modelClazzName}.` }),
107
+ (0, swagger_1.ApiBody)({
108
+ description: `Payload for ${modelClazzName}`,
109
+ schema: { $ref: (0, swagger_1.getSchemaPath)(ModelClazz) },
110
+ }),
111
+ (0, swagger_1.ApiCreatedResponse)({
112
+ description: `${modelClazzName} created successfully.`,
113
+ }),
114
+ (0, swagger_1.ApiBadRequestResponse)({ description: "Payload validation failed." }),
115
+ (0, swagger_1.ApiUnprocessableEntityResponse)({
116
+ description: "Repository rejected the provided payload.",
117
+ }),
118
+ __param(0, (0, common_1.Body)()),
119
+ __metadata("design:type", Function),
120
+ __metadata("design:paramtypes", [Object]),
121
+ __metadata("design:returntype", Promise)
122
+ ], DynamicModelController.prototype, "create", null);
123
+ __decorate([
124
+ (0, common_1.Get)(":id"),
125
+ (0, swagger_1.ApiOperation)({ summary: `Retrieve a ${modelClazzName} record by id.` }),
126
+ (0, swagger_1.ApiParam)({ name: "id", description: "Primary key" }),
127
+ (0, swagger_1.ApiOkResponse)({
128
+ description: `${modelClazzName} retrieved successfully.`,
129
+ }),
130
+ (0, swagger_1.ApiNotFoundResponse)({
131
+ description: `No ${modelClazzName} record matches the provided identifier.`,
132
+ }),
133
+ __param(0, (0, common_1.Param)("id")),
134
+ __metadata("design:type", Function),
135
+ __metadata("design:paramtypes", [String]),
136
+ __metadata("design:returntype", Promise)
137
+ ], DynamicModelController.prototype, "read", null);
138
+ __decorate([
139
+ (0, common_1.Put)(":id"),
140
+ (0, swagger_1.ApiOperation)({
141
+ summary: `Replace an existing ${modelClazzName} record with a new payload.`,
142
+ }),
143
+ (0, swagger_1.ApiBody)({
144
+ description: `Payload for replace a existing record of ${modelClazzName}`,
145
+ schema: { $ref: (0, swagger_1.getSchemaPath)(ModelClazz) },
146
+ }),
147
+ (0, swagger_1.ApiOkResponse)({
148
+ description: `${ModelClazz} record replaced successfully.`,
149
+ }),
150
+ (0, swagger_1.ApiNotFoundResponse)({
151
+ description: `No ${modelClazzName} record matches the provided identifier.`,
152
+ }),
153
+ (0, swagger_1.ApiBadRequestResponse)({ description: "Payload validation failed." }),
154
+ __param(0, (0, common_1.Body)()),
155
+ __metadata("design:type", Function),
156
+ __metadata("design:paramtypes", [decorator_validation_1.Model]),
157
+ __metadata("design:returntype", Promise)
158
+ ], DynamicModelController.prototype, "update", null);
159
+ __decorate([
160
+ (0, common_1.Delete)(":id"),
161
+ (0, swagger_1.ApiOperation)({ summary: `Delete a ${modelClazzName} record by id.` }),
162
+ (0, swagger_1.ApiParam)({
163
+ name: "id",
164
+ description: `Primary key value of the ${modelClazzName} record to delete.`,
165
+ }),
166
+ (0, swagger_1.ApiOkResponse)({
167
+ description: `${modelClazzName} record deleted successfully.`,
168
+ }),
169
+ (0, swagger_1.ApiNotFoundResponse)({
170
+ description: `No ${modelClazzName} record matches the provided identifier.`,
171
+ }),
172
+ __param(0, (0, common_1.Param)("id")),
173
+ __metadata("design:type", Function),
174
+ __metadata("design:paramtypes", [String]),
175
+ __metadata("design:returntype", Promise)
176
+ ], DynamicModelController.prototype, "delete", null);
177
+ DynamicModelController = __decorate([
178
+ (0, common_1.Controller)(routePath),
179
+ (0, swagger_1.ApiTags)(modelClazzName),
180
+ (0, swagger_1.ApiExtraModels)(ModelClazz),
181
+ __metadata("design:paramtypes", [RepoFactory_1.RepoFactory])
182
+ ], DynamicModelController);
183
+ return DynamicModelController;
184
+ }
185
+ static forRoot(flavour) {
186
+ const log = this.log.for(this.forRoot);
187
+ log.info(`Generating controllers for flavour...`);
188
+ const trackedModels = core_1.Adapter.models(flavour);
189
+ const controllers = trackedModels.map(this.toModelController.bind(this));
190
+ log.info(`Generated ${controllers.length} controllers`);
191
+ return {
192
+ module: DecafModelModule_1,
193
+ controllers,
194
+ providers: [RepoFactory_1.RepoFactory],
195
+ };
196
+ }
197
+ };
198
+ exports.DecafModelModule = DecafModelModule;
199
+ exports.DecafModelModule = DecafModelModule = DecafModelModule_1 = __decorate([
200
+ (0, common_1.Module)({})
201
+ ], DecafModelModule);
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtbW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21vZGVsLW1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBVXdCO0FBQ3hCLDZDQVl5QjtBQUN6Qix5Q0FBMkQ7QUFDM0QseUVBQXlFO0FBQ3pFLCtDQUE4RTtBQUM5RSxtREFBNEM7QUFHckMsSUFBTSxnQkFBZ0IsR0FBdEIsTUFBTSxnQkFBZ0I7O0lBR2pCLE1BQU0sS0FBSyxHQUFHO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsaUJBQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWdCLENBQUMsQ0FBQztRQUNoRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVjLEFBQVAsTUFBTSxDQUFDLGlCQUFpQixDQUM5QixVQUFpQztRQUVqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqRCxNQUFNLFNBQVMsR0FBRyxpQkFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxNQUFNLFNBQVMsR0FBRyxJQUFBLHFCQUFXLEVBQUMsU0FBUyxDQUFDLENBQUM7UUFDekMsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUV2QyxHQUFHLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBRTlELElBR00sc0JBQXNCLEdBSDVCLE1BR00sc0JBQXVCLFNBQVEscUJBQVc7WUFLOUMsWUFBNkIsV0FBd0I7Z0JBQ25ELEtBQUssRUFBRSxDQUFDO2dCQURtQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtnQkFFbkQsR0FBRyxDQUFDLElBQUksQ0FDTiw2Q0FBNkMsY0FBYyxZQUFZLFNBQVMsRUFBRSxDQUNuRixDQUFD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QUFDLElBQUksQ0FBQyxhQUFhLFdBQVcsQ0FBQyxNQUFNLGNBQWMsQ0FBQyxDQUFDO1FBRXhELE9BQU87WUFDTCxNQUFNLEVBQUUsa0JBQWdCO1lBQ3hCLFdBQVc7WUFDWCxTQUFTLEVBQUUsQ0FBQyx5QkFBVyxDQUFDO1NBQ3pCLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQTtBQWhMWSw0Q0FBZ0I7MkJBQWhCLGdCQUFnQjtJQUQ1QixJQUFBLGVBQU0sRUFBQyxFQUFFLENBQUM7R0FDRSxnQkFBZ0IsQ0FnTDVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQm9keSxcbiAgQ29udHJvbGxlcixcbiAgRGVsZXRlLFxuICBEeW5hbWljTW9kdWxlLFxuICBHZXQsXG4gIE1vZHVsZSxcbiAgUGFyYW0sXG4gIFBvc3QsXG4gIFB1dCxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQge1xuICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UsXG4gIEFwaUJvZHksXG4gIEFwaUNyZWF0ZWRSZXNwb25zZSxcbiAgQXBpRXh0cmFNb2RlbHMsXG4gIEFwaU5vdEZvdW5kUmVzcG9uc2UsXG4gIEFwaU9rUmVzcG9uc2UsXG4gIEFwaU9wZXJhdGlvbixcbiAgQXBpUGFyYW0sXG4gIEFwaVRhZ3MsXG4gIEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSxcbiAgZ2V0U2NoZW1hUGF0aCxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnZWRDbGFzcywgTG9nZ2VyLCBMb2dnaW5nLCB0b0tlYmFiQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgUmVwb0ZhY3RvcnkgfSBmcm9tIFwiLi9SZXBvRmFjdG9yeVwiO1xuXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmTW9kZWxNb2R1bGUge1xuICBwcml2YXRlIHN0YXRpYyBfbG9nZ2VyOiBMb2dnZXI7XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLl9sb2dnZXIpIHRoaXMuX2xvZ2dlciA9IExvZ2dpbmcuZm9yKERlY2FmTW9kZWxNb2R1bGUpO1xuICAgIHJldHVybiB0aGlzLl9sb2dnZXI7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB0b01vZGVsQ29udHJvbGxlcjxUIGV4dGVuZHMgTW9kZWw8YW55Pj4oXG4gICAgTW9kZWxDbGF6ejogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnRvTW9kZWxDb250cm9sbGVyKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKE1vZGVsQ2xhenopO1xuICAgIGNvbnN0IHJvdXRlUGF0aCA9IHRvS2ViYWJDYXNlKHRhYmxlTmFtZSk7XG4gICAgY29uc3QgbW9kZWxDbGF6ek5hbWUgPSBNb2RlbENsYXp6Lm5hbWU7XG5cbiAgICBsb2cuZGVidWcoYENyZWF0aW5nIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke21vZGVsQ2xhenpOYW1lfWApO1xuXG4gICAgQENvbnRyb2xsZXIocm91dGVQYXRoKVxuICAgIEBBcGlUYWdzKG1vZGVsQ2xhenpOYW1lKVxuICAgIEBBcGlFeHRyYU1vZGVscyhNb2RlbENsYXp6KVxuICAgIGNsYXNzIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gICAgICAvLyBwcml2YXRlIHJlYWRvbmx5IHJlcG8gPSB0aGlzLnJlcG9GYWN0b3J5LmZvcihNb2RlbENsYXp6KTtcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgcGshOiBzdHJpbmc7XG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHJlcG8hOiBSZXBvPFQ+OyAvL1JlcG9zaXRvcnk8TW9kZWw8YW55PiwgYW55LCBhbnksIGFueSwgYW55PjtcblxuICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByZXBvRmFjdG9yeTogUmVwb0ZhY3RvcnkpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYFJlZ2lzdGVyaW5nIGR5bmFtaWMgY29udHJvbGxlciBmb3IgbW9kZWw6ICR7bW9kZWxDbGF6ek5hbWV9IHJvdXRlOiAvJHtyb3V0ZVBhdGh9YFxuICAgICAgICApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5yZXBvID0gdGhpcy5yZXBvRmFjdG9yeS5mb3IoTW9kZWxDbGF6ei5uYW1lKTtcbiAgICAgICAgICB0aGlzLnBrID0gdGhpcy5yZXBvLnBrIGFzIHN0cmluZztcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGluaXRpYWxpemUgcmVwb3NpdG9yeSBmb3IgbW9kZWwgXCIke01vZGVsQ2xhenoubmFtZX1cIi5gLFxuICAgICAgICAgICAgZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgQFBvc3QoKVxuICAgICAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBDcmVhdGUgYSBuZXcgJHttb2RlbENsYXp6TmFtZX0uYCB9KVxuICAgICAgQEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDbGF6eikgfSxcbiAgICAgIH0pXG4gICAgICBAQXBpQ3JlYXRlZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pXG4gICAgICBAQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIixcbiAgICAgIH0pXG4gICAgICBhc3luYyBjcmVhdGUoQEJvZHkoKSBkYXRhOiBUKTogUHJvbWlzZTxNb2RlbDxhbnk+PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNyZWF0ZSk7XG4gICAgICAgIGxvZy52ZXJib3NlKGBjcmVhdGluZyBuZXcgJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgICAgbGV0IGNyZWF0ZWQ6IE1vZGVsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNyZWF0ZWQgPSBhd2FpdCB0aGlzLnJlcG8uY3JlYXRlKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIG5ldyAke21vZGVsQ2xhenpOYW1lfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLmluZm8oYGNyZWF0ZWQgbmV3ICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtjcmVhdGVkW3RoaXMucGtdfWApO1xuICAgICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICAgIH1cblxuICAgICAgQEdldChcIjppZFwiKVxuICAgICAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSBhICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBieSBpZC5gIH0pXG4gICAgICBAQXBpUGFyYW0oeyBuYW1lOiBcImlkXCIsIGRlc2NyaXB0aW9uOiBcIlByaW1hcnkga2V5XCIgfSlcbiAgICAgIEBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICB9KVxuICAgICAgQEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KVxuICAgICAgYXN5bmMgcmVhZChAUGFyYW0oXCJpZFwiKSBpZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJlYWQpO1xuICAgICAgICBsZXQgcmVhZDogTW9kZWw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGByZWFkaW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2lkfWApO1xuICAgICAgICAgIHJlYWQgPSBhd2FpdCB0aGlzLnJlcG8ucmVhZChpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHJlYWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWAsXG4gICAgICAgICAgICBlIGFzIEVycm9yXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nLmluZm8oYHJlYWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke3JlYWRbdGhpcy5wa119YCk7XG4gICAgICAgIHJldHVybiByZWFkO1xuICAgICAgfVxuXG4gICAgICBAUHV0KFwiOmlkXCIpXG4gICAgICBAQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgYW4gZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIHdpdGggYSBuZXcgcGF5bG9hZC5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNlIGEgZXhpc3RpbmcgcmVjb3JkIG9mICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgc2NoZW1hOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDbGF6eikgfSxcbiAgICAgIH0pXG4gICAgICBAQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtNb2RlbENsYXp6fSByZWNvcmQgcmVwbGFjZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICB9KVxuICAgICAgQEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KVxuICAgICAgQEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSlcbiAgICAgIGFzeW5jIHVwZGF0ZShAQm9keSgpIGRhdGE6IE1vZGVsPGFueT4pIHtcbiAgICAgICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMudXBkYXRlKTtcbiAgICAgICAgbGV0IHVwZGF0ZWQ6IE1vZGVsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgICAgYHVwZGF0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2RhdGFbdGhpcy5wa119YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlZCA9IGF3YWl0IHRoaXMucmVwby5jcmVhdGUoZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgICAgfVxuXG4gICAgICBARGVsZXRlKFwiOmlkXCIpXG4gICAgICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYERlbGV0ZSBhICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBieSBpZC5gIH0pXG4gICAgICBAQXBpUGFyYW0oe1xuICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUHJpbWFyeSBrZXkgdmFsdWUgb2YgdGhlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCB0byBkZWxldGUuYCxcbiAgICAgIH0pXG4gICAgICBAQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICB9KVxuICAgICAgQEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KVxuICAgICAgYXN5bmMgZGVsZXRlKEBQYXJhbShcImlkXCIpIGlkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZGVsZXRlKTtcbiAgICAgICAgbGV0IHJlYWQ6IE1vZGVsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBkZWxldGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wayBhcyBzdHJpbmd9ICR7aWR9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVhZCA9IGF3YWl0IHRoaXMucmVwby5yZWFkKGlkKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gZGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtpZH1gLFxuICAgICAgICAgICAgZSBhcyBFcnJvclxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuaW5mbyhgZGVsZXRlZCAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7cmVhZFt0aGlzLnBrXX1gKTtcbiAgICAgICAgcmV0dXJuIHJlYWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIER5bmFtaWNNb2RlbENvbnRyb2xsZXI7XG4gIH1cblxuICBzdGF0aWMgZm9yUm9vdChmbGF2b3VyOiBzdHJpbmcpOiBEeW5hbWljTW9kdWxlIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5mb3JSb290KTtcbiAgICBsb2cuaW5mbyhgR2VuZXJhdGluZyBjb250cm9sbGVycyBmb3IgZmxhdm91ci4uLmApO1xuXG4gICAgY29uc3QgdHJhY2tlZE1vZGVscyA9IEFkYXB0ZXIubW9kZWxzKGZsYXZvdXIpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXJzID0gdHJhY2tlZE1vZGVscy5tYXAodGhpcy50b01vZGVsQ29udHJvbGxlci5iaW5kKHRoaXMpKTtcblxuICAgIGxvZy5pbmZvKGBHZW5lcmF0ZWQgJHtjb250cm9sbGVycy5sZW5ndGh9IGNvbnRyb2xsZXJzYCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZk1vZGVsTW9kdWxlLFxuICAgICAgY29udHJvbGxlcnMsXG4gICAgICBwcm92aWRlcnM6IFtSZXBvRmFjdG9yeV0sXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,8 @@
1
+ import { DynamicModule } from "@nestjs/common";
2
+ import { Logger } from "@decaf-ts/logging";
3
+ export declare class DecafModelModule {
4
+ private static _logger;
5
+ protected static get log(): Logger;
6
+ private static toModelController;
7
+ static forRoot(flavour: string): DynamicModule;
8
+ }