├── CHANGELOG.md ├── .gitignore ├── app ├── .npmrc ├── package.json ├── index.js └── package-lock.json ├── docs └── appwrite-graphql-explorer.png ├── docker-compose.yml ├── Dockerfile ├── .travis.yml ├── LICENSE ├── .github └── ISSUE_TEMPLATE │ ├── documantation.yaml │ ├── feature.yaml │ └── bug.yaml └── README.md /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | app/node_modules 3 | -------------------------------------------------------------------------------- /app/.npmrc: -------------------------------------------------------------------------------- 1 | //registry.npmjs.org/:_authToken=${NPM_TOKEN} -------------------------------------------------------------------------------- /docs/appwrite-graphql-explorer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwrite/docker-altair/HEAD/docs/appwrite-graphql-explorer.png -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | graphql-explorer: 5 | container_name: graphql-explorer 6 | build: 7 | context: . 8 | args: 9 | - NPM_TOKEN=${NPM_TOKEN} 10 | restart: unless-stopped 11 | ports: 12 | - '9506:3000' 13 | environment: 14 | - SERVER_URL=http://localhost/v1/graphql -------------------------------------------------------------------------------- /app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "graphql-explorer", 3 | "version": "0.1.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node index.js" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@appwrite.io/altair-express-middleware": "^0.1.0", 14 | "express": "^4.18.1" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:18-alpine3.16 as build 2 | 3 | ARG NPM_TOKEN 4 | ENV NPM_TOKEN=${NPM_TOKEN} 5 | 6 | WORKDIR app 7 | 8 | COPY ./app/.npmrc /app/.npmrc 9 | COPY ./app/package.json /app/package.json 10 | COPY ./app/package-lock.json /app/package-lock.json 11 | 12 | RUN npm install 13 | 14 | FROM node:18-alpine3.16 as final 15 | 16 | WORKDIR app 17 | 18 | COPY --from=build /app/node_modules /app/node_modules 19 | COPY ./app /app 20 | 21 | EXPOSE 3000 22 | 23 | ENTRYPOINT ["npm", "start"] 24 | 25 | -------------------------------------------------------------------------------- /app/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const {altairExpress} = require('@appwrite.io/altair-express-middleware'); 3 | 4 | const app = express(); 5 | 6 | // Mount your altair GraphQL client 7 | app.use('/', altairExpress({ 8 | endpointURL: process.env.SERVER_URL, 9 | initialHeaders: { 10 | "X-Appwrite-Project": "", 11 | }, 12 | initialQuery: `query listContinents { 13 | localeListContinents { 14 | total 15 | continents { 16 | name 17 | code 18 | } 19 | } 20 | }`, 21 | initialSettings: { 22 | "alert.disableWarnings": true, 23 | "schema.reloadOnStart": true, 24 | "request.withCredentials": true, 25 | } 26 | })); 27 | 28 | app.listen(3000, () => { 29 | console.log("GraphQL Explorer listening on port 3000!"); 30 | console.log("Endpoint url: " + process.env.SERVER_URL) 31 | }); -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | os: linux 2 | dist: focal 3 | 4 | language: shell 5 | 6 | services: 7 | - docker 8 | 9 | before_install: 10 | - curl -fsSL https://get.docker.com | sh 11 | - echo '{"experimental":"enabled"}' | sudo tee /etc/docker/daemon.json 12 | - mkdir -p $HOME/.docker 13 | - echo '{"experimental":"enabled"}' | sudo tee $HOME/.docker/config.json 14 | - sudo service docker start 15 | - > 16 | if [ ! -z "${DOCKERHUB_PULL_USERNAME:-}" ]; then 17 | echo "${DOCKERHUB_PULL_PASSWORD}" | docker login --username "${DOCKERHUB_PULL_USERNAME}" --password-stdin 18 | fi 19 | - docker --version 20 | - docker run --rm --privileged linuxkit/binfmt:v0.8 21 | - docker buildx create --use 22 | 23 | script: 24 | - docker ps; docker buildx ls 25 | 26 | deploy: 27 | - provider: script 28 | edge: true 29 | script: docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --build-arg NPM_TOKEN="${NPM_TOKEN}" -t appwrite/altair:$TRAVIS_TAG ./ --push 30 | on: 31 | tags: true -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Appwrite 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 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/documantation.yaml: -------------------------------------------------------------------------------- 1 | name: "📚 Documentation" 2 | description: "Report an issue related to documentation" 3 | title: "📚 Documentation: " 4 | labels: [documentation] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thanks for taking the time to fill out our documentation update request form 🙏 10 | - type: textarea 11 | id: issue-description 12 | validations: 13 | required: true 14 | attributes: 15 | label: "💭 Description" 16 | description: "A clear and concise description of what the issue is." 17 | placeholder: "Documentation should not ..." 18 | - type: checkboxes 19 | id: no-duplicate-issues 20 | attributes: 21 | label: "👀 Have you spent some time to check if this issue has been raised before?" 22 | description: "Have you Googled for a similar issue or checked our older issues for a similar bug?" 23 | options: 24 | - label: "I checked and didn't find similar issue" 25 | required: true 26 | - type: checkboxes 27 | id: read-code-of-conduct 28 | attributes: 29 | label: "🏢 Have you read the Code of Conduct?" 30 | options: 31 | - label: "I have read the [Code of Conduct](https://github.com/appwrite/appwrite/blob/HEAD/CODE_OF_CONDUCT.md)" 32 | required: true 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature.yaml: -------------------------------------------------------------------------------- 1 | name: 🚀 Feature 2 | description: "Submit a proposal for a new feature" 3 | title: "🚀 Feature: " 4 | labels: [feature] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thanks for taking the time to fill out our feature request form 🙏 10 | - type: textarea 11 | id: feature-description 12 | validations: 13 | required: true 14 | attributes: 15 | label: "🔖 Feature description" 16 | description: "A clear and concise description of what the feature is." 17 | placeholder: "You should add ..." 18 | - type: textarea 19 | id: pitch 20 | validations: 21 | required: true 22 | attributes: 23 | label: "🎤 Pitch" 24 | description: "Please explain why this feature should be implemented and how it would be used. Add examples, if applicable." 25 | placeholder: "In my use-case, ..." 26 | - type: checkboxes 27 | id: no-duplicate-issues 28 | attributes: 29 | label: "👀 Have you spent some time to check if this issue has been raised before?" 30 | description: "Have you Googled for a similar issue or checked our older issues for a similar bug?" 31 | options: 32 | - label: "I checked and didn't find similar issue" 33 | required: true 34 | - type: checkboxes 35 | id: read-code-of-conduct 36 | attributes: 37 | label: "🏢 Have you read the Code of Conduct?" 38 | options: 39 | - label: "I have read the [Code of Conduct](https://github.com/appwrite/appwrite/blob/HEAD/CODE_OF_CONDUCT.md)" 40 | required: true 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Docker Altair 2 | 3 | [![Discord](https://img.shields.io/discord/564160730845151244?label=discord&style=flat-square)](https://appwrite.io/discord) 4 | [![Docker Pulls](https://img.shields.io/docker/pulls/appwrite/altair?color=f02e65&style=flat-square)](https://hub.docker.com/r/appwrite/altair) 5 | [![Build Status](https://img.shields.io/travis/com/appwrite/docker-altair?style=flat-square)](https://travis-ci.com/appwrite/docker-altair) 6 | [![Twitter Account](https://img.shields.io/twitter/follow/appwrite_io?color=00acee&label=twitter&style=flat-square)](https://twitter.com/appwrite_io) 7 | [![Follow Appwrite on StackShare](https://img.shields.io/badge/follow%20on-stackshare-blue?style=flat-square)](https://stackshare.io/appwrite) 8 | 9 | A Docker image for the very popular GraphQL explorer by [Altair](https://altair.sirmuel.design/) 🕸 10 | 11 | ![Appwrite GraphQL Explorer](docs/appwrite-graphql-explorer.png) 12 | 13 | ## Getting Started 14 | 15 | These instructions will cover usage information to help your run Altair docker image 16 | 17 | ### Prerequisities 18 | 19 | In order to run this image you'll need docker installed. 20 | 21 | - [Windows](https://docs.docker.com/windows/started) 22 | - [OS X](https://docs.docker.com/mac/started/) 23 | - [Linux](https://docs.docker.com/linux/started/) 24 | 25 | ### Usage 26 | 27 | > **Note** 28 | > To ensure the GraphQL docs load in the explorer, set the `_APP_OPTIONS_ABUSE` variable to `disabled` in your `.env` file. 29 | 30 | ```shell 31 | APPWRITE_ENDPOINT=http://localhost/v1 32 | docker run --rm -p "3000:3000" -e "SERVER_URL=$APPWRITE_ENDPOINT/graphql" appwrite/altair 33 | ``` 34 | 35 | After starting the container, open your browser and browse to [http://localhost:3000/](http://localhost:3000/). 36 | 37 | ### Environment Variables 38 | 39 | This image uses the following Environment Variables 40 | 41 | - **SERVER_URL** - Your GraphQL Server URL 42 | 43 | ### Build / Release 44 | 45 | ``` 46 | docker build --tag appwrite/altair: . 47 | docker push appwrite/altair: 48 | ``` 49 | 50 | Multi-arch build (experimental using [buildx](https://github.com/docker/buildx)): 51 | 52 | ``` 53 | docker buildx create --use 54 | docker buildx build --platform linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/386,linux/ppc64le --tag appwrite/altair: --push . 55 | ``` 56 | 57 | ## Find Us 58 | 59 | - [GitHub](https://github.com/appwrite) 60 | - [Discord](https://appwrite.io/discord) 61 | - [Twitter](https://twitter.com/appwrite_io) 62 | 63 | ## Copyright and license 64 | 65 | The MIT License (MIT) [http://www.opensource.org/licenses/mit-license.php](http://www.opensource.org/licenses/mit-license.php) 66 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug.yaml: -------------------------------------------------------------------------------- 1 | name: "🐛 Bug Report" 2 | description: "Submit a bug report to help us improve" 3 | title: "🐛 Bug Report: " 4 | labels: [bug] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thanks for taking the time to fill out our bug report form 🙏 10 | - type: textarea 11 | id: steps-to-reproduce 12 | validations: 13 | required: true 14 | attributes: 15 | label: "👟 Reproduction steps" 16 | description: "How do you trigger this bug? Please walk us through it step by step." 17 | placeholder: "When I ..." 18 | - type: textarea 19 | id: expected-behavior 20 | validations: 21 | required: true 22 | attributes: 23 | label: "👍 Expected behavior" 24 | description: "What did you think would happen?" 25 | placeholder: "It should ..." 26 | - type: textarea 27 | id: actual-behavior 28 | validations: 29 | required: true 30 | attributes: 31 | label: "👎 Actual Behavior" 32 | description: "What did actually happen? Add screenshots, if applicable." 33 | placeholder: "It actually ..." 34 | - type: dropdown 35 | id: docker-altair-version 36 | attributes: 37 | label: "🎲 Docker Altair version" 38 | description: "What version of Docker Altair are you running?" 39 | options: 40 | - Version 0.1.x 41 | - Different version (specify in environment) 42 | validations: 43 | required: true 44 | - type: dropdown 45 | id: operating-system 46 | attributes: 47 | label: "💻 Operating system" 48 | description: "What OS is your server / device running on?" 49 | options: 50 | - Linux 51 | - MacOS 52 | - Windows 53 | - Something else 54 | validations: 55 | required: true 56 | - type: textarea 57 | id: enviromnemt 58 | validations: 59 | required: false 60 | attributes: 61 | label: "🧱 Your Environment" 62 | description: "Is your environment customized in any way?" 63 | placeholder: "I use Cloudflare for ..." 64 | - type: checkboxes 65 | id: no-duplicate-issues 66 | attributes: 67 | label: "👀 Have you spent some time to check if this issue has been raised before?" 68 | description: "Have you Googled for a similar issue or checked our older issues for a similar bug?" 69 | options: 70 | - label: "I checked and didn't find similar issue" 71 | required: true 72 | - type: checkboxes 73 | id: read-code-of-conduct 74 | attributes: 75 | label: "🏢 Have you read the Code of Conduct?" 76 | options: 77 | - label: "I have read the [Code of Conduct](https://github.com/appwrite/appwrite/blob/HEAD/CODE_OF_CONDUCT.md)" 78 | required: true 79 | -------------------------------------------------------------------------------- /app/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "graphql-explorer", 3 | "version": "0.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "graphql-explorer", 9 | "version": "0.1.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@appwrite.io/altair-express-middleware": "^0.1.0", 13 | "express": "^4.18.1" 14 | } 15 | }, 16 | "node_modules/@appwrite.io/altair-express-middleware": { 17 | "version": "0.1.0", 18 | "resolved": "https://registry.npmjs.org/@appwrite.io/altair-express-middleware/-/altair-express-middleware-0.1.0.tgz", 19 | "integrity": "sha512-7DbLzlyg7WeeBDFGPJl9OjIFPxxqeojYiTGbbS3xqc0ZSPUEGXqnbyHgDJ5sTocbDpjkaU/rc14km31+1JUWxQ==", 20 | "dependencies": { 21 | "@appwrite.io/altair-static": "^0.1.0", 22 | "express": "^4.16.2" 23 | }, 24 | "engines": { 25 | "node": ">= 12" 26 | }, 27 | "funding": { 28 | "type": "opencollective", 29 | "url": "https://opencollective.com/altair" 30 | } 31 | }, 32 | "node_modules/@appwrite.io/altair-static": { 33 | "version": "0.1.0", 34 | "resolved": "https://registry.npmjs.org/@appwrite.io/altair-static/-/altair-static-0.1.0.tgz", 35 | "integrity": "sha512-BE++sjyByECwz5g7sVzNe4dUfv3ZtmWJLiOGm8tMpf1BL5GZyoVaH8yxyUNeSMTZq3iromIkrVtchXESfYgbDg==", 36 | "engines": { 37 | "node": ">= 6.9.1" 38 | }, 39 | "funding": { 40 | "type": "opencollective", 41 | "url": "https://opencollective.com/altair" 42 | } 43 | }, 44 | "node_modules/accepts": { 45 | "version": "1.3.8", 46 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 47 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 48 | "dependencies": { 49 | "mime-types": "~2.1.34", 50 | "negotiator": "0.6.3" 51 | }, 52 | "engines": { 53 | "node": ">= 0.6" 54 | } 55 | }, 56 | "node_modules/array-flatten": { 57 | "version": "1.1.1", 58 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 59 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 60 | }, 61 | "node_modules/body-parser": { 62 | "version": "1.20.0", 63 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", 64 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", 65 | "dependencies": { 66 | "bytes": "3.1.2", 67 | "content-type": "~1.0.4", 68 | "debug": "2.6.9", 69 | "depd": "2.0.0", 70 | "destroy": "1.2.0", 71 | "http-errors": "2.0.0", 72 | "iconv-lite": "0.4.24", 73 | "on-finished": "2.4.1", 74 | "qs": "6.10.3", 75 | "raw-body": "2.5.1", 76 | "type-is": "~1.6.18", 77 | "unpipe": "1.0.0" 78 | }, 79 | "engines": { 80 | "node": ">= 0.8", 81 | "npm": "1.2.8000 || >= 1.4.16" 82 | } 83 | }, 84 | "node_modules/bytes": { 85 | "version": "3.1.2", 86 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 87 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 88 | "engines": { 89 | "node": ">= 0.8" 90 | } 91 | }, 92 | "node_modules/call-bind": { 93 | "version": "1.0.2", 94 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 95 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 96 | "dependencies": { 97 | "function-bind": "^1.1.1", 98 | "get-intrinsic": "^1.0.2" 99 | }, 100 | "funding": { 101 | "url": "https://github.com/sponsors/ljharb" 102 | } 103 | }, 104 | "node_modules/content-disposition": { 105 | "version": "0.5.4", 106 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 107 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 108 | "dependencies": { 109 | "safe-buffer": "5.2.1" 110 | }, 111 | "engines": { 112 | "node": ">= 0.6" 113 | } 114 | }, 115 | "node_modules/content-type": { 116 | "version": "1.0.4", 117 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 118 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 119 | "engines": { 120 | "node": ">= 0.6" 121 | } 122 | }, 123 | "node_modules/cookie": { 124 | "version": "0.5.0", 125 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 126 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 127 | "engines": { 128 | "node": ">= 0.6" 129 | } 130 | }, 131 | "node_modules/cookie-signature": { 132 | "version": "1.0.6", 133 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 134 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 135 | }, 136 | "node_modules/debug": { 137 | "version": "2.6.9", 138 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 139 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 140 | "dependencies": { 141 | "ms": "2.0.0" 142 | } 143 | }, 144 | "node_modules/depd": { 145 | "version": "2.0.0", 146 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 147 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 148 | "engines": { 149 | "node": ">= 0.8" 150 | } 151 | }, 152 | "node_modules/destroy": { 153 | "version": "1.2.0", 154 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 155 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 156 | "engines": { 157 | "node": ">= 0.8", 158 | "npm": "1.2.8000 || >= 1.4.16" 159 | } 160 | }, 161 | "node_modules/ee-first": { 162 | "version": "1.1.1", 163 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 164 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 165 | }, 166 | "node_modules/encodeurl": { 167 | "version": "1.0.2", 168 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 169 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 170 | "engines": { 171 | "node": ">= 0.8" 172 | } 173 | }, 174 | "node_modules/escape-html": { 175 | "version": "1.0.3", 176 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 177 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 178 | }, 179 | "node_modules/etag": { 180 | "version": "1.8.1", 181 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 182 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 183 | "engines": { 184 | "node": ">= 0.6" 185 | } 186 | }, 187 | "node_modules/express": { 188 | "version": "4.18.1", 189 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", 190 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", 191 | "dependencies": { 192 | "accepts": "~1.3.8", 193 | "array-flatten": "1.1.1", 194 | "body-parser": "1.20.0", 195 | "content-disposition": "0.5.4", 196 | "content-type": "~1.0.4", 197 | "cookie": "0.5.0", 198 | "cookie-signature": "1.0.6", 199 | "debug": "2.6.9", 200 | "depd": "2.0.0", 201 | "encodeurl": "~1.0.2", 202 | "escape-html": "~1.0.3", 203 | "etag": "~1.8.1", 204 | "finalhandler": "1.2.0", 205 | "fresh": "0.5.2", 206 | "http-errors": "2.0.0", 207 | "merge-descriptors": "1.0.1", 208 | "methods": "~1.1.2", 209 | "on-finished": "2.4.1", 210 | "parseurl": "~1.3.3", 211 | "path-to-regexp": "0.1.7", 212 | "proxy-addr": "~2.0.7", 213 | "qs": "6.10.3", 214 | "range-parser": "~1.2.1", 215 | "safe-buffer": "5.2.1", 216 | "send": "0.18.0", 217 | "serve-static": "1.15.0", 218 | "setprototypeof": "1.2.0", 219 | "statuses": "2.0.1", 220 | "type-is": "~1.6.18", 221 | "utils-merge": "1.0.1", 222 | "vary": "~1.1.2" 223 | }, 224 | "engines": { 225 | "node": ">= 0.10.0" 226 | } 227 | }, 228 | "node_modules/finalhandler": { 229 | "version": "1.2.0", 230 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 231 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 232 | "dependencies": { 233 | "debug": "2.6.9", 234 | "encodeurl": "~1.0.2", 235 | "escape-html": "~1.0.3", 236 | "on-finished": "2.4.1", 237 | "parseurl": "~1.3.3", 238 | "statuses": "2.0.1", 239 | "unpipe": "~1.0.0" 240 | }, 241 | "engines": { 242 | "node": ">= 0.8" 243 | } 244 | }, 245 | "node_modules/forwarded": { 246 | "version": "0.2.0", 247 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 248 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 249 | "engines": { 250 | "node": ">= 0.6" 251 | } 252 | }, 253 | "node_modules/fresh": { 254 | "version": "0.5.2", 255 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 256 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 257 | "engines": { 258 | "node": ">= 0.6" 259 | } 260 | }, 261 | "node_modules/function-bind": { 262 | "version": "1.1.1", 263 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 264 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 265 | }, 266 | "node_modules/get-intrinsic": { 267 | "version": "1.1.3", 268 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 269 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 270 | "dependencies": { 271 | "function-bind": "^1.1.1", 272 | "has": "^1.0.3", 273 | "has-symbols": "^1.0.3" 274 | }, 275 | "funding": { 276 | "url": "https://github.com/sponsors/ljharb" 277 | } 278 | }, 279 | "node_modules/has": { 280 | "version": "1.0.3", 281 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 282 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 283 | "dependencies": { 284 | "function-bind": "^1.1.1" 285 | }, 286 | "engines": { 287 | "node": ">= 0.4.0" 288 | } 289 | }, 290 | "node_modules/has-symbols": { 291 | "version": "1.0.3", 292 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 293 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 294 | "engines": { 295 | "node": ">= 0.4" 296 | }, 297 | "funding": { 298 | "url": "https://github.com/sponsors/ljharb" 299 | } 300 | }, 301 | "node_modules/http-errors": { 302 | "version": "2.0.0", 303 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 304 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 305 | "dependencies": { 306 | "depd": "2.0.0", 307 | "inherits": "2.0.4", 308 | "setprototypeof": "1.2.0", 309 | "statuses": "2.0.1", 310 | "toidentifier": "1.0.1" 311 | }, 312 | "engines": { 313 | "node": ">= 0.8" 314 | } 315 | }, 316 | "node_modules/iconv-lite": { 317 | "version": "0.4.24", 318 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 319 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 320 | "dependencies": { 321 | "safer-buffer": ">= 2.1.2 < 3" 322 | }, 323 | "engines": { 324 | "node": ">=0.10.0" 325 | } 326 | }, 327 | "node_modules/inherits": { 328 | "version": "2.0.4", 329 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 330 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 331 | }, 332 | "node_modules/ipaddr.js": { 333 | "version": "1.9.1", 334 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 335 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 336 | "engines": { 337 | "node": ">= 0.10" 338 | } 339 | }, 340 | "node_modules/media-typer": { 341 | "version": "0.3.0", 342 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 343 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 344 | "engines": { 345 | "node": ">= 0.6" 346 | } 347 | }, 348 | "node_modules/merge-descriptors": { 349 | "version": "1.0.1", 350 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 351 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 352 | }, 353 | "node_modules/methods": { 354 | "version": "1.1.2", 355 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 356 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 357 | "engines": { 358 | "node": ">= 0.6" 359 | } 360 | }, 361 | "node_modules/mime": { 362 | "version": "1.6.0", 363 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 364 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 365 | "bin": { 366 | "mime": "cli.js" 367 | }, 368 | "engines": { 369 | "node": ">=4" 370 | } 371 | }, 372 | "node_modules/mime-db": { 373 | "version": "1.52.0", 374 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 375 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 376 | "engines": { 377 | "node": ">= 0.6" 378 | } 379 | }, 380 | "node_modules/mime-types": { 381 | "version": "2.1.35", 382 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 383 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 384 | "dependencies": { 385 | "mime-db": "1.52.0" 386 | }, 387 | "engines": { 388 | "node": ">= 0.6" 389 | } 390 | }, 391 | "node_modules/ms": { 392 | "version": "2.0.0", 393 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 394 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 395 | }, 396 | "node_modules/negotiator": { 397 | "version": "0.6.3", 398 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 399 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 400 | "engines": { 401 | "node": ">= 0.6" 402 | } 403 | }, 404 | "node_modules/object-inspect": { 405 | "version": "1.12.2", 406 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 407 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 408 | "funding": { 409 | "url": "https://github.com/sponsors/ljharb" 410 | } 411 | }, 412 | "node_modules/on-finished": { 413 | "version": "2.4.1", 414 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 415 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 416 | "dependencies": { 417 | "ee-first": "1.1.1" 418 | }, 419 | "engines": { 420 | "node": ">= 0.8" 421 | } 422 | }, 423 | "node_modules/parseurl": { 424 | "version": "1.3.3", 425 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 426 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 427 | "engines": { 428 | "node": ">= 0.8" 429 | } 430 | }, 431 | "node_modules/path-to-regexp": { 432 | "version": "0.1.7", 433 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 434 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 435 | }, 436 | "node_modules/proxy-addr": { 437 | "version": "2.0.7", 438 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 439 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 440 | "dependencies": { 441 | "forwarded": "0.2.0", 442 | "ipaddr.js": "1.9.1" 443 | }, 444 | "engines": { 445 | "node": ">= 0.10" 446 | } 447 | }, 448 | "node_modules/qs": { 449 | "version": "6.10.3", 450 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 451 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 452 | "dependencies": { 453 | "side-channel": "^1.0.4" 454 | }, 455 | "engines": { 456 | "node": ">=0.6" 457 | }, 458 | "funding": { 459 | "url": "https://github.com/sponsors/ljharb" 460 | } 461 | }, 462 | "node_modules/range-parser": { 463 | "version": "1.2.1", 464 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 465 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 466 | "engines": { 467 | "node": ">= 0.6" 468 | } 469 | }, 470 | "node_modules/raw-body": { 471 | "version": "2.5.1", 472 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 473 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 474 | "dependencies": { 475 | "bytes": "3.1.2", 476 | "http-errors": "2.0.0", 477 | "iconv-lite": "0.4.24", 478 | "unpipe": "1.0.0" 479 | }, 480 | "engines": { 481 | "node": ">= 0.8" 482 | } 483 | }, 484 | "node_modules/safe-buffer": { 485 | "version": "5.2.1", 486 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 487 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 488 | "funding": [ 489 | { 490 | "type": "github", 491 | "url": "https://github.com/sponsors/feross" 492 | }, 493 | { 494 | "type": "patreon", 495 | "url": "https://www.patreon.com/feross" 496 | }, 497 | { 498 | "type": "consulting", 499 | "url": "https://feross.org/support" 500 | } 501 | ] 502 | }, 503 | "node_modules/safer-buffer": { 504 | "version": "2.1.2", 505 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 506 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 507 | }, 508 | "node_modules/send": { 509 | "version": "0.18.0", 510 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 511 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 512 | "dependencies": { 513 | "debug": "2.6.9", 514 | "depd": "2.0.0", 515 | "destroy": "1.2.0", 516 | "encodeurl": "~1.0.2", 517 | "escape-html": "~1.0.3", 518 | "etag": "~1.8.1", 519 | "fresh": "0.5.2", 520 | "http-errors": "2.0.0", 521 | "mime": "1.6.0", 522 | "ms": "2.1.3", 523 | "on-finished": "2.4.1", 524 | "range-parser": "~1.2.1", 525 | "statuses": "2.0.1" 526 | }, 527 | "engines": { 528 | "node": ">= 0.8.0" 529 | } 530 | }, 531 | "node_modules/send/node_modules/ms": { 532 | "version": "2.1.3", 533 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 534 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 535 | }, 536 | "node_modules/serve-static": { 537 | "version": "1.15.0", 538 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 539 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 540 | "dependencies": { 541 | "encodeurl": "~1.0.2", 542 | "escape-html": "~1.0.3", 543 | "parseurl": "~1.3.3", 544 | "send": "0.18.0" 545 | }, 546 | "engines": { 547 | "node": ">= 0.8.0" 548 | } 549 | }, 550 | "node_modules/setprototypeof": { 551 | "version": "1.2.0", 552 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 553 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 554 | }, 555 | "node_modules/side-channel": { 556 | "version": "1.0.4", 557 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 558 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 559 | "dependencies": { 560 | "call-bind": "^1.0.0", 561 | "get-intrinsic": "^1.0.2", 562 | "object-inspect": "^1.9.0" 563 | }, 564 | "funding": { 565 | "url": "https://github.com/sponsors/ljharb" 566 | } 567 | }, 568 | "node_modules/statuses": { 569 | "version": "2.0.1", 570 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 571 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 572 | "engines": { 573 | "node": ">= 0.8" 574 | } 575 | }, 576 | "node_modules/toidentifier": { 577 | "version": "1.0.1", 578 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 579 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 580 | "engines": { 581 | "node": ">=0.6" 582 | } 583 | }, 584 | "node_modules/type-is": { 585 | "version": "1.6.18", 586 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 587 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 588 | "dependencies": { 589 | "media-typer": "0.3.0", 590 | "mime-types": "~2.1.24" 591 | }, 592 | "engines": { 593 | "node": ">= 0.6" 594 | } 595 | }, 596 | "node_modules/unpipe": { 597 | "version": "1.0.0", 598 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 599 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 600 | "engines": { 601 | "node": ">= 0.8" 602 | } 603 | }, 604 | "node_modules/utils-merge": { 605 | "version": "1.0.1", 606 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 607 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 608 | "engines": { 609 | "node": ">= 0.4.0" 610 | } 611 | }, 612 | "node_modules/vary": { 613 | "version": "1.1.2", 614 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 615 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 616 | "engines": { 617 | "node": ">= 0.8" 618 | } 619 | } 620 | } 621 | } 622 | --------------------------------------------------------------------------------