@dereekb/nestjs 12.6.21 → 13.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 +1 -1
- package/index.cjs.js +292 -0
- package/index.d.ts +1 -0
- package/index.esm.js +270 -0
- package/mailgun/index.cjs.js +646 -0
- package/mailgun/index.d.ts +1 -0
- package/mailgun/index.esm.js +633 -0
- package/mailgun/package.json +24 -3
- package/mailgun/src/lib/mailgun.d.ts +2 -2
- package/mailgun/src/lib/mailgun.type.d.ts +1 -1
- package/mailgun/src/lib/mailgun.util.d.ts +22 -17
- package/openai/index.cjs.js +310 -0
- package/openai/index.d.ts +1 -0
- package/openai/index.esm.js +293 -0
- package/openai/package.json +24 -5
- package/openai/src/lib/index.d.ts +0 -1
- package/openai/src/lib/webhook/webhook.openai.controller.d.ts +1 -1
- package/openai/src/lib/webhook/webhook.openai.d.ts +2 -2
- package/openai/src/lib/webhook/webhook.openai.service.d.ts +1 -1
- package/package.json +58 -28
- package/stripe/index.cjs.js +223 -0
- package/stripe/index.d.ts +1 -0
- package/stripe/index.esm.js +215 -0
- package/stripe/package.json +24 -5
- package/stripe/src/lib/index.d.ts +1 -1
- package/stripe/src/lib/stripe.module.d.ts +2 -2
- package/stripe/src/lib/webhook/webhook.stripe.controller.d.ts +1 -1
- package/typeform/index.cjs.js +378 -0
- package/typeform/index.d.ts +1 -0
- package/typeform/index.esm.js +363 -0
- package/typeform/package.json +24 -5
- package/typeform/src/lib/index.d.ts +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.controller.d.ts +1 -1
- package/vapiai/index.cjs.js +306 -0
- package/vapiai/index.d.ts +1 -0
- package/vapiai/index.esm.js +297 -0
- package/vapiai/package.json +24 -5
- package/vapiai/src/lib/index.d.ts +0 -1
- package/vapiai/src/lib/vapiai.type.d.ts +3 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.controller.d.ts +1 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.d.ts +1 -9
- package/vapiai/src/lib/webhook/webhook.vapiai.types.d.ts +6 -34
- package/CHANGELOG.md +0 -1997
- package/mailgun/LICENSE +0 -21
- package/mailgun/src/index.js +0 -5
- package/mailgun/src/index.js.map +0 -1
- package/mailgun/src/lib/index.js +0 -10
- package/mailgun/src/lib/index.js.map +0 -1
- package/mailgun/src/lib/mailgun.api.js +0 -37
- package/mailgun/src/lib/mailgun.api.js.map +0 -1
- package/mailgun/src/lib/mailgun.config.js +0 -45
- package/mailgun/src/lib/mailgun.config.js.map +0 -1
- package/mailgun/src/lib/mailgun.js +0 -205
- package/mailgun/src/lib/mailgun.js.map +0 -1
- package/mailgun/src/lib/mailgun.service.js +0 -53
- package/mailgun/src/lib/mailgun.service.js.map +0 -1
- package/mailgun/src/lib/mailgun.service.module.js +0 -84
- package/mailgun/src/lib/mailgun.service.module.js.map +0 -1
- package/mailgun/src/lib/mailgun.type.js +0 -3
- package/mailgun/src/lib/mailgun.type.js.map +0 -1
- package/mailgun/src/lib/mailgun.util.js +0 -206
- package/mailgun/src/lib/mailgun.util.js.map +0 -1
- package/openai/LICENSE +0 -21
- package/openai/src/index.js +0 -5
- package/openai/src/index.js.map +0 -1
- package/openai/src/lib/index.js +0 -11
- package/openai/src/lib/index.js.map +0 -1
- package/openai/src/lib/openai.api.js +0 -22
- package/openai/src/lib/openai.api.js.map +0 -1
- package/openai/src/lib/openai.config.js +0 -29
- package/openai/src/lib/openai.config.js.map +0 -1
- package/openai/src/lib/openai.module.js +0 -41
- package/openai/src/lib/openai.module.js.map +0 -1
- package/openai/src/lib/openai.type.js +0 -3
- package/openai/src/lib/openai.type.js.map +0 -1
- package/openai/src/lib/openai.util.js +0 -48
- package/openai/src/lib/openai.util.js.map +0 -1
- package/openai/src/lib/webhook/index.js +0 -10
- package/openai/src/lib/webhook/index.js.map +0 -1
- package/openai/src/lib/webhook/webhook.openai.config.js +0 -17
- package/openai/src/lib/webhook/webhook.openai.config.js.map +0 -1
- package/openai/src/lib/webhook/webhook.openai.controller.js +0 -30
- package/openai/src/lib/webhook/webhook.openai.controller.js.map +0 -1
- package/openai/src/lib/webhook/webhook.openai.js +0 -41
- package/openai/src/lib/webhook/webhook.openai.js.map +0 -1
- package/openai/src/lib/webhook/webhook.openai.module.js +0 -39
- package/openai/src/lib/webhook/webhook.openai.module.js.map +0 -1
- package/openai/src/lib/webhook/webhook.openai.service.js +0 -48
- package/openai/src/lib/webhook/webhook.openai.service.js.map +0 -1
- package/openai/src/lib/webhook/webhook.openai.verify.js +0 -37
- package/openai/src/lib/webhook/webhook.openai.verify.js.map +0 -1
- package/src/index.js +0 -5
- package/src/index.js.map +0 -1
- package/src/lib/decorators/index.js +0 -6
- package/src/lib/decorators/index.js.map +0 -1
- package/src/lib/decorators/local.decorator.js +0 -17
- package/src/lib/decorators/local.decorator.js.map +0 -1
- package/src/lib/decorators/rawbody.js +0 -44
- package/src/lib/decorators/rawbody.js.map +0 -1
- package/src/lib/index.js +0 -7
- package/src/lib/index.js.map +0 -1
- package/src/lib/middlewares/index.js +0 -7
- package/src/lib/middlewares/index.js.map +0 -1
- package/src/lib/middlewares/json.middleware.js +0 -16
- package/src/lib/middlewares/json.middleware.js.map +0 -1
- package/src/lib/middlewares/rawbody.middleware.js +0 -16
- package/src/lib/middlewares/rawbody.middleware.js.map +0 -1
- package/src/lib/middlewares/webhook.js +0 -51
- package/src/lib/middlewares/webhook.js.map +0 -1
- package/src/lib/module/client/client.config.js +0 -13
- package/src/lib/module/client/client.config.js.map +0 -1
- package/src/lib/module/client/client.js +0 -8
- package/src/lib/module/client/client.js.map +0 -1
- package/src/lib/module/client/client.module.js +0 -36
- package/src/lib/module/client/client.module.js.map +0 -1
- package/src/lib/module/client/client.service.js +0 -30
- package/src/lib/module/client/client.service.js.map +0 -1
- package/src/lib/module/client/index.js +0 -8
- package/src/lib/module/client/index.js.map +0 -1
- package/src/lib/module/env/env.config.js +0 -14
- package/src/lib/module/env/env.config.js.map +0 -1
- package/src/lib/module/env/env.js +0 -10
- package/src/lib/module/env/env.js.map +0 -1
- package/src/lib/module/env/env.nest.js +0 -16
- package/src/lib/module/env/env.nest.js.map +0 -1
- package/src/lib/module/env/env.service.js +0 -33
- package/src/lib/module/env/env.service.js.map +0 -1
- package/src/lib/module/env/index.js +0 -8
- package/src/lib/module/env/index.js.map +0 -1
- package/src/lib/module/index.js +0 -7
- package/src/lib/module/index.js.map +0 -1
- package/src/lib/module/module.js +0 -26
- package/src/lib/module/module.js.map +0 -1
- package/stripe/LICENSE +0 -21
- package/stripe/src/index.js +0 -5
- package/stripe/src/index.js.map +0 -1
- package/stripe/src/lib/index.js +0 -8
- package/stripe/src/lib/index.js.map +0 -1
- package/stripe/src/lib/stripe.api.js +0 -40
- package/stripe/src/lib/stripe.api.js.map +0 -1
- package/stripe/src/lib/stripe.config.js +0 -19
- package/stripe/src/lib/stripe.config.js.map +0 -1
- package/stripe/src/lib/stripe.module.js +0 -41
- package/stripe/src/lib/stripe.module.js.map +0 -1
- package/stripe/src/lib/stripe.type.js +0 -4
- package/stripe/src/lib/stripe.type.js.map +0 -1
- package/stripe/src/lib/webhook/index.js +0 -8
- package/stripe/src/lib/webhook/index.js.map +0 -1
- package/stripe/src/lib/webhook/webhook.stripe.controller.js +0 -30
- package/stripe/src/lib/webhook/webhook.stripe.controller.js.map +0 -1
- package/stripe/src/lib/webhook/webhook.stripe.js +0 -67
- package/stripe/src/lib/webhook/webhook.stripe.js.map +0 -1
- package/stripe/src/lib/webhook/webhook.stripe.module.js +0 -20
- package/stripe/src/lib/webhook/webhook.stripe.module.js.map +0 -1
- package/stripe/src/lib/webhook/webhook.stripe.service.js +0 -36
- package/stripe/src/lib/webhook/webhook.stripe.service.js.map +0 -1
- package/typeform/LICENSE +0 -21
- package/typeform/src/index.js +0 -5
- package/typeform/src/index.js.map +0 -1
- package/typeform/src/lib/index.js +0 -11
- package/typeform/src/lib/index.js.map +0 -1
- package/typeform/src/lib/typeform.api.js +0 -22
- package/typeform/src/lib/typeform.api.js.map +0 -1
- package/typeform/src/lib/typeform.config.js +0 -21
- package/typeform/src/lib/typeform.config.js.map +0 -1
- package/typeform/src/lib/typeform.module.js +0 -39
- package/typeform/src/lib/typeform.module.js.map +0 -1
- package/typeform/src/lib/typeform.type.js +0 -3
- package/typeform/src/lib/typeform.type.js.map +0 -1
- package/typeform/src/lib/typeform.util.js +0 -26
- package/typeform/src/lib/typeform.util.js.map +0 -1
- package/typeform/src/lib/webhook/index.js +0 -12
- package/typeform/src/lib/webhook/index.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.config.js +0 -17
- package/typeform/src/lib/webhook/webhook.typeform.config.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.controller.js +0 -30
- package/typeform/src/lib/webhook/webhook.typeform.controller.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.form.js +0 -113
- package/typeform/src/lib/webhook/webhook.typeform.form.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.js +0 -27
- package/typeform/src/lib/webhook/webhook.typeform.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.module.js +0 -38
- package/typeform/src/lib/webhook/webhook.typeform.module.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.service.js +0 -45
- package/typeform/src/lib/webhook/webhook.typeform.service.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.type.js +0 -3
- package/typeform/src/lib/webhook/webhook.typeform.type.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.verify.js +0 -28
- package/typeform/src/lib/webhook/webhook.typeform.verify.js.map +0 -1
- package/vapiai/LICENSE +0 -21
- package/vapiai/src/index.js +0 -5
- package/vapiai/src/index.js.map +0 -1
- package/vapiai/src/lib/index.js +0 -10
- package/vapiai/src/lib/index.js.map +0 -1
- package/vapiai/src/lib/vapiai.api.js +0 -32
- package/vapiai/src/lib/vapiai.api.js.map +0 -1
- package/vapiai/src/lib/vapiai.config.js +0 -17
- package/vapiai/src/lib/vapiai.config.js.map +0 -1
- package/vapiai/src/lib/vapiai.module.js +0 -38
- package/vapiai/src/lib/vapiai.module.js.map +0 -1
- package/vapiai/src/lib/vapiai.type.js +0 -3
- package/vapiai/src/lib/vapiai.type.js.map +0 -1
- package/vapiai/src/lib/webhook/index.js +0 -10
- package/vapiai/src/lib/webhook/index.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapi.config.js +0 -20
- package/vapiai/src/lib/webhook/webhook.vapi.config.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.controller.js +0 -38
- package/vapiai/src/lib/webhook/webhook.vapiai.controller.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.js +0 -42
- package/vapiai/src/lib/webhook/webhook.vapiai.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.module.js +0 -41
- package/vapiai/src/lib/webhook/webhook.vapiai.module.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.service.js +0 -52
- package/vapiai/src/lib/webhook/webhook.vapiai.service.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.types.js +0 -25
- package/vapiai/src/lib/webhook/webhook.vapiai.types.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.verify.js +0 -49
- package/vapiai/src/lib/webhook/webhook.vapiai.verify.js.map +0 -1
package/LICENSE
CHANGED
package/index.cjs.js
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var common = require('@nestjs/common');
|
|
4
|
+
var rawbody = require('raw-body');
|
|
5
|
+
var querystring = require('querystring');
|
|
6
|
+
var bodyParser = require('body-parser');
|
|
7
|
+
var util = require('@dereekb/util');
|
|
8
|
+
var config = require('@nestjs/config');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Returns true if the request is from localhost:4200.
|
|
12
|
+
*/
|
|
13
|
+
const IsRequestFromLocalHost = common.createParamDecorator((data, context) => {
|
|
14
|
+
return isLocalhost(context);
|
|
15
|
+
});
|
|
16
|
+
function isLocalhost(context) {
|
|
17
|
+
const req = context.switchToHttp().getRequest();
|
|
18
|
+
const origin = req.headers['origin'] ?? '';
|
|
19
|
+
return origin.startsWith('http://localhost') || origin.startsWith('https://localhost');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const ParseRawBody = common.createParamDecorator(async (_, context) => {
|
|
23
|
+
const req = context.switchToHttp().getRequest();
|
|
24
|
+
if (!req.readable) {
|
|
25
|
+
console.error('RawBody request was not readable. This is generally due to bad configuration.');
|
|
26
|
+
throw new common.BadRequestException('Invalid body');
|
|
27
|
+
}
|
|
28
|
+
const body = await rawbody(req);
|
|
29
|
+
return body;
|
|
30
|
+
});
|
|
31
|
+
const RawBody = common.createParamDecorator(async (_, context) => {
|
|
32
|
+
const req = context.switchToHttp().getRequest();
|
|
33
|
+
const body = req.body;
|
|
34
|
+
if (!Buffer.isBuffer(body)) {
|
|
35
|
+
console.error('RawBody expected a buffer set to req.body.');
|
|
36
|
+
throw new common.InternalServerErrorException('failed parsing body');
|
|
37
|
+
}
|
|
38
|
+
return body;
|
|
39
|
+
});
|
|
40
|
+
const ParsedQueryRawBody = common.createParamDecorator(async (_, context) => {
|
|
41
|
+
const req = context.switchToHttp().getRequest();
|
|
42
|
+
req.body = RawBodyToParsedQueryString(req.body);
|
|
43
|
+
return req.body;
|
|
44
|
+
});
|
|
45
|
+
function RawBodyToJson(rawBody) {
|
|
46
|
+
const string = RawBodyToString(rawBody);
|
|
47
|
+
return JSON.parse(string);
|
|
48
|
+
}
|
|
49
|
+
function RawBodyToParsedQueryString(rawBody) {
|
|
50
|
+
const string = RawBodyToString(rawBody);
|
|
51
|
+
return querystring.parse(string);
|
|
52
|
+
}
|
|
53
|
+
function RawBodyToString(rawBody) {
|
|
54
|
+
return rawBody.toString('utf8').trim();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/******************************************************************************
|
|
58
|
+
Copyright (c) Microsoft Corporation.
|
|
59
|
+
|
|
60
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
61
|
+
purpose with or without fee is hereby granted.
|
|
62
|
+
|
|
63
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
64
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
65
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
66
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
67
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
68
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
69
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
70
|
+
***************************************************************************** */
|
|
71
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
function __decorate(decorators, target, key, desc) {
|
|
75
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
76
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
77
|
+
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;
|
|
78
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function __param(paramIndex, decorator) {
|
|
82
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function __metadata(metadataKey, metadataValue) {
|
|
86
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
90
|
+
var e = new Error(message);
|
|
91
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
exports.JsonBodyMiddleware = class JsonBodyMiddleware {
|
|
95
|
+
use(req, res, next) {
|
|
96
|
+
bodyParser.json()(req, res, next);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
exports.JsonBodyMiddleware = __decorate([common.Injectable()], exports.JsonBodyMiddleware);
|
|
100
|
+
|
|
101
|
+
exports.RawBodyMiddleware = class RawBodyMiddleware {
|
|
102
|
+
use(req, res, next) {
|
|
103
|
+
bodyParser.raw({
|
|
104
|
+
type: '*/*'
|
|
105
|
+
})(req, res, next);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
exports.RawBodyMiddleware = __decorate([common.Injectable()], exports.RawBodyMiddleware);
|
|
109
|
+
|
|
110
|
+
const DEFAULT_BASE_WEBHOOK_PATH = '/webhook';
|
|
111
|
+
const DEFAULT_WEBHOOK_MIDDLEWARE_ROUTE_INFO = {
|
|
112
|
+
path: `${DEFAULT_BASE_WEBHOOK_PATH}/*`,
|
|
113
|
+
method: common.RequestMethod.POST
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Convenience class that configures a nestjs module (typically the root app module) to apply the proper middleware for handling webhooks.
|
|
117
|
+
*/
|
|
118
|
+
class AppModuleWithWebhooksEnabled {
|
|
119
|
+
configure(consumer) {
|
|
120
|
+
consumeWebhooksWithRawBodyMiddleware(consumer);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Convenience class that extends AppWithWebhooksEnabled.
|
|
125
|
+
*/
|
|
126
|
+
exports.ConfigureWebhookMiddlewareModule = class ConfigureWebhookMiddlewareModule extends AppModuleWithWebhooksEnabled {
|
|
127
|
+
logger = new common.Logger('ConfigureWebhookMiddlewareModule');
|
|
128
|
+
configure(consumer) {
|
|
129
|
+
super.configure(consumer);
|
|
130
|
+
this.logger.debug('Configured webhook routes with proper middleware.');
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
exports.ConfigureWebhookMiddlewareModule = __decorate([common.Module({})], exports.ConfigureWebhookMiddlewareModule);
|
|
134
|
+
/**
|
|
135
|
+
* Configures a MiddlewareConsumer to use RawBodyMiddleware for all POST requests to /webhook/*. All other routes are consumed with the JsonBodyMiddleware.
|
|
136
|
+
*
|
|
137
|
+
* This is required for various webhooks that require the full body to properly parse content.
|
|
138
|
+
*
|
|
139
|
+
* Be sure to also set bodyParsing: false in the nest app options.
|
|
140
|
+
*
|
|
141
|
+
* @param consumer
|
|
142
|
+
*/
|
|
143
|
+
function consumeWebhooksWithRawBodyMiddleware(consumer) {
|
|
144
|
+
// Configure the app to not parse the body for our webhook routes.
|
|
145
|
+
// https://stackoverflow.com/questions/54346465/access-raw-body-of-stripe-webhook-in-nest-js
|
|
146
|
+
consumer.apply(exports.RawBodyMiddleware).forRoutes(DEFAULT_WEBHOOK_MIDDLEWARE_ROUTE_INFO).apply(exports.JsonBodyMiddleware).forRoutes('*');
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Merges two module metadata entries together.
|
|
151
|
+
*
|
|
152
|
+
* @param base
|
|
153
|
+
* @param additional
|
|
154
|
+
* @returns
|
|
155
|
+
*/
|
|
156
|
+
function mergeModuleMetadata(base, additional = {}) {
|
|
157
|
+
return {
|
|
158
|
+
controllers: util.mergeArrays([base.controllers, additional.controllers]),
|
|
159
|
+
imports: util.mergeArrays([base.imports, additional.imports]),
|
|
160
|
+
exports: util.mergeArrays([base.exports, additional.exports]),
|
|
161
|
+
providers: util.mergeArrays([base.providers, additional.providers])
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function injectionTokensFromProviders(providers) {
|
|
165
|
+
return util.asArray(providers).map(x => {
|
|
166
|
+
return typeof x === 'object' ? x.provide : x;
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Environment variable that specfies the ClientWebAppUrl for your application
|
|
172
|
+
*/
|
|
173
|
+
const CLIENT_WEB_APP_URL_ENV_VAR = 'CLIENT_WEB_APP_URL';
|
|
174
|
+
|
|
175
|
+
class ClientAppServiceConfig {
|
|
176
|
+
client;
|
|
177
|
+
static assertValidConfig(config) {
|
|
178
|
+
if (!config.client.clientWebAppUrl) {
|
|
179
|
+
throw new Error('No client app url specified.');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Provides information about companion apps and websites for the project.
|
|
186
|
+
*/
|
|
187
|
+
exports.ClientAppService = class ClientAppService {
|
|
188
|
+
_config;
|
|
189
|
+
constructor(config) {
|
|
190
|
+
this._config = config;
|
|
191
|
+
}
|
|
192
|
+
get config() {
|
|
193
|
+
return this._config;
|
|
194
|
+
}
|
|
195
|
+
get webAppUrl() {
|
|
196
|
+
return this.config.client.clientWebAppUrl;
|
|
197
|
+
}
|
|
198
|
+
get webAppHost() {
|
|
199
|
+
return this.webAppUrl.split('://', 2)[1];
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
exports.ClientAppService = __decorate([common.Injectable(), __param(0, common.Inject(ClientAppServiceConfig)), __metadata("design:paramtypes", [ClientAppServiceConfig])], exports.ClientAppService);
|
|
203
|
+
|
|
204
|
+
function clientAppConfigFactory(configService) {
|
|
205
|
+
const config = {
|
|
206
|
+
client: {
|
|
207
|
+
clientWebAppUrl: configService.get(CLIENT_WEB_APP_URL_ENV_VAR)
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
ClientAppServiceConfig.assertValidConfig(config);
|
|
211
|
+
return config;
|
|
212
|
+
}
|
|
213
|
+
exports.ClientAppModule = class ClientAppModule {};
|
|
214
|
+
exports.ClientAppModule = __decorate([common.Module({
|
|
215
|
+
imports: [config.ConfigModule],
|
|
216
|
+
providers: [{
|
|
217
|
+
provide: ClientAppServiceConfig,
|
|
218
|
+
inject: [config.ConfigService],
|
|
219
|
+
useFactory: clientAppConfigFactory
|
|
220
|
+
}],
|
|
221
|
+
exports: [exports.ClientAppService]
|
|
222
|
+
})], exports.ClientAppModule);
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* A server environment configuration.
|
|
226
|
+
*
|
|
227
|
+
* Explicitly states whether or not this is a production environment, and optionally some other config.
|
|
228
|
+
*
|
|
229
|
+
* This config is not meant to replace other typical configurations, like .env files, but instead is part of the build system.
|
|
230
|
+
*/
|
|
231
|
+
class ServerEnvironmentConfig {}
|
|
232
|
+
|
|
233
|
+
// MARK: Tokens
|
|
234
|
+
/**
|
|
235
|
+
* Token to access a configured ServerEnvironmentServiceConfig for the app.
|
|
236
|
+
*/
|
|
237
|
+
const SERVER_ENV_TOKEN = 'SERVER_ENV_TOKEN';
|
|
238
|
+
function serverEnvTokenProvider(env) {
|
|
239
|
+
return {
|
|
240
|
+
provide: SERVER_ENV_TOKEN,
|
|
241
|
+
useValue: env
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Checks process.env.NODE_ENV for "test"
|
|
247
|
+
*/
|
|
248
|
+
function isTestNodeEnv() {
|
|
249
|
+
return process.env['NODE_ENV'] === 'test';
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
exports.ServerEnvironmentService = class ServerEnvironmentService {
|
|
253
|
+
env;
|
|
254
|
+
constructor(env) {
|
|
255
|
+
this.env = env;
|
|
256
|
+
}
|
|
257
|
+
get isTestingEnv() {
|
|
258
|
+
return isTestNodeEnv();
|
|
259
|
+
}
|
|
260
|
+
get isProduction() {
|
|
261
|
+
return this.env.production;
|
|
262
|
+
}
|
|
263
|
+
get isStaging() {
|
|
264
|
+
return Boolean(this.env.staging);
|
|
265
|
+
}
|
|
266
|
+
get developerToolsEnabled() {
|
|
267
|
+
return Boolean(!this.isProduction && this.env.developerToolsEnabled);
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
exports.ServerEnvironmentService = __decorate([common.Injectable(), __param(0, common.Inject(SERVER_ENV_TOKEN)), __metadata("design:paramtypes", [ServerEnvironmentConfig])], exports.ServerEnvironmentService);
|
|
271
|
+
|
|
272
|
+
exports.AppModuleWithWebhooksEnabled = AppModuleWithWebhooksEnabled;
|
|
273
|
+
exports.CLIENT_WEB_APP_URL_ENV_VAR = CLIENT_WEB_APP_URL_ENV_VAR;
|
|
274
|
+
exports.ClientAppServiceConfig = ClientAppServiceConfig;
|
|
275
|
+
exports.DEFAULT_BASE_WEBHOOK_PATH = DEFAULT_BASE_WEBHOOK_PATH;
|
|
276
|
+
exports.DEFAULT_WEBHOOK_MIDDLEWARE_ROUTE_INFO = DEFAULT_WEBHOOK_MIDDLEWARE_ROUTE_INFO;
|
|
277
|
+
exports.IsRequestFromLocalHost = IsRequestFromLocalHost;
|
|
278
|
+
exports.ParseRawBody = ParseRawBody;
|
|
279
|
+
exports.ParsedQueryRawBody = ParsedQueryRawBody;
|
|
280
|
+
exports.RawBody = RawBody;
|
|
281
|
+
exports.RawBodyToJson = RawBodyToJson;
|
|
282
|
+
exports.RawBodyToParsedQueryString = RawBodyToParsedQueryString;
|
|
283
|
+
exports.RawBodyToString = RawBodyToString;
|
|
284
|
+
exports.SERVER_ENV_TOKEN = SERVER_ENV_TOKEN;
|
|
285
|
+
exports.ServerEnvironmentConfig = ServerEnvironmentConfig;
|
|
286
|
+
exports.clientAppConfigFactory = clientAppConfigFactory;
|
|
287
|
+
exports.consumeWebhooksWithRawBodyMiddleware = consumeWebhooksWithRawBodyMiddleware;
|
|
288
|
+
exports.injectionTokensFromProviders = injectionTokensFromProviders;
|
|
289
|
+
exports.isLocalhost = isLocalhost;
|
|
290
|
+
exports.isTestNodeEnv = isTestNodeEnv;
|
|
291
|
+
exports.mergeModuleMetadata = mergeModuleMetadata;
|
|
292
|
+
exports.serverEnvTokenProvider = serverEnvTokenProvider;
|
package/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./src/index";
|
package/index.esm.js
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { createParamDecorator, BadRequestException, InternalServerErrorException, Injectable, RequestMethod, Module, Logger, Inject } from '@nestjs/common';
|
|
2
|
+
import rawbody from 'raw-body';
|
|
3
|
+
import { parse } from 'querystring';
|
|
4
|
+
import bodyParser from 'body-parser';
|
|
5
|
+
import { asArray, mergeArrays } from '@dereekb/util';
|
|
6
|
+
import { ConfigService, ConfigModule } from '@nestjs/config';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Returns true if the request is from localhost:4200.
|
|
10
|
+
*/
|
|
11
|
+
const IsRequestFromLocalHost = createParamDecorator((data, context) => {
|
|
12
|
+
return isLocalhost(context);
|
|
13
|
+
});
|
|
14
|
+
function isLocalhost(context) {
|
|
15
|
+
const req = context.switchToHttp().getRequest();
|
|
16
|
+
const origin = req.headers['origin'] ?? '';
|
|
17
|
+
return origin.startsWith('http://localhost') || origin.startsWith('https://localhost');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const ParseRawBody = createParamDecorator(async (_, context) => {
|
|
21
|
+
const req = context.switchToHttp().getRequest();
|
|
22
|
+
if (!req.readable) {
|
|
23
|
+
console.error('RawBody request was not readable. This is generally due to bad configuration.');
|
|
24
|
+
throw new BadRequestException('Invalid body');
|
|
25
|
+
}
|
|
26
|
+
const body = await rawbody(req);
|
|
27
|
+
return body;
|
|
28
|
+
});
|
|
29
|
+
const RawBody = createParamDecorator(async (_, context) => {
|
|
30
|
+
const req = context.switchToHttp().getRequest();
|
|
31
|
+
const body = req.body;
|
|
32
|
+
if (!Buffer.isBuffer(body)) {
|
|
33
|
+
console.error('RawBody expected a buffer set to req.body.');
|
|
34
|
+
throw new InternalServerErrorException('failed parsing body');
|
|
35
|
+
}
|
|
36
|
+
return body;
|
|
37
|
+
});
|
|
38
|
+
const ParsedQueryRawBody = createParamDecorator(async (_, context) => {
|
|
39
|
+
const req = context.switchToHttp().getRequest();
|
|
40
|
+
req.body = RawBodyToParsedQueryString(req.body);
|
|
41
|
+
return req.body;
|
|
42
|
+
});
|
|
43
|
+
function RawBodyToJson(rawBody) {
|
|
44
|
+
const string = RawBodyToString(rawBody);
|
|
45
|
+
return JSON.parse(string);
|
|
46
|
+
}
|
|
47
|
+
function RawBodyToParsedQueryString(rawBody) {
|
|
48
|
+
const string = RawBodyToString(rawBody);
|
|
49
|
+
return parse(string);
|
|
50
|
+
}
|
|
51
|
+
function RawBodyToString(rawBody) {
|
|
52
|
+
return rawBody.toString('utf8').trim();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/******************************************************************************
|
|
56
|
+
Copyright (c) Microsoft Corporation.
|
|
57
|
+
|
|
58
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
59
|
+
purpose with or without fee is hereby granted.
|
|
60
|
+
|
|
61
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
62
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
63
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
64
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
65
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
66
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
67
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
68
|
+
***************************************************************************** */
|
|
69
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
function __decorate(decorators, target, key, desc) {
|
|
73
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
74
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
75
|
+
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;
|
|
76
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function __param(paramIndex, decorator) {
|
|
80
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function __metadata(metadataKey, metadataValue) {
|
|
84
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
88
|
+
var e = new Error(message);
|
|
89
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
let JsonBodyMiddleware = class JsonBodyMiddleware {
|
|
93
|
+
use(req, res, next) {
|
|
94
|
+
bodyParser.json()(req, res, next);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
JsonBodyMiddleware = __decorate([Injectable()], JsonBodyMiddleware);
|
|
98
|
+
|
|
99
|
+
let RawBodyMiddleware = class RawBodyMiddleware {
|
|
100
|
+
use(req, res, next) {
|
|
101
|
+
bodyParser.raw({
|
|
102
|
+
type: '*/*'
|
|
103
|
+
})(req, res, next);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
RawBodyMiddleware = __decorate([Injectable()], RawBodyMiddleware);
|
|
107
|
+
|
|
108
|
+
const DEFAULT_BASE_WEBHOOK_PATH = '/webhook';
|
|
109
|
+
const DEFAULT_WEBHOOK_MIDDLEWARE_ROUTE_INFO = {
|
|
110
|
+
path: `${DEFAULT_BASE_WEBHOOK_PATH}/*`,
|
|
111
|
+
method: RequestMethod.POST
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Convenience class that configures a nestjs module (typically the root app module) to apply the proper middleware for handling webhooks.
|
|
115
|
+
*/
|
|
116
|
+
class AppModuleWithWebhooksEnabled {
|
|
117
|
+
configure(consumer) {
|
|
118
|
+
consumeWebhooksWithRawBodyMiddleware(consumer);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Convenience class that extends AppWithWebhooksEnabled.
|
|
123
|
+
*/
|
|
124
|
+
let ConfigureWebhookMiddlewareModule = class ConfigureWebhookMiddlewareModule extends AppModuleWithWebhooksEnabled {
|
|
125
|
+
logger = new Logger('ConfigureWebhookMiddlewareModule');
|
|
126
|
+
configure(consumer) {
|
|
127
|
+
super.configure(consumer);
|
|
128
|
+
this.logger.debug('Configured webhook routes with proper middleware.');
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
ConfigureWebhookMiddlewareModule = __decorate([Module({})], ConfigureWebhookMiddlewareModule);
|
|
132
|
+
/**
|
|
133
|
+
* Configures a MiddlewareConsumer to use RawBodyMiddleware for all POST requests to /webhook/*. All other routes are consumed with the JsonBodyMiddleware.
|
|
134
|
+
*
|
|
135
|
+
* This is required for various webhooks that require the full body to properly parse content.
|
|
136
|
+
*
|
|
137
|
+
* Be sure to also set bodyParsing: false in the nest app options.
|
|
138
|
+
*
|
|
139
|
+
* @param consumer
|
|
140
|
+
*/
|
|
141
|
+
function consumeWebhooksWithRawBodyMiddleware(consumer) {
|
|
142
|
+
// Configure the app to not parse the body for our webhook routes.
|
|
143
|
+
// https://stackoverflow.com/questions/54346465/access-raw-body-of-stripe-webhook-in-nest-js
|
|
144
|
+
consumer.apply(RawBodyMiddleware).forRoutes(DEFAULT_WEBHOOK_MIDDLEWARE_ROUTE_INFO).apply(JsonBodyMiddleware).forRoutes('*');
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Merges two module metadata entries together.
|
|
149
|
+
*
|
|
150
|
+
* @param base
|
|
151
|
+
* @param additional
|
|
152
|
+
* @returns
|
|
153
|
+
*/
|
|
154
|
+
function mergeModuleMetadata(base, additional = {}) {
|
|
155
|
+
return {
|
|
156
|
+
controllers: mergeArrays([base.controllers, additional.controllers]),
|
|
157
|
+
imports: mergeArrays([base.imports, additional.imports]),
|
|
158
|
+
exports: mergeArrays([base.exports, additional.exports]),
|
|
159
|
+
providers: mergeArrays([base.providers, additional.providers])
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function injectionTokensFromProviders(providers) {
|
|
163
|
+
return asArray(providers).map(x => {
|
|
164
|
+
return typeof x === 'object' ? x.provide : x;
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Environment variable that specfies the ClientWebAppUrl for your application
|
|
170
|
+
*/
|
|
171
|
+
const CLIENT_WEB_APP_URL_ENV_VAR = 'CLIENT_WEB_APP_URL';
|
|
172
|
+
|
|
173
|
+
class ClientAppServiceConfig {
|
|
174
|
+
client;
|
|
175
|
+
static assertValidConfig(config) {
|
|
176
|
+
if (!config.client.clientWebAppUrl) {
|
|
177
|
+
throw new Error('No client app url specified.');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Provides information about companion apps and websites for the project.
|
|
184
|
+
*/
|
|
185
|
+
let ClientAppService = class ClientAppService {
|
|
186
|
+
_config;
|
|
187
|
+
constructor(config) {
|
|
188
|
+
this._config = config;
|
|
189
|
+
}
|
|
190
|
+
get config() {
|
|
191
|
+
return this._config;
|
|
192
|
+
}
|
|
193
|
+
get webAppUrl() {
|
|
194
|
+
return this.config.client.clientWebAppUrl;
|
|
195
|
+
}
|
|
196
|
+
get webAppHost() {
|
|
197
|
+
return this.webAppUrl.split('://', 2)[1];
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
ClientAppService = __decorate([Injectable(), __param(0, Inject(ClientAppServiceConfig)), __metadata("design:paramtypes", [ClientAppServiceConfig])], ClientAppService);
|
|
201
|
+
|
|
202
|
+
function clientAppConfigFactory(configService) {
|
|
203
|
+
const config = {
|
|
204
|
+
client: {
|
|
205
|
+
clientWebAppUrl: configService.get(CLIENT_WEB_APP_URL_ENV_VAR)
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
ClientAppServiceConfig.assertValidConfig(config);
|
|
209
|
+
return config;
|
|
210
|
+
}
|
|
211
|
+
let ClientAppModule = class ClientAppModule {};
|
|
212
|
+
ClientAppModule = __decorate([Module({
|
|
213
|
+
imports: [ConfigModule],
|
|
214
|
+
providers: [{
|
|
215
|
+
provide: ClientAppServiceConfig,
|
|
216
|
+
inject: [ConfigService],
|
|
217
|
+
useFactory: clientAppConfigFactory
|
|
218
|
+
}],
|
|
219
|
+
exports: [ClientAppService]
|
|
220
|
+
})], ClientAppModule);
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* A server environment configuration.
|
|
224
|
+
*
|
|
225
|
+
* Explicitly states whether or not this is a production environment, and optionally some other config.
|
|
226
|
+
*
|
|
227
|
+
* This config is not meant to replace other typical configurations, like .env files, but instead is part of the build system.
|
|
228
|
+
*/
|
|
229
|
+
class ServerEnvironmentConfig {}
|
|
230
|
+
|
|
231
|
+
// MARK: Tokens
|
|
232
|
+
/**
|
|
233
|
+
* Token to access a configured ServerEnvironmentServiceConfig for the app.
|
|
234
|
+
*/
|
|
235
|
+
const SERVER_ENV_TOKEN = 'SERVER_ENV_TOKEN';
|
|
236
|
+
function serverEnvTokenProvider(env) {
|
|
237
|
+
return {
|
|
238
|
+
provide: SERVER_ENV_TOKEN,
|
|
239
|
+
useValue: env
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Checks process.env.NODE_ENV for "test"
|
|
245
|
+
*/
|
|
246
|
+
function isTestNodeEnv() {
|
|
247
|
+
return process.env['NODE_ENV'] === 'test';
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
let ServerEnvironmentService = class ServerEnvironmentService {
|
|
251
|
+
env;
|
|
252
|
+
constructor(env) {
|
|
253
|
+
this.env = env;
|
|
254
|
+
}
|
|
255
|
+
get isTestingEnv() {
|
|
256
|
+
return isTestNodeEnv();
|
|
257
|
+
}
|
|
258
|
+
get isProduction() {
|
|
259
|
+
return this.env.production;
|
|
260
|
+
}
|
|
261
|
+
get isStaging() {
|
|
262
|
+
return Boolean(this.env.staging);
|
|
263
|
+
}
|
|
264
|
+
get developerToolsEnabled() {
|
|
265
|
+
return Boolean(!this.isProduction && this.env.developerToolsEnabled);
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
ServerEnvironmentService = __decorate([Injectable(), __param(0, Inject(SERVER_ENV_TOKEN)), __metadata("design:paramtypes", [ServerEnvironmentConfig])], ServerEnvironmentService);
|
|
269
|
+
|
|
270
|
+
export { AppModuleWithWebhooksEnabled, CLIENT_WEB_APP_URL_ENV_VAR, ClientAppModule, ClientAppService, ClientAppServiceConfig, ConfigureWebhookMiddlewareModule, DEFAULT_BASE_WEBHOOK_PATH, DEFAULT_WEBHOOK_MIDDLEWARE_ROUTE_INFO, IsRequestFromLocalHost, JsonBodyMiddleware, ParseRawBody, ParsedQueryRawBody, RawBody, RawBodyMiddleware, RawBodyToJson, RawBodyToParsedQueryString, RawBodyToString, SERVER_ENV_TOKEN, ServerEnvironmentConfig, ServerEnvironmentService, clientAppConfigFactory, consumeWebhooksWithRawBodyMiddleware, injectionTokensFromProviders, isLocalhost, isTestNodeEnv, mergeModuleMetadata, serverEnvTokenProvider };
|