Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.

Dependency injector, assembles application.

Registering, getting and setting components.

app.register 'component', -> 'some component'
console.log app.component
# => some component

app.component = 'another component'
console.log app.component
# => another component

Dependencies can be specified implicitly.

app.register 'a', ->
  console.log 'initializing a'
app.register 'b', ->
  console.log 'initializing b'
  "#{app.a} b"

console.log app.b
# => initializing b
# => initializing a
# => a b

Or explicitly. The only difference with implicit approach is that explicit declaration will resolve circular dependencies (implicit approach will fail).

app.register 'a', ->
  console.log 'initializing a'
app.register 'b', dependencies: ['a'], ->
  console.log 'initializing b'
  "#{app.a} b"

console.log app.b
# => initializing a
# => initializing b
# => a b

Component lifecycle callbacks.

app.register 'component', ->
  console.log 'initialization'
  'some component'
app.before 'component', -> console.log 'before initialization'
app.after 'component', -> console.log 'after initialization'

# => before initialization
# => initialization
# => after initialization


app.register 'params', scope: 'request', -> {}

startFiberSomehow ->
  app.scope 'request', ->
    app.params.key = 'some value'
    console.log app.params
    # => {key: 'some value'}

Scope callbacks.

app.beforeScope 'request', -> console.log 'before'
app.afterScope 'request', -> console.log 'after'

startFiberSomehow ->
  app.scope 'request', ->
  # => before
  # => after

Require files in directory, provide watch: true option to watch for changes and reload.

# /app/controllers/
# app.SomeController = 'some controller'

app.requireDirectory '/absolutePath/app/controllers', watch: true

console.log app.SomeController
# => some controller


  • Fiber and custom scopes will not work in browser because browsers doesn't support fibers.
  • Use app.get componentName instead of app.componentName in old browsers not supporting getters and setters syntax. Use set for setting components.

Copyright (c) Alexey Petrushin,, released under the MIT license.

Something went wrong with that request. Please try again.