N
Nuxt3w ago
bnason

Provide function for module

What would be the best way for the user to provide a custom function for a module? The module will execute the function from a registered server routes defineEventHandler I also don't want it set in the nuxt.config.ts
11 Replies
kapa.ai
kapa.ai3w ago
Hi @bnason. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave: ---------------------- The knowledge sources do not provide a built-in or recommended way for a Nuxt module to accept a user-provided function (not set in nuxt.config.ts) and then execute it from a registered server route. The standard approaches for module configuration involve passing options via nuxt.config.ts or using runtime config, but not direct function injection at runtime from the app side. However, you can consider these patterns based on the available documentation: 1. Custom Directory for Server Utilities or Composables
You can instruct users to place their custom functions in a specific directory (e.g., ~/server/utils or a custom directory added via addServerScanDir or addServerImportsDir). Your module can then import and use these functions in its server handlers. This approach keeps user code separate and does not require nuxt.config.ts changes, but it does require users to follow a convention for file placement. Example using addServerScanDir:
import { defineNuxtModule, createResolver, addServerScanDir } from '@nuxt/kit'

export default defineNuxtModule({
setup(options) {
const { resolve } = createResolver(import.meta.url)
addServerScanDir(resolve('./runtime/server'))
}
})

import { defineNuxtModule, createResolver, addServerScanDir } from '@nuxt/kit'

export default defineNuxtModule({
setup(options) {
const { resolve } = createResolver(import.meta.url)
addServerScanDir(resolve('./runtime/server'))
}
})

The user would then add their function in a file inside the specified directory, and your module's route handler could import and use it as needed.
addServerScanDir API docs 2. Auto-imported Server Composables
Similarly, you can use addServerImportsDir to allow users to define composables that your module can auto-import and use in server routes. addServerImportsDir API docs 3. No Direct API for Function Injection
There is no documented API for passing a function directly from the app to a module at runtime, outside of nuxt.config.ts or environment variables. Summary:
The best documented approach is to have users place their custom function in a known server directory (e.g., ~/server/utils), and your module can import and execute it from there. This avoids the need to set it in nuxt.config.ts and keeps the function available to your server route handlers. There is no built-in Nuxt mechanism for direct function injection into a module at runtime according to the current documentation. If you need more dynamic or advanced patterns, you may need to implement your own conventions or APIs, but these are not covered in the official docs. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai3w ago
<@712351223482810390> Kapa.ai is still learning and improving, please let me know how I did by reacting below.
bnason
bnasonOP3w ago
@kapa.ai can the plugin provide a function or some mechanism for the user to register the function inside a plugin?
kapa.ai
kapa.ai3w ago
Let me check the knowledge base for you again. One moment! :books: ---------------------- Based on the available knowledge sources, Nuxt plugins can provide helpers or functions to the app by returning them in the provide property. This makes the function accessible via useNuxtApp() or as a global property (e.g., this.$myFunction in components). For example:
export default defineNuxtPlugin(() => {
return {
provide: {
myFunction: (msg: string) => `Hello ${msg}!`
}
}
})
export default defineNuxtPlugin(() => {
return {
provide: {
myFunction: (msg: string) => `Hello ${msg}!`
}
}
})
Users can then access this function in their components or other plugins:
const { $myFunction } = useNuxtApp()
const { $myFunction } = useNuxtApp()
or in a template:
{{ $myFunction('world') }}
{{ $myFunction('world') }}
Using Composables and Providing Helpers However, the knowledge sources do not describe a built-in mechanism for a plugin to expose a "registration" API that allows users to dynamically register their own functions into the plugin at runtime. Plugins are initialized before the app starts, and their helpers are provided at that time. If you want users to register functions, you would need to expose a method via the plugin's provide property that allows users to register their own callbacks, for example:
export default defineNuxtPlugin(() => {
const callbacks: Array<Function> = []

return {
provide: {
registerCallback: (fn: Function) => callbacks.push(fn),
runCallbacks: (...args) => callbacks.forEach(fn => fn(...args))
}
}
})
export default defineNuxtPlugin(() => {
const callbacks: Array<Function> = []

return {
provide: {
registerCallback: (fn: Function) => callbacks.push(fn),
runCallbacks: (...args) => callbacks.forEach(fn => fn(...args))
}
}
})
But this pattern is not explicitly documented in the official sources, so you would be implementing a custom solution. The official documentation recommends using composables for most extensibility needs and providing helpers only when necessary to avoid polluting the global namespace. In summary:
- Plugins can provide functions for users to call. - There is no documented, built-in mechanism for plugins to let users register functions into the plugin at runtime, but you can implement such a pattern yourself if needed. - Prefer composables for extensibility when possible. Reference: Using Composables and Providing Helpers ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai3w ago
<@712351223482810390> Kapa.ai is still learning and improving, please let me know how I did by reacting below.
bnason
bnasonOP3w ago
@kapa.ai this would need to be server side
kapa.ai
kapa.ai3w ago
Let me check the knowledge base for you again. One moment! :books: ---------------------- For server-side extensibility, the official Nuxt documentation does not describe a built-in mechanism for a server plugin to expose a function that allows users to register their own functions at runtime from within another plugin or composable. Server plugins (Nitro plugins) are initialized at server start, and their behavior is typically defined statically in code, not dynamically at runtime by user registration. The closest documented approach is to have users define their own server utilities or composables in a known directory (such as ~/server/utils), and your module or plugin can import and use these functions as needed. You can use addServerScanDir or addServerImportsDir in your module to ensure these directories are scanned and their exports are available for import in your server handlers or plugins. This allows for extensibility, but not dynamic registration at runtime from within a plugin:
import { defineNuxtModule, createResolver, addServerImportsDir } from '@nuxt/kit'

