├── .editorconfig ├── .env.example ├── .gitignore ├── Readme.md ├── confs ├── pump.env ├── tyk.env └── tyk_analytics.env ├── docker-compose.yml ├── integrations ├── custom-middleware │ ├── go-ip-based-ratelimiter │ │ ├── Dockerfile │ │ ├── Readme.md │ │ ├── docker-compose.yml │ │ └── src │ │ │ ├── go.mod │ │ │ └── main.go │ └── js-ip-based-ratelimiter │ │ ├── Readme.md │ │ ├── docker-compose.yml │ │ └── src │ │ └── middleware │ │ └── ipRateLimiter.js ├── databases │ ├── elasticache-redis-cluster │ │ ├── Readme.md │ │ └── docker-compose.yml │ └── postgres │ │ ├── Readme.md │ │ └── docker-compose.yml ├── deployments │ └── aci │ │ ├── Readme.md │ │ └── docker-compose.aci.yml ├── portal │ └── custom-templates │ │ ├── Readme.md │ │ ├── docker-compose.yml │ │ └── src │ │ └── customTemplate.html ├── pumps │ ├── csv │ │ ├── .gitignore │ │ ├── Readme.md │ │ ├── default │ │ │ └── .gitignore │ │ └── docker-compose.yml │ ├── datadog │ │ ├── Readme.md │ │ └── docker-compose.yml │ └── prometheus │ │ ├── Dockerfile │ │ ├── Readme.md │ │ ├── confs │ │ └── prometheus.yml │ │ └── docker-compose.yml ├── security │ ├── hmac-upstream │ │ ├── Dockerfile │ │ ├── Readme.md │ │ ├── docker-compose.yml │ │ └── src │ │ │ ├── index.js │ │ │ ├── package-lock.json │ │ │ └── package.json │ └── tyk-ssl │ │ ├── Readme.md │ │ ├── certs │ │ └── tyk.local.ext │ │ ├── confs │ │ ├── tyk.conf │ │ └── tyk_analytics.conf │ │ └── docker-compose.yml └── services │ ├── apollo-server │ ├── Dockerfile │ ├── Readme.md │ ├── docker-compose.yml │ └── src │ │ ├── index.js │ │ ├── package-lock.json │ │ └── package.json │ └── express-js │ ├── Dockerfile │ ├── Readme.md │ ├── docker-compose.yml │ └── src │ ├── index.js │ ├── package-lock.json │ └── package.json └── tyk-dashboard ├── Dockerfile └── scripts ├── init.sh └── wait-for-it.sh /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.{yml,json}] 12 | indent_style = space 13 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # Bootstrap Data 2 | ## Tyk License 3 | TYK_LICENSE_KEY= 4 | 5 | ## Organization 6 | ORG=Tyk Technologies 7 | SLUG=tyk 8 | 9 | ## User 10 | EMAIL=demo@tyk.io 11 | FIRST=Demo 12 | LAST=User 13 | PASSWORD=topsecretpassword 14 | 15 | # Hosts and Ports 16 | ## Dashboard 17 | DASHBOARD_PROTOCOL=http 18 | DASHBOARD_HOST=tyk-dashboard 19 | DASHBOARD_PORT=3000 20 | DASHBOARD_MACHINE_PORT=3000 21 | 22 | ## Gateway 23 | GATEWAY_PROTOCOL=http 24 | GATEWAY_HOST=tyk-gateway 25 | GATEWAY_HOSTNAME=localhost 26 | GATEWAY_PORT=8080 27 | GATEWAY_MACHINE_PORT=8080 28 | 29 | ## Redis 30 | REDIS_HOST=tyk-redis 31 | REDIS_PORT=6379 32 | REDIS_MACHINE_PORT=6379 33 | REDIS_CLUSTER_CONF_ENDPOINT= 34 | REDIS_USE_SSL=false 35 | 36 | ## Mongo 37 | MONGO_HOST=tyk-mongo 38 | MONGO_PORT=27017 39 | MONGO_MACHINE_PORT=27017 40 | 41 | ## Postgres 42 | POSTGRES_HOST=tyk-postgres 43 | POSTGRES_MACHINE_PORT=5432 44 | POSTGRES_PORT=5432 45 | POSTGRES_USER=default 46 | POSTGRES_PASSWORD=topsecretpassword 47 | 48 | # PUMPS 49 | ## Datadog 50 | DATADOG_API_KEY= 51 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/.DS_Store 2 | **/.env 3 | **/*.html 4 | !**/src/customTemplate.html 5 | **/*.pem 6 | **/*.key 7 | **/*.csr 8 | **/*.crt 9 | **/.idea 10 | **/vendor 11 | **/*.sum 12 | **/*.so 13 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # Tyk Pro Docker Demos Repo 2 | A repo for Tyk Pro with different platforms demos. 3 | 4 | ## Requirements 5 | 1. [Tyk Pro](https://pages.tyk.io/en/sign-up-for-tyk-on-prem-licence) trial license key. 6 | 2. [Docker](https://docs.docker.com/get-docker/). 7 | 8 | ## Getting Started 9 | 1. Clone repo and navigate to the repo directory. 10 | 2. Copy `.env.example` into `.env` and fill the `TYK_LICENSE_KEY` value with the Tyk license key. 11 | 3. Run docker-compose using the following command `docker-compose -f docker-compose.yml up`.
12 | **NOTE:** This will only run the Tyk Pro services. If you want to run any of the other integrations please check out the readme file inside their respective folders. 13 | 4. Navigate to [http://localhost:3000](http://localhost:3000) in your browser to access the Tyk Dashboard, and login with the email and password in `.env` 14 | 15 | ## Integrations 16 | - Databases `integrations/custom-middleware` 17 | - **IP rate-limiter with GO** `/go-ip-based-ratelimiter` 18 | - **IP rate-limiter with JS** `/js-ip-based-ratelimiter` 19 | 20 | - Databases `integrations/databases` 21 | - **ElastiCache Redis Cluster** `/elasticache-redis-cluster` 22 | - **Postgres** `/postgres` 23 | 24 | - Deployments `integrations/deployments` 25 | - **ACI** `/aci` 26 | 27 | - Portal `integrations/portal` 28 | - **Custom Templates** `/custom-templates` 29 | 30 | - Pumps `integrations/pumps` 31 | - **CSV** `/csv` 32 | - **Datadog** `/datadog` 33 | - **Prometheus** `/prometheus` 34 | 35 | - Security `integrations/security` 36 | - **HMAC Upstream** `/hmac-upstream` 37 | - **Internal Auth** `/internal-auth` 38 | - **Tyk self-signed certs SSL Setup** `/tyk-ssl` 39 | 40 | - Services `integrations/services` 41 | - **Express.js** `/express-js` 42 | -------------------------------------------------------------------------------- /confs/pump.env: -------------------------------------------------------------------------------- 1 | TYK_PMP_OMITCONFIGFILE=true 2 | 3 | TYK_PMP_ANALYTICSSTORAGETYPE=redis 4 | TYK_PMP_ANALYTICSSTORAGECONFIG_TYPE=redis 5 | TYK_PMP_ANALYTICSSTORAGECONFIG_HOSTS= 6 | TYK_PMP_ANALYTICSSTORAGECONFIG_USERNAME= 7 | TYK_PMP_ANALYTICSSTORAGECONFIG_PASSWORD= 8 | TYK_PMP_ANALYTICSSTORAGECONFIG_DATABASE=0 9 | TYK_PMP_ANALYTICSSTORAGECONFIG_MAXIDLE=100 10 | TYK_PMP_ANALYTICSSTORAGECONFIG_MAXACTIVE=100 11 | TYK_PMP_ANALYTICSSTORAGECONFIG_ENABLECLUSTER=false 12 | TYK_PMP_PURGEDELAY=2 13 | 14 | TYK_PMP_PUMPS_MONGO_TYPE=mongo 15 | TYK_PMP_PUMPS_MONGO_META_COLLECTIONNAME=tyk_analytics 16 | TYK_PMP_PUMPS_MONGO_META_MAXINSERTBATCHSIZEBYTES=80000 17 | TYK_PMP_PUMPS_MONGO_META_MAXDOCUMENTSIZEBYTES=20112 18 | 19 | TYK_PMP_PUMPS_MONGOAGG_TYPE=mongo-pump-aggregate 20 | TYK_PMP_PUMPS_MONGOAGG_META_USEMIXEDCOLLECTION=true 21 | 22 | TYK_PMP_UPTIMEPUMPCONFIG_COLLECTIONNAME=tyk_uptime_analytics 23 | TYK_PMP_UPTIMEPUMPCONFIG_MAXINSERTBATCHSIZEBYTES=500000 24 | TYK_PMP_UPTIMEPUMPCONFIG_MAXDOCUMENTSIZEBYTES=200000 25 | TYK_PMP_DONTPURGEUPTIMEDATA=false 26 | -------------------------------------------------------------------------------- /confs/tyk.env: -------------------------------------------------------------------------------- 1 | TYK_GW_LISTENADDRESS= 2 | TYK_GW_SECRET=352d20ee67be67f6340b4c0605b044b7 3 | TYK_GW_TEMPLATEPATH=/opt/tyk-gateway/templates 4 | TYK_GW_MIDDLEWAREPATH=/opt/tyk-gateway/middleware 5 | TYK_GW_NODESECRET=352d20ee67be67f6340b4c0605b044b7 6 | TYK_GW_POLICIES_POLICYSOURCE=service 7 | TYK_GW_POLICIES_POLICYRECORDNAME=tyk_policies 8 | TYK_GW_POLICIES_ALLOWEXPLICITPOLICYID=true 9 | TYK_GW_USEDBAPPCONFIGS=true 10 | TYK_GW_APPPATH=/opt/tyk-gateway/apps 11 | TYK_GW_STORAGE_TYPE=redis 12 | TYK_GW_STORAGE_HOSTS= 13 | TYK_GW_STORAGE_USERNAME= 14 | TYK_GW_STORAGE_PASSWORD= 15 | TYK_GW_STORAGE_DATABASE=0 16 | TYK_GW_STORAGE_MAXIDLE=2000 17 | TYK_GW_STORAGE_MAXACTIVE=4000 18 | TYK_GW_ENABLEANALYTICS=true 19 | TYK_GW_ANALYTICSCONFIG_TYPE=mongo 20 | TYK_GW_ANALYTICSCONFIG_NORMALISEURLS_ENABLED=true 21 | TYK_GW_ANALYTICSCONFIG_NORMALISEURLS_NORMALISEUUIDS=true 22 | TYK_GW_ANALYTICSCONFIG_NORMALISEURLS_NORMALISENUMBERS=true 23 | TYK_GW_ALLOWMASTERKEYS=false 24 | TYK_GW_HASHKEYS=true 25 | TYK_GW_HASHKEYFUNCTION=murmur64 26 | TYK_GW_SUPPRESSREDISSIGNALRELOAD=false 27 | TYK_GW_SUPRESSDEFAULTORGSTORE=false 28 | TYK_GW_USEREDISLOG=true 29 | TYK_GW_ENFORCEORGDATAAGE=true 30 | TYK_GW_ENFORCEORGQUOTAS=true 31 | TYK_GW_ENABLENONTRANSACTIONALRATELIMITER=true 32 | TYK_GW_MONITOR_GLOBALTRIGGERLIMIT=0 33 | TYK_GW_DISABLEVIRTUALPATHBLOBS=false 34 | TYK_GW_LOCALSESSIONCACHE_DISABLECACHESESSIONSTATE=true 35 | TYK_GW_HTTPSERVEROPTIONS_USESSL=false 36 | TYK_GW_HTTPSERVEROPTIONS_USELE_SSL=false 37 | TYK_GW_HTTPSERVEROPTIONS_ENABLEWEBSOCKETS=true 38 | TYK_GW_ENABLECUSTOMDOMAINS=true 39 | TYK_GW_ENABLEJSVM=true 40 | TYK_GW_PIDFILELOCATION=./tyk-gateway.pid 41 | TYK_GW_ALLOWINSECURECONFIGS=true 42 | TYK_GW_ALLOWREMOTECONFIG=true 43 | TYK_GW_MAXIDLECONNSPERHOST=500 44 | 45 | # Uptime Tests 46 | TYK_GW_UPTIMETESTS_DISABLE=false 47 | TYK_GW_UPTIMETESTS_POLLERGROUP="" 48 | TYK_GW_UPTIMETESTS_CONFIG_FAILURETRIGGERSAMPLESIZE=3 49 | TYK_GW_UPTIMETESTS_CONFIG_TIMEWAIT=60 50 | TYK_GW_UPTIMETESTS_CONFIG_CHECKERPOOLSIZE=50 51 | TYK_GW_UPTIMETESTS_CONFIG_ENABLEUPTIMEANALYTICS=true 52 | 53 | # Enable key operations 54 | TYK_DB_ENABLEDELETEKEYBYHASH=true 55 | TYK_DB_ENABLEUPDATEKEYBYHASH=true 56 | TYK_DB_ENABLEHASHEDKEYSLISTING=true 57 | -------------------------------------------------------------------------------- /confs/tyk_analytics.env: -------------------------------------------------------------------------------- 1 | TYK_DB_TYKAPI_SECRET=352d20ee67be67f6340b4c0605b044b7 2 | TYK_DB_PAGESIZE=10 3 | TYK_DB_ADMINSECRET=12345 4 | TYK_DB_NODESECRET=352d20ee67be67f6340b4c0605b044b7 5 | TYK_DB_REDISPASSWORD= 6 | TYK_DB_FORCEAPIDEFAULTS=false 7 | TYK_DB_NOTIFYONCHANGE=true 8 | TYK_DB_REDISDATABASE=0 9 | TYK_DB_HASHKEYS=true 10 | TYK_DB_HIDELISTENPATH=false 11 | TYK_DB_USESENTRY=false 12 | TYK_DB_ENABLEDUPLICATESLUGS=true 13 | TYK_DB_HOSTCONFIG_DISABLEORGSLUGPREFIX=true 14 | TYK_DB_SHOWORGID=true 15 | TYK_DB_HOSTCONFIG_ENABLEHOSTNAMES=true 16 | TYK_DB_HOSTCONFIG_DISABLEORGSLUGPREFIX=true 17 | TYK_DB_HOSTCONFIG_PORTALROOTPATH=/portal 18 | TYK_DB_HOSTCONFIG_USESTRICT=false 19 | TYK_DB_UI_HIDEHELP=true 20 | TYK_DB_HOMEDIR=/opt/tyk-dashboard 21 | TYK_DB_USESHARDEDANLAYTICS=false 22 | TYK_DB_ENABLEAGGREGATELOOKUPS=true 23 | TYK_DB_AGGREGATELOOKUPCUTOFF=26/05/2016 24 | TYK_DB_ALLOWEXPLICITPOLICYID=true 25 | TYK_DB_OAUTHREDIRECTURISEPARATOR=; 26 | TYK_DB_ENABLEOWNERSHIP=true 27 | TYK_DB_ENABLEUPDATEKEYBYHASH=true 28 | 29 | # Enable key operations 30 | TYK_GW_ENABLEHASHEDKEYSLISTING=true 31 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | services: 3 | tyk-dashboard: 4 | build: 5 | context: . 6 | dockerfile: ./tyk-dashboard/Dockerfile 7 | 8 | container_name: tyk-dashboard 9 | 10 | environment: 11 | - TYK_DB_LICENSEKEY=${TYK_LICENSE_KEY} 12 | - TYK_DB_LISTENPORT=${DASHBOARD_PORT} 13 | - TYK_DB_TYKAPI_HOST=${GATEWAY_PROTOCOL}://${GATEWAY_HOST} 14 | - TYK_DB_TYKAPI_PORT=${GATEWAY_PORT} 15 | - TYK_DB_HOSTCONFIG_HOSTNAME=${GATEWAY_HOST} 16 | - TYK_DB_HOSTCONFIG_GATEWAYHOSTNAME=${GATEWAY_HOSTNAME}:${GATEWAY_PORT} 17 | - TYK_DB_REDISHOST=${REDIS_HOST} 18 | - TYK_DB_REDISPORT=${REDIS_PORT} 19 | - TYK_DB_REDISUSESSL=${REDIS_USE_SSL} 20 | - TYK_DB_STORAGE_MAIN_TYPE=mongo 21 | - TYK_DB_STORAGE_MAIN_CONNECTIONSTRING=mongodb://${MONGO_HOST}:${MONGO_PORT}/tyk_analytics 22 | - ORG=${ORG} 23 | - SLUG=${SLUG} 24 | - EMAIL=${EMAIL} 25 | - FIRST=${FIRST} 26 | - LAST=${LAST} 27 | - PASSWORD=${PASSWORD} 28 | 29 | env_file: 30 | - ./confs/tyk_analytics.env 31 | 32 | ports: 33 | - "${DASHBOARD_MACHINE_PORT}:${DASHBOARD_PORT}" 34 | 35 | networks: 36 | - tyk 37 | 38 | tyk-gateway: 39 | image: tykio/tyk-gateway:v4.0.0-rc18 40 | container_name: tyk-gateway 41 | 42 | environment: 43 | - TYK_GW_LISTENPORT=${GATEWAY_PORT} 44 | - TYK_GW_POLICIES_POLICYCONNECTIONSTRING=${DASHBOARD_PROTOCOL}://${DASHBOARD_HOST}:${DASHBOARD_PORT} 45 | - TYK_GW_DBAPPCONFOPTIONS_CONNECTIONSTRING=${DASHBOARD_PROTOCOL}://${DASHBOARD_HOST}:${DASHBOARD_PORT} 46 | - TYK_GW_STORAGE_HOST=${REDIS_HOST} 47 | - TYK_GW_STORAGE_PORT=${REDIS_PORT} 48 | - TYK_GW_STORAGE_ENABLECLUSTER=false 49 | - TYK_GW_STORAGE_USESSL=${REDIS_USE_SSL} 50 | 51 | env_file: 52 | - ./confs/tyk.env 53 | 54 | ports: 55 | - "${GATEWAY_MACHINE_PORT}:${GATEWAY_PORT}" 56 | 57 | networks: 58 | - tyk 59 | 60 | tyk-pump: 61 | image: tykio/tyk-pump-docker-pub:v1.5.1-rc3 62 | container_name: tyk-pump 63 | 64 | environment: 65 | - TYK_PMP_ANALYTICSSTORAGECONFIG_HOST=${REDIS_HOST} 66 | - TYK_PMP_ANALYTICSSTORAGECONFIG_PORT=${REDIS_PORT} 67 | - TYK_PMP_ANALYTICSSTORAGECONFIG_REDISUSESSL=${REDIS_USE_SSL} 68 | - TYK_PMP_PUMPS_MONGO_META_MONGOURL=mongodb://${MONGO_HOST}:${MONGO_PORT}/tyk_analytics 69 | - TYK_PMP_PUMPS_MONGOAGG_META_MONGOURL=mongodb://${MONGO_HOST}:${MONGO_PORT}/tyk_analytics 70 | - TYK_PMP_UPTIMEPUMPCONFIG_MONGOURL=mongodb://${MONGO_HOST}:${MONGO_PORT}/tyk_analytics 71 | 72 | env_file: 73 | - ./confs/pump.env 74 | 75 | networks: 76 | - tyk 77 | 78 | tyk-redis: 79 | image: redis 80 | container_name: tyk-redis 81 | 82 | ports: 83 | - "${REDIS_MACHINE_PORT}:${REDIS_PORT}" 84 | 85 | volumes: 86 | - redis-data:/data 87 | 88 | networks: 89 | - tyk 90 | 91 | tyk-mongo: 92 | image: mongo:3.2 93 | container_name: tyk-mongo 94 | 95 | command: ["mongod", "--smallfiles"] 96 | 97 | ports: 98 | - "${MONGO_MACHINE_PORT}:${MONGO_PORT}" 99 | 100 | volumes: 101 | - mongo-data:/data/db 102 | 103 | networks: 104 | - tyk 105 | 106 | networks: 107 | tyk: 108 | 109 | volumes: 110 | redis-data: 111 | mongo-data: 112 | -------------------------------------------------------------------------------- /integrations/custom-middleware/go-ip-based-ratelimiter/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.15.15 2 | 3 | MAINTAINER Zaid Albirawi 4 | 5 | WORKDIR /go/ipRateLimiter/ 6 | 7 | ENTRYPOINT go mod tidy && go mod vendor 8 | -------------------------------------------------------------------------------- /integrations/custom-middleware/go-ip-based-ratelimiter/Readme.md: -------------------------------------------------------------------------------- 1 | ## Getting Started 2 | 3 | ### Compile Go Plugin 4 | 1. Run the following command to build the go docker container: ```docker build ./integrations/custom-middleware/go-ip-based-ratelimiter/ -t go-ip-limiter-plugin``` 5 | 6 | 2. Run the following command to allow go to install all the plugin dependencies: ```docker run --rm -v `pwd`/integrations/custom-middleware/go-ip-based-ratelimiter/src/:/go/ipRateLimiter/ go-ip-limiter-plugin``` 7 | 8 | 3. Compile plugin to `integrations/custom-middleware/go-ip-based-ratelimiter/sec/ipRateLimiter.so`: ```docker run --rm -v `pwd`/integrations/custom-middleware/go-ip-based-ratelimiter/src/:/plugin-source tykio/tyk-plugin-compiler:v4.0.0-rc18 ipRateLimiter.so``` 9 | 10 | ### Run plugin with Tyk 11 | 1. Run docker-compose from the repo root using the following command `docker-compose -f docker-compose.yml -f integrations/custom-middleware/go-ip-based-ratelimiter/docker-compose.yml up`. 12 | 13 | 2. Add the following to your API definition: 14 | 15 | ``` 16 | "custom_middleware": { 17 | "pre": [ 18 | { 19 | "name": "IPRateLimiter", 20 | "path": "/etc/middleware/ipRateLimiter.so", 21 | "require_session": false, 22 | "raw_body_only": false 23 | } 24 | ], 25 | "driver": "goplugin", 26 | ``` 27 | 28 | 3. Make sure `Authentication mode` is set to `Authentication Token` and `Auth Key Header Name` is set to `Authorization` in your API. 29 | 30 | 4. Sample request: `curl localhost:8080/hello-tyk/get` 31 | -------------------------------------------------------------------------------- /integrations/custom-middleware/go-ip-based-ratelimiter/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | services: 3 | 4 | tyk-gateway: 5 | volumes: 6 | - ./integrations/custom-middleware/go-ip-based-ratelimiter/src/ipRateLimiter.so:/etc/middleware/ipRateLimiter.so 7 | -------------------------------------------------------------------------------- /integrations/custom-middleware/go-ip-based-ratelimiter/src/go.mod: -------------------------------------------------------------------------------- 1 | module tyk_plugin 2 | 3 | go 1.15 4 | 5 | replace github.com/jensneuse/graphql-go-tools => github.com/TykTechnologies/graphql-go-tools v1.6.2-0.20210909091849-83a2f375a915 6 | 7 | require github.com/TykTechnologies/tyk v1.9.2-0.20211222101640-1e5f755b02b4 8 | -------------------------------------------------------------------------------- /integrations/custom-middleware/go-ip-based-ratelimiter/src/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/base64" 5 | "encoding/json" 6 | "fmt" 7 | "net/http" 8 | 9 | "github.com/TykTechnologies/tyk/config" 10 | "github.com/TykTechnologies/tyk/ctx" 11 | "github.com/TykTechnologies/tyk/log" 12 | "github.com/TykTechnologies/tyk/request" 13 | "github.com/TykTechnologies/tyk/storage" 14 | "github.com/TykTechnologies/tyk/user" 15 | ) 16 | 17 | var logger = log.Get() 18 | 19 | func IPRateLimiter(rw http.ResponseWriter, r *http.Request) { 20 | // Connect to Redis using the prefix "apikey-" 21 | store := &storage.RedisCluster{KeyPrefix: "apikey-", HashKeys: config.Global().HashKeys} 22 | 23 | if !store.Connect() { 24 | logger.Error("Could not connect to storage") 25 | rw.WriteHeader(http.StatusInternalServerError) 26 | return 27 | } 28 | 29 | requestedAPI := ctx.GetDefinition(r) 30 | if requestedAPI == nil { 31 | logger.Error("Could not get API Definition") 32 | rw.WriteHeader(http.StatusInternalServerError) 33 | return 34 | } 35 | 36 | // Get the IP address 37 | realIp := request.RealIP(r) 38 | orgId := requestedAPI.OrgID 39 | apiId := requestedAPI.APIID 40 | 41 | // Set auth header 42 | r.Header.Add("Authorization", realIp) 43 | logger.Debug("Setting Authorization to ", realIp) 44 | 45 | ipSession := &user.SessionState{ 46 | OrgID: orgId, 47 | Alias: "ip-session-" + realIp, 48 | Rate: 2, 49 | Per: 60, 50 | AccessRights: map[string]user.AccessDefinition{ 51 | apiId: { 52 | APIID: apiId, 53 | }, 54 | }, 55 | } 56 | 57 | jsonKey := fmt.Sprintf(`{"org":"%s","id":"%s","h":"%s"}`, orgId, realIp, config.Global().HashKeyFunction) 58 | lookupKey := base64.StdEncoding.EncodeToString([]byte(jsonKey)) 59 | 60 | j, err := json.Marshal(ipSession) 61 | if err != nil { 62 | logger.Error("Could not marshal SessionState.") 63 | rw.WriteHeader(http.StatusInternalServerError) 64 | return 65 | } 66 | 67 | err = store.SetKey(lookupKey, string(j), 0) 68 | if err != nil { 69 | logger.Error("Could not store key.") 70 | rw.WriteHeader(http.StatusInternalServerError) 71 | return 72 | } 73 | } 74 | 75 | func init() { 76 | logger.Info("IP rate limiter GO initialised") 77 | } 78 | 79 | func main() {} 80 | -------------------------------------------------------------------------------- /integrations/custom-middleware/js-ip-based-ratelimiter/Readme.md: -------------------------------------------------------------------------------- 1 | ## Getting Started 2 | 1. Set the `APIID` and `ORGID` values inside `integrations/custom-middleware/js-ip-based-ratelimiter/src/middleware/ipRateLimiter.js`. 3 | 4 | 2. Run docker-compose from the repo root using the following command `docker-compose -f docker-compose.yml -f integrations/custom-middleware/js-ip-based-ratelimiter/docker-compose.yml up`. 5 | 6 | 3. Add the following to your API definition: 7 | 8 | ``` 9 | "custom_middleware": { 10 | "pre": [ 11 | { 12 | "name": "ipRateLimiter", 13 | "path": "/etc/middleware/ipRateLimiter.js", 14 | "require_session": false, 15 | "raw_body_only": false 16 | } 17 | ], 18 | ``` 19 | 20 | 4. Make sure `Authentication mode` is set to `Authentication Token` and `Auth Key Header Name` is set to `Authorization` in your API. 21 | 22 | 5. Add `X-Real-Ip` as a header to your request. Sample request: `curl localhost:8080/hello-tyk/get -H "X-Real-Ip:127.0.0.1"` 23 | -------------------------------------------------------------------------------- /integrations/custom-middleware/js-ip-based-ratelimiter/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | services: 3 | 4 | tyk-gateway: 5 | volumes: 6 | - ./integrations/custom-middleware/js-ip-based-ratelimiter/src/middleware/ipRateLimiter.js:/etc/middleware/ipRateLimiter.js 7 | -------------------------------------------------------------------------------- /integrations/custom-middleware/js-ip-based-ratelimiter/src/middleware/ipRateLimiter.js: -------------------------------------------------------------------------------- 1 | var APIID = "32d22e9e96714a054daf44b769a6c3aa" 2 | var ORGID = "61c21e11d27113000a05f985" 3 | 4 | var ipRateLimiter = new TykJS.TykMiddleware.NewMiddleware({}); 5 | 6 | ipRateLimiter.NewProcessRequest(function (request) { 7 | // Get the IP address 8 | var realIp = request.Headers["X-Real-Ip"][0]; 9 | 10 | // Set auth header 11 | request.SetHeaders["Authorization"] = realIp; 12 | 13 | var keyDetails = { 14 | "rate": 2, 15 | "per": 60, 16 | "alias": "ip-session-" + realIp, 17 | "access_rights": {}, 18 | "org_id": ORGID 19 | } 20 | keyDetails["access_rights"][APIID] = { "api_id": APIID } 21 | 22 | TykSetKeyData(realIp, JSON.stringify(keyDetails), 1) 23 | 24 | return ipRateLimiter.ReturnData(request); 25 | }); 26 | 27 | // Ensure init with a post-declaration log message 28 | log("IP rate limiter JS initialised"); 29 | -------------------------------------------------------------------------------- /integrations/databases/elasticache-redis-cluster/Readme.md: -------------------------------------------------------------------------------- 1 | ## Requirements 2 | 1. [ElastiCache](https://aws.amazon.com/elasticache/) Redis cluster configuration endpoint. 3 | 2. [EC2](https://aws.amazon.com/ec2/) instance with [Docker](https://www.docker.com/) installed. 4 | 5 | **This can only be run on EC2.** Please see [Accessing ElastiCache](https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/accessing-elasticache.html) for more information. 6 | 7 | ## Getting Started 8 | 1. Initilaize `REDIS_CLUSTER_CONF_ENDPOINT`, and `DASHBOARD_HOST`/`GATEWAY_HOST` with the ElastiCache Redis cluster configuration endpoint and EC2 instances public IPv4 DNS respectively by running the `scripts/init.sh` script in the repo root. 9 | 2. Run docker-compose from the repo root using the following command `docker-compose -f docker-compose.yml -f integrations/databases/elasticache-redis-cluster/docker-compose.yml up`. 10 | 3. Access Tyk on EC2 instance. 11 | 12 | **Optional**: enable SSL on the ElastiCache communication by setting the `REDIS_USE_SSL` to `true` 13 | -------------------------------------------------------------------------------- /integrations/databases/elasticache-redis-cluster/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | services: 3 | tyk-dashboard: 4 | environment: 5 | - TYK_DB_ENABLECLUSTER=true 6 | - TYK_DB_REDISADDRS=${REDIS_CLUSTER_CONF_ENDPOINT} 7 | 8 | tyk-gateway: 9 | environment: 10 | - TYK_GW_STORAGE_ENABLECLUSTER=true 11 | - TYK_GW_STORAGE_ADDRS=${REDIS_CLUSTER_CONF_ENDPOINT} 12 | 13 | tyk-pump: 14 | environment: 15 | - TYK_PMP_ANALYTICSSTORAGECONFIG_ENABLECLUSTER=true 16 | - TYK_PMP_ANALYTICSSTORAGECONFIG_ADDRS=${REDIS_CLUSTER_CONF_ENDPOINT} 17 | 18 | tyk-redis: 19 | entrypoint: ["echo", "Docker Redis service disabled. Using Elastic Cache service instead."] 20 | -------------------------------------------------------------------------------- /integrations/databases/postgres/Readme.md: -------------------------------------------------------------------------------- 1 | ## Getting Started 2 | 1. Run docker-compose from the repo root using the following command `docker-compose -f docker-compose.yml -f integrations/databases/postgres/docker-compose.yml up`. 3 | 2. Navigate to [http://localhost:3000](http://localhost:3000) in your browser to access the Tyk Dashboard. 4 | -------------------------------------------------------------------------------- /integrations/databases/postgres/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | services: 3 | tyk-dashboard: 4 | environment: 5 | - TYK_DB_STORAGE_MAIN_TYPE=postgres 6 | - TYK_DB_STORAGE_MAIN_CONNECTIONSTRING=user=${POSTGRES_USER} password=${POSTGRES_PASSWORD} host=${POSTGRES_HOST} port=${POSTGRES_PORT} database=tyk_analytics 7 | tyk-pump: 8 | environment: 9 | - TYK_PMP_UPTIMEPUMPCONFIG_UPTIMETYPE=sql 10 | - TYK_PMP_UPTIMEPUMPCONFIG_TYPE=postgres 11 | - TYK_PMP_UPTIMEPUMPCONFIG_CONNECTIONSTRING=user=${POSTGRES_USER} password=${POSTGRES_PASSWORD} host=${POSTGRES_HOST} port=${POSTGRES_PORT} database=tyk_analytics 12 | 13 | - TYK_PMP_PUMPS_SQL_TYPE=SQL 14 | - TYK_PMP_PUMPS_SQL_META_TYPE=postgres 15 | - TYK_PMP_PUMPS_SQL_META_CONNECTIONSTRING=user=${POSTGRES_USER} password=${POSTGRES_PASSWORD} host=${POSTGRES_HOST} port=${POSTGRES_PORT} database=tyk_analytics 16 | 17 | - TYK_PMP_PUMPS_SQLAGGREGATE_TYPE=SQL 18 | - TYK_PMP_PUMPS_SQLAGGREGATE_META_TYPE=postgres 19 | - TYK_PMP_PUMPS_SQLAGGREGATE_META_CONNECTIONSTRING=user=${POSTGRES_USER} password=${POSTGRES_PASSWORD} host=${POSTGRES_HOST} port=${POSTGRES_PORT} database=tyk_analytics 20 | 21 | tyk-mongo: 22 | entrypoint: ["echo", "Docker Mongo service disabled. Using Postgres service instead.", ""] 23 | command: [] 24 | 25 | tyk-postgres: 26 | image: postgres:latest 27 | container_name: tyk-postgres 28 | 29 | environment: 30 | - POSTGRES_DB=tyk_analytics 31 | - POSTGRES_USER=${POSTGRES_USER} 32 | - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} 33 | 34 | ports: 35 | - "${POSTGRES_MACHINE_PORT}:${POSTGRES_PORT}" 36 | 37 | volumes: 38 | - postgres-data:/data/db 39 | 40 | networks: 41 | - tyk 42 | 43 | volumes: 44 | postgres-data: 45 | -------------------------------------------------------------------------------- /integrations/deployments/aci/Readme.md: -------------------------------------------------------------------------------- 1 | # How to setup with Azure Container Instance (ACI) 2 | To learn more about ACI and how to setup docker compose with ACI please check out this [documenation](https://docs.microsoft.com/en-us/azure/container-instances/tutorial-docker-compose) on the Microsoft site. 3 | 4 | To get started you will need an Azure Registry. You can create one by running the following command: 5 | 6 | ```az acr create --resource-group myResourceGroup --name tykregistry --sku Basic``` 7 | 8 | Once you create an Azure Registry you will need to login to it: 9 | 10 | ```az acr login --name tykregistry``` 11 | 12 | You will then need to build and push the docker-compose images to your Azure Registry: 13 | 14 | ```docker-compose -f docker-compose.yml -f integrations/depoloyments/aci/docker-compose.yml build``` 15 | 16 | ```docker-compose -f docker-compose.yml -f integrations/depoloyments/aci/docker-compose.yml push``` 17 | 18 | Finally, you can log docker into Azure and create an ACI context that will let you manage the ACI instances. 19 | 20 | ```docker login azure``` 21 | 22 | ```docker context create dockeracicontext``` 23 | 24 | ```docker context use dockeracicontext``` 25 | 26 | ```docker compose -f docker-compose.yml -f integrations/depoloyments/aci/docker-compose.yml up``` 27 | -------------------------------------------------------------------------------- /integrations/deployments/aci/docker-compose.aci.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | services: 3 | tyk-dashboard: 4 | image: tykregistry.azurecr.io/dashboard 5 | 6 | environment: 7 | - TYK_DB_TYKAPI_HOST=${GATEWAY_PROTOCOL}://tyk-gateway 8 | 9 | deploy: 10 | resources: 11 | reservations: 12 | cpus: '.5' 13 | memory: 1G 14 | limits: 15 | cpus: '.5' 16 | memory: 1G 17 | 18 | tyk-gateway: 19 | environment: 20 | - TYK_GW_POLICIES_POLICYCONNECTIONSTRING=${DASHBOARD_PROTOCOL}://tyk-dashboard:${DASHBOARD_PORT} 21 | - TYK_GW_DBAPPCONFOPTIONS_CONNECTIONSTRING=${DASHBOARD_PROTOCOL}://tyk-dashboard:${DASHBOARD_PORT} 22 | 23 | deploy: 24 | resources: 25 | reservations: 26 | cpus: '.5' 27 | memory: 1G 28 | limits: 29 | cpus: '.5' 30 | memory: 1G 31 | 32 | tyk-pump: 33 | deploy: 34 | resources: 35 | reservations: 36 | cpus: '.5' 37 | memory: 1G 38 | limits: 39 | cpus: '.5' 40 | memory: 1G 41 | 42 | tyk-redis: 43 | volumes: 44 | - redis-data:/data 45 | 46 | deploy: 47 | resources: 48 | reservations: 49 | cpus: '.5' 50 | memory: 1G 51 | limits: 52 | cpus: '.5' 53 | memory: 1G 54 | 55 | tyk-mongo: 56 | volumes: 57 | - mongo-data:/data/db 58 | 59 | deploy: 60 | resources: 61 | reservations: 62 | cpus: '.5' 63 | memory: 1G 64 | limits: 65 | cpus: '.5' 66 | memory: 1G 67 | 68 | volumes: 69 | redis-data: 70 | driver: azure_file 71 | driver_opts: 72 | share_name: redis 73 | storage_account_name: tykacistorage 74 | 75 | mongo-data: 76 | driver: azure_file 77 | driver_opts: 78 | share_name: mongo 79 | storage_account_name: tykacistorage 80 | -------------------------------------------------------------------------------- /integrations/portal/custom-templates/Readme.md: -------------------------------------------------------------------------------- 1 | ## Getting Started 2 | 1. Run docker-compose from the repo root using the following command `docker-compose -f docker-compose.yml -f integrations/portal/custom-templates/docker-compose.yml up`. 3 | 2. Navigate to [http://localhost:3000/#/portal/pages/add](http://localhost:3000/#/portal/pages/add) in your browser to access the Tyk Dashboard and add a new Portal Page. 4 | 3. Fill in the `title` and `slug` fields and select `Custom Page Template` from the Page Type drop down menu. 5 | 4. Under the `Template name code` input `customTemplate` which is the provided or create your own and place it under `integrations/portal/custom-templates/src`. 6 | 5. Navigate to [http://localhost:3000/#/portal/$SLUG_VALUE](http://localhost:3000/#/portal/$SLUG_VALUE) to view your custom template. 7 | -------------------------------------------------------------------------------- /integrations/portal/custom-templates/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | 3 | services: 4 | tyk-dashboard: 5 | volumes: 6 | - ./integrations/portal/custom-templates/src/customTemplate.html:/opt/tyk-dashboard/portal/templates/customTemplate.html 7 | -------------------------------------------------------------------------------- /integrations/portal/custom-templates/src/customTemplate.html: -------------------------------------------------------------------------------- 1 | {{ define "customTemplate" }} 2 | 3 |

Hello Tyk

4 | 5 |

This is a custom template

6 | 7 | {{ end }} 8 | -------------------------------------------------------------------------------- /integrations/pumps/csv/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | default/ 3 | -------------------------------------------------------------------------------- /integrations/pumps/csv/Readme.md: -------------------------------------------------------------------------------- 1 | ## Requirements 2 | 1. Read/Write Permissions for the default/ directory 3 | 4 | ## Getting Started 5 | 1. Run docker-compose from the repo root using the following command `docker-compose -f docker-compose.yml -f integrations/pumps/csv/docker-compose.yml up`. 6 | 7 | 8 | CSV logs will be stored in the integrations/pumps/csv/default/ directory. 9 | -------------------------------------------------------------------------------- /integrations/pumps/csv/default/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitkeep 3 | -------------------------------------------------------------------------------- /integrations/pumps/csv/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | services: 3 | tyk-pump: 4 | environment: 5 | - TYK_PMP_PUMPS_CSV_META_CSVDIR=default/ 6 | 7 | volumes: 8 | - ./integrations/pumps/csv/default/:/opt/tyk-pump/default/ 9 | -------------------------------------------------------------------------------- /integrations/pumps/datadog/Readme.md: -------------------------------------------------------------------------------- 1 | ## Requirements 2 | 1. [Datadog](https://www.datadoghq.com/) API key. 3 | 4 | ## Getting Started 5 | 1. Initilaize `DATADOG_API_KEY` by running the `scripts/init.sh` script in the repo root. 6 | 2. Run docker-compose from the repo root using the following command `docker-compose -f docker-compose.yml -f integrations/pumps/datadog/docker-compose.yml up`. 7 | 3. Navigate to [https://www.datadoghq.com](https://www.datadoghq.com/) in your browser to view your analytics. 8 | -------------------------------------------------------------------------------- /integrations/pumps/datadog/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | 3 | services: 4 | tyk-pump: 5 | environment: 6 | - TYK_PMP_PUMPS_DOGSTATSD_TYPE=dogstatsd 7 | - TYK_PMP_PUMPS_DOGSTATSD_META_NAMESPACE=pump 8 | - TYK_PMP_PUMPS_DOGSTATSD_META_ADDRESS=datadog:8125 9 | - TYK_PMP_PUMPS_DOGSTATSD_META_ASYNCUDS=true 10 | - TYK_PMP_PUMPS_DOGSTATSD_META_ASYNCUDSWRITETIMEOUT=2 11 | - TYK_PMP_PUMPS_DOGSTATSD_META_BUFFERED=true 12 | - TYK_PMP_PUMPS_DOGSTATSD_META_BUFFEREDMAXMESSAGES=32 13 | 14 | datadog: 15 | image: datadog/dogstatsd:latest 16 | container_name: datadog 17 | 18 | environment: 19 | - DD_API_KEY=${DATADOG_API_KEY} 20 | - DD_DOGSTATSD_NON_LOCAL_TRAFFIC=true 21 | 22 | ports: 23 | - "8125:8125/udp" 24 | 25 | volumes: 26 | - /var/run/docker.sock:/var/run/docker.sock 27 | - /proc/:/host/proc/:ro 28 | - /sys/fs/cgroup:/host/sys/fs/cgroup:ro 29 | 30 | networks: 31 | - tyk 32 | -------------------------------------------------------------------------------- /integrations/pumps/prometheus/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM prom/prometheus:latest 2 | 3 | MAINTAINER Zaid Albirawi 4 | 5 | COPY ./integrations/pumps/prometheus/confs/ /etc/prometheus/ 6 | -------------------------------------------------------------------------------- /integrations/pumps/prometheus/Readme.md: -------------------------------------------------------------------------------- 1 | ## Getting Started 2 | 1. Run docker-compose from the repo root using the following command `docker-compose -f docker-compose.yml -f integrations/pumps/prometheus/docker-compose.yml up`. 3 | 4 | 2. Navigate to [http://localhost:9090/metrics](http://localhost:9090/metrics) in your browser to view your analytics. 5 | -------------------------------------------------------------------------------- /integrations/pumps/prometheus/confs/prometheus.yml: -------------------------------------------------------------------------------- 1 | global: 2 | scrape_interval: 30s 3 | evaluation_interval: 10s 4 | 5 | rule_files: 6 | 7 | scrape_configs: 8 | - job_name: 'tyk' 9 | metrics_path: /metrics 10 | static_configs: 11 | - targets: 12 | - 'tyk-pump:9091' 13 | -------------------------------------------------------------------------------- /integrations/pumps/prometheus/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | 3 | services: 4 | tyk-pump: 5 | environment: 6 | - TYK_PMP_PUMPS_PROMETHEUS_TYPE=prometheus 7 | - TYK_PMP_PUMPS_PROMETHEUS_META_ADDR=0.0.0.0:9091 8 | - TYK_PMP_PUMPS_PROMETHEUS_META_PATH=/metrics 9 | 10 | prometheus: 11 | build: 12 | context: . 13 | dockerfile: ./integrations/pumps/prometheus/Dockerfile 14 | 15 | container_name: prometheus 16 | 17 | command: 18 | - --config.file=/etc/prometheus/prometheus.yml 19 | - --web.enable-admin-api 20 | 21 | ports: 22 | - "9090:9090" 23 | 24 | networks: 25 | - tyk 26 | -------------------------------------------------------------------------------- /integrations/security/hmac-upstream/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:latest 2 | 3 | MAINTAINER Zaid Albirawi 4 | 5 | RUN mkdir -p /var/www/ 6 | COPY ./integrations/backend-servers/express-js/src/package* /var/www/ 7 | WORKDIR /var/www 8 | RUN npm i 9 | RUN npm install nodemon -g 10 | 11 | ENTRYPOINT nodemon index.js 12 | -------------------------------------------------------------------------------- /integrations/security/hmac-upstream/Readme.md: -------------------------------------------------------------------------------- 1 | ## Getting Started 2 | 1. Run docker-compose from the repo root using the following command `docker-compose -f docker-compose.yml -f integrations/security/hmac-upstream/docker-compose.yml up`. 3 | 4 | 2. Navigate to [http://localhost:3000](http://localhost:3000) in your browser to access the Tyk Dashboard. 5 | 6 | 3. Create a new API. View Raw Definitions. Popluate the following fields under `request_signing`: 7 | - `is_enabled`: `true` 8 | - `secret`: `topsecret` 9 | - `key_id`: `key_id` 10 | - `algorithm`: `hmac-sha256` 11 | 12 | You can read more about those setting [here](https://tyk.io/docs/release-notes/version-2.9/#hmac-request-signing) 13 | 14 | 4. Access API through Tyk Gateway. Note: you will not be able to access the API right away because it is expecting HMAC signature. 15 | -------------------------------------------------------------------------------- /integrations/security/hmac-upstream/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | 3 | services: 4 | hmac-upstream: 5 | build: 6 | context: . 7 | dockerfile: ./integrations/security/hmac-upstream/Dockerfile 8 | 9 | container_name: hmac-upstream 10 | 11 | volumes: 12 | - ./integrations/security/hmac-upstream/src/index.js:/var/www/index.js 13 | - ./integrations/security/hmac-upstream/src/package.json:/var/www/package.json 14 | - ./integrations/security/hmac-upstream/src/package-lock.json:/var/www/package-lock.json 15 | 16 | ports: 17 | - "3030:3030" 18 | 19 | networks: 20 | - tyk 21 | -------------------------------------------------------------------------------- /integrations/security/hmac-upstream/src/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const crypto = require('crypto'); 3 | const app = express(); 4 | 5 | const SECRET = 'topsecret' 6 | 7 | // Create middleware that verifies HMAC 8 | app.use((function (req, res, next) { 9 | const authorization = req.headers['authorization']; 10 | 11 | if (! authorization) { 12 | console.log('No authorization header'); 13 | res.sendStatus(401); 14 | return; 15 | } 16 | 17 | const signature = decodeURIComponent(RegExp('^.*,signature=\"(.+)\"$').exec(req.headers['authorization'])[1]); 18 | 19 | // Grab header order and encoded signature 20 | const match = RegExp('^.*,headers="(.+)".*,signature=\"(.+)\"$').exec(req.headers['authorization']) 21 | const headers = decodeURIComponent(match[1]) 22 | const encodedSignature = decodeURIComponent(match[2]) 23 | 24 | if (! headers || ! encodedSignature) { 25 | console.log('Signature not found'); 26 | res.sendStatus(401); 27 | return; 28 | } 29 | 30 | // Recreate header to create signature 31 | let hmacString = "" 32 | headers.split(' ').forEach(header => { 33 | if (req.headers[header]) { 34 | hmacString += '\n' + header + ': ' + req.headers[header]; 35 | } else if ('(request-target)' == header) { 36 | hmacString += '(request-target): ' + req.method.toLowerCase() + ' ' + req.url; 37 | } else if ('connection' == header) { 38 | hmacString += '\nconnection: keep-alive'; 39 | } else { 40 | console.log('Missing header ' + header); 41 | res.sendStatus(401); 42 | return; 43 | } 44 | }); 45 | 46 | // Recreate signature 47 | const hash = crypto.createHmac('sha256', SECRET) 48 | .update(hmacString) 49 | .digest('base64'); 50 | 51 | // Check signature validity 52 | if (hash !== encodedSignature) { 53 | console.log('Invalid signature'); 54 | res.sendStatus(401); 55 | return; 56 | } 57 | 58 | next(); 59 | })); 60 | 61 | app.get('/hmac', (req, res, next) => { 62 | res.json({ 63 | users: [ 64 | { 65 | username: 'test1', 66 | email: 'test1@tyk.io', 67 | }, 68 | { 69 | username: 'test2', 70 | email: 'test2@tyk.io', 71 | }, 72 | { 73 | username: 'test3', 74 | email: 'test3@tyk.io', 75 | }, 76 | ], 77 | }); 78 | }); 79 | 80 | app.listen(3030); 81 | -------------------------------------------------------------------------------- /integrations/security/hmac-upstream/src/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simple-node-api", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.7", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 10 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 11 | "requires": { 12 | "mime-types": "~2.1.24", 13 | "negotiator": "0.6.2" 14 | } 15 | }, 16 | "array-flatten": { 17 | "version": "1.1.1", 18 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 19 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 20 | }, 21 | "body-parser": { 22 | "version": "1.19.0", 23 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 24 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 25 | "requires": { 26 | "bytes": "3.1.0", 27 | "content-type": "~1.0.4", 28 | "debug": "2.6.9", 29 | "depd": "~1.1.2", 30 | "http-errors": "1.7.2", 31 | "iconv-lite": "0.4.24", 32 | "on-finished": "~2.3.0", 33 | "qs": "6.7.0", 34 | "raw-body": "2.4.0", 35 | "type-is": "~1.6.17" 36 | } 37 | }, 38 | "bytes": { 39 | "version": "3.1.0", 40 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 41 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 42 | }, 43 | "content-disposition": { 44 | "version": "0.5.3", 45 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 46 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 47 | "requires": { 48 | "safe-buffer": "5.1.2" 49 | } 50 | }, 51 | "content-type": { 52 | "version": "1.0.4", 53 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 54 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 55 | }, 56 | "cookie": { 57 | "version": "0.4.0", 58 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 59 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 60 | }, 61 | "cookie-signature": { 62 | "version": "1.0.6", 63 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 64 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 65 | }, 66 | "debug": { 67 | "version": "2.6.9", 68 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 69 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 70 | "requires": { 71 | "ms": "2.0.0" 72 | } 73 | }, 74 | "depd": { 75 | "version": "1.1.2", 76 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 77 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 78 | }, 79 | "destroy": { 80 | "version": "1.0.4", 81 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 82 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 83 | }, 84 | "ee-first": { 85 | "version": "1.1.1", 86 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 87 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 88 | }, 89 | "encodeurl": { 90 | "version": "1.0.2", 91 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 92 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 93 | }, 94 | "escape-html": { 95 | "version": "1.0.3", 96 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 97 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 98 | }, 99 | "etag": { 100 | "version": "1.8.1", 101 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 102 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 103 | }, 104 | "express": { 105 | "version": "4.17.1", 106 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 107 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 108 | "requires": { 109 | "accepts": "~1.3.7", 110 | "array-flatten": "1.1.1", 111 | "body-parser": "1.19.0", 112 | "content-disposition": "0.5.3", 113 | "content-type": "~1.0.4", 114 | "cookie": "0.4.0", 115 | "cookie-signature": "1.0.6", 116 | "debug": "2.6.9", 117 | "depd": "~1.1.2", 118 | "encodeurl": "~1.0.2", 119 | "escape-html": "~1.0.3", 120 | "etag": "~1.8.1", 121 | "finalhandler": "~1.1.2", 122 | "fresh": "0.5.2", 123 | "merge-descriptors": "1.0.1", 124 | "methods": "~1.1.2", 125 | "on-finished": "~2.3.0", 126 | "parseurl": "~1.3.3", 127 | "path-to-regexp": "0.1.7", 128 | "proxy-addr": "~2.0.5", 129 | "qs": "6.7.0", 130 | "range-parser": "~1.2.1", 131 | "safe-buffer": "5.1.2", 132 | "send": "0.17.1", 133 | "serve-static": "1.14.1", 134 | "setprototypeof": "1.1.1", 135 | "statuses": "~1.5.0", 136 | "type-is": "~1.6.18", 137 | "utils-merge": "1.0.1", 138 | "vary": "~1.1.2" 139 | } 140 | }, 141 | "finalhandler": { 142 | "version": "1.1.2", 143 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 144 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 145 | "requires": { 146 | "debug": "2.6.9", 147 | "encodeurl": "~1.0.2", 148 | "escape-html": "~1.0.3", 149 | "on-finished": "~2.3.0", 150 | "parseurl": "~1.3.3", 151 | "statuses": "~1.5.0", 152 | "unpipe": "~1.0.0" 153 | } 154 | }, 155 | "forwarded": { 156 | "version": "0.1.2", 157 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 158 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 159 | }, 160 | "fresh": { 161 | "version": "0.5.2", 162 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 163 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 164 | }, 165 | "http-errors": { 166 | "version": "1.7.2", 167 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 168 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 169 | "requires": { 170 | "depd": "~1.1.2", 171 | "inherits": "2.0.3", 172 | "setprototypeof": "1.1.1", 173 | "statuses": ">= 1.5.0 < 2", 174 | "toidentifier": "1.0.0" 175 | } 176 | }, 177 | "iconv-lite": { 178 | "version": "0.4.24", 179 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 180 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 181 | "requires": { 182 | "safer-buffer": ">= 2.1.2 < 3" 183 | } 184 | }, 185 | "inherits": { 186 | "version": "2.0.3", 187 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 188 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 189 | }, 190 | "ipaddr.js": { 191 | "version": "1.9.1", 192 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 193 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 194 | }, 195 | "media-typer": { 196 | "version": "0.3.0", 197 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 198 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 199 | }, 200 | "merge-descriptors": { 201 | "version": "1.0.1", 202 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 203 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 204 | }, 205 | "methods": { 206 | "version": "1.1.2", 207 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 208 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 209 | }, 210 | "mime": { 211 | "version": "1.6.0", 212 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 213 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 214 | }, 215 | "mime-db": { 216 | "version": "1.44.0", 217 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 218 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 219 | }, 220 | "mime-types": { 221 | "version": "2.1.27", 222 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 223 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 224 | "requires": { 225 | "mime-db": "1.44.0" 226 | } 227 | }, 228 | "ms": { 229 | "version": "2.0.0", 230 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 231 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 232 | }, 233 | "negotiator": { 234 | "version": "0.6.2", 235 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 236 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 237 | }, 238 | "on-finished": { 239 | "version": "2.3.0", 240 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 241 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 242 | "requires": { 243 | "ee-first": "1.1.1" 244 | } 245 | }, 246 | "parseurl": { 247 | "version": "1.3.3", 248 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 249 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 250 | }, 251 | "path-to-regexp": { 252 | "version": "0.1.7", 253 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 254 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 255 | }, 256 | "proxy-addr": { 257 | "version": "2.0.6", 258 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 259 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 260 | "requires": { 261 | "forwarded": "~0.1.2", 262 | "ipaddr.js": "1.9.1" 263 | } 264 | }, 265 | "qs": { 266 | "version": "6.7.0", 267 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 268 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 269 | }, 270 | "range-parser": { 271 | "version": "1.2.1", 272 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 273 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 274 | }, 275 | "raw-body": { 276 | "version": "2.4.0", 277 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 278 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 279 | "requires": { 280 | "bytes": "3.1.0", 281 | "http-errors": "1.7.2", 282 | "iconv-lite": "0.4.24", 283 | "unpipe": "1.0.0" 284 | } 285 | }, 286 | "safe-buffer": { 287 | "version": "5.1.2", 288 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 289 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 290 | }, 291 | "safer-buffer": { 292 | "version": "2.1.2", 293 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 294 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 295 | }, 296 | "send": { 297 | "version": "0.17.1", 298 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 299 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 300 | "requires": { 301 | "debug": "2.6.9", 302 | "depd": "~1.1.2", 303 | "destroy": "~1.0.4", 304 | "encodeurl": "~1.0.2", 305 | "escape-html": "~1.0.3", 306 | "etag": "~1.8.1", 307 | "fresh": "0.5.2", 308 | "http-errors": "~1.7.2", 309 | "mime": "1.6.0", 310 | "ms": "2.1.1", 311 | "on-finished": "~2.3.0", 312 | "range-parser": "~1.2.1", 313 | "statuses": "~1.5.0" 314 | }, 315 | "dependencies": { 316 | "ms": { 317 | "version": "2.1.1", 318 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 319 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 320 | } 321 | } 322 | }, 323 | "serve-static": { 324 | "version": "1.14.1", 325 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 326 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 327 | "requires": { 328 | "encodeurl": "~1.0.2", 329 | "escape-html": "~1.0.3", 330 | "parseurl": "~1.3.3", 331 | "send": "0.17.1" 332 | } 333 | }, 334 | "setprototypeof": { 335 | "version": "1.1.1", 336 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 337 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 338 | }, 339 | "statuses": { 340 | "version": "1.5.0", 341 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 342 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 343 | }, 344 | "toidentifier": { 345 | "version": "1.0.0", 346 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 347 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 348 | }, 349 | "type-is": { 350 | "version": "1.6.18", 351 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 352 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 353 | "requires": { 354 | "media-typer": "0.3.0", 355 | "mime-types": "~2.1.24" 356 | } 357 | }, 358 | "unpipe": { 359 | "version": "1.0.0", 360 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 361 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 362 | }, 363 | "utils-merge": { 364 | "version": "1.0.1", 365 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 366 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 367 | }, 368 | "vary": { 369 | "version": "1.1.2", 370 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 371 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 372 | } 373 | } 374 | } 375 | -------------------------------------------------------------------------------- /integrations/security/hmac-upstream/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-js", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Zaid Albirawi", 10 | "license": "ISC", 11 | "dependencies": { 12 | "express": "^4.17.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /integrations/security/tyk-ssl/Readme.md: -------------------------------------------------------------------------------- 1 | ## Getting Started 2 | 3 | 1. Generate a Certificate Authority: 4 | 5 | ``` 6 | openssl genrsa \ 7 | -des3 \ 8 | -out ./integrations/security/tyk-ssl/certs/tykCA.key \ 9 | -passout pass:topsecretpassword \ 10 | 2048 11 | ``` 12 | 13 | 2. Generate root cerificate: 14 | 15 | ``` 16 | openssl req \ 17 | -x509 \ 18 | -new \ 19 | -nodes \ 20 | -key ./integrations/security/tyk-ssl/certs/tykCA.key \ 21 | -sha256 \ 22 | -days 825 \ 23 | -out ./integrations/security/tyk-ssl/certs/tykCA.pem \ 24 | -passin pass:topsecretpassword \ 25 | -subj "/C=CA/ST=Ontario/L=London/O=Tyk/CN=tyk.local/emailAddress=zaid@tyk.io" 26 | ``` 27 | 28 | 3. Generate SSL certificate private key: 29 | 30 | ``` 31 | openssl genrsa \ 32 | -out ./integrations/security/tyk-ssl/certs/tyk.local.key \ 33 | 2048 34 | ``` 35 | 36 | 4. Generate SSL certificate certificate-signing request: 37 | 38 | ``` 39 | openssl req \ 40 | -new \ 41 | -key ./integrations/security/tyk-ssl/certs/tyk.local.key \ 42 | -out ./integrations/security/tyk-ssl/certs/tyk.local.csr \ 43 | -subj "/C=CA/ST=Ontario/L=London/O=Tyk/CN=tyk.local/emailAddress=zaid@tyk.io,challengePassword=topsecretpassword" 44 | ``` 45 | 46 | 5. Generate SSL certificate: 47 | 48 | ``` 49 | openssl x509 \ 50 | -req \ 51 | -in ./integrations/security/tyk-ssl/certs/tyk.local.csr \ 52 | -CA ./integrations/security/tyk-ssl/certs/tykCA.pem \ 53 | -CAkey ./integrations/security/tyk-ssl/certs/tykCA.key \ 54 | -CAcreateserial \ 55 | -out ./integrations/security/tyk-ssl/certs/tyk.local.crt \ 56 | -days 825 \ 57 | -sha256 \ 58 | -extfile ./integrations/security/tyk-ssl/certs/tyk.local.ext \ 59 | -passin pass:topsecretpassword 60 | ``` 61 | 62 | 6. Add Certificate Authority to Keychain Access: 63 | 64 | ``` 65 | sudo security add-trusted-cert \ 66 | -d \ 67 | -r trustRoot \ 68 | -k /Library/Keychains/System.keychain \ 69 | ./integrations/security/tyk-ssl/certs/tykCA.pem 70 | ``` 71 | 72 | 7. Add `dashboard.tyk.local` and `gateway/tyk.local` to your `/etc/hosts` file. 73 | 74 | ``` 75 | 127.0.0.1 gateway.tyk.local 76 | 127.0.0.1 dashboard.tyk.local 77 | ``` 78 | 79 | 8. Run docker-compose from the repo root using the following command `docker-compose -f docker-compose.yml -f integrations/security/tyk-ssl/docker-compose.yml up`. 80 | 81 | 9. Navigate to [https://dashboard.tyk.local:3000](https://dashboard.tyk.local:3000) in your browser to access the Tyk Dashboard. 82 | 83 | 10. Navigate to [https://gateway.tyk.local:8080](https://gateway.tyk.local:8080) in your browser to access the Tyk Gateway. 84 | -------------------------------------------------------------------------------- /integrations/security/tyk-ssl/certs/tyk.local.ext: -------------------------------------------------------------------------------- 1 | authorityKeyIdentifier=keyid,issuer 2 | basicConstraints=CA:FALSE 3 | extendedKeyUsage=serverAuth,clientAuth 4 | keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment 5 | subjectAltName = @alt_names 6 | [alt_names] 7 | DNS.1 = tyk.local 8 | DNS.2 = dashboard.tyk.local 9 | DNS.3 = gateway.tyk.local 10 | -------------------------------------------------------------------------------- /integrations/security/tyk-ssl/confs/tyk.conf: -------------------------------------------------------------------------------- 1 | { 2 | "http_server_options": { 3 | "certificates": [ 4 | { 5 | "cert_file": "/etc/ssl/certs/tyk.local.crt", 6 | "key_file": "/etc/ssl/certs/tyk.local.key" 7 | } 8 | ] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /integrations/security/tyk-ssl/confs/tyk_analytics.conf: -------------------------------------------------------------------------------- 1 | { 2 | "http_server_options": { 3 | "certificates": [ 4 | { 5 | "cert_file": "/etc/ssl/certs/tyk.local.crt", 6 | "key_file": "/etc/ssl/certs/tyk.local.key" 7 | } 8 | ] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /integrations/security/tyk-ssl/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | 3 | services: 4 | tyk-dashboard: 5 | environment: 6 | - TYK_DB_TYKAPI_HOST=https://tyk-gateway 7 | - TYK_DB_HOSTCONFIG_HOSTNAME=gateway.tyk.local 8 | - TYK_DB_HOSTCONFIG_GATEWAYHOSTNAME=gateway.tyk.local:${GATEWAY_PORT} 9 | - TYK_DB_HTTPSERVEROPTIONS_USESSL=true 10 | - TYK_DB_HTTPSERVEROPTIONS_SSLINSECURESKIPVERIFY=true 11 | - TYK_DB_HOSTCONFIG_GENERATEHTTPS=true 12 | 13 | volumes: 14 | - ./integrations/security/tyk-ssl/certs/tyk.local.crt:/etc/ssl/certs/tyk.local.crt 15 | - ./integrations/security/tyk-ssl/certs/tyk.local.key:/etc/ssl/certs/tyk.local.key 16 | - ./integrations/security/tyk-ssl/confs/tyk_analytics.conf:/opt/tyk-dashboard/tyk_analytics.conf 17 | 18 | tyk-gateway: 19 | environment: 20 | - TYK_GW_POLICIES_POLICYCONNECTIONSTRING=https://tyk-dashboard:${DASHBOARD_PORT} 21 | - TYK_GW_DBAPPCONFOPTIONS_CONNECTIONSTRING=https://tyk-dashboard:${DASHBOARD_PORT} 22 | - TYK_GW_HTTPSERVEROPTIONS_USESSL=true 23 | - TYK_GW_HTTPSERVEROPTIONS_SSLINSECURESKIPVERIFY=true 24 | 25 | volumes: 26 | - ./integrations/security/tyk-ssl/certs/tyk.local.crt:/etc/ssl/certs/tyk.local.crt 27 | - ./integrations/security/tyk-ssl/certs/tyk.local.key:/etc/ssl/certs/tyk.local.key 28 | - ./integrations/security/tyk-ssl/confs/tyk.conf:/opt/tyk-gateway/tyk.conf 29 | -------------------------------------------------------------------------------- /integrations/services/apollo-server/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:latest 2 | 3 | MAINTAINER Zaid Albirawi 4 | 5 | RUN mkdir -p /var/www/ 6 | COPY ./integrations/services/apollo-server/src/* /var/www/ 7 | WORKDIR /var/www 8 | RUN npm i 9 | 10 | ENTRYPOINT node index.js 11 | -------------------------------------------------------------------------------- /integrations/services/apollo-server/Readme.md: -------------------------------------------------------------------------------- 1 | ## Getting Started 2 | 1. Run docker-compose from the repo root using the following command `docker-compose -f docker-compose.yml -f integrations/services/apollo-server/docker-compose.yml up`. 3 | 2. Navigate to [http://localhost:3000](http://localhost:3000) in your browser to access the Tyk Dashboard. 4 | 3. Navigate to [http://localhost:4000/](http://localhost:4000/) in your browser to access the Apollo Server UI. 5 | -------------------------------------------------------------------------------- /integrations/services/apollo-server/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | 3 | services: 4 | apollo-server: 5 | build: 6 | context: . 7 | dockerfile: ./integrations/services/apollo-server/Dockerfile 8 | 9 | container_name: apollo-server 10 | 11 | ports: 12 | - "4000:4000" 13 | 14 | networks: 15 | - tyk 16 | -------------------------------------------------------------------------------- /integrations/services/apollo-server/src/index.js: -------------------------------------------------------------------------------- 1 | const { ApolloServer, gql } = require('apollo-server') 2 | 3 | const typeDefs = gql` 4 | type Category { 5 | id: ID! 6 | name: String! 7 | } 8 | 9 | type Post { 10 | category: Category! 11 | content: String! 12 | title: String! 13 | } 14 | 15 | input PostInput { 16 | category: String! 17 | content: String! 18 | title: String! 19 | } 20 | 21 | type Mutation { 22 | createPost(input: PostInput!): Post 23 | } 24 | 25 | type Query { 26 | getPost(title: String!): Post 27 | } 28 | ` 29 | 30 | const resolvers = { 31 | Mutation: { 32 | createPost: async (parent, { input }) => ({ 33 | title: input.title, 34 | category: input.category, 35 | content: input.content, 36 | }) 37 | }, 38 | } 39 | 40 | const server = new ApolloServer({ 41 | typeDefs, 42 | resolvers, 43 | }) 44 | 45 | server.listen(4000).then(({ url }) => console.log(`Server running at ${url}`)) 46 | -------------------------------------------------------------------------------- /integrations/services/apollo-server/src/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "apollo-server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "apollo-server", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "apollo-server": "^3.6.0", 13 | "graphql": "^16.2.0" 14 | } 15 | }, 16 | "node_modules/@apollo/protobufjs": { 17 | "version": "1.2.2", 18 | "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.2.tgz", 19 | "integrity": "sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ==", 20 | "hasInstallScript": true, 21 | "dependencies": { 22 | "@protobufjs/aspromise": "^1.1.2", 23 | "@protobufjs/base64": "^1.1.2", 24 | "@protobufjs/codegen": "^2.0.4", 25 | "@protobufjs/eventemitter": "^1.1.0", 26 | "@protobufjs/fetch": "^1.1.0", 27 | "@protobufjs/float": "^1.0.2", 28 | "@protobufjs/inquire": "^1.1.0", 29 | "@protobufjs/path": "^1.1.2", 30 | "@protobufjs/pool": "^1.1.0", 31 | "@protobufjs/utf8": "^1.1.0", 32 | "@types/long": "^4.0.0", 33 | "@types/node": "^10.1.0", 34 | "long": "^4.0.0" 35 | }, 36 | "bin": { 37 | "apollo-pbjs": "bin/pbjs", 38 | "apollo-pbts": "bin/pbts" 39 | } 40 | }, 41 | "node_modules/@apollographql/apollo-tools": { 42 | "version": "0.5.2", 43 | "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.5.2.tgz", 44 | "integrity": "sha512-KxZiw0Us3k1d0YkJDhOpVH5rJ+mBfjXcgoRoCcslbgirjgLotKMzOcx4PZ7YTEvvEROmvG7X3Aon41GvMmyGsw==", 45 | "engines": { 46 | "node": ">=8", 47 | "npm": ">=6" 48 | } 49 | }, 50 | "node_modules/@apollographql/graphql-playground-html": { 51 | "version": "1.6.29", 52 | "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz", 53 | "integrity": "sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA==", 54 | "dependencies": { 55 | "xss": "^1.0.8" 56 | } 57 | }, 58 | "node_modules/@graphql-tools/merge": { 59 | "version": "8.2.1", 60 | "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.2.1.tgz", 61 | "integrity": "sha512-Q240kcUszhXiAYudjuJgNuLgy9CryDP3wp83NOZQezfA6h3ByYKU7xI6DiKrdjyVaGpYN3ppUmdj0uf5GaXzMA==", 62 | "dependencies": { 63 | "@graphql-tools/utils": "^8.5.1", 64 | "tslib": "~2.3.0" 65 | }, 66 | "peerDependencies": { 67 | "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" 68 | } 69 | }, 70 | "node_modules/@graphql-tools/mock": { 71 | "version": "8.5.1", 72 | "resolved": "https://registry.npmjs.org/@graphql-tools/mock/-/mock-8.5.1.tgz", 73 | "integrity": "sha512-cwwqGs9Rofev1JdMheAseqM/rw1uw4CYb35vv3Kcv2bbyiPF+490xdlHqFeIazceotMFxC60LlQztwb64rsEnw==", 74 | "dependencies": { 75 | "@graphql-tools/schema": "^8.3.1", 76 | "@graphql-tools/utils": "^8.6.0", 77 | "fast-json-stable-stringify": "^2.1.0", 78 | "tslib": "~2.3.0" 79 | }, 80 | "peerDependencies": { 81 | "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" 82 | } 83 | }, 84 | "node_modules/@graphql-tools/schema": { 85 | "version": "8.3.1", 86 | "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.3.1.tgz", 87 | "integrity": "sha512-3R0AJFe715p4GwF067G5i0KCr/XIdvSfDLvTLEiTDQ8V/hwbOHEKHKWlEBHGRQwkG5lwFQlW1aOn7VnlPERnWQ==", 88 | "dependencies": { 89 | "@graphql-tools/merge": "^8.2.1", 90 | "@graphql-tools/utils": "^8.5.1", 91 | "tslib": "~2.3.0", 92 | "value-or-promise": "1.0.11" 93 | }, 94 | "peerDependencies": { 95 | "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" 96 | } 97 | }, 98 | "node_modules/@graphql-tools/utils": { 99 | "version": "8.6.0", 100 | "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.6.0.tgz", 101 | "integrity": "sha512-rnk+RHaOCeWnfekeQGRh5ycXK1ZAI7Nm0pbeLjA3SiysTdqhWyxNCp5ON4Mvtlid84OY/KB253fQq/2rotznCA==", 102 | "dependencies": { 103 | "tslib": "~2.3.0" 104 | }, 105 | "peerDependencies": { 106 | "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" 107 | } 108 | }, 109 | "node_modules/@josephg/resolvable": { 110 | "version": "1.0.1", 111 | "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz", 112 | "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==" 113 | }, 114 | "node_modules/@protobufjs/aspromise": { 115 | "version": "1.1.2", 116 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 117 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 118 | }, 119 | "node_modules/@protobufjs/base64": { 120 | "version": "1.1.2", 121 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 122 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 123 | }, 124 | "node_modules/@protobufjs/codegen": { 125 | "version": "2.0.4", 126 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 127 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 128 | }, 129 | "node_modules/@protobufjs/eventemitter": { 130 | "version": "1.1.0", 131 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 132 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 133 | }, 134 | "node_modules/@protobufjs/fetch": { 135 | "version": "1.1.0", 136 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 137 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 138 | "dependencies": { 139 | "@protobufjs/aspromise": "^1.1.1", 140 | "@protobufjs/inquire": "^1.1.0" 141 | } 142 | }, 143 | "node_modules/@protobufjs/float": { 144 | "version": "1.0.2", 145 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 146 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 147 | }, 148 | "node_modules/@protobufjs/inquire": { 149 | "version": "1.1.0", 150 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 151 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 152 | }, 153 | "node_modules/@protobufjs/path": { 154 | "version": "1.1.2", 155 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 156 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 157 | }, 158 | "node_modules/@protobufjs/pool": { 159 | "version": "1.1.0", 160 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 161 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 162 | }, 163 | "node_modules/@protobufjs/utf8": { 164 | "version": "1.1.0", 165 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 166 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 167 | }, 168 | "node_modules/@types/accepts": { 169 | "version": "1.3.5", 170 | "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", 171 | "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", 172 | "dependencies": { 173 | "@types/node": "*" 174 | } 175 | }, 176 | "node_modules/@types/body-parser": { 177 | "version": "1.19.2", 178 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 179 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 180 | "dependencies": { 181 | "@types/connect": "*", 182 | "@types/node": "*" 183 | } 184 | }, 185 | "node_modules/@types/connect": { 186 | "version": "3.4.35", 187 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 188 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 189 | "dependencies": { 190 | "@types/node": "*" 191 | } 192 | }, 193 | "node_modules/@types/cors": { 194 | "version": "2.8.12", 195 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", 196 | "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" 197 | }, 198 | "node_modules/@types/express": { 199 | "version": "4.17.13", 200 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", 201 | "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", 202 | "dependencies": { 203 | "@types/body-parser": "*", 204 | "@types/express-serve-static-core": "^4.17.18", 205 | "@types/qs": "*", 206 | "@types/serve-static": "*" 207 | } 208 | }, 209 | "node_modules/@types/express-serve-static-core": { 210 | "version": "4.17.27", 211 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.27.tgz", 212 | "integrity": "sha512-e/sVallzUTPdyOTiqi8O8pMdBBphscvI6E4JYaKlja4Lm+zh7UFSSdW5VMkRbhDtmrONqOUHOXRguPsDckzxNA==", 213 | "dependencies": { 214 | "@types/node": "*", 215 | "@types/qs": "*", 216 | "@types/range-parser": "*" 217 | } 218 | }, 219 | "node_modules/@types/long": { 220 | "version": "4.0.1", 221 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 222 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 223 | }, 224 | "node_modules/@types/mime": { 225 | "version": "1.3.2", 226 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", 227 | "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" 228 | }, 229 | "node_modules/@types/node": { 230 | "version": "10.17.60", 231 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", 232 | "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" 233 | }, 234 | "node_modules/@types/qs": { 235 | "version": "6.9.7", 236 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", 237 | "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" 238 | }, 239 | "node_modules/@types/range-parser": { 240 | "version": "1.2.4", 241 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", 242 | "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" 243 | }, 244 | "node_modules/@types/serve-static": { 245 | "version": "1.13.10", 246 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", 247 | "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", 248 | "dependencies": { 249 | "@types/mime": "^1", 250 | "@types/node": "*" 251 | } 252 | }, 253 | "node_modules/accepts": { 254 | "version": "1.3.7", 255 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 256 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 257 | "dependencies": { 258 | "mime-types": "~2.1.24", 259 | "negotiator": "0.6.2" 260 | }, 261 | "engines": { 262 | "node": ">= 0.6" 263 | } 264 | }, 265 | "node_modules/apollo-datasource": { 266 | "version": "3.3.0", 267 | "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-3.3.0.tgz", 268 | "integrity": "sha512-It8POTZTOCAnedRj2izEVeySN06LIfojigZjWaOY7voLe0DIgtvhql91xr27fuIWsR/Ew9twO3dLBjjvy34J4Q==", 269 | "dependencies": { 270 | "apollo-server-caching": "^3.3.0", 271 | "apollo-server-env": "^4.2.0" 272 | }, 273 | "engines": { 274 | "node": ">=12.0" 275 | } 276 | }, 277 | "node_modules/apollo-reporting-protobuf": { 278 | "version": "3.3.0", 279 | "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.3.0.tgz", 280 | "integrity": "sha512-51Jwrg0NvHJfKz7TIGU8+Os3rUAqWtXeKRsRtKYtTeMSBPNhzz8UoGjAB3XyVmUXRE3IRmLtDPDRFL7qbxMI/w==", 281 | "dependencies": { 282 | "@apollo/protobufjs": "1.2.2" 283 | } 284 | }, 285 | "node_modules/apollo-server": { 286 | "version": "3.6.1", 287 | "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-3.6.1.tgz", 288 | "integrity": "sha512-Y2MY2/WvaTiofVoIR5ZIYt6c6wX8klZRaXI9x+7JBiFV9HMcOuLLpU3+P4r2EVXuN1LLe82m1PgiAYr+a1OmQg==", 289 | "dependencies": { 290 | "apollo-server-core": "^3.6.1", 291 | "apollo-server-express": "^3.6.1", 292 | "express": "^4.17.1" 293 | }, 294 | "peerDependencies": { 295 | "graphql": "^15.3.0 || ^16.0.0" 296 | } 297 | }, 298 | "node_modules/apollo-server-caching": { 299 | "version": "3.3.0", 300 | "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-3.3.0.tgz", 301 | "integrity": "sha512-Wgcb0ArjZ5DjQ7ID+tvxUcZ7Yxdbk5l1MxZL8D8gkyjooOkhPNzjRVQ7ubPoXqO54PrOMOTm1ejVhsF+AfIirQ==", 302 | "dependencies": { 303 | "lru-cache": "^6.0.0" 304 | }, 305 | "engines": { 306 | "node": ">=12.0" 307 | } 308 | }, 309 | "node_modules/apollo-server-core": { 310 | "version": "3.6.1", 311 | "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-3.6.1.tgz", 312 | "integrity": "sha512-V2Us5x7d+w8dVdyFLxEygMgaQ3KZ6Z59HpaQBNHQ7C5wVZhjUXIsgbehBtfzQbMpyMx0z5/8Z8eIrC4zNoGJDw==", 313 | "dependencies": { 314 | "@apollographql/apollo-tools": "^0.5.1", 315 | "@apollographql/graphql-playground-html": "1.6.29", 316 | "@graphql-tools/mock": "^8.1.2", 317 | "@graphql-tools/schema": "^8.0.0", 318 | "@graphql-tools/utils": "^8.0.0", 319 | "@josephg/resolvable": "^1.0.0", 320 | "apollo-datasource": "^3.3.0", 321 | "apollo-reporting-protobuf": "^3.3.0", 322 | "apollo-server-caching": "^3.3.0", 323 | "apollo-server-env": "^4.2.0", 324 | "apollo-server-errors": "^3.3.0", 325 | "apollo-server-plugin-base": "^3.5.0", 326 | "apollo-server-types": "^3.5.0", 327 | "async-retry": "^1.2.1", 328 | "fast-json-stable-stringify": "^2.1.0", 329 | "graphql-tag": "^2.11.0", 330 | "lodash.sortby": "^4.7.0", 331 | "loglevel": "^1.6.8", 332 | "lru-cache": "^6.0.0", 333 | "sha.js": "^2.4.11", 334 | "uuid": "^8.0.0" 335 | }, 336 | "engines": { 337 | "node": ">=12.0" 338 | }, 339 | "peerDependencies": { 340 | "graphql": "^15.3.0 || ^16.0.0" 341 | } 342 | }, 343 | "node_modules/apollo-server-env": { 344 | "version": "4.2.0", 345 | "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-4.2.0.tgz", 346 | "integrity": "sha512-4xJ+PCoWsFLj4rU6iXrIhqD7nI42goi4Iqrhsof9680ljSzkzd+PCwZsja3mHOFXKUQQUvJ7StVSgwaiRu45+A==", 347 | "dependencies": { 348 | "node-fetch": "^2.6.1" 349 | }, 350 | "engines": { 351 | "node": ">=12.0" 352 | } 353 | }, 354 | "node_modules/apollo-server-errors": { 355 | "version": "3.3.0", 356 | "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-3.3.0.tgz", 357 | "integrity": "sha512-9/MNlPZBbEjcCdJcUSbKbVEBT9xZS8GSpX7T/TyzcxHSbsXJszSDSipQNGC+PRKTKAUnv61IONScVyLKEZ5XEQ==", 358 | "engines": { 359 | "node": ">=12.0" 360 | }, 361 | "peerDependencies": { 362 | "graphql": "^15.3.0 || ^16.0.0" 363 | } 364 | }, 365 | "node_modules/apollo-server-express": { 366 | "version": "3.6.1", 367 | "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-3.6.1.tgz", 368 | "integrity": "sha512-29imWvRPn5GsQq02Akt0+jejpWzpOIZfUmgoiFm4YB7somvhDNw15Pu7fv4sISK8ehNIDF68IpLd2cpY8sCkYQ==", 369 | "dependencies": { 370 | "@types/accepts": "^1.3.5", 371 | "@types/body-parser": "1.19.2", 372 | "@types/cors": "2.8.12", 373 | "@types/express": "4.17.13", 374 | "@types/express-serve-static-core": "4.17.27", 375 | "accepts": "^1.3.5", 376 | "apollo-server-core": "^3.6.1", 377 | "apollo-server-types": "^3.5.0", 378 | "body-parser": "^1.19.0", 379 | "cors": "^2.8.5", 380 | "parseurl": "^1.3.3" 381 | }, 382 | "engines": { 383 | "node": ">=12.0" 384 | }, 385 | "peerDependencies": { 386 | "express": "^4.17.1", 387 | "graphql": "^15.3.0 || ^16.0.0" 388 | } 389 | }, 390 | "node_modules/apollo-server-plugin-base": { 391 | "version": "3.5.0", 392 | "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-3.5.0.tgz", 393 | "integrity": "sha512-dpi+W6wexT4H3cjIhxC9SJABkR8TCfxycoHK+U4jxQXUdg50da+KnMgoWlQbF1tuXtUs4gnJtij1RjuGtKwBhw==", 394 | "dependencies": { 395 | "apollo-server-types": "^3.5.0" 396 | }, 397 | "engines": { 398 | "node": ">=12.0" 399 | }, 400 | "peerDependencies": { 401 | "graphql": "^15.3.0 || ^16.0.0" 402 | } 403 | }, 404 | "node_modules/apollo-server-types": { 405 | "version": "3.5.0", 406 | "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-3.5.0.tgz", 407 | "integrity": "sha512-4JaZNu1kjrzIbppgc78hhIe2DFe+XONf8grprcjTOe0v8dIsuV0tFUnl+awTvTpHU1sdjRCKwnj382BebiL+qw==", 408 | "dependencies": { 409 | "apollo-reporting-protobuf": "^3.3.0", 410 | "apollo-server-caching": "^3.3.0", 411 | "apollo-server-env": "^4.2.0" 412 | }, 413 | "engines": { 414 | "node": ">=12.0" 415 | }, 416 | "peerDependencies": { 417 | "graphql": "^15.3.0 || ^16.0.0" 418 | } 419 | }, 420 | "node_modules/array-flatten": { 421 | "version": "1.1.1", 422 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 423 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 424 | }, 425 | "node_modules/async-retry": { 426 | "version": "1.3.3", 427 | "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", 428 | "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", 429 | "dependencies": { 430 | "retry": "0.13.1" 431 | } 432 | }, 433 | "node_modules/body-parser": { 434 | "version": "1.19.1", 435 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", 436 | "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", 437 | "dependencies": { 438 | "bytes": "3.1.1", 439 | "content-type": "~1.0.4", 440 | "debug": "2.6.9", 441 | "depd": "~1.1.2", 442 | "http-errors": "1.8.1", 443 | "iconv-lite": "0.4.24", 444 | "on-finished": "~2.3.0", 445 | "qs": "6.9.6", 446 | "raw-body": "2.4.2", 447 | "type-is": "~1.6.18" 448 | }, 449 | "engines": { 450 | "node": ">= 0.8" 451 | } 452 | }, 453 | "node_modules/bytes": { 454 | "version": "3.1.1", 455 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", 456 | "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", 457 | "engines": { 458 | "node": ">= 0.8" 459 | } 460 | }, 461 | "node_modules/commander": { 462 | "version": "2.20.3", 463 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 464 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 465 | }, 466 | "node_modules/content-disposition": { 467 | "version": "0.5.4", 468 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 469 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 470 | "dependencies": { 471 | "safe-buffer": "5.2.1" 472 | }, 473 | "engines": { 474 | "node": ">= 0.6" 475 | } 476 | }, 477 | "node_modules/content-type": { 478 | "version": "1.0.4", 479 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 480 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 481 | "engines": { 482 | "node": ">= 0.6" 483 | } 484 | }, 485 | "node_modules/cookie": { 486 | "version": "0.4.1", 487 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 488 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", 489 | "engines": { 490 | "node": ">= 0.6" 491 | } 492 | }, 493 | "node_modules/cookie-signature": { 494 | "version": "1.0.6", 495 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 496 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 497 | }, 498 | "node_modules/cors": { 499 | "version": "2.8.5", 500 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 501 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 502 | "dependencies": { 503 | "object-assign": "^4", 504 | "vary": "^1" 505 | }, 506 | "engines": { 507 | "node": ">= 0.10" 508 | } 509 | }, 510 | "node_modules/cssfilter": { 511 | "version": "0.0.10", 512 | "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", 513 | "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" 514 | }, 515 | "node_modules/debug": { 516 | "version": "2.6.9", 517 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 518 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 519 | "dependencies": { 520 | "ms": "2.0.0" 521 | } 522 | }, 523 | "node_modules/depd": { 524 | "version": "1.1.2", 525 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 526 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 527 | "engines": { 528 | "node": ">= 0.6" 529 | } 530 | }, 531 | "node_modules/destroy": { 532 | "version": "1.0.4", 533 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 534 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 535 | }, 536 | "node_modules/ee-first": { 537 | "version": "1.1.1", 538 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 539 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 540 | }, 541 | "node_modules/encodeurl": { 542 | "version": "1.0.2", 543 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 544 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 545 | "engines": { 546 | "node": ">= 0.8" 547 | } 548 | }, 549 | "node_modules/escape-html": { 550 | "version": "1.0.3", 551 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 552 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 553 | }, 554 | "node_modules/etag": { 555 | "version": "1.8.1", 556 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 557 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 558 | "engines": { 559 | "node": ">= 0.6" 560 | } 561 | }, 562 | "node_modules/express": { 563 | "version": "4.17.2", 564 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", 565 | "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", 566 | "dependencies": { 567 | "accepts": "~1.3.7", 568 | "array-flatten": "1.1.1", 569 | "body-parser": "1.19.1", 570 | "content-disposition": "0.5.4", 571 | "content-type": "~1.0.4", 572 | "cookie": "0.4.1", 573 | "cookie-signature": "1.0.6", 574 | "debug": "2.6.9", 575 | "depd": "~1.1.2", 576 | "encodeurl": "~1.0.2", 577 | "escape-html": "~1.0.3", 578 | "etag": "~1.8.1", 579 | "finalhandler": "~1.1.2", 580 | "fresh": "0.5.2", 581 | "merge-descriptors": "1.0.1", 582 | "methods": "~1.1.2", 583 | "on-finished": "~2.3.0", 584 | "parseurl": "~1.3.3", 585 | "path-to-regexp": "0.1.7", 586 | "proxy-addr": "~2.0.7", 587 | "qs": "6.9.6", 588 | "range-parser": "~1.2.1", 589 | "safe-buffer": "5.2.1", 590 | "send": "0.17.2", 591 | "serve-static": "1.14.2", 592 | "setprototypeof": "1.2.0", 593 | "statuses": "~1.5.0", 594 | "type-is": "~1.6.18", 595 | "utils-merge": "1.0.1", 596 | "vary": "~1.1.2" 597 | }, 598 | "engines": { 599 | "node": ">= 0.10.0" 600 | } 601 | }, 602 | "node_modules/fast-json-stable-stringify": { 603 | "version": "2.1.0", 604 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 605 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 606 | }, 607 | "node_modules/finalhandler": { 608 | "version": "1.1.2", 609 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 610 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 611 | "dependencies": { 612 | "debug": "2.6.9", 613 | "encodeurl": "~1.0.2", 614 | "escape-html": "~1.0.3", 615 | "on-finished": "~2.3.0", 616 | "parseurl": "~1.3.3", 617 | "statuses": "~1.5.0", 618 | "unpipe": "~1.0.0" 619 | }, 620 | "engines": { 621 | "node": ">= 0.8" 622 | } 623 | }, 624 | "node_modules/forwarded": { 625 | "version": "0.2.0", 626 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 627 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 628 | "engines": { 629 | "node": ">= 0.6" 630 | } 631 | }, 632 | "node_modules/fresh": { 633 | "version": "0.5.2", 634 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 635 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 636 | "engines": { 637 | "node": ">= 0.6" 638 | } 639 | }, 640 | "node_modules/graphql": { 641 | "version": "16.2.0", 642 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.2.0.tgz", 643 | "integrity": "sha512-MuQd7XXrdOcmfwuLwC2jNvx0n3rxIuNYOxUtiee5XOmfrWo613ar2U8pE7aHAKh8VwfpifubpD9IP+EdEAEOsA==", 644 | "engines": { 645 | "node": "^12.22.0 || ^14.16.0 || >=16.0.0" 646 | } 647 | }, 648 | "node_modules/graphql-tag": { 649 | "version": "2.12.6", 650 | "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", 651 | "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", 652 | "dependencies": { 653 | "tslib": "^2.1.0" 654 | }, 655 | "engines": { 656 | "node": ">=10" 657 | }, 658 | "peerDependencies": { 659 | "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" 660 | } 661 | }, 662 | "node_modules/http-errors": { 663 | "version": "1.8.1", 664 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 665 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 666 | "dependencies": { 667 | "depd": "~1.1.2", 668 | "inherits": "2.0.4", 669 | "setprototypeof": "1.2.0", 670 | "statuses": ">= 1.5.0 < 2", 671 | "toidentifier": "1.0.1" 672 | }, 673 | "engines": { 674 | "node": ">= 0.6" 675 | } 676 | }, 677 | "node_modules/iconv-lite": { 678 | "version": "0.4.24", 679 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 680 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 681 | "dependencies": { 682 | "safer-buffer": ">= 2.1.2 < 3" 683 | }, 684 | "engines": { 685 | "node": ">=0.10.0" 686 | } 687 | }, 688 | "node_modules/inherits": { 689 | "version": "2.0.4", 690 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 691 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 692 | }, 693 | "node_modules/ipaddr.js": { 694 | "version": "1.9.1", 695 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 696 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 697 | "engines": { 698 | "node": ">= 0.10" 699 | } 700 | }, 701 | "node_modules/lodash.sortby": { 702 | "version": "4.7.0", 703 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 704 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 705 | }, 706 | "node_modules/loglevel": { 707 | "version": "1.8.0", 708 | "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", 709 | "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", 710 | "engines": { 711 | "node": ">= 0.6.0" 712 | }, 713 | "funding": { 714 | "type": "tidelift", 715 | "url": "https://tidelift.com/funding/github/npm/loglevel" 716 | } 717 | }, 718 | "node_modules/long": { 719 | "version": "4.0.0", 720 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 721 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 722 | }, 723 | "node_modules/lru-cache": { 724 | "version": "6.0.0", 725 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 726 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 727 | "dependencies": { 728 | "yallist": "^4.0.0" 729 | }, 730 | "engines": { 731 | "node": ">=10" 732 | } 733 | }, 734 | "node_modules/media-typer": { 735 | "version": "0.3.0", 736 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 737 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 738 | "engines": { 739 | "node": ">= 0.6" 740 | } 741 | }, 742 | "node_modules/merge-descriptors": { 743 | "version": "1.0.1", 744 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 745 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 746 | }, 747 | "node_modules/methods": { 748 | "version": "1.1.2", 749 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 750 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 751 | "engines": { 752 | "node": ">= 0.6" 753 | } 754 | }, 755 | "node_modules/mime": { 756 | "version": "1.6.0", 757 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 758 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 759 | "bin": { 760 | "mime": "cli.js" 761 | }, 762 | "engines": { 763 | "node": ">=4" 764 | } 765 | }, 766 | "node_modules/mime-db": { 767 | "version": "1.51.0", 768 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 769 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", 770 | "engines": { 771 | "node": ">= 0.6" 772 | } 773 | }, 774 | "node_modules/mime-types": { 775 | "version": "2.1.34", 776 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 777 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 778 | "dependencies": { 779 | "mime-db": "1.51.0" 780 | }, 781 | "engines": { 782 | "node": ">= 0.6" 783 | } 784 | }, 785 | "node_modules/ms": { 786 | "version": "2.0.0", 787 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 788 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 789 | }, 790 | "node_modules/negotiator": { 791 | "version": "0.6.2", 792 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 793 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", 794 | "engines": { 795 | "node": ">= 0.6" 796 | } 797 | }, 798 | "node_modules/node-fetch": { 799 | "version": "2.6.6", 800 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", 801 | "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", 802 | "dependencies": { 803 | "whatwg-url": "^5.0.0" 804 | }, 805 | "engines": { 806 | "node": "4.x || >=6.0.0" 807 | } 808 | }, 809 | "node_modules/object-assign": { 810 | "version": "4.1.1", 811 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 812 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 813 | "engines": { 814 | "node": ">=0.10.0" 815 | } 816 | }, 817 | "node_modules/on-finished": { 818 | "version": "2.3.0", 819 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 820 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 821 | "dependencies": { 822 | "ee-first": "1.1.1" 823 | }, 824 | "engines": { 825 | "node": ">= 0.8" 826 | } 827 | }, 828 | "node_modules/parseurl": { 829 | "version": "1.3.3", 830 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 831 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 832 | "engines": { 833 | "node": ">= 0.8" 834 | } 835 | }, 836 | "node_modules/path-to-regexp": { 837 | "version": "0.1.7", 838 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 839 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 840 | }, 841 | "node_modules/proxy-addr": { 842 | "version": "2.0.7", 843 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 844 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 845 | "dependencies": { 846 | "forwarded": "0.2.0", 847 | "ipaddr.js": "1.9.1" 848 | }, 849 | "engines": { 850 | "node": ">= 0.10" 851 | } 852 | }, 853 | "node_modules/qs": { 854 | "version": "6.9.6", 855 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", 856 | "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", 857 | "engines": { 858 | "node": ">=0.6" 859 | }, 860 | "funding": { 861 | "url": "https://github.com/sponsors/ljharb" 862 | } 863 | }, 864 | "node_modules/range-parser": { 865 | "version": "1.2.1", 866 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 867 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 868 | "engines": { 869 | "node": ">= 0.6" 870 | } 871 | }, 872 | "node_modules/raw-body": { 873 | "version": "2.4.2", 874 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", 875 | "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", 876 | "dependencies": { 877 | "bytes": "3.1.1", 878 | "http-errors": "1.8.1", 879 | "iconv-lite": "0.4.24", 880 | "unpipe": "1.0.0" 881 | }, 882 | "engines": { 883 | "node": ">= 0.8" 884 | } 885 | }, 886 | "node_modules/retry": { 887 | "version": "0.13.1", 888 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", 889 | "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", 890 | "engines": { 891 | "node": ">= 4" 892 | } 893 | }, 894 | "node_modules/safe-buffer": { 895 | "version": "5.2.1", 896 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 897 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 898 | "funding": [ 899 | { 900 | "type": "github", 901 | "url": "https://github.com/sponsors/feross" 902 | }, 903 | { 904 | "type": "patreon", 905 | "url": "https://www.patreon.com/feross" 906 | }, 907 | { 908 | "type": "consulting", 909 | "url": "https://feross.org/support" 910 | } 911 | ] 912 | }, 913 | "node_modules/safer-buffer": { 914 | "version": "2.1.2", 915 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 916 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 917 | }, 918 | "node_modules/send": { 919 | "version": "0.17.2", 920 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", 921 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", 922 | "dependencies": { 923 | "debug": "2.6.9", 924 | "depd": "~1.1.2", 925 | "destroy": "~1.0.4", 926 | "encodeurl": "~1.0.2", 927 | "escape-html": "~1.0.3", 928 | "etag": "~1.8.1", 929 | "fresh": "0.5.2", 930 | "http-errors": "1.8.1", 931 | "mime": "1.6.0", 932 | "ms": "2.1.3", 933 | "on-finished": "~2.3.0", 934 | "range-parser": "~1.2.1", 935 | "statuses": "~1.5.0" 936 | }, 937 | "engines": { 938 | "node": ">= 0.8.0" 939 | } 940 | }, 941 | "node_modules/send/node_modules/ms": { 942 | "version": "2.1.3", 943 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 944 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 945 | }, 946 | "node_modules/serve-static": { 947 | "version": "1.14.2", 948 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", 949 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", 950 | "dependencies": { 951 | "encodeurl": "~1.0.2", 952 | "escape-html": "~1.0.3", 953 | "parseurl": "~1.3.3", 954 | "send": "0.17.2" 955 | }, 956 | "engines": { 957 | "node": ">= 0.8.0" 958 | } 959 | }, 960 | "node_modules/setprototypeof": { 961 | "version": "1.2.0", 962 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 963 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 964 | }, 965 | "node_modules/sha.js": { 966 | "version": "2.4.11", 967 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 968 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 969 | "dependencies": { 970 | "inherits": "^2.0.1", 971 | "safe-buffer": "^5.0.1" 972 | }, 973 | "bin": { 974 | "sha.js": "bin.js" 975 | } 976 | }, 977 | "node_modules/statuses": { 978 | "version": "1.5.0", 979 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 980 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 981 | "engines": { 982 | "node": ">= 0.6" 983 | } 984 | }, 985 | "node_modules/toidentifier": { 986 | "version": "1.0.1", 987 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 988 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 989 | "engines": { 990 | "node": ">=0.6" 991 | } 992 | }, 993 | "node_modules/tr46": { 994 | "version": "0.0.3", 995 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 996 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 997 | }, 998 | "node_modules/tslib": { 999 | "version": "2.3.1", 1000 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 1001 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 1002 | }, 1003 | "node_modules/type-is": { 1004 | "version": "1.6.18", 1005 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1006 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1007 | "dependencies": { 1008 | "media-typer": "0.3.0", 1009 | "mime-types": "~2.1.24" 1010 | }, 1011 | "engines": { 1012 | "node": ">= 0.6" 1013 | } 1014 | }, 1015 | "node_modules/unpipe": { 1016 | "version": "1.0.0", 1017 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1018 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 1019 | "engines": { 1020 | "node": ">= 0.8" 1021 | } 1022 | }, 1023 | "node_modules/utils-merge": { 1024 | "version": "1.0.1", 1025 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1026 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 1027 | "engines": { 1028 | "node": ">= 0.4.0" 1029 | } 1030 | }, 1031 | "node_modules/uuid": { 1032 | "version": "8.3.2", 1033 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1034 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 1035 | "bin": { 1036 | "uuid": "dist/bin/uuid" 1037 | } 1038 | }, 1039 | "node_modules/value-or-promise": { 1040 | "version": "1.0.11", 1041 | "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz", 1042 | "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==", 1043 | "engines": { 1044 | "node": ">=12" 1045 | } 1046 | }, 1047 | "node_modules/vary": { 1048 | "version": "1.1.2", 1049 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1050 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 1051 | "engines": { 1052 | "node": ">= 0.8" 1053 | } 1054 | }, 1055 | "node_modules/webidl-conversions": { 1056 | "version": "3.0.1", 1057 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1058 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 1059 | }, 1060 | "node_modules/whatwg-url": { 1061 | "version": "5.0.0", 1062 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1063 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 1064 | "dependencies": { 1065 | "tr46": "~0.0.3", 1066 | "webidl-conversions": "^3.0.0" 1067 | } 1068 | }, 1069 | "node_modules/xss": { 1070 | "version": "1.0.10", 1071 | "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.10.tgz", 1072 | "integrity": "sha512-qmoqrRksmzqSKvgqzN0055UFWY7OKx1/9JWeRswwEVX9fCG5jcYRxa/A2DHcmZX6VJvjzHRQ2STeeVcQkrmLSw==", 1073 | "dependencies": { 1074 | "commander": "^2.20.3", 1075 | "cssfilter": "0.0.10" 1076 | }, 1077 | "bin": { 1078 | "xss": "bin/xss" 1079 | }, 1080 | "engines": { 1081 | "node": ">= 0.10.0" 1082 | } 1083 | }, 1084 | "node_modules/yallist": { 1085 | "version": "4.0.0", 1086 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1087 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1088 | } 1089 | }, 1090 | "dependencies": { 1091 | "@apollo/protobufjs": { 1092 | "version": "1.2.2", 1093 | "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.2.tgz", 1094 | "integrity": "sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ==", 1095 | "requires": { 1096 | "@protobufjs/aspromise": "^1.1.2", 1097 | "@protobufjs/base64": "^1.1.2", 1098 | "@protobufjs/codegen": "^2.0.4", 1099 | "@protobufjs/eventemitter": "^1.1.0", 1100 | "@protobufjs/fetch": "^1.1.0", 1101 | "@protobufjs/float": "^1.0.2", 1102 | "@protobufjs/inquire": "^1.1.0", 1103 | "@protobufjs/path": "^1.1.2", 1104 | "@protobufjs/pool": "^1.1.0", 1105 | "@protobufjs/utf8": "^1.1.0", 1106 | "@types/long": "^4.0.0", 1107 | "@types/node": "^10.1.0", 1108 | "long": "^4.0.0" 1109 | } 1110 | }, 1111 | "@apollographql/apollo-tools": { 1112 | "version": "0.5.2", 1113 | "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.5.2.tgz", 1114 | "integrity": "sha512-KxZiw0Us3k1d0YkJDhOpVH5rJ+mBfjXcgoRoCcslbgirjgLotKMzOcx4PZ7YTEvvEROmvG7X3Aon41GvMmyGsw==" 1115 | }, 1116 | "@apollographql/graphql-playground-html": { 1117 | "version": "1.6.29", 1118 | "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz", 1119 | "integrity": "sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA==", 1120 | "requires": { 1121 | "xss": "^1.0.8" 1122 | } 1123 | }, 1124 | "@graphql-tools/merge": { 1125 | "version": "8.2.1", 1126 | "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.2.1.tgz", 1127 | "integrity": "sha512-Q240kcUszhXiAYudjuJgNuLgy9CryDP3wp83NOZQezfA6h3ByYKU7xI6DiKrdjyVaGpYN3ppUmdj0uf5GaXzMA==", 1128 | "requires": { 1129 | "@graphql-tools/utils": "^8.5.1", 1130 | "tslib": "~2.3.0" 1131 | } 1132 | }, 1133 | "@graphql-tools/mock": { 1134 | "version": "8.5.1", 1135 | "resolved": "https://registry.npmjs.org/@graphql-tools/mock/-/mock-8.5.1.tgz", 1136 | "integrity": "sha512-cwwqGs9Rofev1JdMheAseqM/rw1uw4CYb35vv3Kcv2bbyiPF+490xdlHqFeIazceotMFxC60LlQztwb64rsEnw==", 1137 | "requires": { 1138 | "@graphql-tools/schema": "^8.3.1", 1139 | "@graphql-tools/utils": "^8.6.0", 1140 | "fast-json-stable-stringify": "^2.1.0", 1141 | "tslib": "~2.3.0" 1142 | } 1143 | }, 1144 | "@graphql-tools/schema": { 1145 | "version": "8.3.1", 1146 | "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.3.1.tgz", 1147 | "integrity": "sha512-3R0AJFe715p4GwF067G5i0KCr/XIdvSfDLvTLEiTDQ8V/hwbOHEKHKWlEBHGRQwkG5lwFQlW1aOn7VnlPERnWQ==", 1148 | "requires": { 1149 | "@graphql-tools/merge": "^8.2.1", 1150 | "@graphql-tools/utils": "^8.5.1", 1151 | "tslib": "~2.3.0", 1152 | "value-or-promise": "1.0.11" 1153 | } 1154 | }, 1155 | "@graphql-tools/utils": { 1156 | "version": "8.6.0", 1157 | "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.6.0.tgz", 1158 | "integrity": "sha512-rnk+RHaOCeWnfekeQGRh5ycXK1ZAI7Nm0pbeLjA3SiysTdqhWyxNCp5ON4Mvtlid84OY/KB253fQq/2rotznCA==", 1159 | "requires": { 1160 | "tslib": "~2.3.0" 1161 | } 1162 | }, 1163 | "@josephg/resolvable": { 1164 | "version": "1.0.1", 1165 | "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz", 1166 | "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==" 1167 | }, 1168 | "@protobufjs/aspromise": { 1169 | "version": "1.1.2", 1170 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 1171 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 1172 | }, 1173 | "@protobufjs/base64": { 1174 | "version": "1.1.2", 1175 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 1176 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 1177 | }, 1178 | "@protobufjs/codegen": { 1179 | "version": "2.0.4", 1180 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 1181 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 1182 | }, 1183 | "@protobufjs/eventemitter": { 1184 | "version": "1.1.0", 1185 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 1186 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 1187 | }, 1188 | "@protobufjs/fetch": { 1189 | "version": "1.1.0", 1190 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 1191 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 1192 | "requires": { 1193 | "@protobufjs/aspromise": "^1.1.1", 1194 | "@protobufjs/inquire": "^1.1.0" 1195 | } 1196 | }, 1197 | "@protobufjs/float": { 1198 | "version": "1.0.2", 1199 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 1200 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 1201 | }, 1202 | "@protobufjs/inquire": { 1203 | "version": "1.1.0", 1204 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 1205 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 1206 | }, 1207 | "@protobufjs/path": { 1208 | "version": "1.1.2", 1209 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 1210 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 1211 | }, 1212 | "@protobufjs/pool": { 1213 | "version": "1.1.0", 1214 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 1215 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 1216 | }, 1217 | "@protobufjs/utf8": { 1218 | "version": "1.1.0", 1219 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 1220 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 1221 | }, 1222 | "@types/accepts": { 1223 | "version": "1.3.5", 1224 | "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", 1225 | "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", 1226 | "requires": { 1227 | "@types/node": "*" 1228 | } 1229 | }, 1230 | "@types/body-parser": { 1231 | "version": "1.19.2", 1232 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 1233 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 1234 | "requires": { 1235 | "@types/connect": "*", 1236 | "@types/node": "*" 1237 | } 1238 | }, 1239 | "@types/connect": { 1240 | "version": "3.4.35", 1241 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 1242 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 1243 | "requires": { 1244 | "@types/node": "*" 1245 | } 1246 | }, 1247 | "@types/cors": { 1248 | "version": "2.8.12", 1249 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", 1250 | "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" 1251 | }, 1252 | "@types/express": { 1253 | "version": "4.17.13", 1254 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", 1255 | "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", 1256 | "requires": { 1257 | "@types/body-parser": "*", 1258 | "@types/express-serve-static-core": "^4.17.18", 1259 | "@types/qs": "*", 1260 | "@types/serve-static": "*" 1261 | } 1262 | }, 1263 | "@types/express-serve-static-core": { 1264 | "version": "4.17.27", 1265 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.27.tgz", 1266 | "integrity": "sha512-e/sVallzUTPdyOTiqi8O8pMdBBphscvI6E4JYaKlja4Lm+zh7UFSSdW5VMkRbhDtmrONqOUHOXRguPsDckzxNA==", 1267 | "requires": { 1268 | "@types/node": "*", 1269 | "@types/qs": "*", 1270 | "@types/range-parser": "*" 1271 | } 1272 | }, 1273 | "@types/long": { 1274 | "version": "4.0.1", 1275 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 1276 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 1277 | }, 1278 | "@types/mime": { 1279 | "version": "1.3.2", 1280 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", 1281 | "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" 1282 | }, 1283 | "@types/node": { 1284 | "version": "10.17.60", 1285 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", 1286 | "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" 1287 | }, 1288 | "@types/qs": { 1289 | "version": "6.9.7", 1290 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", 1291 | "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" 1292 | }, 1293 | "@types/range-parser": { 1294 | "version": "1.2.4", 1295 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", 1296 | "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" 1297 | }, 1298 | "@types/serve-static": { 1299 | "version": "1.13.10", 1300 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", 1301 | "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", 1302 | "requires": { 1303 | "@types/mime": "^1", 1304 | "@types/node": "*" 1305 | } 1306 | }, 1307 | "accepts": { 1308 | "version": "1.3.7", 1309 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 1310 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 1311 | "requires": { 1312 | "mime-types": "~2.1.24", 1313 | "negotiator": "0.6.2" 1314 | } 1315 | }, 1316 | "apollo-datasource": { 1317 | "version": "3.3.0", 1318 | "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-3.3.0.tgz", 1319 | "integrity": "sha512-It8POTZTOCAnedRj2izEVeySN06LIfojigZjWaOY7voLe0DIgtvhql91xr27fuIWsR/Ew9twO3dLBjjvy34J4Q==", 1320 | "requires": { 1321 | "apollo-server-caching": "^3.3.0", 1322 | "apollo-server-env": "^4.2.0" 1323 | } 1324 | }, 1325 | "apollo-reporting-protobuf": { 1326 | "version": "3.3.0", 1327 | "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.3.0.tgz", 1328 | "integrity": "sha512-51Jwrg0NvHJfKz7TIGU8+Os3rUAqWtXeKRsRtKYtTeMSBPNhzz8UoGjAB3XyVmUXRE3IRmLtDPDRFL7qbxMI/w==", 1329 | "requires": { 1330 | "@apollo/protobufjs": "1.2.2" 1331 | } 1332 | }, 1333 | "apollo-server": { 1334 | "version": "3.6.1", 1335 | "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-3.6.1.tgz", 1336 | "integrity": "sha512-Y2MY2/WvaTiofVoIR5ZIYt6c6wX8klZRaXI9x+7JBiFV9HMcOuLLpU3+P4r2EVXuN1LLe82m1PgiAYr+a1OmQg==", 1337 | "requires": { 1338 | "apollo-server-core": "^3.6.1", 1339 | "apollo-server-express": "^3.6.1", 1340 | "express": "^4.17.1" 1341 | } 1342 | }, 1343 | "apollo-server-caching": { 1344 | "version": "3.3.0", 1345 | "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-3.3.0.tgz", 1346 | "integrity": "sha512-Wgcb0ArjZ5DjQ7ID+tvxUcZ7Yxdbk5l1MxZL8D8gkyjooOkhPNzjRVQ7ubPoXqO54PrOMOTm1ejVhsF+AfIirQ==", 1347 | "requires": { 1348 | "lru-cache": "^6.0.0" 1349 | } 1350 | }, 1351 | "apollo-server-core": { 1352 | "version": "3.6.1", 1353 | "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-3.6.1.tgz", 1354 | "integrity": "sha512-V2Us5x7d+w8dVdyFLxEygMgaQ3KZ6Z59HpaQBNHQ7C5wVZhjUXIsgbehBtfzQbMpyMx0z5/8Z8eIrC4zNoGJDw==", 1355 | "requires": { 1356 | "@apollographql/apollo-tools": "^0.5.1", 1357 | "@apollographql/graphql-playground-html": "1.6.29", 1358 | "@graphql-tools/mock": "^8.1.2", 1359 | "@graphql-tools/schema": "^8.0.0", 1360 | "@graphql-tools/utils": "^8.0.0", 1361 | "@josephg/resolvable": "^1.0.0", 1362 | "apollo-datasource": "^3.3.0", 1363 | "apollo-reporting-protobuf": "^3.3.0", 1364 | "apollo-server-caching": "^3.3.0", 1365 | "apollo-server-env": "^4.2.0", 1366 | "apollo-server-errors": "^3.3.0", 1367 | "apollo-server-plugin-base": "^3.5.0", 1368 | "apollo-server-types": "^3.5.0", 1369 | "async-retry": "^1.2.1", 1370 | "fast-json-stable-stringify": "^2.1.0", 1371 | "graphql-tag": "^2.11.0", 1372 | "lodash.sortby": "^4.7.0", 1373 | "loglevel": "^1.6.8", 1374 | "lru-cache": "^6.0.0", 1375 | "sha.js": "^2.4.11", 1376 | "uuid": "^8.0.0" 1377 | } 1378 | }, 1379 | "apollo-server-env": { 1380 | "version": "4.2.0", 1381 | "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-4.2.0.tgz", 1382 | "integrity": "sha512-4xJ+PCoWsFLj4rU6iXrIhqD7nI42goi4Iqrhsof9680ljSzkzd+PCwZsja3mHOFXKUQQUvJ7StVSgwaiRu45+A==", 1383 | "requires": { 1384 | "node-fetch": "^2.6.1" 1385 | } 1386 | }, 1387 | "apollo-server-errors": { 1388 | "version": "3.3.0", 1389 | "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-3.3.0.tgz", 1390 | "integrity": "sha512-9/MNlPZBbEjcCdJcUSbKbVEBT9xZS8GSpX7T/TyzcxHSbsXJszSDSipQNGC+PRKTKAUnv61IONScVyLKEZ5XEQ==", 1391 | "requires": {} 1392 | }, 1393 | "apollo-server-express": { 1394 | "version": "3.6.1", 1395 | "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-3.6.1.tgz", 1396 | "integrity": "sha512-29imWvRPn5GsQq02Akt0+jejpWzpOIZfUmgoiFm4YB7somvhDNw15Pu7fv4sISK8ehNIDF68IpLd2cpY8sCkYQ==", 1397 | "requires": { 1398 | "@types/accepts": "^1.3.5", 1399 | "@types/body-parser": "1.19.2", 1400 | "@types/cors": "2.8.12", 1401 | "@types/express": "4.17.13", 1402 | "@types/express-serve-static-core": "4.17.27", 1403 | "accepts": "^1.3.5", 1404 | "apollo-server-core": "^3.6.1", 1405 | "apollo-server-types": "^3.5.0", 1406 | "body-parser": "^1.19.0", 1407 | "cors": "^2.8.5", 1408 | "parseurl": "^1.3.3" 1409 | } 1410 | }, 1411 | "apollo-server-plugin-base": { 1412 | "version": "3.5.0", 1413 | "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-3.5.0.tgz", 1414 | "integrity": "sha512-dpi+W6wexT4H3cjIhxC9SJABkR8TCfxycoHK+U4jxQXUdg50da+KnMgoWlQbF1tuXtUs4gnJtij1RjuGtKwBhw==", 1415 | "requires": { 1416 | "apollo-server-types": "^3.5.0" 1417 | } 1418 | }, 1419 | "apollo-server-types": { 1420 | "version": "3.5.0", 1421 | "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-3.5.0.tgz", 1422 | "integrity": "sha512-4JaZNu1kjrzIbppgc78hhIe2DFe+XONf8grprcjTOe0v8dIsuV0tFUnl+awTvTpHU1sdjRCKwnj382BebiL+qw==", 1423 | "requires": { 1424 | "apollo-reporting-protobuf": "^3.3.0", 1425 | "apollo-server-caching": "^3.3.0", 1426 | "apollo-server-env": "^4.2.0" 1427 | } 1428 | }, 1429 | "array-flatten": { 1430 | "version": "1.1.1", 1431 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 1432 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 1433 | }, 1434 | "async-retry": { 1435 | "version": "1.3.3", 1436 | "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", 1437 | "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", 1438 | "requires": { 1439 | "retry": "0.13.1" 1440 | } 1441 | }, 1442 | "body-parser": { 1443 | "version": "1.19.1", 1444 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", 1445 | "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", 1446 | "requires": { 1447 | "bytes": "3.1.1", 1448 | "content-type": "~1.0.4", 1449 | "debug": "2.6.9", 1450 | "depd": "~1.1.2", 1451 | "http-errors": "1.8.1", 1452 | "iconv-lite": "0.4.24", 1453 | "on-finished": "~2.3.0", 1454 | "qs": "6.9.6", 1455 | "raw-body": "2.4.2", 1456 | "type-is": "~1.6.18" 1457 | } 1458 | }, 1459 | "bytes": { 1460 | "version": "3.1.1", 1461 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", 1462 | "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" 1463 | }, 1464 | "commander": { 1465 | "version": "2.20.3", 1466 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 1467 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 1468 | }, 1469 | "content-disposition": { 1470 | "version": "0.5.4", 1471 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 1472 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 1473 | "requires": { 1474 | "safe-buffer": "5.2.1" 1475 | } 1476 | }, 1477 | "content-type": { 1478 | "version": "1.0.4", 1479 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 1480 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 1481 | }, 1482 | "cookie": { 1483 | "version": "0.4.1", 1484 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 1485 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" 1486 | }, 1487 | "cookie-signature": { 1488 | "version": "1.0.6", 1489 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 1490 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 1491 | }, 1492 | "cors": { 1493 | "version": "2.8.5", 1494 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 1495 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 1496 | "requires": { 1497 | "object-assign": "^4", 1498 | "vary": "^1" 1499 | } 1500 | }, 1501 | "cssfilter": { 1502 | "version": "0.0.10", 1503 | "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", 1504 | "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" 1505 | }, 1506 | "debug": { 1507 | "version": "2.6.9", 1508 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1509 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1510 | "requires": { 1511 | "ms": "2.0.0" 1512 | } 1513 | }, 1514 | "depd": { 1515 | "version": "1.1.2", 1516 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1517 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 1518 | }, 1519 | "destroy": { 1520 | "version": "1.0.4", 1521 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 1522 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 1523 | }, 1524 | "ee-first": { 1525 | "version": "1.1.1", 1526 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1527 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 1528 | }, 1529 | "encodeurl": { 1530 | "version": "1.0.2", 1531 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1532 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 1533 | }, 1534 | "escape-html": { 1535 | "version": "1.0.3", 1536 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1537 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 1538 | }, 1539 | "etag": { 1540 | "version": "1.8.1", 1541 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1542 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 1543 | }, 1544 | "express": { 1545 | "version": "4.17.2", 1546 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", 1547 | "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", 1548 | "requires": { 1549 | "accepts": "~1.3.7", 1550 | "array-flatten": "1.1.1", 1551 | "body-parser": "1.19.1", 1552 | "content-disposition": "0.5.4", 1553 | "content-type": "~1.0.4", 1554 | "cookie": "0.4.1", 1555 | "cookie-signature": "1.0.6", 1556 | "debug": "2.6.9", 1557 | "depd": "~1.1.2", 1558 | "encodeurl": "~1.0.2", 1559 | "escape-html": "~1.0.3", 1560 | "etag": "~1.8.1", 1561 | "finalhandler": "~1.1.2", 1562 | "fresh": "0.5.2", 1563 | "merge-descriptors": "1.0.1", 1564 | "methods": "~1.1.2", 1565 | "on-finished": "~2.3.0", 1566 | "parseurl": "~1.3.3", 1567 | "path-to-regexp": "0.1.7", 1568 | "proxy-addr": "~2.0.7", 1569 | "qs": "6.9.6", 1570 | "range-parser": "~1.2.1", 1571 | "safe-buffer": "5.2.1", 1572 | "send": "0.17.2", 1573 | "serve-static": "1.14.2", 1574 | "setprototypeof": "1.2.0", 1575 | "statuses": "~1.5.0", 1576 | "type-is": "~1.6.18", 1577 | "utils-merge": "1.0.1", 1578 | "vary": "~1.1.2" 1579 | } 1580 | }, 1581 | "fast-json-stable-stringify": { 1582 | "version": "2.1.0", 1583 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1584 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 1585 | }, 1586 | "finalhandler": { 1587 | "version": "1.1.2", 1588 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 1589 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 1590 | "requires": { 1591 | "debug": "2.6.9", 1592 | "encodeurl": "~1.0.2", 1593 | "escape-html": "~1.0.3", 1594 | "on-finished": "~2.3.0", 1595 | "parseurl": "~1.3.3", 1596 | "statuses": "~1.5.0", 1597 | "unpipe": "~1.0.0" 1598 | } 1599 | }, 1600 | "forwarded": { 1601 | "version": "0.2.0", 1602 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1603 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 1604 | }, 1605 | "fresh": { 1606 | "version": "0.5.2", 1607 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1608 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1609 | }, 1610 | "graphql": { 1611 | "version": "16.2.0", 1612 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.2.0.tgz", 1613 | "integrity": "sha512-MuQd7XXrdOcmfwuLwC2jNvx0n3rxIuNYOxUtiee5XOmfrWo613ar2U8pE7aHAKh8VwfpifubpD9IP+EdEAEOsA==" 1614 | }, 1615 | "graphql-tag": { 1616 | "version": "2.12.6", 1617 | "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", 1618 | "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", 1619 | "requires": { 1620 | "tslib": "^2.1.0" 1621 | } 1622 | }, 1623 | "http-errors": { 1624 | "version": "1.8.1", 1625 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 1626 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 1627 | "requires": { 1628 | "depd": "~1.1.2", 1629 | "inherits": "2.0.4", 1630 | "setprototypeof": "1.2.0", 1631 | "statuses": ">= 1.5.0 < 2", 1632 | "toidentifier": "1.0.1" 1633 | } 1634 | }, 1635 | "iconv-lite": { 1636 | "version": "0.4.24", 1637 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1638 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1639 | "requires": { 1640 | "safer-buffer": ">= 2.1.2 < 3" 1641 | } 1642 | }, 1643 | "inherits": { 1644 | "version": "2.0.4", 1645 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1646 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1647 | }, 1648 | "ipaddr.js": { 1649 | "version": "1.9.1", 1650 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1651 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1652 | }, 1653 | "lodash.sortby": { 1654 | "version": "4.7.0", 1655 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1656 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 1657 | }, 1658 | "loglevel": { 1659 | "version": "1.8.0", 1660 | "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", 1661 | "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==" 1662 | }, 1663 | "long": { 1664 | "version": "4.0.0", 1665 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1666 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1667 | }, 1668 | "lru-cache": { 1669 | "version": "6.0.0", 1670 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1671 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1672 | "requires": { 1673 | "yallist": "^4.0.0" 1674 | } 1675 | }, 1676 | "media-typer": { 1677 | "version": "0.3.0", 1678 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1679 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1680 | }, 1681 | "merge-descriptors": { 1682 | "version": "1.0.1", 1683 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1684 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1685 | }, 1686 | "methods": { 1687 | "version": "1.1.2", 1688 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1689 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1690 | }, 1691 | "mime": { 1692 | "version": "1.6.0", 1693 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1694 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1695 | }, 1696 | "mime-db": { 1697 | "version": "1.51.0", 1698 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 1699 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" 1700 | }, 1701 | "mime-types": { 1702 | "version": "2.1.34", 1703 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 1704 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 1705 | "requires": { 1706 | "mime-db": "1.51.0" 1707 | } 1708 | }, 1709 | "ms": { 1710 | "version": "2.0.0", 1711 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1712 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1713 | }, 1714 | "negotiator": { 1715 | "version": "0.6.2", 1716 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1717 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1718 | }, 1719 | "node-fetch": { 1720 | "version": "2.6.6", 1721 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", 1722 | "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", 1723 | "requires": { 1724 | "whatwg-url": "^5.0.0" 1725 | } 1726 | }, 1727 | "object-assign": { 1728 | "version": "4.1.1", 1729 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1730 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1731 | }, 1732 | "on-finished": { 1733 | "version": "2.3.0", 1734 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1735 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1736 | "requires": { 1737 | "ee-first": "1.1.1" 1738 | } 1739 | }, 1740 | "parseurl": { 1741 | "version": "1.3.3", 1742 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1743 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1744 | }, 1745 | "path-to-regexp": { 1746 | "version": "0.1.7", 1747 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1748 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1749 | }, 1750 | "proxy-addr": { 1751 | "version": "2.0.7", 1752 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1753 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1754 | "requires": { 1755 | "forwarded": "0.2.0", 1756 | "ipaddr.js": "1.9.1" 1757 | } 1758 | }, 1759 | "qs": { 1760 | "version": "6.9.6", 1761 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", 1762 | "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" 1763 | }, 1764 | "range-parser": { 1765 | "version": "1.2.1", 1766 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1767 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1768 | }, 1769 | "raw-body": { 1770 | "version": "2.4.2", 1771 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", 1772 | "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", 1773 | "requires": { 1774 | "bytes": "3.1.1", 1775 | "http-errors": "1.8.1", 1776 | "iconv-lite": "0.4.24", 1777 | "unpipe": "1.0.0" 1778 | } 1779 | }, 1780 | "retry": { 1781 | "version": "0.13.1", 1782 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", 1783 | "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" 1784 | }, 1785 | "safe-buffer": { 1786 | "version": "5.2.1", 1787 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1788 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1789 | }, 1790 | "safer-buffer": { 1791 | "version": "2.1.2", 1792 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1793 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1794 | }, 1795 | "send": { 1796 | "version": "0.17.2", 1797 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", 1798 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", 1799 | "requires": { 1800 | "debug": "2.6.9", 1801 | "depd": "~1.1.2", 1802 | "destroy": "~1.0.4", 1803 | "encodeurl": "~1.0.2", 1804 | "escape-html": "~1.0.3", 1805 | "etag": "~1.8.1", 1806 | "fresh": "0.5.2", 1807 | "http-errors": "1.8.1", 1808 | "mime": "1.6.0", 1809 | "ms": "2.1.3", 1810 | "on-finished": "~2.3.0", 1811 | "range-parser": "~1.2.1", 1812 | "statuses": "~1.5.0" 1813 | }, 1814 | "dependencies": { 1815 | "ms": { 1816 | "version": "2.1.3", 1817 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1818 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1819 | } 1820 | } 1821 | }, 1822 | "serve-static": { 1823 | "version": "1.14.2", 1824 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", 1825 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", 1826 | "requires": { 1827 | "encodeurl": "~1.0.2", 1828 | "escape-html": "~1.0.3", 1829 | "parseurl": "~1.3.3", 1830 | "send": "0.17.2" 1831 | } 1832 | }, 1833 | "setprototypeof": { 1834 | "version": "1.2.0", 1835 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1836 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1837 | }, 1838 | "sha.js": { 1839 | "version": "2.4.11", 1840 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1841 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1842 | "requires": { 1843 | "inherits": "^2.0.1", 1844 | "safe-buffer": "^5.0.1" 1845 | } 1846 | }, 1847 | "statuses": { 1848 | "version": "1.5.0", 1849 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1850 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1851 | }, 1852 | "toidentifier": { 1853 | "version": "1.0.1", 1854 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1855 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1856 | }, 1857 | "tr46": { 1858 | "version": "0.0.3", 1859 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1860 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 1861 | }, 1862 | "tslib": { 1863 | "version": "2.3.1", 1864 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 1865 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 1866 | }, 1867 | "type-is": { 1868 | "version": "1.6.18", 1869 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1870 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1871 | "requires": { 1872 | "media-typer": "0.3.0", 1873 | "mime-types": "~2.1.24" 1874 | } 1875 | }, 1876 | "unpipe": { 1877 | "version": "1.0.0", 1878 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1879 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1880 | }, 1881 | "utils-merge": { 1882 | "version": "1.0.1", 1883 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1884 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1885 | }, 1886 | "uuid": { 1887 | "version": "8.3.2", 1888 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1889 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 1890 | }, 1891 | "value-or-promise": { 1892 | "version": "1.0.11", 1893 | "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz", 1894 | "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==" 1895 | }, 1896 | "vary": { 1897 | "version": "1.1.2", 1898 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1899 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1900 | }, 1901 | "webidl-conversions": { 1902 | "version": "3.0.1", 1903 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1904 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 1905 | }, 1906 | "whatwg-url": { 1907 | "version": "5.0.0", 1908 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1909 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 1910 | "requires": { 1911 | "tr46": "~0.0.3", 1912 | "webidl-conversions": "^3.0.0" 1913 | } 1914 | }, 1915 | "xss": { 1916 | "version": "1.0.10", 1917 | "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.10.tgz", 1918 | "integrity": "sha512-qmoqrRksmzqSKvgqzN0055UFWY7OKx1/9JWeRswwEVX9fCG5jcYRxa/A2DHcmZX6VJvjzHRQ2STeeVcQkrmLSw==", 1919 | "requires": { 1920 | "commander": "^2.20.3", 1921 | "cssfilter": "0.0.10" 1922 | } 1923 | }, 1924 | "yallist": { 1925 | "version": "4.0.0", 1926 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1927 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1928 | } 1929 | } 1930 | } 1931 | -------------------------------------------------------------------------------- /integrations/services/apollo-server/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "apollo-server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "keywords": [], 7 | "author": "", 8 | "license": "ISC", 9 | "dependencies": { 10 | "apollo-server": "^3.6.0", 11 | "graphql": "^16.2.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /integrations/services/express-js/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:latest 2 | 3 | MAINTAINER Zaid Albirawi 4 | 5 | RUN mkdir -p /var/www/ 6 | COPY ./integrations/services/express-js/src/* /var/www/ 7 | WORKDIR /var/www 8 | RUN npm i 9 | 10 | ENTRYPOINT node index.js 11 | -------------------------------------------------------------------------------- /integrations/services/express-js/Readme.md: -------------------------------------------------------------------------------- 1 | ## Getting Started 2 | 1. Run docker-compose from the repo root using the following command `docker-compose -f docker-compose.yml -f integrations/services/express-js/docker-compose.yml up`. 3 | 2. Navigate to [http://localhost:3000](http://localhost:3000) in your browser to access the Tyk Dashboard. 4 | 3. Navigate to [http://localhost:3030/user](http://localhost:3030/user) in your browser to access the Simple Node.js API. 5 | -------------------------------------------------------------------------------- /integrations/services/express-js/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | 3 | services: 4 | express-js: 5 | build: 6 | context: . 7 | dockerfile: ./integrations/services/express-js/Dockerfile 8 | 9 | container_name: express-js 10 | 11 | ports: 12 | - "3030:3030" 13 | 14 | networks: 15 | - tyk 16 | -------------------------------------------------------------------------------- /integrations/services/express-js/src/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var app = express(); 3 | 4 | app.get('/user', (req, res, next) => { 5 | res.json({ 6 | users: [ 7 | { 8 | username: 'test1', 9 | email: 'test1@tyk.io', 10 | }, 11 | { 12 | username: 'test2', 13 | email: 'test2@tyk.io', 14 | }, 15 | { 16 | username: 'test3', 17 | email: 'test3@tyk.io', 18 | }, 19 | ], 20 | }); 21 | }); 22 | 23 | app.listen(3030); 24 | -------------------------------------------------------------------------------- /integrations/services/express-js/src/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simple-node-api", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.7", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 10 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 11 | "requires": { 12 | "mime-types": "~2.1.24", 13 | "negotiator": "0.6.2" 14 | } 15 | }, 16 | "array-flatten": { 17 | "version": "1.1.1", 18 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 19 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 20 | }, 21 | "body-parser": { 22 | "version": "1.19.0", 23 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 24 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 25 | "requires": { 26 | "bytes": "3.1.0", 27 | "content-type": "~1.0.4", 28 | "debug": "2.6.9", 29 | "depd": "~1.1.2", 30 | "http-errors": "1.7.2", 31 | "iconv-lite": "0.4.24", 32 | "on-finished": "~2.3.0", 33 | "qs": "6.7.0", 34 | "raw-body": "2.4.0", 35 | "type-is": "~1.6.17" 36 | } 37 | }, 38 | "bytes": { 39 | "version": "3.1.0", 40 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 41 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 42 | }, 43 | "content-disposition": { 44 | "version": "0.5.3", 45 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 46 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 47 | "requires": { 48 | "safe-buffer": "5.1.2" 49 | } 50 | }, 51 | "content-type": { 52 | "version": "1.0.4", 53 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 54 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 55 | }, 56 | "cookie": { 57 | "version": "0.4.0", 58 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 59 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 60 | }, 61 | "cookie-signature": { 62 | "version": "1.0.6", 63 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 64 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 65 | }, 66 | "debug": { 67 | "version": "2.6.9", 68 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 69 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 70 | "requires": { 71 | "ms": "2.0.0" 72 | } 73 | }, 74 | "depd": { 75 | "version": "1.1.2", 76 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 77 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 78 | }, 79 | "destroy": { 80 | "version": "1.0.4", 81 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 82 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 83 | }, 84 | "ee-first": { 85 | "version": "1.1.1", 86 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 87 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 88 | }, 89 | "encodeurl": { 90 | "version": "1.0.2", 91 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 92 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 93 | }, 94 | "escape-html": { 95 | "version": "1.0.3", 96 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 97 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 98 | }, 99 | "etag": { 100 | "version": "1.8.1", 101 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 102 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 103 | }, 104 | "express": { 105 | "version": "4.17.1", 106 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 107 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 108 | "requires": { 109 | "accepts": "~1.3.7", 110 | "array-flatten": "1.1.1", 111 | "body-parser": "1.19.0", 112 | "content-disposition": "0.5.3", 113 | "content-type": "~1.0.4", 114 | "cookie": "0.4.0", 115 | "cookie-signature": "1.0.6", 116 | "debug": "2.6.9", 117 | "depd": "~1.1.2", 118 | "encodeurl": "~1.0.2", 119 | "escape-html": "~1.0.3", 120 | "etag": "~1.8.1", 121 | "finalhandler": "~1.1.2", 122 | "fresh": "0.5.2", 123 | "merge-descriptors": "1.0.1", 124 | "methods": "~1.1.2", 125 | "on-finished": "~2.3.0", 126 | "parseurl": "~1.3.3", 127 | "path-to-regexp": "0.1.7", 128 | "proxy-addr": "~2.0.5", 129 | "qs": "6.7.0", 130 | "range-parser": "~1.2.1", 131 | "safe-buffer": "5.1.2", 132 | "send": "0.17.1", 133 | "serve-static": "1.14.1", 134 | "setprototypeof": "1.1.1", 135 | "statuses": "~1.5.0", 136 | "type-is": "~1.6.18", 137 | "utils-merge": "1.0.1", 138 | "vary": "~1.1.2" 139 | } 140 | }, 141 | "finalhandler": { 142 | "version": "1.1.2", 143 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 144 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 145 | "requires": { 146 | "debug": "2.6.9", 147 | "encodeurl": "~1.0.2", 148 | "escape-html": "~1.0.3", 149 | "on-finished": "~2.3.0", 150 | "parseurl": "~1.3.3", 151 | "statuses": "~1.5.0", 152 | "unpipe": "~1.0.0" 153 | } 154 | }, 155 | "forwarded": { 156 | "version": "0.1.2", 157 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 158 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 159 | }, 160 | "fresh": { 161 | "version": "0.5.2", 162 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 163 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 164 | }, 165 | "http-errors": { 166 | "version": "1.7.2", 167 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 168 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 169 | "requires": { 170 | "depd": "~1.1.2", 171 | "inherits": "2.0.3", 172 | "setprototypeof": "1.1.1", 173 | "statuses": ">= 1.5.0 < 2", 174 | "toidentifier": "1.0.0" 175 | } 176 | }, 177 | "iconv-lite": { 178 | "version": "0.4.24", 179 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 180 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 181 | "requires": { 182 | "safer-buffer": ">= 2.1.2 < 3" 183 | } 184 | }, 185 | "inherits": { 186 | "version": "2.0.3", 187 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 188 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 189 | }, 190 | "ipaddr.js": { 191 | "version": "1.9.1", 192 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 193 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 194 | }, 195 | "media-typer": { 196 | "version": "0.3.0", 197 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 198 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 199 | }, 200 | "merge-descriptors": { 201 | "version": "1.0.1", 202 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 203 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 204 | }, 205 | "methods": { 206 | "version": "1.1.2", 207 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 208 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 209 | }, 210 | "mime": { 211 | "version": "1.6.0", 212 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 213 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 214 | }, 215 | "mime-db": { 216 | "version": "1.44.0", 217 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 218 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 219 | }, 220 | "mime-types": { 221 | "version": "2.1.27", 222 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 223 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 224 | "requires": { 225 | "mime-db": "1.44.0" 226 | } 227 | }, 228 | "ms": { 229 | "version": "2.0.0", 230 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 231 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 232 | }, 233 | "negotiator": { 234 | "version": "0.6.2", 235 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 236 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 237 | }, 238 | "on-finished": { 239 | "version": "2.3.0", 240 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 241 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 242 | "requires": { 243 | "ee-first": "1.1.1" 244 | } 245 | }, 246 | "parseurl": { 247 | "version": "1.3.3", 248 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 249 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 250 | }, 251 | "path-to-regexp": { 252 | "version": "0.1.7", 253 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 254 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 255 | }, 256 | "proxy-addr": { 257 | "version": "2.0.6", 258 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 259 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 260 | "requires": { 261 | "forwarded": "~0.1.2", 262 | "ipaddr.js": "1.9.1" 263 | } 264 | }, 265 | "qs": { 266 | "version": "6.7.0", 267 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 268 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 269 | }, 270 | "range-parser": { 271 | "version": "1.2.1", 272 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 273 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 274 | }, 275 | "raw-body": { 276 | "version": "2.4.0", 277 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 278 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 279 | "requires": { 280 | "bytes": "3.1.0", 281 | "http-errors": "1.7.2", 282 | "iconv-lite": "0.4.24", 283 | "unpipe": "1.0.0" 284 | } 285 | }, 286 | "safe-buffer": { 287 | "version": "5.1.2", 288 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 289 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 290 | }, 291 | "safer-buffer": { 292 | "version": "2.1.2", 293 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 294 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 295 | }, 296 | "send": { 297 | "version": "0.17.1", 298 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 299 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 300 | "requires": { 301 | "debug": "2.6.9", 302 | "depd": "~1.1.2", 303 | "destroy": "~1.0.4", 304 | "encodeurl": "~1.0.2", 305 | "escape-html": "~1.0.3", 306 | "etag": "~1.8.1", 307 | "fresh": "0.5.2", 308 | "http-errors": "~1.7.2", 309 | "mime": "1.6.0", 310 | "ms": "2.1.1", 311 | "on-finished": "~2.3.0", 312 | "range-parser": "~1.2.1", 313 | "statuses": "~1.5.0" 314 | }, 315 | "dependencies": { 316 | "ms": { 317 | "version": "2.1.1", 318 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 319 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 320 | } 321 | } 322 | }, 323 | "serve-static": { 324 | "version": "1.14.1", 325 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 326 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 327 | "requires": { 328 | "encodeurl": "~1.0.2", 329 | "escape-html": "~1.0.3", 330 | "parseurl": "~1.3.3", 331 | "send": "0.17.1" 332 | } 333 | }, 334 | "setprototypeof": { 335 | "version": "1.1.1", 336 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 337 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 338 | }, 339 | "statuses": { 340 | "version": "1.5.0", 341 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 342 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 343 | }, 344 | "toidentifier": { 345 | "version": "1.0.0", 346 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 347 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 348 | }, 349 | "type-is": { 350 | "version": "1.6.18", 351 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 352 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 353 | "requires": { 354 | "media-typer": "0.3.0", 355 | "mime-types": "~2.1.24" 356 | } 357 | }, 358 | "unpipe": { 359 | "version": "1.0.0", 360 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 361 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 362 | }, 363 | "utils-merge": { 364 | "version": "1.0.1", 365 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 366 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 367 | }, 368 | "vary": { 369 | "version": "1.1.2", 370 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 371 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 372 | } 373 | } 374 | } 375 | -------------------------------------------------------------------------------- /integrations/services/express-js/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-js", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Zaid Albirawi", 10 | "license": "ISC", 11 | "dependencies": { 12 | "express": "^4.17.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /tyk-dashboard/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM tykio/tyk-dashboard:v4.0rc8 2 | 3 | MAINTAINER Zaid Albirawi 4 | 5 | RUN echo "deb http://us.archive.ubuntu.com/ubuntu vivid main universe" >> sudo vim /etc/apt/sources.list 6 | RUN apt update 7 | RUN apt install -y curl jq procps 8 | 9 | COPY ./tyk-dashboard/scripts/wait-for-it.sh /bin/ 10 | COPY ./tyk-dashboard/scripts/init.sh /bin/start.sh 11 | RUN chmod +x /bin/wait-for-it.sh 12 | RUN chmod +x /bin/start.sh 13 | 14 | ENTRYPOINT /bin/start.sh 15 | -------------------------------------------------------------------------------- /tyk-dashboard/scripts/init.sh: -------------------------------------------------------------------------------- 1 | # Start Tyk Dashboard. 2 | /opt/tyk-dashboard/tyk-analytics --conf=/opt/tyk-dashboard/tyk_analytics.conf & 3 | 4 | # Wait for dashboard to open connection. 5 | /bin/wait-for-it.sh -t 300 localhost:$TYK_DB_LISTENPORT 6 | 7 | # Bootstrap Tyk dashboard with default organisation. 8 | curl -X POST localhost:$TYK_DB_LISTENPORT/bootstrap \ 9 | --data "owner_name=$ORG" \ 10 | --data "owner_slug=$SLUG" \ 11 | --data "email_address=$EMAIL" \ 12 | --data "first_name=$FIRST" \ 13 | --data "last_name=$LAST" \ 14 | --data "password=$PASSWORD" \ 15 | --data "confirm_password=$PASSWORD" \ 16 | --data "terms=on" 17 | 18 | # Get organisation ID. 19 | ORG=`curl -X GET localhost:$TYK_DB_LISTENPORT/admin/organisations \ 20 | --header "admin-auth: 12345" | \ 21 | jq -r '.organisations[0].id'` 22 | 23 | # Create a new admin user and get user access token. 24 | TOKEN=`curl -X POST localhost:$TYK_DB_LISTENPORT/admin/users \ 25 | --header "admin-auth: 12345" \ 26 | --data "{ 27 | \"org_id\": \"$ORG\", 28 | \"first_name\": \"Admin\", 29 | \"last_name\": \"User\", 30 | \"email_address\": \"admin@tyk.io\", 31 | \"active\": true, 32 | \"user_permissions\": { \"IsAdmin\": \"admin\" } 33 | }" | \ 34 | jq -r '.Message'` 35 | 36 | # Create Portal. 37 | curl -X POST localhost:$TYK_DB_LISTENPORT/api/portal/configuration \ 38 | --header "Authorization: $TOKEN" \ 39 | --data "{}" 40 | 41 | # Initialize Catalogue. 42 | curl -X POST localhost:$TYK_DB_LISTENPORT/api/portal/catalogue \ 43 | --header "Authorization: $TOKEN" \ 44 | --data "{ 45 | \"org_id\": \"$ORG\" 46 | }" 47 | 48 | # Create Portal Home Page. 49 | curl -X POST localhost:$TYK_DB_LISTENPORT/api/portal/pages \ 50 | --header "Authorization: $TOKEN" \ 51 | --data "{ 52 | \"is_homepage\": true, 53 | \"template_name\": \"\", 54 | \"title\": \"Developer Portal Home\", 55 | \"slug\": \"/\", 56 | \"fields\": { 57 | \"JumboCTATitle\": \"Tyk Developer Portal\", 58 | \"SubHeading\": \"Sub Header\", 59 | \"JumboCTALink\": \"#cta\", 60 | \"JumboCTALinkTitle\": \"Your awesome APIs, hosted with Tyk!\", 61 | \"PanelOneContent\": \"Panel 1 content.\", 62 | \"PanelOneLink\": \"#panel1\", 63 | \"PanelOneLinkTitle\": \"Panel 1 Button\", 64 | \"PanelOneTitle\": \"Panel 1 Title\", 65 | \"PanelThereeContent\": \"\", 66 | \"PanelThreeContent\": \"Panel 3 content.\", 67 | \"PanelThreeLink\": \"#panel3\", 68 | \"PanelThreeLinkTitle\": \"Panel 3 Button\", 69 | \"PanelThreeTitle\": \"Panel 3 Title\", 70 | \"PanelTwoContent\": \"Panel 2 content.\", 71 | \"PanelTwoLink\": \"#panel2\", 72 | \"PanelTwoLinkTitle\": \"Panel 2 Button\", 73 | \"PanelTwoTitle\": \"Panel 2 Title\" 74 | } 75 | }" 76 | 77 | # Set Protal CNAME. 78 | curl -X PUT localhost:$TYK_DB_LISTENPORT/api/portal/cname \ 79 | --header "Authorization: $TOKEN" \ 80 | --data "{ 81 | \"cname\": \"\" 82 | }" 83 | 84 | # Overwrite init script. 85 | echo "/opt/tyk-dashboard/tyk-analytics --conf=/opt/tyk-dashboard/tyk_analytics.conf" > /bin/start.sh 86 | 87 | echo "\nRestarting Dashboard...\n" 88 | echo TYK_TOKEN="$TOKEN" >> $HOME/.bashrc 89 | 90 | # Restart Tyk Dashboard 91 | kill `ps | grep "tyk-analytics" | awk '{ print $1 }'` 92 | /opt/tyk-dashboard/tyk-analytics --conf=/opt/tyk-dashboard/tyk_analytics.conf 93 | -------------------------------------------------------------------------------- /tyk-dashboard/scripts/wait-for-it.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Use this script to test if a given TCP host/port are available 3 | 4 | WAITFORIT_cmdname=${0##*/} 5 | 6 | echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } 7 | 8 | usage() 9 | { 10 | cat << USAGE >&2 11 | Usage: 12 | $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args] 13 | -h HOST | --host=HOST Host or IP under test 14 | -p PORT | --port=PORT TCP port under test 15 | Alternatively, you specify the host and port as host:port 16 | -s | --strict Only execute subcommand if the test succeeds 17 | -q | --quiet Don't output any status messages 18 | -t TIMEOUT | --timeout=TIMEOUT 19 | Timeout in seconds, zero for no timeout 20 | -- COMMAND ARGS Execute command with args after the test finishes 21 | USAGE 22 | exit 1 23 | } 24 | 25 | wait_for() 26 | { 27 | if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then 28 | echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" 29 | else 30 | echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout" 31 | fi 32 | WAITFORIT_start_ts=$(date +%s) 33 | while : 34 | do 35 | if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then 36 | nc -z $WAITFORIT_HOST $WAITFORIT_PORT 37 | WAITFORIT_result=$? 38 | else 39 | (echo > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 40 | WAITFORIT_result=$? 41 | fi 42 | if [[ $WAITFORIT_result -eq 0 ]]; then 43 | WAITFORIT_end_ts=$(date +%s) 44 | echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" 45 | break 46 | fi 47 | sleep 1 48 | done 49 | return $WAITFORIT_result 50 | } 51 | 52 | wait_for_wrapper() 53 | { 54 | # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 55 | if [[ $WAITFORIT_QUIET -eq 1 ]]; then 56 | timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & 57 | else 58 | timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & 59 | fi 60 | WAITFORIT_PID=$! 61 | trap "kill -INT -$WAITFORIT_PID" INT 62 | wait $WAITFORIT_PID 63 | WAITFORIT_RESULT=$? 64 | if [[ $WAITFORIT_RESULT -ne 0 ]]; then 65 | echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" 66 | fi 67 | return $WAITFORIT_RESULT 68 | } 69 | 70 | # process arguments 71 | while [[ $# -gt 0 ]] 72 | do 73 | case "$1" in 74 | *:* ) 75 | WAITFORIT_hostport=(${1//:/ }) 76 | WAITFORIT_HOST=${WAITFORIT_hostport[0]} 77 | WAITFORIT_PORT=${WAITFORIT_hostport[1]} 78 | shift 1 79 | ;; 80 | --child) 81 | WAITFORIT_CHILD=1 82 | shift 1 83 | ;; 84 | -q | --quiet) 85 | WAITFORIT_QUIET=1 86 | shift 1 87 | ;; 88 | -s | --strict) 89 | WAITFORIT_STRICT=1 90 | shift 1 91 | ;; 92 | -h) 93 | WAITFORIT_HOST="$2" 94 | if [[ $WAITFORIT_HOST == "" ]]; then break; fi 95 | shift 2 96 | ;; 97 | --host=*) 98 | WAITFORIT_HOST="${1#*=}" 99 | shift 1 100 | ;; 101 | -p) 102 | WAITFORIT_PORT="$2" 103 | if [[ $WAITFORIT_PORT == "" ]]; then break; fi 104 | shift 2 105 | ;; 106 | --port=*) 107 | WAITFORIT_PORT="${1#*=}" 108 | shift 1 109 | ;; 110 | -t) 111 | WAITFORIT_TIMEOUT="$2" 112 | if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi 113 | shift 2 114 | ;; 115 | --timeout=*) 116 | WAITFORIT_TIMEOUT="${1#*=}" 117 | shift 1 118 | ;; 119 | --) 120 | shift 121 | WAITFORIT_CLI=("$@") 122 | break 123 | ;; 124 | --help) 125 | usage 126 | ;; 127 | *) 128 | echoerr "Unknown argument: $1" 129 | usage 130 | ;; 131 | esac 132 | done 133 | 134 | if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then 135 | echoerr "Error: you need to provide a host and port to test." 136 | usage 137 | fi 138 | 139 | WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} 140 | WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} 141 | WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} 142 | WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} 143 | 144 | # check to see if timeout is from busybox? 145 | WAITFORIT_TIMEOUT_PATH=$(type -p timeout) 146 | WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH) 147 | if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then 148 | WAITFORIT_ISBUSY=1 149 | WAITFORIT_BUSYTIMEFLAG="-t" 150 | 151 | else 152 | WAITFORIT_ISBUSY=0 153 | WAITFORIT_BUSYTIMEFLAG="" 154 | fi 155 | 156 | if [[ $WAITFORIT_CHILD -gt 0 ]]; then 157 | wait_for 158 | WAITFORIT_RESULT=$? 159 | exit $WAITFORIT_RESULT 160 | else 161 | if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then 162 | wait_for_wrapper 163 | WAITFORIT_RESULT=$? 164 | else 165 | wait_for 166 | WAITFORIT_RESULT=$? 167 | fi 168 | fi 169 | 170 | if [[ $WAITFORIT_CLI != "" ]]; then 171 | if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then 172 | echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess" 173 | exit $WAITFORIT_RESULT 174 | fi 175 | exec "${WAITFORIT_CLI[@]}" 176 | else 177 | exit $WAITFORIT_RESULT 178 | fi 179 | --------------------------------------------------------------------------------