From 95fac89fa7286414e40131f6aa0e117d6813cdbd Mon Sep 17 00:00:00 2001 From: Karl Horky Date: Tue, 10 Jun 2025 15:01:19 +0200 Subject: [PATCH 1/3] Change to failOnError: true to show errors --- index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.ts b/index.ts index 4ef1e6a..9eee405 100644 --- a/index.ts +++ b/index.ts @@ -10,10 +10,10 @@ const defaultOptions = { exclude: /node_modules/, include: /.*/, /** - * Wether to fail the build if there are circular dependencies. - * @default false + * Whether to fail the build if there are circular dependencies. + * @default true */ - failOnError: false, + failOnError: true, allowAsyncCycles: false, cwd: process.cwd(), /** From c114c402885b0d2b31cb0b51f0cd31c1142232a4 Mon Sep 17 00:00:00 2001 From: Karl Horky Date: Tue, 10 Jun 2025 15:56:10 +0200 Subject: [PATCH 2/3] Switch to detectedCircularDependencies map --- index.ts | 60 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/index.ts b/index.ts index 9eee405..ae1b830 100644 --- a/index.ts +++ b/index.ts @@ -1,6 +1,12 @@ import { default as CircularDependencyPlugin } from "circular-dependency-plugin"; import type { NextConfig } from "next/types"; +const detectedCircularDependencies = { + server: [] as string[], + 'edge-server': [] as string[], + client: [] as string[], +}; + const defaultOptions = { /** * Exclude modules from the bundle that are not used by the project. @@ -11,35 +17,55 @@ const defaultOptions = { include: /.*/, /** * Whether to fail the build if there are circular dependencies. - * @default true + * @default false */ - failOnError: true, + failOnError: false, allowAsyncCycles: false, cwd: process.cwd(), /** * Log the start of the check - * @param x */ - onStart: (x) => { - console.debug(`🔎 Checking ${x.compilation.name} for circular dependencies`) + onStart: ({ compilation }) => { + console.debug(`🔎 Checking ${compilation.name} for circular dependencies`) }, /** - * Log the end of the check - * @param x + * Log the detected circular dependency */ - onEnd: (x) => { - if (x.compilation.errors.length === 0) { - console.debug(`✅ No circular dependencies found in ${x.compilation.name}`) - } else { - console.error(`❌ ${x.compilation.errors.length} circular dependencies found in ${x.compilation.name}`) - } + onDetected: ({ compilation, paths }) => { + const message = `♻️ Circular dependency detected: ${paths.join(" -> ")}`; + console.error(message); + detectedCircularDependencies[ + compilation.name as keyof typeof detectedCircularDependencies + ].push(message); }, /** - * Log the detected circular dependency - * @param x + * Log the end of the check */ - onDetected: ({ paths }) => { - console.error(`♻️ Circular dependency detected: ${paths.join(" -> ")}`); + onEnd: ({ compilation }) => { + const detectedCircularDependenciesCount = + detectedCircularDependencies[ + compilation.name as keyof typeof detectedCircularDependencies + ].length; + if (detectedCircularDependenciesCount === 0) { + console.debug(`✅ No circular dependencies found in ${compilation.name}`) + } else { + console.error(`❌ ${detectedCircularDependenciesCount} circular dependencies found in ${compilation.name}`) + } + + // Exit with code 1 if circular dependencies detected during the last compilation (currently `client`, as of Next.js 15.3.2) + if ( + compilation.name === 'client' && + [ + ...detectedCircularDependencies.client, + ...detectedCircularDependencies['edge-server'], + ...detectedCircularDependencies.server, + ].length > 0 + ) { + console.error( + `❌ Exiting, circular dependencies detected` + ); + process.exit(1); + } }, } satisfies CircularDependencyPlugin.Options; From 9bcc30736f8dff2eb47b0a9978e72f585c6a176d Mon Sep 17 00:00:00 2001 From: Karl Horky Date: Tue, 10 Jun 2025 15:57:49 +0200 Subject: [PATCH 3/3] Switch "found" to "detected" for uniformity --- index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.ts b/index.ts index ae1b830..e73659c 100644 --- a/index.ts +++ b/index.ts @@ -47,9 +47,9 @@ const defaultOptions = { compilation.name as keyof typeof detectedCircularDependencies ].length; if (detectedCircularDependenciesCount === 0) { - console.debug(`✅ No circular dependencies found in ${compilation.name}`) + console.debug(`✅ No circular dependencies detected in ${compilation.name}`) } else { - console.error(`❌ ${detectedCircularDependenciesCount} circular dependencies found in ${compilation.name}`) + console.error(`❌ ${detectedCircularDependenciesCount} circular dependencies detected in ${compilation.name}`) } // Exit with code 1 if circular dependencies detected during the last compilation (currently `client`, as of Next.js 15.3.2)