@ultimat3/cache 19.2.0 → 19.3.2

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/CLAUDE.md CHANGED
@@ -306,6 +306,12 @@ Tier 1. Tagged caching + THE invalidation graph.
306
306
  cause name the keys that are actually set. Names only — all four keys can hold a credential.
307
307
  - A remote driver takes an injected `fetch` so a test never unseals the network; the loopback
308
308
  proof in `purge-fastly.test.ts` is the only place the default one runs.
309
+ - **The purge URL in a `fix:` goes through `renderFixShellArg`** (`As of 2026-09-06`).
310
+ `purgePost`'s transport failure names `curl -sS -m 5 -o /dev/null <url>`, a command a reader
311
+ pastes, and the URL is operator data from `.env.production` (`purge-env.ts`) — so `$(…)` and a
312
+ backtick in it substitute before `curl` is reached. An ordinary endpoint travels verbatim; the
313
+ URL is in the `detail` either way, which is read rather than run. `renderFixLiteral` cannot
314
+ stand in: its double quotes leave `$(…)` live.
309
315
 
310
316
  ## Files
311
317
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ultimat3/cache",
3
- "version": "19.2.0",
3
+ "version": "19.3.2",
4
4
  "description": "Tagged caching: request memo, LRU, Redis, CDN — one invalidation graph",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -31,6 +31,6 @@
31
31
  "test": "bun test"
32
32
  },
33
33
  "dependencies": {
34
- "@ultimat3/core": "19.2.0"
34
+ "@ultimat3/core": "19.3.2"
35
35
  }
36
36
  }
package/src/purge-http.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // forces. Kept apart from the drivers because "which failure can succeed unchanged" is one
4
4
  // judgement, and two copies of it would drift into two answers for the same 429.
5
5
 
6
- import { renderThrowable } from '@ultimat3/core';
6
+ import { renderFixShellArg, renderThrowable } from '@ultimat3/core';
7
7
  import { CacheDriverUnavailableError, CachePurgeFailedError } from './errors';
8
8
 
9
9
  /** Just the call. `typeof fetch` also carries `preconnect`, which no test double should have to. */
@@ -192,7 +192,10 @@ export async function purgePost(input: PurgePostInput): Promise<Response> {
192
192
  driver: input.driver,
193
193
  detail: `${reason} — nothing left this host for ${input.url} (egress, DNS or TLS)`,
194
194
  retryable: true,
195
- fix: `curl -sS -m 5 -o /dev/null ${input.url}`,
195
+ // The endpoint comes from `.env.production` (`purge-env.ts`), so it is operator data in a
196
+ // COMMAND position: `$(…)` and a backtick substitute before `curl` is reached. The URL is
197
+ // already in the `detail` above, which is read rather than pasted.
198
+ fix: `curl -sS -m 5 -o /dev/null ${renderFixShellArg(input.url, '<the purge endpoint the cause names>')}`,
196
199
  });
197
200
  }
198
201
  }