Skip to content

docs: extend ENS Unigraph examples#2264

Open
tk-o wants to merge 10 commits into
mainfrom
docs/extend-ens-unigraph-examples
Open

docs: extend ENS Unigraph examples#2264
tk-o wants to merge 10 commits into
mainfrom
docs/extend-ens-unigraph-examples

Conversation

@tk-o
Copy link
Copy Markdown
Member

@tk-o tk-o commented Jun 5, 2026

Lite PR

Tip: Review docs on the ENSNode PR process

Summary

  • Refactored ENS Unigraph examples
    • Split code snippets and results into separate files to enable simpler structure of the example pages (simple import and passing props to the actual UI component displaying rich preview of the given example).
  • Added multiple examples presenting various capabilities of the ENS Unigraph indexed data model.

Why

  • There were just a few examples, and we want to demonstrate more use cases for the ENS Unigraph.

Testing

  • All queries (both SQL and SDK forms) were tested with a local ENSApi instance to ensure completeness and correctness.

Notes for Reviewer (Optional)

  • Anything non-obvious or worth a heads-up.

Pre-Review Checklist (Blocking)

  • This PR does not introduce significant changes and is low-risk to review quickly.
  • Relevant changesets are included (or are not required)

@tk-o tk-o requested a review from a team as a code owner June 5, 2026 15:16
Copilot AI review requested due to automatic review settings June 5, 2026 15:16
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Jun 5, 2026

⚠️ No Changeset found

Latest commit: d55072a

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented Jun 5, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
enskit-react-example.ensnode.io Ready Ready Preview, Comment Jun 8, 2026 10:27am
ensnode.io Ready Ready Preview, Comment Jun 8, 2026 10:27am
2 Skipped Deployments
Project Deployment Actions Updated (UTC)
admin.ensnode.io Skipped Skipped Jun 8, 2026 10:27am
ensrainbow.io Skipped Skipped Jun 8, 2026 10:27am

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jun 5, 2026

Review Change Stack

Warning

Review limit reached

@tk-o, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 15 minutes and 20 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: dfcd5b0a-4a6e-4140-bb14-0e0ef2df1ca6

📥 Commits

Reviewing files that changed from the base of the PR and between 77ab8dc and d55072a.

📒 Files selected for processing (6)
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-events.mdx
  • docs/ensnode.io/src/data/unigraph-examples/account-domains.ts
  • docs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.ts
  • docs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.ts
  • docs/ensnode.io/src/data/unigraph-examples/utils.ts
  • docs/ensnode.io/src/styles/starlight.css
📝 Walkthrough

Walkthrough

Centralizes Unigraph SQL/SDK examples into typed TypeScript modules, updates the example renderer to consume optional HTML result notes, refactors MDX pages to import shared examples, adds five new example pages, and updates sidebar navigation and CSS selectors to surface the examples.

Changes

Unigraph Example Documentation System

