@impactor/nest 3.0.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.
- package/LICENSE +21 -0
- package/README.md +49 -0
- package/index.d.ts +40 -0
- package/nx.json +190 -0
- package/package.json +102 -0
- package/src/configs/app.d.ts +21 -0
- package/src/configs/app.js +65 -0
- package/src/configs/app.js.map +1 -0
- package/src/configs/database.d.ts +2 -0
- package/src/configs/database.js +23 -0
- package/src/configs/database.js.map +1 -0
- package/src/configs/microservice.d.ts +7 -0
- package/src/configs/microservice.js +26 -0
- package/src/configs/microservice.js.map +1 -0
- package/src/configs/multi-queue-rabbitmq-server.d.ts +24 -0
- package/src/configs/multi-queue-rabbitmq-server.js +91 -0
- package/src/configs/multi-queue-rabbitmq-server.js.map +1 -0
- package/src/configs/redis-config.d.ts +5 -0
- package/src/configs/redis-config.js +16 -0
- package/src/configs/redis-config.js.map +1 -0
- package/src/create-app.d.ts +3 -0
- package/src/create-app.js +104 -0
- package/src/create-app.js.map +1 -0
- package/src/create-microservice.d.ts +2 -0
- package/src/create-microservice.js +43 -0
- package/src/create-microservice.js.map +1 -0
- package/src/create-testing-microservice.d.ts +3 -0
- package/src/create-testing-microservice.js +30 -0
- package/src/create-testing-microservice.js.map +1 -0
- package/src/decorators/controller/add-decorators/add-controller-path.d.ts +2 -0
- package/src/decorators/controller/add-decorators/add-controller-path.js +22 -0
- package/src/decorators/controller/add-decorators/add-controller-path.js.map +1 -0
- package/src/decorators/controller/add-decorators/add-controller-tags.d.ts +2 -0
- package/src/decorators/controller/add-decorators/add-controller-tags.js +28 -0
- package/src/decorators/controller/add-decorators/add-controller-tags.js.map +1 -0
- package/src/decorators/controller/add-decorators/add-http-method.d.ts +3 -0
- package/src/decorators/controller/add-decorators/add-http-method.js +27 -0
- package/src/decorators/controller/add-decorators/add-http-method.js.map +1 -0
- package/src/decorators/controller/add-decorators/add-swagger-body.d.ts +3 -0
- package/src/decorators/controller/add-decorators/add-swagger-body.js +30 -0
- package/src/decorators/controller/add-decorators/add-swagger-body.js.map +1 -0
- package/src/decorators/controller/add-decorators/add-swagger-operation.d.ts +3 -0
- package/src/decorators/controller/add-decorators/add-swagger-operation.js +21 -0
- package/src/decorators/controller/add-decorators/add-swagger-operation.js.map +1 -0
- package/src/decorators/controller/add-decorators/add-swagger-params.d.ts +3 -0
- package/src/decorators/controller/add-decorators/add-swagger-params.js +50 -0
- package/src/decorators/controller/add-decorators/add-swagger-params.js.map +1 -0
- package/src/decorators/controller/add-decorators/add-swagger-response.d.ts +3 -0
- package/src/decorators/controller/add-decorators/add-swagger-response.js +33 -0
- package/src/decorators/controller/add-decorators/add-swagger-response.js.map +1 -0
- package/src/decorators/controller/controller.decorator.d.ts +2 -0
- package/src/decorators/controller/controller.decorator.js +18 -0
- package/src/decorators/controller/controller.decorator.js.map +1 -0
- package/src/decorators/controller/controller.factory.d.ts +11 -0
- package/src/decorators/controller/controller.factory.js +261 -0
- package/src/decorators/controller/controller.factory.js.map +1 -0
- package/src/decorators/controller/default-options.d.ts +2 -0
- package/src/decorators/controller/default-options.js +181 -0
- package/src/decorators/controller/default-options.js.map +1 -0
- package/src/decorators/controller/dto/empty.dto.d.ts +2 -0
- package/src/decorators/controller/dto/empty.dto.js +18 -0
- package/src/decorators/controller/dto/empty.dto.js.map +1 -0
- package/src/decorators/controller/dto/update-response.dto.d.ts +3 -0
- package/src/decorators/controller/dto/update-response.dto.js +16 -0
- package/src/decorators/controller/dto/update-response.dto.js.map +1 -0
- package/src/decorators/controller/interceptors/query.interceptor.d.ts +8 -0
- package/src/decorators/controller/interceptors/query.interceptor.js +59 -0
- package/src/decorators/controller/interceptors/query.interceptor.js.map +1 -0
- package/src/decorators/controller/route-handler.d.ts +3 -0
- package/src/decorators/controller/route-handler.js +44 -0
- package/src/decorators/controller/route-handler.js.map +1 -0
- package/src/decorators/controller/route.decorator.d.ts +2 -0
- package/src/decorators/controller/route.decorator.js +17 -0
- package/src/decorators/controller/route.decorator.js.map +1 -0
- package/src/decorators/controller/services/crud-typeorm.service.d.ts +46 -0
- package/src/decorators/controller/services/crud-typeorm.service.js +232 -0
- package/src/decorators/controller/services/crud-typeorm.service.js.map +1 -0
- package/src/decorators/controller/types/index.d.ts +54 -0
- package/src/decorators/controller/types/index.js +6 -0
- package/src/decorators/controller/types/index.js.map +1 -0
- package/src/decorators/controller/utils/merge-options.d.ts +2 -0
- package/src/decorators/controller/utils/merge-options.js +37 -0
- package/src/decorators/controller/utils/merge-options.js.map +1 -0
- package/src/decorators/controller/utils/reflect.d.ts +10 -0
- package/src/decorators/controller/utils/reflect.js +86 -0
- package/src/decorators/controller/utils/reflect.js.map +1 -0
- package/src/decorators/prop.decorator.d.ts +9 -0
- package/src/decorators/prop.decorator.js +80 -0
- package/src/decorators/prop.decorator.js.map +1 -0
- package/src/exceptions/rpc-bad-request.exception.d.ts +4 -0
- package/src/exceptions/rpc-bad-request.exception.js +19 -0
- package/src/exceptions/rpc-bad-request.exception.js.map +1 -0
- package/src/exceptions/rpc-base.exception.d.ts +6 -0
- package/src/exceptions/rpc-base.exception.js +22 -0
- package/src/exceptions/rpc-base.exception.js.map +1 -0
- package/src/exceptions/rpc-conflict.exception.d.ts +4 -0
- package/src/exceptions/rpc-conflict.exception.js +19 -0
- package/src/exceptions/rpc-conflict.exception.js.map +1 -0
- package/src/exceptions/rpc-internal-server-error.exception.d.ts +4 -0
- package/src/exceptions/rpc-internal-server-error.exception.js +19 -0
- package/src/exceptions/rpc-internal-server-error.exception.js.map +1 -0
- package/src/exceptions/rpc-method-not-allowed.exception.d.ts +4 -0
- package/src/exceptions/rpc-method-not-allowed.exception.js +19 -0
- package/src/exceptions/rpc-method-not-allowed.exception.js.map +1 -0
- package/src/exceptions/rpc-not-found.exception.d.ts +4 -0
- package/src/exceptions/rpc-not-found.exception.js +19 -0
- package/src/exceptions/rpc-not-found.exception.js.map +1 -0
- package/src/exceptions/rpc-not-implemented.exception.d.ts +4 -0
- package/src/exceptions/rpc-not-implemented.exception.js +19 -0
- package/src/exceptions/rpc-not-implemented.exception.js.map +1 -0
- package/src/exceptions/rpc-unauthorized.exception.d.ts +4 -0
- package/src/exceptions/rpc-unauthorized.exception.js +19 -0
- package/src/exceptions/rpc-unauthorized.exception.js.map +1 -0
- package/src/filters/error-to-rpc-exception.filter.d.ts +4 -0
- package/src/filters/error-to-rpc-exception.filter.js +48 -0
- package/src/filters/error-to-rpc-exception.filter.js.map +1 -0
- package/src/filters/error-to-ws-exception.filter.d.ts +4 -0
- package/src/filters/error-to-ws-exception.filter.js +47 -0
- package/src/filters/error-to-ws-exception.filter.js.map +1 -0
- package/src/filters/typeorm-exception.filter.d.ts +6 -0
- package/src/filters/typeorm-exception.filter.js +44 -0
- package/src/filters/typeorm-exception.filter.js.map +1 -0
- package/src/filters/ws-exception.filter.d.ts +5 -0
- package/src/filters/ws-exception.filter.js +39 -0
- package/src/filters/ws-exception.filter.js.map +1 -0
- package/src/generate-metadata.d.ts +10 -0
- package/src/generate-metadata.js +97 -0
- package/src/generate-metadata.js.map +1 -0
- package/src/guards/auth.guard.d.ts +14 -0
- package/src/guards/auth.guard.js +92 -0
- package/src/guards/auth.guard.js.map +1 -0
- package/src/modules/basic/basic.controller.d.ts +3 -0
- package/src/modules/basic/basic.controller.js +33 -0
- package/src/modules/basic/basic.controller.js.map +1 -0
- package/src/modules/basic/basic.module.d.ts +2 -0
- package/src/modules/basic/basic.module.js +45 -0
- package/src/modules/basic/basic.module.js.map +1 -0
- package/src/modules/basic/basic.service.d.ts +2 -0
- package/src/modules/basic/basic.service.js +24 -0
- package/src/modules/basic/basic.service.js.map +1 -0
- package/src/nest-swagger-metadata.js +553 -0
- package/src/nest-swagger-metadata.js.map +1 -0
- package/src/utils/logger.d.ts +2 -0
- package/src/utils/logger.js +14 -0
- package/src/utils/logger.js.map +1 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "MultiQueueRabbitMQServer", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return MultiQueueRabbitMQServer;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _microservices = require("@nestjs/microservices");
|
|
12
|
+
const _common = require("@nestjs/common");
|
|
13
|
+
const _amqplib = require("amqplib");
|
|
14
|
+
let MultiQueueRabbitMQServer = class MultiQueueRabbitMQServer extends _microservices.Server {
|
|
15
|
+
get configs() {
|
|
16
|
+
return this._configs;
|
|
17
|
+
}
|
|
18
|
+
async listen(callback) {
|
|
19
|
+
try {
|
|
20
|
+
let connection = typeof this.options.connection === 'string' ? await (0, _amqplib.connect)(this.options.connection) : this.options.connection;
|
|
21
|
+
this._configs = {
|
|
22
|
+
...this.options,
|
|
23
|
+
connection,
|
|
24
|
+
channel: this.options.channel || await connection.createChannel()
|
|
25
|
+
};
|
|
26
|
+
this.logger.log('Successfully connected to RabbitMQ.');
|
|
27
|
+
for (let queue of this.options.queues){
|
|
28
|
+
await this.configs.channel.assertQueue(queue, {
|
|
29
|
+
durable: true
|
|
30
|
+
});
|
|
31
|
+
this.logger.log(`Listening on queue: ${queue}`);
|
|
32
|
+
await this.configs.channel.consume(queue, (message)=>{
|
|
33
|
+
let content = message?.content.toString();
|
|
34
|
+
if (content) {
|
|
35
|
+
let { pattern, data } = JSON.parse(content);
|
|
36
|
+
let handler = this.messageHandlers.get(pattern);
|
|
37
|
+
if (handler) {
|
|
38
|
+
void handler(data).then((res)=>{
|
|
39
|
+
if (message?.properties?.replyTo) {
|
|
40
|
+
// ✅ Check if replyTo exists
|
|
41
|
+
this.configs.channel.sendToQueue(message.properties.replyTo, Buffer.from(JSON.stringify(res)), {
|
|
42
|
+
correlationId: message.properties.correlationId
|
|
43
|
+
});
|
|
44
|
+
} else {
|
|
45
|
+
this.logger.warn(`No replyTo queue specified for pattern: ${pattern}`);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
} else {
|
|
49
|
+
this.logger.warn(`No handler found for pattern: ${pattern}`);
|
|
50
|
+
}
|
|
51
|
+
this.configs.channel.ack(message);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
callback();
|
|
56
|
+
} catch (error) {
|
|
57
|
+
this.logger.error('Failed to connect to RabbitMQ', error);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async close() {
|
|
61
|
+
await this.configs.channel.close();
|
|
62
|
+
await this.configs.connection.close();
|
|
63
|
+
this.logger.log('RabbitMQ connection closed.');
|
|
64
|
+
}
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
66
|
+
on(_event, _callback) {
|
|
67
|
+
throw new _common.NotImplementedException();
|
|
68
|
+
}
|
|
69
|
+
unwrap() {
|
|
70
|
+
throw new _common.NotImplementedException();
|
|
71
|
+
}
|
|
72
|
+
constructor(configService){
|
|
73
|
+
super(), this.configService = configService, this.logger = new _common.Logger(MultiQueueRabbitMQServer.name);
|
|
74
|
+
this.options = {
|
|
75
|
+
queues: [
|
|
76
|
+
// holds messages about creating and updating assets such as users, vehicles
|
|
77
|
+
'assets',
|
|
78
|
+
// holds authentication messages
|
|
79
|
+
'auth',
|
|
80
|
+
// holds messages about maps calculations
|
|
81
|
+
'maps',
|
|
82
|
+
// holds messages about orders updates, such as `orders.received`
|
|
83
|
+
'orders'
|
|
84
|
+
],
|
|
85
|
+
// `MICROSERVICE_URLS` is multiple space-separated urls separated
|
|
86
|
+
connection: this.configService.get('MICROSERVICE_URLS', 'amqp://localhost:5672').split(' ')[0]
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=multi-queue-rabbitmq-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/configs/multi-queue-rabbitmq-server.ts"],"sourcesContent":["import { type CustomTransportStrategy, Server } from '@nestjs/microservices';\nimport { Logger, NotImplementedException } from '@nestjs/common';\nimport { type Channel, type ChannelModel, connect } from 'amqplib';\nimport { ConfigService } from '@nestjs/config';\n\nexport interface MultiQueueOptions {\n connection: ChannelModel | string;\n queues: string[];\n channel?: Channel;\n}\n\n/**\n * the final configs after resolving the provided options\n */\nexport interface MultiQueueConfigs extends Omit<\n Required<MultiQueueOptions>,\n 'connection'\n> {\n connection: ChannelModel;\n}\n\n/**\n * a custom RabbitMQ transport that creates multiple queues in a single channel\n * https://docs.nestjs.com/microservices/custom-transport\n */\n// todo: options: channel, queues[], method= sendToQueue|publish, logLevel=dev?info:log\n\nexport class MultiQueueRabbitMQServer\n extends Server\n implements CustomTransportStrategy\n{\n protected readonly logger = new Logger(MultiQueueRabbitMQServer.name);\n // todo: pass options in the constructor using DI token\n private options: MultiQueueOptions;\n private _configs: MultiQueueConfigs;\n\n constructor(private readonly configService: ConfigService) {\n super();\n\n this.options = {\n queues: [\n // holds messages about creating and updating assets such as users, vehicles\n 'assets',\n // holds authentication messages\n 'auth',\n // holds messages about maps calculations\n 'maps',\n // holds messages about orders updates, such as `orders.received`\n 'orders',\n ],\n // `MICROSERVICE_URLS` is multiple space-separated urls separated\n connection: this.configService\n .get<string>('MICROSERVICE_URLS', 'amqp://localhost:5672')\n .split(' ')[0],\n };\n }\n\n get configs() {\n return this._configs;\n }\n\n async listen(callback: () => void) {\n try {\n let connection =\n typeof this.options.connection === 'string'\n ? await connect(this.options.connection)\n : this.options.connection;\n\n this._configs = {\n ...this.options,\n connection,\n channel: this.options.channel || (await connection.createChannel()),\n };\n\n this.logger.log('Successfully connected to RabbitMQ.');\n\n for (let queue of this.options.queues) {\n await this.configs.channel.assertQueue(queue, { durable: true });\n this.logger.log(`Listening on queue: ${queue}`);\n\n await this.configs.channel.consume(queue, (message) => {\n let content = message?.content.toString();\n\n if (content) {\n let { pattern, data } = JSON.parse(content);\n let handler = this.messageHandlers.get(pattern);\n\n if (handler) {\n void handler(data).then((res) => {\n if (message?.properties?.replyTo) {\n // ✅ Check if replyTo exists\n this.configs.channel.sendToQueue(\n message.properties.replyTo,\n Buffer.from(JSON.stringify(res)),\n {\n correlationId: message.properties.correlationId,\n },\n );\n } else {\n this.logger.warn(\n `No replyTo queue specified for pattern: ${pattern}`,\n );\n }\n });\n } else {\n this.logger.warn(`No handler found for pattern: ${pattern}`);\n }\n\n this.configs.channel.ack(message!);\n }\n });\n }\n\n callback();\n } catch (error) {\n this.logger.error('Failed to connect to RabbitMQ', error);\n }\n }\n\n async close() {\n await this.configs.channel.close();\n await this.configs.connection.close();\n this.logger.log('RabbitMQ connection closed.');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n on(_event: string, _callback: Function) {\n throw new NotImplementedException();\n }\n\n unwrap<T = never>(): T {\n throw new NotImplementedException();\n }\n}\n"],"names":["MultiQueueRabbitMQServer","Server","configs","_configs","listen","callback","connection","options","connect","channel","createChannel","logger","log","queue","queues","assertQueue","durable","consume","message","content","toString","pattern","data","JSON","parse","handler","messageHandlers","get","then","res","properties","replyTo","sendToQueue","Buffer","from","stringify","correlationId","warn","ack","error","close","on","_event","_callback","NotImplementedException","unwrap","configService","Logger","name","split"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "redisConnfig", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return redisConnfig;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const redisConnfig = {
|
|
12
|
+
port: Number.parseInt(process.env.REDIS_PORT || '6379', 10),
|
|
13
|
+
redisUrl: process.env.REDIS_URL || 'redis://redis'
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=redis-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/configs/redis-config.ts"],"sourcesContent":["export interface RedisConfig {\n redisUrl: string;\n port: number;\n}\n\nexport const redisConnfig: RedisConfig = {\n port: Number.parseInt(process.env.REDIS_PORT || '6379', 10),\n redisUrl: process.env.REDIS_URL || 'redis://redis',\n};\n"],"names":["redisConnfig","port","Number","parseInt","process","env","REDIS_PORT","redisUrl","REDIS_URL"],"mappings":";;;;+BAKaA;;;eAAAA;;;AAAN,MAAMA,eAA4B;IACvCC,MAAMC,OAAOC,QAAQ,CAACC,QAAQC,GAAG,CAACC,UAAU,IAAI,QAAQ;IACxDC,UAAUH,QAAQC,GAAG,CAACG,SAAS,IAAI;AACrC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "createApp", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return createApp;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _core = require("@nestjs/core");
|
|
12
|
+
const _swagger = require("@nestjs/swagger");
|
|
13
|
+
const _platformfastify = require("@nestjs/platform-fastify");
|
|
14
|
+
const _multipart = /*#__PURE__*/ _interop_require_default(require("@fastify/multipart"));
|
|
15
|
+
const _app = require("./configs/app");
|
|
16
|
+
const _common = require("@nestjs/common");
|
|
17
|
+
const _javascript = require("@impactor/javascript");
|
|
18
|
+
const _nodejs = require("@impactor/nodejs");
|
|
19
|
+
const _generatemetadata = require("./generate-metadata");
|
|
20
|
+
const _logger = require("./utils/logger");
|
|
21
|
+
function _interop_require_default(obj) {
|
|
22
|
+
return obj && obj.__esModule ? obj : {
|
|
23
|
+
default: obj
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function createApp(module, options) {
|
|
27
|
+
// todo: options.adapter = fastify | express
|
|
28
|
+
return _core.NestFactory.create(module, new _platformfastify.FastifyAdapter(), options).then(async (app)=>{
|
|
29
|
+
let pkg = typeof options?.package === 'string' ? (0, _nodejs.isDirSync)(options.package) ? (0, _nodejs.readSync)(`${options.package}/package.json`) : (0, _nodejs.readSync)(options.package) : options?.package || {};
|
|
30
|
+
let opts = (0, _javascript.merge)([
|
|
31
|
+
_app.appConfig,
|
|
32
|
+
{
|
|
33
|
+
swagger: {
|
|
34
|
+
info: {
|
|
35
|
+
title: pkg.name,
|
|
36
|
+
description: pkg.description || `${pkg.name ? `${pkg.name} ` : ''}API`,
|
|
37
|
+
version: `v${pkg.version || '1.0'}`
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
options
|
|
42
|
+
], {
|
|
43
|
+
deep: true
|
|
44
|
+
});
|
|
45
|
+
if (opts?.prefix) {
|
|
46
|
+
if (typeof opts.prefix === 'string') {
|
|
47
|
+
app.setGlobalPrefix(opts.prefix);
|
|
48
|
+
} else {
|
|
49
|
+
let { prefix, ...prefixOptions } = opts.prefix;
|
|
50
|
+
app.setGlobalPrefix(prefix, prefixOptions);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (opts.versioning) {
|
|
54
|
+
app.enableVersioning(opts.versioning);
|
|
55
|
+
}
|
|
56
|
+
app.useGlobalPipes(new _common.ValidationPipe({
|
|
57
|
+
// apply class-transformer decorators, such as @Transform()
|
|
58
|
+
transform: true,
|
|
59
|
+
// Strip out any properties that are not defined in your DTO.
|
|
60
|
+
whitelist: true,
|
|
61
|
+
// Instead of silently removing unknown fields, it throws a 400 error.
|
|
62
|
+
forbidNonWhitelisted: true,
|
|
63
|
+
...opts.validationPipe
|
|
64
|
+
}));
|
|
65
|
+
// swagger docs
|
|
66
|
+
// navigate to localhost:PORT to see API docs
|
|
67
|
+
// navigate to localhost:PORT/-json to download the API json file
|
|
68
|
+
if (opts.swagger) {
|
|
69
|
+
// emit swagger metadata
|
|
70
|
+
// this file will be generated in runtime
|
|
71
|
+
// todo: when emitting swagger metadata using generateSwaggerMetadata(),
|
|
72
|
+
// the TSDocs comments are no longer read by nest,
|
|
73
|
+
// and we must manually add @ApiProperty() to all properties
|
|
74
|
+
let metadataPath = (0, _generatemetadata.generateSwaggerMetadata)({
|
|
75
|
+
// @ts-ignore `import.meta` requires `module: nodeNext`
|
|
76
|
+
outputDir: __dirname,
|
|
77
|
+
// fixes: src/nest-swagger-metadata.ts:2:1 - error TS2742:
|
|
78
|
+
// The inferred type of 'default' cannot be named without a reference to '../node_modules/@impactor/utils/src/dto/order.dto'.
|
|
79
|
+
// This is likely not portable. A type annotation is necessary.
|
|
80
|
+
transform: (content)=>content.replaceAll('../node_modules/@impactor/', '@impactor/')
|
|
81
|
+
});
|
|
82
|
+
// todo: the file by default is related to CWD(),
|
|
83
|
+
// change cwd of the target "serve" in nx.json to "{projectRoot}/dist"
|
|
84
|
+
await (0, _generatemetadata.loadSwaggerMetadata)(metadataPath).then(()=>_logger.logger.debug('Swagger metadata loaded'))// ignore if the metadata file hasn't generated
|
|
85
|
+
.catch((error)=>{
|
|
86
|
+
_logger.logger.warn(`Failed to load Swagger metadata`, error);
|
|
87
|
+
});
|
|
88
|
+
if (opts.swagger) {
|
|
89
|
+
let document = _swagger.SwaggerModule.createDocument(app, opts.swagger);
|
|
90
|
+
_swagger.SwaggerModule.setup('', app, document);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// todo: import `FastifyMulterModule` from '@nest-lab/fastify-multer' in the module
|
|
94
|
+
// that wants to receive files, instead of registering 'multipart' globally
|
|
95
|
+
if (opts.multipart !== false) {
|
|
96
|
+
await app.register(_multipart.default);
|
|
97
|
+
}
|
|
98
|
+
return opts.port ? app// if the server runs inside a container, it should bound to '0.0.0.0' instead of 'localhost' (the default)
|
|
99
|
+
// so it can listen to the external requests i.e. from the browser
|
|
100
|
+
.listen(opts.port, '0.0.0.0').then((_server)=>opts.onServerRun?.(app)).catch((error)=>opts.onServerError?.(error, app)).then(()=>app) : app;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=create-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/create-app.ts"],"sourcesContent":["import { NestFactory } from '@nestjs/core';\nimport { OpenAPIObject, SwaggerModule } from '@nestjs/swagger';\nimport {\n FastifyAdapter,\n type NestFastifyApplication,\n} from '@nestjs/platform-fastify';\nimport multiPart from '@fastify/multipart';\nimport { type IAppConfig, appConfig } from './configs/app';\nimport { ValidationPipe } from '@nestjs/common';\nimport { merge } from '@impactor/javascript';\nimport { isDirSync, readSync } from '@impactor/nodejs';\nimport {\n generateSwaggerMetadata,\n loadSwaggerMetadata,\n} from './generate-metadata';\nimport { logger } from './utils/logger';\n\n// todo: add type to `module`\nexport function createApp(module: any, options?: IAppConfig) {\n // todo: options.adapter = fastify | express\n return NestFactory.create<NestFastifyApplication>(\n module,\n new FastifyAdapter(),\n options,\n ).then(async (app) => {\n let pkg = (\n typeof options?.package === 'string'\n ? isDirSync(options.package)\n ? // todo: use IPackage interface\n readSync(`${options.package}/package.json`)\n : readSync(options.package)\n : options?.package || {}\n ) as Record<string, string>;\n\n let opts = merge(\n [\n appConfig,\n {\n swagger: {\n info: {\n title: pkg.name,\n description:\n pkg.description || `${pkg.name ? `${pkg.name} ` : ''}API`,\n version: `v${pkg.version || '1.0'}`,\n },\n },\n },\n options,\n ],\n {\n deep: true,\n },\n ) as IAppConfig;\n\n if (opts?.prefix) {\n if (typeof opts.prefix === 'string') {\n app.setGlobalPrefix(opts.prefix);\n } else {\n let { prefix, ...prefixOptions } = opts.prefix;\n app.setGlobalPrefix(prefix, prefixOptions);\n }\n }\n\n if (opts.versioning) {\n app.enableVersioning(opts.versioning);\n }\n\n app.useGlobalPipes(\n new ValidationPipe({\n // apply class-transformer decorators, such as @Transform()\n transform: true,\n // Strip out any properties that are not defined in your DTO.\n whitelist: true,\n // Instead of silently removing unknown fields, it throws a 400 error.\n forbidNonWhitelisted: true,\n ...opts.validationPipe,\n }),\n );\n\n // swagger docs\n // navigate to localhost:PORT to see API docs\n // navigate to localhost:PORT/-json to download the API json file\n if (opts.swagger) {\n // emit swagger metadata\n // this file will be generated in runtime\n // todo: when emitting swagger metadata using generateSwaggerMetadata(),\n // the TSDocs comments are no longer read by nest,\n // and we must manually add @ApiProperty() to all properties\n let metadataPath = generateSwaggerMetadata({\n // @ts-ignore `import.meta` requires `module: nodeNext`\n outputDir: import.meta.dirname,\n // fixes: src/nest-swagger-metadata.ts:2:1 - error TS2742:\n // The inferred type of 'default' cannot be named without a reference to '../node_modules/@impactor/utils/src/dto/order.dto'.\n // This is likely not portable. A type annotation is necessary.\n transform: (content) =>\n content.replaceAll('../node_modules/@impactor/', '@impactor/'),\n });\n\n // todo: the file by default is related to CWD(),\n // change cwd of the target \"serve\" in nx.json to \"{projectRoot}/dist\"\n await loadSwaggerMetadata(metadataPath)\n .then(() => logger.debug('Swagger metadata loaded'))\n // ignore if the metadata file hasn't generated\n .catch((error) => {\n logger.warn(`Failed to load Swagger metadata`, error);\n });\n\n if (opts.swagger) {\n let document = SwaggerModule.createDocument(\n app,\n opts.swagger as OpenAPIObject,\n );\n SwaggerModule.setup('', app, document);\n }\n }\n\n // todo: import `FastifyMulterModule` from '@nest-lab/fastify-multer' in the module\n // that wants to receive files, instead of registering 'multipart' globally\n if (opts.multipart !== false) {\n await app.register(multiPart);\n }\n\n return opts.port\n ? app\n // if the server runs inside a container, it should bound to '0.0.0.0' instead of 'localhost' (the default)\n // so it can listen to the external requests i.e. from the browser\n .listen(opts.port, '0.0.0.0')\n .then((_server) => opts.onServerRun?.(app))\n .catch((error) => opts.onServerError?.(error, app))\n .then(() => app)\n : app;\n });\n}\n"],"names":["createApp","module","options","NestFactory","create","FastifyAdapter","then","app","pkg","package","isDirSync","readSync","opts","merge","appConfig","swagger","info","title","name","description","version","deep","prefix","setGlobalPrefix","prefixOptions","versioning","enableVersioning","useGlobalPipes","ValidationPipe","transform","whitelist","forbidNonWhitelisted","validationPipe","metadataPath","generateSwaggerMetadata","outputDir","content","replaceAll","loadSwaggerMetadata","logger","debug","catch","error","warn","document","SwaggerModule","createDocument","setup","multipart","register","multiPart","port","listen","_server","onServerRun","onServerError"],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "createMicroservice", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return createMicroservice;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _core = require("@nestjs/core");
|
|
12
|
+
const _common = require("@nestjs/common");
|
|
13
|
+
const _wsexceptionfilter = require("./filters/ws-exception.filter");
|
|
14
|
+
const _typeormexceptionfilter = require("./filters/typeorm-exception.filter");
|
|
15
|
+
const _errortorpcexceptionfilter = require("./filters/error-to-rpc-exception.filter");
|
|
16
|
+
const _microservice = require("./configs/microservice");
|
|
17
|
+
function createMicroservice(// todo: `module: IEntryNestModule`
|
|
18
|
+
module, options) {
|
|
19
|
+
// @ts-expect-error Type 'Transport.TCP' is not assignable to type 'Transport.KAFKA'
|
|
20
|
+
let opts = {
|
|
21
|
+
..._microservice.microserviceOptions,
|
|
22
|
+
...options
|
|
23
|
+
};
|
|
24
|
+
// todo: merge with ./create-testing-microservice
|
|
25
|
+
// opts.testing? .createNestMicroservice(): createMicroservice()
|
|
26
|
+
return _core.NestFactory.createMicroservice(module, opts).then((app)=>{
|
|
27
|
+
app.useGlobalFilters(new _typeormexceptionfilter.TypeORMExceptionFilter(), // WS filters cannot registered globally, you need to add `@UseFilters()` to each gateway
|
|
28
|
+
// from docs: "The useGlobalFilters() method does not set up filters for gateways or hybrid applications"
|
|
29
|
+
// https://docs.nestjs.com/exception-filters#binding-filters
|
|
30
|
+
new _wsexceptionfilter.WebSocketExceptionFilter(), new _errortorpcexceptionfilter.ErrorToRpcExceptionFilter());
|
|
31
|
+
app.useGlobalPipes(new _common.ValidationPipe({
|
|
32
|
+
whitelist: true,
|
|
33
|
+
transform: true,
|
|
34
|
+
// forbidNonWhitelisted: true,
|
|
35
|
+
transformOptions: {
|
|
36
|
+
enableImplicitConversion: true
|
|
37
|
+
}
|
|
38
|
+
}));
|
|
39
|
+
return app.listen().then((_server)=>opts?.onServerRun?.(app)).catch((error)=>opts?.onServerError?.(error, app)).then(()=>app);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=create-microservice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/create-microservice.ts"],"sourcesContent":["import { NestFactory } from '@nestjs/core';\nimport { ValidationPipe } from '@nestjs/common';\nimport { type MicroserviceOptions } from '@nestjs/microservices';\nimport { WebSocketExceptionFilter } from './filters/ws-exception.filter';\nimport { TypeORMExceptionFilter } from './filters/typeorm-exception.filter';\nimport { ErrorToRpcExceptionFilter } from './filters/error-to-rpc-exception.filter';\nimport {\n IMicroserviceOptions,\n microserviceOptions,\n} from './configs/microservice';\n\n/**\n * Create a NestJs microservice\n * @param module the main module (AppModule)\n * @param microserviceOptions\n * @param appOptions\n * @returns\n */\nexport function createMicroservice(\n // todo: `module: IEntryNestModule`\n module: any,\n options?: IMicroserviceOptions,\n) {\n // @ts-expect-error Type 'Transport.TCP' is not assignable to type 'Transport.KAFKA'\n let opts: IMicroserviceOptions = {\n ...microserviceOptions,\n ...options,\n };\n\n // todo: merge with ./create-testing-microservice\n // opts.testing? .createNestMicroservice(): createMicroservice()\n return NestFactory.createMicroservice<MicroserviceOptions>(module, opts).then(\n (app) => {\n app.useGlobalFilters(\n new TypeORMExceptionFilter(),\n // WS filters cannot registered globally, you need to add `@UseFilters()` to each gateway\n // from docs: \"The useGlobalFilters() method does not set up filters for gateways or hybrid applications\"\n // https://docs.nestjs.com/exception-filters#binding-filters\n new WebSocketExceptionFilter(),\n new ErrorToRpcExceptionFilter(),\n );\n\n app.useGlobalPipes(\n new ValidationPipe({\n whitelist: true,\n transform: true,\n // forbidNonWhitelisted: true,\n transformOptions: {\n enableImplicitConversion: true,\n },\n }),\n );\n\n return app\n .listen()\n .then((_server) => opts?.onServerRun?.(app))\n .catch((error) => opts?.onServerError?.(error, app))\n .then(() => app);\n },\n );\n}\n"],"names":["createMicroservice","module","options","opts","microserviceOptions","NestFactory","then","app","useGlobalFilters","TypeORMExceptionFilter","WebSocketExceptionFilter","ErrorToRpcExceptionFilter","useGlobalPipes","ValidationPipe","whitelist","transform","transformOptions","enableImplicitConversion","listen","_server","onServerRun","catch","error","onServerError"],"mappings":";;;;+BAkBgBA;;;eAAAA;;;sBAlBY;wBACG;mCAEU;wCACF;2CACG;8BAInC;AASA,SAASA,mBACd,mCAAmC;AACnCC,MAAW,EACXC,OAA8B;IAE9B,qFAAqF;IACrF,IAAIC,OAA6B;QAC/B,GAAGC,iCAAmB;QACtB,GAAGF,OAAO;IACZ;IAEA,iDAAiD;IACjD,gEAAgE;IAChE,OAAOG,iBAAW,CAACL,kBAAkB,CAAsBC,QAAQE,MAAMG,IAAI,CAC3E,CAACC;QACCA,IAAIC,gBAAgB,CAClB,IAAIC,8CAAsB,IAC1B,yFAAyF;QACzF,yGAAyG;QACzG,4DAA4D;QAC5D,IAAIC,2CAAwB,IAC5B,IAAIC,oDAAyB;QAG/BJ,IAAIK,cAAc,CAChB,IAAIC,sBAAc,CAAC;YACjBC,WAAW;YACXC,WAAW;YACX,8BAA8B;YAC9BC,kBAAkB;gBAChBC,0BAA0B;YAC5B;QACF;QAGF,OAAOV,IACJW,MAAM,GACNZ,IAAI,CAAC,CAACa,UAAYhB,MAAMiB,cAAcb,MACtCc,KAAK,CAAC,CAACC,QAAUnB,MAAMoB,gBAAgBD,OAAOf,MAC9CD,IAAI,CAAC,IAAMC;IAChB;AAEJ"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "createTestingMicroservice", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return createTestingMicroservice;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _common = require("@nestjs/common");
|
|
12
|
+
const _microservices = require("@nestjs/microservices");
|
|
13
|
+
const _typeormexceptionfilter = require("./filters/typeorm-exception.filter");
|
|
14
|
+
const _wsexceptionfilter = require("./filters/ws-exception.filter");
|
|
15
|
+
const _microservice = require("./configs/microservice");
|
|
16
|
+
function createTestingMicroservice(module, options = {}) {
|
|
17
|
+
// @ts-expect-error Type 'Transport.TCP' is not assignable to type 'Transport.KAFKA'
|
|
18
|
+
let opts = {
|
|
19
|
+
..._microservice.microserviceOptions,
|
|
20
|
+
...options
|
|
21
|
+
};
|
|
22
|
+
let app = module.createNestMicroservice(opts);
|
|
23
|
+
app.useGlobalFilters(new _typeormexceptionfilter.TypeORMExceptionFilter(), new _wsexceptionfilter.WebSocketExceptionFilter());
|
|
24
|
+
app.useGlobalPipes(new _common.ValidationPipe({
|
|
25
|
+
exceptionFactory: (errors)=>new _microservices.RpcException(errors)
|
|
26
|
+
}));
|
|
27
|
+
return app.listen().then((_server)=>opts?.onServerRun?.(app)).catch((error)=>opts?.onServerError?.(error, app)).then(()=>app);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=create-testing-microservice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/create-testing-microservice.ts"],"sourcesContent":["import { ValidationPipe } from '@nestjs/common';\nimport { type MicroserviceOptions, RpcException } from '@nestjs/microservices';\nimport { TestingModule } from '@nestjs/testing';\nimport { TypeORMExceptionFilter } from './filters/typeorm-exception.filter';\nimport { WebSocketExceptionFilter } from './filters/ws-exception.filter';\nimport {\n IMicroserviceOptions,\n microserviceOptions,\n} from './configs/microservice';\n\n/**\n * Create a testing Nestjs Microservice\n * see createMicroservice()\n * @param module\n * @param options\n * @returns\n */\nexport function createTestingMicroservice(\n module: TestingModule,\n options: IMicroserviceOptions = {},\n) {\n // @ts-expect-error Type 'Transport.TCP' is not assignable to type 'Transport.KAFKA'\n let opts: IMicroserviceOptions = {\n ...microserviceOptions,\n ...options,\n };\n\n let app = module.createNestMicroservice<MicroserviceOptions>(opts);\n\n app.useGlobalFilters(\n new TypeORMExceptionFilter(),\n new WebSocketExceptionFilter(),\n );\n\n app.useGlobalPipes(\n new ValidationPipe({\n exceptionFactory: (errors) => new RpcException(errors),\n }),\n );\n return app\n .listen()\n .then((_server) => opts?.onServerRun?.(app))\n .catch((error) => opts?.onServerError?.(error, app))\n .then(() => app);\n}\n"],"names":["createTestingMicroservice","module","options","opts","microserviceOptions","app","createNestMicroservice","useGlobalFilters","TypeORMExceptionFilter","WebSocketExceptionFilter","useGlobalPipes","ValidationPipe","exceptionFactory","errors","RpcException","listen","then","_server","onServerRun","catch","error","onServerError"],"mappings":";;;;+BAiBgBA;;;eAAAA;;;wBAjBe;+BACwB;wCAEhB;mCACE;8BAIlC;AASA,SAASA,0BACdC,MAAqB,EACrBC,UAAgC,CAAC,CAAC;IAElC,qFAAqF;IACrF,IAAIC,OAA6B;QAC/B,GAAGC,iCAAmB;QACtB,GAAGF,OAAO;IACZ;IAEA,IAAIG,MAAMJ,OAAOK,sBAAsB,CAAsBH;IAE7DE,IAAIE,gBAAgB,CAClB,IAAIC,8CAAsB,IAC1B,IAAIC,2CAAwB;IAG9BJ,IAAIK,cAAc,CAChB,IAAIC,sBAAc,CAAC;QACjBC,kBAAkB,CAACC,SAAW,IAAIC,2BAAY,CAACD;IACjD;IAEF,OAAOR,IACJU,MAAM,GACNC,IAAI,CAAC,CAACC,UAAYd,MAAMe,cAAcb,MACtCc,KAAK,CAAC,CAACC,QAAUjB,MAAMkB,gBAAgBD,OAAOf,MAC9CW,IAAI,CAAC,IAAMX;AAChB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "addControllerPath", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return addControllerPath;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _common = require("@nestjs/common");
|
|
12
|
+
const _reflect = require("../utils/reflect");
|
|
13
|
+
function addControllerPath(factory) {
|
|
14
|
+
if ((0, _reflect.has)('path', factory) || factory.options.path === null) return;
|
|
15
|
+
let path = factory.options.path;
|
|
16
|
+
if (path) {
|
|
17
|
+
// todo: `@Controller()` can also take an options object
|
|
18
|
+
factory.decorators.push((0, _common.Controller)(path));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=add-controller-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/decorators/controller/add-decorators/add-controller-path.ts"],"sourcesContent":["import { Controller } from '@nestjs/common';\nimport { ControllerFactory } from '../controller.factory';\nimport { has } from '../utils/reflect';\n\n/**\n * add Nest `@Controller()` decorator\n */\nexport function addControllerPath(factory: ControllerFactory) {\n if (has('path', factory) || factory.options.path === null) return;\n\n let path = factory.options.path;\n\n if (path) {\n // todo: `@Controller()` can also take an options object\n factory.decorators.push(Controller(path));\n }\n}\n"],"names":["addControllerPath","factory","has","options","path","decorators","push","Controller"],"mappings":";;;;+BAOgBA;;;eAAAA;;;wBAPW;yBAEP;AAKb,SAASA,kBAAkBC,OAA0B;IAC1D,IAAIC,IAAAA,YAAG,EAAC,QAAQD,YAAYA,QAAQE,OAAO,CAACC,IAAI,KAAK,MAAM;IAE3D,IAAIA,OAAOH,QAAQE,OAAO,CAACC,IAAI;IAE/B,IAAIA,MAAM;QACR,wDAAwD;QACxDH,QAAQI,UAAU,CAACC,IAAI,CAACC,IAAAA,kBAAU,EAACH;IACrC;AACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "addControllerTags", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return addControllerTags;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _reflect = require("../utils/reflect");
|
|
12
|
+
const _swagger = require("@nestjs/swagger");
|
|
13
|
+
function addControllerTags(factory, tags) {
|
|
14
|
+
// to get the metadata name, open the definition of `ApiResponse()`
|
|
15
|
+
// and check `Reflect.defineMetadata(/* metadata name */)`
|
|
16
|
+
// for `@nestjs/swagger`, decorators metadata are defined in `DECORATORS.*` constant
|
|
17
|
+
if ((0, _reflect.has)('swagger/apiUseTags', factory) || factory.options.tags === null) return;
|
|
18
|
+
tags = factory.options.tags || factory.options.path || (0, _reflect.get)('path', factory);
|
|
19
|
+
if (tags) {
|
|
20
|
+
if (Array.isArray(tags)) {
|
|
21
|
+
factory.decorators.push((0, _swagger.ApiTags)(...tags));
|
|
22
|
+
} else {
|
|
23
|
+
factory.decorators.push((0, _swagger.ApiTags)(tags));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=add-controller-tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/decorators/controller/add-decorators/add-controller-tags.ts"],"sourcesContent":["import { ControllerFactory } from '../controller.factory';\nimport { get, has } from '../utils/reflect';\nimport { ApiTags } from '@nestjs/swagger';\n\n/**\n * add Swagger `@ApiTags()` decorator\n */\nexport function addControllerTags(\n factory: ControllerFactory,\n tags?: string | string[],\n) {\n // to get the metadata name, open the definition of `ApiResponse()`\n // and check `Reflect.defineMetadata(/* metadata name */)`\n // for `@nestjs/swagger`, decorators metadata are defined in `DECORATORS.*` constant\n if (has('swagger/apiUseTags', factory) || factory.options.tags === null)\n return;\n\n tags = factory.options.tags || factory.options.path || get('path', factory);\n\n if (tags) {\n if (Array.isArray(tags)) {\n factory.decorators.push(ApiTags(...tags));\n } else {\n factory.decorators.push(ApiTags(tags));\n }\n }\n}\n"],"names":["addControllerTags","factory","tags","has","options","path","get","Array","isArray","decorators","push","ApiTags"],"mappings":";;;;+BAOgBA;;;eAAAA;;;yBANS;yBACD;AAKjB,SAASA,kBACdC,OAA0B,EAC1BC,IAAwB;IAExB,mEAAmE;IACnE,0DAA0D;IAC1D,oFAAoF;IACpF,IAAIC,IAAAA,YAAG,EAAC,sBAAsBF,YAAYA,QAAQG,OAAO,CAACF,IAAI,KAAK,MACjE;IAEFA,OAAOD,QAAQG,OAAO,CAACF,IAAI,IAAID,QAAQG,OAAO,CAACC,IAAI,IAAIC,IAAAA,YAAG,EAAC,QAAQL;IAEnE,IAAIC,MAAM;QACR,IAAIK,MAAMC,OAAO,CAACN,OAAO;YACvBD,QAAQQ,UAAU,CAACC,IAAI,CAACC,IAAAA,gBAAO,KAAIT;QACrC,OAAO;YACLD,QAAQQ,UAAU,CAACC,IAAI,CAACC,IAAAA,gBAAO,EAACT;QAClC;IACF;AACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "addHttpMethod", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return addHttpMethod;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _reflect = require("../utils/reflect");
|
|
12
|
+
const _common = require("@nestjs/common");
|
|
13
|
+
function addHttpMethod(route, factory) {
|
|
14
|
+
if ((0, _reflect.has)('method', factory, route)) return;
|
|
15
|
+
let map = {
|
|
16
|
+
POST: _common.Post,
|
|
17
|
+
PATCH: _common.Patch,
|
|
18
|
+
PUT: _common.Put,
|
|
19
|
+
DELETE: _common.Delete,
|
|
20
|
+
GET: _common.Get
|
|
21
|
+
};
|
|
22
|
+
let fn = map[route.httpMethod.toUpperCase()] || _common.Get;
|
|
23
|
+
// use @Get() or add "method" and "path" using Reflect.defineMetadata()
|
|
24
|
+
route.decorators.push(fn(route.path));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=add-http-method.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/decorators/controller/add-decorators/add-http-method.ts"],"sourcesContent":["import { has } from '../utils/reflect';\nimport { ControllerFactory } from '../controller.factory';\nimport type { IRoute } from '../types';\nimport { Delete, Get, Patch, Post, Put } from '@nestjs/common';\n\n/**\n * add NestJs http decorator to the route, such as \\@Get(\"/\")\n * @param route\n */\nexport function addHttpMethod(route: IRoute, factory: ControllerFactory) {\n if (has('method', factory, route)) return;\n\n let map = {\n POST: Post,\n PATCH: Patch,\n PUT: Put,\n DELETE: Delete,\n GET: Get,\n };\n\n let fn = map[route.httpMethod.toUpperCase() as keyof typeof map] || Get;\n\n // use @Get() or add \"method\" and \"path\" using Reflect.defineMetadata()\n route.decorators.push(fn(route.path));\n}\n"],"names":["addHttpMethod","route","factory","has","map","POST","Post","PATCH","Patch","PUT","Put","DELETE","Delete","GET","Get","fn","httpMethod","toUpperCase","decorators","push","path"],"mappings":";;;;+BASgBA;;;eAAAA;;;yBATI;wBAG0B;AAMvC,SAASA,cAAcC,KAAa,EAAEC,OAA0B;IACrE,IAAIC,IAAAA,YAAG,EAAC,UAAUD,SAASD,QAAQ;IAEnC,IAAIG,MAAM;QACRC,MAAMC,YAAI;QACVC,OAAOC,aAAK;QACZC,KAAKC,WAAG;QACRC,QAAQC,cAAM;QACdC,KAAKC,WAAG;IACV;IAEA,IAAIC,KAAKX,GAAG,CAACH,MAAMe,UAAU,CAACC,WAAW,GAAuB,IAAIH,WAAG;IAEvE,uEAAuE;IACvEb,MAAMiB,UAAU,CAACC,IAAI,CAACJ,GAAGd,MAAMmB,IAAI;AACrC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "addSwaggerBody", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return addSwaggerBody;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _reflect = require("../utils/reflect");
|
|
12
|
+
const _emptydto = require("../dto/empty.dto");
|
|
13
|
+
const _swagger = require("@nestjs/swagger");
|
|
14
|
+
function addSwaggerBody(route, factory) {
|
|
15
|
+
if ((0, _reflect.has)('swagger/apiResponse', factory, route)) return;
|
|
16
|
+
if (// todo: create DTO variations for each http method
|
|
17
|
+
// for example make all fields optional for PATCH
|
|
18
|
+
// todo: add ValidationPipe groups for each http method
|
|
19
|
+
[
|
|
20
|
+
'POST',
|
|
21
|
+
'PATCH',
|
|
22
|
+
'PUT'
|
|
23
|
+
].includes(route.httpMethod)) {
|
|
24
|
+
route.decorators.push((0, _swagger.ApiBody)({
|
|
25
|
+
type: route.model === null ? _emptydto.EmptyDto : route.model || factory.options?.model
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=add-swagger-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/decorators/controller/add-decorators/add-swagger-body.ts"],"sourcesContent":["import { has } from '../utils/reflect';\nimport { ControllerFactory } from '../controller.factory';\nimport { EmptyDto } from '../dto/empty.dto';\nimport type { HttpMethod, IRoute } from '../types';\nimport { ApiBody } from '@nestjs/swagger';\n\nexport function addSwaggerBody(route: IRoute, factory: ControllerFactory) {\n if (has('swagger/apiResponse', factory, route)) return;\n if (\n // todo: create DTO variations for each http method\n // for example make all fields optional for PATCH\n // todo: add ValidationPipe groups for each http method\n (<HttpMethod[]>['POST', 'PATCH', 'PUT']).includes(route.httpMethod)\n ) {\n route.decorators.push(\n ApiBody({\n type:\n route.model === null\n ? EmptyDto\n : route.model || factory.options?.model,\n }),\n );\n }\n}\n"],"names":["addSwaggerBody","route","factory","has","includes","httpMethod","decorators","push","ApiBody","type","model","EmptyDto","options"],"mappings":";;;;+BAMgBA;;;eAAAA;;;yBANI;0BAEK;yBAED;AAEjB,SAASA,eAAeC,KAAa,EAAEC,OAA0B;IACtE,IAAIC,IAAAA,YAAG,EAAC,uBAAuBD,SAASD,QAAQ;IAChD,IAIE,AAHA,mDAAmD;IACnD,iDAAiD;IACjD,uDAAuD;IACxC;QAAC;QAAQ;QAAS;KAAM,CAAEG,QAAQ,CAACH,MAAMI,UAAU,GAClE;QACAJ,MAAMK,UAAU,CAACC,IAAI,CACnBC,IAAAA,gBAAO,EAAC;YACNC,MACER,MAAMS,KAAK,KAAK,OACZC,kBAAQ,GACRV,MAAMS,KAAK,IAAIR,QAAQU,OAAO,EAAEF;QACxC;IAEJ;AACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "addSwaggerOperation", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return addSwaggerOperation;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _reflect = require("../utils/reflect");
|
|
12
|
+
const _swagger = require("@nestjs/swagger");
|
|
13
|
+
function addSwaggerOperation(route, factory) {
|
|
14
|
+
if ((0, _reflect.has)('swagger/apiOperation', factory, route)) return;
|
|
15
|
+
// remove "path" or add "prefix" metadata to it from the constructor
|
|
16
|
+
// to prevent displaying the path without the controller prefix in Swagger docs
|
|
17
|
+
let { path, ...operation } = route;
|
|
18
|
+
route.decorators.push((0, _swagger.ApiOperation)(operation));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=add-swagger-operation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/decorators/controller/add-decorators/add-swagger-operation.ts"],"sourcesContent":["import { has } from '../utils/reflect';\nimport { ControllerFactory } from '../controller.factory';\nimport type { IRoute } from '../types';\nimport { ApiOperation } from '@nestjs/swagger';\n\n/**\n * add Swagger's \\@ApiOperation()\n * @param route\n */\nexport function addSwaggerOperation(route: IRoute, factory: ControllerFactory) {\n if (has('swagger/apiOperation', factory, route)) return;\n\n // remove \"path\" or add \"prefix\" metadata to it from the constructor\n // to prevent displaying the path without the controller prefix in Swagger docs\n let { path, ...operation } = route;\n route.decorators.push(ApiOperation(operation));\n}\n"],"names":["addSwaggerOperation","route","factory","has","path","operation","decorators","push","ApiOperation"],"mappings":";;;;+BASgBA;;;eAAAA;;;yBATI;yBAGS;AAMtB,SAASA,oBAAoBC,KAAa,EAAEC,OAA0B;IAC3E,IAAIC,IAAAA,YAAG,EAAC,wBAAwBD,SAASD,QAAQ;IAEjD,oEAAoE;IACpE,+EAA+E;IAC/E,IAAI,EAAEG,IAAI,EAAE,GAAGC,WAAW,GAAGJ;IAC7BA,MAAMK,UAAU,CAACC,IAAI,CAACC,IAAAA,qBAAY,EAACH;AACrC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "addSwaggerParams", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return addSwaggerParams;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _reflect = require("../utils/reflect");
|
|
12
|
+
const _swagger = require("@nestjs/swagger");
|
|
13
|
+
function addSwaggerParams(route, factory) {
|
|
14
|
+
if ((0, _reflect.has)('swagger/apiParameters', factory, route)) return;
|
|
15
|
+
let queryParams = route.queryParams || factory.options?.queryParams;
|
|
16
|
+
queryParams?.map((param)=>{
|
|
17
|
+
// exclude params that doesn't match the route
|
|
18
|
+
if (param.many === false && route.many) return;
|
|
19
|
+
if (param.many === true && !route.many) return;
|
|
20
|
+
if (param.httpMethods && !param.httpMethods.includes(route.httpMethod)) return;
|
|
21
|
+
if (!param.type && [
|
|
22
|
+
'number',
|
|
23
|
+
'string'
|
|
24
|
+
].includes(typeof param.example)) param.type = typeof param.example;
|
|
25
|
+
else if (param.type === 'array' || Array.isArray(param?.example) && !param.type && !param.schema) {
|
|
26
|
+
param = {
|
|
27
|
+
schema: {
|
|
28
|
+
type: 'array',
|
|
29
|
+
items: {
|
|
30
|
+
type: 'string'
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
// add items as array to prevent sending items as v1%2Cv2 instead of v1,v2
|
|
34
|
+
// converts the array into ?key=v1,v2,...
|
|
35
|
+
style: 'form',
|
|
36
|
+
// don't generate separate params for each item
|
|
37
|
+
// i.e. ?key=v1&key=v2
|
|
38
|
+
explode: false,
|
|
39
|
+
...param
|
|
40
|
+
};
|
|
41
|
+
delete param.type;
|
|
42
|
+
}
|
|
43
|
+
// if param.required not provided, set it to false
|
|
44
|
+
param.required = !!param.required;
|
|
45
|
+
route.decorators.push((0, _swagger.ApiQuery)(param));
|
|
46
|
+
});
|
|
47
|
+
route.pathParams?.map((param)=>route.decorators.push((0, _swagger.ApiParam)(param)));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=add-swagger-params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/decorators/controller/add-decorators/add-swagger-params.ts"],"sourcesContent":["import { has } from '../utils/reflect';\nimport { ControllerFactory } from '../controller.factory';\nimport type { IRoute } from '../types';\nimport { ApiParam, ApiQuery } from '@nestjs/swagger';\n\n/**\n * add Swagger's \\@ApiQuery() and \\ApiParam() for each param\n * @param route\n */\nexport function addSwaggerParams(route: IRoute, factory: ControllerFactory) {\n if (has('swagger/apiParameters', factory, route)) return;\n\n let queryParams = route.queryParams || factory.options?.queryParams;\n queryParams?.map((param) => {\n // exclude params that doesn't match the route\n if (param.many === false && route.many) return;\n if (param.many === true && !route.many) return;\n\n if (param.httpMethods && !param.httpMethods.includes(route.httpMethod))\n return;\n\n if (!param.type && ['number', 'string'].includes(typeof param.example))\n param.type = typeof param.example;\n else if (\n param.type === 'array' ||\n (Array.isArray(param?.example) && !param.type && !param.schema)\n ) {\n param = {\n schema: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n // add items as array to prevent sending items as v1%2Cv2 instead of v1,v2\n // converts the array into ?key=v1,v2,...\n style: 'form',\n // don't generate separate params for each item\n // i.e. ?key=v1&key=v2\n explode: false,\n ...param,\n };\n\n delete param.type;\n }\n\n // if param.required not provided, set it to false\n param.required = !!param.required;\n\n route.decorators.push(ApiQuery(param));\n });\n\n route.pathParams?.map((param) => route.decorators.push(ApiParam(param)));\n}\n"],"names":["addSwaggerParams","route","factory","has","queryParams","options","map","param","many","httpMethods","includes","httpMethod","type","example","Array","isArray","schema","items","style","explode","required","decorators","push","ApiQuery","pathParams","ApiParam"],"mappings":";;;;+BASgBA;;;eAAAA;;;yBATI;yBAGe;AAM5B,SAASA,iBAAiBC,KAAa,EAAEC,OAA0B;IACxE,IAAIC,IAAAA,YAAG,EAAC,yBAAyBD,SAASD,QAAQ;IAElD,IAAIG,cAAcH,MAAMG,WAAW,IAAIF,QAAQG,OAAO,EAAED;IACxDA,aAAaE,IAAI,CAACC;QAChB,8CAA8C;QAC9C,IAAIA,MAAMC,IAAI,KAAK,SAASP,MAAMO,IAAI,EAAE;QACxC,IAAID,MAAMC,IAAI,KAAK,QAAQ,CAACP,MAAMO,IAAI,EAAE;QAExC,IAAID,MAAME,WAAW,IAAI,CAACF,MAAME,WAAW,CAACC,QAAQ,CAACT,MAAMU,UAAU,GACnE;QAEF,IAAI,CAACJ,MAAMK,IAAI,IAAI;YAAC;YAAU;SAAS,CAACF,QAAQ,CAAC,OAAOH,MAAMM,OAAO,GACnEN,MAAMK,IAAI,GAAG,OAAOL,MAAMM,OAAO;aAC9B,IACHN,MAAMK,IAAI,KAAK,WACdE,MAAMC,OAAO,CAACR,OAAOM,YAAY,CAACN,MAAMK,IAAI,IAAI,CAACL,MAAMS,MAAM,EAC9D;YACAT,QAAQ;gBACNS,QAAQ;oBACNJ,MAAM;oBACNK,OAAO;wBACLL,MAAM;oBACR;gBACF;gBACA,0EAA0E;gBAC1E,yCAAyC;gBACzCM,OAAO;gBACP,+CAA+C;gBAC/C,sBAAsB;gBACtBC,SAAS;gBACT,GAAGZ,KAAK;YACV;YAEA,OAAOA,MAAMK,IAAI;QACnB;QAEA,kDAAkD;QAClDL,MAAMa,QAAQ,GAAG,CAAC,CAACb,MAAMa,QAAQ;QAEjCnB,MAAMoB,UAAU,CAACC,IAAI,CAACC,IAAAA,iBAAQ,EAAChB;IACjC;IAEAN,MAAMuB,UAAU,EAAElB,IAAI,CAACC,QAAUN,MAAMoB,UAAU,CAACC,IAAI,CAACG,IAAAA,iBAAQ,EAAClB;AAClE"}
|