npm package: @sandbox.org/sandbox2
Description: the greatest app in the world!
Author: kai zhu
Latest version: 0.0.1

# sandbox2
the greatest app in the world!

[![travis-ci.org build-status](https://api.travis-ci.org/kaizhu256/node-sandbox2.svg)](https://travis-ci.org/kaizhu256/node-sandbox2) [![istanbul-coverage](https://kaizhu256.github.io/node-sandbox2/build/coverage.badge.svg)](https://kaizhu256.github.io/node-sandbox2/build/coverage.html/index.html)

[![NPM](https://nodei.co/npm/sandbox2.png?downloads=true)](https://www.npmjs.com/package/sandbox2)

[![npmPackageListing](https://kaizhu256.github.io/node-sandbox2/build/screenCapture.npmPackageListing.svg)](https://github.com/kaizhu256/node-sandbox2)

![npmPackageDependencyTree](https://kaizhu256.github.io/node-sandbox2/build/screenCapture.npmPackageDependencyTree.svg)



# cdn download
- [https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/app/assets.sandbox2.rollup.js](https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/app/assets.sandbox2.rollup.js)



# live demo
- [https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/app/index.html](https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/app/index.html)

[![github.com test-server](https://kaizhu256.github.io/node-sandbox2/build/screenCapture.deployGithub.browser.%252Fnode-sandbox2%252Fbuild%252Fapp%252Findex.html.png)](https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/app/index.html)



# documentation
#### apidoc
- [https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/apidoc.html](https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/apidoc.html)

[![apidoc](https://kaizhu256.github.io/node-sandbox2/build/screenCapture.buildCi.browser.%252Ftmp%252Fbuild%252Fapidoc.html.png)](https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/apidoc.html)

#### todo
- none

#### changes for v0.0.1
- none

#### this package requires
- darwin or linux os



# build status [![travis-ci.org build-status](https://api.travis-ci.org/kaizhu256/node-sandbox2.svg)](https://travis-ci.org/kaizhu256/node-sandbox2)
[![build commit status](https://kaizhu256.github.io/node-sandbox2/build/build.badge.svg)](https://travis-ci.org/kaizhu256/node-sandbox2)

| git-branch : | [master](https://github.com/kaizhu256/node-sandbox2/tree/master) | [beta](https://github.com/kaizhu256/node-sandbox2/tree/beta) | [alpha](https://github.com/kaizhu256/node-sandbox2/tree/alpha)|
|--:|:--|:--|:--|
| test-server-github : | [![github.com test-server](https://kaizhu256.github.io/node-sandbox2/GitHub-Mark-32px.png)](https://kaizhu256.github.io/node-sandbox2/build..master..travis-ci.org/app/index.html) | [![github.com test-server](https://kaizhu256.github.io/node-sandbox2/GitHub-Mark-32px.png)](https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/app/index.html) | [![github.com test-server](https://kaizhu256.github.io/node-sandbox2/GitHub-Mark-32px.png)](https://kaizhu256.github.io/node-sandbox2/build..alpha..travis-ci.org/app/index.html)|
| test-server-heroku : | [![heroku.com test-server](https://kaizhu256.github.io/node-sandbox2/heroku-logo.75x25.png)](https://h1-sandbox2-master.herokuapp.com) | [![heroku.com test-server](https://kaizhu256.github.io/node-sandbox2/heroku-logo.75x25.png)](https://h1-sandbox2-beta.herokuapp.com) | [![heroku.com test-server](https://kaizhu256.github.io/node-sandbox2/heroku-logo.75x25.png)](https://h1-sandbox2-alpha.herokuapp.com)|
| test-report : | [![test-report](https://kaizhu256.github.io/node-sandbox2/build..master..travis-ci.org/test-report.badge.svg)](https://kaizhu256.github.io/node-sandbox2/build..master..travis-ci.org/test-report.html) | [![test-report](https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/test-report.badge.svg)](https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/test-report.html) | [![test-report](https://kaizhu256.github.io/node-sandbox2/build..alpha..travis-ci.org/test-report.badge.svg)](https://kaizhu256.github.io/node-sandbox2/build..alpha..travis-ci.org/test-report.html)|
| coverage : | [![istanbul-coverage](https://kaizhu256.github.io/node-sandbox2/build..master..travis-ci.org/coverage.badge.svg)](https://kaizhu256.github.io/node-sandbox2/build..master..travis-ci.org/coverage.html/index.html) | [![istanbul-coverage](https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/coverage.badge.svg)](https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/coverage.html/index.html) | [![istanbul-coverage](https://kaizhu256.github.io/node-sandbox2/build..alpha..travis-ci.org/coverage.badge.svg)](https://kaizhu256.github.io/node-sandbox2/build..alpha..travis-ci.org/coverage.html/index.html)|
| build-artifacts : | [![build-artifacts](https://kaizhu256.github.io/node-sandbox2/glyphicons_144_folder_open.png)](https://github.com/kaizhu256/node-sandbox2/tree/gh-pages/build..master..travis-ci.org) | [![build-artifacts](https://kaizhu256.github.io/node-sandbox2/glyphicons_144_folder_open.png)](https://github.com/kaizhu256/node-sandbox2/tree/gh-pages/build..beta..travis-ci.org) | [![build-artifacts](https://kaizhu256.github.io/node-sandbox2/glyphicons_144_folder_open.png)](https://github.com/kaizhu256/node-sandbox2/tree/gh-pages/build..alpha..travis-ci.org)|

#### master branch
- stable branch
- HEAD should be tagged, npm-published package

#### beta branch
- semi-stable branch
- HEAD should be latest, npm-published package

#### alpha branch
- unstable branch
- HEAD is arbitrary
- commit history may be rewritten



# quickstart web example
![screenCapture](https://kaizhu256.github.io/node-sandbox2/build/screenCapture.testExampleJs.browser.%252F.png)

#### to run this example, follow the instruction in the script below
- [example.js](https://kaizhu256.github.io/node-sandbox2/build..beta..travis-ci.org/example.js)
```javascript
/*
example.js

quickstart example

instruction
    1. save this script as example.js
    2. run the shell command:
        $ npm install sandbox2 && PORT=8081 node example.js
    3. play with the browser-demo on http://127.0.0.1:8081
*/



/* istanbul instrument in package sandbox2 */
/*jslint
    bitwise: true,
    browser: true,
    maxerr: 8,
    maxlen: 96,
    node: true,
    nomen: true,
    regexp: true,
    stupid: true
*/
(function () {
    'use strict';
    var local;



    // run shared js-env code - init-before
    (function () {
        // init local
        local = {};
        // init modeJs
        local.modeJs = (function () {
            try {
                return typeof navigator.userAgent === 'string' &&
                    typeof document.querySelector('body') === 'object' &&
                    typeof XMLHttpRequest.prototype.open === 'function' &&
                    'browser';
            } catch (errorCaughtBrowser) {
                return module.exports &&
                    typeof process.versions.node === 'string' &&
                    typeof require('http').createServer === 'function' &&
                    'node';
            }
        }());
        // init global
        local.global = local.modeJs === 'browser'
            ? window
            : global;
        // init utility2_rollup
        local = local.global.utility2_rollup || (local.modeJs === 'browser'
            ? local.global.utility2_sandbox2
            : require('sandbox2'));
        // export local
        local.global.local = local;
    }());
    switch (local.modeJs) {



    // init-after
    // run browser js-env code - init-after
    /* istanbul ignore next */
    case 'browser':
        local.testRunBrowser = function (event) {
            if (!event || (event &&
                    event.currentTarget &&
                    event.currentTarget.className &&
                    event.currentTarget.className.includes &&
                    event.currentTarget.className.includes('onreset'))) {
                // reset output
                Array.from(
                    document.querySelectorAll('body > .resettable')
                ).forEach(function (element) {
                    switch (element.tagName) {
                    case 'INPUT':
                    case 'TEXTAREA':
                        element.value = '';
                        break;
                    default:
                        element.textContent = '';
                    }
                });
            }
            switch (event && event.currentTarget && event.currentTarget.id) {
            case 'testRunButton1':
                // show tests
                if (document.querySelector('#testReportDiv1').style.display === 'none') {
                    document.querySelector('#testReportDiv1').style.display = 'block';
                    document.querySelector('#testRunButton1').textContent =
                        'hide internal test';
                    local.modeTest = true;
                    local.testRunDefault(local);
                // hide tests
                } else {
                    document.querySelector('#testReportDiv1').style.display = 'none';
                    document.querySelector('#testRunButton1').textContent = 'run internal test';
                }
                break;
            // custom-case
            default:
                break;
            }
            if (document.querySelector('#inputTextareaEval1') && (!event || (event &&
                    event.currentTarget &&
                    event.currentTarget.className &&
                    event.currentTarget.className.includes &&
                    event.currentTarget.className.includes('oneval')))) {
                // try to eval input-code
                try {
                    /*jslint evil: true*/
                    eval(document.querySelector('#inputTextareaEval1').value);
                } catch (errorCaught) {
                    console.error(errorCaught);
                }
            }
        };
        // log stderr and stdout to #outputTextareaStdout1
        ['error', 'log'].forEach(function (key) {
            console[key + '_original'] = console[key];
            console[key] = function () {
                var element;
                console[key + '_original'].apply(console, arguments);
                element = document.querySelector('#outputTextareaStdout1');
                if (!element) {
                    return;
                }
                // append text to #outputTextareaStdout1
                element.value += Array.from(arguments).map(function (arg) {
                    return typeof arg === 'string'
                        ? arg
                        : JSON.stringify(arg, null, 4);
                }).join(' ') + '\n';
                // scroll textarea to bottom
                element.scrollTop = element.scrollHeight;
            };
        });
        // init event-handling
        ['change', 'click', 'keyup'].forEach(function (event) {
            Array.from(document.querySelectorAll('.on' + event)).forEach(function (element) {
                element.addEventListener(event, local.testRunBrowser);
            });
        });
        // run tests
        local.testRunBrowser();
        break;



    // run node js-env code - init-after
    /* istanbul ignore next */
    case 'node':
        // export local
        module.exports = local;
        // require modules
        local.fs = require('fs');
        local.http = require('http');
        local.url = require('url');
        // init assets
        local.assetsDict = local.assetsDict || {};
        /* jslint-ignore-begin */
        local.assetsDict['/assets.index.template.html'] = '\
<!doctype html>\n\
<html lang="en">\n\
<head>\n\
<meta charset="UTF-8">\n\
<meta name="viewport" content="width=device-width, initial-scale=1">\n\
<title>{{env.npm_package_name}} (v{{env.npm_package_version}})</title>\n\
<style>\n\
/*csslint\n\
    box-sizing: false,\n\
    universal-selector: false\n\
*/\n\
* {\n\
    box-sizing: border-box;\n\
}\n\
body {\n\
    background: #dde;\n\
    font-family: Arial, Helvetica, sans-serif;\n\
    margin: 2rem;\n\
}\n\
body > * {\n\
    margin-bottom: 1rem;\n\
}\n\
.utility2FooterDiv {\n\
    margin-top: 20px;\n\
    text-align: center;\n\
}\n\
</style>\n\
<style>\n\
/*csslint\n\
*/\n\
textarea {\n\
    font-family: monospace;\n\
    height: 10rem;\n\
    width: 100%;\n\
}\n\
textarea[readonly] {\n\
    background: #ddd;\n\
}\n\
</style>\n\
</head>\n\
<body>\n\
<!-- utility2-comment\n\
<div id="ajaxProgressDiv1" style="background: #d00; height: 2px; left: 0; margin: 0; padding: 0; position: fixed; top: 0; transition: background 0.5s, width 1.5s; width: 25%;"></div>\n\
utility2-comment -->\n\
<h1>\n\
<!-- utility2-comment\n\
    <a\n\
        {{#if env.npm_package_homepage}}\n\
        href="{{env.npm_package_homepage}}"\n\
        {{/if env.npm_package_homepage}}\n\
        target="_blank"\n\
    >\n\
utility2-comment -->\n\
        {{env.npm_package_name}} (v{{env.npm_package_version}})\n\
<!-- utility2-comment\n\
    </a>\n\
utility2-comment -->\n\
</h1>\n\
<h3>{{env.npm_package_description}}</h3>\n\
<!-- utility2-comment\n\
<h4><a download href="assets.app.js">download standalone app</a></h4>\n\
<button class="onclick onreset" id="testRunButton1">run internal test</button><br>\n\
<div id="testReportDiv1" style="display: none;"></div>\n\
utility2-comment -->\n\
\n\
\n\
\n\
<label>stderr and stdout</label>\n\
<textarea class="resettable" id="outputTextareaStdout1" readonly></textarea>\n\
<!-- utility2-comment\n\
{{#if isRollup}}\n\
<script src="assets.app.js"></script>\n\
{{#unless isRollup}}\n\
utility2-comment -->\n\
<script src="assets.utility2.rollup.js"></script>\n\
<script src="jsonp.utility2._stateInit?callback=window.utility2._stateInit"></script>\n\
<script src="assets.sandbox2.rollup.js"></script>\n\
<script src="assets.example.js"></script>\n\
<script src="assets.test.js"></script>\n\
<!-- utility2-comment\n\
{{/if isRollup}}\n\
utility2-comment -->\n\
<div class="utility2FooterDiv">\n\
    [ this app was created with\n\
    <a href="https://github.com/kaizhu256/node-utility2" target="_blank">utility2</a>\n\
    ]\n\
</div>\n\
</body>\n\
</html>\n\
';
        /* jslint-ignore-end */
        if (local.templateRender) {
            local.assetsDict['/'] = local.templateRender(
                local.assetsDict['/assets.index.template.html'],
                {
                    env: local.objectSetDefault(local.env, {
                        npm_package_description: 'the greatest app in the world!',
                        npm_package_name: 'my-app',
                        npm_package_nameAlias: 'my_app',
                        npm_package_version: '0.0.1'
                    })
                }
            );
        } else {
            local.assetsDict['/'] = local.assetsDict['/assets.index.template.html']
                .replace((/\{\{env\.(\w+?)\}\}/g), function (match0, match1) {
                    // jslint-hack
                    String(match0);
                    switch (match1) {
                    case 'npm_package_description':
                        return 'the greatest app in the world!';
                    case 'npm_package_name':
                        return 'my-app';
                    case 'npm_package_nameAlias':
                        return 'my_app';
                    case 'npm_package_version':
                        return '0.0.1';
                    }
                });
        }
        // run the cli
        if (local.global.utility2_rollup || module !== require.main) {
            break;
        }
        local.assetsDict['/assets.example.js'] =
            local.assetsDict['/assets.example.js'] ||
            local.fs.readFileSync(__filename, 'utf8');
        // bug-workaround - long $npm_package_buildCustomOrg
        /* jslint-ignore-begin */
        local.assetsDict['/assets.sandbox2.rollup.js'] =
            local.assetsDict['/assets.sandbox2.rollup.js'] ||
            local.fs.readFileSync(
                local.sandbox2.__dirname + '/lib.sandbox2.js',
                'utf8'
            ).replace((/^#!/), '//');
        /* jslint-ignore-end */
        local.assetsDict['/favicon.ico'] = local.assetsDict['/favicon.ico'] || '';
        // if $npm_config_timeout_exit exists,
        // then exit this process after $npm_config_timeout_exit ms
        if (Number(process.env.npm_config_timeout_exit)) {
            setTimeout(process.exit, Number(process.env.npm_config_timeout_exit));
        }
        // start server
        if (local.global.utility2_serverHttp1) {
            break;
        }
        process.env.PORT = process.env.PORT || '8081';
        console.error('server starting on port ' + process.env.PORT);
        local.http.createServer(function (request, response) {
            request.urlParsed = local.url.parse(request.url);
            if (local.assetsDict[request.urlParsed.pathname] !== undefined) {
                response.end(local.assetsDict[request.urlParsed.pathname]);
                return;
            }
            response.statusCode = 404;
            response.end();
        }).listen(process.env.PORT);
        break;
    }
}());
```

#### output from browser
![screenCapture](https://kaizhu256.github.io/node-sandbox2/build/screenCapture.testExampleJs.browser.%252F.png)

#### output from shell
![screenCapture](https://kaizhu256.github.io/node-sandbox2/build/screenCapture.testExampleJs.svg)



# package.json
```json
{
    "author": "kai zhu <kaizhu256@gmail.com>",
    "description": "the greatest app in the world!",
    "devDependencies": {
        "electron-lite": "kaizhu256/node-electron-lite#alpha",
        "utility2": "kaizhu256/node-utility2#alpha"
    },
    "engines": {
        "node": ">=4.0"
    },
    "homepage": "https://github.com/kaizhu256/node-sandbox2",
    "keywords": [],
    "license": "MIT",
    "main": "lib.sandbox2.js",
    "name": "sandbox2",
    "nameAlias": "sandbox2",
    "nameOriginal": "sandbox2",
    "os": [
        "darwin",
        "linux"
    ],
    "repository": {
        "type": "git",
        "url": "https://github.com/kaizhu256/node-sandbox2.git"
    },
    "scripts": {
        "build-ci": "utility2 shReadmeTest build_ci.sh",
        "env": "env",
        "heroku-postbuild": "(set -e; npm install \"kaizhu256/node-utility2#alpha\"; utility2 shDeployHeroku)",
        "postinstall": "if [ -f npm_scripts.sh ]; then ./npm_scripts.sh postinstall; fi",
        "start": "(set -e; export PORT=${PORT:-8080}; utility2 start test.js)",
        "test": "(set -e; export PORT=$(utility2 shServerPortRandom); utility2 test test.js)"
    },
    "version": "0.0.1"
}
```



# changelog of last 50 commits
[![screenCapture](https://kaizhu256.github.io/node-sandbox2/build/screenCapture.gitLog.svg)](https://github.com/kaizhu256/node-sandbox2/commits)



# internal build-script
- build_ci.sh
```shell
# build_ci.sh

# this shell script will run the build for this package

shBuildCiAfter() {(set -e
    shDeployGithub
    # shDeployHeroku
    shReadmeBuildLinkVerify
)}

shBuildCiBefore() {(set -e
    shReadmeTest example.js
    shReadmeTest example.sh
    #!! shNpmTestPublished
)}

# run shBuildCi
eval $(utility2 source)
shBuildCi
```



# misc
- this package was created with [utility2](https://github.com/kaizhu256/node-utility2)