import { describe, it, expect } from "bun:test"; import { gcTick } from "./gc"; var setTimeoutAsync = (fn, delay) => { return new Promise((resolve, reject) => { setTimeout(() => { try { resolve(fn()); } catch (e) { reject(e); } }, delay); }); }; describe("HTMLRewriter", () => { it("HTMLRewriter: async replacement", async () => { await gcTick(); const res = new HTMLRewriter() .on("div", { async element(element) { await setTimeoutAsync(() => { element.setInnerContent("replace", { html: true }); }, 5); }, }) .transform(new Response("
example.com
")); await gcTick(); expect(await res.text()).toBe("
replace
"); await gcTick(); }); it("supports element handlers", async () => { var rewriter = new HTMLRewriter(); rewriter.on("div", { element(element) { element.setInnerContent("it worked!", { html: true }); }, }); var input = new Response("
hello
"); var output = rewriter.transform(input); expect(await output.text()).toBe("
it worked!
"); }); it("(from file) supports element handlers", async () => { var rewriter = new HTMLRewriter(); rewriter.on("div", { element(element) { element.setInnerContent("it worked!", { html: true }); }, }); await Bun.write("/tmp/html-rewriter.txt.js", "
hello
"); var input = new Response(Bun.file("/tmp/html-rewriter.txt.js")); var output = rewriter.transform(input); expect(await output.text()).toBe("
it worked!
"); }); it("supports attribute iterator", async () => { var rewriter = new HTMLRewriter(); var expected = [ ["first", ""], ["second", "alrihgt"], ["third", "123"], ["fourth", "5"], ["fifth", "helloooo"], ]; rewriter.on("div", { element(element2) { for (let attr of element2.attributes) { const stack = expected.shift(); expect(stack[0]).toBe(attr[0]); expect(stack[1]).toBe(attr[1]); } }, }); var input = new Response( '
hello
' ); var output = rewriter.transform(input); expect(await output.text()).toBe( '
hello
' ); expect(expected.length).toBe(0); }); it("handles element specific mutations", async () => { // prepend/append let res = new HTMLRewriter() .on("p", { element(element) { element.prepend("prepend"); element.prepend("prepend html", { html: true }); element.append("append"); element.append("append html", { html: true }); }, }) .transform(new Response("

test

")); expect(await res.text()).toBe( [ "

", "prepend html", "<span>prepend</span>", "test", "<span>append</span>", "append html", "

", ].join("") ); // setInnerContent res = new HTMLRewriter() .on("p", { element(element) { element.setInnerContent("replace"); }, }) .transform(new Response("

test

")); expect(await res.text()).toBe("

<span>replace</span>

"); res = new HTMLRewriter() .on("p", { element(element) { element.setInnerContent("replace", { html: true }); }, }) .transform(new Response("

test

")); expect(await res.text()).toBe("

replace

"); // removeAndKeepContent res = new HTMLRewriter() .on("p", { element(element) { element.removeAndKeepContent(); }, }) .transform(new Response("

test

")); expect(await res.text()).toBe("test"); }); it("handles element class properties", async () => { class Handler { constructor(content) { this.content = content; } // noinspection JSUnusedGlobalSymbols element(element) { element.setInnerContent(this.content); } } const res = new HTMLRewriter() .on("p", new Handler("new")) .transform(new Response("

test

")); expect(await res.text()).toBe("

new

"); }); const commentsMutationsInput = "

"; const commentsMutationsExpected = { beforeAfter: [ "

", "<span>before</span>", "before html", "", "after html", "<span>after</span>", "

", ].join(""), replace: "

<span>replace</span>

", replaceHtml: "

replace

", remove: "

", }; const commentPropertiesMacro = async (func) => { const res = func(new HTMLRewriter(), (comment) => { expect(comment.removed).toBe(false); expect(comment.text).toBe("test"); comment.text = "new"; expect(comment.text).toBe("new"); }).transform(new Response("

")); expect(await res.text()).toBe("

"); }; it("HTMLRewriter: handles comment properties", () => commentPropertiesMacro((rw, comments) => { rw.on("p", { comments }); return rw; })); it("selector tests", async () => { const checkSelector = async (selector, input, expected) => { const res = new HTMLRewriter() .on(selector, { element(element) { element.setInnerContent("new"); }, }) .transform(new Response(input)); expect(await res.text()).toBe(expected); }; await checkSelector("*", "

1

2

", "

new

new

"); await checkSelector("p", "

1

2

", "

1

new

"); await checkSelector( "p:nth-child(2)", "

1

2

3

", "

1

new

3

" ); await checkSelector( "p:first-child", "

1

2

3

", "

new

2

3

" ); await checkSelector( "p:nth-of-type(2)", "

1

2

3

4

5

", "

1

2

new

4

5

" ); await checkSelector( "p:first-of-type", "

1

2

3

", "

1

new

3

" ); await checkSelector( "p:not(:first-child)", "

1

2

3

", "

1

new

new

" ); await checkSelector( "p.red", '

1

2

', '

new

2

' ); await checkSelector( "h1#header", '

1

2

', '

new

2

' ); await checkSelector( "p[data-test]", "

1

2

", "

new

2

" ); await checkSelector( 'p[data-test="one"]', '

1

2

', '

new

2

' ); await checkSelector( 'p[data-test="one" i]', '

1

2

3

', '

new

new

3

' ); await checkSelector( 'p[data-test="one" s]', '

1

2

3

', '

new

2

3

' ); await checkSelector( 'p[data-test~="two"]', '

1

2

3

', '

new

new

3

' ); await checkSelector( 'p[data-test^="a"]', '

1

2

3

', '

new

new

3

' ); await checkSelector( 'p[data-test$="1"]', '

1

2

3

', '

new

2

new

' ); await checkSelector( 'p[data-test*="b"]', '

1

2

3

', '

new

new

3

' ); await checkSelector( 'p[data-test|="a"]', '

1

2

3

', '

new

new

3

' ); await checkSelector( "div span", "

1

23
", "

new

new3
" ); await checkSelector( "div > span", "

1

23
", "

1

new3
" ); }); }); red/precompile-linux-dependencies'>jarred/precompile-linux-dependencies Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
path: root/bench/snippets/array-arguments-slice.mjs (unfollow)
AgeCommit message (Expand)AuthorFilesLines
2023-07-18Fix crash in postMessage that repro'd after ~100,000 messagesGravatar Jarred Sumner 6-21/+57
2023-07-18more progress on fixing gc issueGravatar Jarred Sumner 6-61/+162
2023-07-18add padding bytesGravatar Dylan Conway 1-1/+1
2023-07-18feature(constants) add constants/node:constants module and tests(prisma) use ...Gravatar Ciro Spaciari 16-20/+529
2023-07-18patch checkServerIdentity (#3671)Gravatar Ciro Spaciari 3-3/+9
2023-07-18Update workers.mdGravatar Jarred Sumner 1-2/+2
2023-07-18[jest] execute lifecycle hooks on empty blocks (#3663)Gravatar Alex Lam S.L 2-19/+79
2023-07-18ClarifyGravatar Jarred Sumner 1-0/+2
2023-07-18Fixes #3669Gravatar Jarred Sumner 4-13/+35
2023-07-18zig upgrade (#3667)Gravatar Dylan Conway 154-4894/+4857
2023-07-17Enable postgres prisma testGravatar Jarred Sumner 1-1/+1
2023-07-17Emit writeBarrier in `napi_module_register`Gravatar Jarred Sumner 1-6/+14
2023-07-17Fix potential crash in process.dlopen()Gravatar Jarred Sumner 2-5/+27
2023-07-17Implement `process.{stdout, stderr}.{columns, rows, getWindowSize}`Gravatar Jarred Sumner 4-32/+108
2023-07-17[tls] General compatibility improvements (#3596)Gravatar Ciro Spaciari 23-298/+2907
2023-07-17package json `main` field extension order (#3664)Gravatar Dylan Conway 3-3/+96
2023-07-17[install] handle duplicated workspace declarations gracefully (#3662)Gravatar Alex Lam S.L 2-6/+197
2023-07-17Clean up worker docsGravatar Colin McDonnell 1-65/+69
2023-07-17Tweak test docsGravatar Colin McDonnell 2-4/+3
2023-07-17workaround `readable-stream` compatibility (#3626)Gravatar Alex Lam S.L 3-4/+5
2023-07-17Fix flaky process testGravatar Jarred SUmner 1-2/+2
2023-07-17Fix test with incorrect textGravatar Jarred Sumner 1-3/+3
2023-07-17Fix incorrect nameGravatar Jarred Sumner 2-4/+4
2023-07-17Fix speculative crashes in console.log(formData) and console.log(headers)Gravatar Jarred Sumner 2-30/+24
2023-07-17Fix crash in console.log(urlSearchParams) on a URLSearchParams object with a ...Gravatar Jarred Sumner 2-4/+99
2023-07-17Fix memory leak in `await new Response(latin1String).arrayBuffer()` and `awai...Gravatar Jarred Sumner 16-102/+361
2023-07-1720% faster `deserialize` (#3655)Gravatar Jarred Sumner 2-12/+197
2023-07-16Document `--smol`Gravatar Jarred Sumner 1-70/+59
2023-07-16Add `--smol` to bunfigGravatar Jarred Sumner 1-0/+12
2023-07-16Document serialize/deserializeGravatar Jarred Sumner 1-0/+14