Skip to content

Commit e0002a9

Browse files
committed
chore: improve rewriting and checking
1 parent f7fd803 commit e0002a9

File tree

3 files changed

+83
-55
lines changed

3 files changed

+83
-55
lines changed

rewrite/figma.ts

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
import type { Group } from './config'
21
import { GROUPS } from './config'
2+
import { applyGroups } from './shared'
33

44
async function rewriteScript() {
55
const current = document.currentScript as HTMLScriptElement
6-
const src = current.src
6+
const src = current?.src
7+
if (!current || !src) {
8+
return
9+
}
710

811
const desc = Object.getOwnPropertyDescriptor(Document.prototype, 'currentScript')
912

@@ -14,39 +17,17 @@ async function rewriteScript() {
1417
current.replaceWith(script)
1518
}
1619

17-
function applyGroup(content: string, group: Group) {
18-
const markers = group.markers || []
19-
20-
if (!markers.every((marker) => content.includes(marker))) {
21-
return content
22-
}
23-
24-
let out = content
25-
for (const { pattern, replacer } of group.replacements) {
26-
if (typeof pattern === 'string') {
27-
// @ts-ignore
28-
out = out.replaceAll(pattern, replacer)
29-
} else {
30-
// @ts-ignore
31-
out = out.replace(pattern, replacer)
32-
}
33-
}
34-
return out
35-
}
36-
3720
try {
38-
const original = await (await fetch(src)).text()
39-
let content = original
21+
const response = await fetch(src)
22+
const original = await response.text()
4023

41-
for (const group of GROUPS) {
42-
content = applyGroup(content, group)
43-
}
24+
const { content: afterRules, changed } = applyGroups(original, GROUPS)
4425

45-
if (content !== original) {
26+
if (changed) {
4627
console.log(`Rewrote script: ${src}`)
4728
}
4829

49-
content = content.replaceAll('delete window.figma', 'window.figma = undefined')
30+
const content = afterRules.replaceAll('delete window.figma', 'window.figma = undefined')
5031

5132
Object.defineProperty(document, 'currentScript', {
5233
configurable: true,

rewrite/shared.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import type { Group, Replacement } from './config'
2+
3+
export function groupMatches(content: string, group: Group) {
4+
const markers = group.markers || []
5+
return markers.every((marker) => content.includes(marker))
6+
}
7+
8+
export function replacementWouldChange(content: string, replacement: Replacement) {
9+
if (typeof replacement.pattern === 'string') {
10+
return content.includes(replacement.pattern)
11+
}
12+
const re = new RegExp(replacement.pattern.source, replacement.pattern.flags)
13+
return re.test(content)
14+
}
15+
16+
export function applyGroups(content: string, groups: Group[]) {
17+
let out = content
18+
for (const group of groups) {
19+
if (!groupMatches(out, group)) {
20+
continue
21+
}
22+
for (const { pattern, replacer } of group.replacements) {
23+
if (typeof pattern === 'string') {
24+
// @ts-ignore
25+
out = out.replaceAll(pattern, replacer)
26+
} else {
27+
// @ts-ignore
28+
out = out.replace(pattern, replacer)
29+
}
30+
}
31+
}
32+
return { content: out, changed: out !== content }
33+
}
34+
35+
export function analyze(content: string, groups: Group[]) {
36+
for (const group of groups) {
37+
if (!groupMatches(content, group)) {
38+
continue
39+
}
40+
if (group.replacements.some((r) => replacementWouldChange(content, r))) {
41+
return { matched: true, rewritable: true }
42+
}
43+
return { matched: true, rewritable: false }
44+
}
45+
return { matched: false, rewritable: false }
46+
}

scripts/check-rewrite.ts

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
import { matchFile, REWRITE_PATTERN } from '@/rewrite/config'
1+
import { GROUPS } from '@/rewrite/config'
2+
import { analyze } from '@/rewrite/shared'
23
import { chromium } from 'playwright-chromium'
3-
44
import rules from '../public/rules/figma.json'
55

66
const redirectRule = rules.find((rule) => rule.action.type === 'redirect')
7-
87
const ASSETS_PATTERN = new RegExp(redirectRule?.condition?.regexFilter || /a^/)
98
const MAX_RETRIES = 3
109

@@ -16,16 +15,16 @@ async function runCheck() {
1615

1716
try {
1817
page.on('response', async (response) => {
19-
if (response.request().resourceType() === 'script') {
20-
const url = response.url()
21-
if (!ASSETS_PATTERN.test(url)) {
22-
return
23-
}
24-
25-
const content = await response.text()
26-
scripts.push({ url, content })
27-
console.log(`Captured script: ${url}`)
18+
if (response.request().resourceType() !== 'script') {
19+
return
20+
}
21+
const url = response.url()
22+
if (!ASSETS_PATTERN.test(url)) {
23+
return
2824
}
25+
const content = await response.text()
26+
scripts.push({ url, content })
27+
console.log(`Captured script: ${url}`)
2928
})
3029

3130
try {
@@ -43,7 +42,7 @@ async function runCheck() {
4342
try {
4443
await page.waitForURL(/^(?!.*login).*$/, { timeout: 10000 })
4544
console.log('Logged in successfully.')
46-
} catch (error) {
45+
} catch {
4746
console.error('Login failed. Please check your credentials.')
4847
return false
4948
}
@@ -53,16 +52,20 @@ async function runCheck() {
5352

5453
let matched: string | null = null
5554
let rewritable = false
56-
scripts.forEach(({ url, content }) => {
57-
if (matchFile(url, content)) {
58-
matched = url
59-
console.log(`Matched script: ${url}`)
60-
if (REWRITE_PATTERN.test(content)) {
61-
rewritable = true
62-
console.log(`Rewritable script: ${url}`)
63-
}
55+
56+
for (const { url, content } of scripts) {
57+
const { matched: m, rewritable: r } = analyze(content, GROUPS)
58+
if (!m) {
59+
continue
6460
}
65-
})
61+
matched = url
62+
console.log(`Matched script: ${url}`)
63+
if (r) {
64+
rewritable = true
65+
console.log(`Rewritable script: ${url}`)
66+
break
67+
}
68+
}
6669

6770
if (!matched) {
6871
console.log('❌ No matched script found.')
@@ -72,11 +75,11 @@ async function runCheck() {
7275
console.log(`✅ Matched script: ${matched}`)
7376

7477
if (!rewritable) {
75-
console.log(`❌ Rewrite pattern not found.`)
78+
console.log('❌ Rewrite pattern not found.')
7679
return false
7780
}
7881

79-
console.log(`✅ Rewrite pattern found.`)
82+
console.log('✅ Rewrite pattern found.')
8083
return true
8184
} finally {
8285
await browser.close()
@@ -90,14 +93,12 @@ async function main() {
9093
}
9194

9295
const success = await runCheck()
93-
9496
if (success) {
9597
process.exit(0)
9698
}
9799

98100
if (attempt < MAX_RETRIES) {
99101
console.log(`Attempt ${attempt} failed. Waiting before retry...`)
100-
// Wait a bit before retrying
101102
await new Promise((resolve) => setTimeout(resolve, 3000))
102103
}
103104
}

0 commit comments

Comments
 (0)