@@ -50,6 +50,12 @@ describe('utils', () => {
5050 'module.exports = createESLintRule({ create() {}, meta: {} });' ,
5151 'module.exports = util.createRule({ create() {}, meta: {} });' ,
5252 'module.exports = ESLintUtils.RuleCreator(docsUrl)({ create() {}, meta: {} });' ,
53+
54+ // Named export of a rule, only supported in ESM within this plugin
55+ 'module.exports.rule = { create: function() {} };' ,
56+ 'exports.rule = { create: function() {} };' ,
57+ 'const rule = { create: function() {} }; module.exports.rule = rule;' ,
58+ 'const rule = { create: function() {} }; exports.rule = rule;' ,
5359 ] . forEach ( ( noRuleCase ) => {
5460 it ( `returns null for ${ noRuleCase } ` , ( ) => {
5561 const ast = espree . parse ( noRuleCase , { ecmaVersion : 8 , range : true } ) ;
@@ -65,15 +71,11 @@ describe('utils', () => {
6571 describe ( 'the file does not have a valid rule (ESM)' , ( ) => {
6672 [
6773 '' ,
68- 'export const foo = { create() {} }' ,
6974 'export default { foo: {} }' ,
7075 'const foo = {}; export default foo' ,
7176 'const foo = 123; export default foo' ,
7277 'const foo = function(){}; export default foo' ,
7378
74- // Exports function but not default export.
75- 'export function foo (context) { return {}; }' ,
76-
7779 // Exports function but no object return inside function.
7880 'export default function (context) { }' ,
7981 'export default function (context) { return; }' ,
@@ -209,13 +211,46 @@ describe('utils', () => {
209211 meta : { type : 'ObjectExpression' } ,
210212 isNewStyle : true ,
211213 } ,
214+ // No helper, exported variable.
215+ 'export const rule = { create() {}, meta: {} };' : {
216+ create : { type : 'FunctionExpression' } ,
217+ meta : { type : 'ObjectExpression' } ,
218+ isNewStyle : true ,
219+ } ,
212220 // no helper, variable with type.
213221 'const rule: Rule.RuleModule = { create() {}, meta: {} }; export default rule;' :
214222 {
215223 create : { type : 'FunctionExpression' } ,
216224 meta : { type : 'ObjectExpression' } ,
217225 isNewStyle : true ,
218226 } ,
227+ // no helper, exported variable with type.
228+ 'export const rule: Rule.RuleModule = { create() {}, meta: {} };' : {
229+ create : { type : 'FunctionExpression' } ,
230+ meta : { type : 'ObjectExpression' } ,
231+ isNewStyle : true ,
232+ } ,
233+ // no helper, exported reference with type.
234+ 'const rule: Rule.RuleModule = { create() {}, meta: {} }; export {rule};' :
235+ {
236+ create : { type : 'FunctionExpression' } ,
237+ meta : { type : 'ObjectExpression' } ,
238+ isNewStyle : true ,
239+ } ,
240+ // no helper, exported aliased reference with type.
241+ 'const foo: Rule.RuleModule = { create() {}, meta: {} }; export {foo as rule};' :
242+ {
243+ create : { type : 'FunctionExpression' } ,
244+ meta : { type : 'ObjectExpression' } ,
245+ isNewStyle : true ,
246+ } ,
247+ // no helper, exported variable with type in multiple declarations
248+ 'export const foo = 5, rule: Rule.RuleModule = { create() {}, meta: {} };' :
249+ {
250+ create : { type : 'FunctionExpression' } ,
251+ meta : { type : 'ObjectExpression' } ,
252+ isNewStyle : true ,
253+ } ,
219254 // No helper, variable, `export =` syntax.
220255 'const rule = { create() {}, meta: {} }; export = rule;' : {
221256 create : { type : 'FunctionExpression' } ,
@@ -474,6 +509,16 @@ describe('utils', () => {
474509 meta : { type : 'ObjectExpression' } ,
475510 isNewStyle : true ,
476511 } ,
512+ 'export const rule = { create() {}, meta: {} };' : {
513+ create : { type : 'FunctionExpression' } ,
514+ meta : { type : 'ObjectExpression' } ,
515+ isNewStyle : true ,
516+ } ,
517+ 'const rule = { create() {}, meta: {} }; export {rule};' : {
518+ create : { type : 'FunctionExpression' } ,
519+ meta : { type : 'ObjectExpression' } ,
520+ isNewStyle : true ,
521+ } ,
477522
478523 // ESM (function style)
479524 'export default function (context) { return {}; }' : {
0 commit comments