Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,16 @@
* @oncall react_native
*/

import type {Dependency} from 'metro/private/ModuleGraph/worker/collectDependencies';

Check warning on line 12 in packages/metro-transform-plugins/src/__tests__/import-export-plugin-test.js

View workflow job for this annotation

GitHub Actions / Type check, lint, smoke test

Requires should be sorted alphabetically, with at least one line between imports/requires and code

import collectDependencies from 'metro/private/ModuleGraph/worker/collectDependencies';

const {compare, transformToAst} = require('../__mocks__/test-helpers');
const importExportPlugin = require('../import-export-plugin');
const generate = require('@babel/generator').default;
// $FlowFixMe[untyped-import] @babel/code-frame
const {codeFrameColumns} = require('@babel/code-frame');
const vm = require('vm');

const opts = {
importAll: '_$$_IMPORT_ALL',
Expand Down Expand Up @@ -156,8 +158,8 @@

var _foo = require('bar').foo;
var _baz = require('bar').baz;
exports.default = _foo;
exports.baz = _baz;
exports.default = _foo;
`;

compare([importExportPlugin], code, expected, opts);
Expand Down Expand Up @@ -233,8 +235,8 @@
exports.bar = 'bar';
module.exports.baz = 'baz';
class _default {}
exports.default = _default;
exports.foo = foo;
exports.default = _default;
`;

compare([importExportPlugin], code, expected, opts);
Expand Down Expand Up @@ -360,6 +362,69 @@
`);
});

test('places export all above explicit exports', () => {
const code = `
export * from 'foo';
export {baz} from 'bar';
const bax = 'bax';
export default bax;
`;

const expected = `
Object.defineProperty(exports, '__esModule', {value: true});

var _baz = require('bar').baz;
const bax = 'bax';

var _default = bax;

var _foo = require("foo");

for (var _key in _foo) {
exports[_key] = _foo[_key];
}

exports.baz = _baz;
exports.default = _default;
`;

compare([importExportPlugin], code, expected, opts);
});

test('explicit exports override export all at runtime', () => {
const transformedCode = generate(
transformToAst(
[importExportPlugin],
`
export * from 'foo';
export const overridden = 'explicit named';
export default 'explicit default';
`,
opts,
),
).code;
const context = {
exports: {} as {[string]: unknown},
require: (id: string) => {
if (id !== 'foo') {
throw new Error(`Unexpected module: ${id}`);
}
return {
default: 'star default',
overridden: 'star named',
sourceOnly: 'source only',
};
},
};

vm.runInNewContext(transformedCode, context);

expect(context.exports.__esModule).toBe(true);
expect(context.exports.default).toBe('explicit default');
expect(context.exports.overridden).toBe('explicit named');
expect(context.exports.sourceOnly).toBe('source only');
});

test('enables module exporting when something is exported', () => {
const code = `
foo();
Expand Down
28 changes: 14 additions & 14 deletions packages/metro-transform-plugins/src/import-export-plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -522,20 +522,6 @@ export default function importExportPlugin({
body.unshift(e.node);
});

state.exportDefault.forEach(
(e: {local: string, loc: ?SourceLocation, ...}) => {
body.push(
withLocation(
exportTemplate({
LOCAL: t.identifier(e.local),
REMOTE: t.identifier('default'),
}),
e.loc,
),
);
},
);

state.exportAll.forEach(
(e: {file: string, loc: ?SourceLocation, ...}) => {
body.push(
Expand Down Expand Up @@ -569,6 +555,20 @@ export default function importExportPlugin({
},
);

state.exportDefault.forEach(
(e: {local: string, loc: ?SourceLocation, ...}) => {
body.push(
withLocation(
exportTemplate({
LOCAL: t.identifier(e.local),
REMOTE: t.identifier('default'),
}),
e.loc,
),
);
},
);

if (
state.exportDefault.length ||
state.exportAll.length ||
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ Object {
"arrayRest": Array [
"export-destructuring: ARRAY_REST",
],
"exportStarDefault": "export-star-overrides: DEFAULT",
"exportStarOverridden": "export-star-overrides: OVERRIDDEN",
"exportStarSourceOnly": "export-star-source: SOURCE_ONLY",
"foo": "export-null: FOO",
"importStar": Object {
"default": "export-2: DEFAULT",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,15 @@ test('builds a simple bundle', async () => {
]);
expect(object.extraData.namespaceReExportDefault).toBe('export-2: DEFAULT');
expect(object.extraData.namespaceReExportFoo).toBe('export-2: FOO');
expect(object.extraData.exportStarDefault).toBe(
'export-star-overrides: DEFAULT',
);
expect(object.extraData.exportStarOverridden).toBe(
'export-star-overrides: OVERRIDDEN',
);
expect(object.extraData.exportStarSourceOnly).toBe(
'export-star-source: SOURCE_ONLY',
);
expect(object).toMatchSnapshot();
expect(cjs).toEqual(expect.objectContaining(cjs.default));

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
* @flow strict
*/

'use strict';

export * from './export-star-source';

export const overridden = 'export-star-overrides: OVERRIDDEN';

export default 'export-star-overrides: DEFAULT';
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
* @flow strict
*/

'use strict';

export default 'export-star-source: DEFAULT';

export const overridden = 'export-star-source: OVERRIDDEN';

export const sourceOnly = 'export-star-source: SOURCE_ONLY';
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ import {foo} from './export-null';
import primitiveDefault, {
foo as primitiveFoo,
} from './export-primitive-default';
import exportStarDefault, {
overridden as exportStarOverridden,
sourceOnly as exportStarSourceOnly,
} from './export-star-overrides';

declare var require: RequireWithUnstableImportMaybeSync;

Expand All @@ -34,6 +38,9 @@ export {foo as default} from './export-4';
export const extraData = {
arrayFirst,
arrayRest,
exportStarDefault,
exportStarOverridden,
exportStarSourceOnly,
foo,
importStar,
myDefault,
Expand Down
Loading