-
-
Notifications
You must be signed in to change notification settings - Fork 26.9k
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
BUG MITIGATION: .mjs should not resolve before .js files #4085
Conversation
Hmm, is this a new problem (as in did these modules just now start shipping |
Yes, some graphql packages just started releasing node-esm ready modules to npm for support with node v9's Node has a new module resolution strategy which will resolve to a However this conflicts with Since Jest wraps the |
This seems like an easy fix. We should get this into |
From my understanding, this problem most likely arises because imports are happening without specifying file extension. When Jest loads a package, we look at the In a normal scenario, These files would respectively import Given this reasoning, I'd go as far to say that this isn't the fix we want -- we can release this in a 1.x.y release for compatibility reasons, but I'm against porting this to I'd like to know how Node handles this, given an import specifying just We definitely need to figure this out for the 2.0 release. @leebyron can you retarget this PR to the |
Give me a moment to change the base - I can't do that from the github UI without wreaking havoc. Before I do that, let me try to answer some of your questions.
Node handles this by never attempting to load a
I definitely agree - this is a mitigation. I would argue that This mitigation is specifically handling the case where both Tools like Webpack and Rollup should be doing the opposite - looking for
Yes, and |
Support for .mjs files added in facebook#3239 did not account for npm libraries which ship native mjs files alongside js files. This accounts for this by ensuring .js files resolve before their accompanying .mjs file. Note that this is not an ideal end state since selecting a .mjs over a .js extension should be the result of whether `import` was used instead of `require()` in a node environment with native ESM support (currently via `--experimental-modules`). Instead, this change just *always* selects a .js extension before the .mjs extension if it exists. This unbreaks support for using GraphQL (relay, apollo, etc) within create-react-app projects.
I'm trying to figure whose court the ball is in to handle this (for 2.0). I could see arguments for us doing something complex, I could also see arguments for Jest to handle this. It's almost as if we need a |
I like the idea of a separate |
Just checked this out and Webpack does look for |
Running into this issue: graphql/graphql-js#1248. Need to wait for this PR to get merged: facebook/create-react-app#4085.
* Upgrade frontend dependencies Major changes: - react 16 => 16.2 - mapbox-gl-style-spec 9 => 11 - react-apollo 1 => 2 - required some code changes to the middleware and import path to gql - https://www.apollographql.com/docs/react/2.0-migration.html - react-mapbox-gl 2 => 3 - required some changes to the layerOptions prop - https://github.com/alex3165/react-mapbox-gl/releases/tag/v3.1.0 #143 * Remove unused dependencies and peer dependency * Downgrade graphql to avoid test bug Running into this issue: graphql/graphql-js#1248. Need to wait for this PR to get merged: facebook/create-react-app#4085. * Cleanup
This also killed mjs efforts for the Apollo ecosystem 😢 |
We don't want to rush these changes out since there's not a ton of +1s. Let me reiterate -- this is completely solvable in user land in the mean time (which shouldn't be long). Source files just need to be updated to explicitly import their |
@Timer so you are saying that if Is that in the lib or in user code? |
To be clear this cannot be mitigated in user land. This blocks using the most recent version of GraphQL.js along with create react app. The critical issue is loading files from node_modules, where it is not clear how to rewrite This problem is made worse within cross dependencies. Projects like Apollo and Relay shouldn’t be forced to change their imports to |
I definitely support coming up with the right long term plan, which probably incorporates adding support for native ESM to jest, however in the meantime I still would love to see this merged and released as soon as possible since it’s a low impact bug fix that unblocks using CRA with the graphql ecosystem |
This definitely sounds bad. Is this only broken when running tests via Create React App? Is it only the Jest config that needs to be updated or is there also an issue with our webpack config? |
@leebyron Please release this. |
To clarify, Lee just reported and sent a fix for this issue, we're the ones who should release it |
Out in 1.1.2. |
(Sorry it took me a long time) |
Support for .mjs files added in facebook#3239 did not account for npm libraries which ship native mjs files alongside js files. This accounts for this by ensuring .js files resolve before their accompanying .mjs file. Note that this is not an ideal end state since selecting a .mjs over a .js extension should be the result of whether `import` was used instead of `require()` in a node environment with native ESM support (currently via `--experimental-modules`). Instead, this change just *always* selects a .js extension before the .mjs extension if it exists. This unbreaks support for using GraphQL (relay, apollo, etc) within create-react-app projects.
3: Update dependency flow-bin to v0.70.0 r=mythmon a=renovate[bot] This Pull Request updates dependency [flow-bin](https://github.com/flowtype/flow-bin) from `v0.66.0` to `v0.70.0` <details> <summary>Commits</summary> #### v0.67.1 - [`4255e2d`](flow/flow-bin@4255e2d) v0.67.1 #### v0.68.0 - [`aea9bb5`](flow/flow-bin@aea9bb5) v0.68.0 #### v0.69.0 - [`b8a5da6`](flow/flow-bin@b8a5da6) v0.69.0 #### v0.70.0 - [`0b0bcea`](flow/flow-bin@0b0bcea) v0.70.0 </details> --- This PR has been generated by [Renovate Bot](https://renovateapp.com). 4: Update dependency react-scripts to v1.1.4 r=mythmon a=renovate[bot] This Pull Request updates dependency [react-scripts](https://github.com/facebookincubator/create-react-app) from `v1.1.1` to `v1.1.4` <details> <summary>Release Notes</summary> ### [`v1.1.2`](https://github.com/facebookincubator/create-react-app/blob/master/CHANGELOG.md#​112-April-3-2018) ##### 🐛 Bug Fix * `react-scripts` * [#​4085](`https://github.com/facebook/create-react-app/pull/4085`) Resolve `.js` before `.mjs` files to unbreak dependencies with native ESM support. ([@​leebyron]) ##### 📝 Documentation * `react-scripts` * [#​4197](`https://github.com/facebook/create-react-app/pull/4197`) Add troubleshooting for Github Pages. ([@​xnt]) ##### Committers: 2 - Lee Byron ([leebyron]) - Vicente Plata ([xnt]) ##### Migrating from 1.1.1 to 1.1.2 Inside any created project that has not been ejected, run: ``` npm install --save --save-exact react-scripts@​1.1.2 ``` or ``` yarn add --exact react-scripts@​1.1.2 ``` --- ### [`v1.1.3`](https://github.com/facebookincubator/create-react-app/blob/master/CHANGELOG.md#​113-April-3-2018) ##### 🐛 Bug Fix * `react-scripts` * [#​4247](`https://github.com/facebook/create-react-app/pull/4247`) Fix `environment.dispose is not a function` error caused by a Jest bug. ([@​gaearon]) ##### Committers: 1 - Dan Abramov ([gaearon]) ##### Migrating from 1.1.2 to 1.1.3 Inside any created project that has not been ejected, run: ``` npm install --save --save-exact react-scripts@​1.1.3 ``` or ``` yarn add --exact react-scripts@​1.1.3 ``` --- ### [`v1.1.4`](https://github.com/facebookincubator/create-react-app/blob/master/CHANGELOG.md#​114-April-3-2018) ##### 🐛 Bug Fix * `react-dev-utils` * [#​4250](`https://github.com/facebook/create-react-app/pull/4250`) Upgrade `detect-port-alt` to fix [#​4189](`https://github.com/facebook/create-react-app/issues/4189`). ([@​Timer]) ##### Committers: 1 - Joe Haddad ([Timer]) ##### Migrating from 1.1.3 to 1.1.4 Inside any created project that has not been ejected, run: ``` npm install --save --save-exact react-scripts@​1.1.4 ``` or ``` yarn add --exact react-scripts@​1.1.4 ``` --- </details> <details> <summary>Commits</summary> #### v1.1.2 - [`058d03f`](facebook/create-react-app@058d03f) Fix typos in example monorepo documentation. (#​4164) - [`1922f4d`](facebook/create-react-app@1922f4d) Allow ModuleScopePlugin accecpts an array as its appSrc (#​4138) - [`33f1294`](facebook/create-react-app@33f1294) Revert "Change no-unused-vars 'args' from none to all to show warning on destructured objects" - [`8a34b7c`](facebook/create-react-app@8a34b7c) Add ESLint check for incorrect propTypes usage (#​3840) (#​4048) - [`8db5e33`](facebook/create-react-app@8db5e33) Revert lint-related changes made in #​4193 (#​4211) - [`06dd17e`](facebook/create-react-app@06dd17e) add `create-react-app --help` info for local file path `--scripts-version` support (#​4015) - [`9c167a4`](facebook/create-react-app@9c167a4) Add some stuff that requires transpilation. (#​4174) - [`da518d2`](facebook/create-react-app@da518d2) Fix floating caret position incorrect while scrolling overlay (#​4024) - [`2824bf2`](facebook/create-react-app@2824bf2) [next] Revert to use ecma 5 in uglifyOptions (#​4234) - [`9a99b5d`](facebook/create-react-app@9a99b5d) Fix typo and be clearer about `ecma` settings in uglifyjs options (#​4239) - [`9c3f03c`](facebook/create-react-app@9c3f03c) use the lastest url of gitignore file (#​4236) #### v1.1.3 - [`061d1e4`](facebook/create-react-app@061d1e4) Add troubleshooting for Github Pages (#​4197) - [`2e690e9`](facebook/create-react-app@2e690e9) Add 1.1.2 changelog (#​4242) #### v1.1.4 - [`3b102fe`](facebook/create-react-app@3b102fe) Work around Jest environment resolving bug (#​4247) - [`90c908e`](facebook/create-react-app@90c908e) Changelog for 1.1.3 - [`2762924`](facebook/create-react-app@2762924) Update detect-port-alt </details> --- This PR has been generated by [Renovate Bot](https://renovateapp.com). Co-authored-by: Renovate Bot <bot@renovateapp.com>
So, in the end, this didn't target |
That's correct. This fix is really just a hack. We're hoping that Jest and webpack will properly support |
Is there a way of getting this fix into |
We have no plans of merging this into 2.0 unless it's the last remaining blocker for a 2.0-final release. |
I think it would be a mistake to regress on this bug in CRA v2
I don't know that I would agree with this characterization. This PR was a bug fix against CRA for Jest and webpack's semi-hacky implementation of ESM. Jest and webpack will probably require extensive architectural changes requiring major version bumps to properly support native ESM. I wouldn't suggest holding your breath for that. If CRA v2 intends to ship with support for Jest and Webpack's current major version then it should include this bug fix. |
I agree with @leebyron here |
Support for .mjs files added in #3239 did not account for npm libraries which ship native mjs files alongside js files. This accounts for this by ensuring .js files resolve before their accompanying .mjs file. Note that this is not an ideal end state since selecting a .mjs over a .js extension should be the result of whether `import` was used instead of `require()` in a node environment with native ESM support (currently via `--experimental-modules`). Instead, this change just *always* selects a .js extension before the .mjs extension if it exists. This unbreaks support for using GraphQL (relay, apollo, etc) within create-react-app projects.
Support for .mjs files added in facebook#3239 did not account for npm libraries which ship native mjs files alongside js files. This accounts for this by ensuring .js files resolve before their accompanying .mjs file. Note that this is not an ideal end state since selecting a .mjs over a .js extension should be the result of whether `import` was used instead of `require()` in a node environment with native ESM support (currently via `--experimental-modules`). Instead, this change just *always* selects a .js extension before the .mjs extension if it exists. This unbreaks support for using GraphQL (relay, apollo, etc) within create-react-app projects.
* 'master' of https://github.com/facebook/create-react-app: (220 commits) Publish Changelog for 1.1.4 Update detect-port-alt (facebook#4250) Publish Changelog for 1.1.3 Work around Jest environment resolving bug (facebook#4247) Publish Add 1.1.2 changelog (facebook#4242) Add troubleshooting for Github Pages (facebook#4197) `.mjs` should not resolve before .js files (facebook#4085) Publish Revert "Set the public path to the asset manifest entries (facebook#2544)" Add 1.1.1 changelog Unpin and bump fsevents (for 1.x branch) (facebook#4006) Update dotenv-expand to fix bug with environment variables that contain a $. (facebook#4000) Update instructions for continuous delivery with Netlify (facebook#3971) Include `{json,css}` files in prettier command (facebook#3894) Set the public path to the asset manifest entries (facebook#2544) 1.5.1 pin envinfo version to 3.4.2 (facebook#3853) ... # Conflicts: # packages/react-scripts/config/webpack.config.prod.js # packages/react-scripts/package.json
Support for .mjs files added in facebook#3239 did not account for npm libraries which ship native mjs files alongside js files. This accounts for this by ensuring .js files resolve before their accompanying .mjs file. Note that this is not an ideal end state since selecting a .mjs over a .js extension should be the result of whether `import` was used instead of `require()` in a node environment with native ESM support (currently via `--experimental-modules`). Instead, this change just *always* selects a .js extension before the .mjs extension if it exists. This unbreaks support for using GraphQL (relay, apollo, etc) within create-react-app projects.
Support for .mjs files added in facebook#3239 did not account for npm libraries which ship native mjs files alongside js files. This accounts for this by ensuring .js files resolve before their accompanying .mjs file. Note that this is not an ideal end state since selecting a .mjs over a .js extension should be the result of whether `import` was used instead of `require()` in a node environment with native ESM support (currently via `--experimental-modules`). Instead, this change just *always* selects a .js extension before the .mjs extension if it exists. This unbreaks support for using GraphQL (relay, apollo, etc) within create-react-app projects.
…4318) Support for .mjs files added in facebook#3239 did not account for npm libraries which ship native mjs files alongside js files. This accounts for this by ensuring .js files resolve before their accompanying .mjs file. Note that this is not an ideal end state since selecting a .mjs over a .js extension should be the result of whether `import` was used instead of `require()` in a node environment with native ESM support (currently via `--experimental-modules`). Instead, this change just *always* selects a .js extension before the .mjs extension if it exists. This unbreaks support for using GraphQL (relay, apollo, etc) within create-react-app projects.
Support for .mjs files added in #3239 did not account for npm libraries which ship native mjs files alongside js files. This accounts for this by ensuring .js files resolve before their accompanying .mjs file. Note that this is not an ideal end state since selecting a .mjs over a .js extension should be the result of whether
import
was used instead ofrequire()
in a node environment with native ESM support (currently via--experimental-modules
). Instead, this change just always selects a .js extension before the .mjs extension if it exists.This unbreaks support for using GraphQL (relay, apollo, etc) within create-react-app projects.