From 0d528ee9011e04da54654b62a04ac6d8f5fea04a Mon Sep 17 00:00:00 2001 From: Marcos Passos Date: Fri, 27 Jun 2025 13:29:36 -0300 Subject: [PATCH 1/4] Fix middleware codemod --- package-lock.json | 2 +- .../javascript/nextJsMiddlewareCodemod.ts | 54 ++++++++++--------- .../existingConfigReexport.ts | 1 - ...xistingLocalConfigAndMiddlewareReexport.ts | 5 -- .../existingMiddlewareAndConfigReexport.ts | 1 - 5 files changed, 29 insertions(+), 34 deletions(-) delete mode 100644 test/application/project/code/transformation/fixtures/nextjs-middleware/existingConfigReexport.ts delete mode 100644 test/application/project/code/transformation/fixtures/nextjs-middleware/existingLocalConfigAndMiddlewareReexport.ts delete mode 100644 test/application/project/code/transformation/fixtures/nextjs-middleware/existingMiddlewareAndConfigReexport.ts diff --git a/package-lock.json b/package-lock.json index d9d5dd35..d21e40ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,7 +67,7 @@ "esbuild-plugin-file-path-extensions": "^2.1.4", "eslint": "^8.0.0", "jest": "^29.7.0", - "tsup": "^8.4.0", + "tsup": "^8.1.0", "typescript": "^5.6.2" } }, diff --git a/src/application/project/code/transformation/javascript/nextJsMiddlewareCodemod.ts b/src/application/project/code/transformation/javascript/nextJsMiddlewareCodemod.ts index 9c0d2c63..8e6858ce 100644 --- a/src/application/project/code/transformation/javascript/nextJsMiddlewareCodemod.ts +++ b/src/application/project/code/transformation/javascript/nextJsMiddlewareCodemod.ts @@ -25,8 +25,6 @@ export type MiddlewareConfiguration = { module: string, middlewareFactoryName: string, middlewareName: string, - configName: string, - matcherName: string, }, }; @@ -48,21 +46,33 @@ export class NextJsMiddlewareCodemod implements Codemod { public apply(input: t.File): Promise> { const {body} = input.program; - const isConfigReexported = hasReexport(input, { - moduleName: this.configuration.import.module, - importName: this.configuration.import.configName, - }); - const isMiddlewareReexported = hasReexport(input, { moduleName: this.configuration.import.module, importName: this.configuration.import.middlewareName, }); - const localConfig = isConfigReexported ? null : NextJsMiddlewareCodemod.findConfig(input); + const localConfig = NextJsMiddlewareCodemod.findConfig(input); + + const addConfigExport = (): void => { + // Add a configuration object with the matcher pattern + body.push(t.exportNamedDeclaration( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('config'), + t.objectExpression([ + t.objectProperty( + t.identifier('matcher'), + t.stringLiteral(this.configuration.matcherPattern), + ), + ]), + ), + ]), + )); + }; if (isMiddlewareReexported) { - if (isConfigReexported || localConfig !== null) { - // Middleware is re-exported and config is re-exported or found in the source code, + if (localConfig !== null) { + // Middleware is re-exported and config found in the source code, // consider the middleware configured return Promise.resolve({ modified: false, @@ -70,15 +80,11 @@ export class NextJsMiddlewareCodemod implements Codemod { }); } - // No config found in the source code, add a re-export - const modified = addReexport(input, { - type: 'value', - moduleName: this.configuration.import.module, - importName: this.configuration.import.configName, - }); + // Add a configuration object with the matcher pattern + addConfigExport(); return Promise.resolve({ - modified: modified, + modified: true, result: input, }); } @@ -120,21 +126,17 @@ export class NextJsMiddlewareCodemod implements Codemod { if (middlewareNode === null) { if (localConfig === null) { // No middleware found or configuration object, - // just add re-exports - const middlewareReexport = addReexport(input, { + // just add middleware re-export + addReexport(input, { type: 'value', moduleName: this.configuration.import.module, importName: this.configuration.import.middlewareName, }); - const configReexport = addReexport(input, { - type: 'value', - moduleName: this.configuration.import.module, - importName: this.configuration.import.configName, - }); + addConfigExport(); return Promise.resolve({ - modified: middlewareReexport || configReexport, + modified: true, result: input, }); } @@ -149,7 +151,7 @@ export class NextJsMiddlewareCodemod implements Codemod { t.identifier('matcher'), t.memberExpression( t.identifier(localConfig.name), - t.identifier(this.configuration.import.matcherName), + t.identifier('matcher'), ), ), ]), diff --git a/test/application/project/code/transformation/fixtures/nextjs-middleware/existingConfigReexport.ts b/test/application/project/code/transformation/fixtures/nextjs-middleware/existingConfigReexport.ts deleted file mode 100644 index 8e49e806..00000000 --- a/test/application/project/code/transformation/fixtures/nextjs-middleware/existingConfigReexport.ts +++ /dev/null @@ -1 +0,0 @@ -export { config } from "@croct/plug-next/middleware"; diff --git a/test/application/project/code/transformation/fixtures/nextjs-middleware/existingLocalConfigAndMiddlewareReexport.ts b/test/application/project/code/transformation/fixtures/nextjs-middleware/existingLocalConfigAndMiddlewareReexport.ts deleted file mode 100644 index 7de674cc..00000000 --- a/test/application/project/code/transformation/fixtures/nextjs-middleware/existingLocalConfigAndMiddlewareReexport.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { middleware } from "@croct/plug-next/middleware"; - -export const config = { - matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'], -} diff --git a/test/application/project/code/transformation/fixtures/nextjs-middleware/existingMiddlewareAndConfigReexport.ts b/test/application/project/code/transformation/fixtures/nextjs-middleware/existingMiddlewareAndConfigReexport.ts deleted file mode 100644 index 7b19ea95..00000000 --- a/test/application/project/code/transformation/fixtures/nextjs-middleware/existingMiddlewareAndConfigReexport.ts +++ /dev/null @@ -1 +0,0 @@ -export { middleware, config } from "@croct/plug-next/middleware"; From 12c23537938c76145584ae0f9b90f7066cb54a65 Mon Sep 17 00:00:00 2001 From: Marcos Passos Date: Fri, 27 Jun 2025 13:33:27 -0300 Subject: [PATCH 2/4] Fix tests --- .../nextJsMiddlewareCodemod.test.ts.snap | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/test/application/project/code/transformation/javascript/__snapshots__/nextJsMiddlewareCodemod.test.ts.snap b/test/application/project/code/transformation/javascript/__snapshots__/nextJsMiddlewareCodemod.test.ts.snap index 7fdfbe4c..958f392d 100644 --- a/test/application/project/code/transformation/javascript/__snapshots__/nextJsMiddlewareCodemod.test.ts.snap +++ b/test/application/project/code/transformation/javascript/__snapshots__/nextJsMiddlewareCodemod.test.ts.snap @@ -272,7 +272,11 @@ exports[`NextJsMiddlewareCodemod should correctly transform defaultExportClass.t // invalid } -export { middleware, config } from "@croct/plug-next/middleware"; +export { middleware } from "@croct/plug-next/middleware"; + +export const config = { + matcher: "/((?!api|_next/static|_next/image|favicon.ico|sitemap.xml|robots.txt).*)" +}; " `; @@ -319,7 +323,13 @@ export default something; " `; -exports[`NextJsMiddlewareCodemod should correctly transform empty.ts: empty.ts 1`] = `"export { middleware, config } from "@croct/plug-next/middleware";"`; +exports[`NextJsMiddlewareCodemod should correctly transform empty.ts: empty.ts 1`] = ` +"export { middleware } from "@croct/plug-next/middleware"; + +export const config = { + matcher: "/((?!api|_next/static|_next/image|favicon.ico|sitemap.xml|robots.txt).*)" +};" +`; exports[`NextJsMiddlewareCodemod should correctly transform existingAliasedHofCall.ts: existingAliasedHofCall.ts 1`] = ` "import { withCroct as croctMiddleware } from "@croct/plug-next/middleware"; @@ -381,11 +391,6 @@ export default withCroct({ " `; -exports[`NextJsMiddlewareCodemod should correctly transform existingConfigReexport.ts: existingConfigReexport.ts 1`] = ` -"export { config, middleware } from "@croct/plug-next/middleware"; -" -`; - exports[`NextJsMiddlewareCodemod should correctly transform existingHofCall.ts: existingHofCall.ts 1`] = ` "import { withCroct } from "@croct/plug-next/middleware"; @@ -435,20 +440,6 @@ export const middleware = croctMiddleware({ " `; -exports[`NextJsMiddlewareCodemod should correctly transform existingLocalConfigAndMiddlewareReexport.ts: existingLocalConfigAndMiddlewareReexport.ts 1`] = ` -"export { middleware } from "@croct/plug-next/middleware"; - -export const config = { - matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'], -} -" -`; - -exports[`NextJsMiddlewareCodemod should correctly transform existingMiddlewareAndConfigReexport.ts: existingMiddlewareAndConfigReexport.ts 1`] = ` -"export { middleware, config } from "@croct/plug-next/middleware"; -" -`; - exports[`NextJsMiddlewareCodemod should correctly transform existingMiddlewareCall.ts: existingMiddlewareCall.ts 1`] = ` "import { middleware as croctMiddleware } from "@croct/plug-next/middleware"; @@ -459,7 +450,11 @@ export default croctMiddleware(function () { `; exports[`NextJsMiddlewareCodemod should correctly transform existingMiddlewareReexport.ts: existingMiddlewareReexport.ts 1`] = ` -"export { middleware, config } from "@croct/plug-next/middleware"; +"export { middleware } from "@croct/plug-next/middleware"; + +export const config = { + matcher: "/((?!api|_next/static|_next/image|favicon.ico|sitemap.xml|robots.txt).*)" +}; " `; From 1268c9852016cf55f6cf93803066e2bd372f9db5 Mon Sep 17 00:00:00 2001 From: Marcos Passos Date: Fri, 27 Jun 2025 13:37:25 -0300 Subject: [PATCH 3/4] Remove unused properties --- src/infrastructure/application/cli/cli.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/infrastructure/application/cli/cli.ts b/src/infrastructure/application/cli/cli.ts index e091311d..e2440a09 100644 --- a/src/infrastructure/application/cli/cli.ts +++ b/src/infrastructure/application/cli/cli.ts @@ -1793,8 +1793,6 @@ export class Cli { module: '@croct/plug-next/middleware', middlewareName: 'middleware', middlewareFactoryName: 'withCroct', - configName: 'config', - matcherName: 'matcher', }, }), }), From a0a8970f6429e74e5e3309ab0d87e51384a726b8 Mon Sep 17 00:00:00 2001 From: Marcos Passos Date: Fri, 27 Jun 2025 13:40:32 -0300 Subject: [PATCH 4/4] Remove unused properties --- .../transformation/javascript/nextJsMiddlewareCodemod.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/application/project/code/transformation/javascript/nextJsMiddlewareCodemod.test.ts b/test/application/project/code/transformation/javascript/nextJsMiddlewareCodemod.test.ts index 79b90de4..4a5fe1dc 100644 --- a/test/application/project/code/transformation/javascript/nextJsMiddlewareCodemod.test.ts +++ b/test/application/project/code/transformation/javascript/nextJsMiddlewareCodemod.test.ts @@ -13,8 +13,6 @@ describe('NextJsMiddlewareCodemod', () => { module: '@croct/plug-next/middleware', middlewareFactoryName: 'withCroct', middlewareName: 'middleware', - matcherName: 'matcher', - configName: 'config', }, };