https://github.com/drsensor/safe-html-rewriter
Safe (fault-tolerant) wrapper around https://github.com/cloudflare/html-rewriter-wasm
https://github.com/drsensor/safe-html-rewriter
cloudflare html lol rewriting worker workers
Last synced: about 1 month ago
JSON representation
Safe (fault-tolerant) wrapper around https://github.com/cloudflare/html-rewriter-wasm
- Host: GitHub
- URL: https://github.com/drsensor/safe-html-rewriter
- Owner: DrSensor
- License: bsd-3-clause
- Created: 2023-02-07T09:58:08.000Z (about 3 years ago)
- Default Branch: trunk
- Last Pushed: 2023-03-25T13:09:35.000Z (almost 3 years ago)
- Last Synced: 2025-04-06T07:53:03.668Z (11 months ago)
- Topics: cloudflare, html, lol, rewriting, worker, workers
- Language: TypeScript
- Homepage:
- Size: 28.3 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# safe-html-rewriter
Safe (fault-tolerant) wrapper around [WebAssembly version of Cloudlflare HTMLRewriter][html-rewriter-wasm][^1]
```ts
import { HTMLRewriter, type RewriterHandlers } from "npm:safe-html-rewriter";
import { expandGlob } from "https://deno.land/std/fs/mod.ts";
const rewrite = new HTMLRewriter();
const handler = {
element(el) { el.remove() }
} satisfies RewriterHandlers
for await (const { path } of expandGlob("your/index.{html,njk,jinja,tmpl}")) {
const content = await Deno.readTextFile(path);
rewrite.on('script[src*="unwanted-script"]', handler); // share same handler
rewrite.on('link[rel="stylesheet",href*="unwanted-css"]', { // single selector with many handlers
element(el) {
el.remove()
console.log(`remove ${el.getAttribute(href)} from ${path}`)
console.log("--------------------------------------------")
console.log(content)
console.log("--------------------------------------------")
}
});
const output = await rewrite.transform(content);
console.log("\n", path);
console.log("-------------------------------------------------------------");
console.log(output);
console.log("-------------------------------------------------------------");
}
rewrite.off('script[src*="unwanted-script"]', handler); // only remove specific handler
rewrite.off('link[rel="stylesheet",href*="unwanted-css"]'); // remove all handlers for specific selector
rewrite.free(); // remove all handlers and free memory
```
[^1]: https://developers.cloudflare.com/workers/runtime-apis/html-rewriter/
## Why?
[html-rewriter-wasm][] designed to operate on per-chunk basis which is suitable for streaming response.
However, it can be [tricky](https://github.com/cloudflare/html-rewriter-wasm#caveats) when you use it in non-streaming response.
For example, adding another handler after calling `rewriter.write` will give an error.
This package solve that and also give you an easier API.
[html-rewriter-wasm]: https://github.com/cloudflare/html-rewriter-wasm