Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GraphiQL broken in production. Duplicate "graphql" modules. #58

Closed
a-barbieri opened this issue Nov 22, 2018 · 38 comments
Closed

GraphiQL broken in production. Duplicate "graphql" modules. #58

a-barbieri opened this issue Nov 22, 2018 · 38 comments

Comments

@a-barbieri
Copy link

We are using graphiql-rails as a dependency on one our gems.

From version 1.5 the graphiql page is broken. I can confirm that 1.4.11 along with graphql 1.8.10 works.

The error is present only in production environment. Development works. Might be something that happens during the assets precompile process.

Bug

Accessing GraphiQL page I see only the loading... message and get this error:

Uncaught Error: Cannot use t "__Schema" from another module or realm.

Ensure that there is only one instance of "graphql" in the node_modules
directory. If different versions of "graphql" are the dependencies of other
relied on modules, use "resolutions" to ensure only one version is installed.

https://yarnpkg.com/en/docs/selective-version-resolutions

Duplicate "graphql" modules cannot be used at the same time since different
versions may have different capabilities and behavior. The data from one
version used in the function from another could produce confusing and
spurious results.

Which then create a second obvious error:

Uncaught ReferenceError: GraphiQL is not defined
@gregology
Copy link
Contributor

I'm also having this issue. The error is not occurring in development, only in production.

gem 'graphql',                      '~> 1.8.11'
gem 'graphiql-rails',               '~> 1.5.0'

@zeroedin
Copy link

Having the same issue, staging env, not production, but similar as in not a development env.

graphql (1.8.11)
graphiql-rails (1.5.0)

@denisahearn
Copy link

We also started having this issue in our staging environment once we upgraded to:

graphql (1.8.11)
graphiql-rails (1.5.0)

@marckohlbrugge
Copy link

Same problem, using these gems:

graphql (1.8.11)
graphiql-rails (1.5.0)

@eric-khoury
Copy link

Same issue here:

Using graphql 1.8.13
Using graphiql-rails 1.5.0

@wadewinningham
Copy link

I have this issue, but it's in development.

graphiql-rails (1.6.0)
graphql-pro (1.9.5)

Works with graphiql-rails 1.4.11, but I'm getting the error reported here in both 1.5.0 and 1.6.0.

@leechunhoe
Copy link

graphiql-rails 1.6.0, graphql 1.8.11 works okay in development, but shows following error when build production.

