Version Packages - #883
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 4, 2026 10:14
5554286 to
6c0e771
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 4, 2026 10:21
6c0e771 to
151b1a7
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
2 times, most recently
from
August 4, 2026 11:17
ca348ed to
c630c79
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 4, 2026 11:59
c630c79 to
aa0a7c2
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 4, 2026 12:05
aa0a7c2 to
f985bce
Compare
borisno2
enabled auto-merge (squash)
August 4, 2026 12:07
Contributor
Author
Coverage Report for Core Package Coverage (./packages/core)
File CoverageNo changed files found. |
Contributor
Author
Coverage Report for UI Package Coverage (./packages/ui)
File CoverageNo changed files found. |
Contributor
Author
Coverage Report for CLI Package Coverage (./packages/cli)
File CoverageNo changed files found. |
Contributor
Author
Coverage Report for Auth Package Coverage (./packages/auth)
File CoverageNo changed files found. |
Contributor
Author
Coverage Report for Storage Package Coverage (./packages/storage)
File CoverageNo changed files found. |
Contributor
Author
Coverage Report for RAG Package Coverage (./packages/rag)
File CoverageNo changed files found. |
Contributor
Author
Coverage Report for Storage S3 Package Coverage (./packages/storage-s3)
File CoverageNo changed files found. |
Contributor
Author
Coverage Report for Storage Vercel Package Coverage (./packages/storage-vercel)
File CoverageNo changed files found. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@opensaas/stack-auth@0.38.0
Minor Changes
#888
8183827Thanks @borisno2! -buildBetterAuthOptions()andcreateAuth()now accept an optional third argument — your app'sbetterAuthPluginsarray, the same array passed toauthPlugin({ betterAuthPlugins })— so the returned options/Authtype carries the literal plugin tuple instead of the widenedBetterAuthOptions/Auth<BetterAuthOptions>. Without this,betterAuth()constructed from the widened return loses plugin-derivedauth.api.*endpoints (e.g.emailOTP()'ssignInEmailOTP) and acustomSession()plugin's replaced session shape.The supplied tuple is for typing only — the plugin array used at runtime is always the one resolved from
authPlugin({ betterAuthPlugins }). Passing a tuple that isn't the same plugin instances in the same order throws, naming the mismatch, so the two can't silently drift apart. Calling either function with no third argument is unchanged — same widened return type, same runtime options, fully backwards compatible.Also,
AuthConfig/NormalizedAuthConfig'sbetterAuthPluginsfield is now typed as better-auth's ownBetterAuthPlugin[]instead ofany[].#889
b9b9357Thanks @borisno2! - FixgetSessionFromAuthto projectsessionFieldsfrom the resolved better-auth session instead of only itsusersub-object. AcustomSessionplugin's replaced shape with nouserkey is now correctly treated as a signed-in session (never misreported as anonymous), and a session-only field (e.g. the admin plugin'simpersonatedBy) is now resolvable. Errors from the underlying session lookup now propagate instead of silently becomingnull, and asessionFieldsentry that can't be resolved is omitted and logs a warning (once per field, per process) instead of vanishing silently.The scaffolded
getSession()— the CLI feature generator'slib/auth.tstemplate, andexamples/starter-auth/examples/auth-demo— now call this single shared helper, readingsessionFieldsfrom the resolved config at runtime instead of baking a field list in at generation time.examples/auth-demo'sgetSession()also now correctly returnsnullfor an anonymous visitor (previously returned a truthy object ofundefinedvalues).@opensaas/stack-cli@0.38.0
Minor Changes
#889
b9b9357Thanks @borisno2! - FixgetSessionFromAuthto projectsessionFieldsfrom the resolved better-auth session instead of only itsusersub-object. AcustomSessionplugin's replaced shape with nouserkey is now correctly treated as a signed-in session (never misreported as anonymous), and a session-only field (e.g. the admin plugin'simpersonatedBy) is now resolvable. Errors from the underlying session lookup now propagate instead of silently becomingnull, and asessionFieldsentry that can't be resolved is omitted and logs a warning (once per field, per process) instead of vanishing silently.The scaffolded
getSession()— the CLI feature generator'slib/auth.tstemplate, andexamples/starter-auth/examples/auth-demo— now call this single shared helper, readingsessionFieldsfrom the resolved config at runtime instead of baking a field list in at generation time.examples/auth-demo'sgetSession()also now correctly returnsnullfor an anonymous visitor (previously returned a truthy object ofundefinedvalues).Patch Changes
b21d8b2,b21d8b2,17eb72f]:@opensaas/stack-core@0.38.0
Minor Changes
#873
b21d8b2Thanks @borisno2! - Naming a relation in anincludenow fetches only that relation's own columns and stops, at every level — not just the root. This completes ADR-0024 (a bare read fetches scalars, never relations): reaching a relation's own relations means naming them too, e.g.include: { author: { include: { organization: true } } }rather than relying oninclude: { author: true }to pullorganizationin automatically. A relation nobody named (callerinclude, fragmentquery, or a field'sneeds) never has its list's operation-levelqueryaccess evaluated at all.This is a silent break — detect it before you upgrade. An
includethat named a relation bare and read past it (item.<named>[0].<unnamed>) now getsundefinedfor the unnamed part, with no error. Grep your codebase forinclude: {calls whose consumers read a second hop off a bare-named relation, and add the deeper relation explicitly:AccessScopeDepthExceededError(thrown when anincludenames a relation pastREAD_INCLUDE_MAX_DEPTH) keeps its type, fields, and throw sites — only its message wording changed, from describing an inability to scope to describing a cost refusal, since the depth cap is now a cost limit rather than a security boundary (nothing walks the relationship graph unprompted anymore).#890
17eb72fThanks [@list({](https://github.com/list({)! - A computed field — any field carrying aresolveOutputhook, virtual or not — is now computed if and only if a read is actually going to return it. A fragmentquerythat selects three fields no longer runs everyresolveOutputon the list and discards the rest: an unselected field's field-level read access is never evaluated and its hook never runs. Its declared relations (needs, ADR-0025) are fetched under exactly the same condition, folded recursively at every nesting level — a nested fragment selecting a subset computes only that subset, while a nestedincludestill computes every computed field at that level, matching bare andinclude-based reads, which are unaffected: they still compute every computed field on the list, exactly as before. See ADR-0027.This is a silent break — detect it before you upgrade, the same way ADR-0024's and ADR-0026's were. Two independent behaviors changed with no thrown error:
itemnever carries another computed field's resolved output, on any read path. Previously a virtual field received the already-assembled, already-resolved object, so a virtual field could read an earlier-declared virtual (or any field carrying its ownresolveOutput, e.g. apassword()'s wrapper or a formatted display field) and see its resolved value — working only by declaration order, with reordering two fields silently changing the result. Now every computed field's hook sees only the row's stored columns and its own declared dependencies; reaching for a sibling that is itself computed finds nothing there (or its raw stored form, never the wrapped/resolved value), the same as reaching for a field that was never declared. Grep your config for aresolveOutputwhoseitemreads a field that is itself computed — virtual fields reading other virtual fields, or a hook reading a stored field that carries its ownresolveOutput(a password wrapper, a formatted date) — and recompute from the shared stored columns instead of relying on another field's hook having already run.resolveOutputhook running for a side effect (logging, cache warming) on every read regardless of a fragment's own field selection, that side effect now only fires when the fragment actually names the field. Grep for a fragmentquerythat intentionally omits a field whose hook you were relying on for a side effect, and select that field explicitly (or move the side effect to a hook that isn't projection-gated, e.g.afterOperation).A hookless virtual field (one with
access.readbut noresolveOutput) no longer has its read access evaluated at all on any read — such a field can never produce output, so under this rule it does no work at all.Patch Changes
b21d8b2Thanks @borisno2! - Fixneedsdeclarations being dropped beneath a caller-named relation that revisits a list (e.g.include: { author: { include: { posts: true } } }, or a self-referentialparent), which left the revisited list's computed fields resolving overundefined.@opensaas/stack-rag@0.38.0
@opensaas/stack-storage@0.38.0
@opensaas/stack-storage-s3@0.38.0
@opensaas/stack-storage-vercel@0.38.0
@opensaas/stack-tiptap@0.38.0
@opensaas/stack-ui@0.38.0