-
Notifications
You must be signed in to change notification settings - Fork 1.8k
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
Can't resolve graphl file when using Webpack 5 (and nextjs) #3272
Comments
strangely, a workaround is to remove |
Hey @outerlook, did you manage to solve? I do have the same stack, and noticed that it only happens on Windows environments on Unix it works just fine. I will try the work around you suggested |
The real culprit seems to be here: https://github.com/relay-tools/relay-compiler-language-typescript#typescript Relay compiler requires module to be set to "es2015" in compilerOptions of tsconfig, however next automatically, sets it to "esnext". I am yet to find a workaround. |
@vgedzius any luck?? |
I run into the same issue:
Not sure where that error is coming from but at least I found the reason why the path doesn't start with relay/packages/babel-plugin-relay/compileGraphQLTag.js Lines 236 to 237 in 521ca91
Apparently that was fine in Webpack 4 but not in Webpack 5? If the error comes from Webpack that is. By the way forcing a At least you can tell Webpack 5 to prefer relative; in the case of NextJS: // next.config.js
module.exports = {
webpack: config => {
config.resolve.preferRelative = true
return config
},
} |
I confirm that for us also in Windows we see this error (except with It seems related to the If we "patch" the code (by replacing the slashes) in the following line to make it POSIX ... then it works everywhere, independently of the settings in
return relativeReference + joinPath(relative, fileToRequire).replace(/\\/g, '/'); @alloy @kassens Do you have some idea to define if it a problem of this plugin or next in the chain? (for example some change in webpack API between v4 and v5 regarding normalisation of the paths) See: Tobias' comment https://blog.johnnyreilly.com/2021/04/20/ts-loader-goes-webpack-5/
But what about |
|
@sokra Do you think that this should be fixed in the relay plugin? Why before in v4 this code that it is 2 years old was passing? |
@jstejada @josephsavona I am of the same opinion than @sokra above and I caught in this because our Windows users started to complain while other users on mac or server in linux has not detected any problem. Advise: if you want to use |
If someone experience this problem, might be interested to use this plugin that I did, just add it to your
...
plugins: [
['babel-plugin-relay', { ... }],
['./pathNormaliser'],
...
],
...
'use strict';
const replacer = (filepath) => filepath.replace(/\\/g, '/');
/**
* Normalise path to POSIX (only for `win32` using `require`).
*/
const PathNormaliserPlugin = function (api) {
if (process.platform === 'win32') {
const t = api.types;
return {
name: 'path-normaliser',
visitor: {
CallExpression: {
enter: function (nodePath) {
const callee = nodePath.get('callee');
if (callee.isIdentifier() && callee.equals('name', 'require')) {
const arg = nodePath.get('arguments.0');
if (arg && arg.isStringLiteral()) {
const sourcePath = arg.node.value;
const targetPath = replacer(sourcePath);
if (sourcePath !== targetPath) {
arg.replaceWith(t.stringLiteral(targetPath));
}
}
}
},
},
},
};
}
return {
name: 'path-normaliser',
};
};
module.exports = PathNormaliserPlugin; |
@alunyov Could you please advice how to proceed? is FB team fix ongoing? or should we PR? |
Thank you! |
@JUNKYASS you shouldn't change directly file compileGraphQLTag.js. It will reset after reinstall. You should follow this comment instead |
Yes, you're right. |
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. |
@alunyov This happens even with v13 since the code has not changed in the involved lines mentioned above: I do appreciate the advise of @sokra that confirms the bug: This is just affecting non posix (Windows) and the required fix it is just a few characters long, should I create a PR for this or are you thinking to apply a different solution? For example, in place of a regex replacement, a more resilient solution will be to use
|
@artola I like that way. What's a problem with using this solution? |
Does any have a repo working that uses Relay 13, Webpack 5 and typescript? There is a bunch of module resolution errors that I am unable resolve. Thanks! |
Hey, if you're stuck with this issue, please try to use patch-package to apply the fix. diff --git a/node_modules/babel-plugin-relay/lib/compileGraphQLTag.js b/node_modules/babel-plugin-relay/lib/compileGraphQLTag.js
index 39a21e6..928c8de 100644
--- a/node_modules/babel-plugin-relay/lib/compileGraphQLTag.js
+++ b/node_modules/babel-plugin-relay/lib/compileGraphQLTag.js
@@ -14,7 +14,7 @@ var crypto = require('crypto');
var _require = require('graphql'),
print = _require.print;
-var _require2 = require('path'),
+var _require2 = require('path/posix'),
dirname = _require2.dirname,
joinPath = _require2.join,
relativePath = _require2.relative, |
@artola I checked usage of |
is this fixed? |
If someone needs it, here's a plugin that replaces the slashes, now updated to support 'use strict';
/**
* Normalise path to POSIX (only for `win32`).
*/
const PathNormaliserPlugin = function (api) {
if (process.platform === 'win32') {
const t = api.types;
const normalizePath = (pathNode) => {
if (pathNode && pathNode.isStringLiteral()) {
const sourcePath = pathNode.node.value;
const targetPath = sourcePath.replace(/\\/g, '/');
if (sourcePath !== targetPath) {
pathNode.replaceWith(t.stringLiteral(targetPath));
}
}
};
return {
name: 'path-normaliser',
visitor: {
CallExpression: {
enter(nodePath) {
const callee = nodePath.get('callee');
if (callee.isIdentifier({name: 'require'})) {
normalizePath(nodePath.get('arguments.0'));
}
},
},
ImportDeclaration: {
enter(nodePath) {
normalizePath(nodePath.get('source'));
},
},
},
};
}
return {
name: 'path-normaliser',
};
};
module.exports = PathNormaliserPlugin; |
The above plugin is a workaround; a proper fix is on the way with PR #4544. |
Hi.
Using:
everything runs fine.
But when I upgrade to webpack 5, which is supported by nextjs I get the following error while starting development server or building:
Module not found: Can't resolve '..\..\__generated__\relay\someMutation.graphql'
this is the graphql file added by babel relay plugin.
I've been trying to debug and understand better babel's work but I confess I do not have much knowledge to debug it further by myself.
babel.config.json
Note that I use babel plugin macros for tailwind's macro, not relay plugin macro. Although I tried using it and I got the same error too...
My generated files are indeed correctly generated at
'.src/__generated__/relay'
It does work with webpack 4, and not with webpack 5.
I appreciate any help to try debugging it, I didn't find any public repo that uses typescript, relay and webpack 5, that's why I'm not sure I'm the one doing something wrong.
The text was updated successfully, but these errors were encountered: