@netlify/cache 1.11.2 → 3.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.
@@ -68,8 +68,10 @@ var UserAgent = "user-agent";
68
68
  // src/bootstrap/cache.ts
69
69
  var allowedProtocols = /* @__PURE__ */ new Set(["http:", "https:"]);
70
70
  var discardedHeaders = /* @__PURE__ */ new Set(["cookie", "content-encoding", "content-length"]);
71
+ var forbiddenHeaderPrefixes = ["netlify-programmable-", "x-nf-"];
71
72
  var getInternalHeaders = Symbol("getInternalHeaders");
72
- var serializeResourceHeaders = Symbol("serializeResourceHeaders");
73
+ var serializeRequestHeaders = Symbol("serializeRequestHeaders");
74
+ var serializeResponseHeaders = Symbol("serializeResponseHeaders");
73
75
  var _getContext, _name, _userAgent;
74
76
  var NetlifyCache = class {
75
77
  constructor({ getContext, name, userAgent }) {
@@ -94,7 +96,20 @@ var NetlifyCache = class {
94
96
  }
95
97
  return headers;
96
98
  }
97
- [serializeResourceHeaders](headers) {
99
+ [serializeRequestHeaders](headers) {
100
+ const headersMap = {};
101
+ headers.forEach((value, key) => {
102
+ const normalizedKey = key.toLowerCase();
103
+ for (const prefix of forbiddenHeaderPrefixes) {
104
+ if (normalizedKey.startsWith(prefix)) {
105
+ return;
106
+ }
107
+ }
108
+ headersMap[normalizedKey] = value;
109
+ });
110
+ return headersMap;
111
+ }
112
+ [serializeResponseHeaders](headers) {
98
113
  const headersMap = {};
99
114
  headers.forEach((value, key) => {
100
115
  if (discardedHeaders.has(key)) {
@@ -115,7 +130,6 @@ var NetlifyCache = class {
115
130
  async addAll(requests) {
116
131
  await Promise.allSettled(requests.map((request) => this.add(request)));
117
132
  }
118
- // eslint-disable-next-line class-methods-use-this, require-await, @typescript-eslint/no-unused-vars
119
133
  async delete(request) {
120
134
  const context = __privateGet(this, _getContext).call(this, { operation: "delete" /* Delete */ });
121
135
  if (context) {
@@ -127,7 +141,6 @@ var NetlifyCache = class {
127
141
  }
128
142
  return true;
129
143
  }
130
- // eslint-disable-next-line class-methods-use-this, require-await, @typescript-eslint/no-unused-vars
131
144
  async keys(_request) {
132
145
  return [];
133
146
  }
@@ -140,7 +153,10 @@ var NetlifyCache = class {
140
153
  const resourceURL = extractAndValidateURL(request);
141
154
  const cacheURL = `${context.url}/${toCacheKey(resourceURL)}`;
142
155
  const response = await fetch(cacheURL, {
143
- headers: this[getInternalHeaders](context),
156
+ headers: {
157
+ ...request instanceof Request ? this[serializeRequestHeaders](request.headers) : {},
158
+ ...this[getInternalHeaders](context)
159
+ },
144
160
  method: "GET"
145
161
  });
146
162
  if (!response.ok) {
@@ -150,7 +166,6 @@ var NetlifyCache = class {
150
166
  } catch {
151
167
  }
152
168
  }
153
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
154
169
  async matchAll(request, _options) {
155
170
  if (!request) {
156
171
  return [];
@@ -180,7 +195,7 @@ var NetlifyCache = class {
180
195
  body: response.body,
181
196
  headers: {
182
197
  ...this[getInternalHeaders](context),
183
- [ResourceHeaders]: this[serializeResourceHeaders](response.headers),
198
+ [ResourceHeaders]: this[serializeResponseHeaders](response.headers),
184
199
  [ResourceStatus]: response.status.toString()
185
200
  },
186
201
  // @ts-expect-error https://github.com/whatwg/fetch/pull/1457
@@ -1,5 +1,5 @@
1
- import { E as EnvironmentOptions } from '../cache-Boq7iRAh.cjs';
2
- export { N as NetlifyCache, O as Operation, R as RequestContextFactory } from '../cache-Boq7iRAh.cjs';
1
+ import { E as EnvironmentOptions } from '../cache-B9TsVKLp.cjs';
2
+ export { N as NetlifyCache, O as Operation, R as RequestContextFactory } from '../cache-B9TsVKLp.cjs';
3
3
 
4
4
  declare class NetlifyCacheStorage {
5
5
  #private;
@@ -1,5 +1,5 @@
1
- import { E as EnvironmentOptions } from '../cache-Boq7iRAh.js';
2
- export { N as NetlifyCache, O as Operation, R as RequestContextFactory } from '../cache-Boq7iRAh.js';
1
+ import { E as EnvironmentOptions } from '../cache-B9TsVKLp.js';
2
+ export { N as NetlifyCache, O as Operation, R as RequestContextFactory } from '../cache-B9TsVKLp.js';
3
3
 
4
4
  declare class NetlifyCacheStorage {
5
5
  #private;
@@ -41,8 +41,10 @@ var UserAgent = "user-agent";
41
41
  // src/bootstrap/cache.ts
42
42
  var allowedProtocols = /* @__PURE__ */ new Set(["http:", "https:"]);
43
43
  var discardedHeaders = /* @__PURE__ */ new Set(["cookie", "content-encoding", "content-length"]);
44
+ var forbiddenHeaderPrefixes = ["netlify-programmable-", "x-nf-"];
44
45
  var getInternalHeaders = Symbol("getInternalHeaders");
45
- var serializeResourceHeaders = Symbol("serializeResourceHeaders");
46
+ var serializeRequestHeaders = Symbol("serializeRequestHeaders");
47
+ var serializeResponseHeaders = Symbol("serializeResponseHeaders");
46
48
  var _getContext, _name, _userAgent;
47
49
  var NetlifyCache = class {
48
50
  constructor({ getContext, name, userAgent }) {
@@ -67,7 +69,20 @@ var NetlifyCache = class {
67
69
  }
68
70
  return headers;
69
71
  }
70
- [serializeResourceHeaders](headers) {
72
+ [serializeRequestHeaders](headers) {
73
+ const headersMap = {};
74
+ headers.forEach((value, key) => {
75
+ const normalizedKey = key.toLowerCase();
76
+ for (const prefix of forbiddenHeaderPrefixes) {
77
+ if (normalizedKey.startsWith(prefix)) {
78
+ return;
79
+ }
80
+ }
81
+ headersMap[normalizedKey] = value;
82
+ });
83
+ return headersMap;
84
+ }
85
+ [serializeResponseHeaders](headers) {
71
86
  const headersMap = {};
72
87
  headers.forEach((value, key) => {
73
88
  if (discardedHeaders.has(key)) {
@@ -88,7 +103,6 @@ var NetlifyCache = class {
88
103
  async addAll(requests) {
89
104
  await Promise.allSettled(requests.map((request) => this.add(request)));
90
105
  }
91
- // eslint-disable-next-line class-methods-use-this, require-await, @typescript-eslint/no-unused-vars
92
106
  async delete(request) {
93
107
  const context = __privateGet(this, _getContext).call(this, { operation: "delete" /* Delete */ });
94
108
  if (context) {
@@ -100,7 +114,6 @@ var NetlifyCache = class {
100
114
  }
101
115
  return true;
102
116
  }
103
- // eslint-disable-next-line class-methods-use-this, require-await, @typescript-eslint/no-unused-vars
104
117
  async keys(_request) {
105
118
  return [];
106
119
  }
@@ -113,7 +126,10 @@ var NetlifyCache = class {
113
126
  const resourceURL = extractAndValidateURL(request);
114
127
  const cacheURL = `${context.url}/${toCacheKey(resourceURL)}`;
115
128
  const response = await fetch(cacheURL, {
116
- headers: this[getInternalHeaders](context),
129
+ headers: {
130
+ ...request instanceof Request ? this[serializeRequestHeaders](request.headers) : {},
131
+ ...this[getInternalHeaders](context)
132
+ },
117
133
  method: "GET"
118
134
  });
119
135
  if (!response.ok) {
@@ -123,7 +139,6 @@ var NetlifyCache = class {
123
139
  } catch {
124
140
  }
125
141
  }
126
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
127
142
  async matchAll(request, _options) {
128
143
  if (!request) {
129
144
  return [];
@@ -153,7 +168,7 @@ var NetlifyCache = class {
153
168
  body: response.body,
154
169
  headers: {
155
170
  ...this[getInternalHeaders](context),
156
- [ResourceHeaders]: this[serializeResourceHeaders](response.headers),
171
+ [ResourceHeaders]: this[serializeResponseHeaders](response.headers),
157
172
  [ResourceStatus]: response.status.toString()
158
173
  },
159
174
  // @ts-expect-error https://github.com/whatwg/fetch/pull/1457
@@ -22,12 +22,14 @@ type NetlifyCacheOptions = EnvironmentOptions & {
22
22
  name: string;
23
23
  };
24
24
  declare const getInternalHeaders: unique symbol;
25
- declare const serializeResourceHeaders: unique symbol;
25
+ declare const serializeRequestHeaders: unique symbol;
26
+ declare const serializeResponseHeaders: unique symbol;
26
27
  declare class NetlifyCache implements Cache {
27
28
  #private;
28
29
  constructor({ getContext, name, userAgent }: NetlifyCacheOptions);
29
30
  private [getInternalHeaders];
30
- private [serializeResourceHeaders];
31
+ private [serializeRequestHeaders];
32
+ private [serializeResponseHeaders];
31
33
  add(request: RequestInfo | URL): Promise<void>;
32
34
  addAll(requests: RequestInfo[]): Promise<void>;
33
35
  delete(request: RequestInfo | URL): Promise<boolean>;
@@ -22,12 +22,14 @@ type NetlifyCacheOptions = EnvironmentOptions & {
22
22
  name: string;
23
23
  };
24
24
  declare const getInternalHeaders: unique symbol;
25
- declare const serializeResourceHeaders: unique symbol;
25
+ declare const serializeRequestHeaders: unique symbol;
26
+ declare const serializeResponseHeaders: unique symbol;
26
27
  declare class NetlifyCache implements Cache {
27
28
  #private;
28
29
  constructor({ getContext, name, userAgent }: NetlifyCacheOptions);
29
30
  private [getInternalHeaders];
30
- private [serializeResourceHeaders];
31
+ private [serializeRequestHeaders];
32
+ private [serializeResponseHeaders];
31
33
  add(request: RequestInfo | URL): Promise<void>;
32
34
  addAll(requests: RequestInfo[]): Promise<void>;
33
35
  delete(request: RequestInfo | URL): Promise<boolean>;
package/dist/main.cjs CHANGED
@@ -210,13 +210,16 @@ var parseCacheStatusValue = (value) => {
210
210
  const parts = value.split(";").map((part) => part.trim());
211
211
  const [namePart, ...attributeParts] = parts;
212
212
  const name = (namePart ?? "").replace(/"/g, "").toLowerCase();
213
- const attributes = attributeParts.reduce((acc, part) => {
214
- const [key, value2 = ""] = part.split("=");
215
- return {
216
- ...acc,
217
- [key]: value2
218
- };
219
- }, {});
213
+ const attributes = attributeParts.reduce(
214
+ (acc, part) => {
215
+ const [key, value2 = ""] = part.split("=");
216
+ return {
217
+ ...acc,
218
+ [key]: value2
219
+ };
220
+ },
221
+ {}
222
+ );
220
223
  return {
221
224
  attributes,
222
225
  name
@@ -303,7 +306,7 @@ var isRequestInit = (input) => {
303
306
  }
304
307
  return false;
305
308
  };
306
- var fetchWithCache = async (request, optionsOrCacheSettings, cacheOptionsParam) => {
309
+ var fetchWithCache = async (requestOrURL, optionsOrCacheSettings, cacheOptionsParam) => {
307
310
  let cacheOptions;
308
311
  let requestInit;
309
312
  if (isRequestInit(optionsOrCacheSettings)) {
@@ -313,13 +316,8 @@ var fetchWithCache = async (request, optionsOrCacheSettings, cacheOptionsParam)
313
316
  cacheOptions = optionsOrCacheSettings || {};
314
317
  requestInit = {};
315
318
  }
316
- let method;
317
- if (request instanceof Request) {
318
- method = request.method;
319
- } else {
320
- method = requestInit?.method;
321
- }
322
- if (method && method?.toLowerCase() !== "get") {
319
+ const request = new Request(requestOrURL, requestInit);
320
+ if (request.method.toLowerCase() !== "get") {
323
321
  throw new TypeError("`fetchWithCache` only supports GET requests.");
324
322
  }
325
323
  let cache;
@@ -339,7 +337,7 @@ var fetchWithCache = async (request, optionsOrCacheSettings, cacheOptionsParam)
339
337
  if (cached) {
340
338
  return cached;
341
339
  }
342
- const fresh = await fetch(request, requestInit);
340
+ const fresh = await fetch(request);
343
341
  if (!fresh.body) {
344
342
  return fresh;
345
343
  }
package/dist/main.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { N as NetlifyCache } from './cache-Boq7iRAh.cjs';
1
+ import { N as NetlifyCache } from './cache-B9TsVKLp.cjs';
2
2
 
3
3
  /**
4
4
  * Polyfill for local development environments where `globalThis.caches` is not
package/dist/main.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { N as NetlifyCache } from './cache-Boq7iRAh.js';
1
+ import { N as NetlifyCache } from './cache-B9TsVKLp.js';
2
2
 
3
3
  /**
4
4
  * Polyfill for local development environments where `globalThis.caches` is not
package/dist/main.js CHANGED
@@ -176,13 +176,16 @@ var parseCacheStatusValue = (value) => {
176
176
  const parts = value.split(";").map((part) => part.trim());
177
177
  const [namePart, ...attributeParts] = parts;
178
178
  const name = (namePart ?? "").replace(/"/g, "").toLowerCase();
179
- const attributes = attributeParts.reduce((acc, part) => {
180
- const [key, value2 = ""] = part.split("=");
181
- return {
182
- ...acc,
183
- [key]: value2
184
- };
185
- }, {});
179
+ const attributes = attributeParts.reduce(
180
+ (acc, part) => {
181
+ const [key, value2 = ""] = part.split("=");
182
+ return {
183
+ ...acc,
184
+ [key]: value2
185
+ };
186
+ },
187
+ {}
188
+ );
186
189
  return {
187
190
  attributes,
188
191
  name
@@ -269,7 +272,7 @@ var isRequestInit = (input) => {
269
272
  }
270
273
  return false;
271
274
  };
272
- var fetchWithCache = async (request, optionsOrCacheSettings, cacheOptionsParam) => {
275
+ var fetchWithCache = async (requestOrURL, optionsOrCacheSettings, cacheOptionsParam) => {
273
276
  let cacheOptions;
274
277
  let requestInit;
275
278
  if (isRequestInit(optionsOrCacheSettings)) {
@@ -279,13 +282,8 @@ var fetchWithCache = async (request, optionsOrCacheSettings, cacheOptionsParam)
279
282
  cacheOptions = optionsOrCacheSettings || {};
280
283
  requestInit = {};
281
284
  }
282
- let method;
283
- if (request instanceof Request) {
284
- method = request.method;
285
- } else {
286
- method = requestInit?.method;
287
- }
288
- if (method && method?.toLowerCase() !== "get") {
285
+ const request = new Request(requestOrURL, requestInit);
286
+ if (request.method.toLowerCase() !== "get") {
289
287
  throw new TypeError("`fetchWithCache` only supports GET requests.");
290
288
  }
291
289
  let cache;
@@ -305,7 +303,7 @@ var fetchWithCache = async (request, optionsOrCacheSettings, cacheOptionsParam)
305
303
  if (cached) {
306
304
  return cached;
307
305
  }
308
- const fresh = await fetch(request, requestInit);
306
+ const fresh = await fetch(request);
309
307
  if (!fresh.body) {
310
308
  return fresh;
311
309
  }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@netlify/cache",
3
- "version": "1.11.2",
3
+ "version": "3.0.0",
4
4
  "description": "TypeScript utilities for interacting with the Netlify cache",
5
5
  "type": "module",
6
6
  "engines": {
7
- "node": "^14.16.0 || >=16.0.0"
7
+ "node": ">=20.6.1"
8
8
  },
9
9
  "main": "./dist/main.cjs",
10
10
  "module": "./dist/main.js",
@@ -47,10 +47,10 @@
47
47
  "build": "tsup-node",
48
48
  "dev": "tsup-node --watch",
49
49
  "prepack": "npm run build",
50
- "test": "run-s build test:dev",
50
+ "test": "run-s build test:ci",
51
51
  "test:dev": "run-s build test:dev:*",
52
52
  "test:ci": "run-s build test:ci:*",
53
- "test:dev:vitest": "vitest run",
53
+ "test:dev:vitest": "vitest",
54
54
  "test:dev:vitest:watch": "vitest watch",
55
55
  "test:ci:vitest": "vitest run",
56
56
  "publint": "npx -y publint --strict"
@@ -68,15 +68,13 @@
68
68
  },
69
69
  "author": "Netlify Inc.",
70
70
  "devDependencies": {
71
- "@netlify/dev-utils": "2.2.0",
72
- "@netlify/types": "1.2.0",
71
+ "@netlify/dev-utils": "3.1.0",
72
+ "@netlify/types": "2.0.1",
73
73
  "npm-run-all2": "^7.0.2",
74
- "semver": "^7.5.3",
75
- "tmp-promise": "^3.0.3",
76
74
  "tsup": "^8.0.0",
77
75
  "vitest": "^3.0.0"
78
76
  },
79
77
  "dependencies": {
80
- "@netlify/runtime-utils": "1.3.1"
78
+ "@netlify/runtime-utils": "2.1.0"
81
79
  }
82
80
  }