react-imported-component
Version:
I will import your component, and help to handle it
124 lines (123 loc) • 5.72 kB
JavaScript
import { dirname } from 'path';
import { remapImports } from '../scanForImports';
import { getRelative } from '../shared';
describe('scanForImports', () => {
const rel = dirname(__dirname);
const root = '.';
const rootRel = '.' + process.cwd();
const sourceFile = `${rel}/a`;
it('should map simple import', () => {
const imports = {};
remapImports([{ file: `${rel}/a`, content: 'blabla;import("./b.js"); blabla;' }], rel, rel, getRelative, imports, () => true);
expect(Object.values(imports)).toEqual([`[() => import('./b.js'), '', './b.js', false] /* from ./a */`]);
});
it('handles imports in jsdoc', () => {
const imports = {};
remapImports([
{
file: sourceFile,
content: `
/**
* @type {import('wrong-import')}
*/
import(/* comment:valuable */ "./a.js");
import("./b.js");
// import('another-wrong-import');// FIXME: temporary removed
`,
},
], rel, rel, getRelative, imports, () => true);
expect(Object.values(imports)).toEqual([
`[() => import(/* comment:valuable */'./a.js'), '', './a.js', false] /* from ./a */`,
`[() => import('./b.js'), '', './b.js', false] /* from ./a */`,
]);
});
it('should map client-side import', () => {
const imports = {};
remapImports([{ file: sourceFile, content: 'blabla;import(/* client-side */"./a.js"); blabla;' }], rel, rel, getRelative, imports, () => true);
expect(Object.values(imports)).toEqual([
`[() => import(/* client-side */'./a.js'), '', './a.js', true] /* from ./a */`,
]);
});
it('should map simple import with a comment', () => {
const imports = {};
remapImports([{ file: sourceFile, content: 'blabla;import(/* comment:42 */"./a.js"); blabla;' }], rel, rel, getRelative, imports, () => true);
expect(Object.values(imports)).toEqual([
`[() => import(/* comment:42 */'./a.js'), '', './a.js', false] /* from ./a */`,
]);
});
it('should map complex import', () => {
const imports = {};
remapImports([
{
file: sourceFile,
content: 'blabla;import(/* webpack: "123" */"./a.js"); blabla; import(/* webpack: 123 */ \'./b.js\');',
},
], rel, rel, getRelative, imports, () => true);
expect(Object.values(imports)).toEqual([
`[() => import(/* webpack: \"123\" */'./a.js'), '', './a.js', false] /* from ./a */`,
`[() => import(/* webpack: 123 */'./b.js'), '', './b.js', false] /* from ./a */`,
]);
});
it('should match chunk name', () => {
const imports = {};
remapImports([
{
file: 'a',
content: 'blabla;import(/* webpackChunkName: "chunk-a" */"./a.js"); blabla; import(/* webpack: 123 */ \'./b.js\');',
},
], root, root, (a, b) => a + b, imports, () => true);
expect(Object.values(imports)).toEqual([
`[() => import(/* webpackChunkName: "chunk-a" */'${rootRel}/a.js'), 'chunk-a', '${rootRel}/a.js', false] /* from .a */`,
`[() => import(/* webpack: 123 */'${rootRel}/b.js'), '', '${rootRel}/b.js', false] /* from .a */`,
]);
});
it('should override chunk name', () => {
const imports = {};
remapImports([
{
file: 'a',
content: 'blabla;import(/* webpackChunkName: "chunk-a" */"./a.js"); blabla; import(/* webpackChunkName: "chunk-b" */"./b.js"); import(/* webpackChunkName: "chunk-c" */"./c.js");',
},
], root, root, (a, b) => a + b, imports, (imported) => imported.indexOf('c.js') < 0, (imported, _, options) => (imported.indexOf('a.js') > 0 ? `test-${options.chunkName}-test` : 'bundle-b'));
expect(Object.values(imports)).toEqual([
`[() => import(/* webpackChunkName: \"chunk-a\" */'${rootRel}/a.js'), 'test-chunk-a-test', '${rootRel}/a.js', false] /* from .a */`,
`[() => import(/* webpackChunkName: \"chunk-b\" */'${rootRel}/b.js'), 'bundle-b', '${rootRel}/b.js', false] /* from .a */`,
]);
});
it('should match support multiline imports', () => {
const imports = {};
remapImports([
{
file: 'a',
content: `
blabla;import(
/* webpackChunkName: "chunk-a" */
"./a.js"
);
something else
import(
// ts-ignore
"./b.js"
);
`,
},
], root, root, (a, b) => a + b, imports, () => true);
expect(Object.values(imports)).toEqual([
`[() => import(/* webpackChunkName: \"chunk-a\" */'${rootRel}/a.js'), 'chunk-a', '${rootRel}/a.js', false] /* from .a */`,
`[() => import('${rootRel}/b.js'), '', '${rootRel}/b.js', false] /* from .a */`,
]);
});
it('should remove webpackPrefetch and webpackPreload', () => {
const imports = {};
remapImports([
{
file: 'a',
content: 'blabla;import(/* webpackPrefetch: true *//* webpack: "123" */"./a.js"); blabla; import(/* webpackPreload: true */ \'./b.js\');',
},
], root, root, (a, b) => a + b, imports, () => true);
expect(Object.values(imports)).toEqual([
`[() => import(/* *//* webpack: \"123\" */'${rootRel}/a.js'), '', '${rootRel}/a.js', false] /* from .a */`,
`[() => import(/* */'${rootRel}/b.js'), '', '${rootRel}/b.js', false] /* from .a */`,
]);
});
});