diff --git a/.changeset/rude-carrots-tie.md b/.changeset/rude-carrots-tie.md new file mode 100644 index 00000000..6322383b --- /dev/null +++ b/.changeset/rude-carrots-tie.md @@ -0,0 +1,5 @@ +--- +"@codemod-utils/cli": minor +--- + +Updated blueprints to install eslint@v9 diff --git a/packages/cli/src/blueprints/.eslintignore b/packages/cli/src/blueprints/.eslintignore deleted file mode 100644 index 771057c8..00000000 --- a/packages/cli/src/blueprints/.eslintignore +++ /dev/null @@ -1,13 +0,0 @@ -# compiled output -/dist/ -/dist-for-testing/ -/tmp/ - -# dependencies -/node_modules/ - -# misc -!.* -.*/ -/src/blueprints/ -/tests/fixtures/ diff --git a/packages/cli/src/blueprints/.eslintrc.cjs b/packages/cli/src/blueprints/.eslintrc.cjs deleted file mode 100644 index 52d2400a..00000000 --- a/packages/cli/src/blueprints/.eslintrc.cjs +++ /dev/null @@ -1,109 +0,0 @@ -'use strict'; - -<% if (options.codemod.hasTypeScript) { %>module.exports = { - root: true, - parserOptions: { - ecmaVersion: 'latest', - project: true, - sourceType: 'module', - }, - plugins: ['simple-import-sort'], - extends: [ - 'eslint:recommended', - 'plugin:import/recommended', - 'plugin:n/recommended', - 'plugin:prettier/recommended', - ], - rules: { - curly: 'error', - 'simple-import-sort/exports': 'error', - 'simple-import-sort/imports': 'error', - }, - settings: { - 'import/resolver': { - node: true, - typescript: true, - }, - }, - overrides: [ - // TypeScript files - { - files: ['**/*.{cts,ts}'], - parser: '@typescript-eslint/parser', - extends: [ - 'plugin:@typescript-eslint/recommended', - 'plugin:import/typescript', - 'plugin:typescript-sort-keys/recommended', - ], - rules: { - 'import/no-duplicates': 'error', - }, - }, - // JavaScript files - { - files: ['**/*.{cjs,js}'], - rules: { - 'import/no-duplicates': 'error', - }, - }, - // Node files - { - files: ['./.eslintrc.{cjs,js}', './.prettierrc.{cjs,js}'], - env: { - browser: false, - node: true, - }, - extends: ['plugin:n/recommended'], - }, - { - files: ['bin/**/*.{js,ts}'], - rules: { - 'n/hashbang': 'off', - }, - }, - ], -};<% } else { %>module.exports = { - root: true, - parser: '@babel/eslint-parser', - parserOptions: { - ecmaVersion: 'latest', - requireConfigFile: false, - sourceType: 'module', - }, - plugins: ['simple-import-sort'], - extends: [ - 'eslint:recommended', - 'plugin:import/recommended', - 'plugin:n/recommended', - 'plugin:prettier/recommended', - ], - rules: { - curly: 'error', - 'simple-import-sort/exports': 'error', - 'simple-import-sort/imports': 'error', - }, - overrides: [ - // JavaScript files - { - files: ['**/*.{cjs,js}'], - rules: { - 'import/no-duplicates': 'error', - }, - }, - // Node files - { - files: ['./.eslintrc.{cjs,js}', './.prettierrc.{cjs,js}'], - env: { - browser: false, - node: true, - }, - extends: ['plugin:n/recommended'], - }, - { - files: ['bin/**/*.{js,ts}'], - rules: { - 'n/hashbang': 'off', - }, - }, - ], -};<% } %> diff --git a/packages/cli/src/blueprints/__npmignore__ b/packages/cli/src/blueprints/__npmignore__ index 44cf7f7b..2c3de6e8 100644 --- a/packages/cli/src/blueprints/__npmignore__ +++ b/packages/cli/src/blueprints/__npmignore__ @@ -9,8 +9,6 @@ /.DS_Store /.env* /.eslintcache -/.eslintignore -/.eslintrc.cjs /.git/ /.github/ /.gitignore @@ -19,5 +17,6 @@ /.prettierrc.cjs /build.sh /CONTRIBUTING.md -/update-test-fixtures.sh +/eslint.config.js /tests/ +/update-test-fixtures.sh diff --git a/packages/cli/src/blueprints/eslint.config.js b/packages/cli/src/blueprints/eslint.config.js new file mode 100644 index 00000000..38322bbb --- /dev/null +++ b/packages/cli/src/blueprints/eslint.config.js @@ -0,0 +1,236 @@ +<% if (options.codemod.hasTypeScript) { %>import babelEslintParser from '@babel/eslint-parser'; +import eslint from '@eslint/js'; +import eslintPluginImport from 'eslint-plugin-import'; +import eslintPluginN from 'eslint-plugin-n'; +import eslintPluginPrettier from 'eslint-plugin-prettier/recommended'; +import eslintPluginSimpleImportSort from 'eslint-plugin-simple-import-sort'; +import eslintPluginTypescriptSortKeys from 'eslint-plugin-typescript-sort-keys'; +import globals from 'globals'; +// eslint-disable-next-line import/no-unresolved +import tseslint from 'typescript-eslint'; + +const parserOptionsJs = { + babelOptions: { + plugins: [ + [ + '@babel/plugin-proposal-decorators', + { + decoratorsBeforeExport: true, + }, + ], + ], + }, + ecmaFeatures: { + modules: true, + }, + ecmaVersion: 'latest', + requireConfigFile: false, +}; + +const parserOptionsTs = { + projectService: true, + tsconfigRootDir: import.meta.dirname, +}; + +export default tseslint.config( + { + ignores: [ + 'dist/', + 'dist-for-testing/', + 'node_modules/', + 'src/blueprints/', + 'tests/fixtures/', + 'tmp/', + '!.*', + '.*/', + ], + }, + + { + linterOptions: { + reportUnusedDisableDirectives: 'error', + }, + }, + { + plugins: { + 'simple-import-sort': eslintPluginSimpleImportSort, + }, + rules: { + curly: 'error', + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', + }, + }, + eslint.configs.recommended, + eslintPluginImport.flatConfigs.recommended, + eslintPluginPrettier, + + // JavaScript files + { + files: ['**/*.js'], + languageOptions: { + parser: babelEslintParser, + parserOptions: parserOptionsJs, + }, + rules: { + 'import/no-duplicates': 'error', + }, + }, + + // TypeScript files + { + extends: [ + ...tseslint.configs.recommended, + eslintPluginImport.flatConfigs.typescript, + ], + files: ['**/*.ts'], + languageOptions: { + parserOptions: parserOptionsTs, + }, + plugins: { + 'typescript-sort-keys': eslintPluginTypescriptSortKeys, + }, + rules: { + '@typescript-eslint/array-type': 'error', + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/no-import-type-side-effects': 'error', + 'import/no-duplicates': 'error', + 'typescript-sort-keys/interface': 'error', + 'typescript-sort-keys/string-enum': 'error', + }, + settings: { + 'import/resolver': { + node: true, + typescript: true, + }, + }, + }, + + // Node files + { + files: ['**/*.cjs'], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.node, + }, + sourceType: 'script', + }, + plugins: { + n: eslintPluginN, + }, + }, + { + files: ['**/*.mjs'], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.node, + }, + parserOptions: parserOptionsJs, + sourceType: 'module', + }, + plugins: { + n: eslintPluginN, + }, + }, +);<% } else { %>import babelEslintParser from '@babel/eslint-parser'; +import eslint from '@eslint/js'; +import eslintPluginImport from 'eslint-plugin-import'; +import eslintPluginN from 'eslint-plugin-n'; +import eslintPluginPrettier from 'eslint-plugin-prettier/recommended'; +import eslintPluginSimpleImportSort from 'eslint-plugin-simple-import-sort'; +import globals from 'globals'; + +const parserOptionsJs = { + babelOptions: { + plugins: [ + [ + '@babel/plugin-proposal-decorators', + { + decoratorsBeforeExport: true, + }, + ], + ], + }, + ecmaFeatures: { + modules: true, + }, + ecmaVersion: 'latest', + requireConfigFile: false, +}; + +export default tseslint.config( + { + ignores: [ + 'dist/', + 'dist-for-testing/', + 'node_modules/', + 'src/blueprints/', + 'tests/fixtures/', + 'tmp/', + '!.*', + '.*/', + ], + }, + + { + linterOptions: { + reportUnusedDisableDirectives: 'error', + }, + }, + { + plugins: { + 'simple-import-sort': eslintPluginSimpleImportSort, + }, + rules: { + curly: 'error', + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', + }, + }, + eslint.configs.recommended, + eslintPluginImport.flatConfigs.recommended, + eslintPluginPrettier, + + // JavaScript files + { + files: ['**/*.js'], + languageOptions: { + parser: babelEslintParser, + parserOptions: parserOptionsJs, + }, + rules: { + 'import/no-duplicates': 'error', + }, + }, + + // Node files + { + files: ['**/*.cjs'], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.node, + }, + sourceType: 'script', + }, + plugins: { + n: eslintPluginN, + }, + }, + { + files: ['**/*.mjs'], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.node, + }, + parserOptions: parserOptionsJs, + sourceType: 'module', + }, + plugins: { + n: eslintPluginN, + }, + }, +);<% } %> diff --git a/packages/cli/src/steps/update-package-json.ts b/packages/cli/src/steps/update-package-json.ts index a7ffbe1f..51f8ecdd 100644 --- a/packages/cli/src/steps/update-package-json.ts +++ b/packages/cli/src/steps/update-package-json.ts @@ -42,9 +42,11 @@ function updateDevDependencies( const packagesToInstall = new Set([ '@babel/core', '@babel/eslint-parser', + '@babel/plugin-proposal-decorators', '@changesets/cli', '@changesets/get-github-info', '@codemod-utils/tests', + '@eslint/js', '@sondr3/minitest', 'concurrently', 'eslint', @@ -53,20 +55,20 @@ function updateDevDependencies( 'eslint-plugin-n', 'eslint-plugin-prettier', 'eslint-plugin-simple-import-sort', + 'globals', 'prettier', ]); if (codemod.hasTypeScript) { - packagesToInstall.delete('@babel/eslint-parser'); packagesToInstall.add('@tsconfig/node18'); packagesToInstall.add('@tsconfig/strictest'); + packagesToInstall.add('@types/eslint__js'); packagesToInstall.add('@types/node'); packagesToInstall.add('@types/yargs'); - packagesToInstall.add('@typescript-eslint/eslint-plugin'); - packagesToInstall.add('@typescript-eslint/parser'); packagesToInstall.add('eslint-import-resolver-typescript'); packagesToInstall.add('eslint-plugin-typescript-sort-keys'); packagesToInstall.add('typescript'); + packagesToInstall.add('typescript-eslint'); } Array.from(packagesToInstall).forEach((packageName) => { diff --git a/packages/cli/src/utils/blueprints/get-version.ts b/packages/cli/src/utils/blueprints/get-version.ts index 11a6bfa4..a4d7e823 100644 --- a/packages/cli/src/utils/blueprints/get-version.ts +++ b/packages/cli/src/utils/blueprints/get-version.ts @@ -1,36 +1,39 @@ import { decideVersion } from '@codemod-utils/blueprints'; const latestVersions = new Map([ - ['@babel/core', '7.26.0'], + ['@babel/core', '7.26.7'], ['@babel/eslint-parser', '7.26.5'], - ['@changesets/cli', '2.27.11'], + ['@babel/plugin-proposal-decorators', '7.25.9'], + ['@changesets/cli', '2.27.12'], ['@changesets/get-github-info', '0.6.0'], - ['@codemod-utils/ast-javascript', '1.2.10'], - ['@codemod-utils/ast-template', '1.1.6'], - ['@codemod-utils/blueprints', '1.1.7'], - ['@codemod-utils/ember', '2.0.2'], - ['@codemod-utils/files', '2.0.6'], - ['@codemod-utils/json', '1.1.11'], - ['@codemod-utils/tests', '1.1.9'], + ['@codemod-utils/ast-javascript', '1.2.11'], + ['@codemod-utils/ast-template', '1.1.7'], + ['@codemod-utils/blueprints', '1.1.8'], + ['@codemod-utils/ember', '2.0.3'], + ['@codemod-utils/files', '2.0.7'], + ['@codemod-utils/json', '1.1.12'], + ['@codemod-utils/tests', '1.1.10'], + ['@eslint/js', '9.19.0'], ['@sondr3/minitest', '0.1.2'], ['@tsconfig/node18', '18.2.4'], ['@tsconfig/strictest', '2.0.5'], - ['@types/node', '18.19.70'], + ['@types/eslint__js', '8.42.3'], + ['@types/node', '18.19.75'], ['@types/yargs', '17.0.33'], - ['@typescript-eslint/eslint-plugin', '8.20.0'], - ['@typescript-eslint/parser', '8.20.0'], ['concurrently', '9.1.2'], - ['eslint', '8.57.1'], + ['eslint', '9.19.0'], ['eslint-config-prettier', '10.0.1'], ['eslint-import-resolver-typescript', '3.7.0'], ['eslint-plugin-import', '2.31.0'], ['eslint-plugin-n', '17.15.1'], - ['eslint-plugin-prettier', '5.2.2'], + ['eslint-plugin-prettier', '5.2.3'], ['eslint-plugin-simple-import-sort', '12.1.1'], ['eslint-plugin-typescript-sort-keys', '3.3.0'], - ['pnpm', '9.15.4'], + ['globals', '15.14.0'], + ['pnpm', '9.15.5'], ['prettier', '3.4.2'], ['typescript', '5.7.3'], + ['typescript-eslint', '8.23.0'], ['yargs', '17.7.2'], ]); diff --git a/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/.eslintignore b/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/.eslintignore deleted file mode 100644 index 771057c8..00000000 --- a/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/.eslintignore +++ /dev/null @@ -1,13 +0,0 @@ -# compiled output -/dist/ -/dist-for-testing/ -/tmp/ - -# dependencies -/node_modules/ - -# misc -!.* -.*/ -/src/blueprints/ -/tests/fixtures/ diff --git a/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/.eslintrc.cjs b/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/.eslintrc.cjs deleted file mode 100644 index 9f589b55..00000000 --- a/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/.eslintrc.cjs +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -module.exports = { - root: true, - parser: '@babel/eslint-parser', - parserOptions: { - ecmaVersion: 'latest', - requireConfigFile: false, - sourceType: 'module', - }, - plugins: ['simple-import-sort'], - extends: [ - 'eslint:recommended', - 'plugin:import/recommended', - 'plugin:n/recommended', - 'plugin:prettier/recommended', - ], - rules: { - curly: 'error', - 'simple-import-sort/exports': 'error', - 'simple-import-sort/imports': 'error', - }, - overrides: [ - // JavaScript files - { - files: ['**/*.{cjs,js}'], - rules: { - 'import/no-duplicates': 'error', - }, - }, - // Node files - { - files: ['./.eslintrc.{cjs,js}', './.prettierrc.{cjs,js}'], - env: { - browser: false, - node: true, - }, - extends: ['plugin:n/recommended'], - }, - { - files: ['bin/**/*.{js,ts}'], - rules: { - 'n/hashbang': 'off', - }, - }, - ], -}; diff --git a/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/.npmignore b/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/.npmignore index 44cf7f7b..2c3de6e8 100644 --- a/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/.npmignore +++ b/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/.npmignore @@ -9,8 +9,6 @@ /.DS_Store /.env* /.eslintcache -/.eslintignore -/.eslintrc.cjs /.git/ /.github/ /.gitignore @@ -19,5 +17,6 @@ /.prettierrc.cjs /build.sh /CONTRIBUTING.md -/update-test-fixtures.sh +/eslint.config.js /tests/ +/update-test-fixtures.sh diff --git a/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/eslint.config.js b/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/eslint.config.js new file mode 100644 index 00000000..98431cc1 --- /dev/null +++ b/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/eslint.config.js @@ -0,0 +1,100 @@ +import babelEslintParser from '@babel/eslint-parser'; +import eslint from '@eslint/js'; +import eslintPluginImport from 'eslint-plugin-import'; +import eslintPluginN from 'eslint-plugin-n'; +import eslintPluginPrettier from 'eslint-plugin-prettier/recommended'; +import eslintPluginSimpleImportSort from 'eslint-plugin-simple-import-sort'; +import globals from 'globals'; + +const parserOptionsJs = { + babelOptions: { + plugins: [ + [ + '@babel/plugin-proposal-decorators', + { + decoratorsBeforeExport: true, + }, + ], + ], + }, + ecmaFeatures: { + modules: true, + }, + ecmaVersion: 'latest', + requireConfigFile: false, +}; + +export default tseslint.config( + { + ignores: [ + 'dist/', + 'dist-for-testing/', + 'node_modules/', + 'src/blueprints/', + 'tests/fixtures/', + 'tmp/', + '!.*', + '.*/', + ], + }, + + { + linterOptions: { + reportUnusedDisableDirectives: 'error', + }, + }, + { + plugins: { + 'simple-import-sort': eslintPluginSimpleImportSort, + }, + rules: { + curly: 'error', + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', + }, + }, + eslint.configs.recommended, + eslintPluginImport.flatConfigs.recommended, + eslintPluginPrettier, + + // JavaScript files + { + files: ['**/*.js'], + languageOptions: { + parser: babelEslintParser, + parserOptions: parserOptionsJs, + }, + rules: { + 'import/no-duplicates': 'error', + }, + }, + + // Node files + { + files: ['**/*.cjs'], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.node, + }, + sourceType: 'script', + }, + plugins: { + n: eslintPluginN, + }, + }, + { + files: ['**/*.mjs'], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.node, + }, + parserOptions: parserOptionsJs, + sourceType: 'module', + }, + plugins: { + n: eslintPluginN, + }, + }, +); diff --git a/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/package.json b/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/package.json index 223b6c37..e64c7bf2 100644 --- a/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/package.json +++ b/packages/cli/tests/fixtures/javascript-with-addons/output/ember-codemod-args-to-signature/package.json @@ -31,32 +31,35 @@ "test": "mt tests --quiet" }, "dependencies": { - "@codemod-utils/ast-javascript": "^1.2.10", - "@codemod-utils/ast-template": "^1.1.6", - "@codemod-utils/blueprints": "^1.1.7", - "@codemod-utils/ember": "^2.0.2", - "@codemod-utils/files": "^2.0.6", - "@codemod-utils/json": "^1.1.11", + "@codemod-utils/ast-javascript": "^1.2.11", + "@codemod-utils/ast-template": "^1.1.7", + "@codemod-utils/blueprints": "^1.1.8", + "@codemod-utils/ember": "^2.0.3", + "@codemod-utils/files": "^2.0.7", + "@codemod-utils/json": "^1.1.12", "yargs": "^17.7.2" }, "devDependencies": { - "@babel/core": "^7.26.0", + "@babel/core": "^7.26.7", "@babel/eslint-parser": "^7.26.5", - "@changesets/cli": "^2.27.11", + "@babel/plugin-proposal-decorators": "^7.25.9", + "@changesets/cli": "^2.27.12", "@changesets/get-github-info": "^0.6.0", - "@codemod-utils/tests": "^1.1.9", + "@codemod-utils/tests": "^1.1.10", + "@eslint/js": "^9.19.0", "@sondr3/minitest": "^0.1.2", "concurrently": "^9.1.2", - "eslint": "^8.57.1", + "eslint": "^9.19.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-import": "^2.31.0", "eslint-plugin-n": "^17.15.1", - "eslint-plugin-prettier": "^5.2.2", + "eslint-plugin-prettier": "^5.2.3", "eslint-plugin-simple-import-sort": "^12.1.1", + "globals": "^15.14.0", "prettier": "^3.4.2" }, "engines": { "node": "18.* || >= 20" }, - "packageManager": "pnpm@9.15.4" + "packageManager": "pnpm@9.15.5" } diff --git a/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/.eslintignore b/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/.eslintignore deleted file mode 100644 index 771057c8..00000000 --- a/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/.eslintignore +++ /dev/null @@ -1,13 +0,0 @@ -# compiled output -/dist/ -/dist-for-testing/ -/tmp/ - -# dependencies -/node_modules/ - -# misc -!.* -.*/ -/src/blueprints/ -/tests/fixtures/ diff --git a/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/.eslintrc.cjs b/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/.eslintrc.cjs deleted file mode 100644 index 9f589b55..00000000 --- a/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/.eslintrc.cjs +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -module.exports = { - root: true, - parser: '@babel/eslint-parser', - parserOptions: { - ecmaVersion: 'latest', - requireConfigFile: false, - sourceType: 'module', - }, - plugins: ['simple-import-sort'], - extends: [ - 'eslint:recommended', - 'plugin:import/recommended', - 'plugin:n/recommended', - 'plugin:prettier/recommended', - ], - rules: { - curly: 'error', - 'simple-import-sort/exports': 'error', - 'simple-import-sort/imports': 'error', - }, - overrides: [ - // JavaScript files - { - files: ['**/*.{cjs,js}'], - rules: { - 'import/no-duplicates': 'error', - }, - }, - // Node files - { - files: ['./.eslintrc.{cjs,js}', './.prettierrc.{cjs,js}'], - env: { - browser: false, - node: true, - }, - extends: ['plugin:n/recommended'], - }, - { - files: ['bin/**/*.{js,ts}'], - rules: { - 'n/hashbang': 'off', - }, - }, - ], -}; diff --git a/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/.npmignore b/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/.npmignore index 44cf7f7b..2c3de6e8 100644 --- a/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/.npmignore +++ b/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/.npmignore @@ -9,8 +9,6 @@ /.DS_Store /.env* /.eslintcache -/.eslintignore -/.eslintrc.cjs /.git/ /.github/ /.gitignore @@ -19,5 +17,6 @@ /.prettierrc.cjs /build.sh /CONTRIBUTING.md -/update-test-fixtures.sh +/eslint.config.js /tests/ +/update-test-fixtures.sh diff --git a/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/eslint.config.js b/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/eslint.config.js new file mode 100644 index 00000000..98431cc1 --- /dev/null +++ b/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/eslint.config.js @@ -0,0 +1,100 @@ +import babelEslintParser from '@babel/eslint-parser'; +import eslint from '@eslint/js'; +import eslintPluginImport from 'eslint-plugin-import'; +import eslintPluginN from 'eslint-plugin-n'; +import eslintPluginPrettier from 'eslint-plugin-prettier/recommended'; +import eslintPluginSimpleImportSort from 'eslint-plugin-simple-import-sort'; +import globals from 'globals'; + +const parserOptionsJs = { + babelOptions: { + plugins: [ + [ + '@babel/plugin-proposal-decorators', + { + decoratorsBeforeExport: true, + }, + ], + ], + }, + ecmaFeatures: { + modules: true, + }, + ecmaVersion: 'latest', + requireConfigFile: false, +}; + +export default tseslint.config( + { + ignores: [ + 'dist/', + 'dist-for-testing/', + 'node_modules/', + 'src/blueprints/', + 'tests/fixtures/', + 'tmp/', + '!.*', + '.*/', + ], + }, + + { + linterOptions: { + reportUnusedDisableDirectives: 'error', + }, + }, + { + plugins: { + 'simple-import-sort': eslintPluginSimpleImportSort, + }, + rules: { + curly: 'error', + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', + }, + }, + eslint.configs.recommended, + eslintPluginImport.flatConfigs.recommended, + eslintPluginPrettier, + + // JavaScript files + { + files: ['**/*.js'], + languageOptions: { + parser: babelEslintParser, + parserOptions: parserOptionsJs, + }, + rules: { + 'import/no-duplicates': 'error', + }, + }, + + // Node files + { + files: ['**/*.cjs'], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.node, + }, + sourceType: 'script', + }, + plugins: { + n: eslintPluginN, + }, + }, + { + files: ['**/*.mjs'], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.node, + }, + parserOptions: parserOptionsJs, + sourceType: 'module', + }, + plugins: { + n: eslintPluginN, + }, + }, +); diff --git a/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/package.json b/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/package.json index d84f303c..13123889 100644 --- a/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/package.json +++ b/packages/cli/tests/fixtures/javascript/output/ember-codemod-pod-to-octane/package.json @@ -31,27 +31,30 @@ "test": "mt tests --quiet" }, "dependencies": { - "@codemod-utils/files": "^2.0.6", + "@codemod-utils/files": "^2.0.7", "yargs": "^17.7.2" }, "devDependencies": { - "@babel/core": "^7.26.0", + "@babel/core": "^7.26.7", "@babel/eslint-parser": "^7.26.5", - "@changesets/cli": "^2.27.11", + "@babel/plugin-proposal-decorators": "^7.25.9", + "@changesets/cli": "^2.27.12", "@changesets/get-github-info": "^0.6.0", - "@codemod-utils/tests": "^1.1.9", + "@codemod-utils/tests": "^1.1.10", + "@eslint/js": "^9.19.0", "@sondr3/minitest": "^0.1.2", "concurrently": "^9.1.2", - "eslint": "^8.57.1", + "eslint": "^9.19.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-import": "^2.31.0", "eslint-plugin-n": "^17.15.1", - "eslint-plugin-prettier": "^5.2.2", + "eslint-plugin-prettier": "^5.2.3", "eslint-plugin-simple-import-sort": "^12.1.1", + "globals": "^15.14.0", "prettier": "^3.4.2" }, "engines": { "node": "18.* || >= 20" }, - "packageManager": "pnpm@9.15.4" + "packageManager": "pnpm@9.15.5" } diff --git a/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/.eslintignore b/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/.eslintignore deleted file mode 100644 index 771057c8..00000000 --- a/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/.eslintignore +++ /dev/null @@ -1,13 +0,0 @@ -# compiled output -/dist/ -/dist-for-testing/ -/tmp/ - -# dependencies -/node_modules/ - -# misc -!.* -.*/ -/src/blueprints/ -/tests/fixtures/ diff --git a/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/.eslintrc.cjs b/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/.eslintrc.cjs deleted file mode 100644 index 758ce769..00000000 --- a/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/.eslintrc.cjs +++ /dev/null @@ -1,65 +0,0 @@ -'use strict'; - -module.exports = { - root: true, - parserOptions: { - ecmaVersion: 'latest', - project: true, - sourceType: 'module', - }, - plugins: ['simple-import-sort'], - extends: [ - 'eslint:recommended', - 'plugin:import/recommended', - 'plugin:n/recommended', - 'plugin:prettier/recommended', - ], - rules: { - curly: 'error', - 'simple-import-sort/exports': 'error', - 'simple-import-sort/imports': 'error', - }, - settings: { - 'import/resolver': { - node: true, - typescript: true, - }, - }, - overrides: [ - // TypeScript files - { - files: ['**/*.{cts,ts}'], - parser: '@typescript-eslint/parser', - extends: [ - 'plugin:@typescript-eslint/recommended', - 'plugin:import/typescript', - 'plugin:typescript-sort-keys/recommended', - ], - rules: { - 'import/no-duplicates': 'error', - }, - }, - // JavaScript files - { - files: ['**/*.{cjs,js}'], - rules: { - 'import/no-duplicates': 'error', - }, - }, - // Node files - { - files: ['./.eslintrc.{cjs,js}', './.prettierrc.{cjs,js}'], - env: { - browser: false, - node: true, - }, - extends: ['plugin:n/recommended'], - }, - { - files: ['bin/**/*.{js,ts}'], - rules: { - 'n/hashbang': 'off', - }, - }, - ], -}; diff --git a/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/.npmignore b/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/.npmignore index 44cf7f7b..2c3de6e8 100644 --- a/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/.npmignore +++ b/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/.npmignore @@ -9,8 +9,6 @@ /.DS_Store /.env* /.eslintcache -/.eslintignore -/.eslintrc.cjs /.git/ /.github/ /.gitignore @@ -19,5 +17,6 @@ /.prettierrc.cjs /build.sh /CONTRIBUTING.md -/update-test-fixtures.sh +/eslint.config.js /tests/ +/update-test-fixtures.sh diff --git a/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/eslint.config.js b/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/eslint.config.js new file mode 100644 index 00000000..1e68df83 --- /dev/null +++ b/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/eslint.config.js @@ -0,0 +1,137 @@ +import babelEslintParser from '@babel/eslint-parser'; +import eslint from '@eslint/js'; +import eslintPluginImport from 'eslint-plugin-import'; +import eslintPluginN from 'eslint-plugin-n'; +import eslintPluginPrettier from 'eslint-plugin-prettier/recommended'; +import eslintPluginSimpleImportSort from 'eslint-plugin-simple-import-sort'; +import eslintPluginTypescriptSortKeys from 'eslint-plugin-typescript-sort-keys'; +import globals from 'globals'; +// eslint-disable-next-line import/no-unresolved +import tseslint from 'typescript-eslint'; + +const parserOptionsJs = { + babelOptions: { + plugins: [ + [ + '@babel/plugin-proposal-decorators', + { + decoratorsBeforeExport: true, + }, + ], + ], + }, + ecmaFeatures: { + modules: true, + }, + ecmaVersion: 'latest', + requireConfigFile: false, +}; + +const parserOptionsTs = { + projectService: true, + tsconfigRootDir: import.meta.dirname, +}; + +export default tseslint.config( + { + ignores: [ + 'dist/', + 'dist-for-testing/', + 'node_modules/', + 'src/blueprints/', + 'tests/fixtures/', + 'tmp/', + '!.*', + '.*/', + ], + }, + + { + linterOptions: { + reportUnusedDisableDirectives: 'error', + }, + }, + { + plugins: { + 'simple-import-sort': eslintPluginSimpleImportSort, + }, + rules: { + curly: 'error', + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', + }, + }, + eslint.configs.recommended, + eslintPluginImport.flatConfigs.recommended, + eslintPluginPrettier, + + // JavaScript files + { + files: ['**/*.js'], + languageOptions: { + parser: babelEslintParser, + parserOptions: parserOptionsJs, + }, + rules: { + 'import/no-duplicates': 'error', + }, + }, + + // TypeScript files + { + extends: [ + ...tseslint.configs.recommended, + eslintPluginImport.flatConfigs.typescript, + ], + files: ['**/*.ts'], + languageOptions: { + parserOptions: parserOptionsTs, + }, + plugins: { + 'typescript-sort-keys': eslintPluginTypescriptSortKeys, + }, + rules: { + '@typescript-eslint/array-type': 'error', + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/no-import-type-side-effects': 'error', + 'import/no-duplicates': 'error', + 'typescript-sort-keys/interface': 'error', + 'typescript-sort-keys/string-enum': 'error', + }, + settings: { + 'import/resolver': { + node: true, + typescript: true, + }, + }, + }, + + // Node files + { + files: ['**/*.cjs'], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.node, + }, + sourceType: 'script', + }, + plugins: { + n: eslintPluginN, + }, + }, + { + files: ['**/*.mjs'], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.node, + }, + parserOptions: parserOptionsJs, + sourceType: 'module', + }, + plugins: { + n: eslintPluginN, + }, + }, +); diff --git a/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/package.json b/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/package.json index 7bae0df1..a135ecf7 100644 --- a/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/package.json +++ b/packages/cli/tests/fixtures/typescript-with-addons/output/ember-codemod-args-to-signature/package.json @@ -33,42 +33,46 @@ "test": "./build.sh --test && mt dist-for-testing --quiet" }, "dependencies": { - "@codemod-utils/ast-javascript": "^1.2.10", - "@codemod-utils/ast-template": "^1.1.6", - "@codemod-utils/blueprints": "^1.1.7", - "@codemod-utils/ember": "^2.0.2", - "@codemod-utils/files": "^2.0.6", - "@codemod-utils/json": "^1.1.11", + "@codemod-utils/ast-javascript": "^1.2.11", + "@codemod-utils/ast-template": "^1.1.7", + "@codemod-utils/blueprints": "^1.1.8", + "@codemod-utils/ember": "^2.0.3", + "@codemod-utils/files": "^2.0.7", + "@codemod-utils/json": "^1.1.12", "yargs": "^17.7.2" }, "devDependencies": { - "@babel/core": "^7.26.0", - "@changesets/cli": "^2.27.11", + "@babel/core": "^7.26.7", + "@babel/eslint-parser": "^7.26.5", + "@babel/plugin-proposal-decorators": "^7.25.9", + "@changesets/cli": "^2.27.12", "@changesets/get-github-info": "^0.6.0", - "@codemod-utils/tests": "^1.1.9", + "@codemod-utils/tests": "^1.1.10", + "@eslint/js": "^9.19.0", "@sondr3/minitest": "^0.1.2", "@tsconfig/node18": "^18.2.4", "@tsconfig/strictest": "^2.0.5", - "@types/node": "^18.19.70", + "@types/eslint__js": "^8.42.3", + "@types/node": "^18.19.75", "@types/yargs": "^17.0.33", - "@typescript-eslint/eslint-plugin": "^8.20.0", - "@typescript-eslint/parser": "^8.20.0", "concurrently": "^9.1.2", - "eslint": "^8.57.1", + "eslint": "^9.19.0", "eslint-config-prettier": "^10.0.1", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", "eslint-plugin-n": "^17.15.1", - "eslint-plugin-prettier": "^5.2.2", + "eslint-plugin-prettier": "^5.2.3", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-typescript-sort-keys": "^3.3.0", + "globals": "^15.14.0", "prettier": "^3.4.2", - "typescript": "^5.7.3" + "typescript": "^5.7.3", + "typescript-eslint": "^8.23.0" }, "engines": { "node": "18.* || >= 20" }, - "packageManager": "pnpm@9.15.4", + "packageManager": "pnpm@9.15.5", "pnpm": { "overrides": { "eslint-plugin-import@2.31.0>tsconfig-paths": "^4.2.0" diff --git a/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/.eslintignore b/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/.eslintignore deleted file mode 100644 index 771057c8..00000000 --- a/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/.eslintignore +++ /dev/null @@ -1,13 +0,0 @@ -# compiled output -/dist/ -/dist-for-testing/ -/tmp/ - -# dependencies -/node_modules/ - -# misc -!.* -.*/ -/src/blueprints/ -/tests/fixtures/ diff --git a/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/.eslintrc.cjs b/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/.eslintrc.cjs deleted file mode 100644 index 758ce769..00000000 --- a/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/.eslintrc.cjs +++ /dev/null @@ -1,65 +0,0 @@ -'use strict'; - -module.exports = { - root: true, - parserOptions: { - ecmaVersion: 'latest', - project: true, - sourceType: 'module', - }, - plugins: ['simple-import-sort'], - extends: [ - 'eslint:recommended', - 'plugin:import/recommended', - 'plugin:n/recommended', - 'plugin:prettier/recommended', - ], - rules: { - curly: 'error', - 'simple-import-sort/exports': 'error', - 'simple-import-sort/imports': 'error', - }, - settings: { - 'import/resolver': { - node: true, - typescript: true, - }, - }, - overrides: [ - // TypeScript files - { - files: ['**/*.{cts,ts}'], - parser: '@typescript-eslint/parser', - extends: [ - 'plugin:@typescript-eslint/recommended', - 'plugin:import/typescript', - 'plugin:typescript-sort-keys/recommended', - ], - rules: { - 'import/no-duplicates': 'error', - }, - }, - // JavaScript files - { - files: ['**/*.{cjs,js}'], - rules: { - 'import/no-duplicates': 'error', - }, - }, - // Node files - { - files: ['./.eslintrc.{cjs,js}', './.prettierrc.{cjs,js}'], - env: { - browser: false, - node: true, - }, - extends: ['plugin:n/recommended'], - }, - { - files: ['bin/**/*.{js,ts}'], - rules: { - 'n/hashbang': 'off', - }, - }, - ], -}; diff --git a/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/.npmignore b/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/.npmignore index 44cf7f7b..2c3de6e8 100644 --- a/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/.npmignore +++ b/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/.npmignore @@ -9,8 +9,6 @@ /.DS_Store /.env* /.eslintcache -/.eslintignore -/.eslintrc.cjs /.git/ /.github/ /.gitignore @@ -19,5 +17,6 @@ /.prettierrc.cjs /build.sh /CONTRIBUTING.md -/update-test-fixtures.sh +/eslint.config.js /tests/ +/update-test-fixtures.sh diff --git a/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/eslint.config.js b/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/eslint.config.js new file mode 100644 index 00000000..1e68df83 --- /dev/null +++ b/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/eslint.config.js @@ -0,0 +1,137 @@ +import babelEslintParser from '@babel/eslint-parser'; +import eslint from '@eslint/js'; +import eslintPluginImport from 'eslint-plugin-import'; +import eslintPluginN from 'eslint-plugin-n'; +import eslintPluginPrettier from 'eslint-plugin-prettier/recommended'; +import eslintPluginSimpleImportSort from 'eslint-plugin-simple-import-sort'; +import eslintPluginTypescriptSortKeys from 'eslint-plugin-typescript-sort-keys'; +import globals from 'globals'; +// eslint-disable-next-line import/no-unresolved +import tseslint from 'typescript-eslint'; + +const parserOptionsJs = { + babelOptions: { + plugins: [ + [ + '@babel/plugin-proposal-decorators', + { + decoratorsBeforeExport: true, + }, + ], + ], + }, + ecmaFeatures: { + modules: true, + }, + ecmaVersion: 'latest', + requireConfigFile: false, +}; + +const parserOptionsTs = { + projectService: true, + tsconfigRootDir: import.meta.dirname, +}; + +export default tseslint.config( + { + ignores: [ + 'dist/', + 'dist-for-testing/', + 'node_modules/', + 'src/blueprints/', + 'tests/fixtures/', + 'tmp/', + '!.*', + '.*/', + ], + }, + + { + linterOptions: { + reportUnusedDisableDirectives: 'error', + }, + }, + { + plugins: { + 'simple-import-sort': eslintPluginSimpleImportSort, + }, + rules: { + curly: 'error', + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', + }, + }, + eslint.configs.recommended, + eslintPluginImport.flatConfigs.recommended, + eslintPluginPrettier, + + // JavaScript files + { + files: ['**/*.js'], + languageOptions: { + parser: babelEslintParser, + parserOptions: parserOptionsJs, + }, + rules: { + 'import/no-duplicates': 'error', + }, + }, + + // TypeScript files + { + extends: [ + ...tseslint.configs.recommended, + eslintPluginImport.flatConfigs.typescript, + ], + files: ['**/*.ts'], + languageOptions: { + parserOptions: parserOptionsTs, + }, + plugins: { + 'typescript-sort-keys': eslintPluginTypescriptSortKeys, + }, + rules: { + '@typescript-eslint/array-type': 'error', + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/no-import-type-side-effects': 'error', + 'import/no-duplicates': 'error', + 'typescript-sort-keys/interface': 'error', + 'typescript-sort-keys/string-enum': 'error', + }, + settings: { + 'import/resolver': { + node: true, + typescript: true, + }, + }, + }, + + // Node files + { + files: ['**/*.cjs'], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.node, + }, + sourceType: 'script', + }, + plugins: { + n: eslintPluginN, + }, + }, + { + files: ['**/*.mjs'], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.node, + }, + parserOptions: parserOptionsJs, + sourceType: 'module', + }, + plugins: { + n: eslintPluginN, + }, + }, +); diff --git a/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/package.json b/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/package.json index f2e028ae..8d62eb44 100644 --- a/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/package.json +++ b/packages/cli/tests/fixtures/typescript/output/ember-codemod-pod-to-octane/package.json @@ -33,37 +33,41 @@ "test": "./build.sh --test && mt dist-for-testing --quiet" }, "dependencies": { - "@codemod-utils/files": "^2.0.6", + "@codemod-utils/files": "^2.0.7", "yargs": "^17.7.2" }, "devDependencies": { - "@babel/core": "^7.26.0", - "@changesets/cli": "^2.27.11", + "@babel/core": "^7.26.7", + "@babel/eslint-parser": "^7.26.5", + "@babel/plugin-proposal-decorators": "^7.25.9", + "@changesets/cli": "^2.27.12", "@changesets/get-github-info": "^0.6.0", - "@codemod-utils/tests": "^1.1.9", + "@codemod-utils/tests": "^1.1.10", + "@eslint/js": "^9.19.0", "@sondr3/minitest": "^0.1.2", "@tsconfig/node18": "^18.2.4", "@tsconfig/strictest": "^2.0.5", - "@types/node": "^18.19.70", + "@types/eslint__js": "^8.42.3", + "@types/node": "^18.19.75", "@types/yargs": "^17.0.33", - "@typescript-eslint/eslint-plugin": "^8.20.0", - "@typescript-eslint/parser": "^8.20.0", "concurrently": "^9.1.2", - "eslint": "^8.57.1", + "eslint": "^9.19.0", "eslint-config-prettier": "^10.0.1", "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", "eslint-plugin-n": "^17.15.1", - "eslint-plugin-prettier": "^5.2.2", + "eslint-plugin-prettier": "^5.2.3", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-typescript-sort-keys": "^3.3.0", + "globals": "^15.14.0", "prettier": "^3.4.2", - "typescript": "^5.7.3" + "typescript": "^5.7.3", + "typescript-eslint": "^8.23.0" }, "engines": { "node": "18.* || >= 20" }, - "packageManager": "pnpm@9.15.4", + "packageManager": "pnpm@9.15.5", "pnpm": { "overrides": { "eslint-plugin-import@2.31.0>tsconfig-paths": "^4.2.0"