fix(graphile-schema): replace deepmerge with native preset composition to fix stack overflow - #900
Merged
Conversation
deepmerge recursively clones the entire PostGraphile preset tree and pg Pool objects inside pgServices, which overflows the call stack. Use Graphile's native `extends` mechanism to compose presets instead. This preserves object identity and avoids cloning non-serializable objects like database connection pools. Fixes: Maximum call stack size exceeded during SDL generation
Contributor
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
4 tasks
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.
Summary
buildSchemaSDLuseddeepmergeto combine the base Graphile preset with caller-provided options.deepmergerecursively clones every nested object — including the pgPool(EventEmitter internals) and the entire PostGraphile preset tree — which overflows the call stack ("Maximum call stack size exceeded") whenever anygraphileoption is passed, even{}.The fix replaces
deepmergewith Graphile's nativeextendsmechanism to compose presets, and removesdeepmergeas a dependency.Before:
After:
Review & Testing Checklist for Human
extends/pluginsinopts.graphile. The olddeepmergeforwarded all keys; the new code only forwardsextendsandplugins. If any call site passes e.g.disablePlugins,gather,schema, or other preset properties, they'll be silently dropped. Grep forbuildSchemaSDLacrossconstructive-dbandconstructive-hub.graphile-schemato confirm all 7 API schema generations succeed end-to-end.pnpm-lock.yamldiff is only reformatting +deepmergeremoval (no unintended dependency changes).Notes
buildSchemaSDL({ database, schemas, graphile: {} })overflows; without thegraphilekey it succeeds. Confirmed the fix resolves all test cases (0 node types through 52 node types).deepmerge.Link to Devin session: https://app.devin.ai/sessions/6c7e6bf137a34786827fc77a43a7a84a
Requested by: @pyramation