@dereekb/nestjs 13.0.0 → 13.0.1

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.
@@ -12,19 +12,19 @@ import { createClient } from '@typeform/api-client';
12
12
  * @returns
13
13
  */
14
14
  function typeFormWebhookEvent(event) {
15
- return event;
15
+ return event;
16
16
  }
17
- const typeformEventHandlerFactory = handlerFactory(x => x.event_type);
17
+ const typeformEventHandlerFactory = handlerFactory((x) => x.event_type);
18
18
  const typeformEventHandlerConfigurerFactory = handlerConfigurerFactory({
19
- configurerForAccessor: accessor => {
20
- // eslint-disable-next-line
21
- const fnWithKey = handlerMappedSetFunctionFactory(accessor, typeFormWebhookEvent);
22
- const configurer = {
23
- ...accessor,
24
- handleFormResponse: fnWithKey('form_response')
25
- };
26
- return configurer;
27
- }
19
+ configurerForAccessor: (accessor) => {
20
+ // eslint-disable-next-line
21
+ const fnWithKey = handlerMappedSetFunctionFactory(accessor, typeFormWebhookEvent);
22
+ const configurer = {
23
+ ...accessor,
24
+ handleFormResponse: fnWithKey('form_response')
25
+ };
26
+ return configurer;
27
+ }
28
28
  });
29
29
 
30
30
  const TYPEFORM_WEBHOOK_SECRET_TOKEN_ENV_VAR = 'TYPEFORM_WEBHOOK_SECRET_TOKEN';
@@ -32,12 +32,12 @@ const TYPEFORM_WEBHOOK_SECRET_TOKEN_ENV_VAR = 'TYPEFORM_WEBHOOK_SECRET_TOKEN';
32
32
  * Configuration for TypeformService
33
33
  */
