@dominion-framework/dominion

Declarative Promise based Node.js framework for REST API with zero dependencies.

Usage no npm install needed!

<script type="module">
  import dominionFrameworkDominion from 'https://cdn.skypack.dev/@dominion-framework/dominion';
</script>

README

Dominion Node.js framework for RESTfull APIs

Dominion Node.js framework for RESTfull APIs

Gitter install size

Declarative Promise based Node.js framework for RESTful API

Installation

npm i @dominion-framework/dominion

Quick start

npx dominion create hello
npm start

This will run Node.js server with demo API's. Open http://localhost:7042/hello to check results and examine generated files in folder components/hello to see how it works.

Documentation

Read full documentation on dominion.js.org.

Features highlight

Clear Endpoints Declaration

module.exports = {

    factory: BooksFactory,

    GET: [
        // books?genre=western
        function (genre = null) {
            return BooksFactory.find({genre});
        }
    ],

    POST: [
        // books/
        function () {
            return BooksFactory.new(this.request.body)
                .then(book => book.save());
        }
    ]
}

Automatic RESTful URLs

// Endpoint URLs is build based on function arguments:

function (limit = 10, offset = 0) { }
// https://api.example.com/books?limit=42&offset=21


function (libraryShelvesId, favoriteBooksId, orderBy = "") { }
// https://api.example.com/library-shelves/42/favorite-books/84?orderBy=+author

Models Schema Validation

{
    name: "Book",
    
    properties: {
        id: Property.id(),
        name: Property.string().min(1).required(),
        isbn: Property.string().pattern(/^\d-\d{3}-\d{5}-\d$/).example("0-330-25864-8"),
        authorId: Property.model("Author"),
        genre: Property.set(["Fantasy", "Science fiction", "Western", "Romance"]),
        creationTime: Property.date().private(),
        modificationTime: Property.date().private()
    }
    ...
}

Annotations

function(isbn) {
    // @path: books/isbn/(\d{1,5}[- ]\d{1,7}[- ]\d{1,6}[- ](?:\d|X))
    // @model: Books    
    // @summary: Get book by ISBN number
    
    return BooksFactory.get({isbn})
}

OpenAPI (Swagger) documentation

Automatic OpenAPI documentation based on source code.

Zero Dependencies

100Kb footprint Node.js framework with no npm dependencies. If you also think, that you don't need npm to left-pad a string.