Skip to content

Commit 5990137

Browse files
committed
feat: add support for creating barrel files without lazy imports
1 parent fdb509f commit 5990137

File tree

4 files changed

+72
-5
lines changed

4 files changed

+72
-5
lines changed

src/index_generator/source.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,12 @@ export class IndexGeneratorSource {
8282
const buffer = new FileBuffer()
8383

8484
if (this.#config.as === 'barrelFile') {
85-
this.#asBarrelFile(this.#vfs, buffer, this.#config.exportName)
85+
this.#asBarrelFile(
86+
this.#vfs,
87+
buffer,
88+
this.#config.exportName,
89+
this.#config.disableLazyImports
90+
)
8691
} else {
8792
this.#config.as(this.#vfs, buffer, this.#config, {
8893
toImportPath: this.#createBarrelFileImportGenerator(
@@ -206,8 +211,15 @@ export class IndexGeneratorSource {
206211
* @param buffer - File buffer to write the barrel exports to
207212
* @param exportName - Name for the main export object
208213
*/
209-
#asBarrelFile(vfs: VirtualFileSystem, buffer: FileBuffer, exportName: string) {
214+
#asBarrelFile(
215+
vfs: VirtualFileSystem,
216+
buffer: FileBuffer,
217+
exportName: string,
218+
disableLazyImports?: boolean
219+
) {
220+
const useEagerImports = disableLazyImports === true ? true : false
210221
const keyGenerator = this.#createBarrelFileKeyGenerator(this.#config)
222+
const importsBuffer = buffer.create()
211223
const importGenerator = this.#createBarrelFileImportGenerator(
212224
this.#source,
213225
this.#outputDirname,
@@ -216,11 +228,19 @@ export class IndexGeneratorSource {
216228

217229
const tree = vfs.asTree({
218230
transformKey: keyGenerator,
219-
transformValue: (filePath) => {
231+
transformValue: (filePath, key) => {
232+
if (useEagerImports) {
233+
const importKey = new StringBuilder(key).pascalCase().toString()
234+
importsBuffer.write(`import ${importKey} from '${importGenerator(filePath)}'`)
235+
return importKey
236+
}
220237
return `() => import('${importGenerator(filePath)}')`
221238
},
222239
})
223240

241+
if (useEagerImports) {
242+
buffer.writeLine(importsBuffer)
243+
}
224244
buffer.write(`export const ${exportName} = {`).indent()
225245
this.#treeToString(tree, buffer)
226246
buffer.dedent().write(`}`)

src/types/common.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ export type IndexGeneratorSourceConfig = (
3636
| {
3737
exportName: string
3838
as: 'barrelFile'
39+
/**
40+
* Disable the use of lazy imports and instead import the
41+
* files using the import expression
42+
*/
43+
disableLazyImports?: boolean
3944
}
4045
| {
4146
as: (

src/virtual_file_system.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,14 +176,15 @@ export class VirtualFileSystem {
176176
*/
177177
asTree(options?: {
178178
transformKey?: (key: string) => string
179-
transformValue?: (filePath: string) => string
179+
transformValue?: (filePath: string, key: string) => string
180180
}) {
181181
const list: RecursiveFileTree = {}
182182
const transformKey = options?.transformKey ?? BYPASS_FN
183183
const transformValue = options?.transformValue ?? BYPASS_FN
184184

185185
for (const [filePath, relativePath] of this.#files) {
186-
lodash.set(list, transformKey(relativePath).split('/'), transformValue(filePath))
186+
const key = transformKey(relativePath)
187+
lodash.set(list, key.split('/'), transformValue(filePath, key))
187188
}
188189

189190
return list

tests/index_generator.spec.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,4 +257,45 @@ test.group('Index generator', () => {
257257
}"
258258
`)
259259
})
260+
261+
test('create index from without lazy imports', async ({ assert, fs }) => {
262+
const outputPath = '.adonisjs/backend/controllers.ts'
263+
const source = string.toUnixSlash(fs.basePath)
264+
265+
await fs.create('app/controllers/posts_controller.ts', '')
266+
await fs.create('app/controllers/user/posts_controller.ts', '')
267+
await fs.create('app/controllers/auth/signup_controller.ts', '')
268+
await fs.create('app/controllers/public/home_page.ts', '')
269+
270+
const transformer = new IndexGenerator(source, ui.logger)
271+
transformer.add('controllers', {
272+
as: 'barrelFile',
273+
disableLazyImports: true,
274+
exportName: 'controllers',
275+
output: outputPath,
276+
source: 'app/controllers',
277+
importAlias: '#controllers',
278+
})
279+
await transformer.generate()
280+
281+
assert.snapshot(await fs.contents(outputPath)).matchInline(`
282+
"import AuthSignupController from '#controllers/auth/signup_controller'
283+
import PostsController from '#controllers/posts_controller'
284+
import PublicHomePage from '#controllers/public/home_page'
285+
import UserPostsController from '#controllers/user/posts_controller'
286+
287+
export const controllers = {
288+
auth: {
289+
SignupController: AuthSignupController,
290+
},
291+
PostsController: PostsController,
292+
public: {
293+
HomePage: PublicHomePage,
294+
},
295+
user: {
296+
PostsController: UserPostsController,
297+
},
298+
}"
299+
`)
300+
})
260301
})

0 commit comments

Comments
 (0)