├── .eslintrc.json ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── docs ├── Makefile ├── conf.py ├── index.rst └── make.bat ├── main.js ├── package-lock.json ├── package.json ├── readme-php-options.txt ├── server.js └── test ├── index.js └── php └── index.php /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true 4 | }, 5 | "extends": "eslint:recommended", 6 | "ignore": [ 7 | "node_modules" 8 | ], 9 | "rules": { 10 | "indent": [ 11 | "error", 12 | 2 13 | ], 14 | "linebreak-style": [ 15 | "error", 16 | "unix" 17 | ], 18 | "quotes": [ 19 | "error", 20 | "single" 21 | ], 22 | "semi": [ 23 | "error", 24 | "always" 25 | ] 26 | } 27 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | example 2 | php-0.0.1.tgz 3 | .git 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This software is distributed under MIT license. 2 | 3 | Copyright (c) 2014-2016 Martin K. Schröder 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | NodeCGIEmbedded - run php scripts like wordpress, drupal, etc with node and cgi counter parts 3 | --------------------------------------------------------- 4 | 5 | With Node PHP Embedded you can leverage the speed of node js and run all of the widely available php scripts directly inside your express site. 6 | 7 | This is a fork of http://github.com/mkschreder/node-php and has been modified for making this take dynamic PHP pathing, so that it can run without a PHP distribution installed on a machine and can work with an embedded PHP binary distribution. 8 | 9 | 10 | 11 | Installation 12 | ------------ 13 | 14 | ``` 15 | npm install phpcgijs --save 16 | ``` 17 | 18 | Usage 19 | ----- 20 | 21 | To run php scripts with node js and express create the following script like below: 22 | 23 | ```javascript 24 | 25 | var express = require('express'); 26 | var php = require("./main"); 27 | // var php = require("phpcgijs"); 28 | var path = require("path"); 29 | 30 | var app = express(); 31 | var p = path.join("test/php"); 32 | 33 | // Following is the structure for providing the declaration of paths and options: 34 | 35 | // app.use("/", php.cgi( 36 | // "/path/to/phpscript.php", 37 | // { 38 | // "options": {"-c": "/to/php/ini/path/php.ini"} 39 | // } 40 | // )); 41 | 42 | // Following works without a local PHP-CGI path and tries to 43 | // use PHP-CGI installed in system by default: 44 | 45 | // app.use("/", php.cgi("/path/to/phpscript")); 46 | 47 | // Following uses a path in second argument defining the local copy of 48 | // PHP-CGI that you want to use for the application 49 | 50 | // app.use("/", php.cgi( 51 | // "/path/to/phpscript.php", 52 | // { 53 | // "cgi_path":"to/php/cgi/path/php-cgi", 54 | // "options": {"-c": "/to/php/ini/path/php.ini"} 55 | // } 56 | // )); 57 | 58 | // options are PHP-CGI command line options and can be found in documentation 59 | // It can also be found in readme-php-options.txt (check for update in docs) 60 | // options ignore -h and --help 61 | 62 | app.use("/", php.cgi(p, { cgi_path: '/usr/bin/', options: { "-c": "/etc/php.ini" } })); 63 | app.listen(9090, '127.0.0.1'); 64 | console.log("Server listening at 9090!"); 65 | 66 | ``` 67 | 68 | Explanation 69 | ----------- 70 | 71 | The script will pipe all files that end in the .php extension through the php parser. All other files will be served as static content. 72 | 73 | Basic permalinks are supported but the support for them can probably be improved. 74 | 75 | Dependencies 76 | ------------ 77 | 78 | # php-cgi 79 | 80 | * You need to have the interpreter installed in the system in order to use this extension. 81 | * Alternatively, You can specify the full path of locally available php-cgi path. 82 | * If custom path not specified in express, it tries to find the system installed php-cgi executable. If still unavailable, the server errors out. 83 | * TODO: 84 | - Add php.ini path config 85 | - app.use("/", php.cgi("/path/to/phpscript", "to/php/cgi/path", '/path/to/php.ini')); 86 | 87 | License 88 | ------- 89 | 90 | Copyright © 2019 - till it works Ganesh B 91 | 92 | The MIT License (MIT) - See [LICENSE](./LICENSE) for further details. 93 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | SOURCEDIR = . 8 | BUILDDIR = _build 9 | 10 | # Put it first so that "make" without argument is like "make help". 11 | help: 12 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 13 | 14 | .PHONY: help Makefile 15 | 16 | # Catch-all target: route all unknown targets to Sphinx using the new 17 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 18 | %: Makefile 19 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # Configuration file for the Sphinx documentation builder. 4 | # 5 | # This file does only contain a selection of the most common options. For a 6 | # full list see the documentation: 7 | # http://www.sphinx-doc.org/en/master/config 8 | 9 | # -- Path setup -------------------------------------------------------------- 10 | 11 | # If extensions (or modules to document with autodoc) are in another directory, 12 | # add these directories to sys.path here. If the directory is relative to the 13 | # documentation root, use os.path.abspath to make it absolute, like shown here. 14 | # 15 | # import os 16 | # import sys 17 | # sys.path.insert(0, os.path.abspath('.')) 18 | 19 | 20 | # -- Project information ----------------------------------------------------- 21 | 22 | project = u'node-php' 23 | copyright = u'2020, Martin K. Schröder' 24 | author = u'Martin K. Schröder' 25 | 26 | # The short X.Y version 27 | version = u'' 28 | # The full version, including alpha/beta/rc tags 29 | release = u'' 30 | 31 | 32 | # -- General configuration --------------------------------------------------- 33 | 34 | # If your documentation needs a minimal Sphinx version, state it here. 35 | # 36 | # needs_sphinx = '1.0' 37 | 38 | # Add any Sphinx extension module names here, as strings. They can be 39 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 40 | # ones. 41 | extensions = [ 42 | ] 43 | 44 | # Add any paths that contain templates here, relative to this directory. 45 | templates_path = ['_templates'] 46 | 47 | # The suffix(es) of source filenames. 48 | # You can specify multiple suffix as a list of string: 49 | # 50 | # source_suffix = ['.rst', '.md'] 51 | source_suffix = '.rst' 52 | 53 | # The master toctree document. 54 | master_doc = 'index' 55 | 56 | # The language for content autogenerated by Sphinx. Refer to documentation 57 | # for a list of supported languages. 58 | # 59 | # This is also used if you do content translation via gettext catalogs. 60 | # Usually you set "language" from the command line for these cases. 61 | language = None 62 | 63 | # List of patterns, relative to source directory, that match files and 64 | # directories to ignore when looking for source files. 65 | # This pattern also affects html_static_path and html_extra_path. 66 | exclude_patterns = [u'_build', 'Thumbs.db', '.DS_Store'] 67 | 68 | # The name of the Pygments (syntax highlighting) style to use. 69 | pygments_style = None 70 | 71 | 72 | # -- Options for HTML output ------------------------------------------------- 73 | 74 | # The theme to use for HTML and HTML Help pages. See the documentation for 75 | # a list of builtin themes. 76 | # 77 | html_theme = 'sphinx_rtd_theme' 78 | 79 | # Theme options are theme-specific and customize the look and feel of a theme 80 | # further. For a list of options available for each theme, see the 81 | # documentation. 82 | # 83 | # html_theme_options = {} 84 | 85 | # Add any paths that contain custom static files (such as style sheets) here, 86 | # relative to this directory. They are copied after the builtin static files, 87 | # so a file named "default.css" will overwrite the builtin "default.css". 88 | html_static_path = ['_static'] 89 | 90 | # Custom sidebar templates, must be a dictionary that maps document names 91 | # to template names. 92 | # 93 | # The default sidebars (for documents that don't match any pattern) are 94 | # defined by theme itself. Builtin themes are using these templates by 95 | # default: ``['localtoc.html', 'relations.html', 'sourcelink.html', 96 | # 'searchbox.html']``. 97 | # 98 | # html_sidebars = {} 99 | 100 | 101 | # -- Options for HTMLHelp output --------------------------------------------- 102 | 103 | # Output file base name for HTML help builder. 104 | htmlhelp_basename = 'node-phpdoc' 105 | 106 | 107 | # -- Options for LaTeX output ------------------------------------------------ 108 | 109 | latex_elements = { 110 | # The paper size ('letterpaper' or 'a4paper'). 111 | # 112 | # 'papersize': 'letterpaper', 113 | 114 | # The font size ('10pt', '11pt' or '12pt'). 115 | # 116 | # 'pointsize': '10pt', 117 | 118 | # Additional stuff for the LaTeX preamble. 119 | # 120 | # 'preamble': '', 121 | 122 | # Latex figure (float) alignment 123 | # 124 | # 'figure_align': 'htbp', 125 | } 126 | 127 | # Grouping the document tree into LaTeX files. List of tuples 128 | # (source start file, target name, title, 129 | # author, documentclass [howto, manual, or own class]). 130 | latex_documents = [ 131 | (master_doc, 'node-php.tex', u'node-php Documentation', 132 | u'Martin K. Schröder', 'manual'), 133 | ] 134 | 135 | 136 | # -- Options for manual page output ------------------------------------------ 137 | 138 | # One entry per manual page. List of tuples 139 | # (source start file, name, description, authors, manual section). 140 | man_pages = [ 141 | (master_doc, 'node-php', u'node-php Documentation', 142 | [author], 1) 143 | ] 144 | 145 | 146 | # -- Options for Texinfo output ---------------------------------------------- 147 | 148 | # Grouping the document tree into Texinfo files. List of tuples 149 | # (source start file, target name, title, author, 150 | # dir menu entry, description, category) 151 | texinfo_documents = [ 152 | (master_doc, 'node-php', u'node-php Documentation', 153 | author, 'node-php', 'One line description of project.', 154 | 'Miscellaneous'), 155 | ] 156 | 157 | 158 | # -- Options for Epub output ------------------------------------------------- 159 | 160 | # Bibliographic Dublin Core info. 161 | epub_title = project 162 | 163 | # The unique identifier of the text. This can be a ISBN number 164 | # or the project homepage. 165 | # 166 | # epub_identifier = '' 167 | 168 | # A unique identification for the text. 169 | # 170 | # epub_uid = '' 171 | 172 | # A list of files that should not be packed into the epub file. 173 | epub_exclude_files = ['search.html'] 174 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. node-php documentation master file, created by 2 | sphinx-quickstart on Sat May 2 20:11:07 2020. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Node-PHP 7 | ======== 8 | 9 | What if you could host wordpress on nodejs? This project makes it possible. 10 | 11 | NodePHP is a small script I wrote a long time ago when I was experimenting with 12 | NodeJS when it was still in it's infancy. I like the nodejs express framework 13 | and the way it made it possible to quickly set up http servers. 14 | 15 | I had a website running that was served by a nodejs server and I wanted to add 16 | wordpress installation to that website. So I decided why not make it possible 17 | to run php scripts using php-cgi and then serve the results with node? This is 18 | how original NodePHP came about. Since then it has been expanded by other 19 | people and made better. 20 | 21 | Usage: 22 | 23 | .. code-block: javascript 24 | 25 | var express = require('express'); 26 | var php = require("node-php"); 27 | var path = require("path"); 28 | 29 | var app = express(); 30 | var p = path.join("test/php"); 31 | 32 | app.use("/", php.cgi(p, { cgi_path: '/usr/bin/', options: { "-c": "/etc/php.ini" } })); 33 | app.listen(9090, '127.0.0.1'); 34 | console.log("Server listening at 9090!"); 35 | 36 | Run unit tests: 37 | 38 | .. code-block: bash 39 | 40 | npm install chai supertest express shelljs php-cgi 41 | npm test 42 | 43 | Indices and tables 44 | ------------------ 45 | 46 | * :ref:`genindex` 47 | * :ref:`modindex` 48 | * :ref:`search` 49 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | // License: MIT 2 | // Copyright (c) 2014-2016 Martin K. Schröder 3 | // Contribution: 2018 Ganesh K. Bhat Dynamic PHP-CGI path imports for supporting a embedded PHP Interpreter Distribution 4 | 5 | /* eslint no-console: 0 */ 6 | 7 | const URL = require('url'); 8 | const child = require('child_process'); 9 | const path = require('path'); 10 | const fs = require('fs'); 11 | const shell = require('shelljs'); 12 | const util = require('util') 13 | 14 | const PHP_CGI = shell.which('php-cgi'); 15 | 16 | function find_file(url, php_dir, callback) { 17 | var file = path.join(php_dir, url.pathname); 18 | 19 | fs.stat(file, function(err, stat) { 20 | // File does not exist 21 | if (err || stat.isDirectory()) { 22 | if (stat && stat.isDirectory()) { 23 | file = path.join(file, 'index.php'); 24 | } 25 | if (file.includes(__dirname)) { 26 | fs.exists(file, function(exists) { 27 | console.log("File path exists:", file, exists) 28 | callback(exists && file); 29 | }); 30 | } else { 31 | fs.exists(path.join(__dirname, file), function(exists) { 32 | console.log("No file path exists:", file, exists) 33 | callback(exists && file); 34 | }); 35 | } 36 | } 37 | // file found 38 | else { 39 | callback(file); 40 | } 41 | }); 42 | } 43 | 44 | function strOptions(options) { 45 | let optionsArray = Object.entries(options); 46 | let newArray = " "; 47 | for (let i = 0; i < optionsArray.length; i++) { 48 | newArray = newArray + (optionsArray[i][0] + " " + optionsArray[i][1] + " "); 49 | } 50 | return newArray; 51 | } 52 | 53 | function run_php(req, response, next, url, file, exe_config) { 54 | var pathinfo = ''; 55 | var i = req.url.indexOf('.php'); 56 | if (i > 0) { 57 | pathinfo = url.pathname.substring(i + 4) 58 | } else { 59 | pathinfo = url.pathname 60 | }; 61 | 62 | // console.log("run_php pathinfo", pathinfo) 63 | // console.log("run_php req", req) 64 | 65 | var env = { 66 | SERVER_SIGNATURE: 'NodeJS server at localhost', 67 | 68 | // The extra path information, as given in the requested URL. In fact, scripts can be accessed by their virtual path, followed by extra information at the end of this path. The extra information is sent in PATH_INFO. 69 | PATH_INFO: pathinfo, 70 | 71 | // The virtual-to-real mapped version of PATH_INFO. 72 | PATH_TRANSLATED: '', 73 | 74 | // The virtual path of the script being executed. 75 | SCRIPT_NAME: url.pathname, 76 | 77 | SCRIPT_FILENAME: file, 78 | 79 | // The real path of the script being executed. 80 | REQUEST_FILENAME: file, 81 | 82 | // The full URL to the current object requested by the client. 83 | SCRIPT_URI: req.url, 84 | 85 | // The full URI of the current request. It is made of the concatenation of SCRIPT_NAME and PATH_INFO (if available.) 86 | URL: req.url, 87 | 88 | SCRIPT_URL: req.url, 89 | 90 | // The original request URI sent by the client. 91 | REQUEST_URI: req.url, 92 | 93 | // The method used by the current request; usually set to GET or POST. 94 | REQUEST_METHOD: req.method, 95 | 96 | // The information which follows the ? character in the requested URL. 97 | QUERY_STRING: url.query || '', 98 | 99 | // 'multipart/form-data', //'application/x-www-form-urlencoded', //The MIME type of the request body; set only for POST or PUT requests. 100 | CONTENT_TYPE: req.get('Content-Type') || '', 101 | 102 | // The length in bytes of the request body; set only for POST or PUT requests. 103 | CONTENT_LENGTH: req.get('Content-Length') || 0, 104 | 105 | // The authentication type if the client has authenticated itself to access the script. 106 | AUTH_TYPE: '', 107 | 108 | AUTH_USER: '', 109 | 110 | // The name of the user as issued by the client when authenticating itself to access the script. 111 | REMOTE_USER: '', 112 | 113 | // All HTTP headers sent by the client. Headers are separated by carriage return characters (ASCII 13 - \n) and each header name is prefixed by HTTP_, transformed to upper cases, and - characters it contains are replaced by _ characters. 114 | ALL_HTTP: Object.keys(req.headers).map(function(x) { 115 | return 'HTTP_' + x.toUpperCase().replace('-', '_') + ': ' + req.headers[x]; 116 | }).reduce(function(a, b) { 117 | return a + b + '\n'; 118 | }, ''), 119 | 120 | // All HTTP headers as sent by the client in raw form. No transformation on the header names is applied. 121 | ALL_RAW: Object.keys(req.headers).map(function(x) { 122 | return x + ': ' + req.headers[x]; 123 | }).reduce(function(a, b) { 124 | return a + b + '\n'; 125 | }, ''), 126 | 127 | // The web server's software identity. 128 | SERVER_SOFTWARE: 'NodeJS', 129 | 130 | // The host name or the IP address of the computer running the web server as given in the requested URL. 131 | SERVER_NAME: 'localhost', 132 | 133 | // The IP address of the computer running the web server. 134 | SERVER_ADDR: '127.0.0.1', 135 | 136 | // The port to which the request was sent. 137 | SERVER_PORT: 8011, 138 | 139 | // The IP address of the computer running the web server. 140 | SERVER_ADDR: '127.0.0.1', 141 | 142 | // The port to which the request was sent. 143 | SERVER_PORT: 8011, 144 | 145 | // The CGI Specification version supported by the web server; always set to CGI/1.1. 146 | GATEWAY_INTERFACE: 'CGI/1.1', 147 | 148 | // The HTTP protocol version used by the current request. 149 | SERVER_PROTOCOL: '', 150 | 151 | // The IP address of the computer that sent the request. 152 | REMOTE_ADDR: req.headers['x-forwarded-for'] || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress, 153 | 154 | // The port from which the request was sent. 155 | REMOTE_PORT: '', 156 | 157 | // The absolute path of the web site files. It has the same value as Documents Path. 158 | DOCUMENT_ROOT: '', 159 | 160 | // The numerical identifier of the host which served the request. On Abyss Web Server X1, it is always set to 1 since there is only a single host. 161 | INSTANCE_ID: '', 162 | 163 | // The virtual path of the deepest alias which contains the request URI. If no alias contains the request URI, the variable is set to /. 164 | APPL_MD_PATH: '', 165 | 166 | // The real path of the deepest alias which contains the request URI. If no alias contains the request URI, the variable is set to the same value as DOCUMENT_ROOT. 167 | APPL_PHYSICAL_PATH: '', 168 | 169 | // It is set to true if the current request is a subrequest, i.e. a request not directly invoked by a client. Otherwise, it is set to true. Subrequests are generated by the server for internal processing. XSSI includes for example result in subrequests. 170 | IS_SUBREQ: '', 171 | 172 | REDIRECT_STATUS: 1 173 | }; 174 | 175 | Object.keys(req.headers).map(function(x) { 176 | return env['HTTP_' + x.toUpperCase().replace('-', '_')] = req.headers[x]; 177 | }); 178 | 179 | if (/.*?\.php$/.test(path.join(__dirname, file))) { 180 | var res = '', 181 | err = ''; 182 | var php; 183 | 184 | if (!!exe_config.cgi_path && exe_config.cgi_path !== '') { 185 | console.log((exe_config.cgi_path.lastIndexOf("/") == exe_config.cgi_path.length - 1 ? exe_config.cgi_path : exe_config.cgi_path + "/") + "php-cgi" + strOptions(exe_config.options)); 186 | 187 | php = child.spawn( 188 | (exe_config.cgi_path.lastIndexOf("/") == exe_config.cgi_path.length - 1 ? 189 | exe_config.cgi_path : exe_config.cgi_path + "/") + "php-cgi", 190 | [strOptions(exe_config.options)], { 191 | env: env 192 | }); 193 | } else { 194 | if (!PHP_CGI) { 195 | throw new Error('"php-cgi" cannot be found'); 196 | } 197 | php = child.spawn(PHP_CGI, [strOptions(exe_config)], { 198 | env: env 199 | }); 200 | } 201 | 202 | // php.stdin.resume(); 203 | // console.log(req.rawBody); 204 | // (new Stream(req.rawBody)).pipe(php.stdin); 205 | 206 | php.stdin.on('error', function() { 207 | console.error("Error from server") 208 | }); 209 | 210 | // pipe request stream directly into the php process 211 | req.pipe(php.stdin); 212 | req.resume(); 213 | 214 | // php.stdin.write('\n'); 215 | // php.stdin.end(); 216 | 217 | php.stdout.on('data', function(data) { 218 | res += data.toString(); 219 | }); 220 | php.stderr.on('data', function(data) { 221 | err += data.toString(); 222 | }); 223 | php.on('error', function(err) { 224 | console.error("error", err); 225 | }); 226 | php.on('exit', function() { 227 | 228 | // extract headers 229 | php.stdin.end(); 230 | 231 | var lines = res.split('\r\n'); 232 | var line = 0; 233 | var html = ''; 234 | if (lines.length) { 235 | do { 236 | var m = lines[line].split(': '); 237 | if (m[0] === '') break; 238 | if (m[0] == 'Status') { 239 | response.statusCode = parseInt(m[1]); 240 | } 241 | if (m.length == 2) { 242 | response.setHeader(m[0], m[1]); 243 | } 244 | line++; 245 | } while (lines[line] !== ''); 246 | 247 | html = lines.splice(line + 1).join('\n'); 248 | } else { 249 | html = res; 250 | } 251 | 252 | // console.log('STATUS: '+response.statusCode); 253 | 254 | response.status(response.statusCode).send(html); 255 | response.end(); 256 | }); 257 | } else { 258 | response.sendFile(file); 259 | } 260 | } 261 | 262 | exports.cgi = function(php_root, exe_config) { 263 | return function(req, res, next) { 264 | 265 | // stop stream until child-process is opened 266 | req.pause(); 267 | var url = URL.parse(req.url); 268 | 269 | if(!exe_config) { 270 | exe_config = { cgi_path: '/usr/bin/', options: { "-c": "/etc/php.ini" }}; 271 | } 272 | 273 | file = find_file(url, php_root, function(file) { 274 | if (file) { 275 | // console.log("find_file call", exe_config.php_cgi_path, file); 276 | run_php(req, res, next, url, file, exe_config); 277 | } else { 278 | next(); 279 | } 280 | }) 281 | }; 282 | }; 283 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "phpcgijs", 3 | "version": "1.0.0-beta8", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.8.3", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 10 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.8.3" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.8.3", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", 19 | "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "@types/color-name": { 28 | "version": "1.1.1", 29 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 30 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 31 | "dev": true 32 | }, 33 | "accepts": { 34 | "version": "1.3.7", 35 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 36 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 37 | "requires": { 38 | "mime-types": "~2.1.24", 39 | "negotiator": "0.6.2" 40 | } 41 | }, 42 | "acorn": { 43 | "version": "7.1.1", 44 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", 45 | "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", 46 | "dev": true 47 | }, 48 | "acorn-jsx": { 49 | "version": "5.2.0", 50 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", 51 | "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", 52 | "dev": true 53 | }, 54 | "ajv": { 55 | "version": "6.12.0", 56 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", 57 | "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", 58 | "dev": true, 59 | "requires": { 60 | "fast-deep-equal": "^3.1.1", 61 | "fast-json-stable-stringify": "^2.0.0", 62 | "json-schema-traverse": "^0.4.1", 63 | "uri-js": "^4.2.2" 64 | } 65 | }, 66 | "ansi-colors": { 67 | "version": "3.2.3", 68 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", 69 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", 70 | "dev": true 71 | }, 72 | "ansi-escapes": { 73 | "version": "4.3.1", 74 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", 75 | "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", 76 | "dev": true, 77 | "requires": { 78 | "type-fest": "^0.11.0" 79 | }, 80 | "dependencies": { 81 | "type-fest": { 82 | "version": "0.11.0", 83 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", 84 | "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", 85 | "dev": true 86 | } 87 | } 88 | }, 89 | "ansi-regex": { 90 | "version": "5.0.0", 91 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 92 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 93 | "dev": true 94 | }, 95 | "ansi-styles": { 96 | "version": "3.2.1", 97 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 98 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 99 | "dev": true, 100 | "requires": { 101 | "color-convert": "^1.9.0" 102 | } 103 | }, 104 | "anymatch": { 105 | "version": "3.1.1", 106 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 107 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 108 | "dev": true, 109 | "requires": { 110 | "normalize-path": "^3.0.0", 111 | "picomatch": "^2.0.4" 112 | } 113 | }, 114 | "argparse": { 115 | "version": "1.0.10", 116 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 117 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 118 | "dev": true, 119 | "requires": { 120 | "sprintf-js": "~1.0.2" 121 | } 122 | }, 123 | "array-flatten": { 124 | "version": "1.1.1", 125 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 126 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 127 | }, 128 | "assertion-error": { 129 | "version": "1.1.0", 130 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 131 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 132 | "dev": true 133 | }, 134 | "astral-regex": { 135 | "version": "1.0.0", 136 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 137 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 138 | "dev": true 139 | }, 140 | "asynckit": { 141 | "version": "0.4.0", 142 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 143 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 144 | "dev": true 145 | }, 146 | "balanced-match": { 147 | "version": "1.0.0", 148 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 149 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 150 | "dev": true 151 | }, 152 | "binary-extensions": { 153 | "version": "2.0.0", 154 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", 155 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", 156 | "dev": true 157 | }, 158 | "body-parser": { 159 | "version": "1.19.0", 160 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 161 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 162 | "requires": { 163 | "bytes": "3.1.0", 164 | "content-type": "~1.0.4", 165 | "debug": "2.6.9", 166 | "depd": "~1.1.2", 167 | "http-errors": "1.7.2", 168 | "iconv-lite": "0.4.24", 169 | "on-finished": "~2.3.0", 170 | "qs": "6.7.0", 171 | "raw-body": "2.4.0", 172 | "type-is": "~1.6.17" 173 | } 174 | }, 175 | "brace-expansion": { 176 | "version": "1.1.11", 177 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 178 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 179 | "dev": true, 180 | "requires": { 181 | "balanced-match": "^1.0.0", 182 | "concat-map": "0.0.1" 183 | } 184 | }, 185 | "braces": { 186 | "version": "3.0.2", 187 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 188 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 189 | "dev": true, 190 | "requires": { 191 | "fill-range": "^7.0.1" 192 | } 193 | }, 194 | "browser-stdout": { 195 | "version": "1.3.1", 196 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 197 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 198 | "dev": true 199 | }, 200 | "bytes": { 201 | "version": "3.1.0", 202 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 203 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 204 | }, 205 | "callsites": { 206 | "version": "3.1.0", 207 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 208 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 209 | "dev": true 210 | }, 211 | "camelcase": { 212 | "version": "5.3.1", 213 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 214 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 215 | "dev": true 216 | }, 217 | "chai": { 218 | "version": "4.2.0", 219 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", 220 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", 221 | "dev": true, 222 | "requires": { 223 | "assertion-error": "^1.1.0", 224 | "check-error": "^1.0.2", 225 | "deep-eql": "^3.0.1", 226 | "get-func-name": "^2.0.0", 227 | "pathval": "^1.1.0", 228 | "type-detect": "^4.0.5" 229 | } 230 | }, 231 | "chalk": { 232 | "version": "2.4.2", 233 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 234 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 235 | "dev": true, 236 | "requires": { 237 | "ansi-styles": "^3.2.1", 238 | "escape-string-regexp": "^1.0.5", 239 | "supports-color": "^5.3.0" 240 | } 241 | }, 242 | "chardet": { 243 | "version": "0.7.0", 244 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 245 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 246 | "dev": true 247 | }, 248 | "check-error": { 249 | "version": "1.0.2", 250 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 251 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 252 | "dev": true 253 | }, 254 | "chokidar": { 255 | "version": "3.3.0", 256 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", 257 | "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", 258 | "dev": true, 259 | "requires": { 260 | "anymatch": "~3.1.1", 261 | "braces": "~3.0.2", 262 | "fsevents": "~2.1.1", 263 | "glob-parent": "~5.1.0", 264 | "is-binary-path": "~2.1.0", 265 | "is-glob": "~4.0.1", 266 | "normalize-path": "~3.0.0", 267 | "readdirp": "~3.2.0" 268 | } 269 | }, 270 | "cli-cursor": { 271 | "version": "3.1.0", 272 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 273 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 274 | "dev": true, 275 | "requires": { 276 | "restore-cursor": "^3.1.0" 277 | } 278 | }, 279 | "cli-width": { 280 | "version": "2.2.0", 281 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 282 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 283 | "dev": true 284 | }, 285 | "cliui": { 286 | "version": "5.0.0", 287 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 288 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 289 | "dev": true, 290 | "requires": { 291 | "string-width": "^3.1.0", 292 | "strip-ansi": "^5.2.0", 293 | "wrap-ansi": "^5.1.0" 294 | }, 295 | "dependencies": { 296 | "emoji-regex": { 297 | "version": "7.0.3", 298 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 299 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 300 | "dev": true 301 | }, 302 | "is-fullwidth-code-point": { 303 | "version": "2.0.0", 304 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 305 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 306 | "dev": true 307 | }, 308 | "string-width": { 309 | "version": "3.1.0", 310 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 311 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 312 | "dev": true, 313 | "requires": { 314 | "emoji-regex": "^7.0.1", 315 | "is-fullwidth-code-point": "^2.0.0", 316 | "strip-ansi": "^5.1.0" 317 | } 318 | } 319 | } 320 | }, 321 | "color-convert": { 322 | "version": "1.9.3", 323 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 324 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 325 | "dev": true, 326 | "requires": { 327 | "color-name": "1.1.3" 328 | } 329 | }, 330 | "color-name": { 331 | "version": "1.1.3", 332 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 333 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 334 | "dev": true 335 | }, 336 | "combined-stream": { 337 | "version": "1.0.8", 338 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 339 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 340 | "dev": true, 341 | "requires": { 342 | "delayed-stream": "~1.0.0" 343 | } 344 | }, 345 | "component-emitter": { 346 | "version": "1.3.0", 347 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 348 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", 349 | "dev": true 350 | }, 351 | "concat-map": { 352 | "version": "0.0.1", 353 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 354 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 355 | "dev": true 356 | }, 357 | "content-disposition": { 358 | "version": "0.5.3", 359 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 360 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 361 | "requires": { 362 | "safe-buffer": "5.1.2" 363 | } 364 | }, 365 | "content-type": { 366 | "version": "1.0.4", 367 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 368 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 369 | }, 370 | "cookie": { 371 | "version": "0.4.0", 372 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 373 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 374 | }, 375 | "cookie-signature": { 376 | "version": "1.0.6", 377 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 378 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 379 | }, 380 | "cookiejar": { 381 | "version": "2.1.2", 382 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", 383 | "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", 384 | "dev": true 385 | }, 386 | "core-util-is": { 387 | "version": "1.0.2", 388 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 389 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 390 | "dev": true 391 | }, 392 | "cross-spawn": { 393 | "version": "6.0.5", 394 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 395 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 396 | "dev": true, 397 | "requires": { 398 | "nice-try": "^1.0.4", 399 | "path-key": "^2.0.1", 400 | "semver": "^5.5.0", 401 | "shebang-command": "^1.2.0", 402 | "which": "^1.2.9" 403 | }, 404 | "dependencies": { 405 | "semver": { 406 | "version": "5.7.1", 407 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 408 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 409 | "dev": true 410 | } 411 | } 412 | }, 413 | "debug": { 414 | "version": "2.6.9", 415 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 416 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 417 | "requires": { 418 | "ms": "2.0.0" 419 | } 420 | }, 421 | "decamelize": { 422 | "version": "1.2.0", 423 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 424 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 425 | "dev": true 426 | }, 427 | "deep-eql": { 428 | "version": "3.0.1", 429 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 430 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 431 | "dev": true, 432 | "requires": { 433 | "type-detect": "^4.0.0" 434 | } 435 | }, 436 | "deep-is": { 437 | "version": "0.1.3", 438 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 439 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 440 | "dev": true 441 | }, 442 | "define-properties": { 443 | "version": "1.1.3", 444 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 445 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 446 | "dev": true, 447 | "requires": { 448 | "object-keys": "^1.0.12" 449 | } 450 | }, 451 | "delayed-stream": { 452 | "version": "1.0.0", 453 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 454 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 455 | "dev": true 456 | }, 457 | "depd": { 458 | "version": "1.1.2", 459 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 460 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 461 | }, 462 | "destroy": { 463 | "version": "1.0.4", 464 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 465 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 466 | }, 467 | "diff": { 468 | "version": "3.5.0", 469 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 470 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 471 | "dev": true 472 | }, 473 | "doctrine": { 474 | "version": "3.0.0", 475 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 476 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 477 | "dev": true, 478 | "requires": { 479 | "esutils": "^2.0.2" 480 | } 481 | }, 482 | "ee-first": { 483 | "version": "1.1.1", 484 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 485 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 486 | }, 487 | "emoji-regex": { 488 | "version": "8.0.0", 489 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 490 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 491 | "dev": true 492 | }, 493 | "encodeurl": { 494 | "version": "1.0.2", 495 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 496 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 497 | }, 498 | "es-abstract": { 499 | "version": "1.17.4", 500 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", 501 | "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", 502 | "dev": true, 503 | "requires": { 504 | "es-to-primitive": "^1.2.1", 505 | "function-bind": "^1.1.1", 506 | "has": "^1.0.3", 507 | "has-symbols": "^1.0.1", 508 | "is-callable": "^1.1.5", 509 | "is-regex": "^1.0.5", 510 | "object-inspect": "^1.7.0", 511 | "object-keys": "^1.1.1", 512 | "object.assign": "^4.1.0", 513 | "string.prototype.trimleft": "^2.1.1", 514 | "string.prototype.trimright": "^2.1.1" 515 | } 516 | }, 517 | "es-to-primitive": { 518 | "version": "1.2.1", 519 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 520 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 521 | "dev": true, 522 | "requires": { 523 | "is-callable": "^1.1.4", 524 | "is-date-object": "^1.0.1", 525 | "is-symbol": "^1.0.2" 526 | } 527 | }, 528 | "escape-html": { 529 | "version": "1.0.3", 530 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 531 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 532 | }, 533 | "escape-string-regexp": { 534 | "version": "1.0.5", 535 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 536 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 537 | "dev": true 538 | }, 539 | "eslint": { 540 | "version": "6.8.0", 541 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", 542 | "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", 543 | "dev": true, 544 | "requires": { 545 | "@babel/code-frame": "^7.0.0", 546 | "ajv": "^6.10.0", 547 | "chalk": "^2.1.0", 548 | "cross-spawn": "^6.0.5", 549 | "debug": "^4.0.1", 550 | "doctrine": "^3.0.0", 551 | "eslint-scope": "^5.0.0", 552 | "eslint-utils": "^1.4.3", 553 | "eslint-visitor-keys": "^1.1.0", 554 | "espree": "^6.1.2", 555 | "esquery": "^1.0.1", 556 | "esutils": "^2.0.2", 557 | "file-entry-cache": "^5.0.1", 558 | "functional-red-black-tree": "^1.0.1", 559 | "glob-parent": "^5.0.0", 560 | "globals": "^12.1.0", 561 | "ignore": "^4.0.6", 562 | "import-fresh": "^3.0.0", 563 | "imurmurhash": "^0.1.4", 564 | "inquirer": "^7.0.0", 565 | "is-glob": "^4.0.0", 566 | "js-yaml": "^3.13.1", 567 | "json-stable-stringify-without-jsonify": "^1.0.1", 568 | "levn": "^0.3.0", 569 | "lodash": "^4.17.14", 570 | "minimatch": "^3.0.4", 571 | "mkdirp": "^0.5.1", 572 | "natural-compare": "^1.4.0", 573 | "optionator": "^0.8.3", 574 | "progress": "^2.0.0", 575 | "regexpp": "^2.0.1", 576 | "semver": "^6.1.2", 577 | "strip-ansi": "^5.2.0", 578 | "strip-json-comments": "^3.0.1", 579 | "table": "^5.2.3", 580 | "text-table": "^0.2.0", 581 | "v8-compile-cache": "^2.0.3" 582 | }, 583 | "dependencies": { 584 | "debug": { 585 | "version": "4.1.1", 586 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 587 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 588 | "dev": true, 589 | "requires": { 590 | "ms": "^2.1.1" 591 | } 592 | }, 593 | "ms": { 594 | "version": "2.1.2", 595 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 596 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 597 | "dev": true 598 | } 599 | } 600 | }, 601 | "eslint-scope": { 602 | "version": "5.0.0", 603 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", 604 | "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", 605 | "dev": true, 606 | "requires": { 607 | "esrecurse": "^4.1.0", 608 | "estraverse": "^4.1.1" 609 | } 610 | }, 611 | "eslint-utils": { 612 | "version": "1.4.3", 613 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 614 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 615 | "dev": true, 616 | "requires": { 617 | "eslint-visitor-keys": "^1.1.0" 618 | } 619 | }, 620 | "eslint-visitor-keys": { 621 | "version": "1.1.0", 622 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 623 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 624 | "dev": true 625 | }, 626 | "espree": { 627 | "version": "6.2.1", 628 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", 629 | "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", 630 | "dev": true, 631 | "requires": { 632 | "acorn": "^7.1.1", 633 | "acorn-jsx": "^5.2.0", 634 | "eslint-visitor-keys": "^1.1.0" 635 | } 636 | }, 637 | "esprima": { 638 | "version": "4.0.1", 639 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 640 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 641 | "dev": true 642 | }, 643 | "esquery": { 644 | "version": "1.1.0", 645 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", 646 | "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", 647 | "dev": true, 648 | "requires": { 649 | "estraverse": "^4.0.0" 650 | } 651 | }, 652 | "esrecurse": { 653 | "version": "4.2.1", 654 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 655 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 656 | "dev": true, 657 | "requires": { 658 | "estraverse": "^4.1.0" 659 | } 660 | }, 661 | "estraverse": { 662 | "version": "4.3.0", 663 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 664 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 665 | "dev": true 666 | }, 667 | "esutils": { 668 | "version": "2.0.3", 669 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 670 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 671 | "dev": true 672 | }, 673 | "etag": { 674 | "version": "1.8.1", 675 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 676 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 677 | }, 678 | "express": { 679 | "version": "4.17.1", 680 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 681 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 682 | "requires": { 683 | "accepts": "~1.3.7", 684 | "array-flatten": "1.1.1", 685 | "body-parser": "1.19.0", 686 | "content-disposition": "0.5.3", 687 | "content-type": "~1.0.4", 688 | "cookie": "0.4.0", 689 | "cookie-signature": "1.0.6", 690 | "debug": "2.6.9", 691 | "depd": "~1.1.2", 692 | "encodeurl": "~1.0.2", 693 | "escape-html": "~1.0.3", 694 | "etag": "~1.8.1", 695 | "finalhandler": "~1.1.2", 696 | "fresh": "0.5.2", 697 | "merge-descriptors": "1.0.1", 698 | "methods": "~1.1.2", 699 | "on-finished": "~2.3.0", 700 | "parseurl": "~1.3.3", 701 | "path-to-regexp": "0.1.7", 702 | "proxy-addr": "~2.0.5", 703 | "qs": "6.7.0", 704 | "range-parser": "~1.2.1", 705 | "safe-buffer": "5.1.2", 706 | "send": "0.17.1", 707 | "serve-static": "1.14.1", 708 | "setprototypeof": "1.1.1", 709 | "statuses": "~1.5.0", 710 | "type-is": "~1.6.18", 711 | "utils-merge": "1.0.1", 712 | "vary": "~1.1.2" 713 | } 714 | }, 715 | "extend": { 716 | "version": "3.0.2", 717 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 718 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 719 | "dev": true 720 | }, 721 | "external-editor": { 722 | "version": "3.1.0", 723 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 724 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 725 | "dev": true, 726 | "requires": { 727 | "chardet": "^0.7.0", 728 | "iconv-lite": "^0.4.24", 729 | "tmp": "^0.0.33" 730 | } 731 | }, 732 | "fast-deep-equal": { 733 | "version": "3.1.1", 734 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 735 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", 736 | "dev": true 737 | }, 738 | "fast-json-stable-stringify": { 739 | "version": "2.1.0", 740 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 741 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 742 | "dev": true 743 | }, 744 | "fast-levenshtein": { 745 | "version": "2.0.6", 746 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 747 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 748 | "dev": true 749 | }, 750 | "figures": { 751 | "version": "3.2.0", 752 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 753 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 754 | "dev": true, 755 | "requires": { 756 | "escape-string-regexp": "^1.0.5" 757 | } 758 | }, 759 | "file-entry-cache": { 760 | "version": "5.0.1", 761 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 762 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 763 | "dev": true, 764 | "requires": { 765 | "flat-cache": "^2.0.1" 766 | } 767 | }, 768 | "fill-range": { 769 | "version": "7.0.1", 770 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 771 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 772 | "dev": true, 773 | "requires": { 774 | "to-regex-range": "^5.0.1" 775 | } 776 | }, 777 | "finalhandler": { 778 | "version": "1.1.2", 779 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 780 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 781 | "requires": { 782 | "debug": "2.6.9", 783 | "encodeurl": "~1.0.2", 784 | "escape-html": "~1.0.3", 785 | "on-finished": "~2.3.0", 786 | "parseurl": "~1.3.3", 787 | "statuses": "~1.5.0", 788 | "unpipe": "~1.0.0" 789 | } 790 | }, 791 | "find-up": { 792 | "version": "3.0.0", 793 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 794 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 795 | "dev": true, 796 | "requires": { 797 | "locate-path": "^3.0.0" 798 | } 799 | }, 800 | "flat": { 801 | "version": "4.1.0", 802 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 803 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 804 | "dev": true, 805 | "requires": { 806 | "is-buffer": "~2.0.3" 807 | } 808 | }, 809 | "flat-cache": { 810 | "version": "2.0.1", 811 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 812 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 813 | "dev": true, 814 | "requires": { 815 | "flatted": "^2.0.0", 816 | "rimraf": "2.6.3", 817 | "write": "1.0.3" 818 | } 819 | }, 820 | "flatted": { 821 | "version": "2.0.1", 822 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", 823 | "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", 824 | "dev": true 825 | }, 826 | "form-data": { 827 | "version": "2.5.1", 828 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", 829 | "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", 830 | "dev": true, 831 | "requires": { 832 | "asynckit": "^0.4.0", 833 | "combined-stream": "^1.0.6", 834 | "mime-types": "^2.1.12" 835 | } 836 | }, 837 | "formidable": { 838 | "version": "1.2.2", 839 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", 840 | "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", 841 | "dev": true 842 | }, 843 | "forwarded": { 844 | "version": "0.1.2", 845 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 846 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 847 | }, 848 | "fresh": { 849 | "version": "0.5.2", 850 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 851 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 852 | }, 853 | "fs.realpath": { 854 | "version": "1.0.0", 855 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 856 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 857 | "dev": true 858 | }, 859 | "fsevents": { 860 | "version": "2.1.2", 861 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", 862 | "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", 863 | "dev": true, 864 | "optional": true 865 | }, 866 | "function-bind": { 867 | "version": "1.1.1", 868 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 869 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 870 | "dev": true 871 | }, 872 | "functional-red-black-tree": { 873 | "version": "1.0.1", 874 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 875 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 876 | "dev": true 877 | }, 878 | "get-caller-file": { 879 | "version": "2.0.5", 880 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 881 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 882 | "dev": true 883 | }, 884 | "get-func-name": { 885 | "version": "2.0.0", 886 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 887 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 888 | "dev": true 889 | }, 890 | "glob": { 891 | "version": "7.1.6", 892 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 893 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 894 | "dev": true, 895 | "requires": { 896 | "fs.realpath": "^1.0.0", 897 | "inflight": "^1.0.4", 898 | "inherits": "2", 899 | "minimatch": "^3.0.4", 900 | "once": "^1.3.0", 901 | "path-is-absolute": "^1.0.0" 902 | } 903 | }, 904 | "glob-parent": { 905 | "version": "5.1.0", 906 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", 907 | "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", 908 | "dev": true, 909 | "requires": { 910 | "is-glob": "^4.0.1" 911 | } 912 | }, 913 | "globals": { 914 | "version": "12.4.0", 915 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 916 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 917 | "dev": true, 918 | "requires": { 919 | "type-fest": "^0.8.1" 920 | } 921 | }, 922 | "growl": { 923 | "version": "1.10.5", 924 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 925 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 926 | "dev": true 927 | }, 928 | "has": { 929 | "version": "1.0.3", 930 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 931 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 932 | "dev": true, 933 | "requires": { 934 | "function-bind": "^1.1.1" 935 | } 936 | }, 937 | "has-flag": { 938 | "version": "3.0.0", 939 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 940 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 941 | "dev": true 942 | }, 943 | "has-symbols": { 944 | "version": "1.0.1", 945 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 946 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 947 | "dev": true 948 | }, 949 | "he": { 950 | "version": "1.2.0", 951 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 952 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 953 | "dev": true 954 | }, 955 | "http-errors": { 956 | "version": "1.7.2", 957 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 958 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 959 | "requires": { 960 | "depd": "~1.1.2", 961 | "inherits": "2.0.3", 962 | "setprototypeof": "1.1.1", 963 | "statuses": ">= 1.5.0 < 2", 964 | "toidentifier": "1.0.0" 965 | } 966 | }, 967 | "iconv-lite": { 968 | "version": "0.4.24", 969 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 970 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 971 | "requires": { 972 | "safer-buffer": ">= 2.1.2 < 3" 973 | } 974 | }, 975 | "ignore": { 976 | "version": "4.0.6", 977 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 978 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 979 | "dev": true 980 | }, 981 | "import-fresh": { 982 | "version": "3.2.1", 983 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 984 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 985 | "dev": true, 986 | "requires": { 987 | "parent-module": "^1.0.0", 988 | "resolve-from": "^4.0.0" 989 | } 990 | }, 991 | "imurmurhash": { 992 | "version": "0.1.4", 993 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 994 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 995 | "dev": true 996 | }, 997 | "inflight": { 998 | "version": "1.0.6", 999 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1000 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1001 | "dev": true, 1002 | "requires": { 1003 | "once": "^1.3.0", 1004 | "wrappy": "1" 1005 | } 1006 | }, 1007 | "inherits": { 1008 | "version": "2.0.3", 1009 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1010 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1011 | }, 1012 | "inquirer": { 1013 | "version": "7.1.0", 1014 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", 1015 | "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", 1016 | "dev": true, 1017 | "requires": { 1018 | "ansi-escapes": "^4.2.1", 1019 | "chalk": "^3.0.0", 1020 | "cli-cursor": "^3.1.0", 1021 | "cli-width": "^2.0.0", 1022 | "external-editor": "^3.0.3", 1023 | "figures": "^3.0.0", 1024 | "lodash": "^4.17.15", 1025 | "mute-stream": "0.0.8", 1026 | "run-async": "^2.4.0", 1027 | "rxjs": "^6.5.3", 1028 | "string-width": "^4.1.0", 1029 | "strip-ansi": "^6.0.0", 1030 | "through": "^2.3.6" 1031 | }, 1032 | "dependencies": { 1033 | "ansi-styles": { 1034 | "version": "4.2.1", 1035 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 1036 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 1037 | "dev": true, 1038 | "requires": { 1039 | "@types/color-name": "^1.1.1", 1040 | "color-convert": "^2.0.1" 1041 | } 1042 | }, 1043 | "chalk": { 1044 | "version": "3.0.0", 1045 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 1046 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 1047 | "dev": true, 1048 | "requires": { 1049 | "ansi-styles": "^4.1.0", 1050 | "supports-color": "^7.1.0" 1051 | } 1052 | }, 1053 | "color-convert": { 1054 | "version": "2.0.1", 1055 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1056 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1057 | "dev": true, 1058 | "requires": { 1059 | "color-name": "~1.1.4" 1060 | } 1061 | }, 1062 | "color-name": { 1063 | "version": "1.1.4", 1064 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1065 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1066 | "dev": true 1067 | }, 1068 | "has-flag": { 1069 | "version": "4.0.0", 1070 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1071 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1072 | "dev": true 1073 | }, 1074 | "strip-ansi": { 1075 | "version": "6.0.0", 1076 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1077 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1078 | "dev": true, 1079 | "requires": { 1080 | "ansi-regex": "^5.0.0" 1081 | } 1082 | }, 1083 | "supports-color": { 1084 | "version": "7.1.0", 1085 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 1086 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 1087 | "dev": true, 1088 | "requires": { 1089 | "has-flag": "^4.0.0" 1090 | } 1091 | } 1092 | } 1093 | }, 1094 | "ipaddr.js": { 1095 | "version": "1.9.1", 1096 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1097 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1098 | }, 1099 | "is-binary-path": { 1100 | "version": "2.1.0", 1101 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1102 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1103 | "dev": true, 1104 | "requires": { 1105 | "binary-extensions": "^2.0.0" 1106 | } 1107 | }, 1108 | "is-buffer": { 1109 | "version": "2.0.4", 1110 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 1111 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", 1112 | "dev": true 1113 | }, 1114 | "is-callable": { 1115 | "version": "1.1.5", 1116 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 1117 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 1118 | "dev": true 1119 | }, 1120 | "is-date-object": { 1121 | "version": "1.0.2", 1122 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1123 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 1124 | "dev": true 1125 | }, 1126 | "is-extglob": { 1127 | "version": "2.1.1", 1128 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1129 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1130 | "dev": true 1131 | }, 1132 | "is-fullwidth-code-point": { 1133 | "version": "3.0.0", 1134 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1135 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1136 | "dev": true 1137 | }, 1138 | "is-glob": { 1139 | "version": "4.0.1", 1140 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1141 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1142 | "dev": true, 1143 | "requires": { 1144 | "is-extglob": "^2.1.1" 1145 | } 1146 | }, 1147 | "is-number": { 1148 | "version": "7.0.0", 1149 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1150 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1151 | "dev": true 1152 | }, 1153 | "is-promise": { 1154 | "version": "2.1.0", 1155 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 1156 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 1157 | "dev": true 1158 | }, 1159 | "is-regex": { 1160 | "version": "1.0.5", 1161 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 1162 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 1163 | "dev": true, 1164 | "requires": { 1165 | "has": "^1.0.3" 1166 | } 1167 | }, 1168 | "is-symbol": { 1169 | "version": "1.0.3", 1170 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1171 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1172 | "dev": true, 1173 | "requires": { 1174 | "has-symbols": "^1.0.1" 1175 | } 1176 | }, 1177 | "isarray": { 1178 | "version": "1.0.0", 1179 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1180 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1181 | "dev": true 1182 | }, 1183 | "isexe": { 1184 | "version": "2.0.0", 1185 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1186 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1187 | "dev": true 1188 | }, 1189 | "js-tokens": { 1190 | "version": "4.0.0", 1191 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1192 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1193 | "dev": true 1194 | }, 1195 | "js-yaml": { 1196 | "version": "3.13.1", 1197 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1198 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1199 | "dev": true, 1200 | "requires": { 1201 | "argparse": "^1.0.7", 1202 | "esprima": "^4.0.0" 1203 | } 1204 | }, 1205 | "json-schema-traverse": { 1206 | "version": "0.4.1", 1207 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1208 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1209 | "dev": true 1210 | }, 1211 | "json-stable-stringify-without-jsonify": { 1212 | "version": "1.0.1", 1213 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1214 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1215 | "dev": true 1216 | }, 1217 | "levn": { 1218 | "version": "0.3.0", 1219 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1220 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1221 | "dev": true, 1222 | "requires": { 1223 | "prelude-ls": "~1.1.2", 1224 | "type-check": "~0.3.2" 1225 | } 1226 | }, 1227 | "locate-path": { 1228 | "version": "3.0.0", 1229 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1230 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1231 | "dev": true, 1232 | "requires": { 1233 | "p-locate": "^3.0.0", 1234 | "path-exists": "^3.0.0" 1235 | } 1236 | }, 1237 | "lodash": { 1238 | "version": "4.17.15", 1239 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 1240 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 1241 | "dev": true 1242 | }, 1243 | "log-symbols": { 1244 | "version": "3.0.0", 1245 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", 1246 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", 1247 | "dev": true, 1248 | "requires": { 1249 | "chalk": "^2.4.2" 1250 | } 1251 | }, 1252 | "media-typer": { 1253 | "version": "0.3.0", 1254 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1255 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1256 | }, 1257 | "merge-descriptors": { 1258 | "version": "1.0.1", 1259 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1260 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1261 | }, 1262 | "methods": { 1263 | "version": "1.1.2", 1264 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1265 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1266 | }, 1267 | "mime": { 1268 | "version": "1.6.0", 1269 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1270 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1271 | }, 1272 | "mime-db": { 1273 | "version": "1.43.0", 1274 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", 1275 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" 1276 | }, 1277 | "mime-types": { 1278 | "version": "2.1.26", 1279 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", 1280 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", 1281 | "requires": { 1282 | "mime-db": "1.43.0" 1283 | } 1284 | }, 1285 | "mimic-fn": { 1286 | "version": "2.1.0", 1287 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1288 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1289 | "dev": true 1290 | }, 1291 | "minimatch": { 1292 | "version": "3.0.4", 1293 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1294 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1295 | "dev": true, 1296 | "requires": { 1297 | "brace-expansion": "^1.1.7" 1298 | } 1299 | }, 1300 | "minimist": { 1301 | "version": "0.0.8", 1302 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1303 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1304 | "dev": true 1305 | }, 1306 | "mkdirp": { 1307 | "version": "0.5.1", 1308 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1309 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1310 | "dev": true, 1311 | "requires": { 1312 | "minimist": "0.0.8" 1313 | } 1314 | }, 1315 | "mocha": { 1316 | "version": "7.1.0", 1317 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.0.tgz", 1318 | "integrity": "sha512-MymHK8UkU0K15Q/zX7uflZgVoRWiTjy0fXE/QjKts6mowUvGxOdPhZ2qj3b0iZdUrNZlW9LAIMFHB4IW+2b3EQ==", 1319 | "dev": true, 1320 | "requires": { 1321 | "ansi-colors": "3.2.3", 1322 | "browser-stdout": "1.3.1", 1323 | "chokidar": "3.3.0", 1324 | "debug": "3.2.6", 1325 | "diff": "3.5.0", 1326 | "escape-string-regexp": "1.0.5", 1327 | "find-up": "3.0.0", 1328 | "glob": "7.1.3", 1329 | "growl": "1.10.5", 1330 | "he": "1.2.0", 1331 | "js-yaml": "3.13.1", 1332 | "log-symbols": "3.0.0", 1333 | "minimatch": "3.0.4", 1334 | "mkdirp": "0.5.1", 1335 | "ms": "2.1.1", 1336 | "node-environment-flags": "1.0.6", 1337 | "object.assign": "4.1.0", 1338 | "strip-json-comments": "2.0.1", 1339 | "supports-color": "6.0.0", 1340 | "which": "1.3.1", 1341 | "wide-align": "1.1.3", 1342 | "yargs": "13.3.0", 1343 | "yargs-parser": "13.1.1", 1344 | "yargs-unparser": "1.6.0" 1345 | }, 1346 | "dependencies": { 1347 | "debug": { 1348 | "version": "3.2.6", 1349 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 1350 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 1351 | "dev": true, 1352 | "requires": { 1353 | "ms": "^2.1.1" 1354 | } 1355 | }, 1356 | "glob": { 1357 | "version": "7.1.3", 1358 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 1359 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 1360 | "dev": true, 1361 | "requires": { 1362 | "fs.realpath": "^1.0.0", 1363 | "inflight": "^1.0.4", 1364 | "inherits": "2", 1365 | "minimatch": "^3.0.4", 1366 | "once": "^1.3.0", 1367 | "path-is-absolute": "^1.0.0" 1368 | } 1369 | }, 1370 | "ms": { 1371 | "version": "2.1.1", 1372 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1373 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 1374 | "dev": true 1375 | }, 1376 | "strip-json-comments": { 1377 | "version": "2.0.1", 1378 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1379 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1380 | "dev": true 1381 | }, 1382 | "supports-color": { 1383 | "version": "6.0.0", 1384 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", 1385 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", 1386 | "dev": true, 1387 | "requires": { 1388 | "has-flag": "^3.0.0" 1389 | } 1390 | } 1391 | } 1392 | }, 1393 | "ms": { 1394 | "version": "2.0.0", 1395 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1396 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1397 | }, 1398 | "mute-stream": { 1399 | "version": "0.0.8", 1400 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1401 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 1402 | "dev": true 1403 | }, 1404 | "natural-compare": { 1405 | "version": "1.4.0", 1406 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1407 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1408 | "dev": true 1409 | }, 1410 | "negotiator": { 1411 | "version": "0.6.2", 1412 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1413 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1414 | }, 1415 | "nice-try": { 1416 | "version": "1.0.5", 1417 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1418 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1419 | "dev": true 1420 | }, 1421 | "node-environment-flags": { 1422 | "version": "1.0.6", 1423 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", 1424 | "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", 1425 | "dev": true, 1426 | "requires": { 1427 | "object.getownpropertydescriptors": "^2.0.3", 1428 | "semver": "^5.7.0" 1429 | }, 1430 | "dependencies": { 1431 | "semver": { 1432 | "version": "5.7.1", 1433 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1434 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1435 | "dev": true 1436 | } 1437 | } 1438 | }, 1439 | "normalize-path": { 1440 | "version": "3.0.0", 1441 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1442 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1443 | "dev": true 1444 | }, 1445 | "object-inspect": { 1446 | "version": "1.7.0", 1447 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 1448 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 1449 | "dev": true 1450 | }, 1451 | "object-keys": { 1452 | "version": "1.1.1", 1453 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1454 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1455 | "dev": true 1456 | }, 1457 | "object.assign": { 1458 | "version": "4.1.0", 1459 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1460 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1461 | "dev": true, 1462 | "requires": { 1463 | "define-properties": "^1.1.2", 1464 | "function-bind": "^1.1.1", 1465 | "has-symbols": "^1.0.0", 1466 | "object-keys": "^1.0.11" 1467 | } 1468 | }, 1469 | "object.getownpropertydescriptors": { 1470 | "version": "2.1.0", 1471 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 1472 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", 1473 | "dev": true, 1474 | "requires": { 1475 | "define-properties": "^1.1.3", 1476 | "es-abstract": "^1.17.0-next.1" 1477 | } 1478 | }, 1479 | "on-finished": { 1480 | "version": "2.3.0", 1481 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1482 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1483 | "requires": { 1484 | "ee-first": "1.1.1" 1485 | } 1486 | }, 1487 | "once": { 1488 | "version": "1.4.0", 1489 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1490 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1491 | "dev": true, 1492 | "requires": { 1493 | "wrappy": "1" 1494 | } 1495 | }, 1496 | "onetime": { 1497 | "version": "5.1.0", 1498 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 1499 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 1500 | "dev": true, 1501 | "requires": { 1502 | "mimic-fn": "^2.1.0" 1503 | } 1504 | }, 1505 | "optionator": { 1506 | "version": "0.8.3", 1507 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1508 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1509 | "dev": true, 1510 | "requires": { 1511 | "deep-is": "~0.1.3", 1512 | "fast-levenshtein": "~2.0.6", 1513 | "levn": "~0.3.0", 1514 | "prelude-ls": "~1.1.2", 1515 | "type-check": "~0.3.2", 1516 | "word-wrap": "~1.2.3" 1517 | } 1518 | }, 1519 | "os-tmpdir": { 1520 | "version": "1.0.2", 1521 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1522 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1523 | "dev": true 1524 | }, 1525 | "p-limit": { 1526 | "version": "2.2.2", 1527 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", 1528 | "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", 1529 | "dev": true, 1530 | "requires": { 1531 | "p-try": "^2.0.0" 1532 | } 1533 | }, 1534 | "p-locate": { 1535 | "version": "3.0.0", 1536 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1537 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1538 | "dev": true, 1539 | "requires": { 1540 | "p-limit": "^2.0.0" 1541 | } 1542 | }, 1543 | "p-try": { 1544 | "version": "2.2.0", 1545 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1546 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1547 | "dev": true 1548 | }, 1549 | "parent-module": { 1550 | "version": "1.0.1", 1551 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1552 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1553 | "dev": true, 1554 | "requires": { 1555 | "callsites": "^3.0.0" 1556 | } 1557 | }, 1558 | "parseurl": { 1559 | "version": "1.3.3", 1560 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1561 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1562 | }, 1563 | "path-exists": { 1564 | "version": "3.0.0", 1565 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1566 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1567 | "dev": true 1568 | }, 1569 | "path-is-absolute": { 1570 | "version": "1.0.1", 1571 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1572 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1573 | "dev": true 1574 | }, 1575 | "path-key": { 1576 | "version": "2.0.1", 1577 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1578 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1579 | "dev": true 1580 | }, 1581 | "path-to-regexp": { 1582 | "version": "0.1.7", 1583 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1584 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1585 | }, 1586 | "pathval": { 1587 | "version": "1.1.0", 1588 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 1589 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 1590 | "dev": true 1591 | }, 1592 | "picomatch": { 1593 | "version": "2.2.1", 1594 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", 1595 | "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", 1596 | "dev": true 1597 | }, 1598 | "prelude-ls": { 1599 | "version": "1.1.2", 1600 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1601 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1602 | "dev": true 1603 | }, 1604 | "process-nextick-args": { 1605 | "version": "2.0.1", 1606 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1607 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1608 | "dev": true 1609 | }, 1610 | "progress": { 1611 | "version": "2.0.3", 1612 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1613 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1614 | "dev": true 1615 | }, 1616 | "proxy-addr": { 1617 | "version": "2.0.6", 1618 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 1619 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 1620 | "requires": { 1621 | "forwarded": "~0.1.2", 1622 | "ipaddr.js": "1.9.1" 1623 | } 1624 | }, 1625 | "punycode": { 1626 | "version": "2.1.1", 1627 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1628 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1629 | "dev": true 1630 | }, 1631 | "qs": { 1632 | "version": "6.7.0", 1633 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1634 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1635 | }, 1636 | "range-parser": { 1637 | "version": "1.2.1", 1638 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1639 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1640 | }, 1641 | "raw-body": { 1642 | "version": "2.4.0", 1643 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1644 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1645 | "requires": { 1646 | "bytes": "3.1.0", 1647 | "http-errors": "1.7.2", 1648 | "iconv-lite": "0.4.24", 1649 | "unpipe": "1.0.0" 1650 | } 1651 | }, 1652 | "readable-stream": { 1653 | "version": "2.3.7", 1654 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1655 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1656 | "dev": true, 1657 | "requires": { 1658 | "core-util-is": "~1.0.0", 1659 | "inherits": "~2.0.3", 1660 | "isarray": "~1.0.0", 1661 | "process-nextick-args": "~2.0.0", 1662 | "safe-buffer": "~5.1.1", 1663 | "string_decoder": "~1.1.1", 1664 | "util-deprecate": "~1.0.1" 1665 | } 1666 | }, 1667 | "readdirp": { 1668 | "version": "3.2.0", 1669 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", 1670 | "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", 1671 | "dev": true, 1672 | "requires": { 1673 | "picomatch": "^2.0.4" 1674 | } 1675 | }, 1676 | "regexpp": { 1677 | "version": "2.0.1", 1678 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1679 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1680 | "dev": true 1681 | }, 1682 | "require-directory": { 1683 | "version": "2.1.1", 1684 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1685 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1686 | "dev": true 1687 | }, 1688 | "require-main-filename": { 1689 | "version": "2.0.0", 1690 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1691 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 1692 | "dev": true 1693 | }, 1694 | "resolve-from": { 1695 | "version": "4.0.0", 1696 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1697 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1698 | "dev": true 1699 | }, 1700 | "restore-cursor": { 1701 | "version": "3.1.0", 1702 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1703 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1704 | "dev": true, 1705 | "requires": { 1706 | "onetime": "^5.1.0", 1707 | "signal-exit": "^3.0.2" 1708 | } 1709 | }, 1710 | "rimraf": { 1711 | "version": "2.6.3", 1712 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1713 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1714 | "dev": true, 1715 | "requires": { 1716 | "glob": "^7.1.3" 1717 | } 1718 | }, 1719 | "run-async": { 1720 | "version": "2.4.0", 1721 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", 1722 | "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", 1723 | "dev": true, 1724 | "requires": { 1725 | "is-promise": "^2.1.0" 1726 | } 1727 | }, 1728 | "rxjs": { 1729 | "version": "6.5.4", 1730 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", 1731 | "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", 1732 | "dev": true, 1733 | "requires": { 1734 | "tslib": "^1.9.0" 1735 | } 1736 | }, 1737 | "safe-buffer": { 1738 | "version": "5.1.2", 1739 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1740 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1741 | }, 1742 | "safer-buffer": { 1743 | "version": "2.1.2", 1744 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1745 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1746 | }, 1747 | "semver": { 1748 | "version": "6.3.0", 1749 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1750 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1751 | "dev": true 1752 | }, 1753 | "send": { 1754 | "version": "0.17.1", 1755 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 1756 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 1757 | "requires": { 1758 | "debug": "2.6.9", 1759 | "depd": "~1.1.2", 1760 | "destroy": "~1.0.4", 1761 | "encodeurl": "~1.0.2", 1762 | "escape-html": "~1.0.3", 1763 | "etag": "~1.8.1", 1764 | "fresh": "0.5.2", 1765 | "http-errors": "~1.7.2", 1766 | "mime": "1.6.0", 1767 | "ms": "2.1.1", 1768 | "on-finished": "~2.3.0", 1769 | "range-parser": "~1.2.1", 1770 | "statuses": "~1.5.0" 1771 | }, 1772 | "dependencies": { 1773 | "ms": { 1774 | "version": "2.1.1", 1775 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1776 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1777 | } 1778 | } 1779 | }, 1780 | "serve-static": { 1781 | "version": "1.14.1", 1782 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1783 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1784 | "requires": { 1785 | "encodeurl": "~1.0.2", 1786 | "escape-html": "~1.0.3", 1787 | "parseurl": "~1.3.3", 1788 | "send": "0.17.1" 1789 | } 1790 | }, 1791 | "set-blocking": { 1792 | "version": "2.0.0", 1793 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1794 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1795 | "dev": true 1796 | }, 1797 | "setprototypeof": { 1798 | "version": "1.1.1", 1799 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1800 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1801 | }, 1802 | "shebang-command": { 1803 | "version": "1.2.0", 1804 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1805 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1806 | "dev": true, 1807 | "requires": { 1808 | "shebang-regex": "^1.0.0" 1809 | } 1810 | }, 1811 | "shebang-regex": { 1812 | "version": "1.0.0", 1813 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1814 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1815 | "dev": true 1816 | }, 1817 | "shelljs": { 1818 | "version": "0.6.1", 1819 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", 1820 | "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=" 1821 | }, 1822 | "signal-exit": { 1823 | "version": "3.0.2", 1824 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1825 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1826 | "dev": true 1827 | }, 1828 | "slice-ansi": { 1829 | "version": "2.1.0", 1830 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1831 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1832 | "dev": true, 1833 | "requires": { 1834 | "ansi-styles": "^3.2.0", 1835 | "astral-regex": "^1.0.0", 1836 | "is-fullwidth-code-point": "^2.0.0" 1837 | }, 1838 | "dependencies": { 1839 | "is-fullwidth-code-point": { 1840 | "version": "2.0.0", 1841 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1842 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1843 | "dev": true 1844 | } 1845 | } 1846 | }, 1847 | "sprintf-js": { 1848 | "version": "1.0.3", 1849 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1850 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1851 | "dev": true 1852 | }, 1853 | "statuses": { 1854 | "version": "1.5.0", 1855 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1856 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1857 | }, 1858 | "string-width": { 1859 | "version": "4.2.0", 1860 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 1861 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 1862 | "dev": true, 1863 | "requires": { 1864 | "emoji-regex": "^8.0.0", 1865 | "is-fullwidth-code-point": "^3.0.0", 1866 | "strip-ansi": "^6.0.0" 1867 | }, 1868 | "dependencies": { 1869 | "strip-ansi": { 1870 | "version": "6.0.0", 1871 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1872 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1873 | "dev": true, 1874 | "requires": { 1875 | "ansi-regex": "^5.0.0" 1876 | } 1877 | } 1878 | } 1879 | }, 1880 | "string.prototype.trimleft": { 1881 | "version": "2.1.1", 1882 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 1883 | "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", 1884 | "dev": true, 1885 | "requires": { 1886 | "define-properties": "^1.1.3", 1887 | "function-bind": "^1.1.1" 1888 | } 1889 | }, 1890 | "string.prototype.trimright": { 1891 | "version": "2.1.1", 1892 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 1893 | "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", 1894 | "dev": true, 1895 | "requires": { 1896 | "define-properties": "^1.1.3", 1897 | "function-bind": "^1.1.1" 1898 | } 1899 | }, 1900 | "string_decoder": { 1901 | "version": "1.1.1", 1902 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1903 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1904 | "dev": true, 1905 | "requires": { 1906 | "safe-buffer": "~5.1.0" 1907 | } 1908 | }, 1909 | "strip-ansi": { 1910 | "version": "5.2.0", 1911 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1912 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1913 | "dev": true, 1914 | "requires": { 1915 | "ansi-regex": "^4.1.0" 1916 | }, 1917 | "dependencies": { 1918 | "ansi-regex": { 1919 | "version": "4.1.0", 1920 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1921 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1922 | "dev": true 1923 | } 1924 | } 1925 | }, 1926 | "strip-json-comments": { 1927 | "version": "3.0.1", 1928 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", 1929 | "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", 1930 | "dev": true 1931 | }, 1932 | "superagent": { 1933 | "version": "3.8.3", 1934 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", 1935 | "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", 1936 | "dev": true, 1937 | "requires": { 1938 | "component-emitter": "^1.2.0", 1939 | "cookiejar": "^2.1.0", 1940 | "debug": "^3.1.0", 1941 | "extend": "^3.0.0", 1942 | "form-data": "^2.3.1", 1943 | "formidable": "^1.2.0", 1944 | "methods": "^1.1.1", 1945 | "mime": "^1.4.1", 1946 | "qs": "^6.5.1", 1947 | "readable-stream": "^2.3.5" 1948 | }, 1949 | "dependencies": { 1950 | "debug": { 1951 | "version": "3.2.6", 1952 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 1953 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 1954 | "dev": true, 1955 | "requires": { 1956 | "ms": "^2.1.1" 1957 | } 1958 | }, 1959 | "ms": { 1960 | "version": "2.1.2", 1961 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1962 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1963 | "dev": true 1964 | } 1965 | } 1966 | }, 1967 | "supertest": { 1968 | "version": "4.0.2", 1969 | "resolved": "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz", 1970 | "integrity": "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", 1971 | "dev": true, 1972 | "requires": { 1973 | "methods": "^1.1.2", 1974 | "superagent": "^3.8.3" 1975 | } 1976 | }, 1977 | "supports-color": { 1978 | "version": "5.5.0", 1979 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1980 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1981 | "dev": true, 1982 | "requires": { 1983 | "has-flag": "^3.0.0" 1984 | } 1985 | }, 1986 | "table": { 1987 | "version": "5.4.6", 1988 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1989 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1990 | "dev": true, 1991 | "requires": { 1992 | "ajv": "^6.10.2", 1993 | "lodash": "^4.17.14", 1994 | "slice-ansi": "^2.1.0", 1995 | "string-width": "^3.0.0" 1996 | }, 1997 | "dependencies": { 1998 | "emoji-regex": { 1999 | "version": "7.0.3", 2000 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 2001 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 2002 | "dev": true 2003 | }, 2004 | "is-fullwidth-code-point": { 2005 | "version": "2.0.0", 2006 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2007 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2008 | "dev": true 2009 | }, 2010 | "string-width": { 2011 | "version": "3.1.0", 2012 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2013 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2014 | "dev": true, 2015 | "requires": { 2016 | "emoji-regex": "^7.0.1", 2017 | "is-fullwidth-code-point": "^2.0.0", 2018 | "strip-ansi": "^5.1.0" 2019 | } 2020 | } 2021 | } 2022 | }, 2023 | "text-table": { 2024 | "version": "0.2.0", 2025 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2026 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2027 | "dev": true 2028 | }, 2029 | "through": { 2030 | "version": "2.3.8", 2031 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2032 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2033 | "dev": true 2034 | }, 2035 | "tmp": { 2036 | "version": "0.0.33", 2037 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2038 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2039 | "dev": true, 2040 | "requires": { 2041 | "os-tmpdir": "~1.0.2" 2042 | } 2043 | }, 2044 | "to-regex-range": { 2045 | "version": "5.0.1", 2046 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2047 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2048 | "dev": true, 2049 | "requires": { 2050 | "is-number": "^7.0.0" 2051 | } 2052 | }, 2053 | "toidentifier": { 2054 | "version": "1.0.0", 2055 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 2056 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 2057 | }, 2058 | "tslib": { 2059 | "version": "1.11.1", 2060 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", 2061 | "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", 2062 | "dev": true 2063 | }, 2064 | "type-check": { 2065 | "version": "0.3.2", 2066 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2067 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2068 | "dev": true, 2069 | "requires": { 2070 | "prelude-ls": "~1.1.2" 2071 | } 2072 | }, 2073 | "type-detect": { 2074 | "version": "4.0.8", 2075 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 2076 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 2077 | "dev": true 2078 | }, 2079 | "type-fest": { 2080 | "version": "0.8.1", 2081 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 2082 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 2083 | "dev": true 2084 | }, 2085 | "type-is": { 2086 | "version": "1.6.18", 2087 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2088 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2089 | "requires": { 2090 | "media-typer": "0.3.0", 2091 | "mime-types": "~2.1.24" 2092 | } 2093 | }, 2094 | "unpipe": { 2095 | "version": "1.0.0", 2096 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2097 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2098 | }, 2099 | "uri-js": { 2100 | "version": "4.2.2", 2101 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 2102 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 2103 | "dev": true, 2104 | "requires": { 2105 | "punycode": "^2.1.0" 2106 | } 2107 | }, 2108 | "util-deprecate": { 2109 | "version": "1.0.2", 2110 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2111 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2112 | "dev": true 2113 | }, 2114 | "utils-merge": { 2115 | "version": "1.0.1", 2116 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2117 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 2118 | }, 2119 | "v8-compile-cache": { 2120 | "version": "2.1.0", 2121 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 2122 | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 2123 | "dev": true 2124 | }, 2125 | "vary": { 2126 | "version": "1.1.2", 2127 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2128 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 2129 | }, 2130 | "which": { 2131 | "version": "1.3.1", 2132 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2133 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2134 | "dev": true, 2135 | "requires": { 2136 | "isexe": "^2.0.0" 2137 | } 2138 | }, 2139 | "which-module": { 2140 | "version": "2.0.0", 2141 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 2142 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 2143 | "dev": true 2144 | }, 2145 | "wide-align": { 2146 | "version": "1.1.3", 2147 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 2148 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 2149 | "dev": true, 2150 | "requires": { 2151 | "string-width": "^1.0.2 || 2" 2152 | }, 2153 | "dependencies": { 2154 | "ansi-regex": { 2155 | "version": "3.0.0", 2156 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2157 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 2158 | "dev": true 2159 | }, 2160 | "is-fullwidth-code-point": { 2161 | "version": "2.0.0", 2162 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2163 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2164 | "dev": true 2165 | }, 2166 | "string-width": { 2167 | "version": "2.1.1", 2168 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2169 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2170 | "dev": true, 2171 | "requires": { 2172 | "is-fullwidth-code-point": "^2.0.0", 2173 | "strip-ansi": "^4.0.0" 2174 | } 2175 | }, 2176 | "strip-ansi": { 2177 | "version": "4.0.0", 2178 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2179 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2180 | "dev": true, 2181 | "requires": { 2182 | "ansi-regex": "^3.0.0" 2183 | } 2184 | } 2185 | } 2186 | }, 2187 | "word-wrap": { 2188 | "version": "1.2.3", 2189 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2190 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2191 | "dev": true 2192 | }, 2193 | "wrap-ansi": { 2194 | "version": "5.1.0", 2195 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 2196 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 2197 | "dev": true, 2198 | "requires": { 2199 | "ansi-styles": "^3.2.0", 2200 | "string-width": "^3.0.0", 2201 | "strip-ansi": "^5.0.0" 2202 | }, 2203 | "dependencies": { 2204 | "emoji-regex": { 2205 | "version": "7.0.3", 2206 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 2207 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 2208 | "dev": true 2209 | }, 2210 | "is-fullwidth-code-point": { 2211 | "version": "2.0.0", 2212 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2213 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2214 | "dev": true 2215 | }, 2216 | "string-width": { 2217 | "version": "3.1.0", 2218 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2219 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2220 | "dev": true, 2221 | "requires": { 2222 | "emoji-regex": "^7.0.1", 2223 | "is-fullwidth-code-point": "^2.0.0", 2224 | "strip-ansi": "^5.1.0" 2225 | } 2226 | } 2227 | } 2228 | }, 2229 | "wrappy": { 2230 | "version": "1.0.2", 2231 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2232 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2233 | "dev": true 2234 | }, 2235 | "write": { 2236 | "version": "1.0.3", 2237 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 2238 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 2239 | "dev": true, 2240 | "requires": { 2241 | "mkdirp": "^0.5.1" 2242 | } 2243 | }, 2244 | "y18n": { 2245 | "version": "4.0.0", 2246 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 2247 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 2248 | "dev": true 2249 | }, 2250 | "yargs": { 2251 | "version": "13.3.0", 2252 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", 2253 | "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", 2254 | "dev": true, 2255 | "requires": { 2256 | "cliui": "^5.0.0", 2257 | "find-up": "^3.0.0", 2258 | "get-caller-file": "^2.0.1", 2259 | "require-directory": "^2.1.1", 2260 | "require-main-filename": "^2.0.0", 2261 | "set-blocking": "^2.0.0", 2262 | "string-width": "^3.0.0", 2263 | "which-module": "^2.0.0", 2264 | "y18n": "^4.0.0", 2265 | "yargs-parser": "^13.1.1" 2266 | }, 2267 | "dependencies": { 2268 | "emoji-regex": { 2269 | "version": "7.0.3", 2270 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 2271 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 2272 | "dev": true 2273 | }, 2274 | "is-fullwidth-code-point": { 2275 | "version": "2.0.0", 2276 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2277 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2278 | "dev": true 2279 | }, 2280 | "string-width": { 2281 | "version": "3.1.0", 2282 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2283 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2284 | "dev": true, 2285 | "requires": { 2286 | "emoji-regex": "^7.0.1", 2287 | "is-fullwidth-code-point": "^2.0.0", 2288 | "strip-ansi": "^5.1.0" 2289 | } 2290 | } 2291 | } 2292 | }, 2293 | "yargs-parser": { 2294 | "version": "13.1.1", 2295 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", 2296 | "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", 2297 | "dev": true, 2298 | "requires": { 2299 | "camelcase": "^5.0.0", 2300 | "decamelize": "^1.2.0" 2301 | } 2302 | }, 2303 | "yargs-unparser": { 2304 | "version": "1.6.0", 2305 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 2306 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", 2307 | "dev": true, 2308 | "requires": { 2309 | "flat": "^4.1.0", 2310 | "lodash": "^4.17.15", 2311 | "yargs": "^13.3.0" 2312 | } 2313 | } 2314 | } 2315 | } 2316 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "phpcgijs", 3 | "description": "Node JS modules for running PHP in CGI mode", 4 | "version": "1.0.0-beta8", 5 | "author": { 6 | "name": "Ganesh", 7 | "email": "ganeshsurfs@gmail.com" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/ganeshkbhat/node-php-cgi.git" 12 | }, 13 | "scripts": { 14 | "start": "node ./server.js", 15 | "test": "mocha" 16 | }, 17 | "main": "./main.js", 18 | "dependencies": { 19 | "express": "^4.17.1", 20 | "shelljs": "^0.6.0" 21 | }, 22 | "devDependencies": { 23 | "chai": "^4.2.0", 24 | "eslint": "^6.8.0", 25 | "mocha": "^7.1.0", 26 | "supertest": "^4.0.2" 27 | }, 28 | "keywords": [ 29 | "phpcgijs", 30 | "node", 31 | "nodejs", 32 | "php", 33 | "cgi", 34 | "php-cgi", 35 | "run php script", 36 | "php cgi js" 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /readme-php-options.txt: -------------------------------------------------------------------------------- 1 | NAME 2 | php - PHP Command Line Interface 'CLI' 3 | 4 | php-cgi - PHP Common Gateway Interface 'CGI' command 5 | 6 | SYNOPSIS 7 | php [options] [ -f ] file [[--] args...] 8 | 9 | php [options] -r code [[--] args...] 10 | 11 | php [options] [-B code] -R code [-E code] [[--] args...] 12 | 13 | php [options] [-B code] -F file [-E code] [[--] args...] 14 | 15 | php [options] -- [ args...] 16 | 17 | php [options] -a 18 | 19 | php [options] -S addr:port [-t docroot] 20 | 21 | DESCRIPTION 22 | PHP is a widely-used general-purpose scripting language that is especially suited for 23 | Web development and can be embedded into HTML. This is the command line interface that 24 | enables you to do the following: 25 | 26 | You can parse and execute files by using parameter -f followed by the name of the 27 | file to be executed. 28 | 29 | Using parameter -r you can directly execute PHP code simply as you would do inside 30 | a .php file when using the eval() function. 31 | 32 | It is also possible to process the standard input line by line using either the parameter 33 | -R or -F. In this mode each separate input line causes the code specified by -R or the 34 | file specified by -F to be executed. You can access the input line by $argn. While 35 | processing the input lines $argi contains the number of the actual line being processed. 36 | Further more the parameters -B and -E can be used to execute code (see -r) before and 37 | after all input lines have been processed respectively. Notice that the input is read 38 | from STDIN and therefore reading from STDIN explicitly changes the next input line or 39 | skips input lines. 40 | 41 | PHP also contains an embedded web server for application development purpose. By using 42 | the -S option where addr:port point to a local address and port PHP will listen to HTTP 43 | requests on that address and port and serve files from the current working directory or 44 | the docroot passed by the -t option. 45 | 46 | If none of -r -f -B -R -F -E or -S is present but a single parameter is given then this 47 | parameter is taken as the filename to parse and execute (same as with -f). If no parameter 48 | is present then the standard input is read and executed. 49 | 50 | OPTIONS 51 | 52 | --interactive 53 | -a Run PHP interactively. This lets you enter snippets of PHP code that directly get 54 | executed. When readline support is enabled you can edit the lines and also have history support. 55 | --bindpath address:port|port 56 | -b address:port|port Bind Path for external FASTCGI Server mode (CGI only). 57 | --no-chdir 58 | -C Do not chdir to the script's directory (CGI only). 59 | --no-header 60 | -q Quiet-mode. Suppress HTTP header output (CGI only). 61 | --timing count 62 | -T count Measure execution time of script repeated count times (CGI only). 63 | --php-ini path|file 64 | -c path|file Look for php.ini file in the directory path or use the specified file 65 | --no-php-ini 66 | -n No php.ini file will be used 67 | --define foo[=bar] 68 | -d foo[=bar] Define INI entry foo with value bar 69 | -e 70 | Generate extended information for debugger/profiler 71 | --file file 72 | -f file Parse and execute file 73 | --global name 74 | -g name Make variable name global in script. 75 | --help 76 | -h This help 77 | --hide-args 78 | -H Hide script name (file) and parameters (args...) from external tools. For example 79 | you may want to use this when a php script is started as a daemon and the command line 80 | contains sensitive data such as passwords. 81 | --info 82 | -i PHP information and configuration 83 | --syntax-check 84 | -l Syntax check only (lint) 85 | --modules 86 | -m Show compiled in modules 87 | --run code 88 | -r code Run PHP code without using script tags '' 89 | --process-begin code 90 | -B code Run PHP code before processing input lines 91 | --process-code code 92 | -R code Run PHP code for every input line 93 | --process-file file 94 | -F file Parse and execute file for every input line 95 | --process-end code 96 | -E code Run PHP code after processing all input lines 97 | --syntax-highlight 98 | -s Output HTML syntax highlighted source 99 | --server addr:port 100 | -S addr:port Start embedded Webserver on the given local address and port 101 | --docroot docroot 102 | -t docroot Specify the document root to be used by the embedded web server 103 | --version 104 | -v Version number 105 | --stripped 106 | -w Output source with stripped comments and whitespace 107 | --zend-extension file 108 | -z file Load Zend extension file 109 | 110 | args... 111 | Arguments passed to script. Use '--' args when first argument starts with '-' or script is 112 | read from stdin 113 | --rfunction name 114 | --rf name Shows information about function name 115 | --rclass name 116 | --rc name Shows information about class name 117 | --rextension name 118 | --re name Shows information about extension name 119 | --rzendextension name 120 | --rz name Shows information about Zend extension name 121 | --rextinfo name 122 | --ri name Shows configuration for extension name 123 | --ini 124 | Show configuration file names 125 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var php = require("./main"); 3 | // var php = require("phpcgijs"); 4 | var path = require("path"); 5 | 6 | var app = express(); 7 | var p = path.join("test/php"); 8 | 9 | app.use("/", php.cgi(p, { cgi_path: '/usr/bin/', options: { "-c": "/etc/php.ini" } })); 10 | app.listen(9090, '127.0.0.1'); 11 | console.log("Server listening at 9090!"); 12 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | var request = require('supertest'); 4 | var assert = require('chai').assert; 5 | var express = require('express'); 6 | var php = require('../main'); 7 | var path = require("path") 8 | 9 | var app = express(); 10 | 11 | app.use('/', php.cgi(path.join(__dirname, '../', '/test/php'))); 12 | 13 | describe('GET /', function() { 14 | it('should respond with /index.php and valid $_SERVER variable', function(done) { 15 | request(app) 16 | .get('/') 17 | .set('Accept', ['application/json', 'text/html']) 18 | // .expect('Content-Type', /html/) 19 | .expect('Content-Type', /json/) 20 | .expect(200) 21 | .end(function(err, res) { 22 | if (err) { 23 | done(err); 24 | } else { 25 | done(); 26 | } 27 | }); 28 | }); 29 | }); 30 | 31 | describe('Get /index.php', function() { 32 | it('should return a valid $_SERVER variable', function(done) { 33 | request(app) 34 | .get('/index.php') 35 | .set('Accept', ['application/json', 'text/html']) 36 | .expect('Content-Type', /json/) 37 | .expect(200) 38 | .end(function(err, res) { 39 | if (err) { 40 | done(err); 41 | } else { 42 | assert.match(res.body.$_SERVER.REMOTE_ADDR, /127.0.0.1|::1/); 43 | assert.match(res.body.$_SERVER.SCRIPT_FILENAME, /index.php$/); 44 | done(); 45 | } 46 | }); 47 | }); 48 | }); 49 | 50 | 51 | describe('Get /test/index.php', function() { 52 | it('should return a 404 error for /test/index.php', function(done) { 53 | request(app) 54 | .get('/test/index.php') 55 | .set('Accept', ['application/json', 'text/html']) 56 | .expect('Content-Type', /html/) 57 | .expect(404) 58 | .end(function(err, res) { 59 | if (err) { 60 | done(err); 61 | } else { 62 | done(); 63 | } 64 | }); 65 | }); 66 | }); 67 | 68 | describe('Get /test', function() { 69 | it('should return a 404 for /test', function(done) { 70 | request(app) 71 | .get('/test') 72 | .set('Accept', ['application/json', 'text/html']) 73 | .expect('Content-Type', /html/) 74 | .expect(404) 75 | .end(function(err, res) { 76 | if (err) { 77 | done(err); 78 | } else { 79 | done(); 80 | } 81 | }); 82 | }); 83 | }); 84 | 85 | 86 | describe('Get /test/', function() { 87 | it('should return a 404 for /test/', function(done) { 88 | request(app) 89 | .get('/test/') 90 | .set('Accept', ['application/json', 'text/html']) 91 | .expect('Content-Type', /html/) 92 | .expect(404) 93 | .end(function(err, res) { 94 | if (err) { 95 | done(err); 96 | } else { 97 | done(); 98 | } 99 | }); 100 | }); 101 | }); -------------------------------------------------------------------------------- /test/php/index.php: -------------------------------------------------------------------------------- 1 | $_SERVER)); 4 | ?> --------------------------------------------------------------------------------