@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
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var util = require('@dereekb/util');
|
|
4
|
+
var nestjs = require('@dereekb/nestjs');
|
|
5
|
+
var common = require('@nestjs/common');
|
|
6
|
+
var crypto = require('crypto');
|
|
7
|
+
var config = require('@nestjs/config');
|
|
8
|
+
var apiClient = require('@typeform/api-client');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Creates a TypeformWebhookEvent and treats the data as the input type.
|
|
12
|
+
*
|
|
13
|
+
* @param event
|
|
14
|
+
* @returns
|
|
15
|
+
*/
|
|
16
|
+
function typeFormWebhookEvent(event) {
|
|
17
|
+
return event;
|
|
18
|
+
}
|
|
19
|
+
const typeformEventHandlerFactory = util.handlerFactory(x => x.event_type);
|
|
20
|
+
const typeformEventHandlerConfigurerFactory = util.handlerConfigurerFactory({
|
|
21
|
+
configurerForAccessor: accessor => {
|
|
22
|
+
// eslint-disable-next-line
|
|
23
|
+
const fnWithKey = util.handlerMappedSetFunctionFactory(accessor, typeFormWebhookEvent);
|
|
24
|
+
const configurer = {
|
|
25
|
+
...accessor,
|
|
26
|
+
handleFormResponse: fnWithKey('form_response')
|
|
27
|
+
};
|
|
28
|
+
return configurer;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const TYPEFORM_WEBHOOK_SECRET_TOKEN_ENV_VAR = 'TYPEFORM_WEBHOOK_SECRET_TOKEN';
|
|
33
|
+
/**
|
|
34
|
+
* Configuration for TypeformService
|
|
35
|
+
*/
|
|
36
|
+
class TypeformWebhookServiceConfig {
|
|
37
|
+
typeformWebhook;
|
|
38
|
+
static assertValidConfig(config) {
|
|
39
|
+
if (!config.typeformWebhook.secretToken) {
|
|
40
|
+
throw new Error('No Typeform webhook secret specified.');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/******************************************************************************
|
|
46
|
+
Copyright (c) Microsoft Corporation.
|
|
47
|
+
|
|
48
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
49
|
+
purpose with or without fee is hereby granted.
|
|
50
|
+
|
|
51
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
52
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
53
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
54
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
55
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
56
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
57
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
58
|
+
***************************************************************************** */
|
|
59
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
function __decorate(decorators, target, key, desc) {
|
|
63
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
64
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
65
|
+
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;
|
|
66
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function __param(paramIndex, decorator) {
|
|
70
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function __metadata(metadataKey, metadataValue) {
|
|
74
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
78
|
+
var e = new Error(message);
|
|
79
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Verifies a Typeform webhook event header.
|
|
84
|
+
*
|
|
85
|
+
* @param vapiSecretTokenGetter The Typeform secret token. The Vapi client allows for using an AsyncGetterOrValue type, so the verifier supports that as well.
|
|
86
|
+
* @returns A function that verifies a Typeform webhook event.
|
|
87
|
+
*/
|
|
88
|
+
function typeFormWebhookEventVerifier(config) {
|
|
89
|
+
const {
|
|
90
|
+
secret
|
|
91
|
+
} = config;
|
|
92
|
+
return async (request, rawBody) => {
|
|
93
|
+
const requestBodyString = String(request.body);
|
|
94
|
+
const headers = request.headers;
|
|
95
|
+
const vapiSignature = headers['typeform-signature'];
|
|
96
|
+
const hashForVerify = crypto.createHmac('sha256', secret).update(requestBodyString).digest('base64');
|
|
97
|
+
const signature = `sha256=${hashForVerify}`;
|
|
98
|
+
const valid = vapiSignature === signature;
|
|
99
|
+
const event = JSON.parse(requestBodyString);
|
|
100
|
+
const result = {
|
|
101
|
+
valid,
|
|
102
|
+
event
|
|
103
|
+
};
|
|
104
|
+
return result;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Service that makes system changes based on Typeform webhook events.
|
|
110
|
+
*/
|
|
111
|
+
exports.TypeformWebhookService = class TypeformWebhookService {
|
|
112
|
+
logger = new common.Logger('TypeformWebhookService');
|
|
113
|
+
_verifier;
|
|
114
|
+
handler = typeformEventHandlerFactory();
|
|
115
|
+
configure = typeformEventHandlerConfigurerFactory(this.handler);
|
|
116
|
+
constructor(typeFormWebhookServiceConfig) {
|
|
117
|
+
const {
|
|
118
|
+
secretToken: webhookSecret
|
|
119
|
+
} = typeFormWebhookServiceConfig.typeformWebhook;
|
|
120
|
+
this._verifier = typeFormWebhookEventVerifier({
|
|
121
|
+
secret: webhookSecret
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
async updateForWebhook(req, rawBody) {
|
|
125
|
+
const result = await this._verifier(req, rawBody);
|
|
126
|
+
if (!result.valid) {
|
|
127
|
+
this.logger.warn('Received invalid Typeform event.', req);
|
|
128
|
+
} else {
|
|
129
|
+
await this.updateForTypeformEvent(result.event);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async updateForTypeformEvent(event) {
|
|
133
|
+
const result = await this.handler(event);
|
|
134
|
+
if (!result) {
|
|
135
|
+
this.logger.warn('Received unexpected/unhandled Typeform event.', event);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
exports.TypeformWebhookService = __decorate([common.Injectable(), __param(0, common.Inject(TypeformWebhookServiceConfig)), __metadata("design:paramtypes", [TypeformWebhookServiceConfig])], exports.TypeformWebhookService);
|
|
140
|
+
|
|
141
|
+
exports.TypeformWebhookController = class TypeformWebhookController {
|
|
142
|
+
_typeformWebhookService;
|
|
143
|
+
constructor(typeformWebhookService) {
|
|
144
|
+
this._typeformWebhookService = typeformWebhookService;
|
|
145
|
+
}
|
|
146
|
+
async handleTypeformWebhook(req, rawBody) {
|
|
147
|
+
await this._typeformWebhookService.updateForWebhook(req, rawBody);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
__decorate([common.Post(), __param(0, common.Req()), __param(1, nestjs.RawBody()), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, Object]), __metadata("design:returntype", Promise)], exports.TypeformWebhookController.prototype, "handleTypeformWebhook", null);
|
|
151
|
+
exports.TypeformWebhookController = __decorate([common.Controller('/webhook/typeform'), __param(0, common.Inject(exports.TypeformWebhookService)), __metadata("design:paramtypes", [exports.TypeformWebhookService])], exports.TypeformWebhookController);
|
|
152
|
+
|
|
153
|
+
function typeFormWebhookServiceConfigFactory(configService) {
|
|
154
|
+
const config = {
|
|
155
|
+
typeformWebhook: {
|
|
156
|
+
secretToken: configService.get(TYPEFORM_WEBHOOK_SECRET_TOKEN_ENV_VAR)
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
TypeformWebhookServiceConfig.assertValidConfig(config);
|
|
160
|
+
return config;
|
|
161
|
+
}
|
|
162
|
+
exports.TypeformWebhookModule = class TypeformWebhookModule {};
|
|
163
|
+
exports.TypeformWebhookModule = __decorate([common.Module({
|
|
164
|
+
imports: [config.ConfigModule],
|
|
165
|
+
controllers: [exports.TypeformWebhookController],
|
|
166
|
+
providers: [{
|
|
167
|
+
provide: TypeformWebhookServiceConfig,
|
|
168
|
+
inject: [config.ConfigService],
|
|
169
|
+
useFactory: typeFormWebhookServiceConfigFactory
|
|
170
|
+
}, exports.TypeformWebhookService],
|
|
171
|
+
exports: [exports.TypeformWebhookService]
|
|
172
|
+
})], exports.TypeformWebhookModule);
|
|
173
|
+
|
|
174
|
+
function findTypeformTemplateRefsInString(input) {
|
|
175
|
+
/**
|
|
176
|
+
* Used to search the input string to find field refs like the following:
|
|
177
|
+
*
|
|
178
|
+
* {{field:8f7adc1e-c3b8-44bd-b00c-1b6c8de65797}}
|
|
179
|
+
* {{field:01H7G3DCZ1FZV4KYZGM755MXZZ}}
|
|
180
|
+
*/
|
|
181
|
+
const regex = /\{\{\s*(field)\s*:\s*([A-Za-z0-9-]+)\s*\}\}/g;
|
|
182
|
+
const matches = input.matchAll(regex);
|
|
183
|
+
const result = [];
|
|
184
|
+
for (const regexMatch of matches) {
|
|
185
|
+
const match = regexMatch[0]; // {{field:8f7adc1e-c3b8-44bd-b00c-1b6c8de65797}}
|
|
186
|
+
const type = regexMatch[1]; // field
|
|
187
|
+
const ref = regexMatch[2]; // 8f7adc1e-c3b8-44bd-b00c-1b6c8de65797
|
|
188
|
+
result.push({
|
|
189
|
+
type,
|
|
190
|
+
match,
|
|
191
|
+
ref
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Creates an ExpandedTypeformWebhookFormResponse from a TypeformWebhookFormResponse.
|
|
199
|
+
*/
|
|
200
|
+
function expandTypeformWebhookFormResponse(formResponse) {
|
|
201
|
+
const {
|
|
202
|
+
answers,
|
|
203
|
+
definition
|
|
204
|
+
} = formResponse;
|
|
205
|
+
const {
|
|
206
|
+
fields = []
|
|
207
|
+
} = definition;
|
|
208
|
+
const questionFieldMap = new Map(util.filterMaybeArrayValues(fields.map(x => x.id ? [x.id, x] : null)));
|
|
209
|
+
const answerValuePairs = answers.map(answer => makeTypeformFormResponseAnswerValuePair(answer));
|
|
210
|
+
const answerValueFieldRefMap = new Map(util.filterMaybeArrayValues(answerValuePairs.map(x => x.answer.field.ref ? [x.answer.field.ref, x] : null)));
|
|
211
|
+
function expandQuestionTitle(title) {
|
|
212
|
+
let result = title;
|
|
213
|
+
let hadReferenceInTitle = false;
|
|
214
|
+
if (result) {
|
|
215
|
+
const refsInTitle = findTypeformTemplateRefsInString(result);
|
|
216
|
+
if (refsInTitle.length > 0) {
|
|
217
|
+
hadReferenceInTitle = true;
|
|
218
|
+
refsInTitle.forEach(refInTitle => {
|
|
219
|
+
const {
|
|
220
|
+
match,
|
|
221
|
+
ref
|
|
222
|
+
} = refInTitle;
|
|
223
|
+
const fullMatch = match;
|
|
224
|
+
const answer = answerValueFieldRefMap.get(ref);
|
|
225
|
+
const answerValue = answer?.valueString;
|
|
226
|
+
const replacedTitle = result.replaceAll(fullMatch, answerValue || '');
|
|
227
|
+
result = replacedTitle;
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
questionTitle: result,
|
|
233
|
+
hadReferenceInTitle
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
const pairs = answerValuePairs.map(answerValue => {
|
|
237
|
+
const definitionField = questionFieldMap.get(answerValue.answer.field.id);
|
|
238
|
+
const {
|
|
239
|
+
questionTitle,
|
|
240
|
+
hadReferenceInTitle
|
|
241
|
+
} = expandQuestionTitle(definitionField?.title);
|
|
242
|
+
const result = {
|
|
243
|
+
...answerValue,
|
|
244
|
+
definitionField,
|
|
245
|
+
questionTitle,
|
|
246
|
+
hadReferenceInTitle
|
|
247
|
+
};
|
|
248
|
+
return result;
|
|
249
|
+
});
|
|
250
|
+
return {
|
|
251
|
+
formResponse,
|
|
252
|
+
pairs
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Creates a TypeformFormQuestionAnswerPair from a TypeformFormResponseAnswer.
|
|
257
|
+
*/
|
|
258
|
+
function makeTypeformFormResponseAnswerValuePair(answer) {
|
|
259
|
+
let value;
|
|
260
|
+
let valueString;
|
|
261
|
+
switch (answer.type) {
|
|
262
|
+
case 'number':
|
|
263
|
+
value = answer.number;
|
|
264
|
+
valueString = answer.number.toString();
|
|
265
|
+
break;
|
|
266
|
+
case 'boolean':
|
|
267
|
+
value = answer.boolean;
|
|
268
|
+
valueString = answer.boolean.toString();
|
|
269
|
+
break;
|
|
270
|
+
case 'email':
|
|
271
|
+
value = answer.email;
|
|
272
|
+
valueString = answer.email;
|
|
273
|
+
break;
|
|
274
|
+
case 'phone_number':
|
|
275
|
+
value = answer.phone_number;
|
|
276
|
+
valueString = answer.phone_number;
|
|
277
|
+
break;
|
|
278
|
+
case 'date':
|
|
279
|
+
value = answer.date;
|
|
280
|
+
valueString = answer.date;
|
|
281
|
+
break;
|
|
282
|
+
case 'payment':
|
|
283
|
+
value = answer.payment;
|
|
284
|
+
valueString = answer.payment.amount.toString();
|
|
285
|
+
break;
|
|
286
|
+
case 'text':
|
|
287
|
+
value = answer.text;
|
|
288
|
+
valueString = answer.text;
|
|
289
|
+
break;
|
|
290
|
+
case 'choices':
|
|
291
|
+
value = answer.choices;
|
|
292
|
+
valueString = answer.choices.other || util.joinStringsWithCommas(answer.choices.labels);
|
|
293
|
+
break;
|
|
294
|
+
case 'choice':
|
|
295
|
+
value = answer.choice;
|
|
296
|
+
valueString = answer.choice.other || answer.choice.label || '';
|
|
297
|
+
break;
|
|
298
|
+
case 'url':
|
|
299
|
+
value = answer.url;
|
|
300
|
+
valueString = answer.url;
|
|
301
|
+
break;
|
|
302
|
+
case 'file_url':
|
|
303
|
+
value = answer.file_url;
|
|
304
|
+
valueString = answer.file_url;
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
const result = {
|
|
308
|
+
answer,
|
|
309
|
+
value,
|
|
310
|
+
valueString
|
|
311
|
+
};
|
|
312
|
+
return result;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Default environment variable for the Typeform API key.
|
|
317
|
+
*/
|
|
318
|
+
const TYPEFORM_SECRET_TOKEN_ENV_VAR = 'TYPEFORM_SECRET_TOKEN';
|
|
319
|
+
const TYPEFORM_BASE_URL_ENV_VAR = 'TYPEFORM_BASE_URL';
|
|
320
|
+
/**
|
|
321
|
+
* Configuration for TypeformService
|
|
322
|
+
*/
|
|
323
|
+
class TypeformServiceConfig {
|
|
324
|
+
typeform;
|
|
325
|
+
static assertValidConfig(config) {
|
|
326
|
+
if (!config.typeform.config.token) {
|
|
327
|
+
throw new Error('No Typeform token specified.');
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
exports.TypeformApi = class TypeformApi {
|
|
333
|
+
config;
|
|
334
|
+
client;
|
|
335
|
+
constructor(config) {
|
|
336
|
+
this.config = config;
|
|
337
|
+
this.client = apiClient.createClient(config.typeform.config);
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
exports.TypeformApi = __decorate([common.Injectable(), __param(0, common.Inject(TypeformServiceConfig)), __metadata("design:paramtypes", [TypeformServiceConfig])], exports.TypeformApi);
|
|
341
|
+
|
|
342
|
+
function typeFormServiceConfigFactory(configService) {
|
|
343
|
+
const config = {
|
|
344
|
+
typeform: {
|
|
345
|
+
config: {
|
|
346
|
+
token: configService.get(TYPEFORM_SECRET_TOKEN_ENV_VAR),
|
|
347
|
+
baseURL: configService.get(TYPEFORM_BASE_URL_ENV_VAR) ?? undefined
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
TypeformServiceConfig.assertValidConfig(config);
|
|
352
|
+
return config;
|
|
353
|
+
}
|
|
354
|
+
exports.TypeformModule = class TypeformModule {};
|
|
355
|
+
exports.TypeformModule = __decorate([common.Module({
|
|
356
|
+
imports: [config.ConfigModule],
|
|
357
|
+
providers: [{
|
|
358
|
+
provide: TypeformServiceConfig,
|
|
359
|
+
inject: [config.ConfigService],
|
|
360
|
+
useFactory: typeFormServiceConfigFactory
|
|
361
|
+
}, exports.TypeformApi],
|
|
362
|
+
exports: [exports.TypeformApi]
|
|
363
|
+
})], exports.TypeformModule);
|
|
364
|
+
|
|
365
|
+
exports.TYPEFORM_BASE_URL_ENV_VAR = TYPEFORM_BASE_URL_ENV_VAR;
|
|
366
|
+
exports.TYPEFORM_SECRET_TOKEN_ENV_VAR = TYPEFORM_SECRET_TOKEN_ENV_VAR;
|
|
367
|
+
exports.TYPEFORM_WEBHOOK_SECRET_TOKEN_ENV_VAR = TYPEFORM_WEBHOOK_SECRET_TOKEN_ENV_VAR;
|
|
368
|
+
exports.TypeformServiceConfig = TypeformServiceConfig;
|
|
369
|
+
exports.TypeformWebhookServiceConfig = TypeformWebhookServiceConfig;
|
|
370
|
+
exports.expandTypeformWebhookFormResponse = expandTypeformWebhookFormResponse;
|
|
371
|
+
exports.findTypeformTemplateRefsInString = findTypeformTemplateRefsInString;
|
|
372
|
+
exports.makeTypeformFormResponseAnswerValuePair = makeTypeformFormResponseAnswerValuePair;
|
|
373
|
+
exports.typeFormServiceConfigFactory = typeFormServiceConfigFactory;
|
|
374
|
+
exports.typeFormWebhookEvent = typeFormWebhookEvent;
|
|
375
|
+
exports.typeFormWebhookEventVerifier = typeFormWebhookEventVerifier;
|
|
376
|
+
exports.typeFormWebhookServiceConfigFactory = typeFormWebhookServiceConfigFactory;
|
|
377
|
+
exports.typeformEventHandlerConfigurerFactory = typeformEventHandlerConfigurerFactory;
|
|
378
|
+
exports.typeformEventHandlerFactory = typeformEventHandlerFactory;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./src/index";
|