express-memorize 1.2.0 → 1.4.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/CHANGELOG.md +20 -0
- package/README.md +48 -4
- package/dist/MemorizeStore.d.ts +14 -1
- package/dist/MemorizeStore.d.ts.map +1 -1
- package/dist/MemorizeStore.js +27 -1
- package/dist/MemorizeStore.js.map +1 -1
- package/dist/domain/CacheEntry.d.ts +2 -0
- package/dist/domain/CacheEntry.d.ts.map +1 -1
- package/dist/domain/Memorize.d.ts +25 -0
- package/dist/domain/Memorize.d.ts.map +1 -1
- package/dist/domain/MemorizeCallOptions.d.ts +6 -0
- package/dist/domain/MemorizeCallOptions.d.ts.map +1 -1
- package/dist/memorize.d.ts.map +1 -1
- package/dist/memorize.js +6 -0
- package/dist/memorize.js.map +1 -1
- package/dist/utils/globToRegex.d.ts +12 -0
- package/dist/utils/globToRegex.d.ts.map +1 -0
- package/dist/utils/globToRegex.js +41 -0
- package/dist/utils/globToRegex.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,26 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
This file is automatically updated by [release-please](https://github.com/googleapis/release-please) based on [Conventional Commits](https://www.conventionalcommits.org/).
|
|
6
6
|
|
|
7
|
+
## [1.4.0](https://github.com/ElJijuna/express-memorize/compare/v1.3.0...v1.4.0) (2026-03-31)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* add hits counter to track cache key consumption ([8104029](https://github.com/ElJijuna/express-memorize/commit/81040296354c8a6de78542d6cc6c3fdc18e21e04))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
* add header X-Cache: BYPASS value when set noCache: true in middleware config to override. ([cab3c85](https://github.com/ElJijuna/express-memorize/commit/cab3c85f53885ff287e569248a402632363f31fd))
|
|
18
|
+
|
|
19
|
+
## [1.3.0](https://github.com/ElJijuna/express-memorize/compare/v1.2.0...v1.3.0) (2026-03-26)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### Features
|
|
23
|
+
|
|
24
|
+
* add 'deleteMatching' to delete with pattern from cache. ([3564f0a](https://github.com/ElJijuna/express-memorize/commit/3564f0a316c54031216fce8df042b78c81d27fe3))
|
|
25
|
+
* add config in middleware to disable cache to specific paths. ([cf89777](https://github.com/ElJijuna/express-memorize/commit/cf897777a2c5c984466ec6061a1befbddf73f502))
|
|
26
|
+
|
|
7
27
|
## [1.2.0](https://github.com/ElJijuna/express-memorize/compare/v1.1.0...v1.2.0) (2026-03-24)
|
|
8
28
|
|
|
9
29
|
|
package/README.md
CHANGED
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
- Per-route TTL override
|
|
22
22
|
- Event hooks: `set`, `delete`, `expire`
|
|
23
23
|
- Cache inspection and invalidation API
|
|
24
|
-
-
|
|
24
|
+
- Hit counter per cache entry
|
|
25
|
+
- `X-Cache: HIT | MISS | BYPASS` response header
|
|
25
26
|
- Zero runtime dependencies
|
|
26
27
|
- Full TypeScript support
|
|
27
28
|
|
|
@@ -102,6 +103,33 @@ app.post('/users', (req, res) => {
|
|
|
102
103
|
});
|
|
103
104
|
```
|
|
104
105
|
|
|
106
|
+
### Pattern-based invalidation
|
|
107
|
+
|
|
108
|
+
Use `cache.deleteMatching(pattern)` to remove all cache entries whose keys match a glob pattern. This is useful when you don't know the exact key — for example, when a URL may have different query strings.
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
// Cached keys: /api/users/abc123, /api/users/abc123?lang=es, /api/users/abc123?page=1
|
|
112
|
+
app.put('/users/:id', (req, res) => {
|
|
113
|
+
users.update(req.params.id, req.body);
|
|
114
|
+
|
|
115
|
+
// Remove all cached variants of this user, regardless of query params
|
|
116
|
+
const deleted = cache.deleteMatching(`**/users/${req.params.id}*`);
|
|
117
|
+
console.log(`${deleted} cache entries removed`);
|
|
118
|
+
|
|
119
|
+
res.json({ ok: true });
|
|
120
|
+
});
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Glob rules:**
|
|
124
|
+
|
|
125
|
+
| Pattern | Behaviour |
|
|
126
|
+
|---------|-----------|
|
|
127
|
+
| `*` | Matches any sequence of characters **within** a single path segment (does not cross `/`) |
|
|
128
|
+
| `**` | Matches any sequence of characters **across** path segments (crosses `/`) |
|
|
129
|
+
| `?` | Matches any single character except `/` |
|
|
130
|
+
|
|
131
|
+
`deleteMatching` returns the number of entries removed and emits a `delete` event for each one.
|
|
132
|
+
|
|
105
133
|
### Event hooks
|
|
106
134
|
|
|
107
135
|
```typescript
|
|
@@ -137,14 +165,28 @@ cache.getAll(); // Record<string, CacheInfo> — all active entries
|
|
|
137
165
|
contentType: string;
|
|
138
166
|
expiresAt: number | null;
|
|
139
167
|
remainingTtl: number | null; // ms until expiry, null if no TTL
|
|
168
|
+
hits: number; // total times this key was requested
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
`hits` starts at `1` on the initial cache miss (when the entry is stored) and increments by `1` on every subsequent cache hit. It resets to `1` if the entry is evicted and re-cached.
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
// Example: monitoring hot keys
|
|
176
|
+
const entries = cache.getAll();
|
|
177
|
+
for (const [key, info] of Object.entries(entries)) {
|
|
178
|
+
console.log(`${key} → ${info.hits} hits`);
|
|
140
179
|
}
|
|
180
|
+
// /users → 42 hits
|
|
181
|
+
// /products → 7 hits
|
|
141
182
|
```
|
|
142
183
|
|
|
143
184
|
### Clear the cache
|
|
144
185
|
|
|
145
186
|
```typescript
|
|
146
|
-
cache.delete('/users');
|
|
147
|
-
cache.
|
|
187
|
+
cache.delete('/users'); // remove one entry
|
|
188
|
+
cache.deleteMatching('**/users/*'); // remove all /users/* entries
|
|
189
|
+
cache.clear(); // remove all entries
|
|
148
190
|
```
|
|
149
191
|
|
|
150
192
|
## API Reference
|
|
@@ -172,6 +214,7 @@ Returns an Express `RequestHandler` middleware. Can override the global TTL.
|
|
|
172
214
|
| `get` | `(key: string) => CacheInfo \| null` | Returns info for a cached key. |
|
|
173
215
|
| `getAll` | `() => Record<string, CacheInfo>` | Returns all active cache entries. |
|
|
174
216
|
| `delete` | `(key: string) => boolean` | Removes a single entry. Returns `false` if not found. |
|
|
217
|
+
| `deleteMatching` | `(pattern: string) => number` | Removes all entries matching a glob pattern. Returns the count removed. |
|
|
175
218
|
| `clear` | `() => void` | Removes all entries. |
|
|
176
219
|
|
|
177
220
|
### Events
|
|
@@ -179,7 +222,7 @@ Returns an Express `RequestHandler` middleware. Can override the global TTL.
|
|
|
179
222
|
| Event | Payload | When |
|
|
180
223
|
|-------|---------|------|
|
|
181
224
|
| `set` | `{ type, key, body, statusCode, contentType, expiresAt }` | A response is stored |
|
|
182
|
-
| `delete` | `{ type, key }` | `cache.delete()` or `cache.clear()` is called |
|
|
225
|
+
| `delete` | `{ type, key }` | `cache.delete()`, `cache.deleteMatching()`, or `cache.clear()` is called |
|
|
183
226
|
| `expire` | `{ type, key }` | TTL timer fires or lazy expiry is detected |
|
|
184
227
|
|
|
185
228
|
## Response Headers
|
|
@@ -188,6 +231,7 @@ Returns an Express `RequestHandler` middleware. Can override the global TTL.
|
|
|
188
231
|
|--------|-------|-------------|
|
|
189
232
|
| `X-Cache` | `HIT` | Response served from cache |
|
|
190
233
|
| `X-Cache` | `MISS` | Response computed and stored |
|
|
234
|
+
| `X-Cache` | `BYPASS` | Cache skipped — `noCache: true` was set for this route |
|
|
191
235
|
|
|
192
236
|
## Behavior
|
|
193
237
|
|
package/dist/MemorizeStore.d.ts
CHANGED
|
@@ -44,7 +44,7 @@ export declare class MemorizeStore {
|
|
|
44
44
|
* @param entry - The response data to store.
|
|
45
45
|
* @param ttl - Time-to-live in milliseconds. Omit or pass `null` for no expiry.
|
|
46
46
|
*/
|
|
47
|
-
set(key: string, entry: Omit<CacheEntry, 'expiresAt'>, ttl?: number | null): void;
|
|
47
|
+
set(key: string, entry: Omit<CacheEntry, 'expiresAt' | 'hits'>, ttl?: number | null): void;
|
|
48
48
|
/**
|
|
49
49
|
* Returns the formatted {@link CacheInfo} for the given key, or `null` if the
|
|
50
50
|
* key does not exist or its TTL has elapsed.
|
|
@@ -64,6 +64,19 @@ export declare class MemorizeStore {
|
|
|
64
64
|
* @returns `true` if the entry existed and was removed, `false` otherwise.
|
|
65
65
|
*/
|
|
66
66
|
delete(key: string): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Removes all cache entries whose keys match the given glob pattern.
|
|
69
|
+
* Emits a {@link MemorizeEventType.Delete} event for each removed entry.
|
|
70
|
+
*
|
|
71
|
+
* Glob rules:
|
|
72
|
+
* - `*` — matches any character sequence **within** a single path segment (does not cross `/`).
|
|
73
|
+
* - `**` — matches any character sequence **across** path segments (crosses `/`).
|
|
74
|
+
* - `?` — matches any single character except `/`.
|
|
75
|
+
*
|
|
76
|
+
* @param pattern - Glob pattern to match against cache keys.
|
|
77
|
+
* @returns The number of entries removed.
|
|
78
|
+
*/
|
|
79
|
+
deleteMatching(pattern: string): number;
|
|
67
80
|
/**
|
|
68
81
|
* Removes all entries from the cache. Emits a {@link MemorizeEventType.Delete} event
|
|
69
82
|
* for each entry.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemorizeStore.d.ts","sourceRoot":"","sources":["../src/MemorizeStore.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MemorizeStore.d.ts","sourceRoot":"","sources":["../src/MemorizeStore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,YAAY,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACnB,CAAC;AACF,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAS7B;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,OAAO,CAAoD;IACnE,OAAO,CAAC,UAAU,CAKhB;IAEF;;;;;;;;;;;OAWG;IACH,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,GAAG,EAAK,OAAO,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI;IACjF,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI;IACpF,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI;IACpF,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,EAAG,OAAO,EAAE,CAAC,CAAC,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI;IAMnF;;;;;;;;;OASG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAsB1F;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAYlC;;;OAGG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;IAcnC;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAM5B;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAYvC;;;OAGG;IACH,KAAK,IAAI,IAAI;IAMb;;;;;;;OAOG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAatC,OAAO,CAAC,MAAM;IAYd,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,OAAO;CAWhB"}
|
package/dist/MemorizeStore.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MemorizeStore = exports.MemorizeEventType = void 0;
|
|
4
|
+
const globToRegex_1 = require("./utils/globToRegex");
|
|
4
5
|
const MemorizeEventType_1 = require("./domain/MemorizeEventType");
|
|
5
6
|
Object.defineProperty(exports, "MemorizeEventType", { enumerable: true, get: function () { return MemorizeEventType_1.MemorizeEventType; } });
|
|
6
7
|
/**
|
|
@@ -40,7 +41,7 @@ class MemorizeStore {
|
|
|
40
41
|
this._timers.delete(key);
|
|
41
42
|
}
|
|
42
43
|
const expiresAt = ttl ? Date.now() + ttl : null;
|
|
43
|
-
const stored = { ...entry, expiresAt };
|
|
44
|
+
const stored = { ...entry, expiresAt, hits: 1 };
|
|
44
45
|
this._store.set(key, stored);
|
|
45
46
|
this._emit(MemorizeEventType_1.MemorizeEventType.Set, { type: MemorizeEventType_1.MemorizeEventType.Set, key, ...entry, expiresAt });
|
|
46
47
|
if (ttl) {
|
|
@@ -95,6 +96,29 @@ class MemorizeStore {
|
|
|
95
96
|
this._evict(key, MemorizeEventType_1.MemorizeEventType.Delete);
|
|
96
97
|
return true;
|
|
97
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* Removes all cache entries whose keys match the given glob pattern.
|
|
101
|
+
* Emits a {@link MemorizeEventType.Delete} event for each removed entry.
|
|
102
|
+
*
|
|
103
|
+
* Glob rules:
|
|
104
|
+
* - `*` — matches any character sequence **within** a single path segment (does not cross `/`).
|
|
105
|
+
* - `**` — matches any character sequence **across** path segments (crosses `/`).
|
|
106
|
+
* - `?` — matches any single character except `/`.
|
|
107
|
+
*
|
|
108
|
+
* @param pattern - Glob pattern to match against cache keys.
|
|
109
|
+
* @returns The number of entries removed.
|
|
110
|
+
*/
|
|
111
|
+
deleteMatching(pattern) {
|
|
112
|
+
const regex = (0, globToRegex_1.globToRegex)(pattern);
|
|
113
|
+
let count = 0;
|
|
114
|
+
for (const key of [...this._store.keys()]) {
|
|
115
|
+
if (regex.test(key)) {
|
|
116
|
+
this._evict(key, MemorizeEventType_1.MemorizeEventType.Delete);
|
|
117
|
+
count++;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return count;
|
|
121
|
+
}
|
|
98
122
|
/**
|
|
99
123
|
* Removes all entries from the cache. Emits a {@link MemorizeEventType.Delete} event
|
|
100
124
|
* for each entry.
|
|
@@ -120,6 +144,7 @@ class MemorizeStore {
|
|
|
120
144
|
this._evict(key, MemorizeEventType_1.MemorizeEventType.Expire);
|
|
121
145
|
return null;
|
|
122
146
|
}
|
|
147
|
+
entry.hits++;
|
|
123
148
|
return entry;
|
|
124
149
|
}
|
|
125
150
|
_evict(key, reason) {
|
|
@@ -145,6 +170,7 @@ class MemorizeStore {
|
|
|
145
170
|
statusCode: entry.statusCode,
|
|
146
171
|
contentType: entry.contentType,
|
|
147
172
|
expiresAt: entry.expiresAt,
|
|
173
|
+
hits: entry.hits,
|
|
148
174
|
remainingTtl: entry.expiresAt ? Math.max(0, entry.expiresAt - Date.now()) : null,
|
|
149
175
|
};
|
|
150
176
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemorizeStore.js","sourceRoot":"","sources":["../src/MemorizeStore.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"MemorizeStore.js","sourceRoot":"","sources":["../src/MemorizeStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,5 +10,7 @@ export interface CacheEntry {
|
|
|
10
10
|
contentType: string;
|
|
11
11
|
/** Unix timestamp (ms) at which the entry expires, or `null` if it never expires. */
|
|
12
12
|
expiresAt: number | null;
|
|
13
|
+
/** Number of times this entry has been requested (including the initial cache miss). */
|
|
14
|
+
hits: number;
|
|
13
15
|
}
|
|
14
16
|
//# sourceMappingURL=CacheEntry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheEntry.d.ts","sourceRoot":"","sources":["../../src/domain/CacheEntry.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,+DAA+D;IAC/D,IAAI,EAAE,OAAO,CAAC;IACd,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,4FAA4F;IAC5F,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"CacheEntry.d.ts","sourceRoot":"","sources":["../../src/domain/CacheEntry.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,+DAA+D;IAC/D,IAAI,EAAE,OAAO,CAAC;IACd,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,4FAA4F;IAC5F,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -87,6 +87,31 @@ export interface Memorize {
|
|
|
87
87
|
* ```
|
|
88
88
|
*/
|
|
89
89
|
delete(key: string): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Removes all cache entries whose keys match the given glob pattern.
|
|
92
|
+
* Emits a {@link MemorizeEventType.Delete} event for each removed entry.
|
|
93
|
+
*
|
|
94
|
+
* Glob rules:
|
|
95
|
+
* - `**` — matches any character sequence **across** path segments (crosses `/`).
|
|
96
|
+
* - `*` — matches any character sequence **within** a single path segment (does not cross `/`).
|
|
97
|
+
* - `?` — matches any single character except `/`.
|
|
98
|
+
*
|
|
99
|
+
* @param pattern - Glob pattern to match against cache keys.
|
|
100
|
+
* @returns The number of entries removed.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```ts
|
|
104
|
+
* // Invalidate all cached variants of a user regardless of query params.
|
|
105
|
+
* // Build the pattern with join to avoid the closing-comment sequence in source.
|
|
106
|
+
* app.put('/users/:id', (req, res) => {
|
|
107
|
+
* users.update(req.params.id, req.body);
|
|
108
|
+
* const pattern = ['**', 'users', req.params.id + '*'].join('/');
|
|
109
|
+
* cache.deleteMatching(pattern); // e.g. ** /users/abc123* (no space)
|
|
110
|
+
* res.json({ ok: true });
|
|
111
|
+
* });
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
deleteMatching(pattern: string): number;
|
|
90
115
|
/**
|
|
91
116
|
* Removes **all** entries from the cache and emits a {@link MemorizeEventType.Delete}
|
|
92
117
|
* event for each.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Memorize.d.ts","sourceRoot":"","sources":["../../src/domain/Memorize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,QAAQ;IACvB;;;;;;;;;;;;;;;;;;OAkBG;IACH,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,cAAc,CAAC;IAEhD;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAEnC;;;;;;;OAOG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEpC;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE7B;;;;;;;;OAQG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;;;;;;;;;;;;;;;;OAiBG;IACH,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,GAAG,EAAK,OAAO,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI,CAAC;IAClF,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI,CAAC;IACrF,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI,CAAC;IACrF,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,EAAG,OAAO,EAAE,CAAC,CAAC,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAAC;CACrF"}
|
|
1
|
+
{"version":3,"file":"Memorize.d.ts","sourceRoot":"","sources":["../../src/domain/Memorize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,QAAQ;IACvB;;;;;;;;;;;;;;;;;;OAkBG;IACH,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,cAAc,CAAC;IAEhD;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAEnC;;;;;;;OAOG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEpC;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE7B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IAExC;;;;;;;;OAQG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;;;;;;;;;;;;;;;;OAiBG;IACH,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,GAAG,EAAK,OAAO,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI,CAAC;IAClF,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI,CAAC;IACrF,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI,CAAC;IACrF,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,EAAG,OAAO,EAAE,CAAC,CAAC,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAAC;CACrF"}
|
|
@@ -14,5 +14,11 @@ export interface MemorizeCallOptions {
|
|
|
14
14
|
* Pass `0` or omit to fall back to the global TTL.
|
|
15
15
|
*/
|
|
16
16
|
ttl?: number;
|
|
17
|
+
/**
|
|
18
|
+
* When `true`, the middleware skips both reading from and writing to the cache
|
|
19
|
+
* for this route and sets `X-Cache: BYPASS` on the response. Useful when a
|
|
20
|
+
* global `app.use(cache())` is in place but a specific route should never be cached.
|
|
21
|
+
*/
|
|
22
|
+
noCache?: boolean;
|
|
17
23
|
}
|
|
18
24
|
//# sourceMappingURL=MemorizeCallOptions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemorizeCallOptions.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeCallOptions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"MemorizeCallOptions.d.ts","sourceRoot":"","sources":["../../src/domain/MemorizeCallOptions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
|
package/dist/memorize.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memorize.d.ts","sourceRoot":"","sources":["../src/memorize.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"memorize.d.ts","sourceRoot":"","sources":["../src/memorize.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAoDhE"}
|
package/dist/memorize.js
CHANGED
|
@@ -60,6 +60,11 @@ function memorize(options = {}) {
|
|
|
60
60
|
next();
|
|
61
61
|
return;
|
|
62
62
|
}
|
|
63
|
+
if (callOptions === null || callOptions === void 0 ? void 0 : callOptions.noCache) {
|
|
64
|
+
res.setHeader('X-Cache', 'BYPASS');
|
|
65
|
+
next();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
63
68
|
const key = req.originalUrl;
|
|
64
69
|
const cached = store.getRaw(key);
|
|
65
70
|
if (cached) {
|
|
@@ -84,6 +89,7 @@ function memorize(options = {}) {
|
|
|
84
89
|
cache.get = (key) => store.get(key);
|
|
85
90
|
cache.getAll = () => store.getAll();
|
|
86
91
|
cache.delete = (key) => store.delete(key);
|
|
92
|
+
cache.deleteMatching = (pattern) => store.deleteMatching(pattern);
|
|
87
93
|
cache.clear = () => store.clear();
|
|
88
94
|
cache.on = store.on.bind(store);
|
|
89
95
|
return cache;
|
package/dist/memorize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memorize.js","sourceRoot":"","sources":["../src/memorize.ts"],"names":[],"mappings":";;AAuDA,
|
|
1
|
+
{"version":3,"file":"memorize.js","sourceRoot":"","sources":["../src/memorize.ts"],"names":[],"mappings":";;AAuDA,4BAoDC;AA1GD,mDAAgD;AAOhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,SAAgB,QAAQ,CAAC,UAA2B,EAAE;IACpD,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,6BAAa,EAAE,CAAC;IAElC,MAAM,KAAK,GAAG,UAAU,WAAiC;;QACvD,MAAM,YAAY,GAAG,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,GAAG,mCAAI,GAAG,CAAC;QAE7C,OAAO,UAAU,GAAY,EAAE,GAAa,EAAE,IAAkB;YAC9D,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBACzB,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YAED,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,EAAE,CAAC;gBACzB,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBACnC,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC;YAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEjC,IAAI,MAAM,EAAE,CAAC;gBACX,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAChC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;gBAClD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAChD,OAAO;YACT,CAAC;YAED,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAiC,CAAC;YAExE,GAAG,CAAC,IAAI,GAAG,UAAU,IAAc;;gBACjC,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;oBAClD,MAAM,WAAW,GAAG,MAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAY,mCAAI,0BAA0B,CAAC;oBAC5F,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;gBAClF,CAAC;gBACD,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACjC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC,CAAC;YAEF,IAAI,EAAE,CAAC;QACT,CAAC,CAAC;IACJ,CAAa,CAAC;IAEd,KAAK,CAAC,GAAG,GAAc,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvD,KAAK,CAAC,MAAM,GAAW,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC5C,KAAK,CAAC,MAAM,GAAW,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1D,KAAK,CAAC,cAAc,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC1E,KAAK,CAAC,KAAK,GAAY,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC3C,KAAK,CAAC,EAAE,GAAe,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAmB,CAAC;IAE9D,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a glob pattern to a `RegExp`.
|
|
3
|
+
*
|
|
4
|
+
* Glob rules:
|
|
5
|
+
* - `**` — matches any character sequence across path segments (crosses `/`).
|
|
6
|
+
* - `*` — matches any character sequence within a single path segment (does not cross `/`).
|
|
7
|
+
* - `?` — matches any single character except `/`.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export declare function globToRegex(pattern: string): RegExp;
|
|
12
|
+
//# sourceMappingURL=globToRegex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globToRegex.d.ts","sourceRoot":"","sources":["../../src/utils/globToRegex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAsBnD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.globToRegex = globToRegex;
|
|
4
|
+
/**
|
|
5
|
+
* Converts a glob pattern to a `RegExp`.
|
|
6
|
+
*
|
|
7
|
+
* Glob rules:
|
|
8
|
+
* - `**` — matches any character sequence across path segments (crosses `/`).
|
|
9
|
+
* - `*` — matches any character sequence within a single path segment (does not cross `/`).
|
|
10
|
+
* - `?` — matches any single character except `/`.
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
function globToRegex(pattern) {
|
|
15
|
+
let result = '^';
|
|
16
|
+
let i = 0;
|
|
17
|
+
while (i < pattern.length) {
|
|
18
|
+
const ch = pattern[i];
|
|
19
|
+
if (ch === '*' && pattern[i + 1] === '*') {
|
|
20
|
+
result += '.*';
|
|
21
|
+
i += 2;
|
|
22
|
+
if (pattern[i] === '/')
|
|
23
|
+
i++;
|
|
24
|
+
}
|
|
25
|
+
else if (ch === '*') {
|
|
26
|
+
result += '[^/]*';
|
|
27
|
+
i++;
|
|
28
|
+
}
|
|
29
|
+
else if (ch === '?') {
|
|
30
|
+
result += '[^/]';
|
|
31
|
+
i++;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
result += ch.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
35
|
+
i++;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
result += '$';
|
|
39
|
+
return new RegExp(result);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=globToRegex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globToRegex.js","sourceRoot":"","sources":["../../src/utils/globToRegex.ts"],"names":[],"mappings":";;AAUA,kCAsBC;AAhCD;;;;;;;;;GASG;AACH,SAAgB,WAAW,CAAC,OAAe;IACzC,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,EAAE,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACzC,MAAM,IAAI,IAAI,CAAC;YACf,CAAC,IAAI,CAAC,CAAC;YACP,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,CAAC,EAAE,CAAC;QAC9B,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,OAAO,CAAC;YAClB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,MAAM,CAAC;YACjB,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;YAClD,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,CAAC;IACd,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "express-memorize",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "In-memory cache middleware for Express.js. Caches GET responses with optional TTL — zero dependencies, fully typed.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|