export default defineNuxtModule({
setup(options) {
const { resolve } = createResolver(import.meta.url)
addServerImportsDir(resolve('./runtime/server/composables'))
}
})
import { defineNuxtModule, createResolver, addServerImportsDir } from '@nuxt/kit'

export default defineNuxtModule({
setup(options) {
const { resolve } = createResolver(import.meta.url)
addServerImportsDir(resolve('./runtime/server/composables'))
}
})
addServerImportsDir API docs If you want to allow users to provide a function, you would instruct them to export it from a file in a known location, and then your server-side code can import and use it. There is no documented way to register a function at runtime via a server plugin. Summary:
- There is no built-in, documented way for a server-side plugin to provide a registration API for user functions at runtime. - The recommended approach is for users to export their functions from a known server directory, which your module or plugin can then import and use. If you need more dynamic registration, you would need to implement a custom solution, but this is not covered in the official documentation. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai3w ago
<@712351223482810390> Kapa.ai is still learning and improving, please let me know how I did by reacting below.
bnason
bnasonOP3w ago
@kapa.ai can I extend the nitroApp definition, for instance by adding a $myModule property?
kapa.ai
kapa.ai3w ago
Let me check the knowledge base for you again. One moment! :books: ---------------------- The knowledge sources do not explicitly document a way to extend the nitroApp instance (used in Nitro plugins) with custom properties such as $myModule. The official examples for Nitro plugins show how to hook into Nitro lifecycle events using nitroApp.hooks, but do not demonstrate or mention extending the nitroApp object with additional properties or methods addServerPlugin API docs. In contrast, on the client and general Nuxt app side, you can extend the Nuxt app context using the provide method in Nuxt plugins, making properties available via useNuxtApp() useNuxtApp composable docs. However, this pattern is not documented for Nitro's nitroApp. Summary:
I'm sorry, but the knowledge sources do not contain information about extending the nitroApp instance with custom properties like $myModule. If you need this functionality, you may need to experiment or consult Nitro's own documentation, as it is not covered in the official Nuxt docs provided here. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai3w ago
<@712351223482810390> Kapa.ai is still learning and improving, please let me know how I did by reacting below.

Did you find this page helpful?