Skip to content

feat(helpers): add rule-level validate (like test) - #866

Merged
Kikobeats merged 10 commits into
masterfrom
next
Aug 7, 2026
Merged

Kikobeats merged 10 commits into
masterfrom
next

Conversation

@Kikobeats

@Kikobeats Kikobeats commented Aug 6, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Add optional validate on a rule or rules bundle (same shape as test): after a rule returns a value, validate(value, args) may return falsy or throw to reject that candidate and continue to the next rule.
  • loadRules / mergeRules copy bundle validate onto each rule; findRule reads rule.validate.
  • Extract shared withIframe into @metascraper/helpers so audio/video nested iframe probing (and validate) share one path.
  • Docs in CONTRIBUTING; TypeScript types updated. No scrape-time metascraper({ validate }) option.
rules.validate = async (value, args) => !(await isHostile(value))
// or
Object.assign(ruleFn, { validate: async value => … })

Unblocks Microlink API logo XSS fallthrough (hostile candidate → next rule) by setting validate on logo rule bundles.

Test plan

  • ava on helpers find-rule, metascraper validate / merge-rules, audio/video iframe
  • CI green on next
  • After merge/release, bump api @metascraper/helpers and set rules.validate on logo / logo-favicon / logo-bimi

Note

Medium Risk
Changes core findRule resolution used on every scrape property, but behavior is backward-compatible when validate is omitted and is covered by new unit/integration tests.

Overview
Introduces optional validate on individual rules or whole rule bundles (mirroring test): after a rule returns a value, validate(value, args, debug) can reject it so findRule tries the next rule; if all fail, the property is null. Bundle-level validate is copied onto each rule via loadRules / mergeRules, with TypeScript types and CONTRIBUTING docs.

Moves duplicated iframe / twitter:player probing from metascraper-audio and metascraper-video into shared withIframe in @metascraper/helpers, including propName for debug timing and coverage that validate applies to values found inside iframes.

Reviewed by Cursor Bugbot for commit 27f1adc. Bugbot is set up for automated code reviews on this repo. Configure here.

Allow callers to reject a rule result and continue to the next rule
without throwing, so logo XSS fallthrough can skip hostile candidates.

Co-authored-by: Cursor <[email protected]>
@coderabbitai

coderabbitai Bot commented Aug 6, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The change adds synchronous and asynchronous rule validation, propagates validators through rule metadata, and continues rule evaluation after rejected candidates. A shared withIframe helper now handles normalized iframe and Twitter player extraction for audio and video rules.

Changes

Validation-aware rule resolution