34
34
  class TypeformWebhookServiceConfig {
35
- typeformWebhook;
36
- static assertValidConfig(config) {
37
- if (!config.typeformWebhook.secretToken) {
38
- throw new Error('No Typeform webhook secret specified.');
35
+ typeformWebhook;
36
+ static assertValidConfig(config) {
37
+ if (!config.typeformWebhook.secretToken) {
38
+ throw new Error('No Typeform webhook secret specified.');
39
+ }
39
40
  }
40
- }
41
41
  }
42
42
 
43
43
  /******************************************************************************
@@ -84,230 +84,237 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
84
84
  * @returns A function that verifies a Typeform webhook event.
85
85
  */
86
86
  function typeFormWebhookEventVerifier(config) {
87
- const {
88
- secret
89
- } = config;
90
- return async (request, rawBody) => {
91
- const requestBodyString = String(request.body);
92
- const headers = request.headers;
93
- const vapiSignature = headers['typeform-signature'];
94
- const hashForVerify = createHmac('sha256', secret).update(requestBodyString).digest('base64');
95
- const signature = `sha256=${hashForVerify}`;
96
- const valid = vapiSignature === signature;
97
- const event = JSON.parse(requestBodyString);
98
- const result = {
99
- valid,
100
- event
87
+ const { secret } = config;
88
+ return async (request, rawBody) => {
89
+ const requestBodyString = String(request.body);
90
+ const headers = request.headers;
91
+ const vapiSignature = headers['typeform-signature'];
92
+ const hashForVerify = createHmac('sha256', secret).update(requestBodyString).digest('base64');
93
+ const signature = `sha256=${hashForVerify}`;
94
+ const valid = vapiSignature === signature;
95
+ const event = JSON.parse(requestBodyString);
96
+ const result = {
97
+ valid,
98
+ event
99
+ };
100
+ return result;
101
101
  };
102
- return result;
103
- };
104
102
  }
105
103
 
106
104
  /**
107
105
  * Service that makes system changes based on Typeform webhook events.
108
106
  */
109
107
  let TypeformWebhookService = class TypeformWebhookService {
110
- logger = new Logger('TypeformWebhookService');
111
- _verifier;
112
- handler = typeformEventHandlerFactory();
113
- configure = typeformEventHandlerConfigurerFactory(this.handler);
114
- constructor(typeFormWebhookServiceConfig) {
115
- const {
116
- secretToken: webhookSecret
117
- } = typeFormWebhookServiceConfig.typeformWebhook;
118
- this._verifier = typeFormWebhookEventVerifier({
119
- secret: webhookSecret
120
- });
121
- }
122
- async updateForWebhook(req, rawBody) {
123
- const result = await this._verifier(req, rawBody);
124
- if (!result.valid) {
125
- this.logger.warn('Received invalid Typeform event.', req);
126
- } else {
127
- await this.updateForTypeformEvent(result.event);
108
+ logger = new Logger('TypeformWebhookService');
109
+ _verifier;
110
+ handler = typeformEventHandlerFactory();
111
+ configure = typeformEventHandlerConfigurerFactory(this.handler);
112
+ constructor(typeFormWebhookServiceConfig) {
113
+ const { secretToken: webhookSecret } = typeFormWebhookServiceConfig.typeformWebhook;
114
+ this._verifier = typeFormWebhookEventVerifier({
115
+ secret: webhookSecret
116
+ });
117
+ }
118
+ async updateForWebhook(req, rawBody) {
119
+ const result = await this._verifier(req, rawBody);
120
+ if (!result.valid) {
121
+ this.logger.warn('Received invalid Typeform event.', req);
122
+ }
123
+ else {
124
+ await this.updateForTypeformEvent(result.event);
125
+ }
128
126
  }
129
- }
130
- async updateForTypeformEvent(event) {
131
- const result = await this.handler(event);
132
- if (!result) {
133
- this.logger.warn('Received unexpected/unhandled Typeform event.', event);
127
+ async updateForTypeformEvent(event) {
128
+ const result = await this.handler(event);
129
+ if (!result) {
130
+ this.logger.warn('Received unexpected/unhandled Typeform event.', event);
131
+ }
134
132
  }
135
- }
136
133
  };
137
- TypeformWebhookService = __decorate([Injectable(), __param(0, Inject(TypeformWebhookServiceConfig)), __metadata("design:paramtypes", [TypeformWebhookServiceConfig])], TypeformWebhookService);
134
+ TypeformWebhookService = __decorate([
135
+ Injectable(),
136
+ __param(0, Inject(TypeformWebhookServiceConfig)),
137
+ __metadata("design:paramtypes", [TypeformWebhookServiceConfig])
138
+ ], TypeformWebhookService);
138
139
 
139
140
  let TypeformWebhookController = class TypeformWebhookController {
140
- _typeformWebhookService;
141
- constructor(typeformWebhookService) {
142
- this._typeformWebhookService = typeformWebhookService;
143
- }
144
- async handleTypeformWebhook(req, rawBody) {
145
- await this._typeformWebhookService.updateForWebhook(req, rawBody);
146
- }
141
+ _typeformWebhookService;
142
+ constructor(typeformWebhookService) {
143
+ this._typeformWebhookService = typeformWebhookService;
144
+ }
145
+ async handleTypeformWebhook(req, rawBody) {
146
+ await this._typeformWebhookService.updateForWebhook(req, rawBody);
147
+ }
147
148
  };
148
- __decorate([Post(), __param(0, Req()), __param(1, RawBody()), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, Object]), __metadata("design:returntype", Promise)], TypeformWebhookController.prototype, "handleTypeformWebhook", null);
149
- TypeformWebhookController = __decorate([Controller('/webhook/typeform'), __param(0, Inject(TypeformWebhookService)), __metadata("design:paramtypes", [TypeformWebhookService])], TypeformWebhookController);
149
+ __decorate([
150
+ Post(),
151
+ __param(0, Req()),
152
+ __param(1, RawBody()),
153
+ __metadata("design:type", Function),
154
+ __metadata("design:paramtypes", [Object, Object]),
155
+ __metadata("design:returntype", Promise)
156
+ ], TypeformWebhookController.prototype, "handleTypeformWebhook", null);
157
+ TypeformWebhookController = __decorate([
158
+ Controller('/webhook/typeform'),
159
+ __param(0, Inject(TypeformWebhookService)),
160
+ __metadata("design:paramtypes", [TypeformWebhookService])
161
+ ], TypeformWebhookController);
150
162
 
151
163
  function typeFormWebhookServiceConfigFactory(configService) {
152
- const config = {
153
- typeformWebhook: {
154
- secretToken: configService.get(TYPEFORM_WEBHOOK_SECRET_TOKEN_ENV_VAR)
155
- }
156
- };
157
- TypeformWebhookServiceConfig.assertValidConfig(config);
158
- return config;
164
+ const config = {
165
+ typeformWebhook: {
166
+ secretToken: configService.get(TYPEFORM_WEBHOOK_SECRET_TOKEN_ENV_VAR)
167
+ }
168
+ };
169
+ TypeformWebhookServiceConfig.assertValidConfig(config);
170
+ return config;
159
171
  }
160
- let TypeformWebhookModule = class TypeformWebhookModule {};
161
- TypeformWebhookModule = __decorate([Module({
162
- imports: [ConfigModule],
163
- controllers: [TypeformWebhookController],
164
- providers: [{
165
- provide: TypeformWebhookServiceConfig,
166
- inject: [ConfigService],
167
- useFactory: typeFormWebhookServiceConfigFactory
168
- }, TypeformWebhookService],
169
- exports: [TypeformWebhookService]
170
- })], TypeformWebhookModule);
172
+ let TypeformWebhookModule = class TypeformWebhookModule {
173
+ };
174
+ TypeformWebhookModule = __decorate([
175
+ Module({
176
+ imports: [ConfigModule],
177
+ controllers: [TypeformWebhookController],
178
+ providers: [
179
+ {
180
+ provide: TypeformWebhookServiceConfig,
181
+ inject: [ConfigService],
182
+ useFactory: typeFormWebhookServiceConfigFactory
183
+ },
184
+ TypeformWebhookService
185
+ ],
186
+ exports: [TypeformWebhookService]
187
+ })
188
+ ], TypeformWebhookModule);
171
189
 
172
190
  function findTypeformTemplateRefsInString(input) {
173
- /**
174
- * Used to search the input string to find field refs like the following:
175
- *
176
- * {{field:8f7adc1e-c3b8-44bd-b00c-1b6c8de65797}}
177
- * {{field:01H7G3DCZ1FZV4KYZGM755MXZZ}}
178
- */
179
- const regex = /\{\{\s*(field)\s*:\s*([A-Za-z0-9-]+)\s*\}\}/g;
180
- const matches = input.matchAll(regex);
181
- const result = [];
182
- for (const regexMatch of matches) {
183
- const match = regexMatch[0]; // {{field:8f7adc1e-c3b8-44bd-b00c-1b6c8de65797}}
184
- const type = regexMatch[1]; // field
185
- const ref = regexMatch[2]; // 8f7adc1e-c3b8-44bd-b00c-1b6c8de65797
186
- result.push({
187
- type,
188
- match,
189
- ref
190
- });
191
- }
192
- return result;
191
+ /**
192
+ * Used to search the input string to find field refs like the following:
193
+ *
194
+ * {{field:8f7adc1e-c3b8-44bd-b00c-1b6c8de65797}}
195
+ * {{field:01H7G3DCZ1FZV4KYZGM755MXZZ}}
196
+ */
197
+ const regex = /\{\{\s*(field)\s*:\s*([A-Za-z0-9-]+)\s*\}\}/g;
198
+ const matches = input.matchAll(regex);
199
+ const result = [];
200
+ for (const regexMatch of matches) {
201
+ const match = regexMatch[0]; // {{field:8f7adc1e-c3b8-44bd-b00c-1b6c8de65797}}
202
+ const type = regexMatch[1]; // field
203
+ const ref = regexMatch[2]; // 8f7adc1e-c3b8-44bd-b00c-1b6c8de65797
204
+ result.push({
205
+ type,
206
+ match,
207
+ ref
208
+ });
209
+ }
210
+ return result;
193
211
  }
194
212
 
195
213
  /**
196
214
  * Creates an ExpandedTypeformWebhookFormResponse from a TypeformWebhookFormResponse.
197
215
  */
198
216
  function expandTypeformWebhookFormResponse(formResponse) {
199
- const {
200
- answers,
201
- definition
202
- } = formResponse;
203
- const {
204
- fields = []
205
- } = definition;
206
- const questionFieldMap = new Map(filterMaybeArrayValues(fields.map(x => x.id ? [x.id, x] : null)));
207
- const answerValuePairs = answers.map(answer => makeTypeformFormResponseAnswerValuePair(answer));
208
- const answerValueFieldRefMap = new Map(filterMaybeArrayValues(answerValuePairs.map(x => x.answer.field.ref ? [x.answer.field.ref, x] : null)));
209
- function expandQuestionTitle(title) {
210
- let result = title;
211
- let hadReferenceInTitle = false;
212
- if (result) {
213
- const refsInTitle = findTypeformTemplateRefsInString(result);
214
- if (refsInTitle.length > 0) {
215
- hadReferenceInTitle = true;
216
- refsInTitle.forEach(refInTitle => {
217
- const {
218
- match,
219
- ref
220
- } = refInTitle;
221
- const fullMatch = match;
222
- const answer = answerValueFieldRefMap.get(ref);
223
- const answerValue = answer?.valueString;
224
- const replacedTitle = result.replaceAll(fullMatch, answerValue || '');
225
- result = replacedTitle;
226
- });
227
- }
217
+ const { answers, definition } = formResponse;
218
+ const { fields = [] } = definition;
219
+ const questionFieldMap = new Map(filterMaybeArrayValues(fields.map((x) => (x.id ? [x.id, x] : null))));
220
+ const answerValuePairs = answers.map((answer) => makeTypeformFormResponseAnswerValuePair(answer));
221
+ const answerValueFieldRefMap = new Map(filterMaybeArrayValues(answerValuePairs.map((x) => (x.answer.field.ref ? [x.answer.field.ref, x] : null))));
222
+ function expandQuestionTitle(title) {
223
+ let result = title;
224
+ let hadReferenceInTitle = false;
225
+ if (result) {
226
+ const refsInTitle = findTypeformTemplateRefsInString(result);
227
+ if (refsInTitle.length > 0) {
228
+ hadReferenceInTitle = true;
229
+ refsInTitle.forEach((refInTitle) => {
230
+ const { match, ref } = refInTitle;
231
+ const fullMatch = match;
232
+ const answer = answerValueFieldRefMap.get(ref);
233
+ const answerValue = answer?.valueString;
234
+ const replacedTitle = result.replaceAll(fullMatch, answerValue || '');
235
+ result = replacedTitle;
236
+ });
237
+ }
238
+ }
239
+ return {
240
+ questionTitle: result,
241
+ hadReferenceInTitle
242
+ };
228
243
  }
244
+ const pairs = answerValuePairs.map((answerValue) => {
245
+ const definitionField = questionFieldMap.get(answerValue.answer.field.id);
246
+ const { questionTitle, hadReferenceInTitle } = expandQuestionTitle(definitionField?.title);
247
+ const result = {
248
+ ...answerValue,
249
+ definitionField,
250
+ questionTitle,
251
+ hadReferenceInTitle
252
+ };
253
+ return result;
254
+ });
229
255
  return {
230
- questionTitle: result,
231
- hadReferenceInTitle
232
- };
233
- }
234
- const pairs = answerValuePairs.map(answerValue => {
235
- const definitionField = questionFieldMap.get(answerValue.answer.field.id);
236
- const {
237
- questionTitle,
238
- hadReferenceInTitle
239
- } = expandQuestionTitle(definitionField?.title);
240
- const result = {
241
- ...answerValue,
242
- definitionField,
243
- questionTitle,
244
- hadReferenceInTitle
256
+ formResponse,
257
+ pairs
245
258
  };
246
- return result;
247
- });
248
- return {
249
- formResponse,
250
- pairs
251
- };
252
259
  }
253
260
  /**
254
261
  * Creates a TypeformFormQuestionAnswerPair from a TypeformFormResponseAnswer.
255
262
  */
256
263
  function makeTypeformFormResponseAnswerValuePair(answer) {
257
- let value;
258
- let valueString;
259
- switch (answer.type) {
260
- case 'number':
261
- value = answer.number;
262
- valueString = answer.number.toString();
263
- break;
264
- case 'boolean':
265
- value = answer.boolean;
266
- valueString = answer.boolean.toString();
267
- break;
268
- case 'email':
269
- value = answer.email;
270
- valueString = answer.email;
271
- break;
272
- case 'phone_number':
273
- value = answer.phone_number;
274
- valueString = answer.phone_number;
275
- break;
276
- case 'date':
277
- value = answer.date;
278
- valueString = answer.date;
279
- break;
280
- case 'payment':
281
- value = answer.payment;
282
- valueString = answer.payment.amount.toString();
283
- break;
284
- case 'text':
285
- value = answer.text;
286
- valueString = answer.text;
287
- break;
288
- case 'choices':
289
- value = answer.choices;
290
- valueString = answer.choices.other || joinStringsWithCommas(answer.choices.labels);
291
- break;
292
- case 'choice':
293
- value = answer.choice;
294
- valueString = answer.choice.other || answer.choice.label || '';
295
- break;
296
- case 'url':
297
- value = answer.url;
298
- valueString = answer.url;
299
- break;
300
- case 'file_url':
301
- value = answer.file_url;
302
- valueString = answer.file_url;
303
- break;
304
- }
305
- const result = {
306
- answer,
307
- value,
308
- valueString
309
- };
310
- return result;
264
+ let value;
265
+ let valueString;
266
+ switch (answer.type) {
267
+ case 'number':
268
+ value = answer.number;
269
+ valueString = answer.number.toString();
270
+ break;
271
+ case 'boolean':
272
+ value = answer.boolean;
273
+ valueString = answer.boolean.toString();
274
+ break;
275
+ case 'email':
276
+ value = answer.email;
277
+ valueString = answer.email;
278
+ break;
279
+ case 'phone_number':
280
+ value = answer.phone_number;
281
+ valueString = answer.phone_number;
282
+ break;
283
+ case 'date':
284
+ value = answer.date;
285
+ valueString = answer.date;
286
+ break;
287
+ case 'payment':
288
+ value = answer.payment;
289
+ valueString = answer.payment.amount.toString();
290
+ break;
291
+ case 'text':
292
+ value = answer.text;
293
+ valueString = answer.text;
294
+ break;
295
+ case 'choices':
296
+ value = answer.choices;
297
+ valueString = answer.choices.other || joinStringsWithCommas(answer.choices.labels);
298
+ break;
299
+ case 'choice':
300
+ value = answer.choice;
301
+ valueString = answer.choice.other || answer.choice.label || '';
302
+ break;
303
+ case 'url':
304
+ value = answer.url;
305
+ valueString = answer.url;
306
+ break;
307
+ case 'file_url':
308
+ value = answer.file_url;
309
+ valueString = answer.file_url;
310
+ break;
311
+ }
312
+ const result = {
313
+ answer,
314
+ value,
315
+ valueString
316
+ };
317
+ return result;
311
318
  }
312
319
 
313
320
  /**
@@ -319,45 +326,55 @@ const TYPEFORM_BASE_URL_ENV_VAR = 'TYPEFORM_BASE_URL';
319
326
  * Configuration for TypeformService
320
327
  */
321
328
  class TypeformServiceConfig {
322
- typeform;
323
- static assertValidConfig(config) {
324
- if (!config.typeform.config.token) {
325
- throw new Error('No Typeform token specified.');
329
+ typeform;
330
+ static assertValidConfig(config) {
331
+ if (!config.typeform.config.token) {
332
+ throw new Error('No Typeform token specified.');
333
+ }
326
334
  }
327
- }
328
335
  }
329
336
 
330
337
  let TypeformApi = class TypeformApi {
331
- config;
332
- client;
333
- constructor(config) {
334
- this.config = config;
335
- this.client = createClient(config.typeform.config);
336
- }
338
+ config;
339
+ client;
340
+ constructor(config) {
341
+ this.config = config;
342
+ this.client = createClient(config.typeform.config);
343
+ }
337
344
  };
338
- TypeformApi = __decorate([Injectable(), __param(0, Inject(TypeformServiceConfig)), __metadata("design:paramtypes", [TypeformServiceConfig])], TypeformApi);
345
+ TypeformApi = __decorate([
346
+ Injectable(),
347
+ __param(0, Inject(TypeformServiceConfig)),
348
+ __metadata("design:paramtypes", [TypeformServiceConfig])
349
+ ], TypeformApi);
339
350
 
340
351
  function typeFormServiceConfigFactory(configService) {
341
- const config = {
342
- typeform: {
343
- config: {
344
- token: configService.get(TYPEFORM_SECRET_TOKEN_ENV_VAR),
345
- baseURL: configService.get(TYPEFORM_BASE_URL_ENV_VAR) ?? undefined
346
- }
347
- }
348
- };
349
- TypeformServiceConfig.assertValidConfig(config);
350
- return config;
352
+ const config = {
353
+ typeform: {
354
+ config: {
355
+ token: configService.get(TYPEFORM_SECRET_TOKEN_ENV_VAR),
356
+ baseURL: configService.get(TYPEFORM_BASE_URL_ENV_VAR) ?? undefined
357
+ }
358
+ }
359
+ };
360
+ TypeformServiceConfig.assertValidConfig(config);
361
+ return config;
351
362
  }
352
- let TypeformModule = class TypeformModule {};
353
- TypeformModule = __decorate([Module({
354
- imports: [ConfigModule],
355
- providers: [{
356
- provide: TypeformServiceConfig,
357
- inject: [ConfigService],
358
- useFactory: typeFormServiceConfigFactory
359
- }, TypeformApi],
360
- exports: [TypeformApi]
361
- })], TypeformModule);
363
+ let TypeformModule = class TypeformModule {
364
+ };
365
+ TypeformModule = __decorate([
366
+ Module({
367
+ imports: [ConfigModule],
368
+ providers: [
369
+ {
370
+ provide: TypeformServiceConfig,
371
+ inject: [ConfigService],
372
+ useFactory: typeFormServiceConfigFactory
373
+ },
374
+ TypeformApi
375
+ ],
376
+ exports: [TypeformApi]
377
+ })
378
+ ], TypeformModule);
362
379
 
363
380
  export { TYPEFORM_BASE_URL_ENV_VAR, TYPEFORM_SECRET_TOKEN_ENV_VAR, TYPEFORM_WEBHOOK_SECRET_TOKEN_ENV_VAR, TypeformApi, TypeformModule, TypeformServiceConfig, TypeformWebhookController, TypeformWebhookModule, TypeformWebhookService, TypeformWebhookServiceConfig, expandTypeformWebhookFormResponse, findTypeformTemplateRefsInString, makeTypeformFormResponseAnswerValuePair, typeFormServiceConfigFactory, typeFormWebhookEvent, typeFormWebhookEventVerifier, typeFormWebhookServiceConfigFactory, typeformEventHandlerConfigurerFactory, typeformEventHandlerFactory };
@@ -1,28 +1,27 @@
1
1
  {
2
2
  "name": "@dereekb/nestjs/typeform",
3
- "version": "13.0.0",
4
- "types": "./src/index.d.ts",
5
- "module": "./index.esm.js",
6
- "main": "./index.cjs.js",
3
+ "version": "13.0.1",
4
+ "peerDependencies": {
5
+ "@dereekb/date": "13.0.1",
6
+ "@dereekb/model": "13.0.1",
7
+ "@dereekb/nestjs": "13.0.1",
8
+ "@dereekb/rxjs": "13.0.1",
9
+ "@dereekb/util": "13.0.1",
10
+ "@nestjs/common": "^11.0.0",
11
+ "@nestjs/config": "^4.0.0",
12
+ "@typeform/api-client": "^2.5.1",
13
+ "express": "^5.0.0"
14
+ },
7
15
  "exports": {
16
+ "./package.json": "./package.json",
8
17
  ".": {
9
- "types": "./src/index.d.ts",
10
- "node": {
11
- "require": "./index.cjs.js"
12
- },
13
- "browser": {
14
- "require": "./index.cjs.js",
15
- "import": "./index.esm.js"
16
- },
18
+ "module": "./index.esm.js",
19
+ "types": "./index.d.ts",
20
+ "import": "./index.cjs.mjs",
17
21
  "default": "./index.cjs.js"
18
22
  }
19
23
  },
20
- "peerDependencies": {
21
- "@dereekb/date": "13.0.0",
22
- "@dereekb/nestjs": "13.0.0",
23
- "@dereekb/model": "13.0.0",
24
- "@dereekb/rxjs": "13.0.0",
25
- "@dereekb/util": "13.0.0",
26
- "core-js": "^3.0.0"
27
- }
24
+ "module": "./index.esm.js",
25
+ "main": "./index.cjs.js",
26
+ "types": "./index.d.ts"
28
27
  }
@@ -0,0 +1 @@
1
+ exports._default = require('./index.cjs.js').default;