├── .gitignore ├── README.md ├── envoyctl.js ├── envoyui.png ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # envoyctl 2 | 3 | A CLI tool to help debugging Envoy 4 | 5 | ## Dependencies 6 | 7 | You simply need to have [Node.js](https://nodejs.org) installed 8 | 9 | ## Installation 10 | 11 | ``` 12 | git clone https://github.com/djannot/envoyctl.git 13 | cd envoyctl 14 | npm install 15 | ``` 16 | 17 | You can then run `node envoyctl.js`. 18 | 19 | But you can also run `npm link` to make it available through `envoyctl`. 20 | 21 | ## Usage 22 | 23 | You can run `envoyctl -h` to display the help. 24 | 25 | But the basic usage is either: 26 | 27 | ``` 28 | envoyctl -f 29 | ``` 30 | 31 | or 32 | 33 | ``` 34 | cat | envoyctl -f - 35 | ``` 36 | 37 | It has been tested with both Gloo Edge and Istio. 38 | 39 | For example, to see the configuratin of the Istio ingress gateway: 40 | 41 | ``` 42 | kubectl -n istio-system port-forward deploy/istio-ingressgateway 15000 & 43 | PID=$! 44 | sleep 3 45 | curl localhost:15000/config_dump | envoyctl -f - 46 | kill $PID 47 | ``` 48 | 49 | or with `istioctl` (>= 1.10): 50 | 51 | ``` 52 | istioctl pc all deploy/istio-ingressgateway.istio-system -o json | envoyctl -f - 53 | ``` 54 | 55 | Here is an example of the output you can get: 56 | 57 | ``` 58 | ┌────────────────────┬──────────────────────────────┬──────────────────────────────────────────────────┬──────────────────────────────────────────────────┬──────────────────────────────────────────────────┬──────────────────────────────────────────────────┬──────────────────────────────────────────────────┬──────────────────────────────────────────────────┐ 59 | │ Dynamic listener │ Route name │ Domains │ Match │ Route │ Per filter config │ Cluster │ Endpoints │ 60 | ├────────────────────┼──────────────────────────────┼──────────────────────────────────────────────────┼──────────────────────────────────────────────────┼──────────────────────────────────────────────────┼──────────────────────────────────────────────────┼──────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ 61 | │ 0.0.0.0_8383 │ 8383 │ * │ { │ { │ │ { │ │ 62 | │ │ │ │ "prefix": "/" │ "cluster": "PassthroughCluster", │ │ "@type": "type.googleapis.com/envoy.config.cl… │ │ 63 | │ │ │ │ } │ "timeout": "0s", │ │ "name": "PassthroughCluster", │ │ 64 | │ │ │ │ │ "max_grpc_timeout": "0s" │ │ "type": "ORIGINAL_DST", │ │ 65 | │ │ │ │ │ } │ │ "connect_timeout": "10s", │ │ 66 | │ │ │ │ │ │ │ "lb_policy": "CLUSTER_PROVIDED", │ │ 67 | │ │ │ │ │ │ │ "circuit_breakers": { │ │ 68 | │ │ │ │ │ │ │ "thresholds": [ │ │ 69 | │ │ │ │ │ │ │ { │ │ 70 | │ │ │ │ │ │ │ "max_connections": 4294967295, │ │ 71 | │ │ │ │ │ │ │ "max_pending_requests": 4294967295, │ │ 72 | │ │ │ │ │ │ │ "max_requests": 4294967295, │ │ 73 | │ │ │ │ │ │ │ "max_retries": 4294967295, │ │ 74 | │ │ │ │ │ │ │ "track_remaining": true │ │ 75 | │ │ │ │ │ │ │ } │ │ 76 | │ │ │ │ │ │ │ ] │ │ 77 | │ │ │ │ │ │ │ }, │ │ 78 | │ │ │ │ │ │ │ "typed_extension_protocol_options": { │ │ 79 | │ │ │ │ │ │ │ "envoy.extensions.upstreams.http.v3.HttpPro… │ │ 80 | │ │ │ │ │ │ │ "@type": "type.googleapis.com/envoy.exten… │ │ 81 | │ │ │ │ │ │ │ "use_downstream_protocol_config": { │ │ 82 | │ │ │ │ │ │ │ "http_protocol_options": {}, │ │ 83 | │ │ │ │ │ │ │ "http2_protocol_options": { │ │ 84 | │ │ │ │ │ │ │ "max_concurrent_streams": 1073741824 │ │ 85 | │ │ │ │ │ │ │ } │ │ 86 | │ │ │ │ │ │ │ } │ │ 87 | │ │ │ │ │ │ │ } │ │ 88 | │ │ │ │ │ │ │ }, │ │ 89 | │ │ │ │ │ │ │ "filters": [ │ │ 90 | │ │ │ │ │ │ │ { │ │ 91 | │ │ │ │ │ │ │ "name": "istio.metadata_exchange", │ │ 92 | │ │ │ │ │ │ │ "typed_config": { │ │ 93 | │ │ │ │ │ │ │ "@type": "type.googleapis.com/udpa.type… │ │ 94 | │ │ │ │ │ │ │ "type_url": "type.googleapis.com/envoy.… │ │ 95 | │ │ │ │ │ │ │ "value": { │ │ 96 | │ │ │ │ │ │ │ "protocol": "istio-peer-exchange" │ │ 97 | │ │ │ │ │ │ │ } │ │ 98 | │ │ │ │ │ │ │ } │ │ 99 | │ │ │ │ │ │ │ } │ │ 100 | │ │ │ │ │ │ │ ] │ │ 101 | │ │ │ │ │ │ │ } │ │ 102 | ├────────────────────┼──────────────────────────────┼──────────────────────────────────────────────────┼──────────────────────────────────────────────────┼──────────────────────────────────────────────────┼──────────────────────────────────────────────────┼──────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ 103 | ... 104 | │ virtualInbound │ inbound|9080|| │ * │ { │ { │ │ { │ │ 105 | │ │ │ │ "prefix": "/" │ "cluster": "inbound|9080||", │ │ "@type": "type.googleapis.com/envoy.config.cl… │ │ 106 | │ │ │ │ } │ "timeout": "0s", │ │ "name": "inbound|9080||", │ │ 107 | │ │ │ │ │ "max_stream_duration": { │ │ "type": "ORIGINAL_DST", │ │ 108 | │ │ │ │ │ "max_stream_duration": "0s", │ │ "connect_timeout": "10s", │ │ 109 | │ │ │ │ │ "grpc_timeout_header_max": "0s" │ │ "lb_policy": "CLUSTER_PROVIDED", │ │ 110 | │ │ │ │ │ } │ │ "circuit_breakers": { │ │ 111 | │ │ │ │ │ } │ │ "thresholds": [ │ │ 112 | │ │ │ │ │ │ │ { │ │ 113 | │ │ │ │ │ │ │ "max_connections": 4294967295, │ │ 114 | │ │ │ │ │ │ │ "max_pending_requests": 4294967295, │ │ 115 | │ │ │ │ │ │ │ "max_requests": 4294967295, │ │ 116 | │ │ │ │ │ │ │ "max_retries": 4294967295, │ │ 117 | │ │ │ │ │ │ │ "track_remaining": true │ │ 118 | │ │ │ │ │ │ │ } │ │ 119 | │ │ │ │ │ │ │ ] │ │ 120 | │ │ │ │ │ │ │ }, │ │ 121 | │ │ │ │ │ │ │ "cleanup_interval": "60s", │ │ 122 | │ │ │ │ │ │ │ "upstream_bind_config": { │ │ 123 | │ │ │ │ │ │ │ "source_address": { │ │ 124 | │ │ │ │ │ │ │ "address": "127.0.0.6", │ │ 125 | │ │ │ │ │ │ │ "port_value": 0 │ │ 126 | │ │ │ │ │ │ │ } │ │ 127 | │ │ │ │ │ │ │ }, │ │ 128 | │ │ │ │ │ │ │ "metadata": { │ │ 129 | │ │ │ │ │ │ │ "filter_metadata": { │ │ 130 | │ │ │ │ │ │ │ "istio": { │ │ 131 | │ │ │ │ │ │ │ "config": "/apis/networking.istio.io/v1… │ │ 132 | │ │ │ │ │ │ │ "services": [ │ │ 133 | │ │ │ │ │ │ │ { │ │ 134 | │ │ │ │ │ │ │ "host": "productpage.default.svc.cl… │ │ 135 | │ │ │ │ │ │ │ "name": "productpage", │ │ 136 | │ │ │ │ │ │ │ "namespace": "default" │ │ 137 | │ │ │ │ │ │ │ } │ │ 138 | │ │ │ │ │ │ │ ] │ │ 139 | │ │ │ │ │ │ │ } │ │ 140 | │ │ │ │ │ │ │ } │ │ 141 | │ │ │ │ │ │ │ } │ │ 142 | │ │ │ │ │ │ │ } │ │ 143 | └────────────────────┴──────────────────────────────┴──────────────────────────────────────────────────┴──────────────────────────────────────────────────┴──────────────────────────────────────────────────┴──────────────────────────────────────────────────┴──────────────────────────────────────────────────┴──────────────────────────────────────────────────┘ 144 | 145 | ``` 146 | 147 | Using `glooctl`: 148 | 149 | ``` 150 | glooctl proxy dump | envoyctl -f - 151 | ``` 152 | 153 | You can also get endpoints info displayed if you include eds in the dump: 154 | 155 | ``` 156 | kubectl -n istio-system port-forward deploy/istio-ingressgateway 15000 & 157 | PID=$! 158 | sleep 3 159 | curl localhost:15000/config_dump?include_eds | envoyctl -f - 160 | kill $PID 161 | ``` 162 | 163 | ## Online version 164 | 165 | There's also a web version available at [https://envoyui.solo.io](https://envoyui.solo.io) 166 | 167 | ![envoyui](envoyui.png) -------------------------------------------------------------------------------- /envoyctl.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | const yargs = require('yargs'); 3 | const concat = require('mississippi').concat; 4 | const readFile = require('fs').readFile; 5 | const table = require('cli-table3'); 6 | 7 | const argv = yargs 8 | .usage('node envoy.json [options]') 9 | .help('h') 10 | .alias('h', 'help') 11 | .demand('f') 12 | .nargs('f', 1) 13 | .describe('f', 'JSON file to parse') 14 | .boolean('t') 15 | .describe('t', 'Truncate output') 16 | .default('t', true) 17 | .nargs('r', 1) 18 | .describe('r', 'Only show entries for this route name') 19 | .nargs('d', 1) 20 | .describe('d', "Only show entries where at least a domain name matches this regular expressions.") 21 | .argv; 22 | 23 | let table_data = new table({ 24 | head: ['Dynamic listener', 'Route name', 'Domains', 'Match', 'Route', 'Per filter config', 'Cluster', 'Endpoints'] 25 | }); 26 | 27 | if (argv.t) { 28 | table_data = new table({ 29 | head: ['Dynamic listener', 'Route name', 'Domains', 'Match', 'Route', 'Per filter config', 'Cluster', 'Endpoints'], 30 | colWidths: [20, 30, 50, 50, 50, 50, 50, 50] 31 | }); 32 | } 33 | 34 | let js = {}; 35 | 36 | const file = argv.f; 37 | if (file === '-') { 38 | process.stdin.pipe(concat(parse)); 39 | } else { 40 | readFile(file, (err, dataBuffer) => { 41 | if (err) throw err; 42 | else parse(dataBuffer.toString()); 43 | }); 44 | } 45 | 46 | function array_match(arr, expr) { 47 | let found = false; 48 | let regexp = new RegExp(expr, 'gi'); 49 | arr.forEach(item => { 50 | if(regexp.test(item)) { 51 | found = true; 52 | } 53 | }); 54 | return found; 55 | } 56 | 57 | function parse(str) { 58 | let js = JSON.parse(str) 59 | 60 | let configs = {}; 61 | js.configs.forEach(config => { 62 | configs[config['@type']] = config; 63 | }); 64 | 65 | routes_by_dynamic_listeners = {}; 66 | let listeners_config_dump = configs['type.googleapis.com/envoy.admin.v3.ListenersConfigDump']; 67 | listeners_config_dump.dynamic_listeners.forEach(dynamic_listener => { 68 | routes_by_dynamic_listeners[dynamic_listener.name] = []; 69 | if ('active_state' in dynamic_listener) { 70 | dynamic_listener.active_state.listener.filter_chains.forEach(filter_chain => { 71 | filter_chain.filters.forEach(filter => { 72 | if (filter.name == 'envoy.filters.network.http_connection_manager') { 73 | if (filter.typed_config.rds) { 74 | routes_by_dynamic_listeners[dynamic_listener.name].push(filter.typed_config.rds.route_config_name); 75 | } else { 76 | routes_by_dynamic_listeners[dynamic_listener.name].push(filter.typed_config.route_config.name); 77 | } 78 | } 79 | }); 80 | }); 81 | } 82 | }); 83 | 84 | route_configs_by_route = {} 85 | let routes_config_dump = configs['type.googleapis.com/envoy.admin.v3.RoutesConfigDump']; 86 | routes_config_dump.dynamic_route_configs.forEach(dynamic_route_config => { 87 | route_configs_by_route[dynamic_route_config.route_config.name] = dynamic_route_config.route_config; 88 | }); 89 | routes_config_dump.static_route_configs.forEach(static_route_config => { 90 | if (static_route_config.route_config.name) { 91 | route_configs_by_route[static_route_config.route_config.name] = static_route_config.route_config; 92 | } 93 | }); 94 | 95 | cluster_config_by_route = {}; 96 | if('type.googleapis.com/envoy.admin.v3.ClustersConfigDump' in configs) { 97 | let clusters_config_dump = configs['type.googleapis.com/envoy.admin.v3.ClustersConfigDump']; 98 | clusters_config_dump.dynamic_active_clusters.forEach(dynamic_active_cluster => { 99 | cluster_config_by_route[dynamic_active_cluster.cluster.name] = dynamic_active_cluster.cluster; 100 | }); 101 | } 102 | 103 | endpoint_config_by_route = {}; 104 | if('type.googleapis.com/envoy.admin.v3.EndpointsConfigDump' in configs) { 105 | let endpoints_config_dump = configs['type.googleapis.com/envoy.admin.v3.EndpointsConfigDump']; 106 | endpoints_config_dump.dynamic_endpoint_configs.forEach(dynamic_endpoint_config => { 107 | endpoint_config_by_route[dynamic_endpoint_config.endpoint_config.cluster_name.replace(/_\./g, "|")] = dynamic_endpoint_config.endpoint_config; 108 | }); 109 | } 110 | 111 | Object.keys(routes_by_dynamic_listeners).forEach(dynamic_listener => { 112 | routes_by_dynamic_listeners[dynamic_listener].forEach(route => { 113 | route_configs_by_route[route].virtual_hosts.forEach(virtual_host => { 114 | if ((typeof argv.d === 'undefined') || (array_match(virtual_host.domains, argv.d))) { 115 | if (virtual_host.routes) { 116 | virtual_host.routes.forEach(r => { 117 | let route_to_display; 118 | if (r.route) route_to_display = r.route; 119 | if (r.direct_response) route_to_display = r.direct_response; 120 | let cluster_to_display; 121 | cluster_to_display = cluster_config_by_route[r.route.cluster]; 122 | let endpoints_to_display; 123 | if (r.route && 'cluster' in r.route && r.route.cluster in endpoint_config_by_route) endpoints_to_display = endpoint_config_by_route[r.route.cluster]; 124 | let per_filter_config_to_display; 125 | if (r.typed_per_filter_config) per_filter_config_to_display = r.typed_per_filter_config; 126 | table_data.push([dynamic_listener, route, virtual_host.domains.join("\n"), JSON.stringify(r.match, null, 2), JSON.stringify(route_to_display, null, 2), JSON.stringify(per_filter_config_to_display, null, 2), JSON.stringify(cluster_to_display, null, 2), JSON.stringify(endpoints_to_display, null, 2)]); 127 | }); 128 | } 129 | } 130 | }); 131 | }); 132 | }); 133 | 134 | console.table(table_data.toString()); 135 | } 136 | -------------------------------------------------------------------------------- /envoyui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/djannot/envoyctl/d768d083a2bf472a1284681377099e0cb164cd04/envoyui.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "envoyctl", 3 | "version": "0.1.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "version": "0.1.0", 9 | "license": "GNU GPLv3", 10 | "dependencies": { 11 | "cli-table3": "^0.6.0", 12 | "mississippi": "^4.0.0", 13 | "yargs": "^16.2.0" 14 | }, 15 | "bin": { 16 | "envoyctl": "envoyctl.js" 17 | }, 18 | "engines": { 19 | "node": ">=10.12.0" 20 | } 21 | }, 22 | "node_modules/ansi-regex": { 23 | "version": "5.0.0", 24 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 25 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 26 | "engines": { 27 | "node": ">=8" 28 | } 29 | }, 30 | "node_modules/ansi-styles": { 31 | "version": "4.3.0", 32 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 33 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 34 | "dependencies": { 35 | "color-convert": "^2.0.1" 36 | }, 37 | "engines": { 38 | "node": ">=8" 39 | }, 40 | "funding": { 41 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 42 | } 43 | }, 44 | "node_modules/buffer-from": { 45 | "version": "1.1.1", 46 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 47 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 48 | }, 49 | "node_modules/cli-table3": { 50 | "version": "0.6.0", 51 | "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", 52 | "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", 53 | "dependencies": { 54 | "object-assign": "^4.1.0", 55 | "string-width": "^4.2.0" 56 | }, 57 | "engines": { 58 | "node": "10.* || >= 12.*" 59 | }, 60 | "optionalDependencies": { 61 | "colors": "^1.1.2" 62 | } 63 | }, 64 | "node_modules/cliui": { 65 | "version": "7.0.4", 66 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 67 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 68 | "dependencies": { 69 | "string-width": "^4.2.0", 70 | "strip-ansi": "^6.0.0", 71 | "wrap-ansi": "^7.0.0" 72 | } 73 | }, 74 | "node_modules/color-convert": { 75 | "version": "2.0.1", 76 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 77 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 78 | "dependencies": { 79 | "color-name": "~1.1.4" 80 | }, 81 | "engines": { 82 | "node": ">=7.0.0" 83 | } 84 | }, 85 | "node_modules/color-name": { 86 | "version": "1.1.4", 87 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 88 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 89 | }, 90 | "node_modules/colors": { 91 | "version": "1.4.0", 92 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 93 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", 94 | "optional": true, 95 | "engines": { 96 | "node": ">=0.1.90" 97 | } 98 | }, 99 | "node_modules/concat-stream": { 100 | "version": "2.0.0", 101 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 102 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 103 | "engines": [ 104 | "node >= 6.0" 105 | ], 106 | "dependencies": { 107 | "buffer-from": "^1.0.0", 108 | "inherits": "^2.0.3", 109 | "readable-stream": "^3.0.2", 110 | "typedarray": "^0.0.6" 111 | } 112 | }, 113 | "node_modules/core-util-is": { 114 | "version": "1.0.2", 115 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 116 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 117 | }, 118 | "node_modules/cyclist": { 119 | "version": "1.0.1", 120 | "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", 121 | "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" 122 | }, 123 | "node_modules/duplexify": { 124 | "version": "4.1.1", 125 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", 126 | "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", 127 | "dependencies": { 128 | "end-of-stream": "^1.4.1", 129 | "inherits": "^2.0.3", 130 | "readable-stream": "^3.1.1", 131 | "stream-shift": "^1.0.0" 132 | } 133 | }, 134 | "node_modules/emoji-regex": { 135 | "version": "8.0.0", 136 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 137 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 138 | }, 139 | "node_modules/end-of-stream": { 140 | "version": "1.4.4", 141 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 142 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 143 | "dependencies": { 144 | "once": "^1.4.0" 145 | } 146 | }, 147 | "node_modules/escalade": { 148 | "version": "3.1.1", 149 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 150 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 151 | "engines": { 152 | "node": ">=6" 153 | } 154 | }, 155 | "node_modules/flush-write-stream": { 156 | "version": "2.0.0", 157 | "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-2.0.0.tgz", 158 | "integrity": "sha512-uXClqPxT4xW0lcdSBheb2ObVU+kuqUk3Jk64EwieirEXZx9XUrVwp/JuBfKAWaM4T5Td/VL7QLDWPXp/MvGm/g==", 159 | "dependencies": { 160 | "inherits": "^2.0.3", 161 | "readable-stream": "^3.1.1" 162 | } 163 | }, 164 | "node_modules/from2": { 165 | "version": "2.3.0", 166 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 167 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 168 | "dependencies": { 169 | "inherits": "^2.0.1", 170 | "readable-stream": "^2.0.0" 171 | } 172 | }, 173 | "node_modules/from2/node_modules/readable-stream": { 174 | "version": "2.3.7", 175 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 176 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 177 | "dependencies": { 178 | "core-util-is": "~1.0.0", 179 | "inherits": "~2.0.3", 180 | "isarray": "~1.0.0", 181 | "process-nextick-args": "~2.0.0", 182 | "safe-buffer": "~5.1.1", 183 | "string_decoder": "~1.1.1", 184 | "util-deprecate": "~1.0.1" 185 | } 186 | }, 187 | "node_modules/from2/node_modules/safe-buffer": { 188 | "version": "5.1.2", 189 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 190 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 191 | }, 192 | "node_modules/from2/node_modules/string_decoder": { 193 | "version": "1.1.1", 194 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 195 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 196 | "dependencies": { 197 | "safe-buffer": "~5.1.0" 198 | } 199 | }, 200 | "node_modules/get-caller-file": { 201 | "version": "2.0.5", 202 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 203 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 204 | "engines": { 205 | "node": "6.* || 8.* || >= 10.*" 206 | } 207 | }, 208 | "node_modules/inherits": { 209 | "version": "2.0.4", 210 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 211 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 212 | }, 213 | "node_modules/is-fullwidth-code-point": { 214 | "version": "3.0.0", 215 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 216 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 217 | "engines": { 218 | "node": ">=8" 219 | } 220 | }, 221 | "node_modules/isarray": { 222 | "version": "1.0.0", 223 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 224 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 225 | }, 226 | "node_modules/mississippi": { 227 | "version": "4.0.0", 228 | "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-4.0.0.tgz", 229 | "integrity": "sha512-7PujJ3Te6GGg9lG1nfw5jYCPV6/BsoAT0nCQwb6w+ROuromXYxI6jc/CQSlD82Z/OUMSBX1SoaqhTE+vXiLQzQ==", 230 | "dependencies": { 231 | "concat-stream": "^2.0.0", 232 | "duplexify": "^4.0.0", 233 | "end-of-stream": "^1.1.0", 234 | "flush-write-stream": "^2.0.0", 235 | "from2": "^2.1.0", 236 | "parallel-transform": "^1.1.0", 237 | "pump": "^3.0.0", 238 | "pumpify": "^1.3.3", 239 | "stream-each": "^1.1.0", 240 | "through2": "^3.0.1" 241 | }, 242 | "engines": { 243 | "node": ">=4.0.0" 244 | } 245 | }, 246 | "node_modules/object-assign": { 247 | "version": "4.1.1", 248 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 249 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 250 | "engines": { 251 | "node": ">=0.10.0" 252 | } 253 | }, 254 | "node_modules/once": { 255 | "version": "1.4.0", 256 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 257 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 258 | "dependencies": { 259 | "wrappy": "1" 260 | } 261 | }, 262 | "node_modules/parallel-transform": { 263 | "version": "1.2.0", 264 | "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", 265 | "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", 266 | "dependencies": { 267 | "cyclist": "^1.0.1", 268 | "inherits": "^2.0.3", 269 | "readable-stream": "^2.1.5" 270 | } 271 | }, 272 | "node_modules/parallel-transform/node_modules/readable-stream": { 273 | "version": "2.3.7", 274 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 275 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 276 | "dependencies": { 277 | "core-util-is": "~1.0.0", 278 | "inherits": "~2.0.3", 279 | "isarray": "~1.0.0", 280 | "process-nextick-args": "~2.0.0", 281 | "safe-buffer": "~5.1.1", 282 | "string_decoder": "~1.1.1", 283 | "util-deprecate": "~1.0.1" 284 | } 285 | }, 286 | "node_modules/parallel-transform/node_modules/safe-buffer": { 287 | "version": "5.1.2", 288 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 289 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 290 | }, 291 | "node_modules/parallel-transform/node_modules/string_decoder": { 292 | "version": "1.1.1", 293 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 294 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 295 | "dependencies": { 296 | "safe-buffer": "~5.1.0" 297 | } 298 | }, 299 | "node_modules/process-nextick-args": { 300 | "version": "2.0.1", 301 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 302 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 303 | }, 304 | "node_modules/pump": { 305 | "version": "3.0.0", 306 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 307 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 308 | "dependencies": { 309 | "end-of-stream": "^1.1.0", 310 | "once": "^1.3.1" 311 | } 312 | }, 313 | "node_modules/pumpify": { 314 | "version": "1.5.1", 315 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 316 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 317 | "dependencies": { 318 | "duplexify": "^3.6.0", 319 | "inherits": "^2.0.3", 320 | "pump": "^2.0.0" 321 | } 322 | }, 323 | "node_modules/pumpify/node_modules/duplexify": { 324 | "version": "3.7.1", 325 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 326 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 327 | "dependencies": { 328 | "end-of-stream": "^1.0.0", 329 | "inherits": "^2.0.1", 330 | "readable-stream": "^2.0.0", 331 | "stream-shift": "^1.0.0" 332 | } 333 | }, 334 | "node_modules/pumpify/node_modules/pump": { 335 | "version": "2.0.1", 336 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 337 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 338 | "dependencies": { 339 | "end-of-stream": "^1.1.0", 340 | "once": "^1.3.1" 341 | } 342 | }, 343 | "node_modules/pumpify/node_modules/readable-stream": { 344 | "version": "2.3.7", 345 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 346 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 347 | "dependencies": { 348 | "core-util-is": "~1.0.0", 349 | "inherits": "~2.0.3", 350 | "isarray": "~1.0.0", 351 | "process-nextick-args": "~2.0.0", 352 | "safe-buffer": "~5.1.1", 353 | "string_decoder": "~1.1.1", 354 | "util-deprecate": "~1.0.1" 355 | } 356 | }, 357 | "node_modules/pumpify/node_modules/safe-buffer": { 358 | "version": "5.1.2", 359 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 360 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 361 | }, 362 | "node_modules/pumpify/node_modules/string_decoder": { 363 | "version": "1.1.1", 364 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 365 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 366 | "dependencies": { 367 | "safe-buffer": "~5.1.0" 368 | } 369 | }, 370 | "node_modules/readable-stream": { 371 | "version": "3.6.0", 372 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 373 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 374 | "dependencies": { 375 | "inherits": "^2.0.3", 376 | "string_decoder": "^1.1.1", 377 | "util-deprecate": "^1.0.1" 378 | }, 379 | "engines": { 380 | "node": ">= 6" 381 | } 382 | }, 383 | "node_modules/require-directory": { 384 | "version": "2.1.1", 385 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 386 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 387 | "engines": { 388 | "node": ">=0.10.0" 389 | } 390 | }, 391 | "node_modules/safe-buffer": { 392 | "version": "5.2.1", 393 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 394 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 395 | "funding": [ 396 | { 397 | "type": "github", 398 | "url": "https://github.com/sponsors/feross" 399 | }, 400 | { 401 | "type": "patreon", 402 | "url": "https://www.patreon.com/feross" 403 | }, 404 | { 405 | "type": "consulting", 406 | "url": "https://feross.org/support" 407 | } 408 | ] 409 | }, 410 | "node_modules/stream-each": { 411 | "version": "1.2.3", 412 | "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", 413 | "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", 414 | "dependencies": { 415 | "end-of-stream": "^1.1.0", 416 | "stream-shift": "^1.0.0" 417 | } 418 | }, 419 | "node_modules/stream-shift": { 420 | "version": "1.0.1", 421 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 422 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 423 | }, 424 | "node_modules/string_decoder": { 425 | "version": "1.3.0", 426 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 427 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 428 | "dependencies": { 429 | "safe-buffer": "~5.2.0" 430 | } 431 | }, 432 | "node_modules/string-width": { 433 | "version": "4.2.2", 434 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 435 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 436 | "dependencies": { 437 | "emoji-regex": "^8.0.0", 438 | "is-fullwidth-code-point": "^3.0.0", 439 | "strip-ansi": "^6.0.0" 440 | }, 441 | "engines": { 442 | "node": ">=8" 443 | } 444 | }, 445 | "node_modules/strip-ansi": { 446 | "version": "6.0.0", 447 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 448 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 449 | "dependencies": { 450 | "ansi-regex": "^5.0.0" 451 | }, 452 | "engines": { 453 | "node": ">=8" 454 | } 455 | }, 456 | "node_modules/through2": { 457 | "version": "3.0.2", 458 | "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", 459 | "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", 460 | "dependencies": { 461 | "inherits": "^2.0.4", 462 | "readable-stream": "2 || 3" 463 | } 464 | }, 465 | "node_modules/typedarray": { 466 | "version": "0.0.6", 467 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 468 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 469 | }, 470 | "node_modules/util-deprecate": { 471 | "version": "1.0.2", 472 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 473 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 474 | }, 475 | "node_modules/wrap-ansi": { 476 | "version": "7.0.0", 477 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 478 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 479 | "dependencies": { 480 | "ansi-styles": "^4.0.0", 481 | "string-width": "^4.1.0", 482 | "strip-ansi": "^6.0.0" 483 | }, 484 | "engines": { 485 | "node": ">=10" 486 | }, 487 | "funding": { 488 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 489 | } 490 | }, 491 | "node_modules/wrappy": { 492 | "version": "1.0.2", 493 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 494 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 495 | }, 496 | "node_modules/y18n": { 497 | "version": "5.0.8", 498 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 499 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 500 | "engines": { 501 | "node": ">=10" 502 | } 503 | }, 504 | "node_modules/yargs": { 505 | "version": "16.2.0", 506 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 507 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 508 | "dependencies": { 509 | "cliui": "^7.0.2", 510 | "escalade": "^3.1.1", 511 | "get-caller-file": "^2.0.5", 512 | "require-directory": "^2.1.1", 513 | "string-width": "^4.2.0", 514 | "y18n": "^5.0.5", 515 | "yargs-parser": "^20.2.2" 516 | }, 517 | "engines": { 518 | "node": ">=10" 519 | } 520 | }, 521 | "node_modules/yargs-parser": { 522 | "version": "20.2.7", 523 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", 524 | "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", 525 | "engines": { 526 | "node": ">=10" 527 | } 528 | } 529 | }, 530 | "dependencies": { 531 | "ansi-regex": { 532 | "version": "5.0.0", 533 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 534 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 535 | }, 536 | "ansi-styles": { 537 | "version": "4.3.0", 538 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 539 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 540 | "requires": { 541 | "color-convert": "^2.0.1" 542 | } 543 | }, 544 | "buffer-from": { 545 | "version": "1.1.1", 546 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 547 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 548 | }, 549 | "cli-table3": { 550 | "version": "0.6.0", 551 | "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", 552 | "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", 553 | "requires": { 554 | "colors": "^1.1.2", 555 | "object-assign": "^4.1.0", 556 | "string-width": "^4.2.0" 557 | } 558 | }, 559 | "cliui": { 560 | "version": "7.0.4", 561 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 562 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 563 | "requires": { 564 | "string-width": "^4.2.0", 565 | "strip-ansi": "^6.0.0", 566 | "wrap-ansi": "^7.0.0" 567 | } 568 | }, 569 | "color-convert": { 570 | "version": "2.0.1", 571 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 572 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 573 | "requires": { 574 | "color-name": "~1.1.4" 575 | } 576 | }, 577 | "color-name": { 578 | "version": "1.1.4", 579 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 580 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 581 | }, 582 | "colors": { 583 | "version": "1.4.0", 584 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 585 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", 586 | "optional": true 587 | }, 588 | "concat-stream": { 589 | "version": "2.0.0", 590 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 591 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 592 | "requires": { 593 | "buffer-from": "^1.0.0", 594 | "inherits": "^2.0.3", 595 | "readable-stream": "^3.0.2", 596 | "typedarray": "^0.0.6" 597 | } 598 | }, 599 | "core-util-is": { 600 | "version": "1.0.2", 601 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 602 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 603 | }, 604 | "cyclist": { 605 | "version": "1.0.1", 606 | "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", 607 | "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" 608 | }, 609 | "duplexify": { 610 | "version": "4.1.1", 611 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", 612 | "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", 613 | "requires": { 614 | "end-of-stream": "^1.4.1", 615 | "inherits": "^2.0.3", 616 | "readable-stream": "^3.1.1", 617 | "stream-shift": "^1.0.0" 618 | } 619 | }, 620 | "emoji-regex": { 621 | "version": "8.0.0", 622 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 623 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 624 | }, 625 | "end-of-stream": { 626 | "version": "1.4.4", 627 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 628 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 629 | "requires": { 630 | "once": "^1.4.0" 631 | } 632 | }, 633 | "escalade": { 634 | "version": "3.1.1", 635 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 636 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 637 | }, 638 | "flush-write-stream": { 639 | "version": "2.0.0", 640 | "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-2.0.0.tgz", 641 | "integrity": "sha512-uXClqPxT4xW0lcdSBheb2ObVU+kuqUk3Jk64EwieirEXZx9XUrVwp/JuBfKAWaM4T5Td/VL7QLDWPXp/MvGm/g==", 642 | "requires": { 643 | "inherits": "^2.0.3", 644 | "readable-stream": "^3.1.1" 645 | } 646 | }, 647 | "from2": { 648 | "version": "2.3.0", 649 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 650 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 651 | "requires": { 652 | "inherits": "^2.0.1", 653 | "readable-stream": "^2.0.0" 654 | }, 655 | "dependencies": { 656 | "readable-stream": { 657 | "version": "2.3.7", 658 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 659 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 660 | "requires": { 661 | "core-util-is": "~1.0.0", 662 | "inherits": "~2.0.3", 663 | "isarray": "~1.0.0", 664 | "process-nextick-args": "~2.0.0", 665 | "safe-buffer": "~5.1.1", 666 | "string_decoder": "~1.1.1", 667 | "util-deprecate": "~1.0.1" 668 | } 669 | }, 670 | "safe-buffer": { 671 | "version": "5.1.2", 672 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 673 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 674 | }, 675 | "string_decoder": { 676 | "version": "1.1.1", 677 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 678 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 679 | "requires": { 680 | "safe-buffer": "~5.1.0" 681 | } 682 | } 683 | } 684 | }, 685 | "get-caller-file": { 686 | "version": "2.0.5", 687 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 688 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 689 | }, 690 | "inherits": { 691 | "version": "2.0.4", 692 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 693 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 694 | }, 695 | "is-fullwidth-code-point": { 696 | "version": "3.0.0", 697 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 698 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 699 | }, 700 | "isarray": { 701 | "version": "1.0.0", 702 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 703 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 704 | }, 705 | "mississippi": { 706 | "version": "4.0.0", 707 | "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-4.0.0.tgz", 708 | "integrity": "sha512-7PujJ3Te6GGg9lG1nfw5jYCPV6/BsoAT0nCQwb6w+ROuromXYxI6jc/CQSlD82Z/OUMSBX1SoaqhTE+vXiLQzQ==", 709 | "requires": { 710 | "concat-stream": "^2.0.0", 711 | "duplexify": "^4.0.0", 712 | "end-of-stream": "^1.1.0", 713 | "flush-write-stream": "^2.0.0", 714 | "from2": "^2.1.0", 715 | "parallel-transform": "^1.1.0", 716 | "pump": "^3.0.0", 717 | "pumpify": "^1.3.3", 718 | "stream-each": "^1.1.0", 719 | "through2": "^3.0.1" 720 | } 721 | }, 722 | "object-assign": { 723 | "version": "4.1.1", 724 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 725 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 726 | }, 727 | "once": { 728 | "version": "1.4.0", 729 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 730 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 731 | "requires": { 732 | "wrappy": "1" 733 | } 734 | }, 735 | "parallel-transform": { 736 | "version": "1.2.0", 737 | "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", 738 | "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", 739 | "requires": { 740 | "cyclist": "^1.0.1", 741 | "inherits": "^2.0.3", 742 | "readable-stream": "^2.1.5" 743 | }, 744 | "dependencies": { 745 | "readable-stream": { 746 | "version": "2.3.7", 747 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 748 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 749 | "requires": { 750 | "core-util-is": "~1.0.0", 751 | "inherits": "~2.0.3", 752 | "isarray": "~1.0.0", 753 | "process-nextick-args": "~2.0.0", 754 | "safe-buffer": "~5.1.1", 755 | "string_decoder": "~1.1.1", 756 | "util-deprecate": "~1.0.1" 757 | } 758 | }, 759 | "safe-buffer": { 760 | "version": "5.1.2", 761 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 762 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 763 | }, 764 | "string_decoder": { 765 | "version": "1.1.1", 766 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 767 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 768 | "requires": { 769 | "safe-buffer": "~5.1.0" 770 | } 771 | } 772 | } 773 | }, 774 | "process-nextick-args": { 775 | "version": "2.0.1", 776 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 777 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 778 | }, 779 | "pump": { 780 | "version": "3.0.0", 781 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 782 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 783 | "requires": { 784 | "end-of-stream": "^1.1.0", 785 | "once": "^1.3.1" 786 | } 787 | }, 788 | "pumpify": { 789 | "version": "1.5.1", 790 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 791 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 792 | "requires": { 793 | "duplexify": "^3.6.0", 794 | "inherits": "^2.0.3", 795 | "pump": "^2.0.0" 796 | }, 797 | "dependencies": { 798 | "duplexify": { 799 | "version": "3.7.1", 800 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 801 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 802 | "requires": { 803 | "end-of-stream": "^1.0.0", 804 | "inherits": "^2.0.1", 805 | "readable-stream": "^2.0.0", 806 | "stream-shift": "^1.0.0" 807 | } 808 | }, 809 | "pump": { 810 | "version": "2.0.1", 811 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 812 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 813 | "requires": { 814 | "end-of-stream": "^1.1.0", 815 | "once": "^1.3.1" 816 | } 817 | }, 818 | "readable-stream": { 819 | "version": "2.3.7", 820 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 821 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 822 | "requires": { 823 | "core-util-is": "~1.0.0", 824 | "inherits": "~2.0.3", 825 | "isarray": "~1.0.0", 826 | "process-nextick-args": "~2.0.0", 827 | "safe-buffer": "~5.1.1", 828 | "string_decoder": "~1.1.1", 829 | "util-deprecate": "~1.0.1" 830 | } 831 | }, 832 | "safe-buffer": { 833 | "version": "5.1.2", 834 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 835 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 836 | }, 837 | "string_decoder": { 838 | "version": "1.1.1", 839 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 840 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 841 | "requires": { 842 | "safe-buffer": "~5.1.0" 843 | } 844 | } 845 | } 846 | }, 847 | "readable-stream": { 848 | "version": "3.6.0", 849 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 850 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 851 | "requires": { 852 | "inherits": "^2.0.3", 853 | "string_decoder": "^1.1.1", 854 | "util-deprecate": "^1.0.1" 855 | } 856 | }, 857 | "require-directory": { 858 | "version": "2.1.1", 859 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 860 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 861 | }, 862 | "safe-buffer": { 863 | "version": "5.2.1", 864 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 865 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 866 | }, 867 | "stream-each": { 868 | "version": "1.2.3", 869 | "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", 870 | "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", 871 | "requires": { 872 | "end-of-stream": "^1.1.0", 873 | "stream-shift": "^1.0.0" 874 | } 875 | }, 876 | "stream-shift": { 877 | "version": "1.0.1", 878 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 879 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 880 | }, 881 | "string_decoder": { 882 | "version": "1.3.0", 883 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 884 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 885 | "requires": { 886 | "safe-buffer": "~5.2.0" 887 | } 888 | }, 889 | "string-width": { 890 | "version": "4.2.2", 891 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 892 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 893 | "requires": { 894 | "emoji-regex": "^8.0.0", 895 | "is-fullwidth-code-point": "^3.0.0", 896 | "strip-ansi": "^6.0.0" 897 | } 898 | }, 899 | "strip-ansi": { 900 | "version": "6.0.0", 901 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 902 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 903 | "requires": { 904 | "ansi-regex": "^5.0.0" 905 | } 906 | }, 907 | "through2": { 908 | "version": "3.0.2", 909 | "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", 910 | "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", 911 | "requires": { 912 | "inherits": "^2.0.4", 913 | "readable-stream": "2 || 3" 914 | } 915 | }, 916 | "typedarray": { 917 | "version": "0.0.6", 918 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 919 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 920 | }, 921 | "util-deprecate": { 922 | "version": "1.0.2", 923 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 924 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 925 | }, 926 | "wrap-ansi": { 927 | "version": "7.0.0", 928 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 929 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 930 | "requires": { 931 | "ansi-styles": "^4.0.0", 932 | "string-width": "^4.1.0", 933 | "strip-ansi": "^6.0.0" 934 | } 935 | }, 936 | "wrappy": { 937 | "version": "1.0.2", 938 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 939 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 940 | }, 941 | "y18n": { 942 | "version": "5.0.8", 943 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 944 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 945 | }, 946 | "yargs": { 947 | "version": "16.2.0", 948 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 949 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 950 | "requires": { 951 | "cliui": "^7.0.2", 952 | "escalade": "^3.1.1", 953 | "get-caller-file": "^2.0.5", 954 | "require-directory": "^2.1.1", 955 | "string-width": "^4.2.0", 956 | "y18n": "^5.0.5", 957 | "yargs-parser": "^20.2.2" 958 | } 959 | }, 960 | "yargs-parser": { 961 | "version": "20.2.7", 962 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", 963 | "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" 964 | } 965 | } 966 | } 967 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "envoyctl", 3 | "version": "0.1.0", 4 | "description": "A CLI tool to help debugging Envoy", 5 | "main": "envoyctl.js", 6 | "keywords": "envoy", 7 | "author": "Denis Jannot ", 8 | "license": "GNU GPLv3", 9 | "engines": { 10 | "node": ">=10.12.0" 11 | }, 12 | "scripts": { 13 | "start": "node ./src/index.js" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/djannot/envoyctl.git" 18 | }, 19 | "bugs": { 20 | "url": "https://github.com/djannot/envoyctl/issues" 21 | }, 22 | "homepage": "https://github.com/djannot/envoyctl", 23 | "bin": { 24 | "envoyctl": "./envoyctl.js" 25 | }, 26 | "dependencies": { 27 | "cli-table3": "^0.6.0", 28 | "mississippi": "^4.0.0", 29 | "yargs": "^16.2.0" 30 | } 31 | } 32 | --------------------------------------------------------------------------------