File
Blob: tools/custom-eslint-rules.test.mjs
| 1 | /** |
| 2 | * Tests for custom ESLint rules. |
| 3 | */ |
| 4 | import { RuleTester } from 'eslint'; |
| 5 | import { describe, it } from 'node:test'; |
| 6 | import { noExportDefaultOfImportStar } from './custom-eslint-rules.mjs'; |
| 7 | |
| 8 | // Create a new RuleTester instance |
| 9 | const ruleTester = new RuleTester({ |
| 10 | languageOptions: { |
| 11 | ecmaVersion: 2022, |
| 12 | sourceType: 'module', |
| 13 | }, |
| 14 | }); |
| 15 | |
| 16 | describe('no-export-default-of-import-star', () => { |
| 17 | it('should validate the rule', () => { |
| 18 | ruleTester.run('no-export-default-of-import-star', noExportDefaultOfImportStar, { |
| 19 | valid: [ |
| 20 | // Valid: Regular named import |
| 21 | { |
| 22 | code: ` |
| 23 | import { foo } from 'some-module'; |
| 24 | export default foo; |
| 25 | `, |
| 26 | }, |
| 27 | // Valid: Inline default export |
| 28 | { |
| 29 | code: ` |
| 30 | export default { foo: 'bar' }; |
| 31 | `, |
| 32 | }, |
| 33 | // Valid: Export namespace import as named export |
| 34 | { |
| 35 | code: ` |
| 36 | import * as foo from 'some-module'; |
| 37 | export { foo }; |
| 38 | `, |
| 39 | }, |
| 40 | // Valid: Namespace import used for something other than export default |
| 41 | { |
| 42 | code: ` |
| 43 | import * as foo from 'some-module'; |
| 44 | const bar = foo; |
| 45 | `, |
| 46 | }, |
| 47 | // Valid: Export default with non-identifier |
| 48 | { |
| 49 | code: ` |
| 50 | import * as foo from 'some-module'; |
| 51 | export default foo.bar; |
| 52 | `, |
| 53 | }, |
| 54 | // Valid: Re-export all |
| 55 | { |
| 56 | code: ` |
| 57 | export * from 'some-module'; |
| 58 | `, |
| 59 | }, |
| 60 | // Valid: Named imports with object literal default export |
| 61 | { |
| 62 | code: ` |
| 63 | import { var1, var2 } from 'some-module'; |
| 64 | export * from 'some-module'; |
| 65 | export default { var1, var2 }; |
| 66 | `, |
| 67 | }, |
| 68 | ], |
| 69 | |
| 70 | invalid: [ |
| 71 | // Invalid: Export namespace import as default |
| 72 | { |
| 73 | code: ` |
| 74 | import * as foo from 'some-module'; |
| 75 | export default foo; |
| 76 | `, |
| 77 | errors: [ |
| 78 | { |
| 79 | messageId: 'noExportDefaultOfImportStar', |
| 80 | data: { source: 'some-module' }, |
| 81 | }, |
| 82 | ], |
| 83 | }, |
| 84 | // Invalid: Common pattern with _default |
| 85 | { |
| 86 | code: ` |
| 87 | import * as _default from 'some-module'; |
| 88 | export default _default; |
| 89 | `, |
| 90 | errors: [ |
| 91 | { |
| 92 | messageId: 'noExportDefaultOfImportStar', |
| 93 | data: { source: 'some-module' }, |
| 94 | }, |
| 95 | ], |
| 96 | }, |
| 97 | // Invalid: Namespace import with scoped package |
| 98 | { |
| 99 | code: ` |
| 100 | import * as myModule from '@scope/package'; |
| 101 | export default myModule; |
| 102 | `, |
| 103 | errors: [ |
| 104 | { |
| 105 | messageId: 'noExportDefaultOfImportStar', |
| 106 | data: { source: '@scope/package' }, |
| 107 | }, |
| 108 | ], |
| 109 | }, |
| 110 | // Invalid: Multiple imports, only one violates rule |
| 111 | { |
| 112 | code: ` |
| 113 | import { named } from 'module1'; |
| 114 | import * as ns from 'module2'; |
| 115 | export default ns; |
| 116 | `, |
| 117 | errors: [ |
| 118 | { |
| 119 | messageId: 'noExportDefaultOfImportStar', |
| 120 | data: { source: 'module2' }, |
| 121 | }, |
| 122 | ], |
| 123 | }, |
| 124 | ], |
| 125 | }); |
| 126 | }); |
| 127 | }); |