nodefony

    6.6.0 • Public • Published


    NODEFONY V6

    npm package

    Issues Status Build Status CII Best Practices

    Nodefony is Node.js full-stack web framework.

    Nodefony can be used to develop a complete solution to create a Fullstack Web Application, Secure Api, or Microservices.

    The Nodefony project is inspired by the PHP Symfony framework, a developer can find most of the concepts, configurations and patterns of Symfony framework.

    Nodefony is not an exhaustive port of symfony !

    Table of content

    Nodefony features :

    • Servers (http(s), websocket(s), statics, sockjs)
    • HTTP2 ready node module provides an implementation of the HTTP/2 (push server ready).
    • Dynamics routing
    • ORM Sequelize
    • ORM mongoose
    • Simple Databases Services connections (Redis, Mongo, Elasticsearch, mysql, sqlite ...).
    • MVC Templating Server Side (Twig)
    • Notion of real-time context in Action Controller (websocket).
    • Notion of synchronous or asynchronous execution in Action Controller (Promise, Async, Await).
    • Services Containers, Dependency Injection (Design Patterns)
    • Sessions Manager (ORM, Memcached)
    • Authentication Manager (Digest, Basic, oAuth, Local, ldap, jwt, openid, passportjs)
    • WAF ( Web application firewall )
    • Cross-Origin Resource Sharing (CORS)
    • Production Management (PM2)
    • RealTime API (Bayeux Protocol)
    • Webpack Assets management (Like WDS with HMR hot module Replacement)
    • C++ Addons (Binding in Bundle)
    • Translations
    • CLI (Command Line Interface)
    • Monitororing , Debug Bar
    • Unit Test Api in framework context (MOCHA)

    Nodefony assimilates into the ecosystem of node.js with services like :

    • WEBPACK Module bundler for assets management of application .
    • SockJS Server ( Like WDS 'Webpack Dev Server' and HMR management )
    • WATCHER node.js for auto reload-files in developement mode .
    • PM2 Production Process Manager for Node.js .
    • Passport Simple, unobtrusive authentication for Node.js .
    • Angular Experimental Bundle Generator ( Angular cli no longer allows the ejection of a webpack config)

    Nodefony 6 adds the following features :

    • React Experimental Bundle Generator ( Now an React Project can be merge into a Nodefony Bundle )
    • Vue.js Experimental Bundle Generator ( Now an Vue.js Project can be merge into a Nodefony Bundle )
    • Api swagger-ui ( Documentation Api with swagger and openapi AOS3)
    • Api graphql ( Documentation Api with graphiql)

    Evolution priorities for the next version will focus on robustness, unit testing, documentation and security.

    Nodefony is ported with ECMAScript 6 ( Class, Inheritance ).

    You can follow Nodefony build with github actions at https://github.com/nodefony/nodefony/actions

    Resources for Newcomers

    - Nodefony Starter Demo

    - Nodefony CORE

    - Nodefony Documentation

    Documentation in progress !!

    Requirements

    On your system you must have Installed :

    • GIT is Distributed version control system

    • Node.js ® is a Platform built on Chrome's JavaScript runtime ( >= 8 )

    • npm or yarn Packages Manager for javascript application

    • nvm Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions

    • OpenSSL Toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols

    • GNU Bash Bash is the GNU Project's shell

    Operating Systems :

    • LINUX

      • Debian, Ubuntu (Checked, Tested)
      • RASPBIAN Raspberry Pi (Checked)
    • MACOS (Checked, Tested)

    • WINDOWS (Checked)

    • FreeBSD (Checked)

      • pkg install bash gmake gcc6
      • setenv CC "/usr/local/bin/gcc"
      • setenv CXX "/usr/local/bin/g++"
      • cd /usr/local/bin/ ;ln -s pythonx.x python
    • OpenBSD (Not Checked yet )

    • ELECTRON Experimental Nodefony Electron ( Now an Electron Context can be use in Nodefony Project )

    • EMBEDDED SYSTEM ( Very difficult : large memory footprint )

    Linux or OSX Installation (Recommanded)

    NVM Installation (Node Version Manager ) :

    • NVM Node Version Manager - Simple bash script to manage multiple active node.js versions

    To install or update nvm, you can use the install script:

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
    # or
    wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
    
    $ source ~/.bashrc # or source ~/.bash_profile
    $ nvm ls-remote # show all remote versions  
    $ nvm ls # show local versions

    Node.js Installation with NVM :

    nvm install node # "node" is an alias for the latest version

    Nodefony Excutable Installation (Globally) :

    npm -g install nodefony
    
    # or with yarn
    
    yarn global add nodefony

    Error that you can usually find :

    Windows Installation

    Node.js Installation : nvm-windows to easily switch Node versions between different projects. or To install or update Node.js, you can download installer here Node.js

    Nodefony Installation :

    Launch a CMD terminal

    npm -g install nodefony
    
    # or with yarn
    
    yarn global add nodefony

    Add NPM global bin in $Path windows :

    On the Windows System Property Menu, configure Path environment variable by adding :

    C:\Users\myuser\AppData\Roaming\npm
    or
    C:\Users\myuser\AppData\Roaming\npm\bin

    Use nodefony cli:

    Cli command when use Global installation

    $ nodefony -v
    6.0.0

    Cli command when By using yarn or npm in trunk

    #Or by using yarn
    yarn run nodefony
    
    #Or by using npm
    npm run nodefony

    By using npx note: npx is included with npm > v5.2 or can be installed separately.

    npx nodefony

    The long way with the full path

    ./node_modules/.bin/nodefony
    #Or with the shortcut using npm bin
    $(npm bin)/nodefony

    Build Project with nodefony cli (recommended):

    Cli Usage INTERACTIVE MODE :

    YOU CAN USE CLI INTERACTIVE MODE (nodefony without args) :

    $ nodefony
    
    ?  Nodefony CLI :  (Use arrow keys)
    ❯ Create Nodefony Web Project
    Create Micro Service Project
    PM2 Tools
    --------
    Help
    Quit

    Cli Usage NO INTERRATIVE :

    YOU CAN USE CLI NO INTERACTIVE (nodefony with args) :

    #  CLI generate project name : myproject
    
    $ nodefony create myproject
    $ cd myproject

    Cli Help :

    $ nodefony -h
    
    nodefony                                                                                              
        create [-i] name [path]                       Create New Nodefony Project                  

    Build Project with Github Starter :

    CLI :

    Clone nodefony starter

    $ git clone https://github.com/nodefony/nodefony-starter.git
    $ cd nodefony
    $ nodefony build
      ...
      ...
    $ npm start

    CLI INTERATIVE :

    YOU CAN USE CLI INTERACTIVE MODE TO BUILD PROJECT (nodefony without args)

    $ git clone https://github.com/nodefony/nodefony-starter.git
    $ cd nodefony
    $ ls -l
    -rw-r--r--     1 cci  staff   21306 27 mar 19:22 README.md
    drwxr-xr-x    12 cci  staff     384 27 mar 19:25 app
    drwxr-xr-x     3 cci  staff      96 27 mar 19:22 bin
    drwxr-xr-x     7 cci  staff     224 27 mar 19:26 config
    drwxr-xr-x     3 cci  staff      96 27 mar 19:22 doc
    drwxr-xr-x  1342 cci  staff   42944 27 mar 19:24 node_modules
    -rw-r--r--     1 cci  staff     997 27 mar 19:22 package.json
    drwxr-xr-x     3 cci  staff      96 27 mar 19:22 src
    drwxr-xr-x     4 cci  staff     128 29 mar 11:13 tmp
    drwxr-xr-x    12 cci  staff     384 29 mar 11:01 web
    -rw-r--r--     1 cci  staff  542660 27 mar 19:24 yarn.lock
    
    $ nodefony
    
    ?  Nodefony CLI :  (Use arrow keys)
    ❯ Build Project
     Generater
     Tools
     PM2 Tools
     --------
     Help
     Quit

    Serving a Nodefony project via an development server

    Starting Development Servers :

    $ nodefony dev
    
    # TO STOP
    $ <ctrl-c>

    Starting Development Servers in Debug Mode (-d) :

    $ nodefony -d dev
    
    # TO STOP
    $ <ctrl-c>

    OR YOU CAN USE CLI INTERACTIVE MODE (nodefony without args)

     _   _    ___    ____    _____   _____    ___    _   _  __   __
    | \ | |  / _ \  |  _ \  | ____| |  ___|  / _ \  | \ | | \ \ / /
    |  \| | | | | | | | | | |  _|   | |_    | | | | |  \| |  \ V /
    | |\  | | |_| | | |_| | | |___  |  _|   | |_| | | |\  |   | |  
    |_| \_|  \___/  |____/  |_____| |_|      \___/  |_| \_|   |_|  
    
    Version : 4.0.0 Platform : linux  Process : nodefony PID : 31635
    
    Fri Jul 27 2018 17:01:11 INFO nodefony : WELCOME PROJECT : myproject 1.0.0
    
    ?  Nodefony CLI :  
    ❯ Start Servers Development
      Start Servers Pre-Production
      Start Servers Production
      Install Project
      Rebuild Project
      Generater
      Tools
      PM2 Tools
      Run Test
      --------
      Help
      Quit

    Starting Development Servers in Inspector mode (--inspect) :

    Nodejs Debugging Guide

    $ npm -g install npx
    
    $ npx --node-arg=--inspect nodefony dev
    // new version npx > 7
    $ npx --node-options=--inspect nodefony dev
    
    # check chrome://inspect in your browser

    Serving a Nodefony Project via a Production server :

    Starting a Nodefony project with PM2 :

    $ nodefony prod
    or
    $ nodefony start

    Tools PM2 You can see PM2 config : config/pm2.config.js

    # To See log
    $ nodefony logs
    
    # To List Status of Production projects
    $ nodefony list
    
    # TO KILL PM2 DEAMON
    $ nodefony kill
    
    # TO STOP APPLICATION WITHOUT KILL PM2 DEAMON
    $ nodefony stop
    
    # YOU can use all pm2 command by using
    $ yarn pm2 monit
    $ yarn pm2 [list|ls|status]
    $ yarn pm2 stop all
    or
    $ npm run pm2 logs --lines 200

    Checking a Nodefony Project Pre-Production (Usefull to check Clusters Node) :

    $ nodefony preprod

    Serving a Nodefony project with HTTPS or WSS

    By default nodefony listen secure port in 5152 @see config/config.js

    During the installation process all the openssl parts were generated ( self-signed localhost certificate ).

    You can Change default openssl configuration in :

    ls -l config/openssl
    
    ├── ca
    │   └── openssl.cnf
    └── ca_intermediate
        └── openssl.cnf

    You must Add a Trusted CA in your Browser : projectName-root-ca.crt.pem You can find certificate authority (ca) here:

    config/certificates/ca/projectName-root-ca.crt.pem
    

    Access to Secure App with URL : https://localhost:5152

    Access to App with URL : http://localhost:5151

    nodefony

    Framework Configurations

    Open config/config.js if you want change httpPort, domain ,servers, add bundle, locale ...

    /**
     *  NODEFONY FRAMEWORK
     *
     *       KERNEL CONFIG
     *
     *   Domain listen : Nodefony can listen only one domain ( no vhost )
     *     Example :
     *      domain :  0.0.0.0      // for all interfaces
     *      domain :  [::1]        // for IPV6 only
     *      domain :  192.168.1.1  // IPV4
     *      domain :  mydomain.com // DNS
     *
     *   Domain Alias : string only "<<regexp>>" use domainCheck : true
     *     Example :
     *      domainAlias:[
     *        "^127.0.0.1$",
     *        "^localhost$",
     *        ".*\\.nodefony\\.com",
     *        "^nodefony\\.eu$",
     *        "^.*\\.nodefony\\.eu$"
     *      ]
     */
    const path = require("path");
    
    module.exports = {
      system: {
        domain: "0.0.0.0",
        domainAlias: [
          "^127.0.0.1$",
          "^localhost$"
        ],
        httpPort: 5151,
        httpsPort: 5152,
        domainCheck: false,
        locale: "en_en",
        /**
         * BUNDLES CORE
         */
        security: true,
        realtime: true,
        monitoring: true,
        mail: true,
        documentation: false,
        unitTest: true,
        redis: false,
        mongo: false,
        elastic: false,
        /**
         * SERVERS
         */
        servers: {
          statics: true,
          protocol: "2.0", //  2.0 || 1.1
          http: true,
          https: true,
          ws: true,
          wss: true,
          certificats: {
            key: path.resolve("config", "certificates", "server", "privkey.pem"),
            cert: path.resolve("config", "certificates", "server", "fullchain.pem"),
            ca: path.resolve("config", "certificates", "ca", "nodefony-root-ca.crt.pem"),
            options: {
              rejectUnauthorized: true
            }
          }
        },
        /**
         * DEV SERVER
         */
        devServer: {
          inline: true,
          hot: false,
          hotOnly: false,
          overlay: true,
          logLevel: "info", // none, error, warning or info
          progress: false,
          protocol: "https",
          websocket: true
        },
        /**
         *  BUNDLES LOCAL REGISTRATION
         *    Example :
         *       bundles: {
         *         hello-bundle : "file:src/bundles/hello-bundle",
         *         test-bundle  : path.resolve("src","bundles","test-bundle")
         *       }
         */
        bundles: {}
        ...

    Quick Start

    Install Nodefony :

    $ npm -g install nodefony
    

    See Global install How to Prevent Permissions Errors

    Create Project :

    $ nodefony create myproject
    $ cd myproject
    

    Generating a New Bundle :

    CLI Generate new bundle : default path src/bundles

    $ nodefony generate:bundle name [path]
    
    # Or Generate a New Bundle Interactive
    $ nodefony
    
    ?  Nodefony CLI :  Generater
    ?  Nodefony CLI :  (Use arrow keys)
    ❯ Generate New Bundle
      Generate New Controller
      Generate New Service
      Generate New Entity
      Generate New Nodefony Project
      Generate Openssl Certificates
      Generate Haproxy Configuration
      Generate Nginx Configuration
      Generate letsEncrypt Webroot Configuration
      --------
      Quit

    Starting Servers to check new Bundle hello:

    $ npm start
    or
    $ nodefony dev

    Access to bundle route with URL : http://localhost:5151/hello

    Access to bundle route with URL : https://localhost:5152/hello

    Now hello-bundle is auto-insert in framework with watcher active and auto-config Webpack Module bundler

    Example controller : src/bundles/hello-bundle/controller/defaultController.js

    /**
     *	@class defaultController
     *	@constructor
     *	@param {class} container
     *	@param {class} context
     *  @Route ("/hello")
     */
    class defaultController extends nodefony.Controller {
    
      constructor(container, context) {
        super(container, context);
        // start session
        this.startSession();
      }
    
    /**
     *    @Route ("",
     *      name="hello-route")
     */
      indexAction() {
        return this.render("hello-bundle::index.html.twig", {
    			name: this.bundle.name,
    			description: this.bundle.package.description    
        });
      }
    }
    
    module.exports = defaultController;

    Example view (twig) : src/bundles/hello-bundle/Resources/views/index.html.twig

    {% extends './base.html.twig' %}
    {% set error = getFlashBag("error") %}
    {% set info = getFlashBag("info") %}
    {% block body %}
      <div class="hello">
        <img class=displayed src=/framework-bundle/images/nodefony-logo.png>
        <h1>{{ name }}</h1>
        <h2>{{ description }}</h2>
        <img class="displayed"  style=" width:10%; height:10%" src="/framework-bundle/images/nodejs/nodejs-new-pantone-black.png">
        <img class="displayed" style=" width:15%; height:15%" src="/framework-bundle/images/webpack/webpack.svg">
      </div>
    {% endblock %}
    

    watchers :

    The bundle generation engine build bundle config with node.js watcher configuration

    In developement mode is very usefull to auto-reload files as controllers , views , routing , translations

    without having to reboot the server.

    You can see hello-bundle config : src/bundles/hello-bundle/Resources/config/config.js

    module.exports = {
      locale      : "en_en",
      /**
       *    WATCHERS
       *
       *  watchers Listen to changes, deletion, renaming of files and directories
       *  of different components
       *
       *  For watch all components
       *      watch:                    true
       *  or
       *      watch:{
       *        controller:             true,
       *        config:                 true,        // only routing and services
       *        views:                  true,
       *        translations:           true,
       *        webpack:                true
       *      }
       *
       */
      watch: true,
    
      /**
       * DEV SERVER
       */
      devServer: {
        hot: false
      }
    };

    Webpack Module bundler :

    The bundle generation engine build bundle config with a predefined webpack configuration

    In this way webpack is very usefull to manage all assets of bundle

    In developement mode watch is very usefull to auto-compile webpack module bundle

    without having to reboot the server

    You can see hello-bundle config webpack : src/bundles/hello-bundle/Resources/config/webpack.config.js

    // Default context <bundle base directory>
    //const context = path.resolve(__dirname, "..", "public");
    const public = path.resolve(__dirname, "..", "public", "assets");
    const publicPath = "/hello-bundle/assets/";
    let wpconfig = null;
    let dev = true;
    if (kernel.environment === "dev") {
      wpconfig = require("./webpack/webpack.dev.config.js");
    } else {
      wpconfig = require("./webpack/webpack.prod.config.js");
      dev = false;
    }
    
    module.exports = webpackMerge(config, {
      //context: context,
      target: "web",
      entry: {
        hello:["./Resources/js/hello.js"]
      },
      output: {
        path: public,
        publicPath: publicPath,
        filename: "./js/[name].js",
        library: "[name]",
        libraryExport: "default"
      },
      externals: {...},
      resolve: {...},
      module: {...},
      plugins: [...],
      devServer: {
        inline: true,
        hot: false
      }
    });

    Monitoring FRAMEWORK

    Access to monitoring route with URL : http://localhost:5151/nodefony

    MONITORING

    Monitoring in progress !!!

    Who Use Nodefony:

    &nbsp&nbsp&nbsp&nbsp&nbsp &nbsp&nbsp&nbsp&nbsp&nbsp &nbsp&nbsp&nbsp&nbsp&nbsp

    Big thanks:

    • D-Lake French specialist in infrastructure and data security.
    • Emersya Emersya has pioneered a unique way of interacting with products online using 3D technology.

    Related Links:

    More informations Nodefony Documentation

    Authors

    License

    CeCILL-B

    Demo

    Demo

    Install

    npm i nodefony

    DownloadsWeekly Downloads

    57

    Version

    6.6.0

    License

    CECILL-B

    Unpacked Size

    1.73 MB

    Total Files

    253

    Last publish

    Collaborators

    • ccamensuli