ratelimit-flex 1.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.
Files changed (109) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +274 -0
  4. package/dist/cjs/index.d.ts +32 -0
  5. package/dist/cjs/index.d.ts.map +1 -0
  6. package/dist/cjs/index.js +73 -0
  7. package/dist/cjs/index.js.map +1 -0
  8. package/dist/cjs/middleware/express.d.ts +18 -0
  9. package/dist/cjs/middleware/express.d.ts.map +1 -0
  10. package/dist/cjs/middleware/express.js +61 -0
  11. package/dist/cjs/middleware/express.js.map +1 -0
  12. package/dist/cjs/middleware/fastify.d.ts +21 -0
  13. package/dist/cjs/middleware/fastify.d.ts.map +1 -0
  14. package/dist/cjs/middleware/fastify.js +66 -0
  15. package/dist/cjs/middleware/fastify.js.map +1 -0
  16. package/dist/cjs/middleware/index.d.ts +4 -0
  17. package/dist/cjs/middleware/index.d.ts.map +1 -0
  18. package/dist/cjs/middleware/index.js +9 -0
  19. package/dist/cjs/middleware/index.js.map +1 -0
  20. package/dist/cjs/middleware/merge-options.d.ts +16 -0
  21. package/dist/cjs/middleware/merge-options.d.ts.map +1 -0
  22. package/dist/cjs/middleware/merge-options.js +71 -0
  23. package/dist/cjs/middleware/merge-options.js.map +1 -0
  24. package/dist/cjs/package.json +1 -0
  25. package/dist/cjs/stores/index.d.ts +4 -0
  26. package/dist/cjs/stores/index.d.ts.map +1 -0
  27. package/dist/cjs/stores/index.js +11 -0
  28. package/dist/cjs/stores/index.js.map +1 -0
  29. package/dist/cjs/stores/memory-store.d.ts +74 -0
  30. package/dist/cjs/stores/memory-store.d.ts.map +1 -0
  31. package/dist/cjs/stores/memory-store.js +259 -0
  32. package/dist/cjs/stores/memory-store.js.map +1 -0
  33. package/dist/cjs/stores/redis-store.d.ts +113 -0
  34. package/dist/cjs/stores/redis-store.d.ts.map +1 -0
  35. package/dist/cjs/stores/redis-store.js +452 -0
  36. package/dist/cjs/stores/redis-store.js.map +1 -0
  37. package/dist/cjs/strategies/defaults.d.ts +28 -0
  38. package/dist/cjs/strategies/defaults.d.ts.map +1 -0
  39. package/dist/cjs/strategies/defaults.js +31 -0
  40. package/dist/cjs/strategies/defaults.js.map +1 -0
  41. package/dist/cjs/strategies/index.d.ts +4 -0
  42. package/dist/cjs/strategies/index.d.ts.map +1 -0
  43. package/dist/cjs/strategies/index.js +13 -0
  44. package/dist/cjs/strategies/index.js.map +1 -0
  45. package/dist/cjs/strategies/rate-limit-engine.d.ts +42 -0
  46. package/dist/cjs/strategies/rate-limit-engine.d.ts.map +1 -0
  47. package/dist/cjs/strategies/rate-limit-engine.js +128 -0
  48. package/dist/cjs/strategies/rate-limit-engine.js.map +1 -0
  49. package/dist/cjs/types/index.d.ts +93 -0
  50. package/dist/cjs/types/index.d.ts.map +1 -0
  51. package/dist/cjs/types/index.js +14 -0
  52. package/dist/cjs/types/index.js.map +1 -0
  53. package/dist/cjs/utils/index.d.ts +3 -0
  54. package/dist/cjs/utils/index.d.ts.map +1 -0
  55. package/dist/cjs/utils/index.js +4 -0
  56. package/dist/cjs/utils/index.js.map +1 -0
  57. package/dist/index.d.ts +32 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +43 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/middleware/express.d.ts +18 -0
  62. package/dist/middleware/express.d.ts.map +1 -0
  63. package/dist/middleware/express.js +58 -0
  64. package/dist/middleware/express.js.map +1 -0
  65. package/dist/middleware/fastify.d.ts +21 -0
  66. package/dist/middleware/fastify.d.ts.map +1 -0
  67. package/dist/middleware/fastify.js +60 -0
  68. package/dist/middleware/fastify.js.map +1 -0
  69. package/dist/middleware/index.d.ts +4 -0
  70. package/dist/middleware/index.d.ts.map +1 -0
  71. package/dist/middleware/index.js +4 -0
  72. package/dist/middleware/index.js.map +1 -0
  73. package/dist/middleware/merge-options.d.ts +16 -0
  74. package/dist/middleware/merge-options.d.ts.map +1 -0
  75. package/dist/middleware/merge-options.js +64 -0
  76. package/dist/middleware/merge-options.js.map +1 -0
  77. package/dist/stores/index.d.ts +4 -0
  78. package/dist/stores/index.d.ts.map +1 -0
  79. package/dist/stores/index.js +4 -0
  80. package/dist/stores/index.js.map +1 -0
  81. package/dist/stores/memory-store.d.ts +74 -0
  82. package/dist/stores/memory-store.d.ts.map +1 -0
  83. package/dist/stores/memory-store.js +255 -0
  84. package/dist/stores/memory-store.js.map +1 -0
  85. package/dist/stores/redis-store.d.ts +113 -0
  86. package/dist/stores/redis-store.d.ts.map +1 -0
  87. package/dist/stores/redis-store.js +413 -0
  88. package/dist/stores/redis-store.js.map +1 -0
  89. package/dist/strategies/defaults.d.ts +28 -0
  90. package/dist/strategies/defaults.d.ts.map +1 -0
  91. package/dist/strategies/defaults.js +28 -0
  92. package/dist/strategies/defaults.js.map +1 -0
  93. package/dist/strategies/index.d.ts +4 -0
  94. package/dist/strategies/index.d.ts.map +1 -0
  95. package/dist/strategies/index.js +4 -0
  96. package/dist/strategies/index.js.map +1 -0
  97. package/dist/strategies/rate-limit-engine.d.ts +42 -0
  98. package/dist/strategies/rate-limit-engine.d.ts.map +1 -0
  99. package/dist/strategies/rate-limit-engine.js +122 -0
  100. package/dist/strategies/rate-limit-engine.js.map +1 -0
  101. package/dist/types/index.d.ts +93 -0
  102. package/dist/types/index.d.ts.map +1 -0
  103. package/dist/types/index.js +11 -0
  104. package/dist/types/index.js.map +1 -0
  105. package/dist/utils/index.d.ts +3 -0
  106. package/dist/utils/index.d.ts.map +1 -0
  107. package/dist/utils/index.js +3 -0
  108. package/dist/utils/index.js.map +1 -0
  109. package/package.json +90 -0
