utquidem
Version:
The meta-framework suite designed from scratch for frontend-focused modern web development.
277 lines (234 loc) • 5.84 kB
text/typescript
import {
commentDefaultExport,
commentNamedExport,
rewriteExports,
} from '../../src/utils/rewriteExports';
import { ignoreKeys } from '../../src/utils/parseExports';
describe('rewriteExports', () => {
it('should patch default null if missing', async done => {
const input = `
const a = 1;
`;
const actual = await rewriteExports(input);
expect(actual).toContain('export default null');
expect(actual).toContain(commentDefaultExport);
done();
});
it('should not patch default when reexport default from other module', async done => {
const input = `
export { default } from 'other';
`;
const actual = await rewriteExports(input);
expect(actual).toEqual(input);
done();
});
it('should patch default with all scope variables', async done => {
const input = `
export const a = 1;
export const b = () => {};
export function c() {};
`;
const actual = await rewriteExports(input);
expect(actual).toMatchInlineSnapshot(`
"
export const a = 1;
export const b = () => {};
export function c() {};
// ESMPACK PATCH DEFAULT EXPORT
export default {
a,
b,
c
}
"
`);
done();
});
it('should export default with reexport other module', async done => {
const input = `
export { a } from 'a';
export { a as b } from 'b';
export const c = 1;
`;
const actual = await rewriteExports(input);
// FIXME: should take reexport into account, but ignore for now
expect(actual).toMatchInlineSnapshot(`
"
export { a } from 'a';
export { a as b } from 'b';
export const c = 1;
// ESMPACK PATCH DEFAULT EXPORT
export default {
c
}
"
`);
done();
});
it('should patch named exports from default', async done => {
const input = `
function withSize() {}
withSize.SizeMe = SizeMe;
withSize.withSize = withSize;
var reactSizeme = withSize;
export default reactSizeme;
`;
const actual = await rewriteExports(input);
expect(actual).toMatchInlineSnapshot(`
"
function withSize() {}
withSize.SizeMe = SizeMe;
withSize.withSize = withSize;
var reactSizeme = withSize;
export default reactSizeme;
// ESMPACK PATCH NAMED EXPORTS
export {
withSize
}
// ESMPACK PATCH NAMED EXPORTS
export const SizeMe = reactSizeme.SizeMe;
"
`);
done();
});
it('should patch named exports from default with object assignemnt', async done => {
// objectProperty, objectMethod, spread
const input = `
var other = {
a: 'a',
};
var lib = {
name: 'lib',
parse() {},
...other,
};
export default lib;
`;
const actual = await rewriteExports(input);
expect(actual).toMatchInlineSnapshot(`
"
var other = {
a: 'a',
};
var lib = {
name: 'lib',
parse() {},
...other,
};
export default lib;
// ESMPACK PATCH NAMED EXPORTS
export const name = lib.name;
export const parse = lib.parse;
export const a = lib.a;
"
`);
done();
});
it('should not patch conflict named exports', async done => {
const input = `
const a = {};
a.foo = 'foo';
const b = a;
b.bar = 'bar';
export default a;
const _foo = 'f';
export { _foo as foo };
export const bar = 'bar';
`;
const actual = await rewriteExports(input);
expect(actual).not.toContain(commentNamedExport);
done();
});
it(`should patch named export from default, but ignore ${ignoreKeys.join(
', ',
)}`, async done => {
const input = `
const o = {};
const a = {};
${ignoreKeys.map(k => `a.${k} = ${JSON.stringify(k)};`).join('\n')}
a.__name__ = 'name';
export default a;
`;
const actual = await rewriteExports(input);
for (const key of ignoreKeys) {
expect(actual).not.toContain(`export const ${key} =`);
}
expect(actual).toContain('export const __name__ = a.__name__');
done();
});
it('should patch named export from default, but ignore reexport conflict name', async done => {
const input = `
export { s as foo } from 'other';
const a = {};
a.foo = 'foo';
export default a;
`;
const actual = await rewriteExports(input);
expect(actual).toMatchInlineSnapshot(`
"
export { s as foo } from 'other';
const a = {};
a.foo = 'foo';
export default a;
"
`);
done();
});
it('should patch named export from default, and export conflict local definition', async done => {
const input = `
const Item = () => {};
const Component = () => {};
Component.Item = Item;
export default Component;
`;
const actual = await rewriteExports(input);
expect(actual).toMatchInlineSnapshot(`
"
const Item = () => {};
const Component = () => {};
Component.Item = Item;
export default Component;
// ESMPACK PATCH NAMED EXPORTS
export {
Item
}
"
`);
done();
});
it('should only see module scope as conflict', async done => {
const input = `
function a() {
const Item = () => {};
}
const Component = () => {};
Component.Item = Item;
export default Component;
`;
const actual = await rewriteExports(input);
expect(actual).toMatchInlineSnapshot(`
"
function a() {
const Item = () => {};
}
const Component = () => {};
Component.Item = Item;
export default Component;
// ESMPACK PATCH NAMED EXPORTS
export const Item = Component.Item;
"
`);
done();
});
it('should not duplicate export', async done => {
const input = `
var react = {};
var Children = react.Children;
export default react;
export { Children };
`;
const actual = await rewriteExports(input);
expect(actual).toEqual(input);
done();
});
});