npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, πŸ‘‹, I’m Ryan HefnerΒ  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you πŸ™

Β© 2025 – Pkg Stats / Ryan Hefner

odi

v0.3.93

Published

πŸŒͺ🌌 Opinionated, Declarative, Idiomatic framework for building scalable, supportable, enterprise-grade applications.

Downloads

189

Readme

TypeScript framework for creating enterprise-grade (web) applications with simple and minimalistic API, that allows you to focus on business logic. Based on declarative and imperative programming, inspiried by ASP.NET / Spring.

Check Docs for more details.

Odi provides feature set for creation of easy supportable and scalable web applications.

Features Overview:

  • [x] MVC
  • [x] Full-typed DI / IoT
  • [x] Authentication
  • [x] WebSockets
  • [x] TypeORM integration
  • [ ] GraphQL
  • [ ] AOP
  • [ ] SSR

For future updates check Roadmap Got an idea, proposal or feature request? Feel free to Submit it!

Edit Odi

πŸš€ Getting Started

  1. Install npm package npm install odi --save

  2. Install reflect-metadata npm install reflect-metadata --save

  3. Import reflect-metadata (for example in index.ts): import "reflect-metadata";

  4. Enabled the following settings in tsconfig.json

    "emitDecoratorMetadata":  true, 
    "experimentalDecorators":  true

πŸŒͺ Overview

Controller

Controllers serve as a simple yet powerful routing mechanism in a minimalistic style.

@Controller('foo') 
export class FooController extends IController {      
        
    @RoutePatch('{id}')     
    bar(id: string, payload: FooDTO) {         
        ...some updates..          
        return Ok();     
    } 

    @Get index() {
        return 'Foo';
    }
} 

So, as you see, there no need to provide any additional param decorators for injection data from the HTTP request. It's just a small controller overview, there are a lot of other possibilities.You can read more in docs.

Dependency Injection

Odi has powerful dependency injection mechanism out of the box. (Let's imagine that we already have FooRepository)

//foo.service.ts
@Service()
export class FooService {
​
    @Autowired()
    repository: FooRepository;
​
    public getFoo(id: string) {
        return this.repository.findOne(id);
    }​
}


//foo.controller.ts
@Controller('foo')
export class OrderController extends IController {
​
    @Autowired()
    fooService: OrderService;
    
    @Get async '{id}' (id: string) {
        const foo = this.fooService.getFoo(id);
        
        if(!foo)
            return NotFound();

        return foo;
    }​
} 

As you can see, all dependencies will be automatically provided to all application components.

Currently, Odi support 3 ways of injection:

  • By constructor
  • By property
  • By method

Classes that are not Odi components can participate in DI. You can simply define behaviour with preset properties and constructor args.

class Pet {
    ...
}

​define(Pet)
    .set('default', {
        constructorArgs: [...],        
        props: {...},
        type: 'singleton'
    })
    .set('special', {
        constructorArgs: [...],        
        props: {...},
        type: 'scoped'
    });

DTO

It's a common scenario when web server should validate data before processing. DTO can optimize and automate this process.

@Data()
export class TodoDTO {
   
    @MaxLength(80)
    title: string;
    
    @IsOptional()
    @MaxLength(255)
    desctiption: string;
}

Then, DTO class should be added as an argument for the controller method

@Controller('todo')
export class TodoController extends IController {

    @Autowired()
    todoService: TodoService;   
     
    @Post async index(payload: TodoDTO) {
        ...
    }​
}

And it's all! Odi will automatically inject the validated request body in this argument. If there are some errors during validation, 400 status code will be sent with errors description.

Odi provides a wide set for DTO description, supporting nested DTOs, arrays, enums and etc.

To Sum up

It was a small overview of some features. If you interested in more, check the Docs.

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

License

MIT