Path: blob/main/tests/src/rules/export.js
829 views
import { test, testFilePath, SYNTAX_CASES, getTSParsers, testVersion } from '../utils';12import { RuleTester } from 'eslint';3import eslintPkg from 'eslint/package.json';4import semver from 'semver';56const ruleTester = new RuleTester();7const rule = require('rules/export');89ruleTester.run('export', rule, {10valid: [].concat(11test({ code: 'import "./malformed.js"' }),1213// default14test({ code: 'var foo = "foo"; export default foo;' }),15test({ code: 'export var foo = "foo"; export var bar = "bar";' }),16test({ code: 'export var foo = "foo", bar = "bar";' }),17test({ code: 'export var { foo, bar } = object;' }),18test({ code: 'export var [ foo, bar ] = array;' }),19test({ code: 'let foo; export { foo, foo as bar }' }),20test({ code: 'let bar; export { bar }; export * from "./export-all"' }),21test({ code: 'export * from "./export-all"' }),22test({ code: 'export * from "./does-not-exist"' }),2324// #328: "export * from" does not export a default25test({ code: 'export default foo; export * from "./bar"' }),2627...SYNTAX_CASES,2829test({30code: `31import * as A from './named-export-collision/a';32import * as B from './named-export-collision/b';3334export { A, B };35`,36}),37testVersion('>= 6', () => ({38code: `39export * as A from './named-export-collision/a';40export * as B from './named-export-collision/b';41`,42parserOptions: {43ecmaVersion: 2020,44},45})) || [],46),4748invalid: [49// multiple defaults50// test({51// code: 'export default foo; export default bar',52// errors: ['Multiple default exports.', 'Multiple default exports.'],53// }),54// test({55// code: 'export default function foo() {}; ' +56// 'export default function bar() {}',57// errors: ['Multiple default exports.', 'Multiple default exports.'],58// }),5960// test({61// code: 'export function foo() {}; ' +62// 'export { bar as foo }',63// errors: ['Parsing error: Duplicate export \'foo\''],64// }),65// test({66// code: 'export {foo}; export {foo};',67// errors: ['Parsing error: Duplicate export \'foo\''],68// }),69// test({70// code: 'export {foo}; export {bar as foo};',71// errors: ['Parsing error: Duplicate export \'foo\''],72// }),73// test({74// code: 'export var foo = "foo"; export var foo = "bar";',75// errors: ['Parsing error: Duplicate export \'foo\''],76// }),77// test({78// code: 'export var foo = "foo", foo = "bar";',79// errors: ['Parsing error: Duplicate export \'foo\''],80// }),81test({82code: 'let foo; export { foo }; export * from "./export-all"',83errors: ['Multiple exports of name \'foo\'.',84'Multiple exports of name \'foo\'.'],85}),86// test({ code: 'export * from "./default-export"'87// , errors: [{ message: 'No named exports found in module ' +88// '\'./default-export\'.'89// , type: 'Literal' }] }),9091// note: Espree bump to Acorn 4+ changed this test's error message.92// `npm up` first if it's failing.93test({94code: 'export * from "./malformed.js"',95errors: [{96message: "Parse errors in imported module './malformed.js': 'return' outside of function (1:1)",97type: 'Literal',98}],99}),100101// test({102// code: 'export var { foo, bar } = object; export var foo = "bar"',103// errors: ['Parsing error: Duplicate export \'foo\''],104// }),105// test({106// code: 'export var { bar: { foo } } = object; export var foo = "bar"',107// errors: ['Parsing error: Duplicate export \'foo\''],108// }),109// test({110// code: 'export var [ foo, bar ] = array; export var bar = "baz"',111// errors: ['Parsing error: Duplicate export \'bar\''],112// }),113// test({114// code: 'export var [ foo, /*sparse*/, { bar } ] = array; export var bar = "baz"',115// errors: ['Parsing error: Duplicate export \'bar\''],116// }),117118119// #328: "export * from" does not export a default120test({121code: 'export * from "./default-export"',122errors: [`No named exports found in module './default-export'.`],123}),124],125});126127128context('TypeScript', function () {129getTSParsers().forEach((parser) => {130const parserConfig = {131parser,132settings: {133'import/parsers': { [parser]: ['.ts'] },134'import/resolver': { 'eslint-import-resolver-typescript': true },135},136};137138ruleTester.run('export', rule, {139valid: [140// type/value name clash141test(Object.assign({142code: `143export const Foo = 1;144export type Foo = number;145`,146}, parserConfig)),147test(Object.assign({148code: `149export const Foo = 1;150export interface Foo {}151`,152}, parserConfig)),153154test(Object.assign({155code: `156export function fff(a: string);157export function fff(a: number);158`,159}, parserConfig)),160161test(Object.assign({162code: `163export function fff(a: string);164export function fff(a: number);165export function fff(a: string|number) {};166`,167}, parserConfig)),168169// namespace170test(Object.assign({171code: `172export const Bar = 1;173export namespace Foo {174export const Bar = 1;175}176`,177}, parserConfig)),178test(Object.assign({179code: `180export type Bar = string;181export namespace Foo {182export type Bar = string;183}184`,185}, parserConfig)),186test(Object.assign({187code: `188export const Bar = 1;189export type Bar = string;190export namespace Foo {191export const Bar = 1;192export type Bar = string;193}194`,195}, parserConfig)),196test(Object.assign({197code: `198export namespace Foo {199export const Foo = 1;200export namespace Bar {201export const Foo = 2;202}203export namespace Baz {204export const Foo = 3;205}206}207`,208}, parserConfig)),209test(Object.assign({210code: 'export * from "./file1.ts"',211filename: testFilePath('typescript-d-ts/file-2.ts'),212}, parserConfig)),213214...(semver.satisfies(eslintPkg.version, '< 6') ? [] : [215test({216code: `217export * as A from './named-export-collision/a';218export * as B from './named-export-collision/b';219`,220parser,221}),222]),223224// Exports in ambient modules225test(Object.assign({226code: `227declare module "a" {228const Foo = 1;229export {Foo as default};230}231declare module "b" {232const Bar = 2;233export {Bar as default};234}235`,236}, parserConfig)),237test(Object.assign({238code: `239declare module "a" {240const Foo = 1;241export {Foo as default};242}243const Bar = 2;244export {Bar as default};245`,246}, parserConfig)),247248...(semver.satisfies(process.version, '< 8') && semver.satisfies(eslintPkg.version, '< 6') ? [] : test({249...parserConfig,250code: `251export * from './module';252`,253filename: testFilePath('export-star-4/index.js'),254settings: {255...parserConfig.settings,256'import/extensions': ['.js', '.ts', '.jsx'],257},258})),259],260invalid: [261// type/value name clash262test(Object.assign({263code: `264export type Foo = string;265export type Foo = number;266`,267errors: [268{269message: `Multiple exports of name 'Foo'.`,270line: 2,271},272{273message: `Multiple exports of name 'Foo'.`,274line: 3,275},276],277}, parserConfig)),278279// namespace280test(Object.assign({281code: `282export const a = 1283export namespace Foo {284export const a = 2;285export const a = 3;286}287`,288errors: [289{290message: `Multiple exports of name 'a'.`,291line: 4,292},293{294message: `Multiple exports of name 'a'.`,295line: 5,296},297],298}, parserConfig)),299test(Object.assign({300code: `301declare module 'foo' {302const Foo = 1;303export default Foo;304export default Foo;305}306`,307errors: [308{309message: 'Multiple default exports.',310line: 4,311},312{313message: 'Multiple default exports.',314line: 5,315},316],317}, parserConfig)),318test(Object.assign({319code: `320export namespace Foo {321export namespace Bar {322export const Foo = 1;323export const Foo = 2;324}325export namespace Baz {326export const Bar = 3;327export const Bar = 4;328}329}330`,331errors: [332{333message: `Multiple exports of name 'Foo'.`,334line: 4,335},336{337message: `Multiple exports of name 'Foo'.`,338line: 5,339},340{341message: `Multiple exports of name 'Bar'.`,342line: 8,343},344{345message: `Multiple exports of name 'Bar'.`,346line: 9,347},348],349}, parserConfig)),350351// Exports in ambient modules352test(Object.assign({353code: `354declare module "a" {355const Foo = 1;356export {Foo as default};357}358const Bar = 2;359export {Bar as default};360const Baz = 3;361export {Baz as default};362`,363errors: [364{365message: 'Multiple default exports.',366line: 7,367},368{369message: 'Multiple default exports.',370line: 9,371},372],373}, parserConfig)),374],375});376});377});378379380