Skip to content

najs-framework/najs

Repository files navigation

najs

Travis Coverage Status node version npm version npm downloads npm license PRs Welcome

Warning: This project is still In Progress

Purpose

I want to create a web framework with really Najs and elegant syntax like Laravel for Node Js, use Typescript.

Najs must have:

  1. Type-Safety: Written 100% in Typescript with strict rules
  2. Beautiful code: Use Class as must as possible, just like Java
  3. Reliable: Rely on strong and trusted frameworks such as express (for routing), bull (for Task Queue)
  4. High-Quality: Every single line of Najs must have unit test, coverage up to 100%

Syntax

This is the syntax looks like

Binding

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()
  }
}

Routing

Route.middleware('csrf', 'cors').group(function() {
  Route.get('/users/', 'UserController@getUsers')
})

Model

Please check out this package Najs Eloquent

Controller

// 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())
  }
}

Status and Road map

I. Class Binding (In Progress - 90%)

  • register() [Released] - register a class
  • singleton() [Released] - register a class as a singleton
  • make() [Released] - make an instance of class which registered by register()
  • 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]

Contribute

If you want to be a contributor, please let me know.