docs: extend ENS Unigraph examples#2264
Conversation
|
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
📝 WalkthroughWalkthroughCentralizes 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. ChangesUnigraph Example Documentation System
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested labels
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
Greptile SummaryThis PR extends the ENS Unigraph documentation by refactoring example code into dedicated TypeScript data files and adding six new example pages covering domain events, fuzzy search, subdomains, latest registrations, expiring registrations, and account domains.
Confidence Score: 4/5Safe to merge after fixing a broken SQL snippet in the account-domains example. The account-domains SQL code snippet contains a stray semicolon after the ORDER BY clause that terminates the query before LIMIT 10 — anyone copying this snippet will get a syntax error. All other example files look correct and previously reported issues have been addressed. docs/ensnode.io/src/data/unigraph-examples/account-domains.ts — the SQL codeSnippet has a stray semicolon that breaks the LIMIT clause. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
MDX["*.mdx page"] -->|imports| DATA["src/data/unigraph-examples/*.ts\n(codeSnippet + result + resultNote)"]
MDX -->|renders| COMP["UnigraphStaticExample.astro"]
DATA -->|sql / sdk props| COMP
COMP -->|SQL tab| SQL_TAB["SQL code + SqlResultTable\n+ StaticExampleNote (set:html)"]
COMP -->|SDK tab| SDK_TAB["SDK code + SqlResultTable\n+ StaticExampleNote (set:html)"]
DATA --> UTILS["utils.ts\noutputSource()"]
UTILS -->|HTML anchor string| DATA
Reviews (5): Last reviewed commit: "Improve ENS Unigraph examples" | Re-trigger Greptile |
There was a problem hiding this comment.
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/CodeExampletype contract and added multiple new Unigraph example data files (SQL +ensdb-sdksnippets + 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.
There was a problem hiding this comment.
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
📒 Files selected for processing (20)
docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.tsdocs/ensnode.io/src/components/molecules/EnsDbReaderIntro.astrodocs/ensnode.io/src/content/docs/docs/integrate/index.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-by-name.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-events.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domains-fuzzy-search-by-name.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/expiring-registrations.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/indexing-status.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/latest-registrations.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/subdomains-by-parent-name.mdxdocs/ensnode.io/src/data/unigraph-examples/account-domains.tsdocs/ensnode.io/src/data/unigraph-examples/domain-by-name.tsdocs/ensnode.io/src/data/unigraph-examples/domain-events.tsdocs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.tsdocs/ensnode.io/src/data/unigraph-examples/expiring-registrations.tsdocs/ensnode.io/src/data/unigraph-examples/indexing-status.tsdocs/ensnode.io/src/data/unigraph-examples/latest-registrations.tsdocs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.tsdocs/ensnode.io/src/data/unigraph-examples/types.ts
66e5135 to
2b41753
Compare
There was a problem hiding this comment.
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 winAlign SDK field selection with the SQL example.
The SQL snippet (lines 8-17) selects
grace_period,base, andpremiumfrom 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, andpremiumin 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
📒 Files selected for processing (11)
apps/ensapi/src/handlers/api/router.tsapps/ensapi/src/handlers/api/test/test-queries-api.tsdocs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.tsdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-by-name.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-events.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/expiring-registrations.mdxdocs/ensnode.io/src/data/unigraph-examples/account-domains.tsdocs/ensnode.io/src/data/unigraph-examples/expiring-registrations.tsdocs/ensnode.io/src/data/unigraph-examples/indexing-status.tsdocs/ensnode.io/src/data/unigraph-examples/latest-registrations.ts
| app.get("/permissions", async (c) => { | ||
| const user = c.req.query("user") || "0xd8da6bf26964af9d7eed9e03e53415d37aa96045"; | ||
| const { ensDb, ensIndexerSchema } = di.context; | ||
|
|
||
| // RAW SQL | ||
| const sqlResult = await ensDb.execute(sql` | ||
| SELECT pu.id, pu.chain_id, pu.address as contract_address, | ||
| pu.resource, pu.roles | ||
| FROM ${ensIndexerSchema.permissionsUser} pu | ||
| WHERE pu.user = ${user} | ||
| ORDER BY pu.chain_id, pu.address, pu.resource | ||
| `); | ||
|
|
||
| // DRIZZLE | ||
| const drizzleResult = await ensDb | ||
| .select({ | ||
| id: ensIndexerSchema.permissionsUser.id, | ||
| chainId: ensIndexerSchema.permissionsUser.chainId, | ||
| contractAddress: ensIndexerSchema.permissionsUser.address, | ||
| resource: ensIndexerSchema.permissionsUser.resource, | ||
| roles: ensIndexerSchema.permissionsUser.roles, | ||
| }) | ||
| .from(ensIndexerSchema.permissionsUser) | ||
| .where(sql`${ensIndexerSchema.permissionsUser.user} = ${user}`) | ||
| .orderBy( | ||
| asc(ensIndexerSchema.permissionsUser.chainId), | ||
| asc(ensIndexerSchema.permissionsUser.address), | ||
| asc(ensIndexerSchema.permissionsUser.resource), | ||
| ); | ||
|
|
||
| return jsonBigInt({ user, sql: sqlResult, drizzle: drizzleResult }); | ||
| }); |
There was a problem hiding this comment.
Fix inconsistent response format; add input validation and error handling.
Multiple issues:
-
Inconsistent response format: Line 388 returns
sqlResultinstead ofsqlResult.rows. All other endpoints return.rowsto extract the result array. This inconsistency could confuse API consumers. -
Missing input validation: Use Zod schemas with
validate()middleware to validateuserparameter as per coding guidelines. -
No error handling: Wrap database queries in try-catch and use
errorResponsehelper.
🔧 Proposed fix for response format
- return jsonBigInt({ user, sql: sqlResult, drizzle: drizzleResult });
+ return jsonBigInt({ user, sql: sqlResult.rows, drizzle: drizzleResult });As per coding guidelines for apps/ensapi/**/*.ts files: validation middleware and errorResponse helper should be used.
🤖 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 `@apps/ensapi/src/handlers/api/test/test-queries-api.ts` around lines 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.
There was a problem hiding this comment.
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 valueConsider aligning SQL and SDK field selections for consistency.
The SQL example selects
grace_period,base, andpremium(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 winFix 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 valueMinor 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_namevs__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
📒 Files selected for processing (15)
docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.tsdocs/ensnode.io/src/components/molecules/unigraph-static-example/UnigraphStaticExample.astrodocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-events.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/expiring-registrations.mdxdocs/ensnode.io/src/data/unigraph-examples/account-domains.tsdocs/ensnode.io/src/data/unigraph-examples/domain-by-name.tsdocs/ensnode.io/src/data/unigraph-examples/domain-events.tsdocs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.tsdocs/ensnode.io/src/data/unigraph-examples/expiring-registrations.tsdocs/ensnode.io/src/data/unigraph-examples/indexing-status.tsdocs/ensnode.io/src/data/unigraph-examples/latest-registrations.tsdocs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.tsdocs/ensnode.io/src/data/unigraph-examples/types.tsdocs/ensnode.io/src/data/unigraph-examples/utils.ts
| FROM "ensindexer_0".domains d | ||
| WHERE d.canonical = true | ||
| AND d.owner_id = '0xffffffffff52d316b7bd028358089bc8066b8f80' | ||
| ORDER BY d.__canonical_name_prefix ASC; |
| <SqlResultTable rows={sql.result} /> | ||
|
|
||
| <StaticExampleNote class="px-5 pb-5">{sql.resultNote ?? defaultResultNote}</StaticExampleNote> | ||
| <StaticExampleNote class="px-5 pb-5" set:html={sql.resultNote ?? defaultResultNote} /> |
| <StaticExampleNote class="px-5 pb-5"> | ||
| {ensDbSdk.resultNote ?? defaultResultNote} | ||
| </StaticExampleNote> | ||
| <StaticExampleNote class="px-5 pb-5" set:html={ensDbSdk.resultNote ?? defaultResultNote} /> |
There was a problem hiding this comment.
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 winConsider 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
📒 Files selected for processing (9)
docs/ensnode.io/config/integrations/starlight/sidebar-topics/integrate.tsdocs/ensnode.io/src/content/docs/docs/integrate/index.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-events.mdxdocs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/indexing-status.mdxdocs/ensnode.io/src/data/unigraph-examples/account-domains.tsdocs/ensnode.io/src/data/unigraph-examples/domains-fuzzy-search-by-name.tsdocs/ensnode.io/src/data/unigraph-examples/subdomains-by-parent-name.tsdocs/ensnode.io/src/data/unigraph-examples/utils.tsdocs/ensnode.io/src/styles/starlight.css
| .static-example p a { | ||
| color: var(--sl-color-text-accent); | ||
| text-decoration: underline; | ||
| text-underline-offset: 4px; | ||
|
|
||
| transition: text-underline-offset 0.2s ease-in-out; | ||
|
|
||
| &:hover { | ||
| text-underline-offset: 2px; | ||
| } | ||
| } |
There was a problem hiding this comment.
Remove empty line before declaration.
Stylelint flags an empty line (926) before the transition declaration (927), which violates the declaration-empty-line-before rule.
🎨 Proposed fix
.static-example p a {
color: var(--sl-color-text-accent);
text-decoration: underline;
text-underline-offset: 4px;
-
transition: text-underline-offset 0.2s ease-in-out;
&:hover {
text-underline-offset: 2px;
}
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| .static-example p a { | |
| color: var(--sl-color-text-accent); | |
| text-decoration: underline; | |
| text-underline-offset: 4px; | |
| transition: text-underline-offset 0.2s ease-in-out; | |
| &:hover { | |
| text-underline-offset: 2px; | |
| } | |
| } | |
| .static-example p a { | |
| color: var(--sl-color-text-accent); | |
| text-decoration: underline; | |
| text-underline-offset: 4px; | |
| transition: text-underline-offset 0.2s ease-in-out; | |
| &:hover { | |
| text-underline-offset: 2px; | |
| } | |
| } |
🧰 Tools
🪛 Stylelint (17.12.0)
[error] 927-927: Expected no empty line before declaration (declaration-empty-line-before)
(declaration-empty-line-before)
🤖 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/styles/starlight.css` around lines 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).
Source: Linters/SAST tools
Lite PR
Tip: Review docs on the ENSNode PR process
Summary
Why
Testing
Notes for Reviewer (Optional)
Pre-Review Checklist (Blocking)