Uglifier::Error: In strict mode code, functions can only be declared at top level or immediately within another function.
/var/app/current/vendor/bundle/ruby/2.5.0/gems/uglifier-4.1.20/lib/uglifier.rb:234:in `parse_result'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/uglifier-4.1.20/lib/uglifier.rb:216:in `run_uglifyjs'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/uglifier-4.1.20/lib/uglifier.rb:168:in `compile'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/uglifier_compressor.rb:53:in `call'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/uglifier_compressor.rb:28:in `call'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/processor_utils.rb:75:in `call_processor'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/processor_utils.rb:57:in `block in call_processors'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/processor_utils.rb:56:in `reverse_each'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/processor_utils.rb:56:in `call_processors'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/loader.rb:134:in `load_from_unloaded'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/loader.rb:60:in `block in load'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/loader.rb:317:in `fetch_asset_from_dependency_cache'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/loader.rb:44:in `load'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/cached_environment.rb:20:in `block in initialize'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/cached_environment.rb:47:in `load'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/base.rb:66:in `find_asset'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/base.rb:73:in `find_all_linked_assets'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/manifest.rb:142:in `block in find'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/legacy.rb:114:in `block (2 levels) in logical_paths'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:228:in `block in stat_tree'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:212:in `block in stat_directory'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `each'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `stat_directory'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:227:in `stat_tree'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:231:in `block in stat_tree'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:212:in `block in stat_directory'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `each'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `stat_directory'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:227:in `stat_tree'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:231:in `block in stat_tree'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:212:in `block in stat_directory'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `each'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `stat_directory'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:227:in `stat_tree'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/legacy.rb:105:in `each'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/legacy.rb:105:in `block in logical_paths'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/legacy.rb:104:in `each'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/legacy.rb:104:in `logical_paths'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/manifest.rb:140:in `find'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/sprockets/manifest.rb:186:in `compile'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-rails-3.2.1/lib/sprockets/rails/task.rb:68:in `block (3 levels) in define'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-3.7.2/lib/rake/sprocketstask.rb:147:in `with_logger'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/sprockets-rails-3.2.1/lib/sprockets/rails/task.rb:67:in `block (2 levels) in define'
/var/app/current/vendor/bundle/ruby/2.5.0/gems/rake-12.3.2/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:30:in `block in <main>'
/usr/local/bin/bundle:22:in `<main>'
Tasks: TOP => assets:precompile
(See full trace by running task with --trace)

@mortik
Copy link

mortik commented Jan 29, 2019

@leechunhoe you need to update your production environment and set your js_compressor like this:

config.assets.js_compressor = Uglifier.new(harmony: true)

Don't forget to require 'uglifier'

Concerning the Topic:
1.6.x is still causing the initial mentioned Bug in Production for me.

@gregology
Copy link
Contributor

Forgive my ignorance but will updating to production React fix this issue?

@mortik
Copy link

mortik commented Jan 29, 2019

No this fixes only the issue @leechunhoe posted

@gregology
Copy link
Contributor

gregology commented Jan 29, 2019

Sorry @mortik, I was referring to PR #61, not the updates to production environment you suggested above. I'd try it out but I don't have a production app that I can risk breaking atm :(

@mortik
Copy link

mortik commented Jan 29, 2019

Ah no problem i only read the notification mail which did not include the link ^^

@leechunhoe
Copy link

Thank you @mortik, the errors fixed. Though graphiql still won't load on production.

@mortik
Copy link

mortik commented Jan 30, 2019

yeah sadly still need to set 'graphiql-rails', '~> 1.4.11'

@gregology
Copy link
Contributor

gregology commented Jan 31, 2019

It looks like #61 has fixed the issue. 1.7.0 now works for me 👍

gem 'graphql',                      '~> 1.8.13'
gem 'graphiql-rails',               '~> 1.7.0'

@mortik
Copy link

mortik commented Feb 1, 2019

hmm upgraded to 1.7 did not change the error for me.

@gregology
Copy link
Contributor

gregology commented Feb 4, 2019

Yes, disregard, it was just a slow propagation issue. Sorry if anyone deployed. Back to 1.4.11

@gregology
Copy link
Contributor

gregology commented Feb 4, 2019

Is everyone with this issue running production on Google Cloud Platform?
👍 for yes 👎 for no
I'm not sure if GCP is respecting NODE_ENV: production from the app.yaml file when precompiling assets. I was following advice from howtographql/react-apollo#33 (comment)

@wadewinningham
Copy link

The update did not fix my issue either, but I'm not sure if graphql-pro is behind.

@isaacrowntree
Copy link

Still not fixed (not on GCP):

gem 'graphql', '~> 1.8.13'
gem 'graphql-client', '~> 0.14.0'
gem 'graphql-errors', '~> 0.3.0'
gem 'graphiql-rails', '~> 1.7'

@xiaocuixt
Copy link

xiaocuixt commented Feb 22, 2019

Just Worked with the old version 😭 :

    gem 'graphql', '~> 1.9.2'
    gem 'graphiql-rails', '~> 1.4.11'

@G-shuu
Copy link

G-shuu commented Mar 4, 2019

for me same issue

graphiql-rails (1.5.0)
graphql (1.8.13)

@saiidalhalawi
Copy link

The same issue has occurred on Heroku.

graphiql-rails (1.7.0)
graphql (1.9.3)

anandaroop added a commit to anandaroop/portfolio18 that referenced this issue Apr 20, 2019
GraphiQL web UI is not working on staging/production. Downgrading
should fix this.

rmosolgo/graphiql-rails#58
jamescmartinez added a commit to coffeecoffeecoffeecoffee/coffee that referenced this issue Apr 27, 2019
@davelooi
Copy link

davelooi commented May 6, 2019

This has been happening since Nov 2018.
Does anyone has a workaround for this? Other than locking to 1.4.

Is there a plan to fix this in the future? Anything we can do to help?

@mortik
Copy link

mortik commented May 6, 2019

We removed graphiql-rails from our Apps and are now using a html only version of the GraphiQL Playground from Prisma https://github.com/prisma/graphql-playground

The next step would be to use the React Component to build a customized Playground with Subscription support like you would get when you use Apollo Server or Absinthe from Elixir but in this case for Rails with ActionCable

@blevine
Copy link

blevine commented May 28, 2019

I am seeing the same issue. Anyone have a fix?

@eric-khoury
Copy link

@mortik In that case, have you tried Altair?
No integration within the app, just connect directly to any graphql endpoint, has subscriptions, etc.

@aperaham
Copy link

aperaham commented Jul 2, 2019

In my case, the issue involved Uglifier mangling variables in the javascript file. The following settings appear to work:

config.assets.js_compressor = Uglifier.new(harmony: true, mangle: false)

Make sure to update Uglifier to a version that supports the mangle option.

@jessecurry
Copy link

I'm experiencing this issue on Heroku and have been able to duplicate locally in production mode. Using mangle: false did not resolve my issue.

Is there a long term fix in the works?

@stanhu
Copy link

stanhu commented Sep 11, 2019

We just came across this in GitLab as well (https://gitlab.com/gitlab-org/gitlab-ce/issues/67293).

As described in graphql/graphql-js#1182 (comment):

So, as far as I can see the problem is that GraphQLScalarType and GraphQLObjectType constructors both get e as a shortcut during the minifying. And when graphql-js tries to compare them — condition is true and it throws an error.

Disabling name mangling in UglifyJsPlugin via mangle: false sounds like a possible workaround, but this may bloat the size of the JavaScript output.

graphql-js added a fix to disable this check when NODE_ENV is set to production (graphql/graphql-js#1174).

Normally, Webpack will set NODE_ENV properly and generate assets accordingly. However, if you are using Sprockets, NODE_ENV is never set to anything, so this check always gets hit if name mangling is in use.

Perhaps this gem is no longer needed now that Rails 5 defaults to Webpacker (https://github.com/rails/webpacker). For those of us not using Webpacker, I wonder if we can work around this by defining a NODE_ENV inside or patching the graphql-js code during asset compilation.

@mcelicalderon
Copy link

I did not try mangle: false, but problem persists on v1.7.0 using the harmony: true option on Uglifier. I just went ahead and downgraded to v1.4.11 of this gem as @a-barbieri originally pointed out that works. Kept harmony: true option

@marckohlbrugge
Copy link

Since the gem doesn't seem to maintained anymore, does anyone have successfully implemented graphiql using webpacker?

@yask123
Copy link

yask123 commented Nov 12, 2019

We stopped using this gem and just directly use graphiql-js library.

@duffyjp
Copy link

duffyjp commented Dec 30, 2019

@yask123 Can you give some pointers on how you did that? I'm in the same boat.

@nsikanikpoh
Copy link

nsikanikpoh commented Mar 10, 2020

Just Worked with the old version :

    gem 'graphql', '~> 1.9.2'
    gem 'graphiql-rails', '~> 1.4.11'

This works for me as well Thanks

@michaelbina
Copy link

For anyone else that gets here, the combination of

config.assets.js_compressor = Uglifier.new(harmony: true, mangle: false)

and

gem 'graphql'
gem 'graphiql-rails', '~> 1.5.0'

worked for me

@ogidow ogidow mentioned this issue Nov 26, 2020
@andrew-gregory-genedx
Copy link

gem 'graphql', ~> '1.11.4'
gem 'graphql-rails', ~> '1.4.11'

worked for me. gem 'graphql-rails', ~> '1.5.0' did not work.

I believe this root issue is also solved by this PR in graphql-js.

The error I was getting was the same, except e "__Schema", not t "__Schema".

@rmosolgo
Copy link
Owner

Hey everyone, I hope that upstream fixes and new configurations for the minifier worked alright. If anyone runs into this again, please open a new issue!

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

No branches or pull requests