Skip to content

Commit ed3efb5

Browse files
committed
refactor: do not modify source file on duplicate entries
1 parent 1dec382 commit ed3efb5

File tree

3 files changed

+77
-37
lines changed

3 files changed

+77
-37
lines changed

src/code_transformer/main.ts

Lines changed: 50 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -76,29 +76,29 @@ export class CodeTransformer {
7676
/**
7777
* Delete the existing middleware if it exists
7878
*/
79-
const existingMiddleware = arrayLiteralExpression
79+
const existingMiddlewareIndex = arrayLiteralExpression
8080
.getElements()
8181
.findIndex((element) => element.getText() === middleware)
8282

83-
if (existingMiddleware !== -1) {
84-
arrayLiteralExpression.removeElement(existingMiddleware)
85-
}
86-
87-
/**
88-
* Add the middleware to the top or bottom of the array
89-
*/
90-
if (middlewareEntry.position === 'before') {
91-
arrayLiteralExpression.insertElement(0, middleware)
92-
} else {
93-
arrayLiteralExpression.addElement(middleware)
83+
if (existingMiddlewareIndex === -1) {
84+
/**
85+
* Add the middleware to the top or bottom of the array
86+
*/
87+
if (middlewareEntry.position === 'before') {
88+
arrayLiteralExpression.insertElement(0, middleware)
89+
} else {
90+
arrayLiteralExpression.addElement(middleware)
91+
}
9492
}
9593
}
9694

9795
/**
9896
* Add a new middleware to the named middleware of the given file
9997
*/
10098
#addToNamedMiddleware(file: SourceFile, middlewareEntry: AddMiddlewareEntry) {
101-
if (!middlewareEntry.name) throw new Error('Named middleware requires a name.')
99+
if (!middlewareEntry.name) {
100+
throw new Error('Named middleware requires a name.')
101+
}
102102

103103
const callArguments = file
104104
.getVariableDeclarationOrThrow('middleware')
@@ -118,20 +118,22 @@ export class CodeTransformer {
118118
* Check if property is already defined. If so, remove it
119119
*/
120120
const existingProperty = namedMiddlewareObject.getProperty(middlewareEntry.name)
121-
if (existingProperty) existingProperty.remove()
122-
123-
/**
124-
* Add the named middleware
125-
*/
126-
const middleware = `${middlewareEntry.name}: () => import('${middlewareEntry.path}')`
127-
namedMiddlewareObject!.insertProperty(0, middleware)
121+
if (!existingProperty) {
122+
/**
123+
* Add the named middleware
124+
*/
125+
const middleware = `${middlewareEntry.name}: () => import('${middlewareEntry.path}')`
126+
namedMiddlewareObject!.insertProperty(0, middleware)
127+
}
128128
}
129129

130130
/**
131131
* Write a leading comment
132132
*/
133133
#addLeadingComment(writer: CodeBlockWriter, comment?: string) {
134-
if (!comment) return writer.blankLine()
134+
if (!comment) {
135+
return writer.blankLine()
136+
}
135137

136138
return writer
137139
.blankLine()
@@ -202,7 +204,7 @@ export class CodeTransformer {
202204
throw new Error(`The second argument of Env.create is not an object literal.`)
203205
}
204206

205-
let firstAdded = false
207+
let shouldAddComment = true
206208

207209
/**
208210
* Add each variable validation
@@ -212,17 +214,32 @@ export class CodeTransformer {
212214
* Check if the variable is already defined. If so, remove it
213215
*/
214216
const existingProperty = objectLiteralExpression.getProperty(variable)
215-
if (existingProperty) existingProperty.remove()
216-
217-
objectLiteralExpression.addPropertyAssignment({
218-
name: variable,
219-
initializer: validation,
220-
leadingTrivia: (writer) => {
221-
if (firstAdded) return
222-
firstAdded = true
223-
return this.#addLeadingComment(writer, definition.leadingComment)
224-
},
225-
})
217+
218+
/**
219+
* Do not add leading comment if one or more properties
220+
* already exists
221+
*/
222+
if (existingProperty) {
223+
shouldAddComment = false
224+
}
225+
226+
/**
227+
* Add property only when the property does not exist
228+
*/
229+
if (!existingProperty) {
230+
objectLiteralExpression.addPropertyAssignment({
231+
name: variable,
232+
initializer: validation,
233+
leadingTrivia: (writer) => {
234+
if (!shouldAddComment) {
235+
return
236+
}
237+
238+
shouldAddComment = false
239+
return this.#addLeadingComment(writer, definition.leadingComment)
240+
},
241+
})
242+
}
226243
}
227244

228245
file.formatText(this.#editorSettings)

tests/__snapshots__/code_transformer.spec.ts.cjs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,3 +294,23 @@ export const middleware = router.named({
294294
})
295295
"`
296296

297+
exports[`Code transformer | addMiddlewareToStack > do not add duplicate named middleware 1`] = `"import router from '@adonisjs/core/services/router'
298+
import server from '@adonisjs/core/services/server'
299+
300+
server.errorHandler(() => import('#exceptions/handler'))
301+
302+
server.use([
303+
() => import('#middleware/container_bindings_middleware'),
304+
() => import('@adonisjs/session/session_middleware'),
305+
])
306+
307+
router.use([
308+
() => import('@adonisjs/core/bodyparser_middleware'),
309+
() => import('@adonisjs/shield/shield_middleware'),
310+
])
311+
312+
export const middleware = router.named({
313+
auth: () => import('#foo/bar.js')
314+
})
315+
"`
316+

tests/code_transformer.spec.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ test.group('Code transformer | addMiddlewareToStack', (group) => {
8888
assert.fileContains('start/kernel.ts', `rand: () => import('@adonisjs/random_middleware')`)
8989
})
9090

91-
test('override duplicates when adding router/server middleware', async ({ assert, fs }) => {
91+
test('do not add duplicate router/server middleware', async ({ assert, fs }) => {
9292
const transformer = new CodeTransformer(fs.baseUrl)
9393

9494
await transformer.addMiddlewareToStack('router', [
@@ -112,7 +112,7 @@ test.group('Code transformer | addMiddlewareToStack', (group) => {
112112
assert.equal(occurrences2, 1)
113113
})
114114

115-
test('override duplicates when adding named middelware', async ({ assert, fs }) => {
115+
test('do not add duplicate named middleware', async ({ assert, fs }) => {
116116
const transformer = new CodeTransformer(fs.baseUrl)
117117

118118
await transformer.addMiddlewareToStack('named', [{ name: 'auth', path: '#foo/bar.js' }])
@@ -158,7 +158,7 @@ test.group('Code transformer | defineEnvValidations', (group) => {
158158
assert.snapshot(file).match()
159159
})
160160

161-
test('should replace duplicates', async ({ assert, fs }) => {
161+
test('do not add duplicates', async ({ assert, fs }) => {
162162
const transformer = new CodeTransformer(fs.baseUrl)
163163

164164
await transformer.defineEnvValidations({
@@ -171,7 +171,10 @@ test.group('Code transformer | defineEnvValidations', (group) => {
171171
const occurrences = (file.match(/NODE_ENV/g) || []).length
172172

173173
assert.equal(occurrences, 1)
174-
assert.fileContains('start/env.ts', `NODE_ENV: Env.schema.string.optional()`)
174+
assert.fileContains(
175+
'start/env.ts',
176+
`Env.schema.enum(['development', 'production', 'test'] as const)`
177+
)
175178
})
176179
})
177180

0 commit comments

Comments
 (0)