├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── agc-guide.md ├── app ├── .dockerignore ├── .gitignore ├── Dockerfile ├── kubernetes │ ├── agc-broker-deployment.yaml │ ├── agc-broker-service.yaml │ ├── agc-ingress.yaml │ ├── agc-state-deployment.yaml │ ├── agc-state-service.yaml │ ├── agc-worker-deployment.yaml │ └── agc-worker-service.yaml ├── nodemon.json ├── package-lock.json ├── package.json ├── public │ ├── asyngular-client.js │ ├── favicon.ico │ ├── img │ │ └── logo.png │ └── index.html └── server.js ├── bin └── cli.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | sample/package-lock.json 3 | 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | app/public/node_modules 3 | test 4 | 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 SocketCluster 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 | # Asyngular 2 | 3 | Toolset and boilerplate for quickly creating systems using Asyngular. 4 | See the client and server repos for documentation: 5 | 6 | - https://github.com/SocketCluster/asyngular-client 7 | - https://github.com/SocketCluster/asyngular-server 8 | 9 | Documentation for AGC (horizontally scalable cluster) is available at https://github.com/SocketCluster/asyngular/blob/master/agc-guide.md 10 | 11 | ## Installation 12 | 13 | Setup the `asyngular` command: 14 | 15 | ```bash 16 | npm install -g asyngular 17 | ``` 18 | 19 | or: 20 | 21 | ```bash 22 | sudo npm install -g asyngular 23 | ``` 24 | 25 | then: 26 | 27 | ```bash 28 | asyngular create myapp 29 | ``` 30 | 31 | Once it's installed, go to your new myapp/ directory and launch with: 32 | 33 | ```bash 34 | node server 35 | ``` 36 | 37 | Access at URL http://localhost:8000/ 38 | 39 | Node.js `v10.0.0` or above is recommended but you can also use Asyngular with older Node.js versions if you use `while` loops instead of `for-await-of` loops. 40 | 41 | ## Compatibility mode 42 | 43 | For compatibility with existing SocketCluster clients, set the `protocolVersion` to `1` and make sure that the `path` matches your old client path: 44 | 45 | ```js 46 | let agServer = asyngularServer.attach(httpServer, { 47 | protocolVersion: 1, 48 | path: '/socketcluster/' 49 | }); 50 | ``` 51 | 52 | ## Change log 53 | 54 | See the 'releases' section for changes: https://github.com/SocketCluster/asyngular/releases 55 | 56 | ## License 57 | 58 | (The MIT License) 59 | 60 | Copyright (c) 2013-2019 SocketCluster.io 61 | 62 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 63 | 64 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 65 | 66 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 67 | -------------------------------------------------------------------------------- /agc-guide.md: -------------------------------------------------------------------------------- 1 | # AGC Guide 2 | 3 | AGC is a collection of services which allow you to easily deploy and scale Asyngular to any number of machines. 4 | AGC is designed to scale linearly and is optimized for running on Kubernetes but it can be setup without using an orchestrator. 5 | 6 | AGC is made up of the following services: 7 | 8 | - agc-worker (asyngular) https://github.com/SocketCluster/asyngular 9 | - agc-broker https://github.com/SocketCluster/agc-broker 10 | - agc-state https://github.com/SocketCluster/agc-state 11 | - agc-ingress (Kubernetes only) 12 | 13 | ## How it works 14 | 15 | The **agc-worker** service can be made up of any number of regular Asyngular instances - The main difference between running Asyngular as a single instance vs running it as a cluster is that in cluster mode, you need to point each **agc-worker** instance to a working `agc-state` (state server) instance. 16 | 17 | The **agc-broker** service can be made up of any number of **agc-broker** instances - This is a special backend-only service which is designed to broker 18 | messages between multiple frontend-facing **agc-worker** instances. All the pub/sub channels in your entire system will be sharded evenly across available **agc-broker** instances. 19 | Just like with the **agc-worker** instances above, each **agc-broker** instance needs to point to a state server in order to work. 20 | 21 | The **agc-state** service is made up of a single instance - Its job is to dispatch the state of the cluster to all interested services to allow them to reshard themselves. The **agc-state** instance will notify all frontend **agc-worker** instances whenever a new backend **agc-broker** joins the cluster. This allows **agc-worker** instances to rebalance their pub/sub channels evenly across available brokers whenever a new **agc-broker** instance joins the cluster. 22 | Note that AGC can continue to operate without any disruption of service while the **agc-state** instance is down/unavailable (see notes at the bottom of this page). 23 | 24 | ## Running on Kubernetes (recommended) 25 | 26 | Running on Kubernetes (K8s) is easy; you just need to run all the `.yaml` files from the `kubernetes/` directory from the Asyngular repo (https://github.com/SocketCluster/asyngular/tree/master/kubernetes) using the `kubectl` command (one at a time): 27 | 28 | ``` 29 | kubectl create -f 30 | ``` 31 | 32 | By default, you should also add a TLS/SSL key and cert pair to your provider (Rancher has a page were you can just paste them in). 33 | Or if you don't want to use a certificate (not recommended), you can just delete these lines from `agc-ingress.yaml` before you create it with `kubectl`: 34 | 35 | ``` 36 | tls: 37 | - secretName: agc-tls-credentials 38 | ``` 39 | 40 | Note that the step above is crucial if you don't want to use TLS/SSL - Otherwise the ingress load balancer service will not show up on your Rancher control panel until you add some credentials with the name `agc-tls-credentials` to your Rancher control panel (See Infrastructure > Certificates page). 41 | 42 | ## Running using Node.js directly 43 | 44 | You can also run AGC using only Node.js version >= 10.x.x. 45 | For simplicity, we will show you how to run everything on your localhost (`127.0.0.1`), but in practice, you will need to change `127.0.0.1` to an appropriate IP, host name or domain name. 46 | 47 | First, you need to download each of these repositories to your machine(s): 48 | 49 | - `git clone https://github.com/SocketCluster/agc-broker` 50 | - `git clone https://github.com/SocketCluster/agc-state` 51 | 52 | Then inside each repo, you should run `npm install` without any arguments to install dependencies. 53 | 54 | Then you need to setup a new Asyngular project to use as your user-facing instance. 55 | 56 | Once you have the two repos mentioned earlier and your Asyngular project setup, you should launch the state server first by 57 | going inside your local **agc-state** repo and then running the command: 58 | 59 | ``` 60 | node server 61 | ``` 62 | 63 | Next, to launch a broker, you should navigate to your **agc-broker** repo and run the command: 64 | 65 | ``` 66 | AGC_STATE_SERVER_HOST='127.0.0.1' AGC_BROKER_SERVER_PORT='8888' node server 67 | ``` 68 | 69 | Finally, to run a frontend-facing Asyngular instance, you can navigate to your asyngular project directory and run: 70 | 71 | ``` 72 | AGC_STATE_SERVER_HOST='127.0.0.1' ASYNGULAR_PORT='8000' node server 73 | ``` 74 | 75 | You can add a second frontend-facing server by running (this time running on port 8001): 76 | 77 | ``` 78 | AGC_STATE_SERVER_HOST='127.0.0.1' ASYNGULAR_PORT='8001' node server 79 | ``` 80 | Now if you navigate to either `localhost:8000` or `localhost:8001` in your browser, you should see that your pub/sub channels are shared between the two **agc-worker** instances. 81 | 82 | Note that you can provide additional environment variables to various instances to set custom port numbers, passwords etc... 83 | For more info, you can look inside the code in the `server.js` file in each repo and see what `process.env` vars are used. 84 | 85 | When running multiples instances of any service on the same machine, make sure that the ports don't clash - Modify the `AGC_BROKER_SERVER_PORT` or `ASYNGULAR_PORT` environment variable for each instance to make sure that they are unique. 86 | 87 | ## CAP theorem 88 | 89 | User-facing instances in AGC are highly available (this was done to ensure that AGC is resilient against DDoS attacks). 90 | Back end instances, on the other hand, are optimized for consistency and efficiency. AGC is designed to quickly recover from failure of back end instances (a few seconds of partial missed messages at worst). Note that it's still possible to implement guaranteed delivery of messages by assigning a unique ID to each published message and resending messages which have not been acknowledged. 91 | 92 | ## Notes 93 | 94 | You should only ever run a single **agc-state** per cluster - Note that the cluster can continue to operate without any disruption while **agc-state** is down. 95 | **agc-state** only needs to be available for a few seconds while AGC is in the process of scaling itself up or down. Even if **agc-state** crashes while in the middle of scaling up, AGC will wait for **agc-state** to become available again (still without disruptions to the existing service) and will resume the scaling operation as soon as the **agc-state** instance becomes available again. 96 | In the event of a crash, K8s will respawn **agc-state** within a few seconds so a failure of **agc-state** will only delay your scale up/down operation at worst. 97 | Nevertheless, it is recommended that you run the **agc-state** instance inside your datacenter/AWS availability zone and do not expose it to the public internet. 98 | 99 | The **agc-state** instance does not handle any pub/sub messages and so it is not a bottleneck with regards to the scalability of your cluster (AGC scales linearly). 100 | 101 | Note that you can launch the services in any order you like but if your state server is not available, you may get harmless `Socket hung up` warnings on other instances (while they keep trying to reconnect) until **agc-state** becomes available again. 102 | -------------------------------------------------------------------------------- /app/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | package-lock.json 3 | asyngular-k8s.json 4 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | asyngular-k8s.json 3 | -------------------------------------------------------------------------------- /app/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:10-slim 2 | 3 | LABEL maintainer="Jonathan Gros-Dubois" 4 | LABEL version="6.1.1" 5 | LABEL description="Docker file for Asyngular with support for clustering." 6 | 7 | RUN mkdir -p /usr/src/ 8 | WORKDIR /usr/src/ 9 | COPY . /usr/src/ 10 | 11 | RUN npm install . 12 | 13 | EXPOSE 8000 14 | 15 | CMD ["npm", "run", "start:docker"] 16 | -------------------------------------------------------------------------------- /app/kubernetes/agc-broker-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: agc-broker 5 | spec: 6 | replicas: 1 7 | selector: 8 | matchLabels: 9 | component: agc-broker 10 | template: 11 | metadata: 12 | labels: 13 | component: agc-broker 14 | spec: 15 | containers: 16 | - 17 | name: agc-broker 18 | image: 'socketcluster/agc-broker:v6.0.0' 19 | ports: 20 | - 21 | name: agc-broker 22 | containerPort: 8888 23 | env: 24 | - 25 | name: AGC_STATE_SERVER_HOST 26 | value: agc-state 27 | - 28 | name: AGC_INSTANCE_IP 29 | valueFrom: 30 | fieldRef: 31 | fieldPath: status.podIP 32 | - 33 | name: AGC_BROKER_SERVER_LOG_LEVEL 34 | value: '2' 35 | readinessProbe: 36 | httpGet: 37 | path: /health-check 38 | port: agc-broker 39 | initialDelaySeconds: 5 40 | timeoutSeconds: 10 41 | livenessProbe: 42 | httpGet: 43 | path: /health-check 44 | port: agc-broker 45 | initialDelaySeconds: 15 46 | timeoutSeconds: 20 47 | -------------------------------------------------------------------------------- /app/kubernetes/agc-broker-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: agc-broker 5 | spec: 6 | type: ClusterIP 7 | ports: 8 | - 9 | port: 8888 10 | targetPort: 8888 11 | selector: 12 | component: agc-broker 13 | -------------------------------------------------------------------------------- /app/kubernetes/agc-ingress.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: extensions/v1beta1 2 | kind: Ingress 3 | metadata: 4 | name: agc-ingress 5 | annotations: 6 | kubernetes.io/ingress.allow-http: 'false' 7 | spec: 8 | # You should upload a certificate to your Kubernetes platform and refer to it here by secretName. 9 | # If you do not want to serve AGC over TLS, you can remove or comment out the 10 | # kubernetes.io/ingress.allow-http annotation above and the tls section below. 11 | # Note that raw (unencrypted) WebSockets may not work if you are behind a corporate proxy so 12 | # it is advised that you provide a cert for production and access the AGC service via https:// and wss:// 13 | tls: 14 | - 15 | secretName: agc-tls-credentials 16 | backend: 17 | serviceName: agc-worker 18 | servicePort: 8000 19 | -------------------------------------------------------------------------------- /app/kubernetes/agc-state-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: agc-state 5 | spec: 6 | replicas: 1 7 | selector: 8 | matchLabels: 9 | component: agc-state 10 | template: 11 | metadata: 12 | labels: 13 | component: agc-state 14 | spec: 15 | containers: 16 | - 17 | name: agc-state 18 | image: 'socketcluster/agc-state:v6.0.0' 19 | ports: 20 | - 21 | name: agc-state 22 | containerPort: 7777 23 | readinessProbe: 24 | httpGet: 25 | path: /health-check 26 | port: agc-state 27 | initialDelaySeconds: 5 28 | timeoutSeconds: 10 29 | livenessProbe: 30 | httpGet: 31 | path: /health-check 32 | port: agc-state 33 | initialDelaySeconds: 15 34 | timeoutSeconds: 20 35 | -------------------------------------------------------------------------------- /app/kubernetes/agc-state-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: agc-state 5 | spec: 6 | type: ClusterIP 7 | ports: 8 | - 9 | port: 7777 10 | targetPort: 7777 11 | selector: 12 | component: agc-state 13 | -------------------------------------------------------------------------------- /app/kubernetes/agc-worker-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: agc-worker 5 | spec: 6 | replicas: 1 7 | selector: 8 | matchLabels: 9 | component: agc-worker 10 | template: 11 | metadata: 12 | labels: 13 | component: agc-worker 14 | spec: 15 | containers: 16 | - 17 | name: agc-worker 18 | image: 'socketcluster/asyngular:v6.1.1' 19 | ports: 20 | - 21 | name: agc-worker 22 | containerPort: 8000 23 | env: 24 | - 25 | name: AGC_STATE_SERVER_HOST 26 | value: agc-state 27 | - 28 | name: AGC_INSTANCE_IP 29 | valueFrom: 30 | fieldRef: 31 | fieldPath: status.podIP 32 | - 33 | name: ENV 34 | value: prod 35 | readinessProbe: 36 | httpGet: 37 | path: /health-check 38 | port: agc-worker 39 | initialDelaySeconds: 5 40 | timeoutSeconds: 10 41 | livenessProbe: 42 | httpGet: 43 | path: /health-check 44 | port: agc-worker 45 | initialDelaySeconds: 15 46 | timeoutSeconds: 20 47 | -------------------------------------------------------------------------------- /app/kubernetes/agc-worker-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: agc-worker 5 | spec: 6 | type: NodePort 7 | ports: 8 | - 9 | port: 8000 10 | targetPort: 8000 11 | selector: 12 | component: agc-worker 13 | -------------------------------------------------------------------------------- /app/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignore": ["public/*"] 3 | } 4 | -------------------------------------------------------------------------------- /app/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "asyngular-sample", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 11 | }, 12 | "accepts": { 13 | "version": "1.3.7", 14 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 15 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 16 | "requires": { 17 | "mime-types": "~2.1.24", 18 | "negotiator": "0.6.2" 19 | } 20 | }, 21 | "ag-auth": { 22 | "version": "1.0.1", 23 | "resolved": "https://registry.npmjs.org/ag-auth/-/ag-auth-1.0.1.tgz", 24 | "integrity": "sha512-zlDUFLNWOrWuQstP785+UXL+WMhRvpw/66BThpKMpqSZ15dcl8dbic5VYC7an0bgoBgCLNNiCxtz0+bJxT1BeQ==", 25 | "requires": { 26 | "jsonwebtoken": "^8.3.0", 27 | "sc-errors": "^2.0.0" 28 | } 29 | }, 30 | "ag-channel": { 31 | "version": "4.0.2", 32 | "resolved": "https://registry.npmjs.org/ag-channel/-/ag-channel-4.0.2.tgz", 33 | "integrity": "sha512-GU20s/ZGjt0L1H+OJ+bISlXnReWAh5t+HRHAMrBLWaAlKOnvkRr7hQ7Bv+1O/TPGmGA7hJGRiqNtoZkAnE9/MQ==", 34 | "requires": { 35 | "consumable-stream": "^1.0.0" 36 | } 37 | }, 38 | "ag-request": { 39 | "version": "1.0.0", 40 | "resolved": "https://registry.npmjs.org/ag-request/-/ag-request-1.0.0.tgz", 41 | "integrity": "sha512-2f7I0cQLMVyGAqjSewVMEFuAsJsIY6egdE16UHS636r+8c6Oevrv0j6SrOIXyRN6yuNT4PBuhiKmrhHbh9OvEg==", 42 | "requires": { 43 | "sc-errors": "^2.0.0" 44 | } 45 | }, 46 | "ag-simple-broker": { 47 | "version": "4.0.6", 48 | "resolved": "https://registry.npmjs.org/ag-simple-broker/-/ag-simple-broker-4.0.6.tgz", 49 | "integrity": "sha512-MavQWeMZeu03oqOLL67QGJPugFEgb5GyTs1PzVQDSUhXjHuvl8Etl5gob/GKH3/u1C7Rz7/Jm1ErzeI+2tH42Q==", 50 | "requires": { 51 | "ag-channel": "^4.0.2", 52 | "async-stream-emitter": "^3.0.2", 53 | "stream-demux": "^7.0.1" 54 | } 55 | }, 56 | "agc-broker-client": { 57 | "version": "6.1.1", 58 | "resolved": "https://registry.npmjs.org/agc-broker-client/-/agc-broker-client-6.1.1.tgz", 59 | "integrity": "sha512-RobbscSe/YUKpODvozVfQrLn9o/olIj77SBEpl4GCcSTaNh6f6z/UVL6jE1oHnCWxwwvG5W7H+HpafKDgioLwA==", 60 | "requires": { 61 | "async-stream-emitter": "^3.0.3", 62 | "asyngular-client": "^6.2.0", 63 | "skeleton-rendezvous": "^1.1.1" 64 | } 65 | }, 66 | "ansi-align": { 67 | "version": "2.0.0", 68 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", 69 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", 70 | "requires": { 71 | "string-width": "^2.0.0" 72 | } 73 | }, 74 | "ansi-regex": { 75 | "version": "3.0.0", 76 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 77 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 78 | }, 79 | "ansi-styles": { 80 | "version": "3.2.1", 81 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 82 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 83 | "requires": { 84 | "color-convert": "^1.9.0" 85 | } 86 | }, 87 | "anymatch": { 88 | "version": "2.0.0", 89 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", 90 | "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", 91 | "requires": { 92 | "micromatch": "^3.1.4", 93 | "normalize-path": "^2.1.1" 94 | }, 95 | "dependencies": { 96 | "normalize-path": { 97 | "version": "2.1.1", 98 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 99 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 100 | "requires": { 101 | "remove-trailing-separator": "^1.0.1" 102 | } 103 | } 104 | } 105 | }, 106 | "arr-diff": { 107 | "version": "4.0.0", 108 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", 109 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" 110 | }, 111 | "arr-flatten": { 112 | "version": "1.1.0", 113 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 114 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" 115 | }, 116 | "arr-union": { 117 | "version": "3.1.0", 118 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 119 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" 120 | }, 121 | "array-flatten": { 122 | "version": "1.1.1", 123 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 124 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 125 | }, 126 | "array-unique": { 127 | "version": "0.3.2", 128 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", 129 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" 130 | }, 131 | "assign-symbols": { 132 | "version": "1.0.0", 133 | "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", 134 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" 135 | }, 136 | "async-each": { 137 | "version": "1.0.3", 138 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", 139 | "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" 140 | }, 141 | "async-limiter": { 142 | "version": "1.0.1", 143 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 144 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" 145 | }, 146 | "async-stream-emitter": { 147 | "version": "3.0.3", 148 | "resolved": "https://registry.npmjs.org/async-stream-emitter/-/async-stream-emitter-3.0.3.tgz", 149 | "integrity": "sha512-zXfmhWvPFWwzp5KEpdGrH3GDs1t0WZM6/Q2QoMerYFpc2z0H2KnXl4yNsN5PYNfcEym8leBWhoNxnijv646U0g==", 150 | "requires": { 151 | "stream-demux": "^7.0.1" 152 | } 153 | }, 154 | "asyngular-client": { 155 | "version": "6.2.0", 156 | "resolved": "https://registry.npmjs.org/asyngular-client/-/asyngular-client-6.2.0.tgz", 157 | "integrity": "sha512-7xDmhfs4ZceLDHP0qS/BfVrZM59gx0pPjQ25eurYKGi2VtIKkVFrQiBghpE9ljVGdT6LZRUZ6r+nass+eeXTdA==", 158 | "requires": { 159 | "ag-channel": "^4.0.2", 160 | "ag-request": "^1.0.0", 161 | "async-stream-emitter": "^3.0.2", 162 | "buffer": "^5.2.1", 163 | "linked-list": "^0.1.0", 164 | "lodash.clonedeep": "^4.5.0", 165 | "querystring": "^0.2.0", 166 | "sc-errors": "^2.0.1", 167 | "sc-formatter": "^3.0.2", 168 | "stream-demux": "^7.0.1", 169 | "uuid": "^3.2.1", 170 | "ws": "^7.1.0" 171 | }, 172 | "dependencies": { 173 | "sc-errors": { 174 | "version": "2.0.1", 175 | "resolved": "https://registry.npmjs.org/sc-errors/-/sc-errors-2.0.1.tgz", 176 | "integrity": "sha512-JoVhq3Ud+3Ujv2SIG7W0XtjRHsrNgl6iXuHHsh0s+Kdt5NwI6N2EGAZD4iteitdDv68ENBkpjtSvN597/wxPSQ==" 177 | } 178 | } 179 | }, 180 | "asyngular-server": { 181 | "version": "6.2.1", 182 | "resolved": "https://registry.npmjs.org/asyngular-server/-/asyngular-server-6.2.1.tgz", 183 | "integrity": "sha512-NynaekCdmB4JdzLzD62PQm95c/puWjanQw7yK9X9uIBmc8n/MHywl1rSG3+wmMn4VA1xb9sXddPenSdqDts+jA==", 184 | "requires": { 185 | "ag-auth": "^1.0.1", 186 | "ag-request": "^1.0.0", 187 | "ag-simple-broker": "^4.0.6", 188 | "async-stream-emitter": "^3.0.2", 189 | "base64id": "^1.0.0", 190 | "lodash.clonedeep": "^4.5.0", 191 | "sc-errors": "^2.0.1", 192 | "sc-formatter": "^3.0.2", 193 | "stream-demux": "^7.0.1", 194 | "writable-consumable-stream": "^1.1.1", 195 | "ws": "^7.1.0" 196 | }, 197 | "dependencies": { 198 | "sc-errors": { 199 | "version": "2.0.1", 200 | "resolved": "https://registry.npmjs.org/sc-errors/-/sc-errors-2.0.1.tgz", 201 | "integrity": "sha512-JoVhq3Ud+3Ujv2SIG7W0XtjRHsrNgl6iXuHHsh0s+Kdt5NwI6N2EGAZD4iteitdDv68ENBkpjtSvN597/wxPSQ==" 202 | } 203 | } 204 | }, 205 | "atob": { 206 | "version": "2.1.2", 207 | "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", 208 | "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" 209 | }, 210 | "balanced-match": { 211 | "version": "1.0.0", 212 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 213 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 214 | }, 215 | "base": { 216 | "version": "0.11.2", 217 | "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", 218 | "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", 219 | "requires": { 220 | "cache-base": "^1.0.1", 221 | "class-utils": "^0.3.5", 222 | "component-emitter": "^1.2.1", 223 | "define-property": "^1.0.0", 224 | "isobject": "^3.0.1", 225 | "mixin-deep": "^1.2.0", 226 | "pascalcase": "^0.1.1" 227 | }, 228 | "dependencies": { 229 | "define-property": { 230 | "version": "1.0.0", 231 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 232 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 233 | "requires": { 234 | "is-descriptor": "^1.0.0" 235 | } 236 | }, 237 | "is-accessor-descriptor": { 238 | "version": "1.0.0", 239 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 240 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 241 | "requires": { 242 | "kind-of": "^6.0.0" 243 | } 244 | }, 245 | "is-data-descriptor": { 246 | "version": "1.0.0", 247 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 248 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 249 | "requires": { 250 | "kind-of": "^6.0.0" 251 | } 252 | }, 253 | "is-descriptor": { 254 | "version": "1.0.2", 255 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 256 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 257 | "requires": { 258 | "is-accessor-descriptor": "^1.0.0", 259 | "is-data-descriptor": "^1.0.0", 260 | "kind-of": "^6.0.2" 261 | } 262 | } 263 | } 264 | }, 265 | "base64-js": { 266 | "version": "1.3.1", 267 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 268 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" 269 | }, 270 | "base64id": { 271 | "version": "1.0.0", 272 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", 273 | "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" 274 | }, 275 | "basic-auth": { 276 | "version": "2.0.1", 277 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 278 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 279 | "requires": { 280 | "safe-buffer": "5.1.2" 281 | } 282 | }, 283 | "binary-extensions": { 284 | "version": "1.13.1", 285 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", 286 | "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" 287 | }, 288 | "body-parser": { 289 | "version": "1.19.0", 290 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 291 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 292 | "requires": { 293 | "bytes": "3.1.0", 294 | "content-type": "~1.0.4", 295 | "debug": "2.6.9", 296 | "depd": "~1.1.2", 297 | "http-errors": "1.7.2", 298 | "iconv-lite": "0.4.24", 299 | "on-finished": "~2.3.0", 300 | "qs": "6.7.0", 301 | "raw-body": "2.4.0", 302 | "type-is": "~1.6.17" 303 | } 304 | }, 305 | "boxen": { 306 | "version": "1.3.0", 307 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", 308 | "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", 309 | "requires": { 310 | "ansi-align": "^2.0.0", 311 | "camelcase": "^4.0.0", 312 | "chalk": "^2.0.1", 313 | "cli-boxes": "^1.0.0", 314 | "string-width": "^2.0.0", 315 | "term-size": "^1.2.0", 316 | "widest-line": "^2.0.0" 317 | } 318 | }, 319 | "brace-expansion": { 320 | "version": "1.1.11", 321 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 322 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 323 | "requires": { 324 | "balanced-match": "^1.0.0", 325 | "concat-map": "0.0.1" 326 | } 327 | }, 328 | "braces": { 329 | "version": "2.3.2", 330 | "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", 331 | "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", 332 | "requires": { 333 | "arr-flatten": "^1.1.0", 334 | "array-unique": "^0.3.2", 335 | "extend-shallow": "^2.0.1", 336 | "fill-range": "^4.0.0", 337 | "isobject": "^3.0.1", 338 | "repeat-element": "^1.1.2", 339 | "snapdragon": "^0.8.1", 340 | "snapdragon-node": "^2.0.1", 341 | "split-string": "^3.0.2", 342 | "to-regex": "^3.0.1" 343 | }, 344 | "dependencies": { 345 | "extend-shallow": { 346 | "version": "2.0.1", 347 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 348 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 349 | "requires": { 350 | "is-extendable": "^0.1.0" 351 | } 352 | } 353 | } 354 | }, 355 | "buffer": { 356 | "version": "5.4.2", 357 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.2.tgz", 358 | "integrity": "sha512-iy9koArjAFCzGnx3ZvNA6Z0clIbbFgbdWQ0mKD3hO0krOrZh8UgA6qMKcZvwLJxS+D6iVR76+5/pV56yMNYTag==", 359 | "requires": { 360 | "base64-js": "^1.0.2", 361 | "ieee754": "^1.1.4" 362 | } 363 | }, 364 | "buffer-equal-constant-time": { 365 | "version": "1.0.1", 366 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 367 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 368 | }, 369 | "bytes": { 370 | "version": "3.1.0", 371 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 372 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 373 | }, 374 | "cache-base": { 375 | "version": "1.0.1", 376 | "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", 377 | "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", 378 | "requires": { 379 | "collection-visit": "^1.0.0", 380 | "component-emitter": "^1.2.1", 381 | "get-value": "^2.0.6", 382 | "has-value": "^1.0.0", 383 | "isobject": "^3.0.1", 384 | "set-value": "^2.0.0", 385 | "to-object-path": "^0.3.0", 386 | "union-value": "^1.0.0", 387 | "unset-value": "^1.0.0" 388 | } 389 | }, 390 | "camelcase": { 391 | "version": "4.1.0", 392 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 393 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" 394 | }, 395 | "capture-stack-trace": { 396 | "version": "1.0.1", 397 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", 398 | "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" 399 | }, 400 | "chalk": { 401 | "version": "2.4.2", 402 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 403 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 404 | "requires": { 405 | "ansi-styles": "^3.2.1", 406 | "escape-string-regexp": "^1.0.5", 407 | "supports-color": "^5.3.0" 408 | } 409 | }, 410 | "chokidar": { 411 | "version": "2.1.6", 412 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", 413 | "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", 414 | "requires": { 415 | "anymatch": "^2.0.0", 416 | "async-each": "^1.0.1", 417 | "braces": "^2.3.2", 418 | "fsevents": "^1.2.7", 419 | "glob-parent": "^3.1.0", 420 | "inherits": "^2.0.3", 421 | "is-binary-path": "^1.0.0", 422 | "is-glob": "^4.0.0", 423 | "normalize-path": "^3.0.0", 424 | "path-is-absolute": "^1.0.0", 425 | "readdirp": "^2.2.1", 426 | "upath": "^1.1.1" 427 | } 428 | }, 429 | "ci-info": { 430 | "version": "1.6.0", 431 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", 432 | "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" 433 | }, 434 | "class-utils": { 435 | "version": "0.3.6", 436 | "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", 437 | "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", 438 | "requires": { 439 | "arr-union": "^3.1.0", 440 | "define-property": "^0.2.5", 441 | "isobject": "^3.0.0", 442 | "static-extend": "^0.1.1" 443 | }, 444 | "dependencies": { 445 | "define-property": { 446 | "version": "0.2.5", 447 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 448 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 449 | "requires": { 450 | "is-descriptor": "^0.1.0" 451 | } 452 | } 453 | } 454 | }, 455 | "cli-boxes": { 456 | "version": "1.0.0", 457 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", 458 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" 459 | }, 460 | "collection-visit": { 461 | "version": "1.0.0", 462 | "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", 463 | "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", 464 | "requires": { 465 | "map-visit": "^1.0.0", 466 | "object-visit": "^1.0.0" 467 | } 468 | }, 469 | "color-convert": { 470 | "version": "1.9.3", 471 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 472 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 473 | "requires": { 474 | "color-name": "1.1.3" 475 | } 476 | }, 477 | "color-name": { 478 | "version": "1.1.3", 479 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 480 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 481 | }, 482 | "component-emitter": { 483 | "version": "1.3.0", 484 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 485 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 486 | }, 487 | "concat-map": { 488 | "version": "0.0.1", 489 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 490 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 491 | }, 492 | "configstore": { 493 | "version": "3.1.2", 494 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", 495 | "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", 496 | "requires": { 497 | "dot-prop": "^4.1.0", 498 | "graceful-fs": "^4.1.2", 499 | "make-dir": "^1.0.0", 500 | "unique-string": "^1.0.0", 501 | "write-file-atomic": "^2.0.0", 502 | "xdg-basedir": "^3.0.0" 503 | } 504 | }, 505 | "connect": { 506 | "version": "3.7.0", 507 | "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", 508 | "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", 509 | "requires": { 510 | "debug": "2.6.9", 511 | "finalhandler": "1.1.2", 512 | "parseurl": "~1.3.3", 513 | "utils-merge": "1.0.1" 514 | } 515 | }, 516 | "consumable-stream": { 517 | "version": "1.0.0", 518 | "resolved": "https://registry.npmjs.org/consumable-stream/-/consumable-stream-1.0.0.tgz", 519 | "integrity": "sha512-CwX4ZzpSMWxTG9Q3tNM+UNlevMfWX1hjR033MlKkT8ChfH9R+Rl7YQu7FCeMMv4bRv9yO33p8aYoX0EwdijaUA==" 520 | }, 521 | "content-disposition": { 522 | "version": "0.5.3", 523 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 524 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 525 | "requires": { 526 | "safe-buffer": "5.1.2" 527 | } 528 | }, 529 | "content-type": { 530 | "version": "1.0.4", 531 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 532 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 533 | }, 534 | "cookie": { 535 | "version": "0.4.0", 536 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 537 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 538 | }, 539 | "cookie-signature": { 540 | "version": "1.0.6", 541 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 542 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 543 | }, 544 | "copy-descriptor": { 545 | "version": "0.1.1", 546 | "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", 547 | "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" 548 | }, 549 | "core-util-is": { 550 | "version": "1.0.2", 551 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 552 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 553 | }, 554 | "create-error-class": { 555 | "version": "3.0.2", 556 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", 557 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", 558 | "requires": { 559 | "capture-stack-trace": "^1.0.0" 560 | } 561 | }, 562 | "cross-spawn": { 563 | "version": "5.1.0", 564 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 565 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 566 | "requires": { 567 | "lru-cache": "^4.0.1", 568 | "shebang-command": "^1.2.0", 569 | "which": "^1.2.9" 570 | } 571 | }, 572 | "crypto-random-string": { 573 | "version": "1.0.0", 574 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 575 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" 576 | }, 577 | "debug": { 578 | "version": "2.6.9", 579 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 580 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 581 | "requires": { 582 | "ms": "2.0.0" 583 | }, 584 | "dependencies": { 585 | "ms": { 586 | "version": "2.0.0", 587 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 588 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 589 | } 590 | } 591 | }, 592 | "decode-uri-component": { 593 | "version": "0.2.0", 594 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 595 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" 596 | }, 597 | "deep-extend": { 598 | "version": "0.6.0", 599 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 600 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 601 | }, 602 | "define-property": { 603 | "version": "2.0.2", 604 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", 605 | "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", 606 | "requires": { 607 | "is-descriptor": "^1.0.2", 608 | "isobject": "^3.0.1" 609 | }, 610 | "dependencies": { 611 | "is-accessor-descriptor": { 612 | "version": "1.0.0", 613 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 614 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 615 | "requires": { 616 | "kind-of": "^6.0.0" 617 | } 618 | }, 619 | "is-data-descriptor": { 620 | "version": "1.0.0", 621 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 622 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 623 | "requires": { 624 | "kind-of": "^6.0.0" 625 | } 626 | }, 627 | "is-descriptor": { 628 | "version": "1.0.2", 629 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 630 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 631 | "requires": { 632 | "is-accessor-descriptor": "^1.0.0", 633 | "is-data-descriptor": "^1.0.0", 634 | "kind-of": "^6.0.2" 635 | } 636 | } 637 | } 638 | }, 639 | "depd": { 640 | "version": "1.1.2", 641 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 642 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 643 | }, 644 | "destroy": { 645 | "version": "1.0.4", 646 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 647 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 648 | }, 649 | "dot-prop": { 650 | "version": "4.2.0", 651 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", 652 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", 653 | "requires": { 654 | "is-obj": "^1.0.0" 655 | } 656 | }, 657 | "duplexer3": { 658 | "version": "0.1.4", 659 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 660 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" 661 | }, 662 | "ecdsa-sig-formatter": { 663 | "version": "1.0.11", 664 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 665 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 666 | "requires": { 667 | "safe-buffer": "^5.0.1" 668 | } 669 | }, 670 | "ee-first": { 671 | "version": "1.1.1", 672 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 673 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 674 | }, 675 | "eetase": { 676 | "version": "3.0.1", 677 | "resolved": "https://registry.npmjs.org/eetase/-/eetase-3.0.1.tgz", 678 | "integrity": "sha512-CJwzEFZzdfG/4kZInfKkQDD3tAEIbIAFNIGjSpm+tJkkipZpWRgkvVAlYk1oQALDlkJkssWRpWgJjt5SWpU6NQ==", 679 | "requires": { 680 | "async-stream-emitter": "^3.0.2" 681 | } 682 | }, 683 | "encodeurl": { 684 | "version": "1.0.2", 685 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 686 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 687 | }, 688 | "escape-html": { 689 | "version": "1.0.3", 690 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 691 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 692 | }, 693 | "escape-string-regexp": { 694 | "version": "1.0.5", 695 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 696 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 697 | }, 698 | "etag": { 699 | "version": "1.8.1", 700 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 701 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 702 | }, 703 | "execa": { 704 | "version": "0.7.0", 705 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", 706 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", 707 | "requires": { 708 | "cross-spawn": "^5.0.1", 709 | "get-stream": "^3.0.0", 710 | "is-stream": "^1.1.0", 711 | "npm-run-path": "^2.0.0", 712 | "p-finally": "^1.0.0", 713 | "signal-exit": "^3.0.0", 714 | "strip-eof": "^1.0.0" 715 | } 716 | }, 717 | "expand-brackets": { 718 | "version": "2.1.4", 719 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", 720 | "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", 721 | "requires": { 722 | "debug": "^2.3.3", 723 | "define-property": "^0.2.5", 724 | "extend-shallow": "^2.0.1", 725 | "posix-character-classes": "^0.1.0", 726 | "regex-not": "^1.0.0", 727 | "snapdragon": "^0.8.1", 728 | "to-regex": "^3.0.1" 729 | }, 730 | "dependencies": { 731 | "define-property": { 732 | "version": "0.2.5", 733 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 734 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 735 | "requires": { 736 | "is-descriptor": "^0.1.0" 737 | } 738 | }, 739 | "extend-shallow": { 740 | "version": "2.0.1", 741 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 742 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 743 | "requires": { 744 | "is-extendable": "^0.1.0" 745 | } 746 | } 747 | } 748 | }, 749 | "express": { 750 | "version": "4.17.1", 751 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 752 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 753 | "requires": { 754 | "accepts": "~1.3.7", 755 | "array-flatten": "1.1.1", 756 | "body-parser": "1.19.0", 757 | "content-disposition": "0.5.3", 758 | "content-type": "~1.0.4", 759 | "cookie": "0.4.0", 760 | "cookie-signature": "1.0.6", 761 | "debug": "2.6.9", 762 | "depd": "~1.1.2", 763 | "encodeurl": "~1.0.2", 764 | "escape-html": "~1.0.3", 765 | "etag": "~1.8.1", 766 | "finalhandler": "~1.1.2", 767 | "fresh": "0.5.2", 768 | "merge-descriptors": "1.0.1", 769 | "methods": "~1.1.2", 770 | "on-finished": "~2.3.0", 771 | "parseurl": "~1.3.3", 772 | "path-to-regexp": "0.1.7", 773 | "proxy-addr": "~2.0.5", 774 | "qs": "6.7.0", 775 | "range-parser": "~1.2.1", 776 | "safe-buffer": "5.1.2", 777 | "send": "0.17.1", 778 | "serve-static": "1.14.1", 779 | "setprototypeof": "1.1.1", 780 | "statuses": "~1.5.0", 781 | "type-is": "~1.6.18", 782 | "utils-merge": "1.0.1", 783 | "vary": "~1.1.2" 784 | } 785 | }, 786 | "extend-shallow": { 787 | "version": "3.0.2", 788 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", 789 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", 790 | "requires": { 791 | "assign-symbols": "^1.0.0", 792 | "is-extendable": "^1.0.1" 793 | }, 794 | "dependencies": { 795 | "is-extendable": { 796 | "version": "1.0.1", 797 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 798 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 799 | "requires": { 800 | "is-plain-object": "^2.0.4" 801 | } 802 | } 803 | } 804 | }, 805 | "extglob": { 806 | "version": "2.0.4", 807 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", 808 | "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", 809 | "requires": { 810 | "array-unique": "^0.3.2", 811 | "define-property": "^1.0.0", 812 | "expand-brackets": "^2.1.4", 813 | "extend-shallow": "^2.0.1", 814 | "fragment-cache": "^0.2.1", 815 | "regex-not": "^1.0.0", 816 | "snapdragon": "^0.8.1", 817 | "to-regex": "^3.0.1" 818 | }, 819 | "dependencies": { 820 | "define-property": { 821 | "version": "1.0.0", 822 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 823 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 824 | "requires": { 825 | "is-descriptor": "^1.0.0" 826 | } 827 | }, 828 | "extend-shallow": { 829 | "version": "2.0.1", 830 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 831 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 832 | "requires": { 833 | "is-extendable": "^0.1.0" 834 | } 835 | }, 836 | "is-accessor-descriptor": { 837 | "version": "1.0.0", 838 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 839 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 840 | "requires": { 841 | "kind-of": "^6.0.0" 842 | } 843 | }, 844 | "is-data-descriptor": { 845 | "version": "1.0.0", 846 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 847 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 848 | "requires": { 849 | "kind-of": "^6.0.0" 850 | } 851 | }, 852 | "is-descriptor": { 853 | "version": "1.0.2", 854 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 855 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 856 | "requires": { 857 | "is-accessor-descriptor": "^1.0.0", 858 | "is-data-descriptor": "^1.0.0", 859 | "kind-of": "^6.0.2" 860 | } 861 | } 862 | } 863 | }, 864 | "fill-range": { 865 | "version": "4.0.0", 866 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", 867 | "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", 868 | "requires": { 869 | "extend-shallow": "^2.0.1", 870 | "is-number": "^3.0.0", 871 | "repeat-string": "^1.6.1", 872 | "to-regex-range": "^2.1.0" 873 | }, 874 | "dependencies": { 875 | "extend-shallow": { 876 | "version": "2.0.1", 877 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 878 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 879 | "requires": { 880 | "is-extendable": "^0.1.0" 881 | } 882 | } 883 | } 884 | }, 885 | "finalhandler": { 886 | "version": "1.1.2", 887 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 888 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 889 | "requires": { 890 | "debug": "2.6.9", 891 | "encodeurl": "~1.0.2", 892 | "escape-html": "~1.0.3", 893 | "on-finished": "~2.3.0", 894 | "parseurl": "~1.3.3", 895 | "statuses": "~1.5.0", 896 | "unpipe": "~1.0.0" 897 | } 898 | }, 899 | "for-in": { 900 | "version": "1.0.2", 901 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 902 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" 903 | }, 904 | "forwarded": { 905 | "version": "0.1.2", 906 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 907 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 908 | }, 909 | "fragment-cache": { 910 | "version": "0.2.1", 911 | "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", 912 | "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", 913 | "requires": { 914 | "map-cache": "^0.2.2" 915 | } 916 | }, 917 | "fresh": { 918 | "version": "0.5.2", 919 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 920 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 921 | }, 922 | "fsevents": { 923 | "version": "1.2.9", 924 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", 925 | "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", 926 | "optional": true, 927 | "requires": { 928 | "nan": "^2.12.1", 929 | "node-pre-gyp": "^0.12.0" 930 | }, 931 | "dependencies": { 932 | "abbrev": { 933 | "version": "1.1.1", 934 | "bundled": true, 935 | "optional": true 936 | }, 937 | "ansi-regex": { 938 | "version": "2.1.1", 939 | "bundled": true, 940 | "optional": true 941 | }, 942 | "aproba": { 943 | "version": "1.2.0", 944 | "bundled": true, 945 | "optional": true 946 | }, 947 | "are-we-there-yet": { 948 | "version": "1.1.5", 949 | "bundled": true, 950 | "optional": true, 951 | "requires": { 952 | "delegates": "^1.0.0", 953 | "readable-stream": "^2.0.6" 954 | } 955 | }, 956 | "balanced-match": { 957 | "version": "1.0.0", 958 | "bundled": true, 959 | "optional": true 960 | }, 961 | "brace-expansion": { 962 | "version": "1.1.11", 963 | "bundled": true, 964 | "optional": true, 965 | "requires": { 966 | "balanced-match": "^1.0.0", 967 | "concat-map": "0.0.1" 968 | } 969 | }, 970 | "chownr": { 971 | "version": "1.1.1", 972 | "bundled": true, 973 | "optional": true 974 | }, 975 | "code-point-at": { 976 | "version": "1.1.0", 977 | "bundled": true, 978 | "optional": true 979 | }, 980 | "concat-map": { 981 | "version": "0.0.1", 982 | "bundled": true, 983 | "optional": true 984 | }, 985 | "console-control-strings": { 986 | "version": "1.1.0", 987 | "bundled": true, 988 | "optional": true 989 | }, 990 | "core-util-is": { 991 | "version": "1.0.2", 992 | "bundled": true, 993 | "optional": true 994 | }, 995 | "debug": { 996 | "version": "4.1.1", 997 | "bundled": true, 998 | "optional": true, 999 | "requires": { 1000 | "ms": "^2.1.1" 1001 | } 1002 | }, 1003 | "deep-extend": { 1004 | "version": "0.6.0", 1005 | "bundled": true, 1006 | "optional": true 1007 | }, 1008 | "delegates": { 1009 | "version": "1.0.0", 1010 | "bundled": true, 1011 | "optional": true 1012 | }, 1013 | "detect-libc": { 1014 | "version": "1.0.3", 1015 | "bundled": true, 1016 | "optional": true 1017 | }, 1018 | "fs-minipass": { 1019 | "version": "1.2.5", 1020 | "bundled": true, 1021 | "optional": true, 1022 | "requires": { 1023 | "minipass": "^2.2.1" 1024 | } 1025 | }, 1026 | "fs.realpath": { 1027 | "version": "1.0.0", 1028 | "bundled": true, 1029 | "optional": true 1030 | }, 1031 | "gauge": { 1032 | "version": "2.7.4", 1033 | "bundled": true, 1034 | "optional": true, 1035 | "requires": { 1036 | "aproba": "^1.0.3", 1037 | "console-control-strings": "^1.0.0", 1038 | "has-unicode": "^2.0.0", 1039 | "object-assign": "^4.1.0", 1040 | "signal-exit": "^3.0.0", 1041 | "string-width": "^1.0.1", 1042 | "strip-ansi": "^3.0.1", 1043 | "wide-align": "^1.1.0" 1044 | } 1045 | }, 1046 | "glob": { 1047 | "version": "7.1.3", 1048 | "bundled": true, 1049 | "optional": true, 1050 | "requires": { 1051 | "fs.realpath": "^1.0.0", 1052 | "inflight": "^1.0.4", 1053 | "inherits": "2", 1054 | "minimatch": "^3.0.4", 1055 | "once": "^1.3.0", 1056 | "path-is-absolute": "^1.0.0" 1057 | } 1058 | }, 1059 | "has-unicode": { 1060 | "version": "2.0.1", 1061 | "bundled": true, 1062 | "optional": true 1063 | }, 1064 | "iconv-lite": { 1065 | "version": "0.4.24", 1066 | "bundled": true, 1067 | "optional": true, 1068 | "requires": { 1069 | "safer-buffer": ">= 2.1.2 < 3" 1070 | } 1071 | }, 1072 | "ignore-walk": { 1073 | "version": "3.0.1", 1074 | "bundled": true, 1075 | "optional": true, 1076 | "requires": { 1077 | "minimatch": "^3.0.4" 1078 | } 1079 | }, 1080 | "inflight": { 1081 | "version": "1.0.6", 1082 | "bundled": true, 1083 | "optional": true, 1084 | "requires": { 1085 | "once": "^1.3.0", 1086 | "wrappy": "1" 1087 | } 1088 | }, 1089 | "inherits": { 1090 | "version": "2.0.3", 1091 | "bundled": true, 1092 | "optional": true 1093 | }, 1094 | "ini": { 1095 | "version": "1.3.5", 1096 | "bundled": true, 1097 | "optional": true 1098 | }, 1099 | "is-fullwidth-code-point": { 1100 | "version": "1.0.0", 1101 | "bundled": true, 1102 | "optional": true, 1103 | "requires": { 1104 | "number-is-nan": "^1.0.0" 1105 | } 1106 | }, 1107 | "isarray": { 1108 | "version": "1.0.0", 1109 | "bundled": true, 1110 | "optional": true 1111 | }, 1112 | "minimatch": { 1113 | "version": "3.0.4", 1114 | "bundled": true, 1115 | "optional": true, 1116 | "requires": { 1117 | "brace-expansion": "^1.1.7" 1118 | } 1119 | }, 1120 | "minimist": { 1121 | "version": "0.0.8", 1122 | "bundled": true, 1123 | "optional": true 1124 | }, 1125 | "minipass": { 1126 | "version": "2.3.5", 1127 | "bundled": true, 1128 | "optional": true, 1129 | "requires": { 1130 | "safe-buffer": "^5.1.2", 1131 | "yallist": "^3.0.0" 1132 | } 1133 | }, 1134 | "minizlib": { 1135 | "version": "1.2.1", 1136 | "bundled": true, 1137 | "optional": true, 1138 | "requires": { 1139 | "minipass": "^2.2.1" 1140 | } 1141 | }, 1142 | "mkdirp": { 1143 | "version": "0.5.1", 1144 | "bundled": true, 1145 | "optional": true, 1146 | "requires": { 1147 | "minimist": "0.0.8" 1148 | } 1149 | }, 1150 | "ms": { 1151 | "version": "2.1.1", 1152 | "bundled": true, 1153 | "optional": true 1154 | }, 1155 | "needle": { 1156 | "version": "2.3.0", 1157 | "bundled": true, 1158 | "optional": true, 1159 | "requires": { 1160 | "debug": "^4.1.0", 1161 | "iconv-lite": "^0.4.4", 1162 | "sax": "^1.2.4" 1163 | } 1164 | }, 1165 | "node-pre-gyp": { 1166 | "version": "0.12.0", 1167 | "bundled": true, 1168 | "optional": true, 1169 | "requires": { 1170 | "detect-libc": "^1.0.2", 1171 | "mkdirp": "^0.5.1", 1172 | "needle": "^2.2.1", 1173 | "nopt": "^4.0.1", 1174 | "npm-packlist": "^1.1.6", 1175 | "npmlog": "^4.0.2", 1176 | "rc": "^1.2.7", 1177 | "rimraf": "^2.6.1", 1178 | "semver": "^5.3.0", 1179 | "tar": "^4" 1180 | } 1181 | }, 1182 | "nopt": { 1183 | "version": "4.0.1", 1184 | "bundled": true, 1185 | "optional": true, 1186 | "requires": { 1187 | "abbrev": "1", 1188 | "osenv": "^0.1.4" 1189 | } 1190 | }, 1191 | "npm-bundled": { 1192 | "version": "1.0.6", 1193 | "bundled": true, 1194 | "optional": true 1195 | }, 1196 | "npm-packlist": { 1197 | "version": "1.4.1", 1198 | "bundled": true, 1199 | "optional": true, 1200 | "requires": { 1201 | "ignore-walk": "^3.0.1", 1202 | "npm-bundled": "^1.0.1" 1203 | } 1204 | }, 1205 | "npmlog": { 1206 | "version": "4.1.2", 1207 | "bundled": true, 1208 | "optional": true, 1209 | "requires": { 1210 | "are-we-there-yet": "~1.1.2", 1211 | "console-control-strings": "~1.1.0", 1212 | "gauge": "~2.7.3", 1213 | "set-blocking": "~2.0.0" 1214 | } 1215 | }, 1216 | "number-is-nan": { 1217 | "version": "1.0.1", 1218 | "bundled": true, 1219 | "optional": true 1220 | }, 1221 | "object-assign": { 1222 | "version": "4.1.1", 1223 | "bundled": true, 1224 | "optional": true 1225 | }, 1226 | "once": { 1227 | "version": "1.4.0", 1228 | "bundled": true, 1229 | "optional": true, 1230 | "requires": { 1231 | "wrappy": "1" 1232 | } 1233 | }, 1234 | "os-homedir": { 1235 | "version": "1.0.2", 1236 | "bundled": true, 1237 | "optional": true 1238 | }, 1239 | "os-tmpdir": { 1240 | "version": "1.0.2", 1241 | "bundled": true, 1242 | "optional": true 1243 | }, 1244 | "osenv": { 1245 | "version": "0.1.5", 1246 | "bundled": true, 1247 | "optional": true, 1248 | "requires": { 1249 | "os-homedir": "^1.0.0", 1250 | "os-tmpdir": "^1.0.0" 1251 | } 1252 | }, 1253 | "path-is-absolute": { 1254 | "version": "1.0.1", 1255 | "bundled": true, 1256 | "optional": true 1257 | }, 1258 | "process-nextick-args": { 1259 | "version": "2.0.0", 1260 | "bundled": true, 1261 | "optional": true 1262 | }, 1263 | "rc": { 1264 | "version": "1.2.8", 1265 | "bundled": true, 1266 | "optional": true, 1267 | "requires": { 1268 | "deep-extend": "^0.6.0", 1269 | "ini": "~1.3.0", 1270 | "minimist": "^1.2.0", 1271 | "strip-json-comments": "~2.0.1" 1272 | }, 1273 | "dependencies": { 1274 | "minimist": { 1275 | "version": "1.2.0", 1276 | "bundled": true, 1277 | "optional": true 1278 | } 1279 | } 1280 | }, 1281 | "readable-stream": { 1282 | "version": "2.3.6", 1283 | "bundled": true, 1284 | "optional": true, 1285 | "requires": { 1286 | "core-util-is": "~1.0.0", 1287 | "inherits": "~2.0.3", 1288 | "isarray": "~1.0.0", 1289 | "process-nextick-args": "~2.0.0", 1290 | "safe-buffer": "~5.1.1", 1291 | "string_decoder": "~1.1.1", 1292 | "util-deprecate": "~1.0.1" 1293 | } 1294 | }, 1295 | "rimraf": { 1296 | "version": "2.6.3", 1297 | "bundled": true, 1298 | "optional": true, 1299 | "requires": { 1300 | "glob": "^7.1.3" 1301 | } 1302 | }, 1303 | "safe-buffer": { 1304 | "version": "5.1.2", 1305 | "bundled": true, 1306 | "optional": true 1307 | }, 1308 | "safer-buffer": { 1309 | "version": "2.1.2", 1310 | "bundled": true, 1311 | "optional": true 1312 | }, 1313 | "sax": { 1314 | "version": "1.2.4", 1315 | "bundled": true, 1316 | "optional": true 1317 | }, 1318 | "semver": { 1319 | "version": "5.7.0", 1320 | "bundled": true, 1321 | "optional": true 1322 | }, 1323 | "set-blocking": { 1324 | "version": "2.0.0", 1325 | "bundled": true, 1326 | "optional": true 1327 | }, 1328 | "signal-exit": { 1329 | "version": "3.0.2", 1330 | "bundled": true, 1331 | "optional": true 1332 | }, 1333 | "string-width": { 1334 | "version": "1.0.2", 1335 | "bundled": true, 1336 | "optional": true, 1337 | "requires": { 1338 | "code-point-at": "^1.0.0", 1339 | "is-fullwidth-code-point": "^1.0.0", 1340 | "strip-ansi": "^3.0.0" 1341 | } 1342 | }, 1343 | "string_decoder": { 1344 | "version": "1.1.1", 1345 | "bundled": true, 1346 | "optional": true, 1347 | "requires": { 1348 | "safe-buffer": "~5.1.0" 1349 | } 1350 | }, 1351 | "strip-ansi": { 1352 | "version": "3.0.1", 1353 | "bundled": true, 1354 | "optional": true, 1355 | "requires": { 1356 | "ansi-regex": "^2.0.0" 1357 | } 1358 | }, 1359 | "strip-json-comments": { 1360 | "version": "2.0.1", 1361 | "bundled": true, 1362 | "optional": true 1363 | }, 1364 | "tar": { 1365 | "version": "4.4.8", 1366 | "bundled": true, 1367 | "optional": true, 1368 | "requires": { 1369 | "chownr": "^1.1.1", 1370 | "fs-minipass": "^1.2.5", 1371 | "minipass": "^2.3.4", 1372 | "minizlib": "^1.1.1", 1373 | "mkdirp": "^0.5.0", 1374 | "safe-buffer": "^5.1.2", 1375 | "yallist": "^3.0.2" 1376 | } 1377 | }, 1378 | "util-deprecate": { 1379 | "version": "1.0.2", 1380 | "bundled": true, 1381 | "optional": true 1382 | }, 1383 | "wide-align": { 1384 | "version": "1.1.3", 1385 | "bundled": true, 1386 | "optional": true, 1387 | "requires": { 1388 | "string-width": "^1.0.2 || 2" 1389 | } 1390 | }, 1391 | "wrappy": { 1392 | "version": "1.0.2", 1393 | "bundled": true, 1394 | "optional": true 1395 | }, 1396 | "yallist": { 1397 | "version": "3.0.3", 1398 | "bundled": true, 1399 | "optional": true 1400 | } 1401 | } 1402 | }, 1403 | "get-stream": { 1404 | "version": "3.0.0", 1405 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 1406 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" 1407 | }, 1408 | "get-value": { 1409 | "version": "2.0.6", 1410 | "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", 1411 | "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" 1412 | }, 1413 | "glob-parent": { 1414 | "version": "3.1.0", 1415 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 1416 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 1417 | "requires": { 1418 | "is-glob": "^3.1.0", 1419 | "path-dirname": "^1.0.0" 1420 | }, 1421 | "dependencies": { 1422 | "is-glob": { 1423 | "version": "3.1.0", 1424 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 1425 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 1426 | "requires": { 1427 | "is-extglob": "^2.1.0" 1428 | } 1429 | } 1430 | } 1431 | }, 1432 | "global-dirs": { 1433 | "version": "0.1.1", 1434 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", 1435 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", 1436 | "requires": { 1437 | "ini": "^1.3.4" 1438 | } 1439 | }, 1440 | "got": { 1441 | "version": "6.7.1", 1442 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", 1443 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", 1444 | "requires": { 1445 | "create-error-class": "^3.0.0", 1446 | "duplexer3": "^0.1.4", 1447 | "get-stream": "^3.0.0", 1448 | "is-redirect": "^1.0.0", 1449 | "is-retry-allowed": "^1.0.0", 1450 | "is-stream": "^1.0.0", 1451 | "lowercase-keys": "^1.0.0", 1452 | "safe-buffer": "^5.0.1", 1453 | "timed-out": "^4.0.0", 1454 | "unzip-response": "^2.0.1", 1455 | "url-parse-lax": "^1.0.0" 1456 | } 1457 | }, 1458 | "graceful-fs": { 1459 | "version": "4.1.15", 1460 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 1461 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 1462 | }, 1463 | "has-flag": { 1464 | "version": "3.0.0", 1465 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1466 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 1467 | }, 1468 | "has-value": { 1469 | "version": "1.0.0", 1470 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", 1471 | "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", 1472 | "requires": { 1473 | "get-value": "^2.0.6", 1474 | "has-values": "^1.0.0", 1475 | "isobject": "^3.0.0" 1476 | } 1477 | }, 1478 | "has-values": { 1479 | "version": "1.0.0", 1480 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", 1481 | "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", 1482 | "requires": { 1483 | "is-number": "^3.0.0", 1484 | "kind-of": "^4.0.0" 1485 | }, 1486 | "dependencies": { 1487 | "kind-of": { 1488 | "version": "4.0.0", 1489 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 1490 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 1491 | "requires": { 1492 | "is-buffer": "^1.1.5" 1493 | } 1494 | } 1495 | } 1496 | }, 1497 | "http-errors": { 1498 | "version": "1.7.2", 1499 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 1500 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 1501 | "requires": { 1502 | "depd": "~1.1.2", 1503 | "inherits": "2.0.3", 1504 | "setprototypeof": "1.1.1", 1505 | "statuses": ">= 1.5.0 < 2", 1506 | "toidentifier": "1.0.0" 1507 | } 1508 | }, 1509 | "iconv-lite": { 1510 | "version": "0.4.24", 1511 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1512 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1513 | "requires": { 1514 | "safer-buffer": ">= 2.1.2 < 3" 1515 | } 1516 | }, 1517 | "ieee754": { 1518 | "version": "1.1.13", 1519 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 1520 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 1521 | }, 1522 | "ignore-by-default": { 1523 | "version": "1.0.1", 1524 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 1525 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" 1526 | }, 1527 | "import-lazy": { 1528 | "version": "2.1.0", 1529 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 1530 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" 1531 | }, 1532 | "imurmurhash": { 1533 | "version": "0.1.4", 1534 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1535 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 1536 | }, 1537 | "inherits": { 1538 | "version": "2.0.3", 1539 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1540 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1541 | }, 1542 | "ini": { 1543 | "version": "1.3.5", 1544 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1545 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 1546 | }, 1547 | "ipaddr.js": { 1548 | "version": "1.9.0", 1549 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", 1550 | "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" 1551 | }, 1552 | "is-accessor-descriptor": { 1553 | "version": "0.1.6", 1554 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 1555 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 1556 | "requires": { 1557 | "kind-of": "^3.0.2" 1558 | }, 1559 | "dependencies": { 1560 | "kind-of": { 1561 | "version": "3.2.2", 1562 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1563 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1564 | "requires": { 1565 | "is-buffer": "^1.1.5" 1566 | } 1567 | } 1568 | } 1569 | }, 1570 | "is-binary-path": { 1571 | "version": "1.0.1", 1572 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 1573 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 1574 | "requires": { 1575 | "binary-extensions": "^1.0.0" 1576 | } 1577 | }, 1578 | "is-buffer": { 1579 | "version": "1.1.6", 1580 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1581 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 1582 | }, 1583 | "is-ci": { 1584 | "version": "1.2.1", 1585 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", 1586 | "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", 1587 | "requires": { 1588 | "ci-info": "^1.5.0" 1589 | } 1590 | }, 1591 | "is-data-descriptor": { 1592 | "version": "0.1.4", 1593 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 1594 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 1595 | "requires": { 1596 | "kind-of": "^3.0.2" 1597 | }, 1598 | "dependencies": { 1599 | "kind-of": { 1600 | "version": "3.2.2", 1601 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1602 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1603 | "requires": { 1604 | "is-buffer": "^1.1.5" 1605 | } 1606 | } 1607 | } 1608 | }, 1609 | "is-descriptor": { 1610 | "version": "0.1.6", 1611 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", 1612 | "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", 1613 | "requires": { 1614 | "is-accessor-descriptor": "^0.1.6", 1615 | "is-data-descriptor": "^0.1.4", 1616 | "kind-of": "^5.0.0" 1617 | }, 1618 | "dependencies": { 1619 | "kind-of": { 1620 | "version": "5.1.0", 1621 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 1622 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" 1623 | } 1624 | } 1625 | }, 1626 | "is-extendable": { 1627 | "version": "0.1.1", 1628 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1629 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 1630 | }, 1631 | "is-extglob": { 1632 | "version": "2.1.1", 1633 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1634 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 1635 | }, 1636 | "is-fullwidth-code-point": { 1637 | "version": "2.0.0", 1638 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1639 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 1640 | }, 1641 | "is-glob": { 1642 | "version": "4.0.1", 1643 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1644 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1645 | "requires": { 1646 | "is-extglob": "^2.1.1" 1647 | } 1648 | }, 1649 | "is-installed-globally": { 1650 | "version": "0.1.0", 1651 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", 1652 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", 1653 | "requires": { 1654 | "global-dirs": "^0.1.0", 1655 | "is-path-inside": "^1.0.0" 1656 | } 1657 | }, 1658 | "is-npm": { 1659 | "version": "1.0.0", 1660 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", 1661 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" 1662 | }, 1663 | "is-number": { 1664 | "version": "3.0.0", 1665 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 1666 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 1667 | "requires": { 1668 | "kind-of": "^3.0.2" 1669 | }, 1670 | "dependencies": { 1671 | "kind-of": { 1672 | "version": "3.2.2", 1673 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1674 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1675 | "requires": { 1676 | "is-buffer": "^1.1.5" 1677 | } 1678 | } 1679 | } 1680 | }, 1681 | "is-obj": { 1682 | "version": "1.0.1", 1683 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 1684 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" 1685 | }, 1686 | "is-path-inside": { 1687 | "version": "1.0.1", 1688 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 1689 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 1690 | "requires": { 1691 | "path-is-inside": "^1.0.1" 1692 | } 1693 | }, 1694 | "is-plain-object": { 1695 | "version": "2.0.4", 1696 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1697 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1698 | "requires": { 1699 | "isobject": "^3.0.1" 1700 | } 1701 | }, 1702 | "is-redirect": { 1703 | "version": "1.0.0", 1704 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", 1705 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" 1706 | }, 1707 | "is-retry-allowed": { 1708 | "version": "1.1.0", 1709 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", 1710 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" 1711 | }, 1712 | "is-stream": { 1713 | "version": "1.1.0", 1714 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1715 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 1716 | }, 1717 | "is-windows": { 1718 | "version": "1.0.2", 1719 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1720 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" 1721 | }, 1722 | "isarray": { 1723 | "version": "1.0.0", 1724 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1725 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1726 | }, 1727 | "isexe": { 1728 | "version": "2.0.0", 1729 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1730 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 1731 | }, 1732 | "isobject": { 1733 | "version": "3.0.1", 1734 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1735 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 1736 | }, 1737 | "jsonwebtoken": { 1738 | "version": "8.5.1", 1739 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 1740 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 1741 | "requires": { 1742 | "jws": "^3.2.2", 1743 | "lodash.includes": "^4.3.0", 1744 | "lodash.isboolean": "^3.0.3", 1745 | "lodash.isinteger": "^4.0.4", 1746 | "lodash.isnumber": "^3.0.3", 1747 | "lodash.isplainobject": "^4.0.6", 1748 | "lodash.isstring": "^4.0.1", 1749 | "lodash.once": "^4.0.0", 1750 | "ms": "^2.1.1", 1751 | "semver": "^5.6.0" 1752 | } 1753 | }, 1754 | "jwa": { 1755 | "version": "1.4.1", 1756 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 1757 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 1758 | "requires": { 1759 | "buffer-equal-constant-time": "1.0.1", 1760 | "ecdsa-sig-formatter": "1.0.11", 1761 | "safe-buffer": "^5.0.1" 1762 | } 1763 | }, 1764 | "jws": { 1765 | "version": "3.2.2", 1766 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 1767 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 1768 | "requires": { 1769 | "jwa": "^1.4.1", 1770 | "safe-buffer": "^5.0.1" 1771 | } 1772 | }, 1773 | "kind-of": { 1774 | "version": "6.0.2", 1775 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 1776 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 1777 | }, 1778 | "latest-version": { 1779 | "version": "3.1.0", 1780 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", 1781 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", 1782 | "requires": { 1783 | "package-json": "^4.0.0" 1784 | } 1785 | }, 1786 | "linked-list": { 1787 | "version": "0.1.0", 1788 | "resolved": "https://registry.npmjs.org/linked-list/-/linked-list-0.1.0.tgz", 1789 | "integrity": "sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78=" 1790 | }, 1791 | "lodash.clonedeep": { 1792 | "version": "4.5.0", 1793 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 1794 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" 1795 | }, 1796 | "lodash.includes": { 1797 | "version": "4.3.0", 1798 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 1799 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 1800 | }, 1801 | "lodash.isboolean": { 1802 | "version": "3.0.3", 1803 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1804 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 1805 | }, 1806 | "lodash.isinteger": { 1807 | "version": "4.0.4", 1808 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 1809 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 1810 | }, 1811 | "lodash.isnumber": { 1812 | "version": "3.0.3", 1813 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 1814 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 1815 | }, 1816 | "lodash.isplainobject": { 1817 | "version": "4.0.6", 1818 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1819 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1820 | }, 1821 | "lodash.isstring": { 1822 | "version": "4.0.1", 1823 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1824 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 1825 | }, 1826 | "lodash.once": { 1827 | "version": "4.1.1", 1828 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 1829 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 1830 | }, 1831 | "lowercase-keys": { 1832 | "version": "1.0.1", 1833 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 1834 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" 1835 | }, 1836 | "lru-cache": { 1837 | "version": "4.1.5", 1838 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 1839 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 1840 | "requires": { 1841 | "pseudomap": "^1.0.2", 1842 | "yallist": "^2.1.2" 1843 | } 1844 | }, 1845 | "make-dir": { 1846 | "version": "1.3.0", 1847 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 1848 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 1849 | "requires": { 1850 | "pify": "^3.0.0" 1851 | } 1852 | }, 1853 | "map-cache": { 1854 | "version": "0.2.2", 1855 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 1856 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" 1857 | }, 1858 | "map-visit": { 1859 | "version": "1.0.0", 1860 | "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", 1861 | "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", 1862 | "requires": { 1863 | "object-visit": "^1.0.0" 1864 | } 1865 | }, 1866 | "media-typer": { 1867 | "version": "0.3.0", 1868 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1869 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1870 | }, 1871 | "merge-descriptors": { 1872 | "version": "1.0.1", 1873 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1874 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1875 | }, 1876 | "methods": { 1877 | "version": "1.1.2", 1878 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1879 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1880 | }, 1881 | "micromatch": { 1882 | "version": "3.1.10", 1883 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", 1884 | "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", 1885 | "requires": { 1886 | "arr-diff": "^4.0.0", 1887 | "array-unique": "^0.3.2", 1888 | "braces": "^2.3.1", 1889 | "define-property": "^2.0.2", 1890 | "extend-shallow": "^3.0.2", 1891 | "extglob": "^2.0.4", 1892 | "fragment-cache": "^0.2.1", 1893 | "kind-of": "^6.0.2", 1894 | "nanomatch": "^1.2.9", 1895 | "object.pick": "^1.3.0", 1896 | "regex-not": "^1.0.0", 1897 | "snapdragon": "^0.8.1", 1898 | "to-regex": "^3.0.2" 1899 | } 1900 | }, 1901 | "mime": { 1902 | "version": "1.6.0", 1903 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1904 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1905 | }, 1906 | "mime-db": { 1907 | "version": "1.40.0", 1908 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 1909 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" 1910 | }, 1911 | "mime-types": { 1912 | "version": "2.1.24", 1913 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 1914 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 1915 | "requires": { 1916 | "mime-db": "1.40.0" 1917 | } 1918 | }, 1919 | "minimatch": { 1920 | "version": "3.0.4", 1921 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1922 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1923 | "requires": { 1924 | "brace-expansion": "^1.1.7" 1925 | } 1926 | }, 1927 | "minimist": { 1928 | "version": "1.2.0", 1929 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1930 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 1931 | }, 1932 | "mixin-deep": { 1933 | "version": "1.3.2", 1934 | "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", 1935 | "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", 1936 | "requires": { 1937 | "for-in": "^1.0.2", 1938 | "is-extendable": "^1.0.1" 1939 | }, 1940 | "dependencies": { 1941 | "is-extendable": { 1942 | "version": "1.0.1", 1943 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 1944 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 1945 | "requires": { 1946 | "is-plain-object": "^2.0.4" 1947 | } 1948 | } 1949 | } 1950 | }, 1951 | "morgan": { 1952 | "version": "1.9.1", 1953 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", 1954 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", 1955 | "requires": { 1956 | "basic-auth": "~2.0.0", 1957 | "debug": "2.6.9", 1958 | "depd": "~1.1.2", 1959 | "on-finished": "~2.3.0", 1960 | "on-headers": "~1.0.1" 1961 | } 1962 | }, 1963 | "ms": { 1964 | "version": "2.1.1", 1965 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1966 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1967 | }, 1968 | "nan": { 1969 | "version": "2.14.0", 1970 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 1971 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", 1972 | "optional": true 1973 | }, 1974 | "nanomatch": { 1975 | "version": "1.2.13", 1976 | "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", 1977 | "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", 1978 | "requires": { 1979 | "arr-diff": "^4.0.0", 1980 | "array-unique": "^0.3.2", 1981 | "define-property": "^2.0.2", 1982 | "extend-shallow": "^3.0.2", 1983 | "fragment-cache": "^0.2.1", 1984 | "is-windows": "^1.0.2", 1985 | "kind-of": "^6.0.2", 1986 | "object.pick": "^1.3.0", 1987 | "regex-not": "^1.0.0", 1988 | "snapdragon": "^0.8.1", 1989 | "to-regex": "^3.0.1" 1990 | } 1991 | }, 1992 | "negotiator": { 1993 | "version": "0.6.2", 1994 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1995 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1996 | }, 1997 | "nodemon": { 1998 | "version": "1.19.1", 1999 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.1.tgz", 2000 | "integrity": "sha512-/DXLzd/GhiaDXXbGId5BzxP1GlsqtMGM9zTmkWrgXtSqjKmGSbLicM/oAy4FR0YWm14jCHRwnR31AHS2dYFHrg==", 2001 | "requires": { 2002 | "chokidar": "^2.1.5", 2003 | "debug": "^3.1.0", 2004 | "ignore-by-default": "^1.0.1", 2005 | "minimatch": "^3.0.4", 2006 | "pstree.remy": "^1.1.6", 2007 | "semver": "^5.5.0", 2008 | "supports-color": "^5.2.0", 2009 | "touch": "^3.1.0", 2010 | "undefsafe": "^2.0.2", 2011 | "update-notifier": "^2.5.0" 2012 | }, 2013 | "dependencies": { 2014 | "debug": { 2015 | "version": "3.2.6", 2016 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 2017 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 2018 | "requires": { 2019 | "ms": "^2.1.1" 2020 | } 2021 | } 2022 | } 2023 | }, 2024 | "nopt": { 2025 | "version": "1.0.10", 2026 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 2027 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 2028 | "requires": { 2029 | "abbrev": "1" 2030 | } 2031 | }, 2032 | "normalize-path": { 2033 | "version": "3.0.0", 2034 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2035 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 2036 | }, 2037 | "npm-run-path": { 2038 | "version": "2.0.2", 2039 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 2040 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 2041 | "requires": { 2042 | "path-key": "^2.0.0" 2043 | } 2044 | }, 2045 | "object-copy": { 2046 | "version": "0.1.0", 2047 | "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", 2048 | "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", 2049 | "requires": { 2050 | "copy-descriptor": "^0.1.0", 2051 | "define-property": "^0.2.5", 2052 | "kind-of": "^3.0.3" 2053 | }, 2054 | "dependencies": { 2055 | "define-property": { 2056 | "version": "0.2.5", 2057 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2058 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2059 | "requires": { 2060 | "is-descriptor": "^0.1.0" 2061 | } 2062 | }, 2063 | "kind-of": { 2064 | "version": "3.2.2", 2065 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2066 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2067 | "requires": { 2068 | "is-buffer": "^1.1.5" 2069 | } 2070 | } 2071 | } 2072 | }, 2073 | "object-visit": { 2074 | "version": "1.0.1", 2075 | "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", 2076 | "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", 2077 | "requires": { 2078 | "isobject": "^3.0.0" 2079 | } 2080 | }, 2081 | "object.pick": { 2082 | "version": "1.3.0", 2083 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 2084 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 2085 | "requires": { 2086 | "isobject": "^3.0.1" 2087 | } 2088 | }, 2089 | "on-finished": { 2090 | "version": "2.3.0", 2091 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2092 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2093 | "requires": { 2094 | "ee-first": "1.1.1" 2095 | } 2096 | }, 2097 | "on-headers": { 2098 | "version": "1.0.2", 2099 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 2100 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" 2101 | }, 2102 | "p-finally": { 2103 | "version": "1.0.0", 2104 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 2105 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 2106 | }, 2107 | "package-json": { 2108 | "version": "4.0.1", 2109 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", 2110 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", 2111 | "requires": { 2112 | "got": "^6.7.1", 2113 | "registry-auth-token": "^3.0.1", 2114 | "registry-url": "^3.0.3", 2115 | "semver": "^5.1.0" 2116 | } 2117 | }, 2118 | "parseurl": { 2119 | "version": "1.3.3", 2120 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2121 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 2122 | }, 2123 | "pascalcase": { 2124 | "version": "0.1.1", 2125 | "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", 2126 | "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" 2127 | }, 2128 | "path-dirname": { 2129 | "version": "1.0.2", 2130 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 2131 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" 2132 | }, 2133 | "path-is-absolute": { 2134 | "version": "1.0.1", 2135 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2136 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2137 | }, 2138 | "path-is-inside": { 2139 | "version": "1.0.2", 2140 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 2141 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" 2142 | }, 2143 | "path-key": { 2144 | "version": "2.0.1", 2145 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 2146 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 2147 | }, 2148 | "path-to-regexp": { 2149 | "version": "0.1.7", 2150 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2151 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2152 | }, 2153 | "pify": { 2154 | "version": "3.0.0", 2155 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 2156 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 2157 | }, 2158 | "posix-character-classes": { 2159 | "version": "0.1.1", 2160 | "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", 2161 | "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" 2162 | }, 2163 | "prepend-http": { 2164 | "version": "1.0.4", 2165 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", 2166 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" 2167 | }, 2168 | "process-nextick-args": { 2169 | "version": "2.0.0", 2170 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 2171 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 2172 | }, 2173 | "proxy-addr": { 2174 | "version": "2.0.5", 2175 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", 2176 | "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", 2177 | "requires": { 2178 | "forwarded": "~0.1.2", 2179 | "ipaddr.js": "1.9.0" 2180 | } 2181 | }, 2182 | "pseudomap": { 2183 | "version": "1.0.2", 2184 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 2185 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 2186 | }, 2187 | "pstree.remy": { 2188 | "version": "1.1.7", 2189 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", 2190 | "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==" 2191 | }, 2192 | "qs": { 2193 | "version": "6.7.0", 2194 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 2195 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 2196 | }, 2197 | "querystring": { 2198 | "version": "0.2.0", 2199 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 2200 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" 2201 | }, 2202 | "range-parser": { 2203 | "version": "1.2.1", 2204 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2205 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 2206 | }, 2207 | "raw-body": { 2208 | "version": "2.4.0", 2209 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 2210 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 2211 | "requires": { 2212 | "bytes": "3.1.0", 2213 | "http-errors": "1.7.2", 2214 | "iconv-lite": "0.4.24", 2215 | "unpipe": "1.0.0" 2216 | } 2217 | }, 2218 | "rc": { 2219 | "version": "1.2.8", 2220 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 2221 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 2222 | "requires": { 2223 | "deep-extend": "^0.6.0", 2224 | "ini": "~1.3.0", 2225 | "minimist": "^1.2.0", 2226 | "strip-json-comments": "~2.0.1" 2227 | } 2228 | }, 2229 | "readable-stream": { 2230 | "version": "2.3.6", 2231 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2232 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2233 | "requires": { 2234 | "core-util-is": "~1.0.0", 2235 | "inherits": "~2.0.3", 2236 | "isarray": "~1.0.0", 2237 | "process-nextick-args": "~2.0.0", 2238 | "safe-buffer": "~5.1.1", 2239 | "string_decoder": "~1.1.1", 2240 | "util-deprecate": "~1.0.1" 2241 | } 2242 | }, 2243 | "readdirp": { 2244 | "version": "2.2.1", 2245 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", 2246 | "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", 2247 | "requires": { 2248 | "graceful-fs": "^4.1.11", 2249 | "micromatch": "^3.1.10", 2250 | "readable-stream": "^2.0.2" 2251 | } 2252 | }, 2253 | "regex-not": { 2254 | "version": "1.0.2", 2255 | "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", 2256 | "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", 2257 | "requires": { 2258 | "extend-shallow": "^3.0.2", 2259 | "safe-regex": "^1.1.0" 2260 | } 2261 | }, 2262 | "registry-auth-token": { 2263 | "version": "3.4.0", 2264 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", 2265 | "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", 2266 | "requires": { 2267 | "rc": "^1.1.6", 2268 | "safe-buffer": "^5.0.1" 2269 | } 2270 | }, 2271 | "registry-url": { 2272 | "version": "3.1.0", 2273 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", 2274 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", 2275 | "requires": { 2276 | "rc": "^1.0.1" 2277 | } 2278 | }, 2279 | "remove-trailing-separator": { 2280 | "version": "1.1.0", 2281 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 2282 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 2283 | }, 2284 | "repeat-element": { 2285 | "version": "1.1.3", 2286 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", 2287 | "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" 2288 | }, 2289 | "repeat-string": { 2290 | "version": "1.6.1", 2291 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2292 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 2293 | }, 2294 | "resolve-url": { 2295 | "version": "0.2.1", 2296 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 2297 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" 2298 | }, 2299 | "ret": { 2300 | "version": "0.1.15", 2301 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 2302 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" 2303 | }, 2304 | "safe-buffer": { 2305 | "version": "5.1.2", 2306 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2307 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2308 | }, 2309 | "safe-regex": { 2310 | "version": "1.1.0", 2311 | "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 2312 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 2313 | "requires": { 2314 | "ret": "~0.1.10" 2315 | } 2316 | }, 2317 | "safer-buffer": { 2318 | "version": "2.1.2", 2319 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2320 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2321 | }, 2322 | "sc-errors": { 2323 | "version": "2.0.0", 2324 | "resolved": "https://registry.npmjs.org/sc-errors/-/sc-errors-2.0.0.tgz", 2325 | "integrity": "sha512-zLIg4GskHvkBM7gpKl7JrdU1FXVYsYCavsUeTILFIi/YsuOHLN9OTlFcMp6otb+ebpNEnpcDJI395YXZPif+fw==" 2326 | }, 2327 | "sc-formatter": { 2328 | "version": "3.0.2", 2329 | "resolved": "https://registry.npmjs.org/sc-formatter/-/sc-formatter-3.0.2.tgz", 2330 | "integrity": "sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A==" 2331 | }, 2332 | "semver": { 2333 | "version": "5.7.0", 2334 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 2335 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" 2336 | }, 2337 | "semver-diff": { 2338 | "version": "2.1.0", 2339 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", 2340 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", 2341 | "requires": { 2342 | "semver": "^5.0.3" 2343 | } 2344 | }, 2345 | "send": { 2346 | "version": "0.17.1", 2347 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 2348 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 2349 | "requires": { 2350 | "debug": "2.6.9", 2351 | "depd": "~1.1.2", 2352 | "destroy": "~1.0.4", 2353 | "encodeurl": "~1.0.2", 2354 | "escape-html": "~1.0.3", 2355 | "etag": "~1.8.1", 2356 | "fresh": "0.5.2", 2357 | "http-errors": "~1.7.2", 2358 | "mime": "1.6.0", 2359 | "ms": "2.1.1", 2360 | "on-finished": "~2.3.0", 2361 | "range-parser": "~1.2.1", 2362 | "statuses": "~1.5.0" 2363 | } 2364 | }, 2365 | "serve-static": { 2366 | "version": "1.14.1", 2367 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 2368 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 2369 | "requires": { 2370 | "encodeurl": "~1.0.2", 2371 | "escape-html": "~1.0.3", 2372 | "parseurl": "~1.3.3", 2373 | "send": "0.17.1" 2374 | } 2375 | }, 2376 | "set-value": { 2377 | "version": "2.0.1", 2378 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", 2379 | "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", 2380 | "requires": { 2381 | "extend-shallow": "^2.0.1", 2382 | "is-extendable": "^0.1.1", 2383 | "is-plain-object": "^2.0.3", 2384 | "split-string": "^3.0.1" 2385 | }, 2386 | "dependencies": { 2387 | "extend-shallow": { 2388 | "version": "2.0.1", 2389 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2390 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2391 | "requires": { 2392 | "is-extendable": "^0.1.0" 2393 | } 2394 | } 2395 | } 2396 | }, 2397 | "setprototypeof": { 2398 | "version": "1.1.1", 2399 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 2400 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 2401 | }, 2402 | "shebang-command": { 2403 | "version": "1.2.0", 2404 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2405 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2406 | "requires": { 2407 | "shebang-regex": "^1.0.0" 2408 | } 2409 | }, 2410 | "shebang-regex": { 2411 | "version": "1.0.0", 2412 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2413 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 2414 | }, 2415 | "signal-exit": { 2416 | "version": "3.0.2", 2417 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2418 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 2419 | }, 2420 | "skeleton-rendezvous": { 2421 | "version": "1.1.2", 2422 | "resolved": "https://registry.npmjs.org/skeleton-rendezvous/-/skeleton-rendezvous-1.1.2.tgz", 2423 | "integrity": "sha512-v2HAvdDDSmDtnbtz/bi+/voztLHm/a+uijK5ilAyBew4Uwy/B+BXVFiQN+Qssb/6spYIeKYjNPr6IJOa4pf37Q==" 2424 | }, 2425 | "snapdragon": { 2426 | "version": "0.8.2", 2427 | "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", 2428 | "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", 2429 | "requires": { 2430 | "base": "^0.11.1", 2431 | "debug": "^2.2.0", 2432 | "define-property": "^0.2.5", 2433 | "extend-shallow": "^2.0.1", 2434 | "map-cache": "^0.2.2", 2435 | "source-map": "^0.5.6", 2436 | "source-map-resolve": "^0.5.0", 2437 | "use": "^3.1.0" 2438 | }, 2439 | "dependencies": { 2440 | "define-property": { 2441 | "version": "0.2.5", 2442 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2443 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2444 | "requires": { 2445 | "is-descriptor": "^0.1.0" 2446 | } 2447 | }, 2448 | "extend-shallow": { 2449 | "version": "2.0.1", 2450 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2451 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2452 | "requires": { 2453 | "is-extendable": "^0.1.0" 2454 | } 2455 | } 2456 | } 2457 | }, 2458 | "snapdragon-node": { 2459 | "version": "2.1.1", 2460 | "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", 2461 | "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", 2462 | "requires": { 2463 | "define-property": "^1.0.0", 2464 | "isobject": "^3.0.0", 2465 | "snapdragon-util": "^3.0.1" 2466 | }, 2467 | "dependencies": { 2468 | "define-property": { 2469 | "version": "1.0.0", 2470 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 2471 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 2472 | "requires": { 2473 | "is-descriptor": "^1.0.0" 2474 | } 2475 | }, 2476 | "is-accessor-descriptor": { 2477 | "version": "1.0.0", 2478 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 2479 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 2480 | "requires": { 2481 | "kind-of": "^6.0.0" 2482 | } 2483 | }, 2484 | "is-data-descriptor": { 2485 | "version": "1.0.0", 2486 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 2487 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 2488 | "requires": { 2489 | "kind-of": "^6.0.0" 2490 | } 2491 | }, 2492 | "is-descriptor": { 2493 | "version": "1.0.2", 2494 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 2495 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 2496 | "requires": { 2497 | "is-accessor-descriptor": "^1.0.0", 2498 | "is-data-descriptor": "^1.0.0", 2499 | "kind-of": "^6.0.2" 2500 | } 2501 | } 2502 | } 2503 | }, 2504 | "snapdragon-util": { 2505 | "version": "3.0.1", 2506 | "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", 2507 | "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", 2508 | "requires": { 2509 | "kind-of": "^3.2.0" 2510 | }, 2511 | "dependencies": { 2512 | "kind-of": { 2513 | "version": "3.2.2", 2514 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2515 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2516 | "requires": { 2517 | "is-buffer": "^1.1.5" 2518 | } 2519 | } 2520 | } 2521 | }, 2522 | "source-map": { 2523 | "version": "0.5.7", 2524 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2525 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 2526 | }, 2527 | "source-map-resolve": { 2528 | "version": "0.5.2", 2529 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", 2530 | "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", 2531 | "requires": { 2532 | "atob": "^2.1.1", 2533 | "decode-uri-component": "^0.2.0", 2534 | "resolve-url": "^0.2.1", 2535 | "source-map-url": "^0.4.0", 2536 | "urix": "^0.1.0" 2537 | } 2538 | }, 2539 | "source-map-url": { 2540 | "version": "0.4.0", 2541 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", 2542 | "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" 2543 | }, 2544 | "split-string": { 2545 | "version": "3.1.0", 2546 | "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", 2547 | "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", 2548 | "requires": { 2549 | "extend-shallow": "^3.0.0" 2550 | } 2551 | }, 2552 | "static-extend": { 2553 | "version": "0.1.2", 2554 | "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", 2555 | "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", 2556 | "requires": { 2557 | "define-property": "^0.2.5", 2558 | "object-copy": "^0.1.0" 2559 | }, 2560 | "dependencies": { 2561 | "define-property": { 2562 | "version": "0.2.5", 2563 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2564 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2565 | "requires": { 2566 | "is-descriptor": "^0.1.0" 2567 | } 2568 | } 2569 | } 2570 | }, 2571 | "statuses": { 2572 | "version": "1.5.0", 2573 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 2574 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 2575 | }, 2576 | "stream-demux": { 2577 | "version": "7.0.1", 2578 | "resolved": "https://registry.npmjs.org/stream-demux/-/stream-demux-7.0.1.tgz", 2579 | "integrity": "sha512-IEWUmiXyMPgAlCG+YhpZpG4S6PMhzYXZITWz0OrqXdzBGpV5vWYiLRc31CJhE9E95dIh4Slwuo0aG/RT/1OvJA==", 2580 | "requires": { 2581 | "consumable-stream": "^1.0.0", 2582 | "writable-consumable-stream": "^1.1.1" 2583 | } 2584 | }, 2585 | "string-width": { 2586 | "version": "2.1.1", 2587 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2588 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2589 | "requires": { 2590 | "is-fullwidth-code-point": "^2.0.0", 2591 | "strip-ansi": "^4.0.0" 2592 | } 2593 | }, 2594 | "string_decoder": { 2595 | "version": "1.1.1", 2596 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2597 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2598 | "requires": { 2599 | "safe-buffer": "~5.1.0" 2600 | } 2601 | }, 2602 | "strip-ansi": { 2603 | "version": "4.0.0", 2604 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2605 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2606 | "requires": { 2607 | "ansi-regex": "^3.0.0" 2608 | } 2609 | }, 2610 | "strip-eof": { 2611 | "version": "1.0.0", 2612 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 2613 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 2614 | }, 2615 | "strip-json-comments": { 2616 | "version": "2.0.1", 2617 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2618 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 2619 | }, 2620 | "supports-color": { 2621 | "version": "5.5.0", 2622 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2623 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2624 | "requires": { 2625 | "has-flag": "^3.0.0" 2626 | } 2627 | }, 2628 | "term-size": { 2629 | "version": "1.2.0", 2630 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", 2631 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", 2632 | "requires": { 2633 | "execa": "^0.7.0" 2634 | } 2635 | }, 2636 | "timed-out": { 2637 | "version": "4.0.1", 2638 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 2639 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" 2640 | }, 2641 | "to-object-path": { 2642 | "version": "0.3.0", 2643 | "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", 2644 | "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", 2645 | "requires": { 2646 | "kind-of": "^3.0.2" 2647 | }, 2648 | "dependencies": { 2649 | "kind-of": { 2650 | "version": "3.2.2", 2651 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2652 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2653 | "requires": { 2654 | "is-buffer": "^1.1.5" 2655 | } 2656 | } 2657 | } 2658 | }, 2659 | "to-regex": { 2660 | "version": "3.0.2", 2661 | "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", 2662 | "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", 2663 | "requires": { 2664 | "define-property": "^2.0.2", 2665 | "extend-shallow": "^3.0.2", 2666 | "regex-not": "^1.0.2", 2667 | "safe-regex": "^1.1.0" 2668 | } 2669 | }, 2670 | "to-regex-range": { 2671 | "version": "2.1.1", 2672 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", 2673 | "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", 2674 | "requires": { 2675 | "is-number": "^3.0.0", 2676 | "repeat-string": "^1.6.1" 2677 | } 2678 | }, 2679 | "toidentifier": { 2680 | "version": "1.0.0", 2681 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 2682 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 2683 | }, 2684 | "touch": { 2685 | "version": "3.1.0", 2686 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 2687 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 2688 | "requires": { 2689 | "nopt": "~1.0.10" 2690 | } 2691 | }, 2692 | "type-is": { 2693 | "version": "1.6.18", 2694 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2695 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2696 | "requires": { 2697 | "media-typer": "0.3.0", 2698 | "mime-types": "~2.1.24" 2699 | } 2700 | }, 2701 | "undefsafe": { 2702 | "version": "2.0.2", 2703 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", 2704 | "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", 2705 | "requires": { 2706 | "debug": "^2.2.0" 2707 | } 2708 | }, 2709 | "union-value": { 2710 | "version": "1.0.1", 2711 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", 2712 | "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", 2713 | "requires": { 2714 | "arr-union": "^3.1.0", 2715 | "get-value": "^2.0.6", 2716 | "is-extendable": "^0.1.1", 2717 | "set-value": "^2.0.1" 2718 | } 2719 | }, 2720 | "unique-string": { 2721 | "version": "1.0.0", 2722 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 2723 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 2724 | "requires": { 2725 | "crypto-random-string": "^1.0.0" 2726 | } 2727 | }, 2728 | "unpipe": { 2729 | "version": "1.0.0", 2730 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2731 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2732 | }, 2733 | "unset-value": { 2734 | "version": "1.0.0", 2735 | "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", 2736 | "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", 2737 | "requires": { 2738 | "has-value": "^0.3.1", 2739 | "isobject": "^3.0.0" 2740 | }, 2741 | "dependencies": { 2742 | "has-value": { 2743 | "version": "0.3.1", 2744 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", 2745 | "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", 2746 | "requires": { 2747 | "get-value": "^2.0.3", 2748 | "has-values": "^0.1.4", 2749 | "isobject": "^2.0.0" 2750 | }, 2751 | "dependencies": { 2752 | "isobject": { 2753 | "version": "2.1.0", 2754 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 2755 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 2756 | "requires": { 2757 | "isarray": "1.0.0" 2758 | } 2759 | } 2760 | } 2761 | }, 2762 | "has-values": { 2763 | "version": "0.1.4", 2764 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", 2765 | "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" 2766 | } 2767 | } 2768 | }, 2769 | "unzip-response": { 2770 | "version": "2.0.1", 2771 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", 2772 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" 2773 | }, 2774 | "upath": { 2775 | "version": "1.1.2", 2776 | "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", 2777 | "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==" 2778 | }, 2779 | "update-notifier": { 2780 | "version": "2.5.0", 2781 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", 2782 | "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", 2783 | "requires": { 2784 | "boxen": "^1.2.1", 2785 | "chalk": "^2.0.1", 2786 | "configstore": "^3.0.0", 2787 | "import-lazy": "^2.1.0", 2788 | "is-ci": "^1.0.10", 2789 | "is-installed-globally": "^0.1.0", 2790 | "is-npm": "^1.0.0", 2791 | "latest-version": "^3.0.0", 2792 | "semver-diff": "^2.0.0", 2793 | "xdg-basedir": "^3.0.0" 2794 | } 2795 | }, 2796 | "urix": { 2797 | "version": "0.1.0", 2798 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 2799 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" 2800 | }, 2801 | "url-parse-lax": { 2802 | "version": "1.0.0", 2803 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", 2804 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", 2805 | "requires": { 2806 | "prepend-http": "^1.0.1" 2807 | } 2808 | }, 2809 | "use": { 2810 | "version": "3.1.1", 2811 | "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", 2812 | "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" 2813 | }, 2814 | "util-deprecate": { 2815 | "version": "1.0.2", 2816 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2817 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2818 | }, 2819 | "utils-merge": { 2820 | "version": "1.0.1", 2821 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2822 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 2823 | }, 2824 | "uuid": { 2825 | "version": "3.3.2", 2826 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 2827 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 2828 | }, 2829 | "vary": { 2830 | "version": "1.1.2", 2831 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2832 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 2833 | }, 2834 | "which": { 2835 | "version": "1.3.1", 2836 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2837 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2838 | "requires": { 2839 | "isexe": "^2.0.0" 2840 | } 2841 | }, 2842 | "widest-line": { 2843 | "version": "2.0.1", 2844 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", 2845 | "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", 2846 | "requires": { 2847 | "string-width": "^2.1.1" 2848 | } 2849 | }, 2850 | "writable-consumable-stream": { 2851 | "version": "1.1.1", 2852 | "resolved": "https://registry.npmjs.org/writable-consumable-stream/-/writable-consumable-stream-1.1.1.tgz", 2853 | "integrity": "sha512-qARFG8dkQo2kX72UB2gnNwyCBS4x64lFjaJgRQnfbmrJVnfMpmYCUlqLD4kwmsFw6LcWo0Qv5MzkHET2L99ezw==", 2854 | "requires": { 2855 | "consumable-stream": "^1.0.0" 2856 | } 2857 | }, 2858 | "write-file-atomic": { 2859 | "version": "2.4.3", 2860 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", 2861 | "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", 2862 | "requires": { 2863 | "graceful-fs": "^4.1.11", 2864 | "imurmurhash": "^0.1.4", 2865 | "signal-exit": "^3.0.2" 2866 | } 2867 | }, 2868 | "ws": { 2869 | "version": "7.1.2", 2870 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz", 2871 | "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==", 2872 | "requires": { 2873 | "async-limiter": "^1.0.0" 2874 | } 2875 | }, 2876 | "xdg-basedir": { 2877 | "version": "3.0.0", 2878 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 2879 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" 2880 | }, 2881 | "yallist": { 2882 | "version": "2.1.2", 2883 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 2884 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 2885 | } 2886 | } 2887 | } 2888 | -------------------------------------------------------------------------------- /app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "asyngular-sample", 3 | "description": "A sample Asyngular app", 4 | "version": "1.0.0", 5 | "contributors": [ 6 | { 7 | "name": "Jonathan Gros-Dubois", 8 | "email": "grosjona@yahoo.com.au" 9 | } 10 | ], 11 | "dependencies": { 12 | "agc-broker-client": "^6.1.1", 13 | "asyngular-client": "^6.2.0", 14 | "asyngular-server": "^6.2.1", 15 | "connect": "^3.6.6", 16 | "eetase": "^3.0.1", 17 | "express": "^4.16.3", 18 | "morgan": "^1.7.0", 19 | "nodemon": "^1.18.9", 20 | "sc-errors": "^2.0.0", 21 | "serve-static": "^1.13.2", 22 | "uuid": "^3.3.2" 23 | }, 24 | "keywords": [ 25 | "websocket", 26 | "server", 27 | "realtime", 28 | "cluster", 29 | "scalable" 30 | ], 31 | "readmeFilename": "README.md", 32 | "scripts": { 33 | "start": "node server.js", 34 | "start:watch": "./node_modules/nodemon/bin/nodemon.js server.js", 35 | "start:docker": "./node_modules/nodemon/bin/nodemon.js /usr/src/app/server.js" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SocketCluster/asyngular/3be35ef5c17e62ac0b6275f43f711b7d7fb4a8ec/app/public/favicon.ico -------------------------------------------------------------------------------- /app/public/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SocketCluster/asyngular/3be35ef5c17e62ac0b6275f43f711b7d7fb4a8ec/app/public/img/logo.png -------------------------------------------------------------------------------- /app/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Asyngular 5 | 6 | 7 | 8 | 50 | 51 | 52 |
53 |
54 |
55 | Asyngular 56 |
57 |
58 | Design is not just what it looks like and feels like. Design is how it works. — Steve Jobs 59 |
60 |
61 | Getting Started · 62 | Documentation 63 |
64 |