Layer / File(s) Summary
Type contracts and output utilities
docs/ensnode.io/src/data/unigraph-examples/types.ts, docs/ensnode.io/src/data/unigraph-examples/utils.ts
CodeExample and QueryExample interfaces plus outputSource and EnsNodeInstances standardize example payloads and produce HTML result notes.
Shared example data modules
docs/ensnode.io/src/data/unigraph-examples/* (account-domains.ts, domain-by-name.ts, domain-events.ts, domains-fuzzy-search-by-name.ts, expiring-registrations.ts, indexing-status.ts, latest-registrations.ts, subdomains-by-parent-name.ts)
Typed QueryExample modules exporting sql and sdk CodeExample objects with codeSnippet, result, and optional resultNote, centralizing snippet/result data used by MDX pages.
Example renderer updates
docs/ensnode.io/src/components/molecules/unigraph-static-example/UnigraphStaticExample.astro
Renders StaticExampleNote via set:html using sql.resultNote ?? defaultResultNote and ensDbSdk.resultNote ?? defaultResultNote.
Documentation pages and MDX wiring
docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/*, docs/ensnode.io/src/components/molecules/EnsDbReaderIntro.astro
Refactors existing example MDX pages to import shared modules and adds new example pages (Domain Events, Fuzzy Search, Expiring Registrations, Latest Registrations, Subdomains); updates a reader note to reference the “Connect example.”
Navigation sidebar and style tweaks
docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts, docs/ensnode.io/src/content/docs/docs/integrate/index.mdx, docs/ensnode.io/src/styles/starlight.css
Adds six example links under ENS Unigraph SQL (including Connect, Domain Fuzzy Search, Domain Events, Subdomains, Latest Registrations, Expiring Registrations), re-capitalizes ENSNode Plugins (Data Models), expands Writers/Readers/Plugins descriptions, and normalizes/refactors multiple CSS selectors/spacing.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • namehash/ensnode#2247: Related updates to UnigraphStaticExample.astro for note rendering and example UI refinement.
  • namehash/ensnode#2202: Overlapping edits to EnsDbReaderIntro.astro and example documentation content.
  • namehash/ensnode#2171: Prior modifications to the "ENS Unigraph SQL" sidebar section in integrate.ts.

Suggested labels

docs

🐰 I hopped through docs to tidy the trail,
Examples gathered, no story to derail,
Types stitched the snippets, notes glowing bright,
Sidebar points the way, CSS kept polite,
Now the guide is neat — hop forward, take flight!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title 'docs: extend ENS Unigraph examples' clearly and concisely describes the main change—expanding the ENS Unigraph documentation examples—which is the primary objective of this PR.
Description check ✅ Passed The PR description follows the template structure with all required sections (Summary, Why, Testing, Notes for Reviewer, Pre-Review Checklist) completed, providing clear rationale and testing details for the refactoring and new examples.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/extend-ens-unigraph-examples

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 and usage tips.

@tk-o tk-o changed the title Docs/extend ens unigraph examples docs: extend ENS Unigraph examples Jun 5, 2026
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Jun 5, 2026

Greptile Summary

This PR refactors ENS Unigraph documentation examples by moving inline code snippets and result data out of MDX files into dedicated TypeScript data files, and adds six new example pages covering fuzzy search, domain events, subdomains, account domains, latest registrations, and expiring registrations.

  • Example data is now centralized under src/data/unigraph-examples/, with a shared types.ts / utils.ts layer; UnigraphStaticExample.astro switches to set:html to render the anchor-tagged result notes generated by outputSource().
  • All previously flagged issues (missing desc import in latest-registrations, unused asc in fuzzy-search, double-wrapped indexingStatus, typo in sidebar, wrong JSDoc in expiring-registrations) appear to be resolved in this revision.
  • One remaining inconsistency in subdomains-by-parent-name.ts: the SQL and SDK result tabs show different records for sfmpfv44d0mig.eth (ENSv1Domain vs ENSv2Domain with different registry addresses), misleading readers comparing the two output tabs.

Confidence Score: 4/5

Safe to merge after fixing the result inconsistency in subdomains-by-parent-name.ts.

The change is documentation-only and most examples are correct. The subdomains example shows a different record for the same domain name ("sfmpfv44d0mig.eth") between the SQL and SDK output tabs — ENSv1Domain in SQL, ENSv2Domain in SDK — which gives readers contradictory information side-by-side.

docs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.ts — the SQL and SDK result sets should agree on the same records.

Important Files Changed

Filename Overview
docs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.ts New example file for subdomain queries; SQL and SDK result sets disagree on the 5th entry ("sfmpfv44d0mig.eth" shown as ENSv1Domain in SQL tab but ENSv2Domain in SDK tab).
docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts New example file for latest registrations; SQL query now correctly selects grace_period, base, premium, and registration_type to match the displayed result. Previous issues resolved.
docs/ensnode.io/src/data/unigraph-examples/indexing-status.ts Refactored into a shared data file; double-wrapped indexingStatus issue from prior review is resolved — sql.result and sdk.result are now correctly structured.
docs/ensnode.io/src/components/molecules/unigraph-static-example/UnigraphStaticExample.astro Switches resultNote rendering to set:html to support anchor links generated by outputSource(); the content is fully static/typed so no XSS exposure.
docs/ensnode.io/src/data/unigraph-examples/expiring-registrations.ts New example file for expiring registrations; JSDoc is accurate and SQL/SDK results are consistent.
docs/ensnode.io/src/data/unigraph-examples/domain-events.ts New example file for domain events query; SQL and SDK results are consistent and imports are correct.
docs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.ts New fuzzy search example; unused asc import from prior review is gone, imports are correct (and, eq, sql only).
docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts Adds 6 new sidebar entries for the new example pages; "Expiring Registrations" typo from prior review is now correctly spelled.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["MDX Example Page\n(e.g. subdomains-by-parent-name.mdx)"] --> B["import exampleXyz\nfrom @data/unigraph-examples/xyz.ts"]
    B --> C["QueryExample\n{ sql: CodeExample, sdk: CodeExample }"]
    C --> D["UnigraphStaticExample.astro\nsql={...} ensDbSdk={...}"]
    D --> E["SQL Tab\ncodeSnippet + result + resultNote"]
    D --> F["SDK Tab\ncodeSnippet + result + resultNote"]
    E --> G["set:html resultNote\nvia outputSource()"]
    F --> G
    G --> H["Rendered anchor link\nto hosted instance docs"]
    C2["utils.ts\noutputSource(EnsNodeInstance)"] --> G
Loading

Reviews (6): Last reviewed commit: "Improve ENS Unigraph examples" | Re-trigger Greptile

Comment thread docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts Outdated
Comment thread docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts Outdated
Comment thread docs/ensnode.io/src/data/unigraph-examples/account-domains.ts Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR expands the ENS Unigraph SQL examples in the docs by moving example payloads into dedicated data modules and adding several new example pages that import those modules for rendering.

Changes:

  • Introduced a small QueryExample/CodeExample type contract and added multiple new Unigraph example data files (SQL + ensdb-sdk snippets + static results).
  • Added new MDX pages for each example and refactored existing pages to import examples from @data/unigraph-examples/....
  • Updated the Integrate sidebar to include the expanded Unigraph examples navigation.

Reviewed changes

Copilot reviewed 20 out of 20 changed files in this pull request and generated 10 comments.

Show a summary per file
File Description
docs/ensnode.io/src/data/unigraph-examples/types.ts Adds shared TS types for example payloads.
docs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.ts Adds subdomains-by-parent SQL/SDK example + result fixture.
docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts Adds latest-registrations SQL/SDK example + result fixture.
docs/ensnode.io/src/data/unigraph-examples/indexing-status.ts Adds indexing-status SQL/SDK example + result fixture.
docs/ensnode.io/src/data/unigraph-examples/expiring-registrations.ts Adds expiring-registrations SQL/SDK example + result fixture.
docs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.ts Adds pg_trgm-based fuzzy name search example + result fixture.
docs/ensnode.io/src/data/unigraph-examples/domain-events.ts Adds domain events join example + result fixture.
docs/ensnode.io/src/data/unigraph-examples/domain-by-name.ts Adds canonical-name lookup example + result fixture.
docs/ensnode.io/src/data/unigraph-examples/account-domains.ts Adds “domains owned by address” example + result fixture.
docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/subdomains-by-parent-name.mdx New example page wiring the data module into the UI component.
docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/latest-registrations.mdx New example page wiring the data module into the UI component.
docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/indexing-status.mdx Refactors existing page to import the new data module.
docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/expiring-registrations.mdx New example page wiring the data module into the UI component.
docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domains-fuzzy-search-by-name.mdx New example page wiring the data module into the UI component.
docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-events.mdx New example page wiring the data module into the UI component.
docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-by-name.mdx Refactors existing page to import the new data module.
docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdx Refactors existing page to import the new data module.
docs/ensnode.io/src/content/docs/docs/integrate/index.mdx Updates integration option descriptions.
docs/ensnode.io/src/components/molecules/EnsDbReaderIntro.astro Minor copy tweak referencing the “Connect” example.
docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts Adds sidebar links for the expanded Unigraph example set.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts
Comment thread docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts Outdated
Comment thread docs/ensnode.io/src/data/unigraph-examples/account-domains.ts Outdated
Comment thread docs/ensnode.io/src/data/unigraph-examples/indexing-status.ts Outdated
Comment thread docs/ensnode.io/src/data/unigraph-examples/indexing-status.ts Outdated
Comment thread docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts
Comment thread docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 7

🤖 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 `@docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts`:
- Around line 206-207: Correct the typo in the sidebar entry by changing the
label string "Exipring Registrations" to "Expiring Registrations"; locate the
object where label: "Exipring Registrations" appears (the same entry with link:
"/docs/integrate/unigraph/examples/expiring-registrations") and update the label
value to the spelled-correct form.

In
`@docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-events.mdx`:
- Line 17: The description paragraph starting with "Fetch recent events for a
Domain by its canonical name..." is missing the consistent setup reference;
update that paragraph (in the content of domain-events.mdx) to append the
sentence "See [Connect](/docs/integrate/unigraph/examples) for setup." so it
matches the other example pages (search for the exact paragraph text or the
file's title/section to locate where to insert this reference).

In `@docs/ensnode.io/src/data/unigraph-examples/account-domains.ts`:
- Around line 98-119: The example uses asc(...) in orderBy but never imports it;
update the import line in the codeSnippet to include asc (i.e., import { and,
eq, asc } from "drizzle-orm") so the call to asc in the accountDomains query
resolves correctly—modify the import near the top of the snippet where and and
eq are imported.

In `@docs/ensnode.io/src/data/unigraph-examples/expiring-registrations.ts`:
- Around line 3-5: Update the module JSDoc to describe expiring registrations
rather than recent events; replace the current summary line ("Example query for
fetching recent events for a Domain by its canonical name.") with a concise
description matching the file intent such as "Example query for fetching
expiring registrations for a Domain" (or similar phrasing) in the top comment of
expiring-registrations.ts so the documentation matches the query implemented in
this module.

In `@docs/ensnode.io/src/data/unigraph-examples/indexing-status.ts`:
- Around line 119-130: The example outputs incorrectly nest indexingStatus one
level too deep; update the result objects so they use
indexingStatusSnapshot.indexingStatus instead of { indexingStatus:
indexingStatusSnapshot } (i.e., set result to { indexingStatus:
indexingStatusSnapshot.indexingStatus }) for both occurrences referenced around
indexingStatusSnapshot and the SDK snippet constants to match the SQL/SDK
examples.

In `@docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts`:
- Around line 8-24: The SQL in the codeSnippet currently selects five columns
(d.canonical_name, r.start, r.expiry, d.owner_id, d.id AS domain_id) with LIMIT
15 but the documented result payload contains additional registration columns
and only five rows; make them consistent by either (A) expanding the SELECT in
the codeSnippet to include the extra registration fields shown in the result
(e.g., add r.transaction_hash, r.registration_index, r.type, etc.) and keep
LIMIT 5 if the example intends five rows, or (B) update the result block to
match the current SQL (only the five selected columns and 15 rows); locate the
codeSnippet string in latest-registrations.ts and change the SELECT column list
and LIMIT (or the result block) accordingly so both the query and the documented
result match exactly.
- Around line 89-127: The code snippet is missing the desc import and the SQL
example's selected columns and LIMIT don't match the shown result objects;
update the drizzle import to include desc (alongside and, asc, eq, ne, lte, sql)
so the call to desc(ensIndexerSchema.registration.start) is valid, and then make
the SELECT and LIMIT in the SQL example consistent with the JavaScript query and
example output—either change the SQL SELECT to return the same fields as
recentRegistrations (canonicalName, expiry, start,
registrationType/registration.type, ownerId, domainId) and set LIMIT 5, or alter
the JS select to include grace_period/base/premium/registration_type and use
LIMIT 15 to match the displayed result—ensure recentRegistrations, desc, and the
SQL SELECT/LIMIT are aligned.
🪄 Autofix (Beta)

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: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 246d12cd-2c73-4f09-9279-aed3c5020bc8

📥 Commits

Reviewing files that changed from the base of the PR and between c8267e4 and d4e91df.

📒 Files selected for processing (20)
  • docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts
  • docs/ensnode.io/src/components/molecules/EnsDbReaderIntro.astro
  • docs/ensnode.io/src/content/docs/docs/integrate/index.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-by-name.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-events.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domains-fuzzy-search-by-name.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/expiring-registrations.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/indexing-status.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/latest-registrations.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/subdomains-by-parent-name.mdx
  • docs/ensnode.io/src/data/unigraph-examples/account-domains.ts
  • docs/ensnode.io/src/data/unigraph-examples/domain-by-name.ts
  • docs/ensnode.io/src/data/unigraph-examples/domain-events.ts
  • docs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.ts
  • docs/ensnode.io/src/data/unigraph-examples/expiring-registrations.ts
  • docs/ensnode.io/src/data/unigraph-examples/indexing-status.ts
  • docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts
  • docs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.ts
  • docs/ensnode.io/src/data/unigraph-examples/types.ts

Comment thread docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts Outdated
Comment thread docs/ensnode.io/src/data/unigraph-examples/account-domains.ts Outdated
Comment thread docs/ensnode.io/src/data/unigraph-examples/indexing-status.ts Outdated
Comment thread docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts
Comment thread docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts Outdated
Comment thread apps/ensapi/src/handlers/api/router.ts Outdated
Comment thread apps/ensapi/src/handlers/api/test/test-queries-api.ts Outdated
Copilot AI review requested due to automatic review settings June 5, 2026 17:55
@tk-o tk-o force-pushed the docs/extend-ens-unigraph-examples branch from 66e5135 to 2b41753 Compare June 5, 2026 17:55
@vercel vercel Bot temporarily deployed to Preview – ensrainbow.io June 5, 2026 17:55 Inactive
@vercel vercel Bot temporarily deployed to Preview – admin.ensnode.io June 5, 2026 17:55 Inactive
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts (1)

98-104: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Align SDK field selection with the SQL example.

The SQL snippet (lines 8-17) selects grace_period, base, and premium from the registration table, but the SDK .select() block omits these fields. This creates an inconsistency between the two examples—users comparing SQL vs SDK approaches will see different output shapes.

🔄 Suggested alignment
 const recentRegistrations = await ensDb
   .select({
     canonicalName: ensIndexerSchema.domain.canonicalName,
     expiry: ensIndexerSchema.registration.expiry,
     start: ensIndexerSchema.registration.start,
+    gracePeriod: ensIndexerSchema.registration.gracePeriod,
+    base: ensIndexerSchema.registration.base,
+    premium: ensIndexerSchema.registration.premium,
     registrationType: ensIndexerSchema.registration.type,
     ownerId: ensIndexerSchema.domain.ownerId,
     domainId: ensIndexerSchema.domain.id,
   })

Then update the SDK result array (lines 135-181) to include gracePeriod, base, and premium in each row to match the SQL result payload.

🤖 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 `@docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts` around
lines 98 - 104, The SDK .select(...) call currently selects canonicalName,
expiry, start, registrationType, ownerId, and domainId but omits the
registration fields selected in the SQL example; update the .select invocation
to also include ensIndexerSchema.registration.grace_period,
ensIndexerSchema.registration.base, and ensIndexerSchema.registration.premium
(mapped to SDK names like gracePeriod, base, premium as needed) so the SDK
projection matches the SQL example, and then update the example SDK result array
(the result rows shown later) to add gracePeriod, base, and premium to each row
so the returned payload shape mirrors the SQL output.
🤖 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 `@apps/ensapi/src/handlers/api/test/test-queries-api.ts`:
- Around line 165-207: The /fuzzy-search route handler lacks input validation
and error handling; add a Zod schema and apply the validate() middleware to
parse/validate query params (q as non-empty string and limit as a positive
integer with a sensible default) for the app.get("/fuzzy-search", ...) route,
then wrap the database calls that use di.context.ensDb (the sqlResult and
drizzleResult queries) in a try-catch and call the existing errorResponse helper
in the catch to return a formatted error and avoid throwing raw errors to the
client.
- Around line 211-285: The /expiring route handler (app.get("/expiring")) lacks
input validation and error handling: create a Zod schema for start, end, and
limit and apply the validate() middleware to the route (use the same param names
used in the handler), then wrap the database calls that use ensDb and
ensIndexerSchema in a try-catch and return errors via the errorResponse helper;
on validation success parse and pass the validated start/end/limit into the
query and keep returning jsonBigInt on success.
- Around line 60-122: The /subdomains handler lacks input validation, error
handling, explicit missing-parent responses, and contains a debug console.log;
update the app.get("/subdomains", async (c) => { ... }) route to: validate query
params using a Zod schema (name:string, limit:number) via the validate()
middleware, wrap the database work that uses ensDb and ensIndexerSchema in a
try-catch and return errors using the errorResponse helper on catch, remove the
console.log(subdomains) call, and when parentDomain or
parentDomain.subregistryId is falsy return a clear errorResponse (e.g., 404 or
validation-style error) instead of falling through to an implicit undefined
return. Ensure you reference the existing symbols parentDomain and subdomains
when implementing these checks.
- Around line 392-445: The /domain-events route handler is missing input
validation and error handling; add a Zod schema for the query params (validate
name as string and limit as optional positive integer with a max), apply the
validate() middleware to this route so the handler uses the validated values
instead of raw c.req.query, and wrap the DB calls (the RAW SQL block and the
DRIZZLE select chain) in a try-catch that returns the standardized
errorResponse(...) on failure (use the same errorResponse helper used elsewhere
in this app); refer to the route handler for "/domain-events", the local
variables name and limit, and the DB usage via ensDb, ensIndexerSchema to locate
where to apply the validate() middleware and try-catch.
- Around line 26-57: The GET /domain-by-name handler is missing input
validation, lacks error handling, and contains a debug console.log; add a Zod
schema for the "name" query param and call the existing validate() middleware
(from apps/ensapi/src/lib/handlers/validate.ts) to validate c.req.query before
running DB logic, wrap the DB calls in a try-catch and on error return the
shared errorResponse(...) helper (from
apps/ensapi/src/lib/handlers/error-response.ts) with the caught error, and
remove the console.log(vitalik) statement; keep using the same
functions/variables in the handler (app.get("/domain-by-name"), ensDb,
ensIndexerSchema, jsonBigInt) but ensure validation runs first and DB errors are
caught and mapped to errorResponse.
- Around line 125-162: Replace the hardcoded owner and limit in the
app.get("/account-domains", async (c) => { ... }) handler by reading
c.req.query("owner") and c.req.query("limit"), add a Zod schema for those query
params and apply the existing validate() middleware for this route, wrap the
database calls (ensDb.execute and ensDb.select(...) usages referencing
ensIndexerSchema) in a try-catch and call the shared errorResponse helper on
failure, and ensure the successful response still returns jsonBigInt({ owner,
sql: sqlResult.rows, drizzle: drizzleResult }) after parsing/normalizing the
validated limit to a number.
- Around line 288-355: The /recent-registrations route handler is missing input
validation and error handling; add a Zod schema for the query param (limit) and
apply the validate() middleware before this handler, and wrap the DB calls
(ensDb.execute and the Drizzle query producing sqlResult and drizzleResult) in a
try-catch that returns the centralized errorResponse helper on failure; ensure
the validated limit is used (instead of raw parseInt) and that any caught error
is passed to errorResponse so the route fails gracefully.
- Around line 358-389: The /permissions handler returns inconsistent data and
lacks validation/error handling: validate the incoming user query using the
project's Zod schema via the validate() middleware, wrap the DB calls (the raw
SQL execute returning sqlResult and the Drizzle select producing drizzleResult)
in a try-catch and call the errorResponse helper on failure, and return
sqlResult.rows (not sqlResult) alongside drizzleResult in the jsonBigInt
response; update the app.get("/permissions") handler to perform these changes
around the existing ensDb/ensIndexerSchema usage so consumers always receive the
same array format and errors are handled.

---

Outside diff comments:
In `@docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts`:
- Around line 98-104: The SDK .select(...) call currently selects canonicalName,
expiry, start, registrationType, ownerId, and domainId but omits the
registration fields selected in the SQL example; update the .select invocation
to also include ensIndexerSchema.registration.grace_period,
ensIndexerSchema.registration.base, and ensIndexerSchema.registration.premium
(mapped to SDK names like gracePeriod, base, premium as needed) so the SDK
projection matches the SQL example, and then update the example SDK result array
(the result rows shown later) to add gracePeriod, base, and premium to each row
so the returned payload shape mirrors the SQL output.
🪄 Autofix (Beta)

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: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 829bd0dd-5833-4726-892a-6bdd6fa62b2f

📥 Commits

Reviewing files that changed from the base of the PR and between d4e91df and 66e5135.

📒 Files selected for processing (11)
  • apps/ensapi/src/handlers/api/router.ts
  • apps/ensapi/src/handlers/api/test/test-queries-api.ts
  • docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-by-name.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-events.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/expiring-registrations.mdx
  • docs/ensnode.io/src/data/unigraph-examples/account-domains.ts
  • docs/ensnode.io/src/data/unigraph-examples/expiring-registrations.ts
  • docs/ensnode.io/src/data/unigraph-examples/indexing-status.ts
  • docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts

Comment thread apps/ensapi/src/handlers/api/test/test-queries-api.ts Outdated
Comment thread apps/ensapi/src/handlers/api/test/test-queries-api.ts Outdated
Comment thread apps/ensapi/src/handlers/api/test/test-queries-api.ts Outdated
Comment thread apps/ensapi/src/handlers/api/test/test-queries-api.ts Outdated
Comment thread apps/ensapi/src/handlers/api/test/test-queries-api.ts Outdated
Comment thread apps/ensapi/src/handlers/api/test/test-queries-api.ts Outdated
Comment thread apps/ensapi/src/handlers/api/test/test-queries-api.ts Outdated
Comment thread apps/ensapi/src/handlers/api/test/test-queries-api.ts Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 20 out of 20 changed files in this pull request and generated 5 comments.

Comment thread docs/ensnode.io/src/data/unigraph-examples/types.ts
Comment thread docs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.ts Outdated
Comment thread docs/ensnode.io/src/components/molecules/EnsDbReaderIntro.astro
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 22 out of 22 changed files in this pull request and generated 9 comments.

Comment thread docs/ensnode.io/src/data/unigraph-examples/types.ts
Comment thread docs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.ts Outdated
Comment thread docs/ensnode.io/src/data/unigraph-examples/account-domains.ts
Comment thread docs/ensnode.io/src/data/unigraph-examples/account-domains.ts
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts (1)

102-108: 🧹 Nitpick | 🔵 Trivial | 💤 Low value

Consider aligning SQL and SDK field selections for consistency.

The SQL example selects grace_period, base, and premium (lines 15-17), but the SDK example omits these fields. While each variant is internally consistent with its result, documentation examples are clearer when both SQL and SDK demonstrate the same fields.

📋 Optional enhancement to match SQL fields
 .select({
   canonicalName: ensIndexerSchema.domain.canonicalName,
   expiry: ensIndexerSchema.registration.expiry,
   start: ensIndexerSchema.registration.start,
+  gracePeriod: ensIndexerSchema.registration.gracePeriod,
+  base: ensIndexerSchema.registration.base,
+  premium: ensIndexerSchema.registration.premium,
   registrationType: ensIndexerSchema.registration.type,
   ownerId: ensIndexerSchema.domain.ownerId,
   domainId: ensIndexerSchema.domain.id,
 })

Then update the SDK result array to include those fields.

🤖 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 `@docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts` around
lines 102 - 108, The SDK .select block should include the same registration
pricing fields as the SQL example: add
ensIndexerSchema.registration.grace_period, ensIndexerSchema.registration.base,
and ensIndexerSchema.registration.premium to the .select call (alongside expiry,
start, and type), then update the SDK result array/object in the example to
include the corresponding grace_period, base, and premium entries so both SQL
and SDK examples present the same fields.
docs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.ts (1)

55-55: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Fix the SDK query parameter to match the SQL example.

The SDK snippet declares const q = "vitalik"; on line 55, but the SQL example searches for 'reverse' (lines 16, 19) and both result arrays show domains matching "reverse" (e.g., "reverse", "addr.reverse"). Users copying the SDK snippet will query for "vitalik" but expect "reverse" results, making the example non-reproducible.

🔧 Proposed fix
-const q = "vitalik";
+const q = "reverse";
🤖 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 `@docs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.ts`
at line 55, The SDK example defines const q = "vitalik" which doesn't match the
SQL example that searches for "reverse"; update the SDK query parameter (the
const q variable in this file) to use "reverse" so the SDK snippet returns the
same results as the SQL example and the shown result arrays like "reverse" and
"addr.reverse" are reproducible.
docs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.ts (1)

28-135: 🧹 Nitpick | 🔵 Trivial | 💤 Low value

Minor data inconsistency between SQL and SDK result snapshots.

The 5th result row differs between SQL and SDK examples for domain "sfmpfv44d0mig.eth":

  • SQL result (lines 54-58): type: "ENSv1Domain", ID ending with ...0xb6fb...
  • SDK result (lines 129-134): type: "ENSv2Domain", ID ending with ...0x64c8...

While both may be valid domain records (if the name exists in both v1 and v2), documentation examples are more reliable when SQL and SDK variants return identical result sets for the same query. This discrepancy could stem from snapshots captured at different times or a subtle ordering difference (canonical_name vs __canonicalNamePrefix).

Consider re-capturing both snapshots from the same database state, or explicitly note in the documentation that result ordering for tied names may vary.

🤖 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 `@docs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.ts`
around lines 28 - 135, The SQL vs SDK example snapshots diverge for the
"sfmpfv44d0mig.eth" row (fields canonical_name/canonicalName and type/id
mismatch); re-run both the SQL and SDK queries from the same database state,
ensure the same ordering key (use __canonicalNamePrefix in both examples or
explicitly sort by canonical_name) and then update the two result snapshots so
the type and id for "sfmpfv44d0mig.eth" match (or add a short note explaining
that tied names may yield different domain versions); update the result arrays
(result in SQL block and result in SDK block) to be identical after re-capture.
🤖 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.

Outside diff comments:
In `@docs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.ts`:
- Line 55: The SDK example defines const q = "vitalik" which doesn't match the
SQL example that searches for "reverse"; update the SDK query parameter (the
const q variable in this file) to use "reverse" so the SDK snippet returns the
same results as the SQL example and the shown result arrays like "reverse" and
"addr.reverse" are reproducible.

In `@docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts`:
- Around line 102-108: The SDK .select block should include the same
registration pricing fields as the SQL example: add
ensIndexerSchema.registration.grace_period, ensIndexerSchema.registration.base,
and ensIndexerSchema.registration.premium to the .select call (alongside expiry,
start, and type), then update the SDK result array/object in the example to
include the corresponding grace_period, base, and premium entries so both SQL
and SDK examples present the same fields.

In `@docs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.ts`:
- Around line 28-135: The SQL vs SDK example snapshots diverge for the
"sfmpfv44d0mig.eth" row (fields canonical_name/canonicalName and type/id
mismatch); re-run both the SQL and SDK queries from the same database state,
ensure the same ordering key (use __canonicalNamePrefix in both examples or
explicitly sort by canonical_name) and then update the two result snapshots so
the type and id for "sfmpfv44d0mig.eth" match (or add a short note explaining
that tied names may yield different domain versions); update the result arrays
(result in SQL block and result in SDK block) to be identical after re-capture.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 743b3c13-bdbf-4902-9e63-34fb17a09917

📥 Commits

Reviewing files that changed from the base of the PR and between 66e5135 and 8b2ce94.

📒 Files selected for processing (15)
  • docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts
  • docs/ensnode.io/src/components/molecules/unigraph-static-example/UnigraphStaticExample.astro
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-events.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/expiring-registrations.mdx
  • docs/ensnode.io/src/data/unigraph-examples/account-domains.ts
  • docs/ensnode.io/src/data/unigraph-examples/domain-by-name.ts
  • docs/ensnode.io/src/data/unigraph-examples/domain-events.ts
  • docs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.ts
  • docs/ensnode.io/src/data/unigraph-examples/expiring-registrations.ts
  • docs/ensnode.io/src/data/unigraph-examples/indexing-status.ts
  • docs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts
  • docs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.ts
  • docs/ensnode.io/src/data/unigraph-examples/types.ts
  • docs/ensnode.io/src/data/unigraph-examples/utils.ts

Comment thread docs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.ts Outdated
Comment thread docs/ensnode.io/src/data/unigraph-examples/account-domains.ts Outdated
Comment thread docs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.ts Outdated
Comment thread docs/ensnode.io/src/data/unigraph-examples/types.ts
Comment thread docs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.ts Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 23 out of 23 changed files in this pull request and generated 3 comments.

Comment thread docs/ensnode.io/src/data/unigraph-examples/account-domains.ts Outdated
Comment thread docs/ensnode.io/src/data/unigraph-examples/account-domains.ts Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts (1)

125-162: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Consider externalizing Unigraph example sidebar items for consistency.

The Omnigraph examples were refactored to use an imported constant OMNIGRAPH_EXAMPLES_SIDEBAR_ITEMS (line 102), but the Unigraph examples remain hardcoded inline. Applying the same pattern here would improve maintainability by centralizing sidebar item definitions.

♻️ Potential approach

Create a similar constant (e.g., UNIGRAPH_EXAMPLES_SIDEBAR_ITEMS) in the config module and import it here, matching the pattern already established for Omnigraph examples.

🤖 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 `@docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts`
around lines 125 - 162, The Unigraph examples sidebar items are hardcoded;
create and export a constant named UNIGRAPH_EXAMPLES_SIDEBAR_ITEMS in the same
config module where OMNIGRAPH_EXAMPLES_SIDEBAR_ITEMS lives (matching its shape),
import UNIGRAPH_EXAMPLES_SIDEBAR_ITEMS into integrate.ts, and replace the inline
items array under the Unigraph section with that imported constant so the
sidebar items are centralized and consistent with
OMNIGRAPH_EXAMPLES_SIDEBAR_ITEMS.
🤖 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 `@docs/ensnode.io/src/styles/starlight.css`:
- Around line 922-932: Remove the blank line before the transition declaration
in the .static-example p a rule so the transition: text-underline-offset 0.2s
ease-in-out; appears immediately after text-underline-offset: 4px; (i.e., edit
the CSS block for selector ".static-example p a" and delete the empty line above
the transition declaration to satisfy the declaration-empty-line-before rule).

---

Outside diff comments:
In `@docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts`:
- Around line 125-162: The Unigraph examples sidebar items are hardcoded; create
and export a constant named UNIGRAPH_EXAMPLES_SIDEBAR_ITEMS in the same config
module where OMNIGRAPH_EXAMPLES_SIDEBAR_ITEMS lives (matching its shape), import
UNIGRAPH_EXAMPLES_SIDEBAR_ITEMS into integrate.ts, and replace the inline items
array under the Unigraph section with that imported constant so the sidebar
items are centralized and consistent with OMNIGRAPH_EXAMPLES_SIDEBAR_ITEMS.
🪄 Autofix (Beta)

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: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: b6675c1d-fa17-4de1-8120-48457a7a3928

📥 Commits

Reviewing files that changed from the base of the PR and between 8b2ce94 and 77ab8dc.

📒 Files selected for processing (9)
  • docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.ts
  • docs/ensnode.io/src/content/docs/docs/integrate/index.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-events.mdx
  • docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/indexing-status.mdx
  • docs/ensnode.io/src/data/unigraph-examples/account-domains.ts
  • docs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.ts
  • docs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.ts
  • docs/ensnode.io/src/data/unigraph-examples/utils.ts
  • docs/ensnode.io/src/styles/starlight.css

Comment thread docs/ensnode.io/src/styles/starlight.css
Comment thread docs/ensnode.io/src/data/unigraph-examples/account-domains.ts Outdated
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.

2 participants