Add relationship-options read primitive + serverAction op#636
Conversation
Adds getRelationshipOptions(context, config, relatedListKey, { search?,
take?, selectedIds? }) — a bounded, projected { id, label }[] fetch for
relationship editors. It uses a scalar-only fragment (id + resolved label
field) so buildIncludeWithAccessControl's depth-5 auto-include never runs,
filters via `contains` on the label field when it's text, orders by that
field, and always unions currently-selected ids beyond the take/search
window. Exposed through a new `relationshipOptions` op on
context.serverAction so hosts have one wiring point and one access
boundary. Re-exported from @opensaas/stack-ui for server components that
already hold a context.
Closes #630
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeeiV2U73LJyS8MEZHcWE8
🦋 Changeset detectedLatest commit: 0f715da The changes in this PR will be included in the next version bump. This PR includes changesets to release 9 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Self-reviewOverview Adds Correctness
Code quality / conventions
Test coverage
Risks
No changes requested. Generated by Claude Code |
Coverage Report for Core Package Coverage (./packages/core)
File Coverage
|
||||||||||||||||||||||||||||||||||||||
Coverage Report for UI Package Coverage (./packages/ui)
File CoverageNo changed files found. |
Coverage Report for CLI Package Coverage (./packages/cli)
File CoverageNo changed files found. |
Coverage Report for Auth Package Coverage (./packages/auth)
File CoverageNo changed files found. |
Coverage Report for Storage Package Coverage (./packages/storage)
File CoverageNo changed files found. |
Coverage Report for RAG Package Coverage (./packages/rag)
File CoverageNo changed files found. |
Coverage Report for Storage S3 Package Coverage (./packages/storage-s3)
File CoverageNo changed files found. |
Coverage Report for Storage Vercel Package Coverage (./packages/storage-vercel)
File CoverageNo changed files found. |
Summary
getRelationshipOptions(context, config, relatedListKey, { search?, take?, selectedIds? })in@opensaas/stack-core(packages/core/src/query/relationship-options.ts) — a bounded, projected{ id, label }[]read primitive for relationship editors.{ id: true, [labelField]: true }, label field fromgetLabelFieldName) and reads viarunQuery/the existingcontext.db.*fragment path, sobuildIncludeWithAccessControl's depth-5 auto-include never runs for this fetch.where:containson the label field when it's a text field; otherwise no filter (first-N).orderBy: label field ascending.take: bounded window (default 50).{ id: { in: selectedIds } }query so the caller can render the current value even when it falls outside the search/takewindow.getItemLabel. Related-listqueryaccess denial still applies (falls through to[]).relationshipOptionsop oncontext.serverAction({ listKey, action: 'relationshipOptions', field, search?, take?, selectedIds? }) that resolves the field'srefto the related list and calls the primitive — one wiring point, one access boundary.getRelationshipOptionsfrom@opensaas/stack-uifor server components that already hold a context (e.g. alongsideprepareItemForm). No UI consumers change in this slice, per the issue.@opensaas/stack-core+@opensaas/stack-ui: minor).Test plan
getRelationshipOptions(packages/core/src/query/relationship-options.test.ts): scalar-only fragment / no nested include,takebound, searchcontains+ orderBy on a text label field, no filter on a non-text label field, selected-id union beyond the window, no re-query when already in window,[]on denied access,[]for an unknown related list.serverActionintegration tests (packages/core/tests/context.test.ts): options via the op,takebound, selected-id union,[]data on related-list access denial, error on a non-relationship / missing field.stack-uire-export test (packages/ui/tests/lib/getRelationshipOptions.test.ts).pnpm lint,pnpm manypkg fix,pnpm formatpnpm build(all 11 packages)core,ui,auth,cli,rag,storage,storage-s3,storage-vercel— all greenCloses #630
Generated by Claude Code