65 | 66 |

67 |
68 |
69 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /app/server.js: -------------------------------------------------------------------------------- 1 | const http = require('http'); 2 | const eetase = require('eetase'); 3 | const asyngularServer = require('asyngular-server'); 4 | const express = require('express'); 5 | const serveStatic = require('serve-static'); 6 | const path = require('path'); 7 | const morgan = require('morgan'); 8 | const uuid = require('uuid'); 9 | const agcBrokerClient = require('agc-broker-client'); 10 | 11 | const ENVIRONMENT = process.env.ENV || 'dev'; 12 | const ASYNGULAR_PORT = process.env.ASYNGULAR_PORT || 8000; 13 | const ASYNGULAR_WS_ENGINE = process.env.ASYNGULAR_WS_ENGINE || 'ws'; 14 | const ASYNGULAR_SOCKET_CHANNEL_LIMIT = Number(process.env.ASYNGULAR_SOCKET_CHANNEL_LIMIT) || 1000; 15 | const ASYNGULAR_LOG_LEVEL = process.env.ASYNGULAR_LOG_LEVEL || 2; 16 | 17 | const AGC_INSTANCE_ID = uuid.v4(); 18 | const AGC_STATE_SERVER_HOST = process.env.AGC_STATE_SERVER_HOST || null; 19 | const AGC_STATE_SERVER_PORT = process.env.AGC_STATE_SERVER_PORT || null; 20 | const AGC_MAPPING_ENGINE = process.env.AGC_MAPPING_ENGINE || null; 21 | const AGC_CLIENT_POOL_SIZE = process.env.AGC_CLIENT_POOL_SIZE || null; 22 | const AGC_AUTH_KEY = process.env.AGC_AUTH_KEY || null; 23 | const AGC_INSTANCE_IP = process.env.AGC_INSTANCE_IP || null; 24 | const AGC_INSTANCE_IP_FAMILY = process.env.AGC_INSTANCE_IP_FAMILY || null; 25 | const AGC_STATE_SERVER_CONNECT_TIMEOUT = Number(process.env.AGC_STATE_SERVER_CONNECT_TIMEOUT) || null; 26 | const AGC_STATE_SERVER_ACK_TIMEOUT = Number(process.env.AGC_STATE_SERVER_ACK_TIMEOUT) || null; 27 | const AGC_STATE_SERVER_RECONNECT_RANDOMNESS = Number(process.env.AGC_STATE_SERVER_RECONNECT_RANDOMNESS) || null; 28 | const AGC_PUB_SUB_BATCH_DURATION = Number(process.env.AGC_PUB_SUB_BATCH_DURATION) || null; 29 | const AGC_BROKER_RETRY_DELAY = Number(process.env.AGC_BROKER_RETRY_DELAY) || null; 30 | 31 | let agOptions = {}; 32 | 33 | if (process.env.ASYNGULAR_OPTIONS) { 34 | let envOptions = JSON.parse(process.env.ASYNGULAR_OPTIONS); 35 | Object.assign(agOptions, envOptions); 36 | } 37 | 38 | let httpServer = eetase(http.createServer()); 39 | let agServer = asyngularServer.attach(httpServer, agOptions); 40 | 41 | let expressApp = express(); 42 | if (ENVIRONMENT === 'dev') { 43 | // Log every HTTP request. See https://github.com/expressjs/morgan for other 44 | // available formats. 45 | expressApp.use(morgan('dev')); 46 | } 47 | expressApp.use(serveStatic(path.resolve(__dirname, 'public'))); 48 | 49 | // Add GET /health-check express route 50 | expressApp.get('/health-check', (req, res) => { 51 | res.status(200).send('OK'); 52 | }); 53 | 54 | // HTTP request handling loop. 55 | (async () => { 56 | for await (let requestData of httpServer.listener('request')) { 57 | expressApp.apply(null, requestData); 58 | } 59 | })(); 60 | 61 | // Asyngular/WebSocket connection handling loop. 62 | (async () => { 63 | for await (let {socket} of agServer.listener('connection')) { 64 | // Handle socket connection. 65 | } 66 | })(); 67 | 68 | httpServer.listen(ASYNGULAR_PORT); 69 | 70 | if (ASYNGULAR_LOG_LEVEL >= 1) { 71 | (async () => { 72 | for await (let {error} of agServer.listener('error')) { 73 | console.error(error); 74 | } 75 | })(); 76 | } 77 | 78 | if (ASYNGULAR_LOG_LEVEL >= 2) { 79 | console.log( 80 | ` ${colorText('[Active]', 32)} Asyngular worker with PID ${process.pid} is listening on port ${ASYNGULAR_PORT}` 81 | ); 82 | 83 | (async () => { 84 | for await (let {warning} of agServer.listener('warning')) { 85 | console.warn(warning); 86 | } 87 | })(); 88 | } 89 | 90 | function colorText(message, color) { 91 | if (color) { 92 | return `\x1b[${color}m${message}\x1b[0m`; 93 | } 94 | return message; 95 | } 96 | 97 | if (AGC_STATE_SERVER_HOST) { 98 | // Setup broker client to connect to the Asyngular cluster (AGC). 99 | let agcClient = agcBrokerClient.attach(agServer.brokerEngine, { 100 | instanceId: AGC_INSTANCE_ID, 101 | instancePort: ASYNGULAR_PORT, 102 | instanceIp: AGC_INSTANCE_IP, 103 | instanceIpFamily: AGC_INSTANCE_IP_FAMILY, 104 | pubSubBatchDuration: AGC_PUB_SUB_BATCH_DURATION, 105 | stateServerHost: AGC_STATE_SERVER_HOST, 106 | stateServerPort: AGC_STATE_SERVER_PORT, 107 | mappingEngine: AGC_MAPPING_ENGINE, 108 | clientPoolSize: AGC_CLIENT_POOL_SIZE, 109 | authKey: AGC_AUTH_KEY, 110 | stateServerConnectTimeout: AGC_STATE_SERVER_CONNECT_TIMEOUT, 111 | stateServerAckTimeout: AGC_STATE_SERVER_ACK_TIMEOUT, 112 | stateServerReconnectRandomness: AGC_STATE_SERVER_RECONNECT_RANDOMNESS, 113 | brokerRetryDelay: AGC_BROKER_RETRY_DELAY 114 | }); 115 | 116 | if (ASYNGULAR_LOG_LEVEL >= 1) { 117 | (async () => { 118 | for await (let {error} of agcClient.listener('error')) { 119 | error.name = 'AGCError'; 120 | console.error(error); 121 | } 122 | })(); 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /bin/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const fs = require('fs-extra'); 4 | const path = require('path'); 5 | const argv = require('minimist')(process.argv.slice(2)); 6 | const childProcess = require('child_process'); 7 | const inquirer = require('inquirer'); 8 | const prompt = inquirer.createPromptModule(); 9 | const exec = childProcess.exec; 10 | const execSync = childProcess.execSync; 11 | const spawn = childProcess.spawn; 12 | const fork = childProcess.fork; 13 | const YAML = require('yamljs'); 14 | 15 | const DEFAULT_TLS_SECRET_NAME = 'agc-tls-credentials'; 16 | 17 | let command = argv._[0]; 18 | let commandRawArgs = process.argv.slice(3); 19 | let commandRawArgsString = commandRawArgs.join(' '); 20 | if (commandRawArgsString.length) { 21 | commandRawArgsString = ' ' + commandRawArgsString; 22 | } 23 | 24 | let arg1 = argv._[1]; 25 | let force = argv.force ? true : false; 26 | 27 | let dockerUsername, dockerPassword; 28 | let saveDockerAuthDetails = null; 29 | 30 | let tlsSecretName = null; 31 | let tlsKeyPath = null; 32 | let tlsCertPath = null; 33 | 34 | let fileExistsSync = function (filePath) { 35 | try { 36 | fs.accessSync(filePath, fs.constants.F_OK); 37 | } catch (err) { 38 | return false; 39 | } 40 | return true; 41 | }; 42 | 43 | let parseJSONFile = function (filePath) { 44 | try { 45 | if (fileExistsSync(filePath)) { 46 | return JSON.parse(fs.readFileSync(filePath, {encoding: 'utf8'})); 47 | } 48 | } catch (e) {} 49 | 50 | return {}; 51 | }; 52 | 53 | let parsePackageFile = function (moduleDir) { 54 | let packageFile = path.join(moduleDir, 'package.json'); 55 | return parseJSONFile(packageFile); 56 | }; 57 | 58 | let errorMessage = function (message) { 59 | console.log(`\x1b[31m[Error]\x1b[0m ${message}`); 60 | }; 61 | 62 | let successMessage = function (message) { 63 | console.log(`\x1b[32m[Success]\x1b[0m ${message}`); 64 | }; 65 | 66 | let warningMessage = function (message) { 67 | console.log(`\x1b[33m[Warning]\x1b[0m ${message}`); 68 | }; 69 | 70 | let showCorrectUsage = function () { 71 | console.log('Usage: asyngular [options] [command]\n'); 72 | console.log('Options:'); 73 | console.log(" -v Get the version of the current Asyngular installation"); 74 | console.log(' --help Get info on how to use this command'); 75 | console.log(' --force Force all necessary directory modifications without prompts'); 76 | console.log(); 77 | console.log('Commands:'); 78 | console.log(' create Create a new boilerplate app in your working directory'); 79 | console.log(' run [requires docker] Run the app at path inside a container on your local machine'); 80 | console.log(' restart [requires docker] Restart the app at path'); 81 | console.log(' stop [requires docker] Stop the app'); 82 | console.log(' list [requires docker] List all running Docker containers on your local machine'); 83 | console.log(' logs [requires docker] Get logs for the specified app'); 84 | console.log(' -f Follow the logs'); 85 | console.log(' deploy [requires kubectl] Deploy the app at path to your Kubernetes cluster'); 86 | console.log(' deploy-update [requires kubectl] Deploy update to an app which was previously deployed'); 87 | console.log(' undeploy [requires kubectl] Shutdown all core app services running on your cluster'); 88 | console.log(' add-secret [requires kubectl] Upload a TLS key and cert pair to your cluster'); 89 | console.log(` -s Optional secret name; defaults to "${DEFAULT_TLS_SECRET_NAME}"`); 90 | console.log(' -k Path to a key file'); 91 | console.log(' -c Path to a certificate file'); 92 | console.log(' remove-secret [requires kubectl] Remove a TLS key and cert pair from your cluster'); 93 | console.log(` -s Optional secret name; defaults to "${DEFAULT_TLS_SECRET_NAME}"`); 94 | console.log(''); 95 | let extraMessage = 'Note that the app-name/app-path in the commands above is optional (except for create) - If not provided, ' + 96 | 'asyngular will use the current working directory as the app path.'; 97 | console.log(extraMessage); 98 | }; 99 | 100 | let failedToRemoveDirMessage = function (dirPath) { 101 | errorMessage( 102 | `Failed to remove existing directory at ${dirPath}. This directory may be used by another program or you may not have the permission to remove it.` 103 | ); 104 | }; 105 | 106 | let failedToCreateMessage = function () { 107 | errorMessage('Failed to create necessary files. Please check your permissions and try again.'); 108 | }; 109 | 110 | let promptInput = function (message, callback, secret) { 111 | prompt([ 112 | { 113 | type: secret ? 'password' : 'input', 114 | message: message, 115 | name: 'result', 116 | default: null 117 | } 118 | ]).then((answers) => { 119 | callback(answers.result); 120 | }).catch((err) => { 121 | errorMessage(err.message); 122 | process.exit(); 123 | }); 124 | }; 125 | 126 | let promptConfirm = function (message, options, callback) { 127 | let promptOptions = { 128 | type: 'confirm', 129 | message: message, 130 | name: 'result' 131 | }; 132 | if (options && options.default) { 133 | promptOptions.default = options.default; 134 | } 135 | prompt([ 136 | promptOptions 137 | ]).then((answers) => { 138 | callback(answers.result); 139 | }).catch((err) => { 140 | errorMessage(err.message); 141 | process.exit(); 142 | }); 143 | }; 144 | 145 | let copyDirRecursive = function (src, dest) { 146 | try { 147 | fs.copySync(src, dest); 148 | return true; 149 | } catch (e) { 150 | failedToCreateMessage(); 151 | } 152 | return false; 153 | }; 154 | 155 | let rmdirRecursive = function (dirname) { 156 | try { 157 | fs.removeSync(dirname); 158 | return true; 159 | } catch (e) { 160 | failedToRemoveDirMessage(dirname); 161 | } 162 | return false; 163 | }; 164 | 165 | let sanitizeYAML = function (yamlString) { 166 | return yamlString.replace(/emptyDir: ?(null)?\n/g, 'emptyDir: {}\n'); 167 | }; 168 | 169 | if (argv.help) { 170 | showCorrectUsage(); 171 | process.exit(); 172 | }; 173 | 174 | if (argv.v) { 175 | let agDir = `${__dirname}/../`; 176 | let agPkg = parsePackageFile(agDir); 177 | console.log('v' + agPkg.version); 178 | process.exit(); 179 | }; 180 | 181 | let wd = process.cwd(); 182 | 183 | let appDir = `${__dirname}/../app`; 184 | let destDir = path.normalize(`${wd}/${arg1}`); 185 | let clientFileSourcePath = path.normalize(`${destDir}/node_modules/asyngular-client/asyngular-client.js`); 186 | let clientFileDestPath = path.normalize(`${destDir}/public/asyngular-client.js`); 187 | let deploymentYAMLRegex = /-deployment\.yaml$/; 188 | 189 | let createFail = function (error) { 190 | if (error) { 191 | errorMessage(`Failed to create Asyngular app. ${error}`); 192 | } else { 193 | errorMessage('Failed to create Asyngular app.'); 194 | } 195 | process.exit(); 196 | }; 197 | 198 | let createSuccess = function () { 199 | console.log('Installing app dependencies using npm. This could take a while...'); 200 | 201 | let npmCommand = (process.platform === "win32" ? "npm.cmd" : "npm"); 202 | let options = { 203 | cwd: destDir, 204 | maxBuffer: Infinity 205 | }; 206 | 207 | let npmProcess = spawn(npmCommand, ['install'], options); 208 | 209 | npmProcess.stdout.on('data', (data) => { 210 | process.stdout.write(data); 211 | }); 212 | 213 | npmProcess.stderr.on('data', (data) => { 214 | process.stderr.write(data); 215 | }); 216 | 217 | npmProcess.on('close', (code) => { 218 | if (code) { 219 | errorMessage(`Failed to install npm dependencies. Exited with code ${code}.`); 220 | } else { 221 | try { 222 | fs.writeFileSync(clientFileDestPath, fs.readFileSync(clientFileSourcePath)); 223 | successMessage(`Asyngular app "${destDir}" was setup successfully.`); 224 | } catch (err) { 225 | warningMessage( 226 | `Failed to copy file from "${clientFileSourcePath}" to "${clientFileDestPath}" - Try copying it manually.` 227 | ); 228 | } 229 | } 230 | process.exit(code); 231 | }); 232 | 233 | npmProcess.stdin.end(); 234 | }; 235 | 236 | let setupMessage = function () { 237 | console.log('Creating app structure...'); 238 | }; 239 | 240 | let confirmReplaceSetup = function (confirm) { 241 | if (confirm) { 242 | setupMessage(); 243 | if (rmdirRecursive(destDir) && copyDirRecursive(appDir, destDir)) { 244 | createSuccess(); 245 | } else { 246 | createFail(); 247 | } 248 | } else { 249 | errorMessage('Asyngular "create" action was aborted.'); 250 | process.exit(); 251 | } 252 | }; 253 | 254 | let getAGCWorkerDeploymentDefPath = function (kubernetesTargetDir) { 255 | return `${kubernetesTargetDir}/agc-worker-deployment.yaml`; 256 | }; 257 | 258 | let getAGCBrokerDeploymentDefPath = function (kubernetesTargetDir) { 259 | return `${kubernetesTargetDir}/agc-broker-deployment.yaml`; 260 | }; 261 | 262 | let promptSecret = function (callback) { 263 | promptInput(`Insert a TLS secretName for Kubernetes (or press enter to leave it as "${DEFAULT_TLS_SECRET_NAME}" - Recommended):`, (secretName) => { 264 | secretName = secretName || DEFAULT_TLS_SECRET_NAME; 265 | promptInput('Insert the path to a private key file to upload to K8s (or press enter to cancel):', (privateKeyPath) => { 266 | if (!privateKeyPath) { 267 | callback(); 268 | return; 269 | } 270 | promptInput('Insert the path to a certificate file to upload to K8s (or press enter to cancel):', (certFilePath) => { 271 | if (!certFilePath) { 272 | callback(); 273 | return; 274 | } 275 | tlsSecretName = secretName; 276 | tlsKeyPath = privateKeyPath; 277 | tlsCertPath = certFilePath; 278 | callback(secretName, privateKeyPath, certFilePath); 279 | }); 280 | }); 281 | }); 282 | }; 283 | 284 | let promptK8sTLSCredentials = function (callback) { 285 | promptConfirm('Would you like to upload a TLS private key and certificate to your cluster? (both must be unencrypted)', {default: true}, (provideKeyAndCert) => { 286 | if (provideKeyAndCert) { 287 | promptSecret(callback); 288 | } else { 289 | callback(); 290 | } 291 | }); 292 | }; 293 | 294 | let uploadTLSSecret = function (secretName, privateKeyPath, certFilePath, errorLogger) { 295 | try { 296 | execSync(`kubectl create secret tls ${secretName} --key ${privateKeyPath} --cert ${certFilePath}`, {stdio: 'inherit'}); 297 | } catch (err) { 298 | errorLogger( 299 | 'Failed to upload TLS key and certificate pair to Kubernetes. ' + 300 | 'You can try using the following command to upload them manually: ' + 301 | `kubectl create secret tls ${secretName} --key ${privateKeyPath} --cert ${certFilePath}` 302 | ); 303 | return false; 304 | } 305 | return true; 306 | }; 307 | 308 | let removeTLSSecret = function (secretName, errorLogger) { 309 | try { 310 | execSync(`kubectl delete secret ${secretName}`, {stdio: 'inherit'}); 311 | } catch (err) { 312 | errorLogger( 313 | `Failed to remove TLS key and certificate pair "${secretName}" from Kubernetes. ` + 314 | 'You can try using the following command to remove them manually: ' + 315 | `kubectl delete secret ${secretName}` 316 | ); 317 | return false; 318 | } 319 | return true; 320 | }; 321 | 322 | if (command === 'create') { 323 | let transformK8sConfigs = function (callback) { 324 | let kubernetesTargetDir = destDir + '/kubernetes'; 325 | let kubeConfAGCWorker = getAGCWorkerDeploymentDefPath(kubernetesTargetDir); 326 | try { 327 | let kubeConfContentAGCWorker = fs.readFileSync(kubeConfAGCWorker, {encoding: 'utf8'}); 328 | let deploymentConfAGCWorker = YAML.parse(kubeConfContentAGCWorker); 329 | 330 | deploymentConfAGCWorker.spec.template.spec.volumes = [{ 331 | name: 'app-src-volume', 332 | emptyDir: {} 333 | }]; 334 | let containers = deploymentConfAGCWorker.spec.template.spec.containers; 335 | let templateSpec = deploymentConfAGCWorker.spec.template.spec; 336 | if (!templateSpec.initContainers) { 337 | templateSpec.initContainers = []; 338 | } 339 | let initContainers = templateSpec.initContainers; 340 | let appSrcContainerIndex; 341 | containers.forEach((value, index) => { 342 | if (value && value.name == 'agc-worker') { 343 | appSrcContainerIndex = index; 344 | return; 345 | } 346 | }); 347 | if (!containers[appSrcContainerIndex].volumeMounts) { 348 | containers[appSrcContainerIndex].volumeMounts = []; 349 | } 350 | containers[appSrcContainerIndex].volumeMounts.push({ 351 | mountPath: '/usr/src/app', 352 | name: 'app-src-volume' 353 | }); 354 | initContainers.push({ 355 | name: 'app-src-container', 356 | image: '', // image name will be generated during deployment 357 | volumeMounts: [{ 358 | mountPath: '/usr/dest', 359 | name: 'app-src-volume' 360 | }], 361 | command: ['cp', '-a', '/usr/src/.', '/usr/dest/'] 362 | }); 363 | let formattedYAMLString = sanitizeYAML(YAML.stringify(deploymentConfAGCWorker, Infinity, 2)); 364 | fs.writeFileSync(kubeConfAGCWorker, formattedYAMLString); 365 | } catch (err) { 366 | callback(err); 367 | return; 368 | } 369 | callback(); 370 | }; 371 | 372 | if (arg1) { 373 | if (fileExistsSync(destDir)) { 374 | if (force) { 375 | confirmReplaceSetup(true); 376 | } else { 377 | let message = `There is already a directory at ${destDir}. Do you want to overwrite it?`; 378 | promptConfirm(message, {default: true}, confirmReplaceSetup); 379 | } 380 | } else { 381 | setupMessage(); 382 | if (copyDirRecursive(appDir, destDir)) { 383 | transformK8sConfigs((err) => { 384 | if (err) { 385 | createFail(`Failed to format Kubernetes configs. ${err}`); 386 | } else { 387 | createSuccess(); 388 | } 389 | }); 390 | } else { 391 | createFail(); 392 | } 393 | } 394 | } else { 395 | errorMessage('The "create" command requires a valid as argument.'); 396 | showCorrectUsage(); 397 | process.exit(); 398 | } 399 | } else if (command === 'run') { 400 | let appPath = arg1 || '.'; 401 | let absoluteAppPath = path.resolve(appPath); 402 | let pkg = parsePackageFile(appPath); 403 | let appName = pkg.name; 404 | 405 | let portNumber = Number(argv.p) || 8000; 406 | let envVarList; 407 | if (argv.e === undefined) { 408 | envVarList = []; 409 | } else if (!Array.isArray(argv.e)) { 410 | envVarList = [argv.e]; 411 | } else { 412 | envVarList = argv.e; 413 | } 414 | let envFlagList = envVarList.map((value) => { 415 | return `-e "${value}"`; 416 | }); 417 | let envFlagString = envFlagList.join(' '); 418 | if (envFlagList.length > 0) { 419 | envFlagString += ' '; 420 | } 421 | 422 | try { 423 | execSync(`docker stop ${appName}`, {stdio: 'ignore'}); 424 | execSync(`docker rm ${appName}`, {stdio: 'ignore'}); 425 | } catch (e) {} 426 | 427 | let dockerCommand = `docker run -d -p ${portNumber}:8000 -v ${absoluteAppPath}:/usr/src/app/ ` + 428 | `${envFlagString}--name ${appName} socketcluster/asyngular:v6.1.1`; 429 | try { 430 | execSync(dockerCommand, {stdio: 'inherit'}); 431 | successMessage(`App "${appName}" is running at http://localhost:${portNumber}`); 432 | } catch (e) { 433 | errorMessage(`Failed to start app "${appName}".`); 434 | } 435 | process.exit(); 436 | } else if (command === 'restart') { 437 | let appName = arg1; 438 | if (!appName) { 439 | let appPath = '.'; 440 | let absoluteAppPath = path.resolve(appPath); 441 | let pkg = parsePackageFile(appPath); 442 | appName = pkg.name; 443 | } 444 | try { 445 | execSync(`docker stop ${appName}`, {stdio: 'ignore'}); 446 | successMessage(`App '${appName}' was stopped.`); 447 | } catch (e) {} 448 | try { 449 | execSync(`docker start ${appName}`); 450 | successMessage(`App '${appName}' is running.`); 451 | } catch (e) { 452 | errorMessage(`Failed to start app '${appName}'.`); 453 | } 454 | process.exit(); 455 | } else if (command === 'stop') { 456 | let appName = arg1; 457 | if (!appName) { 458 | let appPath = '.'; 459 | let absoluteAppPath = path.resolve(appPath); 460 | let pkg = parsePackageFile(appPath); 461 | appName = pkg.name; 462 | } 463 | try { 464 | execSync(`docker stop ${appName}`); 465 | execSync(`docker rm ${appName}`); 466 | successMessage(`App '${appName}' was stopped.`); 467 | } catch (e) { 468 | errorMessage(`Failed to stop app '${appName}'.`); 469 | } 470 | process.exit(); 471 | } else if (command === 'list') { 472 | let command = exec(`docker ps${commandRawArgsString}`, (err) => { 473 | if (err) { 474 | errorMessage(`Failed to list active containers. ` + err); 475 | } 476 | process.exit(); 477 | }); 478 | command.stdout.pipe(process.stdout); 479 | command.stderr.pipe(process.stderr); 480 | } else if (command === 'logs') { 481 | let appName = arg1; 482 | if (!appName) { 483 | let appPath = '.'; 484 | let absoluteAppPath = path.resolve(appPath); 485 | let pkg = parsePackageFile(appPath); 486 | appName = pkg.name; 487 | } 488 | let command = exec(`docker logs ${appName}${commandRawArgsString}`, (err) => { 489 | if (err) { 490 | errorMessage(`Failed to get logs for '${appName}' app. ` + err); 491 | } 492 | process.exit(); 493 | }); 494 | command.stdout.pipe(process.stdout); 495 | command.stderr.pipe(process.stderr); 496 | } else if (command === 'deploy' || command === 'deploy-update') { 497 | let appPath = arg1 || '.'; 498 | let absoluteAppPath = path.resolve(appPath); 499 | let pkg = parsePackageFile(appPath); 500 | let appName = pkg.name; 501 | 502 | let isUpdate = (command === 'deploy-update'); 503 | 504 | let targetCPUUtilization = 50; 505 | let maxPodsPerService = 10; 506 | 507 | let failedToDeploy = function (err) { 508 | errorMessage(`Failed to deploy the '${appName}' app. ${err.message}`); 509 | process.exit(); 510 | }; 511 | 512 | let asyngularK8sConfigFilePath = appPath + '/asyngular-k8s.json'; 513 | let asyngularK8sConfig = parseJSONFile(asyngularK8sConfigFilePath); 514 | 515 | let addAuthDetailsToAsyngularK8s = function (asyngularK8sConfigJSON, username, password) { 516 | if (!asyngularK8sConfigJSON.docker) { 517 | asyngularK8sConfigJSON.docker = {}; 518 | } 519 | asyngularK8sConfigJSON.docker.auth = Buffer.from(`${username}:${password}`, 'utf8').toString('base64'); 520 | }; 521 | 522 | let saveAsyngularK8sConfigFile = function (asyngularK8sConfigJSON) { 523 | fs.writeFileSync(asyngularK8sConfigFilePath, JSON.stringify(asyngularK8sConfigJSON, null, 2)); 524 | }; 525 | 526 | let parseVersionTag = function (fullImageName) { 527 | let matches = fullImageName.match(/:[^:]*$/); 528 | if (!matches) { 529 | return ''; 530 | } 531 | return matches[0] || ''; 532 | }; 533 | 534 | let setImageVersionTag = function (imageName, versionTag) { 535 | if (versionTag.indexOf(':') != 0) { 536 | versionTag = ':' + versionTag; 537 | } 538 | return imageName.replace(/(\/[^\/:]*)(:[^:]*)?$/g, `$1${versionTag}`); 539 | }; 540 | 541 | let promptDockerAuthDetails = function (callback) { 542 | let handleSaveDockerAuthDetails = function (saveAuthDetails) { 543 | saveDockerAuthDetails = saveAuthDetails; 544 | callback(dockerUsername, dockerPassword, saveDockerAuthDetails); 545 | }; 546 | 547 | let promptSaveAuthDetails = function () { 548 | promptConfirm(`Would you like to save your Docker registry username and password as Base64 to ${asyngularK8sConfigFilePath}?`, {default: true}, handleSaveDockerAuthDetails); 549 | }; 550 | 551 | let handlePassword = function (password) { 552 | dockerPassword = password; 553 | if (saveDockerAuthDetails != null) { 554 | handleSaveDockerAuthDetails(saveDockerAuthDetails); 555 | return; 556 | } 557 | promptSaveAuthDetails(); 558 | }; 559 | 560 | let handleUsername = function (username) { 561 | dockerUsername = username; 562 | if (dockerPassword != null) { 563 | handlePassword(dockerPassword); 564 | return; 565 | } 566 | promptInput('Enter your Docker registry password:', handlePassword, true); 567 | }; 568 | 569 | let promptUsername = function () { 570 | if (dockerUsername != null) { 571 | handleUsername(dockerUsername); 572 | return; 573 | } 574 | promptInput('Enter your Docker registry username:', handleUsername); 575 | }; 576 | 577 | promptUsername(); 578 | }; 579 | 580 | let performDeployment = function (dockerConfig, versionTag, username, password) { 581 | let dockerLoginCommand = `docker login -u ${username} -p ${password}`; 582 | 583 | let fullVersionTag; 584 | if (versionTag) { 585 | fullVersionTag = `:${versionTag}`; 586 | } else { 587 | fullVersionTag = parseVersionTag(dockerConfig.imageName); 588 | } 589 | dockerConfig.imageName = setImageVersionTag(dockerConfig.imageName, fullVersionTag); 590 | if (saveDockerAuthDetails) { 591 | addAuthDetailsToAsyngularK8s(asyngularK8sConfig, username, password); 592 | } 593 | try { 594 | saveAsyngularK8sConfigFile(asyngularK8sConfig); 595 | 596 | execSync(`docker build -t ${dockerConfig.imageName} .`, {stdio: 'inherit'}); 597 | execSync(`${dockerLoginCommand}; docker push ${dockerConfig.imageName}`, {stdio: 'inherit'}); 598 | 599 | if (tlsSecretName && tlsKeyPath && tlsCertPath) { 600 | uploadTLSSecret(tlsSecretName, tlsKeyPath, tlsCertPath, warningMessage); 601 | } 602 | 603 | let kubernetesDirPath = appPath + '/kubernetes'; 604 | 605 | let kubeConfAGCWorker = getAGCWorkerDeploymentDefPath(kubernetesDirPath); 606 | let kubeConfContentAGCWorker = fs.readFileSync(kubeConfAGCWorker, {encoding: 'utf8'}); 607 | 608 | let deploymentConfAGCWorker = YAML.parse(kubeConfContentAGCWorker); 609 | 610 | let initContainersAGCWorker = deploymentConfAGCWorker.spec.template.spec.initContainers; 611 | initContainersAGCWorker.forEach((value, index) => { 612 | if (value) { 613 | if (value.name === 'app-src-container') { 614 | initContainersAGCWorker[index].image = dockerConfig.imageName; 615 | } 616 | } 617 | }); 618 | 619 | let formattedYAMLStringAGCWorker = sanitizeYAML(YAML.stringify(deploymentConfAGCWorker, Infinity, 2)); 620 | fs.writeFileSync(kubeConfAGCWorker, formattedYAMLStringAGCWorker); 621 | 622 | let kubeConfAGCBroker = getAGCBrokerDeploymentDefPath(kubernetesDirPath); 623 | let kubeConfContentAGCBroker = fs.readFileSync(kubeConfAGCBroker, {encoding: 'utf8'}); 624 | 625 | let deploymentConfAGCBroker = YAML.parse(kubeConfContentAGCBroker); 626 | 627 | let formattedYAMLStringAGCBroker = sanitizeYAML(YAML.stringify(deploymentConfAGCBroker, Infinity, 2)); 628 | fs.writeFileSync(kubeConfAGCBroker, formattedYAMLStringAGCBroker); 629 | 630 | let ingressKubeFileName = 'agc-ingress.yaml'; 631 | let agcWorkerDeploymentFileName = 'agc-worker-deployment.yaml'; 632 | 633 | let deploySuccess = () => { 634 | successMessage( 635 | `The '${appName}' app was deployed successfully - You should be able to access it online ` + 636 | `once it has finished booting up. This can take a while depending on your platform.` 637 | ); 638 | process.exit(); 639 | }; 640 | 641 | if (isUpdate) { 642 | try { 643 | execSync(`kubectl replace -f ${kubernetesDirPath}/${agcWorkerDeploymentFileName}`, {stdio: 'inherit'}); 644 | } catch (err) {} 645 | 646 | deploySuccess(); 647 | } else { 648 | let kubeFiles = fs.readdirSync(kubernetesDirPath); 649 | let serviceAndDeploymentKubeFiles = kubeFiles.filter((configFilePath) => { 650 | return configFilePath != ingressKubeFileName; 651 | }); 652 | serviceAndDeploymentKubeFiles.forEach((configFilePath) => { 653 | let absolutePath = path.resolve(kubernetesDirPath, configFilePath); 654 | execSync(`kubectl create -f ${absolutePath}`, {stdio: 'inherit'}); 655 | }); 656 | 657 | // Wait a few seconds before deploying ingress (due to a bug in some environments). 658 | setTimeout(() => { 659 | try { 660 | execSync(`kubectl create -f ${kubernetesDirPath}/${ingressKubeFileName}`, {stdio: 'inherit'}); 661 | deploySuccess(); 662 | } catch (err) { 663 | failedToDeploy(err); 664 | } 665 | }, 7000); 666 | } 667 | } catch (err) { 668 | failedToDeploy(err); 669 | } 670 | }; 671 | 672 | let handleDockerVersionTagAndPushToDockerImageRepo = function (versionTag) { 673 | let dockerConfig = asyngularK8sConfig.docker; 674 | 675 | if (dockerConfig.auth) { 676 | let authParts = Buffer.from(dockerConfig.auth, 'base64').toString('utf8').split(':'); 677 | dockerUsername = authParts[0]; 678 | dockerPassword = authParts[1]; 679 | performDeployment(dockerConfig, versionTag, dockerUsername, dockerPassword); 680 | } else { 681 | promptDockerAuthDetails((username, password) => { 682 | performDeployment(dockerConfig, versionTag, username, password); 683 | }); 684 | } 685 | }; 686 | 687 | let incrementVersion = function (versionString) { 688 | return versionString.replace(/[^.]$/, (match) => { 689 | return parseInt(match) + 1; 690 | }); 691 | }; 692 | 693 | let pushToDockerImageRepo = function () { 694 | let versionTagString = parseVersionTag(asyngularK8sConfig.docker.imageName).replace(/^:/, ''); 695 | let nextVersionTag; 696 | if (versionTagString) { 697 | if (isUpdate) { 698 | nextVersionTag = incrementVersion(versionTagString); 699 | asyngularK8sConfig.docker.imageName = setImageVersionTag(asyngularK8sConfig.docker.imageName, nextVersionTag); 700 | } else { 701 | nextVersionTag = versionTagString; 702 | } 703 | } else { 704 | nextVersionTag = '""'; 705 | } 706 | 707 | promptInput(`Enter the Docker version tag for this deployment (Default: ${nextVersionTag}):`, handleDockerVersionTagAndPushToDockerImageRepo); 708 | }; 709 | 710 | if (asyngularK8sConfig.docker && asyngularK8sConfig.docker.imageRepo) { 711 | pushToDockerImageRepo(); 712 | } else { 713 | let dockerImageName, dockerDefaultImageName, dockerDefaultImageVersionTag; 714 | 715 | let saveAsyngularK8sConfigs = function () { 716 | asyngularK8sConfig.docker = { 717 | imageRepo: 'https://index.docker.io/v1/', 718 | imageName: dockerImageName 719 | }; 720 | if (saveDockerAuthDetails) { 721 | addAuthDetailsToAsyngularK8s(asyngularK8sConfig, dockerUsername, dockerPassword); 722 | } 723 | try { 724 | saveAsyngularK8sConfigFile(asyngularK8sConfig); 725 | } catch (err) { 726 | failedToDeploy(err); 727 | } 728 | pushToDockerImageRepo(); 729 | }; 730 | 731 | let handleDockerImageName = function (imageName) { 732 | if (imageName) { 733 | dockerImageName = imageName; 734 | } else { 735 | dockerImageName = setImageVersionTag(dockerDefaultImageName, dockerDefaultImageVersionTag); 736 | } 737 | saveAsyngularK8sConfigs(); 738 | }; 739 | 740 | let promptDockerImageName = function () { 741 | dockerDefaultImageName = `${dockerUsername}/${appName}`; 742 | dockerDefaultImageVersionTag = 'v1.0.0'; 743 | 744 | promptInput(`Enter the Docker image name without the version tag (Or press enter for default: ${dockerDefaultImageName}):`, handleDockerImageName); 745 | }; 746 | 747 | promptK8sTLSCredentials(() => { 748 | promptDockerAuthDetails(promptDockerImageName); 749 | }); 750 | } 751 | } else if (command === 'undeploy') { 752 | let appPath = arg1 || '.'; 753 | 754 | let pkg = parsePackageFile(appPath); 755 | let appName = pkg.name; 756 | 757 | let kubernetesDirPath = appPath + '/kubernetes'; 758 | let kubeFiles = fs.readdirSync(kubernetesDirPath); 759 | kubeFiles.forEach((configFilePath) => { 760 | let absolutePath = path.resolve(kubernetesDirPath, configFilePath); 761 | try { 762 | execSync(`kubectl delete -f ${absolutePath}`, {stdio: 'inherit'}); 763 | } catch (err) {} 764 | }); 765 | 766 | successMessage(`The '${appName}' app was undeployed successfully.`); 767 | 768 | process.exit(); 769 | } else if (command === 'add-secret') { 770 | let secretName = argv.s || DEFAULT_TLS_SECRET_NAME; 771 | let privateKeyPath = argv.k; 772 | let certFilePath = argv.c; 773 | 774 | if (privateKeyPath == null || certFilePath == null) { 775 | errorMessage(`Failed to upload secret. Both a key file path (-k) and a certificate file path (-c) must be provided.`); 776 | } else { 777 | let success = uploadTLSSecret(secretName, privateKeyPath, certFilePath, errorMessage); 778 | if (success) { 779 | successMessage(`The private key and cert pair were added to your cluster under the secret name "${secretName}".`); 780 | } 781 | } 782 | process.exit(); 783 | } else if (command === 'remove-secret') { 784 | let secretName = argv.s || DEFAULT_TLS_SECRET_NAME; 785 | let success = removeTLSSecret(secretName, errorMessage); 786 | if (success) { 787 | successMessage(`The private key and cert pair under the secret name "${secretName}" were removed from your cluster.`); 788 | } 789 | process.exit(); 790 | } else { 791 | errorMessage(`"${command}" is not a valid Asyngular command.`); 792 | showCorrectUsage(); 793 | process.exit(); 794 | } 795 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "asyngular", 3 | "version": "6.1.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-escapes": { 8 | "version": "3.2.0", 9 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 10 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" 11 | }, 12 | "ansi-regex": { 13 | "version": "3.0.0", 14 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 15 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 16 | }, 17 | "ansi-styles": { 18 | "version": "3.2.1", 19 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 20 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 21 | "requires": { 22 | "color-convert": "^1.9.0" 23 | } 24 | }, 25 | "argparse": { 26 | "version": "1.0.10", 27 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 28 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 29 | "requires": { 30 | "sprintf-js": "~1.0.2" 31 | } 32 | }, 33 | "balanced-match": { 34 | "version": "1.0.0", 35 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 36 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 37 | }, 38 | "brace-expansion": { 39 | "version": "1.1.11", 40 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 41 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 42 | "requires": { 43 | "balanced-match": "^1.0.0", 44 | "concat-map": "0.0.1" 45 | } 46 | }, 47 | "chalk": { 48 | "version": "2.4.2", 49 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 50 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 51 | "requires": { 52 | "ansi-styles": "^3.2.1", 53 | "escape-string-regexp": "^1.0.5", 54 | "supports-color": "^5.3.0" 55 | } 56 | }, 57 | "chardet": { 58 | "version": "0.7.0", 59 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 60 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 61 | }, 62 | "cli-cursor": { 63 | "version": "2.1.0", 64 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 65 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 66 | "requires": { 67 | "restore-cursor": "^2.0.0" 68 | } 69 | }, 70 | "cli-width": { 71 | "version": "2.2.0", 72 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 73 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" 74 | }, 75 | "color-convert": { 76 | "version": "1.9.3", 77 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 78 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 79 | "requires": { 80 | "color-name": "1.1.3" 81 | } 82 | }, 83 | "color-name": { 84 | "version": "1.1.3", 85 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 86 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 87 | }, 88 | "concat-map": { 89 | "version": "0.0.1", 90 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 91 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 92 | }, 93 | "escape-string-regexp": { 94 | "version": "1.0.5", 95 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 96 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 97 | }, 98 | "external-editor": { 99 | "version": "3.0.3", 100 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", 101 | "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", 102 | "requires": { 103 | "chardet": "^0.7.0", 104 | "iconv-lite": "^0.4.24", 105 | "tmp": "^0.0.33" 106 | } 107 | }, 108 | "figures": { 109 | "version": "2.0.0", 110 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 111 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 112 | "requires": { 113 | "escape-string-regexp": "^1.0.5" 114 | } 115 | }, 116 | "fs-extra": { 117 | "version": "7.0.1", 118 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", 119 | "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", 120 | "requires": { 121 | "graceful-fs": "^4.1.2", 122 | "jsonfile": "^4.0.0", 123 | "universalify": "^0.1.0" 124 | } 125 | }, 126 | "fs.realpath": { 127 | "version": "1.0.0", 128 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 129 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 130 | }, 131 | "glob": { 132 | "version": "7.1.3", 133 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 134 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 135 | "requires": { 136 | "fs.realpath": "^1.0.0", 137 | "inflight": "^1.0.4", 138 | "inherits": "2", 139 | "minimatch": "^3.0.4", 140 | "once": "^1.3.0", 141 | "path-is-absolute": "^1.0.0" 142 | } 143 | }, 144 | "graceful-fs": { 145 | "version": "4.1.15", 146 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 147 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 148 | }, 149 | "has-flag": { 150 | "version": "3.0.0", 151 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 152 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 153 | }, 154 | "iconv-lite": { 155 | "version": "0.4.24", 156 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 157 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 158 | "requires": { 159 | "safer-buffer": ">= 2.1.2 < 3" 160 | } 161 | }, 162 | "inflight": { 163 | "version": "1.0.6", 164 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 165 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 166 | "requires": { 167 | "once": "^1.3.0", 168 | "wrappy": "1" 169 | } 170 | }, 171 | "inherits": { 172 | "version": "2.0.3", 173 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 174 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 175 | }, 176 | "inquirer": { 177 | "version": "6.2.2", 178 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", 179 | "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", 180 | "requires": { 181 | "ansi-escapes": "^3.2.0", 182 | "chalk": "^2.4.2", 183 | "cli-cursor": "^2.1.0", 184 | "cli-width": "^2.0.0", 185 | "external-editor": "^3.0.3", 186 | "figures": "^2.0.0", 187 | "lodash": "^4.17.11", 188 | "mute-stream": "0.0.7", 189 | "run-async": "^2.2.0", 190 | "rxjs": "^6.4.0", 191 | "string-width": "^2.1.0", 192 | "strip-ansi": "^5.0.0", 193 | "through": "^2.3.6" 194 | } 195 | }, 196 | "is-fullwidth-code-point": { 197 | "version": "2.0.0", 198 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 199 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 200 | }, 201 | "is-promise": { 202 | "version": "2.1.0", 203 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 204 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 205 | }, 206 | "jsonfile": { 207 | "version": "4.0.0", 208 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 209 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 210 | "requires": { 211 | "graceful-fs": "^4.1.6" 212 | } 213 | }, 214 | "lodash": { 215 | "version": "4.17.15", 216 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 217 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 218 | }, 219 | "mimic-fn": { 220 | "version": "1.2.0", 221 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 222 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 223 | }, 224 | "minimatch": { 225 | "version": "3.0.4", 226 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 227 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 228 | "requires": { 229 | "brace-expansion": "^1.1.7" 230 | } 231 | }, 232 | "minimist": { 233 | "version": "1.2.0", 234 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 235 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 236 | }, 237 | "mute-stream": { 238 | "version": "0.0.7", 239 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 240 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" 241 | }, 242 | "once": { 243 | "version": "1.4.0", 244 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 245 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 246 | "requires": { 247 | "wrappy": "1" 248 | } 249 | }, 250 | "onetime": { 251 | "version": "2.0.1", 252 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 253 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 254 | "requires": { 255 | "mimic-fn": "^1.0.0" 256 | } 257 | }, 258 | "os-tmpdir": { 259 | "version": "1.0.2", 260 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 261 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 262 | }, 263 | "path-is-absolute": { 264 | "version": "1.0.1", 265 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 266 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 267 | }, 268 | "restore-cursor": { 269 | "version": "2.0.0", 270 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 271 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 272 | "requires": { 273 | "onetime": "^2.0.0", 274 | "signal-exit": "^3.0.2" 275 | } 276 | }, 277 | "run-async": { 278 | "version": "2.3.0", 279 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 280 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 281 | "requires": { 282 | "is-promise": "^2.1.0" 283 | } 284 | }, 285 | "rxjs": { 286 | "version": "6.4.0", 287 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", 288 | "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", 289 | "requires": { 290 | "tslib": "^1.9.0" 291 | } 292 | }, 293 | "safer-buffer": { 294 | "version": "2.1.2", 295 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 296 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 297 | }, 298 | "signal-exit": { 299 | "version": "3.0.2", 300 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 301 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 302 | }, 303 | "sprintf-js": { 304 | "version": "1.0.3", 305 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 306 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 307 | }, 308 | "string-width": { 309 | "version": "2.1.1", 310 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 311 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 312 | "requires": { 313 | "is-fullwidth-code-point": "^2.0.0", 314 | "strip-ansi": "^4.0.0" 315 | }, 316 | "dependencies": { 317 | "strip-ansi": { 318 | "version": "4.0.0", 319 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 320 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 321 | "requires": { 322 | "ansi-regex": "^3.0.0" 323 | } 324 | } 325 | } 326 | }, 327 | "strip-ansi": { 328 | "version": "5.0.0", 329 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", 330 | "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", 331 | "requires": { 332 | "ansi-regex": "^4.0.0" 333 | }, 334 | "dependencies": { 335 | "ansi-regex": { 336 | "version": "4.0.0", 337 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", 338 | "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" 339 | } 340 | } 341 | }, 342 | "supports-color": { 343 | "version": "5.5.0", 344 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 345 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 346 | "requires": { 347 | "has-flag": "^3.0.0" 348 | } 349 | }, 350 | "through": { 351 | "version": "2.3.8", 352 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 353 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 354 | }, 355 | "tmp": { 356 | "version": "0.0.33", 357 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 358 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 359 | "requires": { 360 | "os-tmpdir": "~1.0.2" 361 | } 362 | }, 363 | "tslib": { 364 | "version": "1.9.3", 365 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 366 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" 367 | }, 368 | "universalify": { 369 | "version": "0.1.2", 370 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 371 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 372 | }, 373 | "wrappy": { 374 | "version": "1.0.2", 375 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 376 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 377 | }, 378 | "yamljs": { 379 | "version": "0.3.0", 380 | "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", 381 | "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", 382 | "requires": { 383 | "argparse": "^1.0.7", 384 | "glob": "^7.0.5" 385 | } 386 | } 387 | } 388 | } 389 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "asyngular", 3 | "version": "6.1.1", 4 | "description": "Highly scalable realtime framework with support for async/await", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1" 7 | }, 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/SocketCluster/asyngular.git" 11 | }, 12 | "keywords": [ 13 | "asyngular", 14 | "socketcluster", 15 | "async", 16 | "await", 17 | "realtime" 18 | ], 19 | "author": "Jonathan Gros-Dubois", 20 | "license": "MIT", 21 | "bugs": { 22 | "url": "https://github.com/SocketCluster/asyngular/issues" 23 | }, 24 | "homepage": "https://asyngular.io/", 25 | "dependencies": { 26 | "fs-extra": "^7.0.1", 27 | "inquirer": "^6.2.1", 28 | "minimist": "^1.2.0", 29 | "yamljs": "^0.3.0" 30 | }, 31 | "bin": { 32 | "asyngular": "bin/cli.js" 33 | } 34 | } 35 | --------------------------------------------------------------------------------