mongodb-dynamic-api 1.1.0

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 (178) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/LICENSE +21 -0
  3. package/README.md +190 -0
  4. package/index.d.ts +1 -0
  5. package/index.js +17 -0
  6. package/package.json +119 -0
  7. package/src/builders/index.d.ts +1 -0
  8. package/src/builders/index.js +17 -0
  9. package/src/builders/route-decorators.builder.d.ts +18 -0
  10. package/src/builders/route-decorators.builder.js +76 -0
  11. package/src/decorators/index.d.ts +1 -0
  12. package/src/decorators/index.js +17 -0
  13. package/src/decorators/schema-options.decorator.d.ts +4 -0
  14. package/src/decorators/schema-options.decorator.js +11 -0
  15. package/src/dtos/entity.param.d.ts +4 -0
  16. package/src/dtos/entity.param.js +26 -0
  17. package/src/dtos/entity.query.d.ts +2 -0
  18. package/src/dtos/entity.query.js +6 -0
  19. package/src/dtos/index.d.ts +2 -0
  20. package/src/dtos/index.js +18 -0
  21. package/src/dynamic-api.module.d.ts +8 -0
  22. package/src/dynamic-api.module.js +101 -0
  23. package/src/helpers/config.helper.d.ts +61 -0
  24. package/src/helpers/config.helper.js +95 -0
  25. package/src/helpers/index.d.ts +2 -0
  26. package/src/helpers/index.js +18 -0
  27. package/src/helpers/route-decorators.helper.d.ts +4 -0
  28. package/src/helpers/route-decorators.helper.js +8 -0
  29. package/src/index.d.ts +10 -0
  30. package/src/index.js +26 -0
  31. package/src/interfaces/dynamic-api-options.interface.d.ts +15 -0
  32. package/src/interfaces/dynamic-api-options.interface.js +2 -0
  33. package/src/interfaces/dynamic-api-schema-options.interface.d.ts +43 -0
  34. package/src/interfaces/dynamic-api-schema-options.interface.js +2 -0
  35. package/src/interfaces/entity-mappers.interface.d.ts +8 -0
  36. package/src/interfaces/entity-mappers.interface.js +2 -0
  37. package/src/interfaces/index.d.ts +6 -0
  38. package/src/interfaces/index.js +22 -0
  39. package/src/interfaces/maybe-promise.type.d.ts +2 -0
  40. package/src/interfaces/maybe-promise.type.js +2 -0
  41. package/src/interfaces/route-config.interface.d.ts +17 -0
  42. package/src/interfaces/route-config.interface.js +2 -0
  43. package/src/interfaces/service-provider.interface.d.ts +6 -0
  44. package/src/interfaces/service-provider.interface.js +2 -0
  45. package/src/mixins/entity-body.mixin.d.ts +16 -0
  46. package/src/mixins/entity-body.mixin.js +24 -0
  47. package/src/mixins/entity-presenter.mixin.d.ts +15 -0
  48. package/src/mixins/entity-presenter.mixin.js +10 -0
  49. package/src/mixins/index.d.ts +2 -0
  50. package/src/mixins/index.js +18 -0
  51. package/src/models/base-entity.model.d.ts +32 -0
  52. package/src/models/base-entity.model.js +40 -0
  53. package/src/models/index.d.ts +2 -0
  54. package/src/models/index.js +18 -0
  55. package/src/models/soft-deletable-entity.model.d.ts +5 -0
  56. package/src/models/soft-deletable-entity.model.js +29 -0
  57. package/src/modules/create-many/base-create-many.service.d.ts +33 -0
  58. package/src/modules/create-many/base-create-many.service.js +22 -0
  59. package/src/modules/create-many/create-many-controller.interface.d.ts +9 -0
  60. package/src/modules/create-many/create-many-controller.interface.js +2 -0
  61. package/src/modules/create-many/create-many-controller.mixin.d.ts +6 -0
  62. package/src/modules/create-many/create-many-controller.mixin.js +81 -0
  63. package/src/modules/create-many/create-many-service.interface.d.ts +5 -0
  64. package/src/modules/create-many/create-many-service.interface.js +2 -0
  65. package/src/modules/create-many/create-many.helper.d.ts +7 -0
  66. package/src/modules/create-many/create-many.helper.js +68 -0
  67. package/src/modules/create-many/create-many.module.d.ts +6 -0
  68. package/src/modules/create-many/create-many.module.js +28 -0
  69. package/src/modules/create-many/index.d.ts +6 -0
  70. package/src/modules/create-many/index.js +22 -0
  71. package/src/modules/create-one/base-create-one.service.d.ts +33 -0
  72. package/src/modules/create-one/base-create-one.service.js +22 -0
  73. package/src/modules/create-one/create-one-controller.interface.d.ts +7 -0
  74. package/src/modules/create-one/create-one-controller.interface.js +2 -0
  75. package/src/modules/create-one/create-one-controller.mixin.d.ts +6 -0
  76. package/src/modules/create-one/create-one-controller.mixin.js +62 -0
  77. package/src/modules/create-one/create-one-service.interface.d.ts +5 -0
  78. package/src/modules/create-one/create-one-service.interface.js +2 -0
  79. package/src/modules/create-one/create-one.helper.d.ts +7 -0
  80. package/src/modules/create-one/create-one.helper.js +68 -0
  81. package/src/modules/create-one/create-one.module.d.ts +6 -0
  82. package/src/modules/create-one/create-one.module.js +28 -0
  83. package/src/modules/create-one/index.d.ts +6 -0
  84. package/src/modules/create-one/index.js +22 -0
  85. package/src/modules/delete-one/base-delete-one.service.d.ts +34 -0
  86. package/src/modules/delete-one/base-delete-one.service.js +29 -0
  87. package/src/modules/delete-one/delete-one-controller.interface.d.ts +7 -0
  88. package/src/modules/delete-one/delete-one-controller.interface.js +2 -0
  89. package/src/modules/delete-one/delete-one-controller.mixin.d.ts +6 -0
  90. package/src/modules/delete-one/delete-one-controller.mixin.js +63 -0
  91. package/src/modules/delete-one/delete-one-service.interface.d.ts +8 -0
  92. package/src/modules/delete-one/delete-one-service.interface.js +2 -0
  93. package/src/modules/delete-one/delete-one.helper.d.ts +7 -0
  94. package/src/modules/delete-one/delete-one.helper.js +68 -0
  95. package/src/modules/delete-one/delete-one.module.d.ts +6 -0
  96. package/src/modules/delete-one/delete-one.module.js +28 -0
  97. package/src/modules/delete-one/delete-one.presenter.d.ts +3 -0
  98. package/src/modules/delete-one/delete-one.presenter.js +20 -0
  99. package/src/modules/delete-one/index.d.ts +7 -0
  100. package/src/modules/delete-one/index.js +23 -0
  101. package/src/modules/duplicate-one/base-duplicate-one.service.d.ts +33 -0
  102. package/src/modules/duplicate-one/base-duplicate-one.service.js +41 -0
  103. package/src/modules/duplicate-one/duplicate-one-controller.interface.d.ts +7 -0
  104. package/src/modules/duplicate-one/duplicate-one-controller.interface.js +2 -0
  105. package/src/modules/duplicate-one/duplicate-one-controller.mixin.d.ts +6 -0
  106. package/src/modules/duplicate-one/duplicate-one-controller.mixin.js +72 -0
  107. package/src/modules/duplicate-one/duplicate-one-service.interface.d.ts +5 -0
  108. package/src/modules/duplicate-one/duplicate-one-service.interface.js +2 -0
  109. package/src/modules/duplicate-one/duplicate-one.helper.d.ts +7 -0
  110. package/src/modules/duplicate-one/duplicate-one.helper.js +68 -0
  111. package/src/modules/duplicate-one/duplicate-one.module.d.ts +6 -0
  112. package/src/modules/duplicate-one/duplicate-one.module.js +28 -0
  113. package/src/modules/duplicate-one/index.d.ts +6 -0
  114. package/src/modules/duplicate-one/index.js +22 -0
  115. package/src/modules/get-many/base-get-many.service.d.ts +33 -0
  116. package/src/modules/get-many/base-get-many.service.js +21 -0
  117. package/src/modules/get-many/get-many-controller.interface.d.ts +7 -0
  118. package/src/modules/get-many/get-many-controller.interface.js +2 -0
  119. package/src/modules/get-many/get-many-controller.mixin.d.ts +6 -0
  120. package/src/modules/get-many/get-many-controller.mixin.js +63 -0
  121. package/src/modules/get-many/get-many-service.interface.d.ts +5 -0
  122. package/src/modules/get-many/get-many-service.interface.js +2 -0
  123. package/src/modules/get-many/get-many.helper.d.ts +7 -0
  124. package/src/modules/get-many/get-many.helper.js +68 -0
  125. package/src/modules/get-many/get-many.module.d.ts +6 -0
  126. package/src/modules/get-many/get-many.module.js +28 -0
  127. package/src/modules/get-many/index.d.ts +6 -0
  128. package/src/modules/get-many/index.js +22 -0
  129. package/src/modules/get-one/base-get-one.service.d.ts +33 -0
  130. package/src/modules/get-one/base-get-one.service.js +24 -0
  131. package/src/modules/get-one/get-one-controller.interface.d.ts +7 -0
  132. package/src/modules/get-one/get-one-controller.interface.js +2 -0
  133. package/src/modules/get-one/get-one-controller.mixin.d.ts +6 -0
  134. package/src/modules/get-one/get-one-controller.mixin.js +71 -0
  135. package/src/modules/get-one/get-one-service.interface.d.ts +5 -0
  136. package/src/modules/get-one/get-one-service.interface.js +2 -0
  137. package/src/modules/get-one/get-one.helper.d.ts +7 -0
  138. package/src/modules/get-one/get-one.helper.js +68 -0
  139. package/src/modules/get-one/get-one.module.d.ts +6 -0
  140. package/src/modules/get-one/get-one.module.js +28 -0
  141. package/src/modules/get-one/index.d.ts +6 -0
  142. package/src/modules/get-one/index.js +22 -0
  143. package/src/modules/index.d.ts +8 -0
  144. package/src/modules/index.js +24 -0
  145. package/src/modules/replace-one/base-replace-one.service.d.ts +33 -0
  146. package/src/modules/replace-one/base-replace-one.service.js +33 -0
  147. package/src/modules/replace-one/index.d.ts +6 -0
  148. package/src/modules/replace-one/index.js +22 -0
  149. package/src/modules/replace-one/replace-one-controller.interface.d.ts +7 -0
  150. package/src/modules/replace-one/replace-one-controller.interface.js +2 -0
  151. package/src/modules/replace-one/replace-one-controller.mixin.d.ts +6 -0
  152. package/src/modules/replace-one/replace-one-controller.mixin.js +72 -0
  153. package/src/modules/replace-one/replace-one-service.interface.d.ts +5 -0
  154. package/src/modules/replace-one/replace-one-service.interface.js +2 -0
  155. package/src/modules/replace-one/replace-one.helper.d.ts +7 -0
  156. package/src/modules/replace-one/replace-one.helper.js +68 -0
  157. package/src/modules/replace-one/replace-one.module.d.ts +6 -0
  158. package/src/modules/replace-one/replace-one.module.js +28 -0
  159. package/src/modules/update-one/base-update-one.service.d.ts +33 -0
  160. package/src/modules/update-one/base-update-one.service.js +30 -0
  161. package/src/modules/update-one/index.d.ts +6 -0
  162. package/src/modules/update-one/index.js +22 -0
  163. package/src/modules/update-one/update-one-controller.interface.d.ts +7 -0
  164. package/src/modules/update-one/update-one-controller.interface.js +2 -0
  165. package/src/modules/update-one/update-one-controller.mixin.d.ts +6 -0
  166. package/src/modules/update-one/update-one-controller.mixin.js +72 -0
  167. package/src/modules/update-one/update-one-service.interface.d.ts +5 -0
  168. package/src/modules/update-one/update-one-service.interface.js +2 -0
  169. package/src/modules/update-one/update-one.helper.d.ts +7 -0
  170. package/src/modules/update-one/update-one.helper.js +68 -0
  171. package/src/modules/update-one/update-one.module.d.ts +6 -0
  172. package/src/modules/update-one/update-one.module.js +28 -0
  173. package/src/services/base.service.d.ts +36 -0
  174. package/src/services/base.service.js +33 -0
  175. package/src/services/index.d.ts +1 -0
  176. package/src/services/index.js +17 -0
  177. package/src/version.json +3 -0
  178. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,101 @@
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 DynamicApiModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.DynamicApiModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const mongoose_1 = require("@nestjs/mongoose");
13
+ const lodash_1 = require("lodash");
14
+ const decorators_1 = require("./decorators");
15
+ const modules_1 = require("./modules");
16
+ let DynamicApiModule = DynamicApiModule_1 = class DynamicApiModule {
17
+ static forRoot(uri) {
18
+ if (!uri) {
19
+ throw new Error('You must provide a valid mongodb uri in the forRoot method to use MongoDB Dynamic API');
20
+ }
21
+ return {
22
+ module: DynamicApiModule_1,
23
+ imports: [
24
+ mongoose_1.MongooseModule.forRoot(uri, { connectionName: DynamicApiModule_1.connectionName }),
25
+ ],
26
+ };
27
+ }
28
+ static forFeature({ entity, controllerOptions: { path, apiTag, version: controllerVersion, validationPipeOptions: controllerValidationPipeOptions, }, routes = [], }) {
29
+ const { indexes, hooks } = Reflect.getOwnMetadata(decorators_1.DYNAMIC_API_SCHEMA_OPTIONS_METADATA, entity) ?? {};
30
+ const schema = mongoose_1.SchemaFactory.createForClass(entity);
31
+ schema.set('timestamps', true);
32
+ if (indexes) {
33
+ indexes.forEach(({ fields, options }) => {
34
+ schema.index(fields, options);
35
+ });
36
+ }
37
+ if (hooks?.length) {
38
+ hooks.forEach(({ type, method, callback, options }) => {
39
+ schema[method](type, { document: true, query: true, ...options }, callback);
40
+ });
41
+ }
42
+ const databaseModule = mongoose_1.MongooseModule.forFeature([{ name: entity.name, schema }], DynamicApiModule_1.connectionName);
43
+ if (!routes.length) {
44
+ const contentName = (0, lodash_1.lowerCase)(entity.name);
45
+ routes = [
46
+ { type: 'GetMany', description: `Get many ${contentName}` },
47
+ { type: 'GetOne', description: `Get one ${contentName} by id` },
48
+ { type: 'CreateMany', description: `Create many ${contentName}` },
49
+ { type: 'CreateOne', description: `Create one ${contentName}` },
50
+ { type: 'ReplaceOne', description: `Replace one ${contentName}` },
51
+ { type: 'UpdateOne', description: `Update one ${contentName}` },
52
+ { type: 'DuplicateOne', description: `Duplicate one ${contentName}` },
53
+ { type: 'DeleteOne', description: `Delete one ${contentName}` },
54
+ ];
55
+ }
56
+ return {
57
+ module: DynamicApiModule_1,
58
+ imports: [
59
+ ...routes
60
+ .map(({ type, description, dTOs, version: routeVersion, validationPipeOptions: routeValidationPipeOptions, }) => {
61
+ let module;
62
+ switch (type) {
63
+ case 'CreateMany':
64
+ module = modules_1.CreateManyModule;
65
+ break;
66
+ case 'CreateOne':
67
+ module = modules_1.CreateOneModule;
68
+ break;
69
+ case 'DeleteOne':
70
+ module = modules_1.DeleteOneModule;
71
+ break;
72
+ case 'DuplicateOne':
73
+ module = modules_1.DuplicateOneModule;
74
+ break;
75
+ case 'GetMany':
76
+ module = modules_1.GetManyModule;
77
+ break;
78
+ case 'GetOne':
79
+ module = modules_1.GetOneModule;
80
+ break;
81
+ case 'ReplaceOne':
82
+ module = modules_1.ReplaceOneModule;
83
+ break;
84
+ case 'UpdateOne':
85
+ module = modules_1.UpdateOneModule;
86
+ break;
87
+ default:
88
+ throw new Error(`Route for ${type} is not implemented`);
89
+ }
90
+ return module.forFeature(databaseModule, entity, { path, apiTag }, { description, dTOs }, routeVersion ?? controllerVersion, routeValidationPipeOptions ?? controllerValidationPipeOptions);
91
+ })
92
+ .filter((module) => module),
93
+ ],
94
+ };
95
+ }
96
+ };
97
+ exports.DynamicApiModule = DynamicApiModule;
98
+ DynamicApiModule.connectionName = 'dynamic-api-connection';
99
+ exports.DynamicApiModule = DynamicApiModule = DynamicApiModule_1 = __decorate([
100
+ (0, common_1.Module)({})
101
+ ], DynamicApiModule);
@@ -0,0 +1,61 @@
1
+ import { INestApplication, ValidationPipeOptions, VersioningOptions } from '@nestjs/common';
2
+ import { SwaggerDocumentOptions } from '@nestjs/swagger';
3
+ import { ExternalDocumentationObject, ParameterObject, SecuritySchemeObject, ServerVariableObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface';
4
+ type DynamicAPISwaggerExtraConfig = {
5
+ termsOfService?: string;
6
+ contact?: {
7
+ name: string;
8
+ url: string;
9
+ email: string;
10
+ };
11
+ license?: {
12
+ name: string;
13
+ url: string;
14
+ };
15
+ servers?: {
16
+ url: string;
17
+ description?: string;
18
+ variables?: Record<string, ServerVariableObject>;
19
+ }[];
20
+ externalDocs?: {
21
+ description: string;
22
+ url: string;
23
+ };
24
+ basePath?: string;
25
+ tags?: {
26
+ name: string;
27
+ description?: string;
28
+ externalDocs?: ExternalDocumentationObject;
29
+ }[];
30
+ extensions?: {
31
+ [key: string]: any;
32
+ };
33
+ security?: {
34
+ [key: string]: SecuritySchemeObject;
35
+ };
36
+ globalParameters?: ParameterObject[];
37
+ securityRequirements?: {
38
+ [key: string]: string[];
39
+ };
40
+ bearerAuth?: SecuritySchemeObject;
41
+ oAuth2?: SecuritySchemeObject;
42
+ apiKey?: SecuritySchemeObject;
43
+ basicAuth?: SecuritySchemeObject;
44
+ cookieAuth?: {
45
+ cookieName: string;
46
+ options: SecuritySchemeObject;
47
+ securityName: string;
48
+ };
49
+ };
50
+ type DynamicAPISwaggerOptions = {
51
+ title?: string;
52
+ description?: string;
53
+ version?: string;
54
+ path?: string;
55
+ swaggerConfig?: DynamicAPISwaggerExtraConfig;
56
+ swaggerOptions?: SwaggerDocumentOptions;
57
+ };
58
+ declare function enableDynamicAPISwagger(app: INestApplication, options?: DynamicAPISwaggerOptions): void;
59
+ declare function enableDynamicAPIVersioning(app: INestApplication, options?: VersioningOptions): void;
60
+ declare function enableDynamicAPIValidation(app: INestApplication, options?: ValidationPipeOptions): void;
61
+ export { enableDynamicAPISwagger, enableDynamicAPIVersioning, enableDynamicAPIValidation, DynamicAPISwaggerOptions, DynamicAPISwaggerExtraConfig, };
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.enableDynamicAPIValidation = exports.enableDynamicAPIVersioning = exports.enableDynamicAPISwagger = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const swagger_1 = require("@nestjs/swagger");
6
+ const version_json_1 = require("../version.json");
7
+ function buildExtraConfig(config, swaggerConfig) {
8
+ Object.keys(swaggerConfig).forEach((key) => {
9
+ const value = swaggerConfig[key];
10
+ switch (key) {
11
+ case 'termsOfService':
12
+ config.setTermsOfService(value);
13
+ break;
14
+ case 'contact':
15
+ config.setContact(value.name, value.url, value.email);
16
+ break;
17
+ case 'license':
18
+ config.setLicense(value.name, value.url);
19
+ break;
20
+ case 'servers':
21
+ value.forEach((server) => {
22
+ config.addServer(server.url, server.description, server.variables);
23
+ });
24
+ break;
25
+ case 'externalDocs':
26
+ config.setExternalDoc(value.description, value.url);
27
+ break;
28
+ case 'basePath':
29
+ config.setBasePath(value);
30
+ break;
31
+ case 'tags':
32
+ value.forEach((tag) => {
33
+ config.addTag(tag.name, tag.description, tag.externalDocs);
34
+ });
35
+ break;
36
+ case 'extensions':
37
+ Object.keys(value).forEach((extensionKey) => {
38
+ config.addExtension(extensionKey, value[extensionKey]);
39
+ });
40
+ break;
41
+ case 'security':
42
+ Object.keys(value).forEach((securityKey) => {
43
+ config.addSecurity(securityKey, value[securityKey]);
44
+ });
45
+ break;
46
+ case 'globalParameters':
47
+ config.addGlobalParameters(...value);
48
+ break;
49
+ case 'securityRequirements':
50
+ Object.keys(value).forEach((securityKey) => {
51
+ config.addSecurityRequirements(securityKey, value[securityKey]);
52
+ });
53
+ break;
54
+ case 'bearerAuth':
55
+ config.addBearerAuth(value);
56
+ break;
57
+ case 'oAuth2':
58
+ config.addOAuth2(value);
59
+ break;
60
+ case 'apiKey':
61
+ config.addApiKey(value);
62
+ break;
63
+ case 'basicAuth':
64
+ config.addBasicAuth(value);
65
+ break;
66
+ case 'cookieAuth':
67
+ config.addCookieAuth(value.cookieName, value.options, value.securityName);
68
+ break;
69
+ default:
70
+ break;
71
+ }
72
+ });
73
+ }
74
+ function enableDynamicAPISwagger(app, options = {}) {
75
+ const { title = 'MongoDB Dynamic API', description = 'Auto generated CRUD for MongoDB', version = version_json_1.default?.version?.split('-beta')[0], path = '/openapi', swaggerConfig, swaggerOptions, } = options ?? {};
76
+ const config = new swagger_1.DocumentBuilder()
77
+ .setTitle(title)
78
+ .setDescription(description)
79
+ .setVersion(version);
80
+ buildExtraConfig(config, swaggerConfig ?? {});
81
+ const document = swagger_1.SwaggerModule.createDocument(app, config.build(), swaggerOptions);
82
+ swagger_1.SwaggerModule.setup(path, app, document);
83
+ }
84
+ exports.enableDynamicAPISwagger = enableDynamicAPISwagger;
85
+ function enableDynamicAPIVersioning(app, options) {
86
+ app.enableVersioning({
87
+ type: common_1.VersioningType.URI,
88
+ ...options,
89
+ });
90
+ }
91
+ exports.enableDynamicAPIVersioning = enableDynamicAPIVersioning;
92
+ function enableDynamicAPIValidation(app, options = {}) {
93
+ app.useGlobalPipes(new common_1.ValidationPipe(options));
94
+ }
95
+ exports.enableDynamicAPIValidation = enableDynamicAPIValidation;
@@ -0,0 +1,2 @@
1
+ export * from './config.helper';
2
+ export * from './route-decorators.helper';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./config.helper"), exports);
18
+ __exportStar(require("./route-decorators.helper"), exports);
@@ -0,0 +1,4 @@
1
+ import { RouteDecoratorsBuilder } from '../builders';
2
+ import { BaseEntity } from '../models';
3
+ declare function RouteDecoratorsHelper<Entity extends BaseEntity>(routeDecorators: RouteDecoratorsBuilder<Entity>): <TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void;
4
+ export { RouteDecoratorsHelper };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RouteDecoratorsHelper = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ function RouteDecoratorsHelper(routeDecorators) {
6
+ return (0, common_1.applyDecorators)(...routeDecorators.build());
7
+ }
8
+ exports.RouteDecoratorsHelper = RouteDecoratorsHelper;
package/src/index.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export * from './builders';
2
+ export * from './decorators';
3
+ export * from './dtos';
4
+ export * from './helpers';
5
+ export * from './interfaces';
6
+ export * from './mixins';
7
+ export * from './models';
8
+ export * from './modules';
9
+ export * from './services';
10
+ export * from './dynamic-api.module';
package/src/index.js ADDED
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./builders"), exports);
18
+ __exportStar(require("./decorators"), exports);
19
+ __exportStar(require("./dtos"), exports);
20
+ __exportStar(require("./helpers"), exports);
21
+ __exportStar(require("./interfaces"), exports);
22
+ __exportStar(require("./mixins"), exports);
23
+ __exportStar(require("./models"), exports);
24
+ __exportStar(require("./modules"), exports);
25
+ __exportStar(require("./services"), exports);
26
+ __exportStar(require("./dynamic-api.module"), exports);
@@ -0,0 +1,15 @@
1
+ import { Type, ValidationPipeOptions } from '@nestjs/common';
2
+ import { BaseEntity } from '../models';
3
+ import { RouteConfig } from './route-config.interface';
4
+ interface ControllerOptions {
5
+ path: string;
6
+ apiTag?: string;
7
+ version?: string;
8
+ validationPipeOptions?: ValidationPipeOptions;
9
+ }
10
+ interface DynamicApiOptions<Entity extends BaseEntity> {
11
+ entity: Type<Entity>;
12
+ controllerOptions: ControllerOptions;
13
+ routes?: RouteConfig<Entity>[];
14
+ }
15
+ export { DynamicApiOptions, ControllerOptions };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,43 @@
1
+ /// <reference types="mongoose/types/aggregate" />
2
+ /// <reference types="mongoose/types/callback" />
3
+ /// <reference types="mongoose/types/collection" />
4
+ /// <reference types="mongoose/types/connection" />
5
+ /// <reference types="mongoose/types/cursor" />
6
+ /// <reference types="mongoose/types/document" />
7
+ /// <reference types="mongoose/types/error" />
8
+ /// <reference types="mongoose/types/expressions" />
9
+ /// <reference types="mongoose/types/helpers" />
10
+ /// <reference types="mongoose/types/middlewares" />
11
+ /// <reference types="mongoose/types/indexes" />
12
+ /// <reference types="mongoose/types/models" />
13
+ /// <reference types="mongoose/types/mongooseoptions" />
14
+ /// <reference types="mongoose/types/pipelinestage" />
15
+ /// <reference types="mongoose/types/populate" />
16
+ /// <reference types="mongoose/types/query" />
17
+ /// <reference types="mongoose/types/schemaoptions" />
18
+ /// <reference types="mongoose/types/schematypes" />
19
+ /// <reference types="mongoose/types/session" />
20
+ /// <reference types="mongoose/types/types" />
21
+ /// <reference types="mongoose/types/utility" />
22
+ /// <reference types="mongoose/types/validation" />
23
+ /// <reference types="mongoose/types/virtuals" />
24
+ /// <reference types="mongoose/types/inferschematype" />
25
+ import { IndexDefinition, IndexOptions } from 'mongoose';
26
+ type HookEvent = 'find' | 'findOne' | 'save' | 'findOneAndUpdate' | 'findOneAndReplace' | 'deleteOne';
27
+ type SchemaHook = {
28
+ type: HookEvent;
29
+ method: 'pre' | 'post';
30
+ callback: (...args: any[]) => void;
31
+ options?: {
32
+ document?: boolean;
33
+ query?: boolean;
34
+ };
35
+ };
36
+ interface DynamicAPISchemaOptionsInterface {
37
+ indexes?: {
38
+ fields: IndexDefinition;
39
+ options?: IndexOptions;
40
+ }[];
41
+ hooks?: SchemaHook[];
42
+ }
43
+ export type { SchemaHook, DynamicAPISchemaOptionsInterface };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,8 @@
1
+ import { BaseEntity } from '../models';
2
+ interface BodyToPartialEntityMapper {
3
+ toEntity?: <Entity extends BaseEntity, Body>(body: Body) => Promise<Partial<Entity>>;
4
+ }
5
+ interface EntityToPresenterMapper {
6
+ fromEntity?: <Entity extends BaseEntity, Presenter>(entity: Entity) => Promise<Presenter>;
7
+ }
8
+ export type { BodyToPartialEntityMapper, EntityToPresenterMapper };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ export * from './entity-mappers.interface';
2
+ export * from './dynamic-api-options.interface';
3
+ export * from './dynamic-api-schema-options.interface';
4
+ export * from './maybe-promise.type';
5
+ export * from './route-config.interface';
6
+ export * from './service-provider.interface';
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./entity-mappers.interface"), exports);
18
+ __exportStar(require("./dynamic-api-options.interface"), exports);
19
+ __exportStar(require("./dynamic-api-schema-options.interface"), exports);
20
+ __exportStar(require("./maybe-promise.type"), exports);
21
+ __exportStar(require("./route-config.interface"), exports);
22
+ __exportStar(require("./service-provider.interface"), exports);
@@ -0,0 +1,2 @@
1
+ type MaybePromise<T> = T | Promise<T>;
2
+ export type { MaybePromise };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,17 @@
1
+ import { Type, ValidationPipeOptions } from '@nestjs/common';
2
+ import { BaseEntity } from '../models';
3
+ type RouteType = 'GetMany' | 'GetOne' | 'CreateOne' | 'CreateMany' | 'UpdateOne' | 'ReplaceOne' | 'DeleteOne' | 'DuplicateOne';
4
+ type DTOsBundle = {
5
+ query?: Type;
6
+ param?: Type;
7
+ body?: Type;
8
+ presenter?: Type;
9
+ };
10
+ interface RouteConfig<Entity extends BaseEntity> {
11
+ type: RouteType;
12
+ description?: string;
13
+ version?: string;
14
+ dTOs?: DTOsBundle;
15
+ validationPipeOptions?: ValidationPipeOptions;
16
+ }
17
+ export { DTOsBundle, RouteType, RouteConfig };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ import { Type } from '@nestjs/common';
2
+ interface ServiceProvider {
3
+ provide: string;
4
+ useClass: Type;
5
+ }
6
+ export type { ServiceProvider };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,16 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { BaseEntity } from '../models';
3
+ declare const baseEntityKeysToExclude: <Entity extends BaseEntity>() => (keyof Entity)[];
4
+ declare function EntityBodyMixin<Entity extends BaseEntity>(entity: Type<Entity>, update?: boolean, additionalKeysToExclude?: (keyof Entity)[]): {
5
+ new (...args: any[]): {};
6
+ apply(this: Function, thisArg: any, argArray?: any): any;
7
+ call(this: Function, thisArg: any, ...argArray: any[]): any;
8
+ bind(this: Function, thisArg: any, ...argArray: any[]): any;
9
+ toString(): string;
10
+ readonly length: number;
11
+ arguments: any;
12
+ caller: Function;
13
+ readonly name: string;
14
+ [Symbol.hasInstance](value: any): boolean;
15
+ };
16
+ export { baseEntityKeysToExclude, EntityBodyMixin };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntityBodyMixin = exports.baseEntityKeysToExclude = void 0;
4
+ const swagger_1 = require("@nestjs/swagger");
5
+ const baseEntityKeysToExclude = () => [
6
+ 'id',
7
+ 'createdAt',
8
+ 'updatedAt',
9
+ 'deletedAt',
10
+ 'isDeleted',
11
+ '_id',
12
+ '__v',
13
+ ];
14
+ exports.baseEntityKeysToExclude = baseEntityKeysToExclude;
15
+ function EntityBodyMixin(entity, update = false, additionalKeysToExclude) {
16
+ const keysToExclude = [
17
+ ...baseEntityKeysToExclude(),
18
+ ...(additionalKeysToExclude ?? []),
19
+ ];
20
+ class EntityBody extends (0, swagger_1.OmitType)(entity, keysToExclude) {
21
+ }
22
+ return update ? (0, swagger_1.PartialType)(EntityBody) : EntityBody;
23
+ }
24
+ exports.EntityBodyMixin = EntityBodyMixin;
@@ -0,0 +1,15 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { BaseEntity } from '../models';
3
+ declare function EntityPresenterMixin<Entity extends BaseEntity>(entity: Type<Entity>, keysToExclude?: (keyof Entity)[]): {
4
+ new (...args: any[]): {};
5
+ apply(this: Function, thisArg: any, argArray?: any): any;
6
+ call(this: Function, thisArg: any, ...argArray: any[]): any;
7
+ bind(this: Function, thisArg: any, ...argArray: any[]): any;
8
+ toString(): string;
9
+ readonly length: number;
10
+ arguments: any;
11
+ caller: Function;
12
+ readonly name: string;
13
+ [Symbol.hasInstance](value: any): boolean;
14
+ };
15
+ export { EntityPresenterMixin };
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntityPresenterMixin = void 0;
4
+ const swagger_1 = require("@nestjs/swagger");
5
+ function EntityPresenterMixin(entity, keysToExclude) {
6
+ class EntityPresenter extends (keysToExclude ? (0, swagger_1.OmitType)(entity, keysToExclude) : entity) {
7
+ }
8
+ return EntityPresenter;
9
+ }
10
+ exports.EntityPresenterMixin = EntityPresenterMixin;
@@ -0,0 +1,2 @@
1
+ export * from './entity-body.mixin';
2
+ export * from './entity-presenter.mixin';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./entity-body.mixin"), exports);
18
+ __exportStar(require("./entity-presenter.mixin"), exports);
@@ -0,0 +1,32 @@
1
+ /// <reference types="mongoose/types/aggregate" />
2
+ /// <reference types="mongoose/types/callback" />
3
+ /// <reference types="mongoose/types/collection" />
4
+ /// <reference types="mongoose/types/connection" />
5
+ /// <reference types="mongoose/types/cursor" />
6
+ /// <reference types="mongoose/types/document" />
7
+ /// <reference types="mongoose/types/error" />
8
+ /// <reference types="mongoose/types/expressions" />
9
+ /// <reference types="mongoose/types/helpers" />
10
+ /// <reference types="mongoose/types/middlewares" />
11
+ /// <reference types="mongoose/types/indexes" />
12
+ /// <reference types="mongoose/types/models" />
13
+ /// <reference types="mongoose/types/mongooseoptions" />
14
+ /// <reference types="mongoose/types/pipelinestage" />
15
+ /// <reference types="mongoose/types/populate" />
16
+ /// <reference types="mongoose/types/query" />
17
+ /// <reference types="mongoose/types/schemaoptions" />
18
+ /// <reference types="mongoose/types/schematypes" />
19
+ /// <reference types="mongoose/types/session" />
20
+ /// <reference types="mongoose/types/types" />
21
+ /// <reference types="mongoose/types/utility" />
22
+ /// <reference types="mongoose/types/validation" />
23
+ /// <reference types="mongoose/types/virtuals" />
24
+ /// <reference types="mongoose/types/inferschematype" />
25
+ import { ObjectId } from 'mongoose';
26
+ export declare class BaseEntity {
27
+ _id: ObjectId;
28
+ __v: number;
29
+ id: string;
30
+ createdAt: Date;
31
+ updatedAt: Date;
32
+ }