I want to create a web framework with really Najs
and elegant syntax like Laravel for Node Js, use Typescript.
Najs must have:
- Type-Safety: Written 100% in Typescript with strict rules
- Beautiful code: Use Class as must as possible, just like Java
- Reliable: Rely on strong and trusted frameworks such as
express
(for routing),bull
(for Task Queue) - High-Quality: Every single line of
Najs
must have unit test, coverage up to100%
This is the syntax looks like
Register a class
// file: UserRepository.ts
import { register } from 'najs'
import { User } from './User' // please checkout najs-eloquent package
@register()
class UserRepository {
static className = 'Namespace.UserRepository'
async getUsers(): Promise<User> {
return User.all()
}
}
Extend class
// file: UserRepositoryCached.ts
import { register } from 'najs'
@register()
class UserRepositoryCached extends UserRepository {
static className = 'Namespace.UserRepositoryCached'
async getUsers(): Promise<User> {
return this.cacheManager.cache('getUsers', 10, () => {
return super.getUsers()
})
}
}
Bind class
// file: index.ts
import { Najs, make } from 'najs'
// before binding return instance of UserRepository
make('Namespace.UserRepository')
Najs.bind('Namespace.UserRepository', 'Namespace.UserRepositoryCached')
// after binding return instance of UserRepositoryCached
make('Namespace.UserRepository')
Autoload
// file: UserService.ts
import { autoload, register } from 'najs'
import { UserRepository } from './UserRepository'
@register()
class UserService {
static className = 'Namespace.UserService'
// this autoload UserRepository instance, if you already binding in index.ts it loads UserRepositoryCached instead
@autoload(UserRepository) userRepository: UserRepository
async getUsers(): Promise<User> {
return this.userRepository.getUsers()
}
}
Route.middleware('csrf', 'cors').group(function() {
Route.get('/users/', 'UserController@getUsers')
})
Please check out this package Najs Eloquent
// file: UserController.ts
import { autoload, register, Controller, Response } from 'najs'
import { UserService } from './UserService'
@register()
class UsersController extends Controller {
static className = 'Namespace.Controller'
@autoload(UserService) userService: UserService
async getUsers(): Promise<User> {
return Response.json(this.userService.getUsers())
}
getIndex(): any {
return Response.view('users').with('currentUser', this.Auth.user())
}
}
I. Class Binding (In Progress - 90%)
register()
[Released] - register a classsingleton()
[Released] - register a class as a singletonmake()
[Released] - make an instance of class which registered byregister()
bind()
[Release] - simple binding (primitives binding is delayed)
II. Model [Released] - It's developed and released in separate package Najs Eloquent
III. Routing [Released] - I'm going to use express
as a routing framework
IV. Controller & Endpoint [Released]
V. Session & Cookie [In Progress]
If you want to be a contributor, please let me know.