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 🙏

© 2024 – Pkg Stats / Ryan Hefner

mvw-injection

v0.3.0

Published

Dependency Injection module for MV-Whatever patterns!

Downloads

26

Readme

MVW-Injection

Dependency Injection module for MV-Whatever patterns!

Follow the project

Installation

MVC patterns

Use the CDN version:

<script src="https://cdnjs.cloudflare.com/ajax/libs/mvw-injection/0.2.5/mvc-injection.min.js"></script>

Or copy the dist folder into your project and include mvc-injection.js or mvc-injection.min.js (production) file in your HTML page or your node project.

MVVM patterns

Use the CDN version:

<script src="https://cdnjs.cloudflare.com/ajax/libs/mvw-injection/0.2.5/mvvm-injection.min.js"></script>

Or copy the dist folder into your project and include mvvm-injection.js or mvvm-injection.min.js (production) file in your HTML page or your node project.

Standalone

If you want to apply you own patterns, you can use the base module.

Use the CDN version:

<script src="https://cdnjs.cloudflare.com/ajax/libs/mvw-injection/0.2.5/dependency-injection.min.js"></script>

Or copy the dist folder into your project and include dependency-injection.js or dependency-injection.min.js (production) file in your page HTML or your node project.

You can add you own interfaces with DependencyInjection.registerInterface().

How to use

Introduction

MVW-Injection offers a structure to use dependency injection in a MV-Whatever way, i.e. with any pattern you want. It comes with MVC and MVVM patterns that you can include in your projects. Each dependency is contained in a M, V, C or VM package and can only be used by a package which has the rights from the pattern (i.e. M dependencies can't be used by V and so on).

Node or Browser

The module can be used in node with:

npm install mvw-injection

Get the pattern you want:

var MVCInjection = require('mvw-injection').MVC();

var MVVMInjection = require('mvw-injection').MVVM();

var DependencyInjection = require('mvw-injection').Standalone();

It can be used in the browser too:

bower install mvw-injection

Then include in your page the pattern file you need and use window.DependencyInjection.

Create dependencies

According to the pattern used, you can create your packaged dependencies that will be injected later on.

Register a dependency:


// "model" is a method provided by the MVC pattern
// "User" is the defined name of the dependency
MVCInjection.model('User', function() {

  return function User(name) {
    this.name = name;
  };

});

When a package will need the User dependency, this function will be called once and return the User class. This function will never be called again as its result is cached. So any subsequent injection of the User dependency will return a reference to the first call generated dependency.

Inject dependencies

A dependency or a custom function called with invoke() can include dependencies that will be injected.

Register a dependency that needs an other dependency:


// "User" is the dependency created before.
// It is automatically executed and the result is sent to the "ActiveUser" service.
MVCInjection.service('ActiveUser', function(User) {

  function ActiveUser() {
    User.call(this, 'Xavier Boubert');
  }

  return new ActiveUser();

});

Execute a custom function which needs ActiveUser:


// Each pattern method can be used with an "injector":
// invoke() execute the function with dependencies injection
// The first argument is the current owner passed like
// Function.prototype.call() or Function.prototype.apply()
MVCInjection.injector.factory.invoke(this, function(ActiveUser) {

  // display "Xavier Boubert";
  console.log(ActiveUser.name);

});

When you invoke a function, you can pass custom dependencies in the second argument:


MVCInjection.injector.factory.invoke(this, function(MyCustomDept, ActiveUser) {
  // ...
}, {

  // Dependencies needs to be stacked in a declared interface
  view: {

    // This dependency will only be defined in the invoked function.
    // It can use other dependencies relative to its packaged interface.
    MyCustomDept: function(User) {
      return function MyCustomDept() {
        // ...
      };
    }
  }
});

:exclamation: If you want to minify your JavaScript files, you will run into an issue with injection, because the module extracts the required dependencies by their name (that can be obfuscated with some minification tools). To avoid this, you can use the following syntax:


// Use an Array with the dependencies in the right order and
// include the function at the end.
MVCInjection.service('ActiveUser', ['User', function(User) {

  // ...

}]);

Packaged dependencies

According to the pattern used, a dependency can't call dependencies that belongs to another kind of element.

For example, in the MVCInjection, a dependency registered in MVCInjection.model() does't have access to MVCInjection.view() dependencies.

See the next chapters to known all patterns details rules.

MVC

See details of the MVC pattern.

Models

| Dependency from | Used to | Can inject | | ----------------------- | ------------------------------------------- | ----------------------------------- | | model() | Create model classes | factory() and service() | | factory() | Instantiation of classes | model() and service() | | service() | Create singletons | model() and factory() |

Controllers

| Dependency from | Used to | Can inject | | ------------------ | ---------------- | -------------------------------------------------- | | controller() | Get user actions | model(), factory() and service() |

Views

| Dependency from | Used to | Can inject | | ----------------- | ------- | ----------- | | view() | Visible by the user | model(), factory(), service() and converter() | | converter() | Transform data for a view component | model(), factory(), service() and view() |

MVVM

See details of the MVVM pattern.

Models

| Dependency from | Used to | Can inject | | --------------- | ------- | ---------- | | model() | Create model classes | viewmodel(), factory() and service() | | factory() | Instantiation of classes | viewmodel(), model() and service() | | service() | Create singletons | viewmodel(), model() and factory() |

ViewModels

| Dependency from | Used to | Can inject | | --------------- | ------- | ---------- | | viewmodel() | Make the link between views and models | model(), factory(), service(), view() and converter() |

Views

| Dependency from | Used to | Can inject | | ----------------- | ------- | ----------- | | view() | Visible by the user | viewmodel() and converter() | | converter() | Transform data for a view component | viewmodel() and view() |

Create custom patterns

If you use the Standalone version, you can add your own patterns. Use DependencyInjection.registerInterface() to create new interfaces:


// Register the "model" as a new package method.
// The second argument is the list of other interfaces that "model" can inject their dependencies
DependencyInjection.registerInterface('model', ['viewmodel', 'factory', 'service']);

Contribute

To contribute to the project, read the Contribution guidelines. After that, you can create your own Pull Requests (PR) and submit them here.

Lead contribution team