@@ -0,0 +1,122 @@
1
+ import { MemoryStore } from '../stores/memory-store.js';
2
+ import { RateLimitStrategy } from '../types/index.js';
3
+ /**
4
+ * Default key extractor: uses `req.ip`, then `socket.remoteAddress`, else `"unknown"`.
5
+ * Strings are returned as-is so you can pass a precomputed key.
6
+ */
7
+ export function defaultKeyGenerator(req) {
8
+ if (typeof req === 'string') {
9
+ return req;
10
+ }
11
+ if (req !== null && typeof req === 'object') {
12
+ const r = req;
13
+ if (typeof r.ip === 'string' && r.ip.length > 0) {
14
+ return r.ip;
15
+ }
16
+ const socket = r.socket;
17
+ if (socket !== null && typeof socket === 'object' && 'remoteAddress' in socket) {
18
+ const addr = socket.remoteAddress;
19
+ if (typeof addr === 'string' && addr.length > 0) {
20
+ return addr;
21
+ }
22
+ }
23
+ }
24
+ return 'unknown';
25
+ }
26
+ function createDefaultMemoryStore(options) {
27
+ if (options.strategy === RateLimitStrategy.TOKEN_BUCKET) {
28
+ return new MemoryStore({
29
+ strategy: RateLimitStrategy.TOKEN_BUCKET,
30
+ tokensPerInterval: options.tokensPerInterval,
31
+ interval: options.interval,
32
+ bucketSize: options.bucketSize,
33
+ });
34
+ }
35
+ return new MemoryStore({
36
+ strategy: options.strategy ?? RateLimitStrategy.SLIDING_WINDOW,
37
+ windowMs: options.windowMs ?? 60000,
38
+ maxRequests: options.maxRequests ?? 100,
39
+ });
40
+ }
41
+ function resolveOptions(input) {
42
+ const store = input.store ?? createDefaultMemoryStore(input);
43
+ return { ...input, store };
44
+ }
45
+ /**
46
+ * Build a {@link RateLimitEngine} with optional in-memory store when `store` is omitted.
47
+ */
48
+ export function createRateLimiter(options) {
49
+ return new RateLimitEngine(resolveOptions(options));
50
+ }
51
+ /**
52
+ * Orchestrates key extraction, store increments, header generation, and limit callbacks.
53
+ */
54
+ export class RateLimitEngine {
55
+ constructor(options) {
56
+ this.options = options;
57
+ }
58
+ /**
59
+ * Applies rate limiting for an incoming request-like value.
60
+ * Uses {@link RateLimitOptionsBase.keyGenerator} (or {@link defaultKeyGenerator}) to derive the storage key.
61
+ */
62
+ async consume(req) {
63
+ const key = (this.options.keyGenerator ?? defaultKeyGenerator)(req);
64
+ return this.consumeWithKey(key, req);
65
+ }
66
+ /**
67
+ * Rate limit using a precomputed storage key (skips `keyGenerator`).
68
+ * Pass the same `req` for `onLimitReached` / `skip` callbacks when applicable.
69
+ */
70
+ async consumeWithKey(key, req = key) {
71
+ if (this.options.skip?.(req) === true) {
72
+ return this.buildPassthroughResult();
73
+ }
74
+ const result = await this.options.store.increment(key);
75
+ const headers = this.buildHeaders(result);
76
+ if (result.isBlocked && this.options.onLimitReached) {
77
+ await Promise.resolve(this.options.onLimitReached(req, result));
78
+ }
79
+ return { ...result, headers };
80
+ }
81
+ getLimit() {
82
+ if (this.options.strategy === RateLimitStrategy.TOKEN_BUCKET) {
83
+ return this.options.bucketSize;
84
+ }
85
+ return this.options.maxRequests ?? 100;
86
+ }
87
+ buildPassthroughResult() {
88
+ const limit = this.getLimit();
89
+ const resetTime = new Date(Date.now() + 60000);
90
+ const base = {
91
+ totalHits: 0,
92
+ remaining: limit,
93
+ resetTime,
94
+ isBlocked: false,
95
+ };
96
+ return {
97
+ ...base,
98
+ headers: this.composeHeaders(base),
99
+ };
100
+ }
101
+ buildHeaders(result) {
102
+ return this.composeHeaders(result);
103
+ }
104
+ composeHeaders(result) {
105
+ if (this.options.headers === false) {
106
+ return {};
107
+ }
108
+ const limit = this.getLimit();
109
+ const resetSec = Math.ceil(result.resetTime.getTime() / 1000);
110
+ const headers = {
111
+ 'X-RateLimit-Limit': String(limit),
112
+ 'X-RateLimit-Remaining': String(Math.max(0, result.remaining)),
113
+ 'X-RateLimit-Reset': String(resetSec),
114
+ };
115
+ if (result.isBlocked) {
116
+ const retryAfterSec = Math.max(1, Math.ceil((result.resetTime.getTime() - Date.now()) / 1000));
117
+ headers['Retry-After'] = String(retryAfterSec);
118
+ }
119
+ return headers;
120
+ }
121
+ }
122
+ //# sourceMappingURL=rate-limit-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-engine.js","sourceRoot":"","sources":["../../src/strategies/rate-limit-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /** Shared types for rate limiting */
2
+ /**
3
+ * Built-in rate limiting algorithms.
4
+ */
5
+ export declare enum RateLimitStrategy {
6
+ SLIDING_WINDOW = "SLIDING_WINDOW",
7
+ TOKEN_BUCKET = "TOKEN_BUCKET",
8
+ FIXED_WINDOW = "FIXED_WINDOW"
9
+ }
10
+ /**
11
+ * Result of incrementing a counter in the backing store.
12
+ */
13
+ export interface RateLimitResult {
14
+ totalHits: number;
15
+ remaining: number;
16
+ resetTime: Date;
17
+ isBlocked: boolean;
18
+ }
19
+ /**
20
+ * Pluggable persistence for rate limit state.
21
+ */
22
+ export interface RateLimitStore {
23
+ increment(key: string): Promise<RateLimitResult>;
24
+ decrement(key: string): Promise<void>;
25
+ reset(key: string): Promise<void>;
26
+ shutdown(): Promise<void>;
27
+ }
28
+ /**
29
+ * Per-request rate limit snapshot (e.g. for headers or `req` augmentation).
30
+ */
31
+ export interface RateLimitInfo {
32
+ limit: number;
33
+ current: number;
34
+ remaining: number;
35
+ resetTime: Date;
36
+ }
37
+ /**
38
+ * Options shared by all strategies.
39
+ */
40
+ export interface RateLimitOptionsBase {
41
+ /**
42
+ * Function to extract a stable identifier for the client (e.g. IP).
43
+ * Default in implementations is typically `req.ip` when present.
44
+ */
45
+ keyGenerator?: (req: unknown) => string;
46
+ /** Invoked when the limit is exceeded. */
47
+ onLimitReached?: (req: unknown, result: RateLimitResult) => void | Promise<void>;
48
+ /** When true, failed responses do not count toward the limit. @default false */
49
+ skipFailedRequests?: boolean;
50
+ /** When true, successful responses do not count toward the limit. @default false */
51
+ skipSuccessfulRequests?: boolean;
52
+ /** When true, send `X-RateLimit-*` headers. @default true */
53
+ headers?: boolean;
54
+ /** HTTP status when blocked. @default 429 */
55
+ statusCode?: number;
56
+ /** Body or payload when blocked. @default "Too many requests" */
57
+ message?: string | object;
58
+ /** When true, rate limiting is skipped for this request. */
59
+ skip?: (req: unknown) => boolean;
60
+ /** Backing store for counters / bucket state. */
61
+ store: RateLimitStore;
62
+ }
63
+ /**
64
+ * Options for sliding-window and fixed-window strategies.
65
+ * @default strategy SLIDING_WINDOW, windowMs 60000, maxRequests 100
66
+ */
67
+ export interface WindowRateLimitOptions extends RateLimitOptionsBase {
68
+ strategy?: RateLimitStrategy.SLIDING_WINDOW | RateLimitStrategy.FIXED_WINDOW;
69
+ /** Time window in milliseconds. @default 60000 */
70
+ windowMs?: number;
71
+ /** Max requests allowed per window. @default 100 */
72
+ maxRequests?: number;
73
+ }
74
+ /**
75
+ * Options when using {@link RateLimitStrategy.TOKEN_BUCKET}.
76
+ */
77
+ export interface TokenBucketRateLimitOptions extends RateLimitOptionsBase {
78
+ strategy: RateLimitStrategy.TOKEN_BUCKET;
79
+ /** Tokens added per {@link TokenBucketRateLimitOptions.interval}. */
80
+ tokensPerInterval: number;
81
+ /** Interval length in milliseconds. */
82
+ interval: number;
83
+ /** Maximum tokens (burst capacity). */
84
+ bucketSize: number;
85
+ }
86
+ /**
87
+ * Configuration for the rate limiter.
88
+ *
89
+ * Use {@link WindowRateLimitOptions} for sliding/fixed window, or
90
+ * {@link TokenBucketRateLimitOptions} for token bucket (extra fields required).
91
+ */
92
+ export type RateLimitOptions = WindowRateLimitOptions | TokenBucketRateLimitOptions;
93
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC;;GAEG;AACH,oBAAY,iBAAiB;IAC3B,cAAc,mBAAmB;IACjC,YAAY,iBAAiB;IAC7B,YAAY,iBAAiB;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACjD,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAExC,0CAA0C;IAC1C,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjF,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,oFAAoF;IACpF,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC,6DAA6D;IAC7D,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE1B,4DAA4D;IAC5D,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;IAEjC,iDAAiD;IACjD,KAAK,EAAE,cAAc,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,oBAAoB;IAClE,QAAQ,CAAC,EAAE,iBAAiB,CAAC,cAAc,GAAG,iBAAiB,CAAC,YAAY,CAAC;IAE7E,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA4B,SAAQ,oBAAoB;IACvE,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC;IAEzC,qEAAqE;IACrE,iBAAiB,EAAE,MAAM,CAAC;IAE1B,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IAEjB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,sBAAsB,GAAG,2BAA2B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** Shared types for rate limiting */
2
+ /**
3
+ * Built-in rate limiting algorithms.
4
+ */
5
+ export var RateLimitStrategy;
6
+ (function (RateLimitStrategy) {
7
+ RateLimitStrategy["SLIDING_WINDOW"] = "SLIDING_WINDOW";
8
+ RateLimitStrategy["TOKEN_BUCKET"] = "TOKEN_BUCKET";
9
+ RateLimitStrategy["FIXED_WINDOW"] = "FIXED_WINDOW";
10
+ })(RateLimitStrategy || (RateLimitStrategy = {}));
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC;;GAEG;AACH,MAAM,CAAN,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IAC3B,sDAAiC,CAAA;IACjC,kDAA6B,CAAA;IAC7B,kDAA6B,CAAA;AAC/B,CAAC,EAJW,iBAAiB,KAAjB,iBAAiB,QAI5B"}
@@ -0,0 +1,3 @@
1
+ /** Internal utilities */
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AAEzB,OAAO,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Internal utilities */
2
+ export {};
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,yBAAyB"}
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "ratelimit-flex",
3
+ "version": "1.0.0",
4
+ "description": "Flexible rate limiting for Node.js (Express, Fastify, sliding window, token bucket)",
5
+ "license": "MIT",
6
+ "keywords": [
7
+ "rate-limiter",
8
+ "express",
9
+ "fastify",
10
+ "sliding-window",
11
+ "token-bucket",
12
+ "middleware",
13
+ "rate-limiting"
14
+ ],
15
+ "author": "",
16
+ "type": "module",
17
+ "main": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "import": {
22
+ "types": "./dist/index.d.ts",
23
+ "default": "./dist/index.js"
24
+ },
25
+ "require": {
26
+ "types": "./dist/cjs/index.d.ts",
27
+ "default": "./dist/cjs/index.js"
28
+ },
29
+ "default": "./dist/index.js"
30
+ }
31
+ },
32
+ "peerDependencies": {
33
+ "@types/express": "*",
34
+ "express": "^4.18.0 || ^5.0.0",
35
+ "fastify": "^4.28.0 || ^5.0.0",
36
+ "fastify-plugin": "^4.5.1 || ^5.0.0",
37
+ "ioredis": "^5.0.0"
38
+ },
39
+ "peerDependenciesMeta": {
40
+ "@types/express": {
41
+ "optional": true
42
+ },
43
+ "express": {
44
+ "optional": true
45
+ },
46
+ "fastify": {
47
+ "optional": true
48
+ },
49
+ "fastify-plugin": {
50
+ "optional": true
51
+ },
52
+ "ioredis": {
53
+ "optional": true
54
+ }
55
+ },
56
+ "engines": {
57
+ "node": ">=18"
58
+ },
59
+ "files": [
60
+ "dist/",
61
+ "README.md",
62
+ "LICENSE",
63
+ "CHANGELOG.md"
64
+ ],
65
+ "scripts": {
66
+ "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json",
67
+ "test": "vitest run",
68
+ "test:coverage": "vitest run --coverage",
69
+ "lint": "eslint .",
70
+ "format": "prettier --write .",
71
+ "format:check": "prettier --check .",
72
+ "prepublishOnly": "npm run lint && npm run test && npm run build"
73
+ },
74
+ "devDependencies": {
75
+ "@eslint/js": "^10.0.1",
76
+ "@types/express": "^5.0.0",
77
+ "@types/node": "^25.5.0",
78
+ "@types/supertest": "^7.2.0",
79
+ "@vitest/coverage-v8": "^4.1.2",
80
+ "eslint": "^10.1.0",
81
+ "express": "^5.2.1",
82
+ "fastify": "^5.8.4",
83
+ "fastify-plugin": "^5.0.0",
84
+ "prettier": "^3.8.1",
85
+ "supertest": "^7.2.2",
86
+ "typescript": "^5.9.3",
87
+ "typescript-eslint": "^8.57.2",
88
+ "vitest": "^4.1.2"
89
+ }
90
+ }