express-version-api 1.0.1 → 2.0.4

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/dist/index.cjs ADDED
@@ -0,0 +1,708 @@
1
+ 'use strict';
2
+
3
+ /* express-version-api - MIT License - https://github.com/Braian-Quintian/express-version-api */
4
+
5
+ // src/types.ts
6
+ var VersioningError = class _VersioningError extends Error {
7
+ code;
8
+ requestedVersion;
9
+ availableVersions;
10
+ statusCode;
11
+ constructor(details, statusCode = 422) {
12
+ super(details.message);
13
+ this.name = "VersioningError";
14
+ this.code = details.code;
15
+ this.requestedVersion = details.requestedVersion;
16
+ this.availableVersions = details.availableVersions;
17
+ this.statusCode = statusCode;
18
+ Error.captureStackTrace(this, _VersioningError);
19
+ }
20
+ /**
21
+ * Converts the error to a JSON-serializable object.
22
+ */
23
+ toJSON() {
24
+ return {
25
+ code: this.code,
26
+ message: this.message,
27
+ statusCode: this.statusCode,
28
+ ...this.requestedVersion !== void 0 && { requestedVersion: this.requestedVersion },
29
+ ...this.availableVersions !== void 0 && { availableVersions: this.availableVersions }
30
+ };
31
+ }
32
+ };
33
+
34
+ // src/errors.ts
35
+ function createMissingVersionError(statusCode = 422, message = "API version is required") {
36
+ return new VersioningError(
37
+ {
38
+ code: "MISSING_VERSION",
39
+ message
40
+ },
41
+ statusCode
42
+ );
43
+ }
44
+ function createVersionNotFoundError(requestedVersion, availableVersions, statusCode = 422) {
45
+ return new VersioningError(
46
+ {
47
+ code: "VERSION_NOT_FOUND",
48
+ message: `No handler found for API version '${requestedVersion}'`,
49
+ requestedVersion,
50
+ availableVersions
51
+ },
52
+ statusCode
53
+ );
54
+ }
55
+ function createInvalidVersionFormatError(version, statusCode = 400) {
56
+ return new VersioningError(
57
+ {
58
+ code: "INVALID_VERSION_FORMAT",
59
+ message: `Invalid version format: '${version}'`,
60
+ requestedVersion: version
61
+ },
62
+ statusCode
63
+ );
64
+ }
65
+ function createInvalidHandlerError(key, reason) {
66
+ return new VersioningError(
67
+ {
68
+ code: "INVALID_HANDLER",
69
+ message: `Invalid handler for version '${key}': ${reason}`
70
+ },
71
+ 500
72
+ );
73
+ }
74
+ function createInvalidConfigurationError(reason) {
75
+ return new VersioningError(
76
+ {
77
+ code: "INVALID_CONFIGURATION",
78
+ message: `Invalid configuration: ${reason}`
79
+ },
80
+ 500
81
+ );
82
+ }
83
+ function isVersioningError(error) {
84
+ return error instanceof VersioningError;
85
+ }
86
+ function hasErrorCode(error, code) {
87
+ return isVersioningError(error) && error.code === code;
88
+ }
89
+
90
+ // src/config.ts
91
+ var DEFAULT_CONFIG = {
92
+ extraction: {
93
+ sources: ["header", "query"],
94
+ header: {
95
+ name: "accept-version"
96
+ },
97
+ query: {
98
+ name: "v"
99
+ },
100
+ path: {
101
+ pattern: /\/v(\d+(?:\.\d+)?(?:\.\d+)?)\//
102
+ },
103
+ custom: void 0
104
+ },
105
+ errorResponse: {
106
+ missingVersionStatus: 422,
107
+ versionNotFoundStatus: 422,
108
+ missingVersionMessage: "API version is required",
109
+ versionNotFoundMessage: "No handler found for the requested API version",
110
+ includeRequestedVersion: true,
111
+ onError: void 0
112
+ },
113
+ fallbackStrategy: "default",
114
+ defaultHandler: void 0,
115
+ validateHandlers: true,
116
+ attachVersionInfo: true,
117
+ requireVersion: true
118
+ };
119
+ function resolveConfig(options) {
120
+ if (!options) {
121
+ return DEFAULT_CONFIG;
122
+ }
123
+ if (options.fallbackStrategy !== void 0) {
124
+ const validStrategies = /* @__PURE__ */ new Set(["latest", "none", "default"]);
125
+ if (!validStrategies.has(options.fallbackStrategy)) {
126
+ throw createInvalidConfigurationError(
127
+ `Invalid fallback strategy: '${options.fallbackStrategy}'. Valid strategies: latest, none, default`
128
+ );
129
+ }
130
+ }
131
+ if (options.extraction?.sources) {
132
+ const validSources = /* @__PURE__ */ new Set(["header", "query", "path", "custom"]);
133
+ for (const source of options.extraction.sources) {
134
+ if (!validSources.has(source)) {
135
+ throw createInvalidConfigurationError(
136
+ `Invalid version source: '${source}'. Valid sources: header, query, path, custom`
137
+ );
138
+ }
139
+ }
140
+ if (options.extraction.sources.includes("custom") && !options.extraction.custom) {
141
+ throw createInvalidConfigurationError(
142
+ "Custom extractor function is required when 'custom' source is used"
143
+ );
144
+ }
145
+ }
146
+ if (options.extraction?.path?.pattern && !(options.extraction.path.pattern instanceof RegExp)) {
147
+ throw createInvalidConfigurationError("Path pattern must be a RegExp instance");
148
+ }
149
+ if (options.errorResponse?.missingVersionStatus !== void 0) {
150
+ const status = options.errorResponse.missingVersionStatus;
151
+ if (!Number.isInteger(status) || status < 100 || status > 599) {
152
+ throw createInvalidConfigurationError(
153
+ "missingVersionStatus must be a valid HTTP status code (100-599)"
154
+ );
155
+ }
156
+ }
157
+ if (options.errorResponse?.versionNotFoundStatus !== void 0) {
158
+ const status = options.errorResponse.versionNotFoundStatus;
159
+ if (!Number.isInteger(status) || status < 100 || status > 599) {
160
+ throw createInvalidConfigurationError(
161
+ "versionNotFoundStatus must be a valid HTTP status code (100-599)"
162
+ );
163
+ }
164
+ }
165
+ return {
166
+ extraction: {
167
+ sources: options.extraction?.sources ?? DEFAULT_CONFIG.extraction.sources,
168
+ header: {
169
+ name: options.extraction?.header?.name ?? DEFAULT_CONFIG.extraction.header.name
170
+ },
171
+ query: {
172
+ name: options.extraction?.query?.name ?? DEFAULT_CONFIG.extraction.query.name
173
+ },
174
+ path: {
175
+ pattern: options.extraction?.path?.pattern ?? DEFAULT_CONFIG.extraction.path.pattern
176
+ },
177
+ custom: options.extraction?.custom
178
+ },
179
+ errorResponse: {
180
+ missingVersionStatus: options.errorResponse?.missingVersionStatus ?? DEFAULT_CONFIG.errorResponse.missingVersionStatus,
181
+ versionNotFoundStatus: options.errorResponse?.versionNotFoundStatus ?? DEFAULT_CONFIG.errorResponse.versionNotFoundStatus,
182
+ missingVersionMessage: options.errorResponse?.missingVersionMessage ?? DEFAULT_CONFIG.errorResponse.missingVersionMessage,
183
+ versionNotFoundMessage: options.errorResponse?.versionNotFoundMessage ?? DEFAULT_CONFIG.errorResponse.versionNotFoundMessage,
184
+ includeRequestedVersion: options.errorResponse?.includeRequestedVersion ?? DEFAULT_CONFIG.errorResponse.includeRequestedVersion,
185
+ onError: options.errorResponse?.onError
186
+ },
187
+ fallbackStrategy: options.fallbackStrategy ?? DEFAULT_CONFIG.fallbackStrategy,
188
+ defaultHandler: options.defaultHandler ?? DEFAULT_CONFIG.defaultHandler,
189
+ validateHandlers: options.validateHandlers ?? DEFAULT_CONFIG.validateHandlers,
190
+ attachVersionInfo: options.attachVersionInfo ?? DEFAULT_CONFIG.attachVersionInfo,
191
+ requireVersion: options.requireVersion ?? DEFAULT_CONFIG.requireVersion
192
+ };
193
+ }
194
+ function freezeConfig(config) {
195
+ return Object.freeze({
196
+ ...config,
197
+ extraction: Object.freeze({
198
+ ...config.extraction,
199
+ sources: Object.freeze([...config.extraction.sources]),
200
+ header: Object.freeze({ ...config.extraction.header }),
201
+ query: Object.freeze({ ...config.extraction.query }),
202
+ path: Object.freeze({ ...config.extraction.path })
203
+ }),
204
+ errorResponse: Object.freeze({ ...config.errorResponse })
205
+ });
206
+ }
207
+
208
+ // src/version-extractor.ts
209
+ function extractFromHeader(req, headerName) {
210
+ const value = req.headers[headerName.toLowerCase()];
211
+ if (typeof value === "string" && value.trim().length > 0) {
212
+ return value.trim();
213
+ }
214
+ if (Array.isArray(value) && value.length > 0 && value[0]) {
215
+ return value[0].trim();
216
+ }
217
+ return void 0;
218
+ }
219
+ function extractFromQuery(req, paramName) {
220
+ const value = req.query[paramName];
221
+ if (typeof value === "string" && value.trim().length > 0) {
222
+ return value.trim();
223
+ }
224
+ return void 0;
225
+ }
226
+ function extractFromPath(req, pattern) {
227
+ const path = req.path || req.url;
228
+ const isStatefulPattern = pattern.global || pattern.sticky;
229
+ if (isStatefulPattern) {
230
+ pattern.lastIndex = 0;
231
+ }
232
+ const match = pattern.exec(path);
233
+ if (isStatefulPattern) {
234
+ pattern.lastIndex = 0;
235
+ }
236
+ if (match?.[1]) {
237
+ return match[1].trim();
238
+ }
239
+ return void 0;
240
+ }
241
+ function extractFromRequest(req) {
242
+ if (typeof req.version === "string" && req.version.trim().length > 0) {
243
+ return req.version.trim();
244
+ }
245
+ return void 0;
246
+ }
247
+ function createVersionExtractor(config) {
248
+ const { sources, header, query, path, custom } = config.extraction;
249
+ return (req) => {
250
+ const requestVersion = extractFromRequest(req);
251
+ if (requestVersion) {
252
+ return { version: requestVersion, source: "custom" };
253
+ }
254
+ for (const source of sources) {
255
+ let version;
256
+ switch (source) {
257
+ case "header":
258
+ version = extractFromHeader(req, header.name);
259
+ break;
260
+ case "query":
261
+ version = extractFromQuery(req, query.name);
262
+ break;
263
+ case "path":
264
+ version = extractFromPath(req, path.pattern);
265
+ break;
266
+ case "custom":
267
+ version = custom?.(req);
268
+ break;
269
+ }
270
+ if (version) {
271
+ return { version, source };
272
+ }
273
+ }
274
+ return void 0;
275
+ };
276
+ }
277
+
278
+ // src/version-parser.ts
279
+ var VERSION_REGEX = /^(\^|~)?(\d+)(?:\.(\d+))?(?:\.(\d+))?$/;
280
+ function getSpecifiedComponentCount(rawRange) {
281
+ const withoutPrefix = rawRange.replace(/^[\^~]/, "");
282
+ const count = withoutPrefix.split(".").length;
283
+ if (count <= 1) {
284
+ return 1;
285
+ }
286
+ if (count === 2) {
287
+ return 2;
288
+ }
289
+ return 3;
290
+ }
291
+ function parseVersion(version) {
292
+ const trimmed = version.trim();
293
+ const match = VERSION_REGEX.exec(trimmed);
294
+ if (!match) {
295
+ return null;
296
+ }
297
+ const [, , majorStr, minorStr, patchStr] = match;
298
+ const major = parseInt(majorStr ?? "0", 10);
299
+ const minor = parseInt(minorStr ?? "0", 10);
300
+ const patch = parseInt(patchStr ?? "0", 10);
301
+ if (isNaN(major) || isNaN(minor) || isNaN(patch)) {
302
+ return null;
303
+ }
304
+ if (major < 0 || minor < 0 || patch < 0) {
305
+ return null;
306
+ }
307
+ return {
308
+ major,
309
+ minor,
310
+ patch,
311
+ raw: trimmed
312
+ };
313
+ }
314
+ function parseVersionRange(range) {
315
+ const trimmed = range.trim();
316
+ const match = VERSION_REGEX.exec(trimmed);
317
+ if (!match) {
318
+ return null;
319
+ }
320
+ const [, prefix, majorStr, minorStr, patchStr] = match;
321
+ const major = parseInt(majorStr ?? "0", 10);
322
+ const minor = parseInt(minorStr ?? "0", 10);
323
+ const patch = parseInt(patchStr ?? "0", 10);
324
+ if (isNaN(major) || isNaN(minor) || isNaN(patch)) {
325
+ return null;
326
+ }
327
+ let type;
328
+ if (prefix === "^") {
329
+ type = "caret";
330
+ } else if (prefix === "~") {
331
+ type = "tilde";
332
+ } else {
333
+ type = "exact";
334
+ }
335
+ return {
336
+ type,
337
+ version: { major, minor, patch, raw: trimmed.replace(/^[\^~]/, "") },
338
+ raw: trimmed
339
+ };
340
+ }
341
+ function versionSatisfies(clientVersion, range) {
342
+ const { major: cMajor, minor: cMinor, patch: cPatch } = clientVersion;
343
+ const { major: rMajor, minor: rMinor, patch: rPatch } = range.version;
344
+ switch (range.type) {
345
+ case "caret": {
346
+ if (cMajor !== rMajor) {
347
+ return false;
348
+ }
349
+ if (rMajor > 0) {
350
+ if (cMinor < rMinor) {
351
+ return false;
352
+ }
353
+ if (cMinor === rMinor && cPatch < rPatch) {
354
+ return false;
355
+ }
356
+ return true;
357
+ }
358
+ if (rMinor > 0) {
359
+ return cMinor === rMinor && cPatch >= rPatch;
360
+ }
361
+ const componentCount = getSpecifiedComponentCount(range.raw);
362
+ if (componentCount === 1) {
363
+ return true;
364
+ }
365
+ if (componentCount === 2) {
366
+ return cMinor === 0;
367
+ }
368
+ return cMinor === 0 && cPatch === rPatch;
369
+ }
370
+ case "tilde": {
371
+ if (cMajor !== rMajor || cMinor !== rMinor) {
372
+ return false;
373
+ }
374
+ return cPatch >= rPatch;
375
+ }
376
+ case "exact": {
377
+ return cMajor === rMajor && cMinor === rMinor && cPatch === rPatch;
378
+ }
379
+ }
380
+ }
381
+ function compareVersions(a, b) {
382
+ if (a.major !== b.major) {
383
+ return a.major > b.major ? 1 : -1;
384
+ }
385
+ if (a.minor !== b.minor) {
386
+ return a.minor > b.minor ? 1 : -1;
387
+ }
388
+ if (a.patch !== b.patch) {
389
+ return a.patch > b.patch ? 1 : -1;
390
+ }
391
+ return 0;
392
+ }
393
+ function findLatestVersion(versions) {
394
+ if (versions.length === 0) {
395
+ return null;
396
+ }
397
+ let latest = null;
398
+ let latestRaw = "";
399
+ for (const version of versions) {
400
+ const range = parseVersionRange(version);
401
+ if (!range) {
402
+ continue;
403
+ }
404
+ if (!latest || compareVersions(range.version, latest) > 0) {
405
+ latest = range.version;
406
+ latestRaw = range.version.raw;
407
+ }
408
+ }
409
+ return latestRaw || null;
410
+ }
411
+ function isValidVersion(version) {
412
+ return parseVersion(version) !== null;
413
+ }
414
+ function isValidVersionRange(range) {
415
+ return parseVersionRange(range) !== null;
416
+ }
417
+ function normalizeVersion(version) {
418
+ const range = parseVersionRange(version);
419
+ if (!range) {
420
+ return null;
421
+ }
422
+ const { major, minor, patch } = range.version;
423
+ return `${major.toString()}.${minor.toString()}.${patch.toString()}`;
424
+ }
425
+
426
+ // src/handler-compiler.ts
427
+ function calculatePriority(handler) {
428
+ const { range } = handler;
429
+ const { major, minor, patch } = range.version;
430
+ const versionValue = major * 1e6 + minor * 1e3 + patch;
431
+ switch (range.type) {
432
+ case "exact":
433
+ return 1e9 + versionValue;
434
+ case "tilde":
435
+ return 5e8 + versionValue;
436
+ case "caret":
437
+ return versionValue;
438
+ }
439
+ }
440
+ function compileHandlers(handlers, validate = true) {
441
+ const compiled = [];
442
+ for (const [key, handler] of Object.entries(handlers)) {
443
+ if (validate && typeof handler !== "function") {
444
+ throw createInvalidHandlerError(key, "handler must be a function");
445
+ }
446
+ const range = parseVersionRange(key);
447
+ if (!range) {
448
+ if (validate) {
449
+ throw createInvalidHandlerError(
450
+ key,
451
+ 'invalid version format. Expected: "1.0.0", "^1.0", "~1.2", etc.'
452
+ );
453
+ }
454
+ continue;
455
+ }
456
+ const compiledHandler = {
457
+ key,
458
+ range,
459
+ handler,
460
+ priority: 0
461
+ // Will be calculated after
462
+ };
463
+ compiledHandler.priority = calculatePriority(compiledHandler);
464
+ compiled.push(compiledHandler);
465
+ }
466
+ compiled.sort((a, b) => b.priority - a.priority);
467
+ return compiled;
468
+ }
469
+ function findMatchingHandler(clientVersion, compiledHandlers) {
470
+ for (const handler of compiledHandlers) {
471
+ if (versionSatisfies(clientVersion, handler.range)) {
472
+ return handler;
473
+ }
474
+ }
475
+ return void 0;
476
+ }
477
+ function findLatestHandler(compiledHandlers) {
478
+ if (compiledHandlers.length === 0) {
479
+ return void 0;
480
+ }
481
+ let latest;
482
+ for (const handler of compiledHandlers) {
483
+ if (!latest || compareVersions(handler.range.version, latest.range.version) > 0) {
484
+ latest = handler;
485
+ }
486
+ }
487
+ return latest;
488
+ }
489
+ function getAvailableVersions(compiledHandlers) {
490
+ return compiledHandlers.map((h) => h.key);
491
+ }
492
+
493
+ // src/middleware.ts
494
+ function sendErrorResponse(error, req, res, next, config) {
495
+ if (config.errorResponse.onError) {
496
+ const handled = config.errorResponse.onError(error, req, res, next);
497
+ if (handled === true) {
498
+ return;
499
+ }
500
+ }
501
+ const response = {
502
+ error: error.code,
503
+ message: error.message
504
+ };
505
+ if (config.errorResponse.includeRequestedVersion && error.requestedVersion) {
506
+ response["requestedVersion"] = error.requestedVersion;
507
+ }
508
+ if (error.availableVersions && error.availableVersions.length > 0) {
509
+ response["availableVersions"] = error.availableVersions;
510
+ }
511
+ res.status(error.statusCode).json(response);
512
+ }
513
+ function getVersionNotFoundMessage(version, config) {
514
+ const message = config.errorResponse.versionNotFoundMessage;
515
+ if (typeof message === "function") {
516
+ return message(version);
517
+ }
518
+ return message;
519
+ }
520
+ function getMissingVersionMessage(config) {
521
+ return config.errorResponse.missingVersionMessage;
522
+ }
523
+ function versioningMiddleware(handlers, options) {
524
+ if (Array.isArray(handlers)) {
525
+ throw createInvalidConfigurationError("'handlers' must be a non-null, non-array object");
526
+ }
527
+ const config = freezeConfig(resolveConfig(options));
528
+ const compiledHandlers = compileHandlers(handlers, config.validateHandlers);
529
+ if (compiledHandlers.length === 0) {
530
+ throw createInvalidConfigurationError(
531
+ "No valid handlers provided. At least one handler is required."
532
+ );
533
+ }
534
+ const extractVersion = createVersionExtractor(config);
535
+ const availableVersions = getAvailableVersions(compiledHandlers);
536
+ return (req, res, next) => {
537
+ const extraction = extractVersion(req);
538
+ if (!extraction) {
539
+ if (!config.requireVersion) {
540
+ handleFallback(
541
+ void 0,
542
+ void 0,
543
+ compiledHandlers,
544
+ config,
545
+ availableVersions,
546
+ req,
547
+ res,
548
+ next
549
+ );
550
+ return;
551
+ }
552
+ const error = createMissingVersionError(
553
+ config.errorResponse.missingVersionStatus,
554
+ getMissingVersionMessage(config)
555
+ );
556
+ sendErrorResponse(error, req, res, next, config);
557
+ return;
558
+ }
559
+ const { version: versionString, source } = extraction;
560
+ const clientVersion = parseVersion(versionString);
561
+ if (!clientVersion) {
562
+ const error = createInvalidVersionFormatError(versionString);
563
+ sendErrorResponse(error, req, res, next, config);
564
+ return;
565
+ }
566
+ const matchedHandler = findMatchingHandler(clientVersion, compiledHandlers);
567
+ if (matchedHandler) {
568
+ if (config.attachVersionInfo) {
569
+ req.versionInfo = {
570
+ requested: versionString,
571
+ matched: matchedHandler.key,
572
+ source
573
+ };
574
+ }
575
+ executeHandler(matchedHandler, req, res, next);
576
+ return;
577
+ }
578
+ handleFallback(
579
+ versionString,
580
+ source,
581
+ compiledHandlers,
582
+ config,
583
+ availableVersions,
584
+ req,
585
+ res,
586
+ next
587
+ );
588
+ };
589
+ }
590
+ function handleFallback(requestedVersion, requestedSource, compiledHandlers, config, availableVersions, req, res, next) {
591
+ switch (config.fallbackStrategy) {
592
+ case "none": {
593
+ const error = createVersionNotFoundError(
594
+ requestedVersion ?? "unknown",
595
+ availableVersions,
596
+ config.errorResponse.versionNotFoundStatus
597
+ );
598
+ error.message = getVersionNotFoundMessage(requestedVersion ?? "unknown", config);
599
+ sendErrorResponse(error, req, res, next, config);
600
+ break;
601
+ }
602
+ case "latest": {
603
+ const latestHandler = findLatestHandler(compiledHandlers);
604
+ if (latestHandler) {
605
+ if (config.attachVersionInfo && requestedVersion) {
606
+ req.versionInfo = {
607
+ requested: requestedVersion,
608
+ matched: latestHandler.key,
609
+ source: requestedSource ?? "custom"
610
+ };
611
+ }
612
+ executeHandler(latestHandler, req, res, next);
613
+ } else {
614
+ const error = createVersionNotFoundError(
615
+ requestedVersion ?? "unknown",
616
+ availableVersions,
617
+ config.errorResponse.versionNotFoundStatus
618
+ );
619
+ sendErrorResponse(error, req, res, next, config);
620
+ }
621
+ break;
622
+ }
623
+ case "default": {
624
+ if (config.defaultHandler) {
625
+ if (config.attachVersionInfo && requestedVersion) {
626
+ req.versionInfo = {
627
+ requested: requestedVersion,
628
+ matched: "default",
629
+ source: requestedSource ?? "custom"
630
+ };
631
+ }
632
+ executeRequestHandler(config.defaultHandler, req, res, next);
633
+ } else {
634
+ const latestHandler = findLatestHandler(compiledHandlers);
635
+ if (latestHandler) {
636
+ if (config.attachVersionInfo && requestedVersion) {
637
+ req.versionInfo = {
638
+ requested: requestedVersion,
639
+ matched: latestHandler.key,
640
+ source: requestedSource ?? "custom"
641
+ };
642
+ }
643
+ executeHandler(latestHandler, req, res, next);
644
+ } else {
645
+ const error = createVersionNotFoundError(
646
+ requestedVersion ?? "unknown",
647
+ availableVersions,
648
+ config.errorResponse.versionNotFoundStatus
649
+ );
650
+ sendErrorResponse(error, req, res, next, config);
651
+ }
652
+ }
653
+ break;
654
+ }
655
+ default: {
656
+ const error = createInvalidConfigurationError(
657
+ "Unsupported fallback strategy. Valid strategies: latest, none, default"
658
+ );
659
+ sendErrorResponse(error, req, res, next, config);
660
+ break;
661
+ }
662
+ }
663
+ }
664
+ function executeHandler(handler, req, res, next) {
665
+ try {
666
+ const result = handler.handler(req, res, next);
667
+ if (result instanceof Promise) {
668
+ result.catch((error) => {
669
+ next(error);
670
+ });
671
+ }
672
+ } catch (error) {
673
+ next(error);
674
+ }
675
+ }
676
+ function executeRequestHandler(handler, req, res, next) {
677
+ try {
678
+ const result = handler(req, res, next);
679
+ if (result instanceof Promise) {
680
+ void result.catch((error) => {
681
+ next(error);
682
+ });
683
+ }
684
+ } catch (error) {
685
+ next(error);
686
+ }
687
+ }
688
+
689
+ exports.DEFAULT_CONFIG = DEFAULT_CONFIG;
690
+ exports.VersioningError = VersioningError;
691
+ exports.compareVersions = compareVersions;
692
+ exports.createInvalidConfigurationError = createInvalidConfigurationError;
693
+ exports.createInvalidHandlerError = createInvalidHandlerError;
694
+ exports.createInvalidVersionFormatError = createInvalidVersionFormatError;
695
+ exports.createMissingVersionError = createMissingVersionError;
696
+ exports.createVersionNotFoundError = createVersionNotFoundError;
697
+ exports.findLatestVersion = findLatestVersion;
698
+ exports.hasErrorCode = hasErrorCode;
699
+ exports.isValidVersion = isValidVersion;
700
+ exports.isValidVersionRange = isValidVersionRange;
701
+ exports.isVersioningError = isVersioningError;
702
+ exports.normalizeVersion = normalizeVersion;
703
+ exports.parseVersion = parseVersion;
704
+ exports.parseVersionRange = parseVersionRange;
705
+ exports.versionSatisfies = versionSatisfies;
706
+ exports.versioningMiddleware = versioningMiddleware;
707
+ //# sourceMappingURL=index.cjs.map
708
+ //# sourceMappingURL=index.cjs.map