diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ea2ad12..8c3bd02 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,7 +10,7 @@ before_script: testSTABLE: stage: test script: - - npmci test stable + - npmci npm test stable only: - tags tags: @@ -20,7 +20,7 @@ release: stage: release environment: npmjs-com_registry script: - - npmci publish + - npmci npm publish only: - tags tags: diff --git a/README.md b/README.md index 07ad4d8..00d70c9 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,30 @@ # smartnginx + control nginx from node, TypeScript ready ## Status + [![build status](https://gitlab.com/pushrocks/smartnginx/badges/master/build.svg)](https://gitlab.com/pushrocks/smartnginx/commits/master) ## Features -* easy reverse configuration -* automatic letsencrypt DNS01 challenge based ssl cert generation -* automatic nginx process handling zero-downtime config reloading -* works in Docker environements +- easy reverse configuration +- automatic letsencrypt DNS01 challenge based ssl cert generation +- automatic nginx process handling zero-downtime config reloading +- works in Docker environements ## Usage + We recommend the use of TypeScript! :) ```typescript -import * as smartnginx from "smartnginx"; -myNginxConfig = new smartnginx.NginxConfig(); -myNginxZone = new smartnginx.NginxZone({ - zoneName:"some.example.com", - type:"reverseProxy", - destination:"192.192.192.192" // some destination IP +import * as smartnginx from 'smartnginx'; +const smartnginxInstance = new smartnginx.SmartNginx(); +myNginxHost = new smartnginx.NginxHost({ + hostName: 'some.example.com', + type: 'reverseProxy', + destination: '192.192.192.192' // some destination IP }); myNginxConfig.addZone(myNginxZone); // adds the zone to the config myNginxConfig.deploy(); // deploys the referenced NginxConfig and gracefully reloads it -``` \ No newline at end of file +``` diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..50c07b4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1073 @@ +{ + "name": "smartnginx", + "version": "1.0.6", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@airbnb/node-memwatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@airbnb/node-memwatch/-/node-memwatch-1.0.2.tgz", + "integrity": "sha512-2R+MEEMSTUdKwQ6NFWkyA/UNoSjL1tMldZqJbZpgXSwNMBzlNlkUWEXKu9RqTTMkDqJRfGJ2VDs8gPlPK2APDQ==", + "dev": true, + "requires": { + "bindings": "^1.3.0", + "nan": "^2.9.2" + } + }, + "@gitzone/tsbuild": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@gitzone/tsbuild/-/tsbuild-2.0.22.tgz", + "integrity": "sha512-H0rqGVUKXWgxXhkY62kF92WpbS9GSJW27jQXaoyMsQptTQN4HIYKHWZMdO4egkk0/gDmKnBjk8MXg5Rx6efItA==", + "dev": true, + "requires": { + "@pushrocks/smartfile": "^6.0.6", + "@pushrocks/smartlog": "^2.0.1", + "@pushrocks/smartpath": "^4.0.1", + "@pushrocks/smartpromise": "^2.0.5", + "typescript": "^3.0.1" + } + }, + "@gitzone/tsrun": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@gitzone/tsrun/-/tsrun-1.1.12.tgz", + "integrity": "sha512-DOxqOg+evoxhgbzhzH4u6LaPF+6bpMsnBVl1QQaHzKPGBlNjaIY4yJ0RsGnWMgX1hlNLvbgHtl0Ky4A2MDvyrg==", + "dev": true, + "requires": { + "@gitzone/tsbuild": "^2.0.22", + "@pushrocks/smartfile": "^6.0.6", + "ts-node": "^7.0.0", + "typescript": "^3.0.1" + } + }, + "@gitzone/tstest": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@gitzone/tstest/-/tstest-1.0.13.tgz", + "integrity": "sha512-nEdT3YJHrpkUVpum75n/ZU5voCjd7Fvq8gqbf47oaPC6r2LbqUhc6PnKo/YYaQLgXAaBtCTxFLZMUlWDg5fguw==", + "dev": true, + "requires": { + "@gitzone/tsrun": "^1.1.11", + "@pushrocks/consolecolor": "^2.0.1", + "@pushrocks/smartfile": "^6.0.6", + "@pushrocks/smartlog": "^2.0.1", + "@pushrocks/smartpromise": "^2.0.5", + "@pushrocks/smartshell": "^2.0.6", + "@types/figures": "^2.0.0", + "figures": "^2.0.0" + } + }, + "@pushrocks/consolecolor": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@pushrocks/consolecolor/-/consolecolor-2.0.1.tgz", + "integrity": "sha512-iOFCHVeFZ2OywbdwSxVI4/wokkcLrXVdHLgvMmkNhJ220eeLgjNZWx3EJo3vNW3zq5ybCSCUIq0878djBxrWpw==", + "dev": true, + "requires": { + "ansi-256-colors": "^1.1.0" + } + }, + "@pushrocks/early": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@pushrocks/early/-/early-3.0.3.tgz", + "integrity": "sha512-71/nwxTpqdp1glmHz4YaGusNl/XOOcPelAxC9RA6rpS/6280QyY2u4yx+mRdMrCzn7ruLYF5awbkS8llNZ94Pg==", + "dev": true, + "requires": { + "@pushrocks/consolecolor": "^2.0.1", + "@pushrocks/smartpromise": "^2.0.5" + } + }, + "@pushrocks/smartdelay": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@pushrocks/smartdelay/-/smartdelay-2.0.2.tgz", + "integrity": "sha512-4xf6tMKwZcxBynKgXrM4SQKgeASfRvx43LUmR5DkStp26ZHAsarCXUdKJS6y8QIPygEOTOCP8we97JAcCzBuMg==", + "dev": true, + "requires": { + "@pushrocks/smartpromise": "^2.0.5" + } + }, + "@pushrocks/smartfile": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@pushrocks/smartfile/-/smartfile-6.0.6.tgz", + "integrity": "sha512-vA1+yS6n0kuBZ+Bl30rxOCYvgIj0mo9g303cUpOZR0I781iQVWHcBKRC05FaGDxJD1HuYdvbSK+7vlrzZjVcMw==", + "requires": { + "@pushrocks/smartpath": "^4.0.1", + "@pushrocks/smartpromise": "^2.0.5", + "@pushrocks/smartrequest": "^1.1.12", + "@types/fs-extra": "^5.0.4", + "@types/vinyl": "^2.0.2", + "fs-extra": "^7.0.0", + "glob": "^7.1.2", + "js-yaml": "^3.10.0", + "vinyl-file": "^3.0.0" + } + }, + "@pushrocks/smartlog": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@pushrocks/smartlog/-/smartlog-2.0.1.tgz", + "integrity": "sha512-GtsDTGIUF3VuWPyF8FV5dF31ZCEIcaJ56ZlvJsWxjnyJq57X25mk5/K0QAaRE9IIeHg6fORcukFomb5C+AOQrg==", + "requires": { + "@pushrocks/smartlog-interfaces": "^1.0.9" + } + }, + "@pushrocks/smartlog-interfaces": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@pushrocks/smartlog-interfaces/-/smartlog-interfaces-1.0.9.tgz", + "integrity": "sha512-0qwpomrRN0kFjmhR9m1iHYXoISoNuXtRP0Wr+JtkYyURLwKHMaW8Xoznf8MzXJptRfqufJi3Fxh5HodpPrIZUA==" + }, + "@pushrocks/smartpath": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@pushrocks/smartpath/-/smartpath-4.0.1.tgz", + "integrity": "sha512-MaI0+uLQPCr2V3WGnbdgb0pWa9xkWyrP4qYcbsHIjeismGLbn9s3jmP/HIXU8LkgzRgaVb+BJxmZJHOwl32DyA==" + }, + "@pushrocks/smartpromise": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@pushrocks/smartpromise/-/smartpromise-2.0.5.tgz", + "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==" + }, + "@pushrocks/smartrequest": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@pushrocks/smartrequest/-/smartrequest-1.1.12.tgz", + "integrity": "sha512-8vDpYUADkbJFdxDcHQJyJBpc66+cvsRAJdQ6SwMirz5cIeWNlLSR/PVrdGQ94z5tSusf4mwnODk2Ai9smN6XSA==", + "requires": { + "@pushrocks/smartpromise": "^2.0.5", + "@types/form-data": "^2.2.1", + "form-data": "^2.3.2" + } + }, + "@pushrocks/smartshell": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@pushrocks/smartshell/-/smartshell-2.0.6.tgz", + "integrity": "sha512-D48KB3DDqLfMjOXGEutqJi+v3Z4RcWacu5BJXxUwrecvd6oetbKobfmNGxeHSQPmNGb7U3ISfKwV6c5T5EZkJg==", + "requires": { + "@pushrocks/smartpromise": "^2.0.5", + "@types/which": "^1.3.1", + "which": "^1.3.1" + } + }, + "@pushrocks/smartstring": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@pushrocks/smartstring/-/smartstring-3.0.0.tgz", + "integrity": "sha512-KjDzKCJaeuFRZQq/cUl+BzePysE6VRL2qax+buH54OZi1d3pHZ3V+9FN5ZIZP8IlZZZm3yFBxLLfUzG7Lblzzw==", + "requires": { + "crypto-random-string": "^1.0.0", + "js-base64": "^2.4.8", + "normalize-newline": "^3.0.0", + "randomatic": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "@pushrocks/tapbundle": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@pushrocks/tapbundle/-/tapbundle-3.0.5.tgz", + "integrity": "sha512-7K1y4pyJ5O8XRmnW/ADryEoniGKOW0Un6VZpxMcYTndS5AjwKhjRkAAaSQf4g/a8Ei+uk/q8csI9Twjb9KISLQ==", + "dev": true, + "requires": { + "@pushrocks/early": "^3.0.3", + "@pushrocks/smartdelay": "^2.0.2", + "@pushrocks/smartpromise": "^2.0.5", + "leakage": "^0.4.0", + "smartchai": "^2.0.1" + } + }, + "@types/chai": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.4.tgz", + "integrity": "sha512-h6+VEw2Vr3ORiFCyyJmcho2zALnUq9cvdB/IO8Xs9itrJVCenC7o26A6+m7D0ihTTr65eS259H5/Ghl/VjYs6g==", + "dev": true + }, + "@types/chai-as-promised": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.0.tgz", + "integrity": "sha512-MFiW54UOSt+f2bRw8J7LgQeIvE/9b4oGvwU7XW30S9QGAiHGnU/fmiOprsyMkdmH2rl8xSPc0/yrQw8juXU6bQ==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, + "@types/chai-string": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@types/chai-string/-/chai-string-1.4.1.tgz", + "integrity": "sha512-aRNMs6TKgjgPlCHwDfq/YNy5VtRR2hJ4AUWByddrT0TRVVD8eX4MiHW6/iHvmQHRlVuuPZcwnTUE7b4yFt7bEA==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, + "@types/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-mcRgJ+ncKuNI+Dwac7omO18B8C8u+YBS+AU/oyLhEyjAnT3cUUThhHgZpbiIvu5ZqSvdD30BXtrqg9nxc3OKMg==", + "dev": true + }, + "@types/form-data": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz", + "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/fs-extra": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.4.tgz", + "integrity": "sha512-DsknoBvD8s+RFfSGjmERJ7ZOP1HI0UZRA3FSI+Zakhrc/Gy26YQsLI+m5V5DHxroHRJqCDLKJp7Hixn8zyaF7g==", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.7.tgz", + "integrity": "sha512-VkKcfuitP+Nc/TaTFH0B8qNmn+6NbI6crLkQonbedViVz7O2w8QV/GERPlkJ4bg42VGHiEWa31CoTOPs1q6z1w==" + }, + "@types/vinyl": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz", + "integrity": "sha512-2iYpNuOl98SrLPBZfEN9Mh2JCJ2EI9HU35SfgBEb51DcmaHkhp8cKMblYeBqMQiwXMgAD3W60DbQ4i/UdLiXhw==", + "requires": { + "@types/node": "*" + } + }, + "@types/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.1.tgz", + "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==" + }, + "ansi-256-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-256-colors/-/ansi-256-colors-1.1.0.tgz", + "integrity": "sha1-kQ3lDvzHwJ49gvL4er1rcAwYgYo=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bindings": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", + "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "chai-string": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/chai-string/-/chai-string-1.4.0.tgz", + "integrity": "sha1-NZFAwFHTak5LGl/GuRAVL0OKjUk=", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", + "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "home": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/home/-/home-1.0.1.tgz", + "integrity": "sha1-lqQjzrSbmDeP9e886uBZpVf53TU=", + "dev": true, + "requires": { + "os-homedir": "^1.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "js-base64": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.8.tgz", + "integrity": "sha512-hm2nYpDrwoO/OzBhdcqs/XGT6XjSuSSCVEpia+Kl2J6x4CYt5hISlVL/AYU1khoDXv0AQVgxtdJySb9gjAn56Q==" + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "leakage": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/leakage/-/leakage-0.4.0.tgz", + "integrity": "sha512-x7gYK5n5dPkHDZWJ2Kh8Ag1hZNzUh+HtXn8Bv1aDdN6o6ONPCJ8sOfFq+kxcULJFp3lXaCjXb3iXOLmQRbBLwA==", + "dev": true, + "requires": { + "@airbnb/node-memwatch": "^1.0.2", + "es6-error": "^4.0.2", + "left-pad": "^1.1.3", + "minimist": "^1.2.0", + "pretty-bytes": "^4.0.2" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "make-error": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "dev": true + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" + }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" + }, + "mime-types": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", + "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", + "requires": { + "mime-db": "~1.35.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true + }, + "normalize-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-newline/-/normalize-newline-3.0.0.tgz", + "integrity": "sha1-HL6oBKukNgAfg5OKsh7AOdaa6dM=" + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pretty-bytes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "qenv": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/qenv/-/qenv-1.1.7.tgz", + "integrity": "sha1-0D+L+P43SUzwjQkZ/nZdyoTZr64=", + "dev": true, + "requires": { + "lodash": "^4.17.4", + "smartfile": "^4.2.11", + "typings-global": "^1.0.16" + } + }, + "randomatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", + "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + }, + "require-reload": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/require-reload/-/require-reload-0.2.2.tgz", + "integrity": "sha1-KadZGEbK+RtuijzamRaD+V+NfUI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "smartchai": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/smartchai/-/smartchai-2.0.1.tgz", + "integrity": "sha512-9M+R56OhAHXScxgr2vzQqxGx0XMS0QXriNZuP7hjlbVbo2FUT+l60iEzbwPt9Ga+5u2cEEjSSoZEQVqlROaddA==", + "dev": true, + "requires": { + "@types/chai": "^4.1.2", + "@types/chai-as-promised": "^7.1.0", + "@types/chai-string": "^1.4.0", + "chai": "^4.1.2", + "chai-as-promised": "^7.1.1", + "chai-string": "^1.4.0" + } + }, + "smartfile": { + "version": "4.2.28", + "resolved": "https://registry.npmjs.org/smartfile/-/smartfile-4.2.28.tgz", + "integrity": "sha512-zUeAOLYftz8xLfKTs9U1NOuNPTA9jlvTQNr7lDIv84kXnr1AEpDb2Xwy1MdK1w733sBil/RkxtezrkvgRVAnNg==", + "dev": true, + "requires": { + "@types/fs-extra": "5.0.0", + "@types/vinyl": "^2.0.2", + "fs-extra": "^5.0.0", + "glob": "^7.1.2", + "js-yaml": "^3.10.0", + "require-reload": "0.2.2", + "smartpath": "^3.2.8", + "smartq": "^1.1.6", + "smartrequest": "^1.0.8", + "vinyl-file": "^3.0.0" + }, + "dependencies": { + "@types/fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-qtxDULQKUenuaDLW003CgC+0T0eiAfH3BrH+vSt87GLzbz5EZ6Ox6mv9rMttvhDOatbb9nYh0E1m7ydoYwUrAg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "smartpath": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/smartpath/-/smartpath-3.2.8.tgz", + "integrity": "sha1-SDS9OouuIpW6rK26I8h6UBlS+UA=", + "dev": true, + "requires": { + "home": "^1.0.1", + "typings-global": "^1.0.14" + } + }, + "smartq": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/smartq/-/smartq-1.1.8.tgz", + "integrity": "sha512-FURlYW/C3bLeZjJcBVyw7bxCyQoCXiXbLCZcDUKznhXHaLu35c8m33/a2H8CA0rtb82lvzN8dRLnBZAcNMzNHQ==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "smartrequest": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/smartrequest/-/smartrequest-1.0.13.tgz", + "integrity": "sha512-OHrvzaxaA8Z8bJr33yxnyJF35nrWyaumsajqXm2Zkv0/2hfWO1NQAj02VVV51rLQfmtU0Hex7Nk19SoC8nOmYg==", + "dev": true, + "requires": { + "smartq": "^1.1.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.8.tgz", + "integrity": "sha512-WqAEWPdb78u25RfKzOF0swBpY0dKrNdjc4GvLwm7ScX/o9bj8Eh/YL8mcMhBHYDGl87UkkSXDOFnW4G7GhWhGg==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-buf": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", + "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", + "requires": { + "is-utf8": "^0.2.1" + } + }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "requires": { + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" + }, + "ts-node": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.0.tgz", + "integrity": "sha512-klJsfswHP0FuOLsvBZ/zzCfUvakOSSxds78mVeK7I+qP76YWtxf16hEZsp3U+b0kIo82R5UatGFeblYMqabb2Q==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "typescript": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.1.tgz", + "integrity": "sha512-zQIMOmC+372pC/CCVLqnQ0zSBiY7HHodU7mpQdjiZddek4GMj31I3dUJ7gAs9o65X7mnRma6OokOkc6f9jjfBg==", + "dev": true + }, + "typings-global": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/typings-global/-/typings-global-1.0.28.tgz", + "integrity": "sha512-6VOwJWEY2971HOMHu/7sURzUXiD4/LiMJPsMAOqkHHAtS3MVpLFE5gzTiHilsH9KY5VE1mBQirWIgWFsDuo90A==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-file": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-3.0.0.tgz", + "integrity": "sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "strip-bom-buf": "^1.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^2.0.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + } + } +} diff --git a/package.json b/package.json index ddbbf07..47a15d6 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,13 @@ { - "name": "smartnginx", + "name": "@pushrocks/smartnginx", "version": "1.0.6", "description": "control nginx from node, TypeScript ready", "main": "dist/index.js", "typings": "dist/index.d.ts", "scripts": { - "test": "(npmts)", - "cleanTest": "(rm -r nginxconfig)" + "test": "tstest test/", + "cleanTest": "(rm -r nginxconfig) && npm run test", + "build": "(tsbuild)" }, "repository": { "type": "git", @@ -22,19 +23,18 @@ }, "homepage": "https://gitlab.com/pushrocks/smartnginx#README", "dependencies": { - "@types/q": "0.x.x", - "@types/shelljs": "0.x.x", - "beautylog": "^5.0.20", - "cert": "^1.0.7", - "q": "^1.4.1", - "shelljs": "^0.7.3", - "smartfile": "^4.0.13", - "smartstring": "^2.0.15" + "@pushrocks/smartfile": "^6.0.6", + "@pushrocks/smartlog": "^2.0.1", + "@pushrocks/smartpromise": "^2.0.5", + "@pushrocks/smartshell": "^2.0.6", + "@pushrocks/smartstring": "^3.0.0" }, "devDependencies": { - "npmts-g": "^5.2.8", - "qenv": "^1.0.8", - "should": "^10.0.0", - "typings-test": "^1.0.1" - } + "@gitzone/tsbuild": "^2.0.22", + "@gitzone/tsrun": "^1.1.12", + "@gitzone/tstest": "^1.0.13", + "@pushrocks/tapbundle": "^3.0.5", + "qenv": "^1.1.7" + }, + "private": true } diff --git a/qenv.yml b/qenv.yml index 6d352e9..78efe6d 100644 --- a/qenv.yml +++ b/qenv.yml @@ -1,3 +1 @@ vars: -- CF_EMAIL -- CF_KEY \ No newline at end of file diff --git a/test/test.d.ts b/test/test.d.ts deleted file mode 100644 index b973566..0000000 --- a/test/test.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import "typings-test"; -import "should"; diff --git a/test/test.js b/test/test.js deleted file mode 100644 index c7a5460..0000000 --- a/test/test.js +++ /dev/null @@ -1,61 +0,0 @@ -"use strict"; -require("typings-test"); -const path = require("path"); -require("should"); -const qenv_1 = require("qenv"); -const smartnginx = require("../dist/index"); -// setup environment -let testQenv = new qenv_1.Qenv(process.cwd(), path.join(process.cwd(), ".nogit")); -describe("smartnginx", function () { - let testNginxConfig; - let testNginxZone01; - let testNginxZone02; - describe("NginxZone", function () { - it(`"new NginxZone()" should produce an instance of NginxConfig`, function () { - testNginxZone01 = new smartnginx.NginxHost({ - hostName: "test100.bleu.de", - type: smartnginx.hostTypes.reverseProxy, - destination: "192.192.192.191" - }); - testNginxZone02 = new smartnginx.NginxHost({ - hostName: "test102.bleu.de", - type: smartnginx.hostTypes.reverseProxy, - destination: "192.192.192.192" - }); - testNginxZone01.should.be.instanceof(smartnginx.NginxHost); - console.log(testNginxZone01.configString); - }); - }); - describe("NginxConfig", function () { - this.timeout(10000); - it(`"new NginxConfig()" should produce an instance of NginxConfig`, function () { - testNginxConfig = new smartnginx.NginxConfig({ - cfEmail: process.env.CF_EMAIL, - cfKey: process.env.CF_KEY, - testMode: true - }); - testNginxConfig.should.be.instanceof(smartnginx.NginxConfig); - }); - describe(".addZone()", function () { - it("should add a zone to NginxConfig Object", function () { - testNginxConfig.addHost(testNginxZone01); - testNginxConfig.addHost(testNginxZone02); - }); - }); - describe(".deploy()", function () { - this.timeout(600000); - it("should deploy a config from an instance", function (done) { - testNginxConfig.deploy() - .then(() => { - done(); - }); - }); - }); - describe(".stop", function () { - it("should end the process", function () { - testNginxConfig.nginxProcess.stop(); - }); - }); - }); -}); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FBYyxDQUFDLENBQUE7QUFDdEIsTUFBTyxJQUFJLFdBQVcsTUFBTSxDQUFDLENBQUM7QUFDOUIsUUFBTyxRQUFRLENBQUMsQ0FBQTtBQUNoQix1QkFBbUIsTUFBTSxDQUFDLENBQUE7QUFDMUIsTUFBWSxVQUFVLFdBQU0sZUFBZSxDQUFDLENBQUE7QUFFNUMsb0JBQW9CO0FBQ3BCLElBQUksUUFBUSxHQUFHLElBQUksV0FBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLFFBQVEsQ0FBQyxZQUFZLEVBQUM7SUFDbEIsSUFBSSxlQUFzQyxDQUFDO0lBQzNDLElBQUksZUFBb0MsQ0FBQztJQUN6QyxJQUFJLGVBQW9DLENBQUM7SUFDekMsUUFBUSxDQUFDLFdBQVcsRUFBQztRQUNqQixFQUFFLENBQUMsNkRBQTZELEVBQUM7WUFDN0QsZUFBZSxHQUFHLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQztnQkFDdkMsUUFBUSxFQUFDLGlCQUFpQjtnQkFDMUIsSUFBSSxFQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWTtnQkFDdEMsV0FBVyxFQUFDLGlCQUFpQjthQUNoQyxDQUFDLENBQUM7WUFDSCxlQUFlLEdBQUcsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDO2dCQUN2QyxRQUFRLEVBQUMsaUJBQWlCO2dCQUMxQixJQUFJLEVBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZO2dCQUN0QyxXQUFXLEVBQUMsaUJBQWlCO2FBQ2hDLENBQUMsQ0FBQztZQUNILGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUNILFFBQVEsQ0FBQyxhQUFhLEVBQUM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixFQUFFLENBQUMsK0RBQStELEVBQUM7WUFDL0QsZUFBZSxHQUFHLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQztnQkFDekMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUTtnQkFDN0IsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTTtnQkFDekIsUUFBUSxFQUFDLElBQUk7YUFDaEIsQ0FBQyxDQUFDO1lBQ0gsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxZQUFZLEVBQUM7WUFDbEIsRUFBRSxDQUFDLHlDQUF5QyxFQUFDO2dCQUN6QyxlQUFlLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUN6QyxlQUFlLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsV0FBVyxFQUFDO1lBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckIsRUFBRSxDQUFDLHlDQUF5QyxFQUFDLFVBQVMsSUFBSTtnQkFDdEQsZUFBZSxDQUFDLE1BQU0sRUFBRTtxQkFDbkIsSUFBSSxDQUFDO29CQUNGLElBQUksRUFBRSxDQUFDO2dCQUNYLENBQUMsQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxDQUFDLENBQUE7UUFDTixDQUFDLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxPQUFPLEVBQUM7WUFDYixFQUFFLENBQUMsd0JBQXdCLEVBQUM7Z0JBQ3hCLGVBQWUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUE7UUFDTixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUMifQ== \ No newline at end of file diff --git a/test/test.ts b/test/test.ts index 078c117..d60f181 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,60 +1,45 @@ -import "typings-test"; -import path = require("path"); -import "should"; -import {Qenv} from "qenv"; -import * as smartnginx from "../dist/index"; +import { tap, expect } from '@pushrocks/tapbundle'; +import path = require('path'); -// setup environment -let testQenv = new Qenv(process.cwd(),path.join(process.cwd(),".nogit")); -describe("smartnginx",function(){ - let testNginxConfig:smartnginx.NginxConfig; - let testNginxZone01:smartnginx.NginxHost; - let testNginxZone02:smartnginx.NginxHost; - describe("NginxZone",function(){ - it(`"new NginxZone()" should produce an instance of NginxConfig`,function(){ - testNginxZone01 = new smartnginx.NginxHost({ - hostName:"test100.bleu.de", - type:smartnginx.hostTypes.reverseProxy, - destination:"192.192.192.191" - }); - testNginxZone02 = new smartnginx.NginxHost({ - hostName:"test102.bleu.de", - type:smartnginx.hostTypes.reverseProxy, - destination:"192.192.192.192" - }); - testNginxZone01.should.be.instanceof(smartnginx.NginxHost); - console.log(testNginxZone01.configString); - }); - }); - describe("NginxConfig",function(){ - this.timeout(10000); - it(`"new NginxConfig()" should produce an instance of NginxConfig`,function(){ - testNginxConfig = new smartnginx.NginxConfig({ - cfEmail: process.env.CF_EMAIL, - cfKey: process.env.CF_KEY, - testMode:true - }); - testNginxConfig.should.be.instanceof(smartnginx.NginxConfig); - }); - describe(".addZone()",function(){ - it("should add a zone to NginxConfig Object",function(){ - testNginxConfig.addHost(testNginxZone01); - testNginxConfig.addHost(testNginxZone02); - }) - }); - describe(".deploy()",function(){ - this.timeout(600000); - it("should deploy a config from an instance",function(done){ - testNginxConfig.deploy() - .then(() => { - done(); - }); - }) - }); - describe(".stop",function(){ - it("should end the process",function(){ - testNginxConfig.nginxProcess.stop(); - }) - }) - }); +import { Qenv } from 'qenv'; +let testQenv = new Qenv(process.cwd(), path.join(process.cwd(), '.nogit')); + + +import * as smartnginx from '../ts'; + +let testSmartNginx: smartnginx.SmartNginx; +let testNginxZone01: smartnginx.NginxHost; +let testNginxZone02: smartnginx.NginxHost; + +tap.test('should create a valid instance of SmartNginx', async () => { + testSmartNginx = new smartnginx.SmartNginx(); + expect(testSmartNginx).to.be.instanceof(smartnginx.SmartNginx); }); + +tap.test(`should produce an instance of NginxConfig`, async () => { + testNginxZone01 = new smartnginx.NginxHost(testSmartNginx, { + hostName: 'test100.bleu.de', + destination: '192.192.192.191' + }); + testNginxZone02 = new smartnginx.NginxHost(testSmartNginx, { + hostName: 'test102.bleu.de', + destination: '192.192.192.192' + }); + expect(testNginxZone01).to.be.instanceof(smartnginx.NginxHost); + console.log(testNginxZone01.configString); +}); + +tap.test('.addZone() should add a zone to NginxConfig Object', async () => { + testSmartNginx.addHost(testNginxZone01); + testSmartNginx.addHost(testNginxZone02); +}); + +tap.test('.deploy() should deploy a config from an instance', async () => { + await testSmartNginx.deploy(); +}); + +tap.test('.stop() should end the process', async () => { + testSmartNginx.nginxProcess.stop(); +}); + +tap.start(); diff --git a/ts/index.ts b/ts/index.ts index ccebe00..48875d4 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -1,6 +1,6 @@ -import * as plugins from "./smartnginx.plugins"; +import * as plugins from './smartnginx.plugins'; // classes -export * from "./smartnginx.classes.nginxconfig"; -export * from "./smartnginx.classes.nginxprocess"; -export * from "./smartnginx.classes.nginxhost"; \ No newline at end of file +export * from './smartnginx.classes.smartnginx'; +export * from './smartnginx.classes.nginxprocess'; +export * from './smartnginx.classes.nginxhost'; diff --git a/ts/smartnginx.classes.certhandler.ts b/ts/smartnginx.classes.certhandler.ts new file mode 100644 index 0000000..94a2a91 --- /dev/null +++ b/ts/smartnginx.classes.certhandler.ts @@ -0,0 +1,5 @@ +import * as plugins from './smartnginx.plugins'; + +export class CertHandler { + +} \ No newline at end of file diff --git a/ts/smartnginx.classes.nginxconfig.ts b/ts/smartnginx.classes.nginxconfig.ts deleted file mode 100644 index 68cc582..0000000 --- a/ts/smartnginx.classes.nginxconfig.ts +++ /dev/null @@ -1,71 +0,0 @@ -import * as plugins from "./smartnginx.plugins"; -import * as paths from "./smartnginx.paths"; -import * as snippets from "./smartnginx.snippets"; -import { NginxHost } from "./smartnginx.classes.nginxhost"; -import { NginxProcess } from "./smartnginx.classes.nginxprocess"; -let allConfigs: NginxConfig[] = []; - -/** - * main class that manages a NginxInstance - */ -export class NginxConfig { - hosts: NginxHost[] = []; - cert: plugins.cert.Cert; // the Cert Instance from which the config gets its certificates - nginxProcess: NginxProcess = new NginxProcess(this); - isDeployed: boolean = false; - constructor(optionsArg: plugins.cert.ICertConstructorOptions) { - this.cert = new plugins.cert.Cert({ - cfEmail: optionsArg.cfEmail, - cfKey: optionsArg.cfKey, - sslDir: paths.nginxCertBase, - gitOriginRepo: optionsArg.gitOriginRepo, - testMode: optionsArg.testMode - }); - }; - - // interact with Hosts - addHost(nginxHostArg: NginxHost){ - this.hosts.push(nginxHostArg); - } - listHosts(): NginxHost[]{ - return this.hosts; - }; - removeHost(nginxHostArg: NginxHost) { - - } - clean() { - this.hosts = []; - } - // handle deployment of hosts - deploy() { - let done = plugins.q.defer(); - plugins.smartfile.fs.ensureDirSync(paths.nginxConfigBase); - plugins.smartfile.fs.ensureDirSync(paths.nginxHostFileBase); - plugins.smartfile.fs.ensureDirSync(paths.nginxCertBase); - for (let config of allConfigs) { - config.isDeployed = false; - }; - this.isDeployed = true; - // write base config - plugins.smartfile.memory.toFsSync( - snippets.getBaseConfigString(), - paths.nginxConfFile - ); - // deploy hosts - let promiseArray = []; - for (let host of this.hosts) { - let hostDeployedPromise = host.deploy(this.cert); - hostDeployedPromise.then(() => { - plugins.beautylog.info(`Host ${host.hostName} deployed!`); - this.nginxProcess.reloadConfig(); - }); - promiseArray.push(hostDeployedPromise); - }; - plugins.q.all(promiseArray) - .then(() => { - done.resolve(); - }); - - return done.promise; - }; -}; diff --git a/ts/smartnginx.classes.nginxhost.ts b/ts/smartnginx.classes.nginxhost.ts index 46f62e2..38ea755 100644 --- a/ts/smartnginx.classes.nginxhost.ts +++ b/ts/smartnginx.classes.nginxhost.ts @@ -1,43 +1,47 @@ -import * as plugins from "./smartnginx.plugins"; -import * as paths from "./smartnginx.paths"; -import * as snippets from "./smartnginx.snippets" +import * as plugins from './smartnginx.plugins'; +import * as paths from './smartnginx.paths'; +import * as snippets from './smartnginx.snippets'; + +import { SmartNginx } from './smartnginx.classes.smartnginx'; /** * the host config data that NginxHost needs to create a valid instance */ export interface IHostConfigData { - hostName: string, - type: hostTypes, - destination: string + hostName: string; + destination: string; } export enum hostTypes { - reverseProxy, - static + reverseProxy } /** * manages a single nginx host */ export class NginxHost { - hostName: string; // the host name e.g. domain name - type: hostTypes; - destination: string; - configString: string; // the actual host config file as string - constructor(optionsArg:IHostConfigData) { - this.hostName = optionsArg.hostName; - this.type = optionsArg.type; - this.destination = optionsArg.destination; - this.configString = snippets.getHostConfigString(optionsArg.hostName, optionsArg.destination); - }; - deploy(certInstanceArg: plugins.cert.Cert) { - let done = plugins.q.defer(); - let filePath = plugins.path.join(paths.nginxHostFileBase, this.hostName + ".conf"); - // writeConfig - plugins.smartfile.memory.toFsSync(this.configString, filePath); - // get cert - certInstanceArg.getDomainCert(this.hostName) - .then(done.resolve); - return done.promise; - }; -}; \ No newline at end of file + /** + * smartnginxInstance this NginHost belongs to + */ + smartnginxInstance: SmartNginx + + hostName: string; // the host name e.g. domain name + destination: string; + configString: string; // the actual host config file as string + constructor(smartnginxInstanceArg: SmartNginx, optionsArg: IHostConfigData) { + this.smartnginxInstance = smartnginxInstanceArg; + this.hostName = optionsArg.hostName; + this.destination = optionsArg.destination; + this.configString = snippets.getHostConfigString(optionsArg.hostName, optionsArg.destination); + } + + /** + * + * @param certInstanceArg + */ + async deploy() { + let filePath = plugins.path.join(paths.nginxHostFileBase, this.hostName + '.conf'); + // writeConfig + plugins.smartfile.memory.toFsSync(this.configString, filePath); + } +} diff --git a/ts/smartnginx.classes.nginxprocess.ts b/ts/smartnginx.classes.nginxprocess.ts index c644219..a7833ad 100644 --- a/ts/smartnginx.classes.nginxprocess.ts +++ b/ts/smartnginx.classes.nginxprocess.ts @@ -1,74 +1,82 @@ -import * as plugins from "./smartnginx.plugins"; -import * as paths from "./smartnginx.paths"; -import { NginxConfig } from "./smartnginx.classes.nginxconfig"; -import { NginxHost } from "./smartnginx.classes.nginxhost"; +import * as plugins from './smartnginx.plugins'; +import * as paths from './smartnginx.paths'; +import { SmartNginx } from './smartnginx.classes.smartnginx'; +import { NginxHost } from './smartnginx.classes.nginxhost'; + +import { Smartshell } from '@pushrocks/smartshell'; /** * manages a nginxprocess for an NginxConfig */ export class NginxProcess { - started: boolean = false; - nginxConfig:NginxConfig; - nginxChildProcess: plugins.childProcess.ChildProcess; - constructor(nginxConfigArg) { - this.nginxConfig = nginxConfigArg; - }; + started: boolean = false; + nginxConfig: SmartNginx; + nginxChildProcess: plugins.childProcess.ChildProcess; + smartshellInstance = new Smartshell({ + executor: 'bash' + }); + constructor(nginxConfigArg) { + this.nginxConfig = nginxConfigArg; + } - /** - * start nginx - */ - start() { - let done = plugins.q.defer(); - if (typeof this.nginxChildProcess == "undefined"){ - this.nginxChildProcess = plugins.childProcess.exec(`nginx -c ${paths.nginxConfFile}`, function (error, stdout, stderr) { - console.log(`stdout: ${stdout}`); - console.log(`stderr: ${stderr}`); - if (error !== null) { - console.log(`exec error: ${error}`); - }; - }); - }; - this.started = true; - plugins.beautylog.info("started Nginx!"); - done.resolve(); - return done.promise; - }; + /** + * start nginx + */ + start() { + let done = plugins.smartpromise.defer(); + if (typeof this.nginxChildProcess == 'undefined') { + this.nginxChildProcess = plugins.childProcess.exec( + `nginx -c ${paths.nginxConfFile}`, + function(error, stdout, stderr) { + console.log(`stdout: ${stdout}`); + console.log(`stderr: ${stderr}`); + if (error !== null) { + console.log(`exec error: ${error}`); + } + } + ); + } + this.started = true; + plugins.smartlog.defaultLogger.info('started Nginx!'); + done.resolve(); + return done.promise; + } - /** - * reload config - */ - reloadConfig(){ - let done = plugins.q.defer(); - if(this.started == false){ - this.start(); - } else { - plugins.shelljs.exec("nginx -s reload"); - }; - plugins.beautylog.ok("NginxProcess has loaded the new config!") - done.resolve(); - return done.promise; - }; + /** + * reload config + */ + reloadConfig() { + let done = plugins.smartpromise.defer(); + if (this.started == false) { + this.start(); + } else { + this.smartshellInstance.exec('nginx -s reload'); + } + plugins.smartlog.defaultLogger.info('NginxProcess has loaded the new config!'); + done.resolve(); + return done.promise; + } - /** - * stop the nginx instance - */ - stop() { - let done = plugins.q.defer(); - if (typeof this.nginxChildProcess != "undefined") { - plugins.shelljs.exec("nginx -s quit"); - this.started = false; - plugins.beautylog.info("stopped Nginx!"); - } else { - plugins.beautylog.log("nginx already stopped!"); - }; - done.resolve(); - return done.promise; - }; + /** + * stop the nginx instance + */ + stop() { + let done = plugins.smartpromise.defer(); + if (typeof this.nginxChildProcess != 'undefined') { + this.smartshellInstance.exec('nginx -s quit'); + this.started = false; + plugins.smartlog.defaultLogger.info('stopped Nginx!'); + } else { + plugins.smartlog.defaultLogger.info('nginx already stopped!'); + } + done.resolve(); + return done.promise; + } - /** - * checks if nginx is in path - */ - check(): boolean { - return; - }; + /** + * checks if nginx is in path + */ + check(): boolean { + return; + } } diff --git a/ts/smartnginx.classes.smartnginx.ts b/ts/smartnginx.classes.smartnginx.ts new file mode 100644 index 0000000..f355f59 --- /dev/null +++ b/ts/smartnginx.classes.smartnginx.ts @@ -0,0 +1,74 @@ +import * as plugins from './smartnginx.plugins'; +import * as paths from './smartnginx.paths'; +import * as snippets from './smartnginx.snippets'; +import { NginxHost } from './smartnginx.classes.nginxhost'; +import { NginxProcess } from './smartnginx.classes.nginxprocess'; +import { CertHandler } from './smartnginx.classes.certhandler'; +let allConfigs: SmartNginx[] = []; + +/** + * main class that manages a NginxInstance + */ +export class SmartNginx { + certHandler = new CertHandler(); + hosts: NginxHost[] = []; + nginxProcess: NginxProcess = new NginxProcess(this); + isDeployed: boolean = false; + constructor() { + + }; + + // =================== + // interact with Hosts + // =================== + + /** + * add a host + * @param nginxHostArg + */ + addHost(nginxHostArg: NginxHost) { + this.hosts.push(nginxHostArg); + } + + /** + * listHosts + */ + listHosts(): NginxHost[] { + return this.hosts; + } + + /** + * remove a Host + * @param nginxHostArg + */ + removeHost(nginxHostArg: NginxHost) {} + + /** + * clean all hosts + */ + clean() { + this.hosts = []; + } + + /** + * deploy the current stack and restart nginx + */ + async deploy() { + plugins.smartfile.fs.ensureDirSync(paths.nginxConfigBase); + plugins.smartfile.fs.ensureDirSync(paths.nginxHostFileBase); + plugins.smartfile.fs.ensureDirSync(paths.nginxCertBase); + for (let config of allConfigs) { + config.isDeployed = false; + } + this.isDeployed = true; + // write base config + plugins.smartfile.memory.toFsSync(snippets.getBaseConfigString(), paths.nginxConfFile); + // deploy hosts + let promiseArray = []; + for (let host of this.hosts) { + await host.deploy(); + plugins.smartlog.defaultLogger.info(`Host ${host.hostName} deployed!`); + this.nginxProcess.reloadConfig(); + }; + } +} diff --git a/ts/smartnginx.paths.ts b/ts/smartnginx.paths.ts index aacc0e2..dfe238d 100644 --- a/ts/smartnginx.paths.ts +++ b/ts/smartnginx.paths.ts @@ -1,10 +1,11 @@ -import * as plugins from "./smartnginx.plugins" +import * as plugins from './smartnginx.plugins'; // directories -export let packageBase = plugins.path.join(__dirname,"../"); -export let nginxConfigBase = plugins.path.join(packageBase,"nginxconfig"); -export let nginxHostFileBase = plugins.path.join(nginxConfigBase,"hosts"); -export let nginxCertBase = plugins.path.join(nginxConfigBase,"cert"); +export let packageBase = plugins.path.join(__dirname, '../'); +export let nginxConfigBase = plugins.path.join(packageBase, 'nginxconfig'); + +export let nginxHostFileBase = plugins.path.join(nginxConfigBase, 'hosts'); +export let nginxCertBase = plugins.path.join(nginxConfigBase, 'cert'); // files -export let nginxConfFile = plugins.path.join(nginxConfigBase,"nginx.conf"); \ No newline at end of file +export let nginxConfFile = plugins.path.join(nginxConfigBase, 'nginx.conf'); diff --git a/ts/smartnginx.plugins.ts b/ts/smartnginx.plugins.ts index 0dcc0b0..add5bcf 100644 --- a/ts/smartnginx.plugins.ts +++ b/ts/smartnginx.plugins.ts @@ -1,9 +1,17 @@ -import "typings-global"; -export import beautylog = require("beautylog"); -export import cert = require("cert"); -export import childProcess = require("child_process"); -export import path = require("path"); -export import q = require("q"); -export import shelljs = require("shelljs"); -export import smartfile = require("smartfile"); -export import smartstring = require("smartstring"); \ No newline at end of file +import * as smartlog from '@pushrocks/smartlog'; +import * as childProcess from 'child_process'; +import * as path from 'path'; +import * as smartpromise from '@pushrocks/smartpromise'; +import * as smartshell from '@pushrocks/smartshell'; +import * as smartfile from '@pushrocks/smartfile'; +import * as smartstring from '@pushrocks/smartstring'; + +export { + smartlog, + childProcess, + path, + smartpromise, + smartshell, + smartfile, + smartstring +} \ No newline at end of file diff --git a/ts/smartnginx.snippets.ts b/ts/smartnginx.snippets.ts index f1b1ac8..ab9eb16 100644 --- a/ts/smartnginx.snippets.ts +++ b/ts/smartnginx.snippets.ts @@ -1,7 +1,7 @@ -import * as plugins from "./smartnginx.plugins"; -import * as paths from "./smartnginx.paths"; +import * as plugins from './smartnginx.plugins'; +import * as paths from './smartnginx.paths'; export let getBaseConfigString = () => { - let baseConfig = plugins.smartstring.indent.normalize(` + let baseConfig = plugins.smartstring.indent.normalize(` user www-data; worker_processes auto; pid /run/nginx.pid; @@ -68,12 +68,11 @@ export let getBaseConfigString = () => { } daemon off; `); - return baseConfig; -} + return baseConfig; +}; - -export let getHostConfigString = (hostNameArg:string,destinationIpArg:string) => { - let hostConfig = plugins.smartstring.indent.normalize(` +export let getHostConfigString = (hostNameArg: string, destinationIpArg: string) => { + let hostConfig = plugins.smartstring.indent.normalize(` upstream ${hostNameArg} { server ${destinationIpArg}; } @@ -99,6 +98,5 @@ export let getHostConfigString = (hostNameArg:string,destinationIpArg:string) => } } `); - return hostConfig; + return hostConfig; }; -