forked from codesandbox/codesandbox-client
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathraw-react-component-error.js
More file actions
67 lines (59 loc) · 1.71 KB
/
raw-react-component-error.js
File metadata and controls
67 lines (59 loc) · 1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { actions, dispatch } from 'codesandbox-api';
import { basename } from '@codesandbox/common/lib/utils/path';
function findRawModule(module) {
const rawModule = Array.from(module.dependencies).find(
m => !/\.([\w]{2}|[\w]{3})$/.test(m.module.path)
);
if (rawModule) {
return [module, rawModule];
}
// The error is thrown at the root, so we check for children components
return Array.from(module.dependencies).reduce((foundResult, m) => {
// We already found it, immediately return
if (foundResult) return foundResult;
return findRawModule(m);
}, null);
}
/**
* This transformer detects raw imports used as React component, when the module
* is missing a file extension
*
* @export
* @param {Error} error
* @param {any} module
* @returns
*/
export default function(error: Error, module) {
if (
error.message.includes(
"Failed to execute 'createElement' on 'Document': The tag name provided "
)
) {
const result = findRawModule(module);
if (result) {
const [sourceModule, rawModule] = result;
return {
name: 'Raw import',
message: `It seems like '${basename(
sourceModule.module.path
)}' is importing a raw module (${basename(rawModule.module.path)})`,
suggestions: [
{
title: `Rename ${basename(rawModule.module.path)} to ${basename(
rawModule.module.path
)}.js`,
action: () => {
dispatch(
actions.source.modules.rename(
rawModule.module.path,
`${basename(rawModule.module.path)}.js`
)
);
},
},
],
};
}
}
return null;
}