Commit Graph

102 Commits

Author SHA1 Message Date
6647e4f63d fix: set default viewport for NewBrowser and align User-Agent with engine
All checks were successful
CI / vet (pull_request) Successful in 1m6s
CI / build (pull_request) Successful in 1m11s
CI / test (pull_request) Successful in 1m11s
NewBrowser previously had no viewport (strong headless signal) and used a
Firefox User-Agent unconditionally, even for Chromium instances (detectable
mismatch).

Add per-engine UA constants (DefaultFirefoxUserAgent, DefaultChromiumUserAgent)
and auto-select the matching UA in initBrowser when the caller hasn't set one
explicitly. Keep DefaultUserAgent as a backward-compatible alias.

Add 1920x1080 default viewport to NewBrowser (most common desktop resolution).
NewInteractiveBrowser keeps its existing 1280x720 default but also gains
engine-aware UA selection.

Closes #70

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 01:28:09 +00:00
ff1d6c491a Merge pull request 'fix: split stealth scripts by browser engine, add Firefox stealth' (#72) from fix/69-firefox-stealth-scripts into main
All checks were successful
CI / vet (push) Successful in 1m3s
CI / build (push) Successful in 1m9s
CI / test (push) Successful in 1m9s
Reviewed-on: #72
2026-02-24 01:23:25 +00:00
34161209de fix: split stealth init scripts by browser engine and add Firefox stealth
All checks were successful
CI / vet (pull_request) Successful in 1m59s
CI / build (pull_request) Successful in 2m1s
CI / test (pull_request) Successful in 2m1s
The stealth system previously injected all 12 init scripts unconditionally
into every browser engine. Chromium-specific scripts (window.chrome stubs,
ANGLE WebGL strings, CDP cleanup, HeadlessChrome UA strip) were no-ops or
actively suspicious on Firefox, while Firefox-specific headless vectors
were unaddressed.

Split stealthInitScripts into three categories:
- stealthCommonScripts (4): webdriver, outerWidth/Height, permissions, Notification
- stealthChromiumScripts (8): existing Chromium-specific scripts
- stealthFirefoxScripts (5): new Firefox-specific stealth:
  - navigator.webdriver getOwnPropertyDescriptor hardening
  - WebGL renderer spoof with Mesa/Intel strings
  - mozInnerScreenX/Y non-zero spoof
  - navigator.hardwareConcurrency normalization
  - PDF.js plugin list override

browser_init.go now selects common + engine-specific scripts based on
opt.Browser. Tests updated with per-category validation and cross-
contamination checks.

Closes #69

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 01:20:40 +00:00
3cc528a766 Merge pull request 'feature: add PizzINT site extractor with HTTP API' (#67) from feature/pizzint-site-extractor into main
All checks were successful
CI / vet (push) Successful in 31s
CI / build (push) Successful in 1m8s
CI / test (push) Successful in 1m9s
Reviewed-on: #67
2026-02-22 05:52:56 +00:00
c1c1acdb00 feature: add PizzINT (Pentagon Pizza Index) site extractor
All checks were successful
CI / vet (pull_request) Successful in 1m7s
CI / build (pull_request) Successful in 1m9s
CI / test (pull_request) Successful in 1m9s
Adds a new site extractor for pizzint.watch, which tracks pizza shop
activity near the Pentagon as an OSINT indicator. The extractor fetches
the dashboard API and exposes DOUGHCON levels, restaurant activity, and
spike events.

Includes a CLI tool with an HTTP server mode (--serve) for embedding
the pizza status in dashboards or status displays.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 05:45:55 +00:00
710d75259e Merge pull request 'fix: use structural selectors for DDG weather advisory handling' (#65) from fix/weather-advisory-selectors into main
All checks were successful
CI / build (push) Successful in 29s
CI / vet (push) Successful in 1m1s
CI / test (push) Successful in 1m2s
Reviewed-on: #65
2026-02-20 18:23:54 +00:00
8c2848246b fix: use structural selectors for DDG weather to handle advisory banners
All checks were successful
CI / build (pull_request) Successful in 1m11s
CI / vet (pull_request) Successful in 1m12s
CI / test (pull_request) Successful in 1m17s
The weather extractor used positional CSS selectors (div:first-child,
div:nth-child(2)) to locate the header and hourly container within the
widget section. When DuckDuckGo inserts advisory banners (e.g. wind
advisory), the extra div shifts positions and breaks extraction of
current temp, hourly data, humidity, and wind.

Replace with structural selectors:
- div:not(:has(ul)) for the header (first div without a list)
- div:has(> ul) for the hourly container (div with direct ul child)

These match elements by their content structure rather than position,
so advisory banners no longer break extraction.

Fixes #64

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 18:22:53 +00:00
8a2de65e31 Merge pull request 'feat: add RemoveHidden option for display:none element stripping' (#63) from feature/readability-remove-hidden into main
All checks were successful
CI / build (push) Successful in 28s
CI / test (push) Successful in 47s
CI / vet (push) Successful in 49s
Reviewed-on: #63
2026-02-20 14:10:58 +00:00
65cf6b027f feat: add RemoveHidden option to strip display:none elements before extraction
All checks were successful
CI / vet (pull_request) Successful in 34s
CI / test (pull_request) Successful in 1m1s
CI / build (pull_request) Successful in 1m5s
When RemoveHidden is true, JavaScript is evaluated on the live page to
remove all elements with computed display:none before readability
extraction. This defends against anti-scraping honeypots that embed
prompt injections in hidden DOM elements.

The implementation uses an optional pageEvaluator interface so that the
concrete document (backed by Playwright) supports it while the Document
interface remains unchanged.

Closes #62

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 14:06:17 +00:00
c982b61bab Merge pull request 'feat: add ReadabilityWithOptions for DOM cleanup' (#61) from feature/readability-remove-selectors into main
All checks were successful
CI / vet (push) Successful in 1m8s
CI / build (push) Successful in 1m10s
CI / test (push) Successful in 1m12s
2026-02-19 01:11:38 +00:00
c1a5814732 feat: add ReadabilityWithOptions for DOM cleanup before extraction
All checks were successful
CI / build (pull_request) Successful in 46s
CI / test (pull_request) Successful in 48s
CI / vet (pull_request) Successful in 1m50s
Sites with infinite scroll (e.g. The Verge) load additional articles
into the DOM, which get included in readability extraction. Add
ReadabilityOptions.RemoveSelectors to strip elements by CSS selector
before parsing, avoiding the need to reimplement the readability
pipeline downstream.

Closes #60

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 01:09:28 +00:00
3357972246 Merge pull request 'fix: enhance stealth mode with additional anti-detection' (#59) from fix/enhanced-stealth-mode into main
All checks were successful
CI / test (push) Successful in 32s
CI / build (push) Successful in 46s
CI / vet (push) Successful in 46s
2026-02-17 22:47:35 +00:00
ce95fb1d89 fix: enhance stealth mode with additional anti-detection measures
All checks were successful
CI / build (pull_request) Successful in 47s
CI / vet (pull_request) Successful in 46s
CI / test (pull_request) Successful in 49s
Add 7 new init scripts to cover WebGL fingerprinting, missing Chrome
APIs, permissions behavior, CDP artifacts, and HeadlessChrome UA string.
Enable Chromium's new headless mode (Channel: "chromium") when stealth
is active to use the full UI layer that is harder to detect.

Closes #58

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 22:45:12 +00:00
917569dd0b Merge pull request 'feature: add stealth mode and launch args/init scripts' (#57) from feature/stealth-mode into main
All checks were successful
CI / vet (push) Successful in 57s
CI / build (push) Successful in 1m2s
CI / test (push) Successful in 1m19s
2026-02-17 20:11:50 +00:00
e94665ff25 feature: add stealth mode, launch args, and init scripts to BrowserOptions
All checks were successful
CI / vet (pull_request) Successful in 1m18s
CI / build (pull_request) Successful in 1m22s
CI / test (pull_request) Successful in 1m28s
Add anti-bot-detection evasion support to reduce blocking by sites like
archive.ph. Stealth mode is enabled by default for all browsers and applies
common evasions: navigator.webdriver override, plugin/mimeType spoofing,
window.chrome stub, and outerWidth/outerHeight fixes. For Chromium,
--disable-blink-features=AutomationControlled is also added.

New BrowserOptions fields:
- Stealth *bool: toggle stealth presets (default true)
- LaunchArgs []string: custom browser launch arguments
- InitScripts []string: JavaScript injected before page scripts

Closes #56

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 20:10:58 +00:00
e8f4d64eb9 Merge pull request 'fix: update weather selectors to match DDG's actual DOM' (#54) from fix/weather-selector-dom-mismatch into main
All checks were successful
CI / build (push) Successful in 36s
CI / test (push) Successful in 51s
CI / vet (push) Successful in 51s
Reviewed-on: #54
2026-02-15 23:07:10 +00:00
a32f57ec92 fix: update weather extractor selectors to match DuckDuckGo's actual DOM
All checks were successful
CI / build (pull_request) Successful in 30s
CI / vet (pull_request) Successful in 45s
CI / test (pull_request) Successful in 48s
DuckDuckGo's weather widget uses randomized CSS module class names that
don't match the BEM-style selectors the extractor was using. Replace all
class-based selectors with structural and attribute-based selectors:

- Identify widget via article:has(img[src*='weatherkit'])
- Use positional selectors (div:first-child, p:first-of-type, etc.)
- Extract icon hints from img[alt] attributes
- Parse precipitation from span > span structure
- Derive CurrentTemp from first hourly entry (no standalone element)
- Derive HighTemp/LowTemp from first daily forecast entry
- Use text-matching for Humidity/Wind labels

Fixes #53

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 23:00:44 +00:00
cff4713282 Merge pull request 'feature: add hourly forecast, precipitation, and icon hints to weather extractor' (#52) from feature/weather-hourly-precip-icons into main
All checks were successful
CI / vet (push) Successful in 1m5s
CI / build (push) Successful in 1m6s
CI / test (push) Successful in 1m8s
Reviewed-on: #52
2026-02-15 21:23:35 +00:00
469171da9c feature: add hourly forecast, precipitation, and icon hints to weather extractor
All checks were successful
CI / build (pull_request) Successful in 30s
CI / vet (pull_request) Successful in 46s
CI / test (pull_request) Successful in 49s
Add HourlyForecast struct and Hourly field to WeatherData for hourly
temperature/condition data. Add Precipitation (int, -1 if unavailable)
and IconHint (from aria-label/title/alt attributes) to both DayForecast
and HourlyForecast. This enables downstream consumers like mort to
replace inline DuckDuckGo scraping with a single GetWeather() call.

Closes #51

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 21:22:04 +00:00
4f8b6fb024 Merge pull request 'feature: add Bambu Lab firmware extractor' (#50) from feature/bambulab-extractor into main
All checks were successful
CI / test (push) Successful in 31s
CI / vet (push) Successful in 43s
CI / build (push) Successful in 45s
2026-02-15 20:23:53 +00:00
df934a0521 feature: add Bambu Lab firmware version extractor
All checks were successful
CI / build (pull_request) Successful in 30s
CI / vet (pull_request) Successful in 48s
CI / test (pull_request) Successful in 49s
Extract firmware information from Bambu Lab's firmware download pages
by parsing the __NEXT_DATA__ JSON blob embedded in the page. Supports
all printer models (X1, P1, A1, A1 mini, H2D, H2S, P2S, X1E, H2D Pro).

Provides GetLatestFirmware() and GetAllFirmware() methods that return
version, release date, release notes, download URL, and MD5 checksum.

Closes #45

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 20:21:06 +00:00
2a97900da8 Merge pull request 'feature: add IMDB movie/TV extractor' (#49) from feature/imdb-extractor into main
All checks were successful
CI / build (push) Successful in 1m24s
CI / vet (push) Successful in 1m23s
CI / test (push) Successful in 1m24s
2026-02-15 16:54:46 +00:00
c2768e2b05 feature: add IMDB movie/TV extractor
All checks were successful
CI / test (pull_request) Successful in 46s
CI / vet (pull_request) Successful in 47s
CI / build (pull_request) Successful in 1m18s
Add sites/imdb package with GetMovie() and Search() methods. Extracts
title, year, rating, votes, runtime, genres, director, cast, plot,
poster, and box office data. Uses JSON-LD parsing with DOM fallback.
Supports Movie, TVSeries, and TVMiniSeries types.

Closes #30

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:54:30 +00:00
100e53531b Merge pull request 'feature: add recipe extractor with JSON-LD and DOM parsing' (#48) from feature/allrecipes-extractor into main
All checks were successful
CI / build (push) Successful in 1m3s
CI / vet (push) Successful in 1m5s
CI / test (push) Successful in 1m8s
2026-02-15 16:52:47 +00:00
de0a065923 feature: add recipe extractor with JSON-LD and DOM parsing
All checks were successful
CI / build (pull_request) Successful in 57s
CI / vet (pull_request) Successful in 1m2s
CI / test (pull_request) Successful in 1m5s
Add sites/recipe package with ExtractRecipe() that works on any recipe
URL. Parses JSON-LD structured data (@type: Recipe) first, with DOM
fallback. Handles @graph containers, arrays, HowToStep objects, ISO
8601 durations, and various author/yield/image formats.

Closes #29

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:52:28 +00:00
ec27c7e2e0 Merge pull request 'feature: add Steam Store game price extractor' (#47) from feature/steam-extractor into main
All checks were successful
CI / build (push) Successful in 42s
CI / vet (push) Successful in 44s
CI / test (push) Successful in 1m23s
2026-02-15 16:50:46 +00:00
b1137f2ebc feature: add Steam Store game price extractor
All checks were successful
CI / vet (pull_request) Successful in 1m24s
CI / build (pull_request) Successful in 1m24s
CI / test (pull_request) Successful in 1m28s
Add sites/steam package with GetGamePrice() and SearchGames() methods.
Handles regular prices, discounted games, and free-to-play titles.
Includes age gate bypass logic and currency detection.

Closes #28

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:50:27 +00:00
69603b7cae Merge pull request 'feature: add CoinGecko cryptocurrency price extractor' (#46) from feature/coingecko-extractor into main
All checks were successful
CI / test (push) Successful in 44s
CI / vet (push) Successful in 1m19s
CI / build (push) Successful in 1m23s
2026-02-15 16:48:08 +00:00
349b1b9c6b feature: add CoinGecko cryptocurrency price extractor
All checks were successful
CI / build (pull_request) Successful in 46s
CI / vet (pull_request) Successful in 1m20s
CI / test (pull_request) Successful in 1m23s
Add sites/coingecko package with GetPrice() method that extracts
structured crypto price data (name, symbol, price, 24h/7d change,
market cap, volume, 24h high/low) from CoinGecko coin pages.

Includes mock-based tests and parseLargeNumber helper for T/B/M suffixes.

Closes #27

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:47:53 +00:00
d0b3131d98 Merge pull request 'feature: add DuckDuckGo weather and stock widget extractors' (#44) from feature/duckduckgo-widgets into main
All checks were successful
CI / vet (push) Successful in 29s
CI / build (push) Successful in 50s
CI / test (push) Successful in 50s
2026-02-15 16:43:07 +00:00
461b704792 feature: add DuckDuckGo weather and stock widget extractors
All checks were successful
CI / vet (pull_request) Successful in 29s
CI / build (pull_request) Successful in 46s
CI / test (pull_request) Successful in 48s
Add weather.go with GetWeather() for extracting structured weather data
(location, temp, conditions, forecast) and stock.go with GetStockQuote()
and GetStockChart() for stock data extraction and chart screenshots.

Both include mock-based tests. CSS selectors may need tuning against
the live site since DuckDuckGo's React-rendered widgets use dynamic
class names.

Closes #25, #26
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:40:53 +00:00
dcc977c0cc Merge pull request 'Mock-based site extractor test infrastructure' (#43) from test/site-extractor-mocks into main
All checks were successful
CI / test (push) Successful in 1m4s
CI / build (push) Successful in 1m7s
CI / vet (push) Successful in 1m7s
2026-02-15 16:38:15 +00:00
198906946b test: add mock-based site extractor test infrastructure
All checks were successful
CI / vet (pull_request) Successful in 1m5s
CI / build (pull_request) Successful in 1m6s
CI / test (pull_request) Successful in 1m6s
Create exported extractortest package with MockBrowser, MockDocument,
and MockNode that support selector-based responses for testing site
extractors without a real browser.

Add extraction tests for DuckDuckGo (result parsing, empty results, no
links, full search flow) and Powerball (drawing parsing, next drawing
parsing with billion/million, error cases, full GetCurrent flow).

Closes #21
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:37:58 +00:00
ddb701fca0 Merge pull request 'Thread-safe CookieJar, SameSite, Google countries' (#42) from enhance/cookies-and-google into main
All checks were successful
CI / vet (push) Successful in 41s
CI / build (push) Successful in 1m23s
CI / test (push) Successful in 1m24s
2026-02-15 16:35:10 +00:00
963696cd62 enhance: thread-safe CookieJar, SameSite cookie attr, dynamic Google countries
All checks were successful
CI / vet (pull_request) Successful in 40s
CI / build (pull_request) Successful in 1m22s
CI / test (pull_request) Successful in 1m28s
- Wrap staticCookieJar in struct with sync.RWMutex for thread safety
- Add SameSite field to Cookie struct with Strict/Lax/None constants
- Update Playwright cookie conversion functions for SameSite
- Replace hardcoded 4-country switch with dynamic country code generation

Closes #20, #22, #23
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:34:54 +00:00
0ba9cc9b98 Merge pull request 'Fix silently ignored parsing errors (#24)' (#41) from fix/silent-parsing-errors into main
All checks were successful
CI / build (push) Successful in 42s
CI / vet (push) Successful in 44s
CI / test (push) Successful in 1m25s
2026-02-15 16:32:14 +00:00
a9711ce904 fix: surface parsing errors instead of silently discarding them
All checks were successful
CI / vet (pull_request) Successful in 1m10s
CI / build (pull_request) Successful in 1m21s
CI / test (pull_request) Successful in 1m28s
Return errors for required fields (ID, price) and log warnings for
optional fields (title, description, unit price) across all site
extractors instead of silently discarding them with _ =.

Closes #24
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:31:56 +00:00
7f24e97131 Merge pull request 'Deduplicate helpers (#13, #14)' (#40) from refactor/deduplicate-helpers into main
All checks were successful
CI / test (push) Successful in 31s
CI / vet (push) Successful in 46s
CI / build (push) Successful in 46s
2026-02-15 16:28:55 +00:00
132817144e refactor: deduplicate numericOnly and DuckDuckGo result extraction
All checks were successful
CI / build (pull_request) Successful in 29s
CI / vet (pull_request) Successful in 1m1s
CI / test (pull_request) Successful in 1m4s
- Extract identical numericOnly inline functions from powerball and
  megamillions into shared sites/internal/parse.NumericOnly with tests
- Extract duplicated DuckDuckGo result parsing from Search() and
  GetResults() into shared extractResults() helper

Closes #13, #14

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:26:54 +00:00
384566e016 Merge pull request 'Consolidate user-agent strings (#17)' (#39) from fix/user-agent-consistency into main
All checks were successful
CI / build (push) Successful in 1m34s
CI / vet (push) Successful in 1m34s
CI / test (push) Successful in 1m34s
2026-02-15 16:25:03 +00:00
097b2e12c7 fix: consolidate user-agent strings into DefaultUserAgent constant
All checks were successful
CI / build (pull_request) Successful in 44s
CI / test (pull_request) Successful in 46s
CI / vet (pull_request) Successful in 1m28s
Define DefaultUserAgent (Firefox/147.0) in playwright.go and reference
it from NewBrowser, NewInteractiveBrowser, and CLI flags. Previously
three different UA strings existed (two at 142.0, one outdated at 133.0).

Closes #17

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:24:44 +00:00
0df639abea Merge pull request 'Fix ShowBrowser merge + consistent browser defaults (#15, #16)' (#38) from fix/merge-options-and-browser-defaults into main
All checks were successful
CI / build (push) Successful in 32s
CI / vet (push) Successful in 1m50s
CI / test (push) Successful in 1m51s
2026-02-15 16:23:07 +00:00
328455de32 fix: ShowBrowser merge behavior and consistent browser defaults
All checks were successful
CI / vet (pull_request) Successful in 1m49s
CI / build (pull_request) Successful in 1m51s
CI / test (pull_request) Successful in 1m52s
- Change ShowBrowser from bool to *bool so nil means "don't override"
  in mergeOptions(), fixing the bug where it always overwrote the base
- Add Bool() helper for convenient *bool construction
- Align NewInteractiveBrowser default from Chromium to Firefox to match
  NewBrowser
- Update README example and CLI flags for the *bool change

Closes #15, #16

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:22:49 +00:00
85e4632ea9 Merge pull request 'Fix updateCookies error + context-aware sleep (#7, #18)' (#37) from fix/cookies-error-and-context-sleep into main
All checks were successful
CI / test (push) Successful in 1m33s
CI / build (push) Successful in 1m35s
CI / vet (push) Successful in 1m34s
2026-02-15 16:20:06 +00:00
769b870a17 fix: check Cookies() error and use context-aware sleep
All checks were successful
CI / build (pull_request) Successful in 46s
CI / vet (pull_request) Successful in 47s
CI / test (pull_request) Successful in 1m22s
- playwright.go: check error from page.Context().Cookies() before
  iterating over results, preventing silent failures
- archive.go: replace time.Sleep(5s) with context-aware select using
  time.After, allowing the operation to be cancelled promptly

Closes #7, #18

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:19:49 +00:00
8b136b9dda Merge pull request 'Fix cmd flags and defer-before-error-check (#8, #19)' (#36) from fix/cmd-flags-and-defer-ordering into main
All checks were successful
CI / vet (push) Successful in 37s
CI / test (push) Successful in 51s
CI / build (push) Successful in 52s
2026-02-15 16:18:54 +00:00
fca50a47c3 Merge pull request 'Fix DuckDuckGo error handling (#5, #6)' (#35) from fix/duckduckgo-error-handling into main
Some checks failed
CI / build (push) Has been cancelled
CI / test (push) Has been cancelled
CI / vet (push) Has been cancelled
2026-02-15 16:18:50 +00:00
991c43d020 Merge pull request 'Fix archive cmd panic on short content (#9)' (#34) from fix/archive-cmd-short-content into main
Some checks failed
CI / test (push) Has been cancelled
CI / build (push) Has been cancelled
CI / vet (push) Has been cancelled
2026-02-15 16:18:46 +00:00
2aa565d3a0 Merge pull request 'Fix nil-pointer panics (#10, #11)' (#33) from fix/nil-pointer-panics into main
Some checks failed
CI / build (push) Has been cancelled
CI / test (push) Has been cancelled
CI / vet (push) Has been cancelled
2026-02-15 16:18:41 +00:00
2af4cbcdce Merge pull request 'Fix XSS vulnerability in SetAttribute (#12)' (#32) from fix/escape-javascript-xss into main
Some checks failed
CI / build (push) Has been cancelled
CI / vet (push) Has been cancelled
CI / test (push) Has been cancelled
2026-02-15 16:18:36 +00:00