|
9 | 9 |
|
10 | 10 | const { ESLint } = require('eslint'); |
11 | 11 | const plugin = require('../../../lib'); |
| 12 | +const { writeFileSync, readFileSync } = require('node:fs'); |
| 13 | +const { join } = require('node:path'); |
12 | 14 |
|
13 | 15 | const gjsGtsParser = require.resolve('../../../lib/parsers/gjs-gts-parser'); |
14 | 16 |
|
@@ -388,18 +390,28 @@ const invalid = [ |
388 | 390 | code: ` |
389 | 391 | import Component from '@glimmer/component'; |
390 | 392 |
|
| 393 | + const foo: any = ''; |
| 394 | +
|
391 | 395 | export default class MyComponent extends Component { |
392 | 396 | foo = 'bar'; |
393 | 397 |
|
394 | 398 | <template> |
395 | 399 | <div></div>${' '} |
| 400 | + {{foo}} |
396 | 401 | </template> |
397 | 402 | }`, |
398 | 403 | errors: [ |
| 404 | + { |
| 405 | + message: 'Unexpected any. Specify a different type.', |
| 406 | + line: 4, |
| 407 | + endLine: 4, |
| 408 | + column: 18, |
| 409 | + endColumn: 21, |
| 410 | + }, |
399 | 411 | { |
400 | 412 | message: 'Trailing spaces not allowed.', |
401 | | - line: 8, |
402 | | - endLine: 8, |
| 413 | + line: 10, |
| 414 | + endLine: 10, |
403 | 415 | column: 22, |
404 | 416 | endColumn: 24, |
405 | 417 | }, |
@@ -765,4 +777,113 @@ describe('multiple tokens in same file', () => { |
765 | 777 | expect(resultErrors[2].message).toBe("'bar' is not defined."); |
766 | 778 | expect(resultErrors[2].line).toBe(17); |
767 | 779 | }); |
| 780 | + |
| 781 | + it('lints while being type aware', async () => { |
| 782 | + const eslint = new ESLint({ |
| 783 | + ignore: false, |
| 784 | + useEslintrc: false, |
| 785 | + plugins: { ember: plugin }, |
| 786 | + overrideConfig: { |
| 787 | + root: true, |
| 788 | + env: { |
| 789 | + browser: true, |
| 790 | + }, |
| 791 | + plugins: ['ember'], |
| 792 | + extends: ['plugin:ember/recommended'], |
| 793 | + overrides: [ |
| 794 | + { |
| 795 | + files: ['**/*.gts'], |
| 796 | + parser: 'eslint-plugin-ember/gjs-gts-parser', |
| 797 | + parserOptions: { |
| 798 | + project: './tsconfig.eslint.json', |
| 799 | + tsconfigRootDir: __dirname, |
| 800 | + extraFileExtensions: ['.gts'], |
| 801 | + }, |
| 802 | + extends: [ |
| 803 | + 'plugin:@typescript-eslint/recommended-requiring-type-checking', |
| 804 | + 'plugin:ember/recommended', |
| 805 | + ], |
| 806 | + rules: { |
| 807 | + 'no-trailing-spaces': 'error', |
| 808 | + '@typescript-eslint/prefer-string-starts-ends-with': 'error', |
| 809 | + }, |
| 810 | + }, |
| 811 | + { |
| 812 | + files: ['**/*.ts'], |
| 813 | + parser: '@typescript-eslint/parser', |
| 814 | + parserOptions: { |
| 815 | + project: './tsconfig.eslint.json', |
| 816 | + tsconfigRootDir: __dirname, |
| 817 | + extraFileExtensions: ['.gts'], |
| 818 | + }, |
| 819 | + extends: [ |
| 820 | + 'plugin:@typescript-eslint/recommended-requiring-type-checking', |
| 821 | + 'plugin:ember/recommended', |
| 822 | + ], |
| 823 | + rules: { |
| 824 | + 'no-trailing-spaces': 'error', |
| 825 | + }, |
| 826 | + }, |
| 827 | + ], |
| 828 | + rules: { |
| 829 | + quotes: ['error', 'single'], |
| 830 | + semi: ['error', 'always'], |
| 831 | + 'object-curly-spacing': ['error', 'always'], |
| 832 | + 'lines-between-class-members': 'error', |
| 833 | + 'no-undef': 'error', |
| 834 | + 'no-unused-vars': 'error', |
| 835 | + 'ember/no-get': 'off', |
| 836 | + 'ember/no-array-prototype-extensions': 'error', |
| 837 | + 'ember/no-unused-services': 'error', |
| 838 | + }, |
| 839 | + }, |
| 840 | + }); |
| 841 | + |
| 842 | + let results = await eslint.lintFiles(['**/*.gts', '**/*.ts']); |
| 843 | + |
| 844 | + let resultErrors = results.flatMap((result) => result.messages); |
| 845 | + expect(resultErrors).toHaveLength(3); |
| 846 | + |
| 847 | + expect(resultErrors[0].message).toBe("Use 'String#startsWith' method instead."); |
| 848 | + expect(resultErrors[0].line).toBe(6); |
| 849 | + |
| 850 | + expect(resultErrors[1].line).toBe(7); |
| 851 | + expect(resultErrors[1].message).toBe("Use 'String#startsWith' method instead."); |
| 852 | + |
| 853 | + expect(resultErrors[2].line).toBe(8); |
| 854 | + expect(resultErrors[2].message).toBe("Use 'String#startsWith' method instead."); |
| 855 | + |
| 856 | + const filePath = join(__dirname, 'ember_ts', 'bar.gts'); |
| 857 | + const content = readFileSync(filePath).toString(); |
| 858 | + try { |
| 859 | + writeFileSync(filePath, content.replace("'42'", '42')); |
| 860 | + |
| 861 | + results = await eslint.lintFiles(['**/*.gts', '**/*.ts']); |
| 862 | + |
| 863 | + resultErrors = results.flatMap((result) => result.messages); |
| 864 | + expect(resultErrors).toHaveLength(2); |
| 865 | + |
| 866 | + expect(resultErrors[0].message).toBe("Use 'String#startsWith' method instead."); |
| 867 | + expect(resultErrors[0].line).toBe(6); |
| 868 | + |
| 869 | + expect(resultErrors[1].line).toBe(8); |
| 870 | + expect(resultErrors[1].message).toBe("Use 'String#startsWith' method instead."); |
| 871 | + } finally { |
| 872 | + writeFileSync(filePath, content); |
| 873 | + } |
| 874 | + |
| 875 | + results = await eslint.lintFiles(['**/*.gts', '**/*.ts']); |
| 876 | + |
| 877 | + resultErrors = results.flatMap((result) => result.messages); |
| 878 | + expect(resultErrors).toHaveLength(3); |
| 879 | + |
| 880 | + expect(resultErrors[0].message).toBe("Use 'String#startsWith' method instead."); |
| 881 | + expect(resultErrors[0].line).toBe(6); |
| 882 | + |
| 883 | + expect(resultErrors[1].message).toBe("Use 'String#startsWith' method instead."); |
| 884 | + expect(resultErrors[1].line).toBe(7); |
| 885 | + |
| 886 | + expect(resultErrors[2].line).toBe(8); |
| 887 | + expect(resultErrors[2].message).toBe("Use 'String#startsWith' method instead."); |
| 888 | + }); |
768 | 889 | }); |
0 commit comments