Layer / File(s) Summary
Validation contract and metadata
packages/metascraper/src/index.d.ts, packages/metascraper/src/rules.js, packages/metascraper/test/types/*, packages/metascraper/test/unit/merge-rules.js, CONTRIBUTING.md
The public types, rule loading, inline rule merging, type tests, documentation, and metadata tests now support bundle-level and per-rule validate callbacks.
Validation-aware rule resolution
packages/metascraper-helpers/src/index.js, packages/metascraper-helpers/test/find-rule.js, packages/metascraper/test/unit/validate.js
findRule accepts optional arguments, evaluates synchronous or asynchronous validators, logs validator errors, rejects invalid candidates, and continues with later rules.
Shared iframe rule evaluation
packages/metascraper-helpers/src/index.js, packages/metascraper-audio/src/index.js, packages/metascraper-video/src/index.js, packages/metascraper-audio/test/iframe.js, packages/metascraper-video/test/iframe.js
withIframe centralizes iframe and Twitter player probing for audio and video rules. Tests cover rejected candidates and fallback results.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Metascraper
  participant withIframe
  participant getIframeCached
  participant findRule
  participant Validate
  Metascraper->>findRule: evaluate direct rules
  findRule->>Validate: validate candidate
  Validate-->>findRule: accept or reject
  Metascraper->>withIframe: evaluate nested media rules
  withIframe->>getIframeCached: fetch normalized iframe URL
  getIframeCached-->>withIframe: nested metadata
  withIframe->>findRule: evaluate nested rules
  findRule->>Validate: validate nested candidate
  Validate-->>findRule: accept or reject
  findRule-->>withIframe: result or continue probing
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the main change: adding rule-level validation support through the helpers package.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch next

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
packages/metascraper/test/unit/validate.js (1)

24-31: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Test the validator context contract.

This test only verifies the value argument. Record the second validator argument. Assert propName, rule, and args match the documented contract.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/metascraper/test/unit/validate.js` around lines 24 - 31, Update the
scraper test’s validate callback to capture its second context argument, then
assert that context.propName, context.rule, and context.args match the
documented validator contract. Keep the existing value filtering and logo
assertions unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@packages/metascraper/test/unit/validate.js`:
- Around line 24-31: Update the scraper test’s validate callback to capture its
second context argument, then assert that context.propName, context.rule, and
context.args match the documented validator contract. Keep the existing value
filtering and logo assertions unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 87e95a1d-e3ea-47c0-86a1-5b3829da3434

📥 Commits

Reviewing files that changed from the base of the PR and between 9c5e77b and 753228e.

📒 Files selected for processing (2)
  • packages/metascraper-helpers/src/index.js
  • packages/metascraper/test/unit/validate.js

Kikobeats and others added 2 commits August 6, 2026 21:19
`validate` applied to every property, so a validator written for one
field silently nulled unrelated ones. It now accepts an object keyed by
property name; the function form still runs for every property.

A throwing validator aborted the whole property through get-data's
catch. It now rejects only the candidate that triggered it and the
search resumes at the next rule, with the error logged under
DEBUG=metascraper:find-rule.

metascraper-video and metascraper-audio rebuilt the args object for
their nested findRule calls, so validate never reached rules behind an
iframe and per-candidate fallthrough did not happen there.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01VSEyFT3dw16tyvhRGVAWrx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
packages/metascraper-audio/test/iframe.js (1)

71-89: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Cover property-specific and Twitter-player validation propagation.

The current tests use global validators and generic iframe sources only. A regression that removes the explicit property name, or drops validation arguments in the Twitter-player path, can still pass.

  • packages/metascraper-audio/test/iframe.js#L71-L89: Add a test with { audio: validator }. Add coverage for meta[name="twitter:player"].
  • packages/metascraper-video/test/iframe.js#L72-L91: Add a test with { video: validator }. Add coverage for meta[name="twitter:player"].
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/metascraper-audio/test/iframe.js` around lines 71 - 89, Add
regression coverage in packages/metascraper-audio/test/iframe.js:71-89 by
changing the iframe validation test to use an explicit { audio: validator }
configuration and include meta[name="twitter:player"] validation. Apply the same
coverage in packages/metascraper-video/test/iframe.js:72-91 using { video:
validator }, including the Twitter-player metadata path; ensure both tests
verify hostile values are rejected and safe values are retained.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@README.md`:
- Around line 363-364: Update the validate example to check that value is a
string before calling startsWith, while preserving rejection of string values
beginning with "data:" and accepting non-string values without throwing.

---

Nitpick comments:
In `@packages/metascraper-audio/test/iframe.js`:
- Around line 71-89: Add regression coverage in
packages/metascraper-audio/test/iframe.js:71-89 by changing the iframe
validation test to use an explicit { audio: validator } configuration and
include meta[name="twitter:player"] validation. Apply the same coverage in
packages/metascraper-video/test/iframe.js:72-91 using { video: validator },
including the Twitter-player metadata path; ensure both tests verify hostile
values are rejected and safe values are retained.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 635fdb3f-8a82-4638-84e8-272753d16804

📥 Commits

Reviewing files that changed from the base of the PR and between 753228e and 390cb2c.

📒 Files selected for processing (10)
  • README.md
  • packages/metascraper-audio/src/index.js
  • packages/metascraper-audio/test/iframe.js
  • packages/metascraper-helpers/src/index.js
  • packages/metascraper-helpers/test/find-rule.js
  • packages/metascraper-video/src/index.js
  • packages/metascraper-video/test/iframe.js
  • packages/metascraper/src/index.d.ts
  • packages/metascraper/test/types/index.test-d.ts
  • packages/metascraper/test/unit/validate.js
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/metascraper-helpers/src/index.js

Comment thread README.md Resolved
Deduplicate nested iframe probing so validate keeps one code path,
and tighten docs/tests from review feedback.

Co-authored-by: Cursor <[email protected]>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/metascraper-helpers/src/index.js`:
- Around line 661-665: Update the iframe wrapper flow around findRule so
candidates already validated by the nested findRule call are not validated again
by the outer findRule. Preserve the nested validation context, including rule
and htmlDom, by carrying an internal validated-result state through the wrapper
return path. Add coverage asserting an accepted iframe candidate invokes its
validator exactly once.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: eed0265c-0a0f-4a1a-a611-495d2f22cab4

📥 Commits

Reviewing files that changed from the base of the PR and between 3502697 and cd84e8c.

📒 Files selected for processing (7)
  • README.md
  • packages/metascraper-audio/src/index.js
  • packages/metascraper-audio/test/iframe.js
  • packages/metascraper-helpers/src/index.js
  • packages/metascraper-video/src/index.js
  • packages/metascraper-video/test/iframe.js
  • packages/metascraper/src/index.d.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • README.md
  • packages/metascraper-video/src/index.js
  • packages/metascraper/src/index.d.ts

Scrape-time validate mixed a second control plane into the call.
Bundle/rule validate matches test and needs no args forwarding.

Co-authored-by: Cursor <[email protected]>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/metascraper/src/rules.js`:
- Around line 65-70: Update mergeRules so pkgName is retained when destructuring
each rule and ruleSet, then pass the parent package name to attachRuleMeta for
every processed inline rule. Preserve the existing test and validate metadata
while ensuring inline rules keep their originating package name.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 1f52a48f-f20e-4281-9123-64435eaba283

📥 Commits

Reviewing files that changed from the base of the PR and between cd84e8c and a48e8d9.

📒 Files selected for processing (10)
  • CONTRIBUTING.md
  • packages/metascraper-audio/test/iframe.js
  • packages/metascraper-helpers/src/index.js
  • packages/metascraper-helpers/test/find-rule.js
  • packages/metascraper-video/test/iframe.js
  • packages/metascraper/src/index.d.ts
  • packages/metascraper/src/rules.js
  • packages/metascraper/test/types/index.test-d.ts
  • packages/metascraper/test/unit/merge-rules.js
  • packages/metascraper/test/unit/validate.js
🚧 Files skipped from review as they are similar to previous changes (4)
  • packages/metascraper-helpers/test/find-rule.js
  • packages/metascraper-audio/test/iframe.js
  • packages/metascraper-video/test/iframe.js
  • packages/metascraper-helpers/src/index.js

Comment thread packages/metascraper/src/rules.js Resolved
@Kikobeats Kikobeats changed the title feat(helpers): add per-call validate hook to findRule feat(helpers): add rule-level validate (like test) Aug 6, 2026
@Kikobeats
Kikobeats merged commit d40856b into master Aug 7, 2026
85 of 89 checks passed
@Kikobeats
Kikobeats deleted the next branch August 7, 2026 08:03
markharding pushed a commit to futo-org/Harbor that referenced this pull request Oct 13, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [metascraper](https://metascraper.js.org) ([source](https://github.com/microlinkhq/metascraper)) | [`5.51.1` → `5.58.4`](https://renovatebot.com/diffs/npm/metascraper/5.51.1/5.58.4) | ![age](https://developer.mend.io/api/mc/badges/age/npm/metascraper/5.58.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/metascraper/5.51.1/5.58.4?slim=true) |

---

### Release Notes

<details>
<summary>microlinkhq/metascraper (metascraper)</summary>

### [`v5.58.4`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5584-2026-10-09)

[Compare Source](microlinkhq/metascraper@v5.58.1...v5.58.4)

**Note:** Version bump only for package metascraper

### [`v5.58.1`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5581-2026-09-17)

[Compare Source](microlinkhq/metascraper@v5.56.2...v5.58.1)

##### Bug Fixes

- **metascraper-instagram:** prefer 180px apple-touch logo ([#&#8203;882](microlinkhq/metascraper#882)) ([a586af5](microlinkhq/metascraper@a586af5))
- use [@&#8203;kikobeats/got](https://github.com/kikobeats/got) to support Node.js 24.20 ([#&#8203;881](microlinkhq/metascraper#881)) ([41a626b](microlinkhq/metascraper@41a626b)), closes [nodejs/node#64847](nodejs/node#64847)

### [`v5.56.2`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5570-2026-08-19)

[Compare Source](microlinkhq/metascraper@v5.56.1...v5.56.2)

##### Features

- add metascraper-imdb ([#&#8203;876](microlinkhq/metascraper#876)) ([b10eabb](microlinkhq/metascraper@b10eabb))

#### [5.56.2](microlinkhq/metascraper@v5.56.1...v5.56.2) (2026-08-17)

**Note:** Version bump only for package metascraper

#### [5.56.1](microlinkhq/metascraper@v5.56.0...v5.56.1) (2026-08-17)

##### Bug Fixes

- **author:** fall back to twitter:creator ([#&#8203;874](microlinkhq/metascraper#874)) ([d1ec557](microlinkhq/metascraper@d1ec557)), closes [#author-group](https://github.com/microlinkhq/metascraper/issues/author-group) [#author-group](https://github.com/microlinkhq/metascraper/issues/author-group)

### [`v5.56.1`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5570-2026-08-19)

[Compare Source](microlinkhq/metascraper@v5.55.2...v5.56.1)

##### Features

- add metascraper-imdb ([#&#8203;876](microlinkhq/metascraper#876)) ([b10eabb](microlinkhq/metascraper@b10eabb))

#### [5.56.2](microlinkhq/metascraper@v5.56.1...v5.56.2) (2026-08-17)

**Note:** Version bump only for package metascraper

#### [5.56.1](microlinkhq/metascraper@v5.56.0...v5.56.1) (2026-08-17)

##### Bug Fixes

- **author:** fall back to twitter:creator ([#&#8203;874](microlinkhq/metascraper#874)) ([d1ec557](microlinkhq/metascraper@d1ec557)), closes [#author-group](https://github.com/microlinkhq/metascraper/issues/author-group) [#author-group](https://github.com/microlinkhq/metascraper/issues/author-group)

### [`v5.55.2`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5560-2026-08-15)

[Compare Source](microlinkhq/metascraper@v5.55.1...v5.55.2)

##### Features

- add metascraper-citation ([#&#8203;873](microlinkhq/metascraper#873)) ([31bceb1](microlinkhq/metascraper@31bceb1))

#### [5.55.2](microlinkhq/metascraper@v5.55.1...v5.55.2) (2026-08-13)

##### Bug Fixes

- **helpers:** keep CGI + in query strings ([#&#8203;872](microlinkhq/metascraper#872)) ([4743562](microlinkhq/metascraper@4743562))

#### [5.55.1](microlinkhq/metascraper@v5.55.0...v5.55.1) (2026-08-10)

##### Bug Fixes

- **youtube:** date a video by its upload date ([#&#8203;869](microlinkhq/metascraper#869)) ([7040d5c](microlinkhq/metascraper@7040d5c))

### [`v5.55.1`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5560-2026-08-15)

[Compare Source](microlinkhq/metascraper@v5.55.0...v5.55.1)

##### Features

- add metascraper-citation ([#&#8203;873](microlinkhq/metascraper#873)) ([31bceb1](microlinkhq/metascraper@31bceb1))

#### [5.55.2](microlinkhq/metascraper@v5.55.1...v5.55.2) (2026-08-13)

##### Bug Fixes

- **helpers:** keep CGI + in query strings ([#&#8203;872](microlinkhq/metascraper#872)) ([4743562](microlinkhq/metascraper@4743562))

#### [5.55.1](microlinkhq/metascraper@v5.55.0...v5.55.1) (2026-08-10)

##### Bug Fixes

- **youtube:** date a video by its upload date ([#&#8203;869](microlinkhq/metascraper#869)) ([7040d5c](microlinkhq/metascraper@7040d5c))

### [`v5.55.0`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5560-2026-08-15)

[Compare Source](microlinkhq/metascraper@v5.54.1...v5.55.0)

##### Features

- add metascraper-citation ([#&#8203;873](microlinkhq/metascraper#873)) ([31bceb1](microlinkhq/metascraper@31bceb1))

#### [5.55.2](microlinkhq/metascraper@v5.55.1...v5.55.2) (2026-08-13)

##### Bug Fixes

- **helpers:** keep CGI + in query strings ([#&#8203;872](microlinkhq/metascraper#872)) ([4743562](microlinkhq/metascraper@4743562))

#### [5.55.1](microlinkhq/metascraper@v5.55.0...v5.55.1) (2026-08-10)

##### Bug Fixes

- **youtube:** date a video by its upload date ([#&#8203;869](microlinkhq/metascraper#869)) ([7040d5c](microlinkhq/metascraper@7040d5c))

### [`v5.54.1`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5550-2026-08-09)

[Compare Source](microlinkhq/metascraper@v5.54.0...v5.54.1)

##### Features

- **helpers:** pass propName to validate ([#&#8203;868](microlinkhq/metascraper#868)) ([8e0a75f](microlinkhq/metascraper@8e0a75f))

#### [5.54.1](microlinkhq/metascraper@v5.54.0...v5.54.1) (2026-08-07)

**Note:** Version bump only for package metascraper

### [`v5.54.0`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5550-2026-08-09)

[Compare Source](microlinkhq/metascraper@v5.53.0...v5.54.0)

##### Features

- **helpers:** pass propName to validate ([#&#8203;868](microlinkhq/metascraper#868)) ([8e0a75f](microlinkhq/metascraper@8e0a75f))

#### [5.54.1](microlinkhq/metascraper@v5.54.0...v5.54.1) (2026-08-07)

**Note:** Version bump only for package metascraper

### [`v5.53.0`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5540-2026-08-07)

[Compare Source](microlinkhq/metascraper@v5.52.1...v5.53.0)

##### Features

- **helpers:** add rule-level validate (like test) ([#&#8203;866](microlinkhq/metascraper#866)) ([d40856b](microlinkhq/metascraper@d40856b))

#### [5.53.1](microlinkhq/metascraper@v5.53.0...v5.53.1) (2026-08-02)

##### Bug Fixes

- keep the favicon body under reachable-url v2 ([#&#8203;865](microlinkhq/metascraper#865)) ([ce4536f](microlinkhq/metascraper@ce4536f))

### [`v5.52.1`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5530-2026-07-30)

[Compare Source](microlinkhq/metascraper@v5.52.0...v5.52.1)

##### Features

- **helpers:** read the declared protocol instead of resolving it ([#&#8203;864](microlinkhq/metascraper#864)) ([2d72298](microlinkhq/metascraper@2d72298))

#### [5.52.1](microlinkhq/metascraper@v5.52.0...v5.52.1) (2026-07-29)

**Note:** Version bump only for package metascraper

### [`v5.52.0`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5530-2026-07-30)

[Compare Source](microlinkhq/metascraper@v5.51.1...v5.52.0)

##### Features

- **helpers:** read the declared protocol instead of resolving it ([#&#8203;864](microlinkhq/metascraper#864)) ([2d72298](microlinkhq/metascraper@2d72298))

#### [5.52.1](microlinkhq/metascraper@v5.52.0...v5.52.1) (2026-07-29)

**Note:** Version bump only for package metascraper

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on tuesday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMzMuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjEzMy4wIiwidGFyZ2V0QnJhbmNoIjoiZGV2ZWxvcCIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJyZW5vdmF0ZSJdfQ==-->

Reviewed-on: https://code.futo.org/harbor/harbor/pulls/1815
markharding pushed a commit to futo-org/Harbor that referenced this pull request Oct 15, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [metascraper-title](https://metascraper.js.org) ([source](https://github.com/microlinkhq/metascraper)) | [`5.51.1` → `5.58.4`](https://renovatebot.com/diffs/npm/metascraper-title/5.51.1/5.58.4) | ![age](https://developer.mend.io/api/mc/badges/age/npm/metascraper-title/5.58.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/metascraper-title/5.51.1/5.58.4?slim=true) |

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/99) for more information.

---

### Release Notes

<details>
<summary>microlinkhq/metascraper (metascraper-title)</summary>

### [`v5.58.4`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5584-2026-10-09)

[Compare Source](microlinkhq/metascraper@v5.56.2...v5.58.4)

**Note:** Version bump only for package metascraper

### [`v5.56.2`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5562-2026-08-17)

[Compare Source](microlinkhq/metascraper@v5.55.2...v5.56.2)

**Note:** Version bump only for package metascraper

### [`v5.55.2`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5552-2026-08-13)

[Compare Source](microlinkhq/metascraper@v5.55.0...v5.55.2)

##### Bug Fixes

- **helpers:** keep CGI + in query strings ([#&#8203;872](microlinkhq/metascraper#872)) ([4743562](microlinkhq/metascraper@4743562))

### [`v5.55.0`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5550-2026-08-09)

[Compare Source](microlinkhq/metascraper@v5.54.1...v5.55.0)

##### Features

- **helpers:** pass propName to validate ([#&#8203;868](microlinkhq/metascraper#868)) ([8e0a75f](microlinkhq/metascraper@8e0a75f))

#### [5.54.1](microlinkhq/metascraper@v5.54.0...v5.54.1) (2026-08-07)

**Note:** Version bump only for package metascraper

### [`v5.54.1`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5541-2026-08-07)

[Compare Source](microlinkhq/metascraper@v5.54.0...v5.54.1)

**Note:** Version bump only for package metascraper

### [`v5.54.0`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5540-2026-08-07)

[Compare Source](microlinkhq/metascraper@v5.53.0...v5.54.0)

##### Features

- **helpers:** add rule-level validate (like test) ([#&#8203;866](microlinkhq/metascraper#866)) ([d40856b](microlinkhq/metascraper@d40856b))

#### [5.53.1](microlinkhq/metascraper@v5.53.0...v5.53.1) (2026-08-02)

##### Bug Fixes

- keep the favicon body under reachable-url v2 ([#&#8203;865](microlinkhq/metascraper#865)) ([ce4536f](microlinkhq/metascraper@ce4536f))

### [`v5.53.0`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5530-2026-07-30)

[Compare Source](microlinkhq/metascraper@v5.52.0...v5.53.0)

##### Features

- **helpers:** read the declared protocol instead of resolving it ([#&#8203;864](microlinkhq/metascraper#864)) ([2d72298](microlinkhq/metascraper@2d72298))

#### [5.52.1](microlinkhq/metascraper@v5.52.0...v5.52.1) (2026-07-29)

**Note:** Version bump only for package metascraper

### [`v5.52.0`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5520-2026-07-29)

[Compare Source](microlinkhq/metascraper@v5.51.1...v5.52.0)

##### Features

- add metascraper-logo-bimi ([#&#8203;861](microlinkhq/metascraper#861)) ([b178b76](microlinkhq/metascraper@b178b76))

#### [5.51.2](microlinkhq/metascraper@v5.51.1...v5.51.2) (2026-06-30)

##### Bug Fixes

- **metascraper-amazon:** match Amazon domains via PSL hostname, not substring regex ([#&#8203;852](microlinkhq/metascraper#852)) ([ec0d494](microlinkhq/metascraper@ec0d494)), closes [#&#8203;851](microlinkhq/metascraper#851)

#### [5.51.1](microlinkhq/metascraper@v5.51.0...v5.51.1) (2026-06-19)

**Note:** Version bump only for package metascraper

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on tuesday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMzMuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE2NC41IiwidGFyZ2V0QnJhbmNoIjoiZGV2ZWxvcCIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJyZW5vdmF0ZSJdfQ==-->

Reviewed-on: https://code.futo.org/harbor/harbor/pulls/1818
markharding pushed a commit to futo-org/Harbor that referenced this pull request Oct 16, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [metascraper-url](https://metascraper.js.org) ([source](https://github.com/microlinkhq/metascraper)) | [`5.51.1` → `5.58.4`](https://renovatebot.com/diffs/npm/metascraper-url/5.51.1/5.58.4) | ![age](https://developer.mend.io/api/mc/badges/age/npm/metascraper-url/5.58.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/metascraper-url/5.51.1/5.58.4?slim=true) |

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/99) for more information.

---

### Release Notes

<details>
<summary>microlinkhq/metascraper (metascraper-url)</summary>

### [`v5.58.4`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5584-2026-10-09)

[Compare Source](microlinkhq/metascraper@v5.56.2...v5.58.4)

**Note:** Version bump only for package metascraper

### [`v5.56.2`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5562-2026-08-17)

[Compare Source](microlinkhq/metascraper@v5.55.2...v5.56.2)

**Note:** Version bump only for package metascraper

### [`v5.55.2`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5552-2026-08-13)

[Compare Source](microlinkhq/metascraper@v5.55.0...v5.55.2)

##### Bug Fixes

- **helpers:** keep CGI + in query strings ([#&#8203;872](microlinkhq/metascraper#872)) ([4743562](microlinkhq/metascraper@4743562))

### [`v5.55.0`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5550-2026-08-09)

[Compare Source](microlinkhq/metascraper@v5.54.1...v5.55.0)

##### Features

- **helpers:** pass propName to validate ([#&#8203;868](microlinkhq/metascraper#868)) ([8e0a75f](microlinkhq/metascraper@8e0a75f))

#### [5.54.1](microlinkhq/metascraper@v5.54.0...v5.54.1) (2026-08-07)

**Note:** Version bump only for package metascraper

### [`v5.54.1`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5541-2026-08-07)

[Compare Source](microlinkhq/metascraper@v5.54.0...v5.54.1)

**Note:** Version bump only for package metascraper

### [`v5.54.0`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5540-2026-08-07)

[Compare Source](microlinkhq/metascraper@v5.53.0...v5.54.0)

##### Features

- **helpers:** add rule-level validate (like test) ([#&#8203;866](microlinkhq/metascraper#866)) ([d40856b](microlinkhq/metascraper@d40856b))

#### [5.53.1](microlinkhq/metascraper@v5.53.0...v5.53.1) (2026-08-02)

##### Bug Fixes

- keep the favicon body under reachable-url v2 ([#&#8203;865](microlinkhq/metascraper#865)) ([ce4536f](microlinkhq/metascraper@ce4536f))

### [`v5.53.0`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5530-2026-07-30)

[Compare Source](microlinkhq/metascraper@v5.52.0...v5.53.0)

##### Features

- **helpers:** read the declared protocol instead of resolving it ([#&#8203;864](microlinkhq/metascraper#864)) ([2d72298](microlinkhq/metascraper@2d72298))

#### [5.52.1](microlinkhq/metascraper@v5.52.0...v5.52.1) (2026-07-29)

**Note:** Version bump only for package metascraper

### [`v5.52.0`](https://github.com/microlinkhq/metascraper/blob/HEAD/CHANGELOG.md#5520-2026-07-29)

[Compare Source](microlinkhq/metascraper@v5.51.1...v5.52.0)

##### Features

- add metascraper-logo-bimi ([#&#8203;861](microlinkhq/metascraper#861)) ([b178b76](microlinkhq/metascraper@b178b76))

#### [5.51.2](microlinkhq/metascraper@v5.51.1...v5.51.2) (2026-06-30)

##### Bug Fixes

- **metascraper-amazon:** match Amazon domains via PSL hostname, not substring regex ([#&#8203;852](microlinkhq/metascraper#852)) ([ec0d494](microlinkhq/metascraper@ec0d494)), closes [#&#8203;851](microlinkhq/metascraper#851)

#### [5.51.1](microlinkhq/metascraper@v5.51.0...v5.51.1) (2026-06-19)

**Note:** Version bump only for package metascraper

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - "before 9am on tuesday"
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMzMuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE2NC41IiwidGFyZ2V0QnJhbmNoIjoiZGV2ZWxvcCIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJyZW5vdmF0ZSJdfQ==-->

Reviewed-on: https://code.futo.org/harbor/harbor/pulls/1819
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant