From 9cf111f3c3d83342feabbadf10b83b804b832218 Mon Sep 17 00:00:00 2001 From: Aral Roca Date: Tue, 15 Apr 2025 16:15:10 +0200 Subject: [PATCH 1/2] fix: fix async onnextnode --- deno.json | 2 +- package.json | 2 +- src/index.test.ts | 49 ++++++++++++++++++++++++++++++++++++++++++----- src/index.ts | 2 +- 4 files changed, 47 insertions(+), 8 deletions(-) diff --git a/deno.json b/deno.json index e1f149c..a525351 100644 --- a/deno.json +++ b/deno.json @@ -1,6 +1,6 @@ { "name": "@aralroca/diff-dom-streaming", - "version": "0.6.5", + "version": "0.6.6", "exports": { ".": "./src/index.ts", "./types": "./index.d.ts" diff --git a/package.json b/package.json index 14e67fb..3c27c62 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "diff-dom-streaming", - "version": "0.6.5", + "version": "0.6.6", "bugs": "https://github.com/aralroca/diff-dom-streaming/issues", "description": "Diff DOM algorithm with streaming. Gets all modifications, insertions and removals between a DOM fragment and a stream HTML reader.", "keywords": [ diff --git a/src/index.test.ts b/src/index.test.ts index c30b89d..29d9e70 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -1659,6 +1659,40 @@ describe("Diff test", () => { ); }); + it("should onNextNode execute in a sequential way when is async", async () => { + const results = await testDiff({ + oldHTMLString: ` +
foo
+ `, + newHTMLStringChunks: ["
first
", "
second
", "
third
"], + registerWC: true, + onNextNode: `async (n) => { + if (!n?.hasAttribute?.('scan')) return + window.index ??= 1; + window.logs ??= ''; + await new Promise((r) => setTimeout(() => { + window.logs += n.innerText + ' '; + r(true); + }, ++window.index * 50)); + }` + }); + + expect(results[0]).toBe( + normalize(` + + + +
first
+
second
+
third
+ + + `), + ); + + expect(results.at(-1)).toBe('first second third ') + }); + it("should add WC that modifies the DOM on connect it (old with key)", async () => { const [newHTML] = await testDiff({ oldHTMLString: ` @@ -1689,6 +1723,7 @@ describe("Diff test", () => { transition = false, ignoreId = false, registerWC = false, + onNextNode, }: { oldHTMLString: string; newHTMLStringChunks: string[]; @@ -1697,9 +1732,10 @@ describe("Diff test", () => { transition?: boolean; ignoreId?: boolean; registerWC?: boolean; - }): Promise<[string, any[], Node[], boolean]> { + onNextNode?: string + }): Promise<[string, any[], Node[], boolean, string]> { await page.setContent(normalize(oldHTMLString)); - const [mutations, streamNodes, transitionApplied] = await page.evaluate( + const [mutations, streamNodes, transitionApplied, logs] = await page.evaluate( async ([ diffCode, newHTMLStringChunks, @@ -1708,6 +1744,7 @@ describe("Diff test", () => { transition, ignoreId, registerWC, + onNextNode, ]) => { eval(diffCode as string); const encoder = new TextEncoder(); @@ -1736,7 +1773,7 @@ describe("Diff test", () => { }), ), removedNodes: Array.from(mutation.removedNodes).map( - (node, index) => ({ + (node) => ({ nodeName: node.nodeName, nodeValue: node.nodeValue, }), @@ -1767,7 +1804,7 @@ describe("Diff test", () => { nodeValue: node.nodeValue, } as Node); } - : undefined; + : eval(onNextNode); if (registerWC) { class TestWC extends HTMLElement { @@ -1792,7 +1829,7 @@ describe("Diff test", () => { observer.disconnect(); - return [allMutations, streamNodes, transitionApplied]; + return [allMutations, streamNodes, transitionApplied, (window as any).logs]; }, [ diffCode, @@ -1802,6 +1839,7 @@ describe("Diff test", () => { transition, ignoreId, registerWC, + onNextNode, ], ); @@ -1810,6 +1848,7 @@ describe("Diff test", () => { mutations, streamNodes, transitionApplied, + logs ]; } }); diff --git a/src/index.ts b/src/index.ts index 045566c..f304f35 100644 --- a/src/index.ts +++ b/src/index.ts @@ -257,7 +257,7 @@ async function htmlStreamWalker( nextNode = nextNode![field]; } - if (nextNode) options.onNextNode?.(nextNode); + if (nextNode) await options.onNextNode?.(nextNode); const waitChildren = field === "firstChild"; From 1d3635244f2a6f9dd1d5a960845558d1133ff014 Mon Sep 17 00:00:00 2001 From: Aral Roca Date: Tue, 15 Apr 2025 16:19:33 +0200 Subject: [PATCH 2/2] chore: upgrade deps --- .github/workflows/test.yml | 6 +++--- bun.lock | 22 +++++++++++----------- package.json | 8 ++++---- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 62a28e7..3cf450a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,11 +15,11 @@ jobs: - name: Setup bun uses: oven-sh/setup-bun@v1 with: - bun-version: 1.2.2 + bun-version: 1.2.9 - name: Install dependencies, build, and test run: bun install - - run: bunx playwright@1.43.1 install - - run: bunx playwright@1.43.1 install-deps + - run: bunx playwright@1.51.1 install + - run: bunx playwright@1.51.1 install-deps - run: bun run build - run: bun run bundlewatch - run: bun run test diff --git a/bun.lock b/bun.lock index 9cf4688..f6c02bd 100644 --- a/bun.lock +++ b/bun.lock @@ -4,10 +4,10 @@ "": { "name": "diff-dom-streaming", "devDependencies": { - "@types/bun": "1.2.2", - "bundlewatch": "0.4.0", - "playwright": "1.43.1", - "typescript": "5.7.3", + "@types/bun": "1.2.9", + "bundlewatch": "0.4.1", + "playwright": "1.51.1", + "typescript": "5.8.3", }, }, }, @@ -16,7 +16,7 @@ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], - "@types/bun": ["@types/bun@1.2.2", "", { "dependencies": { "bun-types": "1.2.2" } }, "sha512-tr74gdku+AEDN5ergNiBnplr7hpDp3V1h7fqI2GcR/rsUaM39jpSeKH0TFibRvU0KwniRx5POgaYnaXbk0hU+w=="], + "@types/bun": ["@types/bun@1.2.9", "", { "dependencies": { "bun-types": "1.2.9" } }, "sha512-epShhLGQYc4Bv/aceHbmBhOz1XgUnuTZgcxjxk+WXwNyDXavv5QHD1QEFV0FwbTSQtNq6g4ZcV6y0vZakTjswg=="], "@types/node": ["@types/node@22.13.0", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA=="], @@ -28,15 +28,15 @@ "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], - "axios": ["axios@0.28.1", "", { "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ=="], + "axios": ["axios@0.30.0", "", { "dependencies": { "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-Z4F3LjCgfjZz8BMYalWdMgAQUnEtKDmpwNHjh/C8pQZWde32TF64cqnSeyL3xD/aTIASRU30RHTNzRiV/NpGMg=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - "bun-types": ["bun-types@1.2.2", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-RCbMH5elr9gjgDGDhkTTugA21XtJAy/9jkKe/G3WR2q17VPGhcquf9Sir6uay9iW+7P/BV0CAHA1XlHXMAVKHg=="], + "bun-types": ["bun-types@1.2.9", "", { "dependencies": { "@types/node": "*", "@types/ws": "*" } }, "sha512-dk/kOEfQbajENN/D6FyiSgOKEuUi9PWfqKQJEgwKrCMWbjS/S6tEXp178mWvWAcUSYm9ArDlWHZKO3T/4cLXiw=="], - "bundlewatch": ["bundlewatch@0.4.0", "", { "dependencies": { "axios": "^0.28.0", "bytes": "^3.1.1", "chalk": "^4.0.0", "ci-env": "^1.17.0", "commander": "^5.0.0", "glob": "^7.1.2", "gzip-size": "^6.0.0", "jsonpack": "^1.1.5", "lodash.merge": "^4.6.1", "read-pkg-up": "^7.0.1" }, "bin": { "bundlewatch": "lib/bin/index.js" } }, "sha512-w8w4K8RdrsHMZD9Ss4Ailfsrax/0zSIgh25GCaiudNHg45xXuh/u/xezzjbu+WCQJGjL9O1Fg9k9TEdS/XkZFA=="], + "bundlewatch": ["bundlewatch@0.4.1", "", { "dependencies": { "axios": "^0.30.0", "bytes": "^3.1.1", "chalk": "^4.0.0", "ci-env": "^1.17.0", "commander": "^5.0.0", "glob": "^7.1.2", "gzip-size": "^6.0.0", "jsonpack": "^1.1.5", "lodash.merge": "^4.6.1", "read-pkg-up": "^7.0.1" }, "bin": { "bundlewatch": "lib/bin/index.js" } }, "sha512-SIobIhMX8DhoGiNlZ+IqicXRBkp7NQTKGEoZP82Tu8FQhoykbTdTQlL4zYT7n6swjH9wahJ9RTefz0Xwva5FXA=="], "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], @@ -128,9 +128,9 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "playwright": ["playwright@1.43.1", "", { "dependencies": { "playwright-core": "1.43.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA=="], + "playwright": ["playwright@1.51.1", "", { "dependencies": { "playwright-core": "1.51.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw=="], - "playwright-core": ["playwright-core@1.43.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg=="], + "playwright-core": ["playwright-core@1.51.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw=="], "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], @@ -156,7 +156,7 @@ "type-fest": ["type-fest@0.8.1", "", {}, "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="], - "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], diff --git a/package.json b/package.json index 3c27c62..43d5192 100644 --- a/package.json +++ b/package.json @@ -53,9 +53,9 @@ "example:spa-like": "bun run ./examples/spa-like/index.ts" }, "devDependencies": { - "typescript": "5.7.3", - "@types/bun": "1.2.2", - "bundlewatch": "0.4.0", - "playwright": "1.43.1" + "typescript": "5.8.3", + "@types/bun": "1.2.9", + "bundlewatch": "0.4.1", + "playwright": "1.51.1" } }