Returns a list of method names and line number for a JavaScript or TypeScript module.
This module is used by the AdonisJs VsCode extension to show an autocomplete list of controller methods, event listeners and so on.
The module is tailored for AdonisJs only, which helps in optimizing the way we scan the source code AST.
Install the package from npm registry as follows:
import { Extractor } from '@poppinss/Extractor'
const extractor = new Extractor()
const response = extractor.extract(`
export default class UserController {
public async index () {
}
public async store () {
}
}
`)
assert.deepEqual(response, {
kind: 'class',
methods: [
{
name: 'index',
lineno: 2
},
{
name: 'store',
lineno: 5
},
]
})The module is written to work with AdonisJs, where modules are not imported explicitly but their filenames are passed as a reference. For example:
Route.get('users', 'UsersController.index')In the above example, The UsersController is an actual module that has a default export on the UserController class. AdonisJs behind the scenes will use its IoC container to lazy load this class and invoke the defined method.
- CommonJs
module.exportsandexportsare supported. - ESM
export defaultis supported. - Handle assignment references like
module.exports = exports = UserController. - Handle inline class declarations like
export default UserController {}. - Returns
linenofor all methods.
-
Named exports are not allowed, since they are also forbidden by the IoC container automatic bindings.
-
The export reference must be located as a top level property. For example:
const someObject = { prop: class UserController {} } export default someObject.prop
The above expression is not something we advocate in the AdonisJs eco-system and also it is not a great pattern to use either.
-
Only 3 levels deep assignments are supported.
// works module.exports = exports = UserController // works module.exports = exports = someFunc = UserController // does not work module.exports = exports = someFunc = someOtherFunc = UserController
