Assembler hooks
Assembler hooks are a way of executing code at specific points in the assembler lifecycle. As a reminder, the Assembler is a part of AdonisJS that enables you to launch your dev server, build your application, and run your tests.
These hooks can be helpful for tasks such as file generation, code compilation, or injecting custom build steps.
For example, the @adonisjs/vite
package uses the onBuildStarting
hook to inject a step where front-end assets are built. So, when you run node ace build
, the @adonisjs/vite
package will build your front-end assets before the rest of the build process. This is a good example of how hooks can be used to customize the build process.
Adding a hook
Assembler hooks are defined in the adonisrc.ts
file, in the hooks
key :
import { defineConfig } from '@adonisjs/core/app'
export default defineConfig({
hooks: {
onBuildCompleted: [
() => import('my-package/hooks/on_build_completed')
],
onBuildStarting: [
() => import('my-package/hooks/on_build_starting')
],
onDevServerStarted: [
() => import('my-package/hooks/on_dev_server_started')
],
onSourceFileChanged: [
() => import('my-package/hooks/on_source_file_changed')
],
},
})
Several hooks can be defined for each stage of the assembly lifecycle. Each hook is an array of functions to be executed.
We recommend using dynamic imports to load hooks. It ensures that hooks are not loaded unnecessarily but only when needed. If you write your hook code directly in the adonisrc.ts
file, this may slow down the start-up of your application.
Create a hook
A hook is just a simple function. Let's take an example of a hook that is supposed to execute a custom build task.
import type { AssemblerHookHandler } from '@adonisjs/core/types/app'
const buildHook: AssemblerHookHandler = async ({ logger }) => {
logger.info('Generating some files...')
await myCustomLogic()
}
export default buildHook
Note that the hook must be exported by default.
Once this hook has been defined, all you have to do is add it to the adonisrc.ts
file like this:
import { defineConfig } from '@adonisjs/core/app'
export default defineConfig({
hooks: {
onBuildStarting: [
() => import('./hooks/on_build_starting')
],
},
})
And now, every time you run node ace build
, the onBuildStarting
hook will be executed with the custom logic you defined.
Hooks list
Here's the list of available hooks:
onBuildStarting
This hook is executed before the build starts. It is helpful for tasks such as file generation or for injecting custom build steps.
onBuildCompleted
This hook is executed once the build is complete. It can also be used to customize the build process.
onDevServerStarted
This hook is executed once the Adonis dev server is started.
onSourceFileChanged
This hook is executed each time a source file (included by your tsconfig.json
) is modified. Your hook will receive the path of the modified file as an argument.