@cloudflare/pages-shared 0.13.8 → 0.13.10
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.
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { TransformStream } from "stream/web";
|
|
2
|
+
import { Response } from "miniflare";
|
|
3
|
+
import type {
|
|
4
|
+
HTMLRewriter as BaseHTMLRewriter,
|
|
5
|
+
DocumentHandlers,
|
|
6
|
+
ElementHandlers,
|
|
7
|
+
} from "html-rewriter-wasm";
|
|
8
|
+
import type { ReadableStream } from "stream/web";
|
|
9
|
+
|
|
10
|
+
// Vendored from Miniflare v2: https://github.com/cloudflare/miniflare/blob/master/packages/html-rewriter/src/rewriter.ts
|
|
11
|
+
|
|
12
|
+
type SelectorElementHandlers = [selector: string, handlers: ElementHandlers];
|
|
13
|
+
|
|
14
|
+
export class HTMLRewriter {
|
|
15
|
+
readonly #elementHandlers: SelectorElementHandlers[] = [];
|
|
16
|
+
readonly #documentHandlers: DocumentHandlers[] = [];
|
|
17
|
+
|
|
18
|
+
on(selector: string, handlers: ElementHandlers): this {
|
|
19
|
+
this.#elementHandlers.push([selector, handlers]);
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
onDocument(handlers: DocumentHandlers): this {
|
|
24
|
+
this.#documentHandlers.push(handlers);
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
transform(response: Response): Response {
|
|
29
|
+
const body = response.body as ReadableStream<Uint8Array> | null;
|
|
30
|
+
// HTMLRewriter doesn't run the end handler if the body is null, so it's
|
|
31
|
+
// pointless to setup the transform stream.
|
|
32
|
+
if (body === null) {
|
|
33
|
+
return new Response(body, response);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Make sure we validate chunks are BufferSources and convert them to
|
|
37
|
+
// Uint8Arrays as required by the Rust glue code.
|
|
38
|
+
response = new Response(response.body, response);
|
|
39
|
+
|
|
40
|
+
let rewriter: BaseHTMLRewriter;
|
|
41
|
+
const transformStream = new TransformStream<Uint8Array, Uint8Array>({
|
|
42
|
+
start: async (controller) => {
|
|
43
|
+
// Create a rewriter instance for this transformation that writes its
|
|
44
|
+
// output to the transformed response's stream. Note that each
|
|
45
|
+
// BaseHTMLRewriter can only be used once. Importing html-rewriter-wasm
|
|
46
|
+
// will also synchronously compile a WebAssembly module, so delay doing
|
|
47
|
+
// this until we really need it.
|
|
48
|
+
// TODO: async compile the WebAssembly module
|
|
49
|
+
const {
|
|
50
|
+
HTMLRewriter: BaseHTMLRewriter,
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
52
|
+
}: typeof import("html-rewriter-wasm") = await import(
|
|
53
|
+
"html-rewriter-wasm"
|
|
54
|
+
);
|
|
55
|
+
rewriter = new BaseHTMLRewriter((output) => {
|
|
56
|
+
// enqueue will throw on empty chunks
|
|
57
|
+
if (output.length !== 0) {
|
|
58
|
+
controller.enqueue(output);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
// Add all registered handlers
|
|
62
|
+
for (const [selector, handlers] of this.#elementHandlers) {
|
|
63
|
+
rewriter.on(selector, handlers);
|
|
64
|
+
}
|
|
65
|
+
for (const handlers of this.#documentHandlers) {
|
|
66
|
+
rewriter.onDocument(handlers);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
// The finally() below will ensure the rewriter is always freed.
|
|
70
|
+
// chunk is guaranteed to be a Uint8Array as we're using the
|
|
71
|
+
// @miniflare/core Response class, which transforms to a byte stream.
|
|
72
|
+
transform: (chunk) => rewriter.write(chunk),
|
|
73
|
+
flush: () => rewriter.end(),
|
|
74
|
+
});
|
|
75
|
+
const promise = body.pipeTo(transformStream.writable);
|
|
76
|
+
promise.catch(() => {}).finally(() => rewriter.free());
|
|
77
|
+
|
|
78
|
+
// Return a response with the transformed body, copying over headers, etc
|
|
79
|
+
const res = new Response(transformStream.readable, response);
|
|
80
|
+
// If Content-Length is set, it's probably going to be wrong, since we're
|
|
81
|
+
// rewriting content, so remove it
|
|
82
|
+
res.headers.delete("Content-Length");
|
|
83
|
+
return res;
|
|
84
|
+
}
|
|
85
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudflare/pages-shared",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.10",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/cloudflare/workers-sdk.git",
|
|
@@ -13,17 +13,15 @@
|
|
|
13
13
|
"metadata-generator/**/*"
|
|
14
14
|
],
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"miniflare": "3.20250214.
|
|
16
|
+
"miniflare": "3.20250214.1"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
|
+
"@cloudflare/vitest-pool-workers": "0.7.0",
|
|
19
20
|
"@cloudflare/workers-types": "^4.20250214.0",
|
|
20
|
-
"@miniflare/cache": "^2.14.4",
|
|
21
|
-
"@miniflare/core": "^2.14.4",
|
|
22
|
-
"@miniflare/html-rewriter": "^2.14.4",
|
|
23
|
-
"@miniflare/storage-memory": "^2.14.4",
|
|
24
21
|
"concurrently": "^8.2.2",
|
|
25
22
|
"glob": "^10.4.5",
|
|
26
|
-
"
|
|
23
|
+
"html-rewriter-wasm": "^0.4.1",
|
|
24
|
+
"vitest": "~3.0.5",
|
|
27
25
|
"@cloudflare/workers-tsconfig": "0.0.0"
|
|
28
26
|
},
|
|
29
27
|
"volta": {
|