Skip to content

Commit 5b049ce

Browse files
committed
fix(core): update ESLint config file references from cjs to mjs
closes: #29493, #22576
1 parent 1d1ea3d commit 5b049ce

File tree

13 files changed

+51
-27
lines changed

13 files changed

+51
-27
lines changed

e2e/angular/src/misc.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ describe('Move Angular Project', () => {
3939
expect(moveOutput).toContain(`CREATE ${newPath}/tsconfig.app.json`);
4040
expect(moveOutput).toContain(`CREATE ${newPath}/tsconfig.json`);
4141
expect(moveOutput).toContain(`CREATE ${newPath}/tsconfig.spec.json`);
42-
expect(moveOutput).toContain(`CREATE ${newPath}/eslint.config.cjs`);
42+
expect(moveOutput).toContain(`CREATE ${newPath}/eslint.config.mjs`);
4343
expect(moveOutput).toContain(`CREATE ${newPath}/public/favicon.ico`);
4444
expect(moveOutput).toContain(`CREATE ${newPath}/src/index.html`);
4545
expect(moveOutput).toContain(`CREATE ${newPath}/src/main.ts`);

e2e/angular/src/projects.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,13 @@ describe('Angular Projects', () => {
164164

165165
it('should lint correctly with eslint and handle external HTML files and inline templates', async () => {
166166
// disable the prefer-standalone rule for app1 which is not standalone
167-
let app1EslintConfig = readFile(`${app1}/eslint.config.cjs`);
167+
let app1EslintConfig = readFile(`${app1}/eslint.config.mjs`);
168168
app1EslintConfig = app1EslintConfig.replace(
169169
`'@angular-eslint/directive-selector': [`,
170170
`'@angular-eslint/prefer-standalone': 'off',
171171
'@angular-eslint/directive-selector': [`
172172
);
173-
updateFile(`${app1}/eslint.config.cjs`, app1EslintConfig);
173+
updateFile(`${app1}/eslint.config.mjs`, app1EslintConfig);
174174

175175
// check apps and lib pass linting for initial generated code
176176
runCLI(`run-many --target lint --projects=${app1},${lib1} --parallel`);

e2e/eslint/src/linter-legacy.test.ts

+12-12
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,10 @@ describe('Linter (legacy)', () => {
150150
env: { NX_ADD_PLUGINS: 'false' },
151151
});
152152
checkFilesExist(
153-
'eslint.config.cjs',
154-
`apps/${myapp}/eslint.config.cjs`,
155-
`libs/${mylib}/eslint.config.cjs`,
156-
`libs/${mylib2}/eslint.config.cjs`
153+
'eslint.config.mjs',
154+
`apps/${myapp}/eslint.config.mjs`,
155+
`libs/${mylib}/eslint.config.mjs`,
156+
`libs/${mylib2}/eslint.config.mjs`
157157
);
158158
checkFilesDoNotExist(
159159
'.eslintrc.json',
@@ -164,12 +164,12 @@ describe('Linter (legacy)', () => {
164164

165165
// move eslint.config one step up
166166
// to test the absence of the flat eslint config in the project root folder
167-
renameFile(`libs/${mylib2}/eslint.config.cjs`, `libs/eslint.config.cjs`);
167+
renameFile(`libs/${mylib2}/eslint.config.mjs`, `libs/eslint.config.mjs`);
168168
updateFile(
169-
`libs/eslint.config.cjs`,
170-
readFile(`libs/eslint.config.cjs`).replace(
171-
`../../eslint.config.cjs`,
172-
`../eslint.config.cjs`
169+
`libs/eslint.config.mjs`,
170+
readFile(`libs/eslint.config.mjs`).replace(
171+
`../../eslint.config.mjs`,
172+
`../eslint.config.mjs`
173173
)
174174
);
175175

@@ -202,9 +202,9 @@ describe('Linter (legacy)', () => {
202202
env: { NX_ADD_PLUGINS: 'false' },
203203
});
204204
checkFilesExist(
205-
'eslint.config.cjs',
206-
`${mylib}/eslint.config.cjs`,
207-
'eslint.base.config.cjs'
205+
'eslint.config.mjs',
206+
`${mylib}/eslint.config.mjs`,
207+
'eslint.base.config.mjs'
208208
);
209209
checkFilesDoNotExist(
210210
'.eslintrc.json',

e2e/eslint/src/linter.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -615,8 +615,8 @@ describe('Linter', () => {
615615
runCLI(`generate @nx/js:lib ${jsLib} --linter eslint`);
616616

617617
checkFilesExist(
618-
`${reactLib}/eslint.config.cjs`,
619-
`${jsLib}/eslint.config.cjs`
618+
`${reactLib}/eslint.config.mjs`,
619+
`${jsLib}/eslint.config.mjs`
620620
);
621621
checkFilesDoNotExist(
622622
`${reactLib}/.eslintrc.json`,

e2e/nx/src/__snapshots__/extras.test.ts.snap

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ exports[`Extra Nx Misc Tests task graph inputs should correctly expand dependent
2626
],
2727
"lib-base-123": [
2828
"libs/lib-base-123/README.md",
29-
"libs/lib-base-123/eslint.config.cjs",
29+
"libs/lib-base-123/eslint.config.mjs",
3030
"libs/lib-base-123/jest.config.ts",
3131
"libs/lib-base-123/package.json",
3232
"libs/lib-base-123/project.json",
@@ -39,7 +39,7 @@ exports[`Extra Nx Misc Tests task graph inputs should correctly expand dependent
3939
],
4040
"lib-dependent-123": [
4141
"libs/lib-dependent-123/README.md",
42-
"libs/lib-dependent-123/eslint.config.cjs",
42+
"libs/lib-dependent-123/eslint.config.mjs",
4343
"libs/lib-dependent-123/jest.config.ts",
4444
"libs/lib-dependent-123/package.json",
4545
"libs/lib-dependent-123/project.json",

packages/eslint/src/generators/lint-project/lint-project.spec.ts

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ describe('@nx/eslint:lint-project', () => {
5656

5757
expect(tree.read('eslint.config.mjs', 'utf-8')).toMatchInlineSnapshot(`
5858
"import nx from "@nx/eslint-plugin";
59+
5960
export default [
6061
...nx.configs["flat/base"],
6162
...nx.configs["flat/typescript"],

packages/eslint/src/generators/utils/eslint-file.ts

+13
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,19 @@ function replaceFlatConfigPaths(
149149
`require('${newPath}')` +
150150
newConfig.slice(match.index + match[0].length);
151151
}
152+
153+
// Handle import statements
154+
const importRegex = RegExp(/import\s+.*?\s+from\s+['"](.*)['"]/g);
155+
while ((match = importRegex.exec(newConfig)) !== null) {
156+
const oldPath = match[1];
157+
const newPath = offsetFilePath(sourceRoot, oldPath, offset, tree);
158+
159+
// Replace the old path with the updated path
160+
newConfig =
161+
newConfig.slice(0, match.index + match[0].indexOf(oldPath)) +
162+
newPath +
163+
newConfig.slice(match.index + match[0].indexOf(oldPath) + oldPath.length);
164+
}
152165
// replace projects
153166
const projectRegex = RegExp(/project:\s?\[?['"](.*)['"]\]?/g);
154167
while ((match = projectRegex.exec(newConfig)) !== null) {

packages/eslint/src/generators/utils/flat-config/ast-utils.spec.ts

+2
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ describe('ast-utils', () => {
211211
);
212212
expect(result).toMatchInlineSnapshot(`
213213
"import baseConfig from "../../eslint.config.mjs";
214+
214215
export default [
215216
...baseConfig,
216217
{
@@ -254,6 +255,7 @@ describe('ast-utils', () => {
254255
);
255256
expect(result).toMatchInlineSnapshot(`
256257
"import baseConfig from "../../eslint.config.mjs";
258+
257259
export default [
258260
...config,
259261
...baseConfig,

packages/eslint/src/generators/utils/flat-config/ast-utils.ts

+9-7
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export function removeOverridesFromLintConfig(content: string): string {
2929
const format = content.includes('export default') ? 'mjs' : 'cjs';
3030

3131
const exportsArray =
32-
format === 'mjs' ? findAllBlocks(source) : findModuleExports(source);
32+
format === 'mjs' ? findExportDefault(source) : findModuleExports(source);
3333
if (!exportsArray) {
3434
return content;
3535
}
@@ -51,7 +51,7 @@ export function removeOverridesFromLintConfig(content: string): string {
5151
}
5252

5353
// TODO Change name
54-
function findAllBlocks(source: ts.SourceFile): ts.NodeArray<ts.Node> {
54+
function findExportDefault(source: ts.SourceFile): ts.NodeArray<ts.Node> {
5555
return ts.forEachChild(source, function analyze(node) {
5656
if (
5757
ts.isExportAssignment(node) &&
@@ -103,7 +103,7 @@ export function hasOverride(
103103
);
104104
const format = content.includes('export default') ? 'mjs' : 'cjs';
105105
const exportsArray =
106-
format === 'mjs' ? findAllBlocks(source) : findModuleExports(source);
106+
format === 'mjs' ? findExportDefault(source) : findModuleExports(source);
107107
if (!exportsArray) {
108108
return false;
109109
}
@@ -161,7 +161,7 @@ export function replaceOverride(
161161
);
162162
const format = content.includes('export default') ? 'mjs' : 'cjs';
163163
const exportsArray =
164-
format === 'mjs' ? findAllBlocks(source) : findModuleExports(source);
164+
format === 'mjs' ? findExportDefault(source) : findModuleExports(source);
165165
if (!exportsArray) {
166166
return content;
167167
}
@@ -683,7 +683,9 @@ function addBlockToFlatConfigExportESM(
683683

684684
const updatedSource = ts.factory.updateSourceFile(source, updatedStatements);
685685

686-
return printer.printFile(updatedSource);
686+
return printer
687+
.printFile(updatedSource)
688+
.replace(/export default/, '\nexport default');
687689
}
688690

689691
function addBlockToFlatConfigExportCJS(
@@ -918,7 +920,7 @@ export function removeCompatExtends(
918920
const changes: StringChange[] = [];
919921
const format = content.includes('export default') ? 'mjs' : 'cjs';
920922
const exportsArray =
921-
format === 'mjs' ? findAllBlocks(source) : findModuleExports(source);
923+
format === 'mjs' ? findExportDefault(source) : findModuleExports(source);
922924

923925
if (!exportsArray) {
924926
return content;
@@ -989,7 +991,7 @@ export function removePredefinedConfigs(
989991
const changes: StringChange[] = [];
990992
let removeImport = true;
991993
const exportsArray =
992-
format === 'mjs' ? findAllBlocks(source) : findModuleExports(source);
994+
format === 'mjs' ? findExportDefault(source) : findModuleExports(source);
993995
if (!exportsArray) {
994996
return content;
995997
}

packages/next/src/generators/application/application.spec.ts

+1
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,7 @@ describe('app', () => {
644644
baseDirectory: dirname(fileURLToPath(import.meta.url)),
645645
recommendedConfig: js.configs.recommended,
646646
});
647+
647648
export default [
648649
...compat.extends('next', 'next/core-web-vitals'),
649650
...baseConfig,

packages/nuxt/src/generators/application/__snapshots__/application.spec.ts.snap

+2
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ const compat = new FlatCompat({
7676
baseDirectory: dirname(fileURLToPath(import.meta.url)),
7777
recommendedConfig: js.configs.recommended,
7878
});
79+
7980
export default [
8081
...baseConfig,
8182
{
@@ -469,6 +470,7 @@ const compat = new FlatCompat({
469470
baseDirectory: dirname(fileURLToPath(import.meta.url)),
470471
recommendedConfig: js.configs.recommended,
471472
});
473+
472474
export default [
473475
...baseConfig,
474476
{

packages/vue/src/generators/library/__snapshots__/library.spec.ts.snap

+1
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ module.exports = [
305305
exports[`library should support eslint flat config ESM 1`] = `
306306
"import vue from 'eslint-plugin-vue';
307307
import baseConfig from '../eslint.config.mjs';
308+
308309
export default [
309310
...baseConfig,
310311
...vue.configs['flat/recommended'],

packages/workspace/src/generators/move/lib/update-eslint-config.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ export function updateEslintConfig(
1616
!tree.exists('.eslintrc.json') &&
1717
!tree.exists('eslint.config.js') &&
1818
!tree.exists('eslint.config.cjs') &&
19+
!tree.exists('eslint.config.mjs') &&
1920
!tree.exists('.eslintrc.base.json') &&
2021
!tree.exists('eslint.base.config.js') &&
21-
!tree.exists('eslint.base.config.cjs')
22+
!tree.exists('eslint.base.config.cjs') &&
23+
!tree.exists('eslint.base.config.mjs')
2224
) {
2325
return;
2426
}

0 commit comments

Comments
 (0)