najs
TypeScript icon, indicating that this package has built-in type declarations

0.5.4 • Public • Published

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.

Readme

Keywords

none

Package Sidebar

Install

npm i najs

Weekly Downloads

17

Version

0.5.4

License

MIT

Unpacked Size

770 kB

Total Files

405

Last publish

Collaborators

  • najs