Skip to content

Commit 242c612

Browse files
committed
feat: handle duplicates in addMiddlewareToStack
1 parent 9537d50 commit 242c612

File tree

3 files changed

+84
-0
lines changed

3 files changed

+84
-0
lines changed

src/code_transformer/main.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,20 @@ export class CodeTransformer {
7373

7474
const middleware = `() => import('${middlewareEntry.path}')`
7575

76+
/**
77+
* Delete the existing middleware if it exists
78+
*/
79+
const existingMiddleware = arrayLiteralExpression
80+
.getElements()
81+
.findIndex((element) => element.getText() === middleware)
82+
83+
if (existingMiddleware !== -1) {
84+
arrayLiteralExpression.removeElement(existingMiddleware)
85+
}
86+
87+
/**
88+
* Add the middleware to the top or bottom of the array
89+
*/
7690
if (middlewareEntry.position === 'before') {
7791
arrayLiteralExpression.insertElement(0, middleware)
7892
} else {
@@ -100,6 +114,15 @@ export class CodeTransformer {
100114
throw new Error('The argument of the named middleware call is not an object literal.')
101115
}
102116

117+
/**
118+
* Check if property is already defined. If so, remove it
119+
*/
120+
const existingProperty = namedMiddlewareObject.getProperty(middlewareEntry.name)
121+
if (existingProperty) existingProperty.remove()
122+
123+
/**
124+
* Add the named middleware
125+
*/
103126
const middleware = `${middlewareEntry.name}: () => import('${middlewareEntry.path}')`
104127
namedMiddlewareObject!.insertProperty(0, middleware)
105128
}
@@ -185,6 +208,9 @@ export class CodeTransformer {
185208
* Add each variable validation
186209
*/
187210
for (const [variable, validation] of Object.entries(definition.variables)) {
211+
/**
212+
* Check if the variable is already defined. If so, remove it
213+
*/
188214
const existingProperty = objectLiteralExpression.getProperty(variable)
189215
if (existingProperty) existingProperty.remove()
190216

tests/__snapshots__/code_transformer.spec.ts.cjs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,3 +274,23 @@ export default defineConfig({
274274
})
275275
"`
276276

277+
exports[`Code transformer | addMiddlewareToStack > override duplicates when adding named middelware 1`] = `"import router from '@adonisjs/core/services/router'
278+
import server from '@adonisjs/core/services/server'
279+
280+
server.errorHandler(() => import('#exceptions/handler'))
281+
282+
server.use([
283+
() => import('#middleware/container_bindings_middleware'),
284+
() => import('@adonisjs/session/session_middleware'),
285+
])
286+
287+
router.use([
288+
() => import('@adonisjs/core/bodyparser_middleware'),
289+
() => import('@adonisjs/shield/shield_middleware'),
290+
])
291+
292+
export const middleware = router.named({
293+
auth: () => import('#foo/bar3.js')
294+
})
295+
"`
296+

tests/code_transformer.spec.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,44 @@ test.group('Code transformer | addMiddlewareToStack', (group) => {
8787
assert.fileContains('start/kernel.ts', `auth: () => import('#foo/bar.js')`)
8888
assert.fileContains('start/kernel.ts', `rand: () => import('@adonisjs/random_middleware')`)
8989
})
90+
91+
test('override duplicates when adding router/server middleware', async ({ assert, fs }) => {
92+
const transformer = new CodeTransformer(fs.baseUrl)
93+
94+
await transformer.addMiddlewareToStack('router', [
95+
{ path: '@adonisjs/core/bodyparser_middleware' },
96+
])
97+
98+
await transformer.addMiddlewareToStack('server', [
99+
{ path: '#middleware/container_bindings_middleware' },
100+
])
101+
102+
const file = await fs.contents('start/kernel.ts')
103+
const occurrences = (
104+
file.match(/() => import\('@adonisjs\/core\/bodyparser_middleware'\)/g) || []
105+
).length
106+
107+
const occurrences2 = (
108+
file.match(/() => import\('#middleware\/container_bindings_middleware'\)/g) || []
109+
).length
110+
111+
assert.equal(occurrences, 1)
112+
assert.equal(occurrences2, 1)
113+
})
114+
115+
test('override duplicates when adding named middelware', async ({ assert, fs }) => {
116+
const transformer = new CodeTransformer(fs.baseUrl)
117+
118+
await transformer.addMiddlewareToStack('named', [{ name: 'auth', path: '#foo/bar.js' }])
119+
120+
await transformer.addMiddlewareToStack('named', [
121+
{ name: 'auth', path: '#foo/bar2.js' },
122+
{ name: 'auth', path: '#foo/bar3.js' },
123+
])
124+
125+
const file = await fs.contents('start/kernel.ts')
126+
assert.snapshot(file).match()
127+
})
90128
})
91129

92130
test.group('Code transformer | defineEnvValidations', (group) => {

0 commit comments

Comments
 (0)