├── .circleci ├── config.yml ├── deploy.sh └── deploy_next.sh ├── .gitignore ├── README.md ├── custom └── nextjs-serverless │ ├── .gitignore │ ├── README.md │ ├── components │ ├── App.js │ ├── AuthorList.js │ ├── ErrorMessage.js │ └── Header.js │ ├── index.js │ ├── lib │ ├── init-apollo.js │ └── with-apollo-client.js │ ├── next.config.js │ ├── now.json │ ├── package-lock.json │ ├── package.json │ └── pages │ ├── _app.js │ ├── about.js │ ├── blog │ ├── hello.js │ └── index.js │ └── index.js ├── event-triggers ├── README.md └── echo │ ├── .url_env │ ├── index.js │ └── lambdaCtx.js ├── hasura ├── config.yaml └── migrations │ ├── 1549464976403_create_table_public_user.down.yaml │ ├── 1549464976403_create_table_public_user.up.yaml │ ├── 1549618019541_create_trigger_echo.down.yaml │ ├── 1549618019541_create_trigger_echo.up.yaml │ ├── 1549628697839_create_remote_schema_hello.down.yaml │ └── 1549628697839_create_remote_schema_hello.up.yaml ├── local ├── docker-compose.yaml ├── event-triggers.env ├── localDevelopment.js ├── package-lock.json ├── package.json └── remote-schemas.env └── remote-schemas ├── README.md └── hello-schema ├── .gitignore ├── .url_env ├── index.js ├── lambdaCtx.js ├── package-lock.json └── package.json /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | jobs: 3 | build_dev: 4 | working_directory: ~/project 5 | docker: 6 | - image: buildpack-deps:xenial 7 | environment: 8 | DEPLOY_ENVIRONMENT: dev 9 | steps: 10 | - checkout 11 | - run: 12 | name: Setup Environment Variables 13 | command: | 14 | echo 'export AWS_REST_API_ID="$AWS_DEV_REST_API_ID"' >> $BASH_ENV 15 | echo 'export AWS_TASK_FAMILY="$AWS_DEV_TASK_FAMILY"' >> $BASH_ENV 16 | echo 'export AWS_HASURA_ECS_CLUSTER="$AWS_DEV_HASURA_ECS_CLUSTER"' >> $BASH_ENV 17 | echo 'export GIT_SHA="$(git rev-parse --short HEAD)"' >> $BASH_ENV 18 | # Better to create a docker image for this step 19 | - run: 20 | name: Install awscli, jq and npm 21 | command: | 22 | apt-get update 23 | apt-get install -y jq zip python3-pip 24 | pip3 install awscli --upgrade 25 | curl -sL https://deb.nodesource.com/setup_8.x | bash - 26 | apt-get install -y nodejs 27 | npm install -g npm@5 28 | aws configure set default.region $AWS_REGION 29 | - run: 30 | name: Create Nextjs Serverless 31 | command: | 32 | cd custom/nextjs-serverless 33 | NODE_ENV=development npm ci 34 | npm run build 35 | rm -rf node_modules 36 | NODE_ENV=production npm ci 37 | zip -r "handler.zip" . 38 | ../../.circleci/deploy_next.sh 39 | - run: 40 | name: Apply migrations 41 | command: | 42 | echo "Installing hasura-cli" 43 | curl -L https://github.com/hasura/graphql-engine/raw/master/cli/get.sh | bash 44 | echo "Applying migrations" 45 | hasura migrate apply --project hasura --endpoint $HASURA_DEV_ENDPOINT --access-key $HASURA_DEV_ACCESS_KEY 46 | if [ -f hasura/migrations/metadata.yaml ]; then 47 | echo "Applying metadata" 48 | hasura metadata apply --project hasura --endpoint $HASURA_DEV_ENDPOINT --access-key $HASURA_DEV_ACCESS_KEY 49 | fi 50 | echo "Finished" 51 | 52 | build_stg: 53 | working_directory: ~/project 54 | docker: 55 | - image: buildpack-deps:xenial 56 | environment: 57 | DEPLOY_ENVIRONMENT: stg 58 | steps: 59 | - checkout 60 | - run: 61 | name: Apply migrations 62 | command: | 63 | echo "Installing hasura-cli" 64 | curl -L https://github.com/hasura/graphql-engine/raw/master/cli/get.sh | bash 65 | echo "Applying migrations" 66 | hasura migrate apply --project hasura --endpoint $HASURA_STG_ENDPOINT --access-key $HASURA_STG_ACCESS_KEY 67 | if [ -f hasura/migrations/metadata.yaml ]; then 68 | echo "Applying metadata" 69 | hasura metadata apply --project hasura --endpoint $HASURA_STG_ENDPOINT --access-key $HASURA_STG_ACCESS_KEY 70 | fi 71 | echo "Finished" 72 | build_prod: 73 | working_directory: ~/project 74 | docker: 75 | - image: buildpack-deps:xenial 76 | environment: 77 | DEPLOY_ENVIRONMENT: prod 78 | steps: 79 | - checkout 80 | - run: 81 | name: Apply migrations 82 | command: | 83 | echo "Installing hasura-cli" 84 | curl -L https://github.com/hasura/graphql-engine/raw/master/cli/get.sh | bash 85 | echo "Applying migrations" 86 | hasura migrate apply --project hasura --endpoint $HASURA_PROD_ENDPOINT --access-key $HASURA_PROD_ACCESS_KEY 87 | if [ -f hasura/migrations/metadata.yaml ]; then 88 | echo "Applying metadata" 89 | hasura metadata apply --project hasura --endpoint $HASURA_PROD_ENDPOINT --access-key $HASURA_PROD_ACCESS_KEY 90 | fi 91 | echo "Finished" 92 | workflows: 93 | version: 2 94 | full: 95 | jobs: 96 | - build_dev: 97 | filters: 98 | branches: 99 | only: master 100 | - build_stg: 101 | filters: 102 | branches: 103 | only: staging 104 | - build_prod: 105 | filters: 106 | branches: 107 | only: prod 108 | -------------------------------------------------------------------------------- /.circleci/deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -o nounset 4 | set -o errexit 5 | set -o pipefail 6 | 7 | current_function="$1" 8 | current_build="${current_function}_${DEPLOY_ENVIRONMENT}" 9 | cd $current_function 10 | 11 | if [ -f package-lock.json ]; then 12 | npm ci 13 | fi 14 | zip -r "${current_build}.zip" . 15 | echo "Checking if function $current_build already exists" 16 | functionArn=$(aws lambda list-functions | jq -r --arg CURRENTFUNCTION "$current_build" '.Functions[] | select(.FunctionName==$CURRENTFUNCTION) | .FunctionArn') 17 | if [ -z "$functionArn" ] 18 | then 19 | echo "Creating function: $current_build" 20 | functionArn=$(aws lambda create-function --function-name "$current_build" --runtime nodejs8.10 --role arn:aws:iam::$AWS_ACCOUNT_ID:role/lambda-basic-role --handler lambdaCtx.handler --zip-file fileb://./"${current_build}.zip" | jq -r '.FunctionArn') 21 | if [ -z "$functionArn" ] 22 | then 23 | echo "Failed to get functionArn" 24 | exit 1 25 | fi 26 | fi 27 | echo "Updating function: $current_build" 28 | aws lambda update-function-code --function-name "$current_build" --zip-file fileb://./"${current_build}.zip" --no-publish 29 | echo "Publishing version" 30 | version=$(aws lambda publish-version --function-name "$current_build" | jq .Version | xargs) 31 | echo "Check for alias" 32 | CREATE_ALIAS_EXIT_CODE=0 33 | aws lambda get-alias --function-name "$current_build" --name $GIT_SHA || CREATE_ALIAS_EXIT_CODE=$? 34 | if [ $CREATE_ALIAS_EXIT_CODE -ne 0 ] 35 | then 36 | echo "Creating alias" 37 | aws lambda create-alias --function-name "$current_build" --description "alias for $GIT_SHA" --function-version $version --name $GIT_SHA 38 | fi 39 | echo "Check for API resource" 40 | parentID=$(aws apigateway get-resources --rest-api-id $AWS_REST_API_ID | jq -r '.items[] | select(.path=="/") | .id') 41 | resourceID=$(aws apigateway get-resources --rest-api-id $AWS_REST_API_ID | jq -r --arg CURRENTPATH "/$current_function" '.items[] | select(.path==$CURRENTPATH) | .id') 42 | echo "parentID: $parentID, resourceID: $resourceID" 43 | if [ -z "$resourceID" ] 44 | then 45 | echo "Creating resource" 46 | resourceID=$(aws apigateway create-resource --rest-api-id $AWS_REST_API_ID --parent-id $parentID --path-part "$current_function" | jq -r '.id') 47 | echo "Created resource with id: $resourceID" 48 | fi 49 | echo "Check for Resource Method" 50 | GET_METHOD_EXIT_CODE=0 51 | aws apigateway get-method --rest-api-id $AWS_REST_API_ID --resource-id $resourceID --http-method POST || GET_METHOD_EXIT_CODE=$? 52 | if [ $GET_METHOD_EXIT_CODE -ne 0 ] 53 | then 54 | echo "Creating Resource Method" 55 | aws apigateway put-method --rest-api-id $AWS_REST_API_ID --resource-id $resourceID --http-method POST --authorization-type NONE 56 | fi 57 | echo "Check for integration" 58 | GET_INTEGRATION_EXIT_CODE=0 59 | aws apigateway get-integration --rest-api-id $AWS_REST_API_ID --resource-id $resourceID --http-method POST || GET_INTEGRATION_EXIT_CODE=$? 60 | if [ $GET_INTEGRATION_EXIT_CODE -ne 0 ] 61 | then 62 | echo "Creating Integration" 63 | aws apigateway put-integration --rest-api-id $AWS_REST_API_ID --resource-id $resourceID --http-method POST --type AWS_PROXY --integration-http-method POST --uri arn:aws:apigateway:$AWS_REGION:lambda:path/2015-03-31/functions/$functionArn:$GIT_SHA/invocations 64 | fi 65 | aws apigateway update-integration --rest-api-id $AWS_REST_API_ID --resource-id $resourceID --http-method POST --patch-operations "[ {\"op\" : \"replace\",\"path\" : \"/uri\",\"value\" : \"arn:aws:apigateway:$AWS_REGION:lambda:path/2015-03-31/functions/$functionArn:$GIT_SHA/invocations\"} ]" 66 | echo "Delete API Gateway permission if exists" 67 | REMOVE_PERMISSION_EXIT_CODE=0 68 | STATEMENT_ID="${GIT_SHA}_${current_build}" 69 | aws lambda remove-permission --function-name arn:aws:lambda:$AWS_REGION:$AWS_ACCOUNT_ID:function:$current_build:$GIT_SHA --statement-id $STATEMENT_ID || REMOVE_PERMISSION_EXIT_CODE=$? 70 | echo "Creating API Gateway permission" 71 | aws lambda add-permission --function-name arn:aws:lambda:$AWS_REGION:$AWS_ACCOUNT_ID:function:$current_build:$GIT_SHA --source-arn "arn:aws:execute-api:$AWS_REGION:$AWS_ACCOUNT_ID:$AWS_REST_API_ID/*/*/$current_function" --principal apigateway.amazonaws.com --statement-id $STATEMENT_ID --action lambda:InvokeFunction 72 | echo "Creating deployment" 73 | aws apigateway create-deployment --rest-api-id $AWS_REST_API_ID --stage-name default 74 | echo "Updating Hasura env with API url" 75 | echo "Check if env file exists" 76 | if [ -f .url_env ]; then 77 | echo "found .url_env file" 78 | ENV_VAR=$(<.url_env) 79 | echo "Hasura env to be updated: $ENV_VAR" 80 | TASK_ARN=$(aws ecs list-task-definitions --family-prefix $AWS_TASK_FAMILY --sort DESC --max-items 1 | jq -r '.taskDefinitionArns[]') 81 | if [ -z "$TASK_ARN" ] 82 | then 83 | echo "Cannot find any ECS Task Definition revisions" 84 | exit 1 85 | fi 86 | FULL_URL="https://${AWS_REST_API_ID}.execute-api.${AWS_REGION}.amazonaws.com/default/$current_function" 87 | TASK_DEF=$(aws ecs describe-task-definition --task-definition ${TASK_ARN} | jq '.taskDefinition') 88 | CONTAINER_DEF=$(echo $TASK_DEF | jq -r --arg ENV_VAR "$ENV_VAR" --arg FULL_URL "$FULL_URL" '.containerDefinitions[0].environment+=[{"name": $ENV_VAR, "value": $FULL_URL}] | .containerDefinitions') 89 | MEMORY_DEF=$(echo $TASK_DEF | jq -r '.memory') 90 | NETWORK_MODE=$(echo $TASK_DEF | jq -r '.networkMode') 91 | EXECUTION_ROLE_ARN=$(echo $TASK_DEF | jq -r '.executionRoleArn') 92 | REQUIRES_COMPATIBILITIES=$(echo $TASK_DEF | jq -r '.requiresCompatibilities') 93 | CPU_DEF=$(echo $TASK_DEF | jq -r '.cpu') 94 | 95 | revision=$(aws ecs register-task-definition --family "$AWS_TASK_FAMILY" --memory "$MEMORY_DEF" --network-mode "$NETWORK_MODE" --execution-role-arn "$EXECUTION_ROLE_ARN" --requires-compatibilities "${REQUIRES_COMPATIBILITIES}" --cpu "$CPU_DEF" --container-definitions "${CONTAINER_DEF}" | jq '.taskDefinition.revision') 96 | aws ecs update-service --cluster $AWS_HASURA_ECS_CLUSTER --service hasura --task-definition $AWS_TASK_FAMILY:$revision 97 | else 98 | echo "could not find .url_env, cannot update Hasura env with API url" 99 | exit 1 100 | fi 101 | -------------------------------------------------------------------------------- /.circleci/deploy_next.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -o nounset 4 | set -o errexit 5 | set -o pipefail 6 | 7 | default_path=./.next/serverless/pages 8 | default_root_path=/ 9 | 10 | pages_path="${1-$default_path}" 11 | root_path="${2-$default_root_path}" 12 | for entry in $(ls $pages_path | grep -v "^_") 13 | do 14 | current_function=$(basename $entry .js) 15 | if [ "$root_path" == "/" ]; then 16 | current_build="${current_function}_${DEPLOY_ENVIRONMENT}" 17 | else 18 | current_build="$(echo ${root_path#"/"} | tr / _)${current_function}_${DEPLOY_ENVIRONMENT}" 19 | root_path=${root_path%"/"} 20 | fi 21 | current_path=$pages_path/$entry 22 | 23 | if [[ -f $current_path ]]; then 24 | echo "Checking if function $current_build already exists" 25 | functionArn=$(aws lambda list-functions | jq -r --arg CURRENTFUNCTION "$current_build" '.Functions[] | select(.FunctionName==$CURRENTFUNCTION) | .FunctionArn') 26 | if [ -z "$functionArn" ] 27 | then 28 | echo "Creating function: $current_build" 29 | functionArn=$(aws lambda create-function --function-name "$current_build" --timeout 10 --memory-size 256 --runtime nodejs8.10 --role arn:aws:iam::$AWS_ACCOUNT_ID:role/lambda-basic-role --handler index.handler --zip-file fileb://./handler.zip | jq -r '.FunctionArn') 30 | if [ -z "$functionArn" ] 31 | then 32 | echo "Failed to get functionArn" 33 | exit 1 34 | fi 35 | fi 36 | echo "Updating function: $current_build" 37 | aws lambda update-function-code --function-name "$current_build" --zip-file fileb://./handler.zip --no-publish 38 | echo "Publishing version" 39 | version=$(aws lambda publish-version --function-name "$current_build" | jq .Version | xargs) 40 | echo "Check for alias" 41 | CREATE_ALIAS_EXIT_CODE=0 42 | aws lambda get-alias --function-name "$current_build" --name $GIT_SHA || CREATE_ALIAS_EXIT_CODE=$? 43 | if [ $CREATE_ALIAS_EXIT_CODE -ne 0 ] 44 | then 45 | echo "Creating alias" 46 | aws lambda create-alias --function-name "$current_build" --description "alias for $GIT_SHA" --function-version $version --name $GIT_SHA 47 | fi 48 | fi 49 | parentID=$(aws apigateway get-resources --rest-api-id $AWS_REST_API_ID | jq -r --arg CURRENTPATH "${root_path}" '.items[] | select(.path==$CURRENTPATH) | .id') 50 | resourceID=$(aws apigateway get-resources --rest-api-id $AWS_REST_API_ID | jq -r --arg CURRENTPATH "$current_function" --arg PARENTID "$parentID" '.items[] | select((.pathPart==$CURRENTPATH) and .parentId==$PARENTID) | .id') 51 | echo "parentID: $parentID, resourceID: $resourceID" 52 | if [ -z "$resourceID" ] 53 | then 54 | echo "Creating resource" 55 | resourceID=$(aws apigateway create-resource --rest-api-id $AWS_REST_API_ID --parent-id $parentID --path-part "$current_function" | jq -r '.id') 56 | echo "Created resource with id: $resourceID" 57 | fi 58 | if [[ -d $current_path ]]; then 59 | ../../.circleci/deploy_next.sh $current_path ${current_path#"$default_path"}/ 60 | fi 61 | if [[ -f $current_path ]]; then 62 | echo "Check for Resource Method" 63 | GET_METHOD_EXIT_CODE=0 64 | aws apigateway get-method --rest-api-id $AWS_REST_API_ID --resource-id $resourceID --http-method GET || GET_METHOD_EXIT_CODE=$? 65 | if [ $GET_METHOD_EXIT_CODE -ne 0 ] 66 | then 67 | echo "Creating Resource Method" 68 | aws apigateway put-method --rest-api-id $AWS_REST_API_ID --resource-id $resourceID --http-method GET --authorization-type NONE 69 | fi 70 | echo "Check for integration" 71 | GET_INTEGRATION_EXIT_CODE=0 72 | aws apigateway get-integration --rest-api-id $AWS_REST_API_ID --resource-id $resourceID --http-method GET || GET_INTEGRATION_EXIT_CODE=$? 73 | if [ $GET_INTEGRATION_EXIT_CODE -ne 0 ] 74 | then 75 | echo "Creating Integration" 76 | aws apigateway put-integration --rest-api-id $AWS_REST_API_ID --resource-id $resourceID --http-method GET --type AWS_PROXY --integration-http-method POST --uri arn:aws:apigateway:$AWS_REGION:lambda:path/2015-03-31/functions/$functionArn:$GIT_SHA/invocations 77 | fi 78 | aws apigateway update-integration --rest-api-id $AWS_REST_API_ID --resource-id $resourceID --http-method GET --patch-operations "[ {\"op\" : \"replace\",\"path\" : \"/uri\",\"value\" : \"arn:aws:apigateway:$AWS_REGION:lambda:path/2015-03-31/functions/$functionArn:$GIT_SHA/invocations\"} ]" 79 | echo "Delete API Gateway permission if exists" 80 | REMOVE_PERMISSION_EXIT_CODE=0 81 | STATEMENT_ID="${GIT_SHA}_${current_build}" 82 | aws lambda remove-permission --function-name arn:aws:lambda:$AWS_REGION:$AWS_ACCOUNT_ID:function:$current_build:$GIT_SHA --statement-id $STATEMENT_ID || REMOVE_PERMISSION_EXIT_CODE=$? 83 | echo "Creating API Gateway permission" 84 | aws lambda add-permission --function-name arn:aws:lambda:$AWS_REGION:$AWS_ACCOUNT_ID:function:$current_build:$GIT_SHA --source-arn "arn:aws:execute-api:$AWS_REGION:$AWS_ACCOUNT_ID:$AWS_REST_API_ID/*/GET${root_path%"/"}/$current_function" --principal apigateway.amazonaws.com --statement-id $STATEMENT_ID --action lambda:InvokeFunction 85 | fi 86 | echo "Creating deployment" 87 | aws apigateway create-deployment --rest-api-id $AWS_REST_API_ID --stage-name default 88 | done 89 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | tmp/ 2 | local/node_modules/ 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hasura-aws-stack 2 | 3 | ## Stack 4 | 5 | - Hasura on ECS Fargate (auto-scale) 6 | - Aurora Postgres or RDS Postgres 7 | - Lambdas for remote schemas and event triggers 8 | - Docker for local dev 9 | - CircleCI for CI/CD 10 | 11 | ## Setup Hasura on Fargate 12 | 13 | 1. Go to ECS in AWS Console. 14 | 2. Create a ECS cluster on Fargate with required specs. 15 | 3. Create a service called `hasura` in your cluster. 16 | 4. Create a Task Definition with Hasura GraphQL Engine container and environment variables. 17 | 5. Add the Task to your hasura service. 18 | 19 | If you are want to use multiple-instances/auto-scale, you will need to choose an ALB as the load balancer. 20 | 21 | ## Local Dev 22 | 23 | 1. Git clone this repo: 24 | 25 | ``` 26 | $ git clone git@github.com:hasura/hasura-aws-stack.git 27 | $ cd hasura-aws-stack 28 | $ # You are now in the project directory 29 | ``` 30 | 31 | 2. Run Hasura using docker-compose [ref](https://github.com/hasura/graphql-engine/tree/master/install-manifests/docker-compose) : 32 | 33 | ``` 34 | In project directory: 35 | 36 | $ cd local 37 | $ docker-compose up -d 38 | ``` 39 | 40 | 3. Start local development API server ( first make sure all dependencies are met for local API server): 41 | 42 | ``` 43 | In project directory: 44 | 45 | $ # install dependencies for local API server for e.g. all remote schemas and event triggers 46 | $ # cd remote-schemas/account-schema 47 | $ # npm i 48 | 49 | $ cd local 50 | $ node localDevelopment.js 51 | ``` 52 | 53 | 4. Apply migrations locally 54 | 55 | ``` 56 | In project directory; 57 | 58 | $ cd hasura 59 | $ hasura migrate apply 60 | ``` 61 | 62 | 5. Start the console 63 | 64 | ``` 65 | In project directory: 66 | 67 | $ cd hasura 68 | $ hasura console 69 | ``` 70 | 71 | ### Local Dev - Event Triggers 72 | 73 | 1. Create a new folder in `event-triggers` folder: 74 | 75 | ``` 76 | In project directory: 77 | 78 | $ cd event-triggers 79 | $ mkdir echo 80 | ``` 81 | 82 | 2. Write your function in `echo/index.js`. Make sure you export one function. Ref: [echo](event-triggers/echo/index.js) 83 | 84 | 3. Add corresponding endpoint in local development API server. Ref: [localDevelopment](local/localDevelopment.js) 85 | 86 | 4. Start the local development API server: 87 | 88 | ``` 89 | In project directory: 90 | 91 | $ cd local 92 | $ node localDevelopment.js 93 | ``` 94 | 95 | 5. Add event trigger URL as environment variable in `local/event-triggers.env`. Ref: [event-triggers.env](local/event-triggers.env) 96 | 97 | 6. Restart Hasura (for refreshing environment variables): 98 | 99 | ``` 100 | In project directory: 101 | 102 | $ cd local 103 | $ docker-compose down 104 | $ docker-compose up -d 105 | ``` 106 | 107 | 7. Add event trigger through Hasura console using the above environment variable as `WEBHOOK_URL`. 108 | 109 | ### Local Dev - Remote Schemas 110 | 111 | 1. Create a new folder in `remote-schemas` folder: 112 | 113 | ``` 114 | In project directory: 115 | 116 | $ cd remote-schemas 117 | $ mkdir hello-schema 118 | ``` 119 | 120 | 2. Write your graphql functions in `hello-schema/index.js`. Make sure you export the typedefs and resolvers. Ref: [hello](remote-schemas/hello-schema/index.js) 121 | 122 | 3. Add corresponding server setup in local development API server. Ref: [localDevelopment](local/localDevelopment.js) 123 | 124 | 4. Start the local development API server: 125 | 126 | ``` 127 | In project directory: 128 | 129 | $ cd local 130 | $ node localDevelopment.js 131 | ``` 132 | 133 | 5. Add remote schema URL as environment variable in `local/remote-schemas.env`. Ref: [remote-schemas.env](local/remote-schemas.env) 134 | 135 | 6. Restart Hasura (for refreshing environment variables): 136 | 137 | ``` 138 | In project directory: 139 | 140 | $ cd local 141 | $ docker-compose down 142 | $ docker-compose up -d 143 | ``` 144 | 145 | 7. Add remote schema through Hasura console using the above environment variable as `GraphQL Server URL`. 146 | 147 | ## CI/CD with CircleCI 148 | 149 | We want to keep 3 environments in the cloud: 150 | 151 | 1. Dev 152 | 2. Staging 153 | 3. Prod 154 | 155 | The CI/CD system will deploy the application to each environment based on the branch on which the code is pushed: 156 | 157 | | _branch_ | _environment_ | 158 | |----------|---------------| 159 | | master | dev | 160 | | staging | staging | 161 | | prod | prod | 162 | 163 | 1. Start by creating a project in CircleCI. 164 | 165 | 2. Add your git repo in your CircleCI dashboard. This repo has all the CircleCI configuration in `.circleci/config.yml` file. 166 | 167 | 3. Create an API Gateway per environment (copy the `REST_API_ID`). 168 | 169 | 4. Create a Lambda Basic Execution Role (name it `lambda-basic-role`): [ref](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) 170 | 171 | 5. Configure environment variables in your CircleCI project from the dashboard. This example requires the following environment variables: 172 | 173 | _AWS_ACCOUNT_ID_ 174 | 175 | _AWS_REGION_ 176 | 177 | _AWS_ACCESS_KEY_ID_ 178 | 179 | _AWS_SECRET_ACCESS_KEY_ 180 | 181 | _AWS_DEV_REST_API_ID_ 182 | 183 | _AWS_DEV_HASURA_ECS_CLUSTER_ 184 | 185 | _AWS_DEV_TASK_FAMILY_ 186 | 187 | _HASURA_DEV_ENDPOINT_ 188 | 189 | _HASURA_DEV_ACCESS_KEY_ 190 | 191 | _AWS_STG_REST_API_ID_ 192 | 193 | _AWS_STG_HASURA_ECS_CLUSTER_ 194 | 195 | _AWS_STG_TASK_FAMILY_ 196 | 197 | _HASURA_STG_ENDPOINT_ 198 | 199 | _HASURA_STG_ACCESS_KEY_ 200 | 201 | _AWS_PROD_REST_API_ID_ 202 | 203 | _AWS_PROD_HASURA_ECS_CLUSTER_ 204 | 205 | _AWS_PROD_TASK_FAMILY_ 206 | 207 | _HASURA_PROD_ENDPOINT_ 208 | 209 | _HASURA_PROD_ACCESS_KEY_ 210 | 211 | 6. Git push or merge PR to master branch. This will deploy to dev environment. 212 | 213 | 7. Once you have tested the dev environment, you can promote to staging and prod environments by merging dev with staging and staging with prod respectively. 214 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | ### Node ### 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | 10 | # Runtime data 11 | pids 12 | *.pid 13 | *.seed 14 | *.pid.lock 15 | 16 | # Directory for instrumented libs generated by jscoverage/JSCover 17 | lib-cov 18 | 19 | # Coverage directory used by tools like istanbul 20 | coverage 21 | 22 | # nyc test coverage 23 | .nyc_output 24 | 25 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 26 | .grunt 27 | 28 | # Bower dependency directory (https://bower.io/) 29 | bower_components 30 | 31 | # node-waf configuration 32 | .lock-wscript 33 | 34 | # Compiled binary addons (https://nodejs.org/api/addons.html) 35 | build/Release 36 | 37 | # Dependency directories 38 | node_modules/ 39 | jspm_packages/ 40 | 41 | # TypeScript v1 declaration files 42 | typings/ 43 | 44 | # Optional npm cache directory 45 | .npm 46 | 47 | # Optional eslint cache 48 | .eslintcache 49 | 50 | # Optional REPL history 51 | .node_repl_history 52 | 53 | # Output of 'npm pack' 54 | *.tgz 55 | 56 | # Yarn Integrity file 57 | .yarn-integrity 58 | 59 | # dotenv environment variables file 60 | .env 61 | .env.test 62 | 63 | # parcel-bundler cache (https://parceljs.org/) 64 | .cache 65 | 66 | # next.js build output 67 | .next 68 | 69 | # nuxt.js build output 70 | .nuxt 71 | 72 | # vuepress build output 73 | .vuepress/dist 74 | 75 | # Serverless directories 76 | .serverless/ 77 | 78 | # FuseBox cache 79 | .fusebox/ 80 | 81 | # DynamoDB Local files 82 | .dynamodb/ 83 | 84 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/README.md: -------------------------------------------------------------------------------- 1 | ## Install it and run: 2 | 3 | ```bash 4 | npm install 5 | npm run dev 6 | # or 7 | yarn 8 | yarn dev 9 | ``` 10 | 11 | Deploy it to the cloud with [now](https://zeit.co/now) ([download](https://zeit.co/download)): 12 | 13 | ```bash 14 | now 15 | ``` 16 | 17 | ## The idea behind the example 18 | 19 | [Apollo](https://www.apollographql.com/client/) is a GraphQL client that allows you to easily query the exact data you need from a GraphQL server. In addition to fetching and mutating data, Apollo analyzes your queries and their results to construct a client-side cache of your data, which is kept up to date as further queries and mutations are run, fetching more results from the server. 20 | 21 | In this simple example, we integrate Apollo seamlessly with Next by wrapping our *pages/_app.js* inside a [higher-order component (HOC)](https://facebook.github.io/react/docs/higher-order-components.html). Using the HOC pattern we're able to pass down a central store of query result data created by Apollo into our React component hierarchy defined inside each page of our Next application. 22 | 23 | On initial page load, while on the server and inside `getInitialProps`, we invoke the Apollo method, [`getDataFromTree`](https://www.apollographql.com/docs/react/features/server-side-rendering.html#getDataFromTree). This method returns a promise; at the point in which the promise resolves, our Apollo Client store is completely initialized. 24 | 25 | 26 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/components/App.js: -------------------------------------------------------------------------------- 1 | export default ({ children }) => ( 2 |
3 | {children} 4 | 41 |
42 | ) 43 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/components/AuthorList.js: -------------------------------------------------------------------------------- 1 | import { Query } from 'react-apollo' 2 | import gql from 'graphql-tag' 3 | 4 | export const authorQuery = gql` 5 | query author($skip: Int!) { 6 | author(offset: $skip) { 7 | id 8 | name 9 | } 10 | author_aggregate { 11 | aggregate { 12 | count 13 | } 14 | } 15 | } 16 | ` 17 | export const authorQueryVars = { 18 | skip: 0, 19 | } 20 | 21 | export default function AuthorList () { 22 | return ( 23 | 24 | {({ loading, error, data: { author, author_aggregate }, fetchMore }) => { 25 | if (error) return 26 | if (loading) return
Loading
27 | 28 | const areMoreAuthors = author.length < author_aggregate.aggregate.count 29 | return ( 30 |
31 |
    32 | {author.map((a, index) => ( 33 |
  • 34 |
    35 | {index + 1}. 36 | {a.name} 37 |
    38 |
  • 39 | ))} 40 |
41 | {areMoreAuthors ? ( 42 | 46 | ) : ( 47 | '' 48 | )} 49 | 87 |
88 | ) 89 | }} 90 |
91 | ) 92 | } 93 | 94 | function loadMoreAuthors (author, fetchMore) { 95 | fetchMore({ 96 | variables: { 97 | skip: author.length 98 | }, 99 | updateQuery: (previousResult, { fetchMoreResult }) => { 100 | if (!fetchMoreResult) { 101 | return previousResult 102 | } 103 | return Object.assign({}, previousResult, { 104 | // Append the new results to the old one 105 | author: [...previousResult.author, ...fetchMoreResult.author] 106 | }) 107 | } 108 | }) 109 | } 110 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/components/ErrorMessage.js: -------------------------------------------------------------------------------- 1 | export default ({ message }) => ( 2 | 13 | ) 14 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/components/Header.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | import { withRouter } from 'next/router' 3 | 4 | const Header = ({ router: { pathname } }) => ( 5 |
6 | 7 | Home 8 | 9 | 10 | About 11 | 12 | 25 |
26 | ) 27 | 28 | export default withRouter(Header) 29 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/index.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const serverless = require("serverless-http"); 3 | const isProduction = process.env.NODE_ENV === "production"; 4 | 5 | // setup Express and hook up Next.js handler 6 | const app = express(); 7 | 8 | app.get('/', require('./.next/serverless/pages/index').render) 9 | app.get('*', (req, res) => { 10 | const pathname = req.url 11 | try { 12 | require(`./.next/serverless/pages${pathname}`).render(req, res) 13 | } catch (err) { 14 | require('./.next/serverless/pages/_error').render(req, res) 15 | } 16 | }) 17 | 18 | // for local development (serverless offline) 19 | if (!isProduction) { 20 | // host the static files 21 | app.use("/_next/static", express.static("./.next/static")); 22 | app.use("/static", express.static("./static")); 23 | } 24 | 25 | // 404 handler 26 | app.get("*", require("./.next/serverless/pages/_error").render); 27 | 28 | // export the wrapped handler for the Lambda runtime 29 | exports.handler = serverless(app); 30 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/lib/init-apollo.js: -------------------------------------------------------------------------------- 1 | import { ApolloClient, InMemoryCache, HttpLink } from 'apollo-boost' 2 | import fetch from 'isomorphic-unfetch' 3 | 4 | let apolloClient = null 5 | 6 | // Polyfill fetch() on the server (used by apollo-client) 7 | if (!process.browser) { 8 | global.fetch = fetch 9 | } 10 | 11 | function create (initialState) { 12 | return new ApolloClient({ 13 | connectToDevTools: process.browser, 14 | ssrMode: !process.browser, // Disables forceFetch on the server (so queries are only run once) 15 | link: new HttpLink({ 16 | uri: 'http://localhost:8090/v1alpha1/graphql', // Server URL (must be absolute) 17 | credentials: 'same-origin' // Additional fetch() options like `credentials` or `headers` 18 | }), 19 | cache: new InMemoryCache().restore(initialState || {}) 20 | }) 21 | } 22 | 23 | export default function initApollo (initialState) { 24 | // Make sure to create a new client for every server-side request so that data 25 | // isn't shared between connections (which would be bad) 26 | if (!process.browser) { 27 | return create(initialState) 28 | } 29 | 30 | // Reuse client on the client-side 31 | if (!apolloClient) { 32 | apolloClient = create(initialState) 33 | } 34 | 35 | return apolloClient 36 | } 37 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/lib/with-apollo-client.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import initApollo from './init-apollo' 3 | import Head from 'next/head' 4 | import { getDataFromTree } from 'react-apollo' 5 | 6 | export default App => { 7 | return class Apollo extends React.Component { 8 | static displayName = 'withApollo(App)' 9 | static async getInitialProps (ctx) { 10 | const { Component, router } = ctx 11 | 12 | let appProps = {} 13 | if (App.getInitialProps) { 14 | appProps = await App.getInitialProps(ctx) 15 | } 16 | 17 | // Run all GraphQL queries in the component tree 18 | // and extract the resulting data 19 | const apollo = initApollo() 20 | if (!process.browser) { 21 | try { 22 | // Run all GraphQL queries 23 | await getDataFromTree( 24 | 30 | ) 31 | } catch (error) { 32 | // Prevent Apollo Client GraphQL errors from crashing SSR. 33 | // Handle them in components via the data.error prop: 34 | // https://www.apollographql.com/docs/react/api/react-apollo.html#graphql-query-data-error 35 | console.error('Error while running `getDataFromTree`', error) 36 | } 37 | 38 | // getDataFromTree does not call componentWillUnmount 39 | // head side effect therefore need to be cleared manually 40 | Head.rewind() 41 | } 42 | 43 | // Extract query data from the Apollo store 44 | const apolloState = apollo.cache.extract() 45 | 46 | return { 47 | ...appProps, 48 | apolloState 49 | } 50 | } 51 | 52 | constructor (props) { 53 | super(props) 54 | this.apolloClient = initApollo(props.apolloState) 55 | } 56 | 57 | render () { 58 | return 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/next.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | target: "serverless" 3 | } -------------------------------------------------------------------------------- /custom/nextjs-serverless/now.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "builds": [ 4 | { "src": "next.config.js", "use": "@now/next" } 5 | ] 6 | } -------------------------------------------------------------------------------- /custom/nextjs-serverless/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "with-apollo", 3 | "version": "2.0.0", 4 | "scripts": { 5 | "dev": "next", 6 | "build": "next build", 7 | "start": "next start" 8 | }, 9 | "dependencies": { 10 | "express": "^4.16.4", 11 | "serverless-http": "^1.9.0" 12 | }, 13 | "author": "", 14 | "license": "ISC", 15 | "devDependencies": { 16 | "apollo-boost": "^0.1.16", 17 | "encoding": "^0.1.12", 18 | "graphql": "^14.0.2", 19 | "isomorphic-unfetch": "^3.0.0", 20 | "next": "latest", 21 | "prop-types": "^15.6.2", 22 | "react": "^16.7.0", 23 | "react-apollo": "^2.1.11", 24 | "react-dom": "^16.7.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/pages/_app.js: -------------------------------------------------------------------------------- 1 | import App, { Container } from 'next/app' 2 | import React from 'react' 3 | import withApolloClient from '../lib/with-apollo-client' 4 | import { ApolloProvider } from 'react-apollo' 5 | 6 | class MyApp extends App { 7 | render () { 8 | const { Component, pageProps, apolloClient } = this.props 9 | return ( 10 | 11 | 12 | 13 | 14 | 15 | ) 16 | } 17 | } 18 | 19 | export default withApolloClient(MyApp) 20 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/pages/about.js: -------------------------------------------------------------------------------- 1 | import App from '../components/App' 2 | import Header from '../components/Header' 3 | 4 | export default () => ( 5 | 6 |
7 |
8 |

The Idea Behind This Example

9 |

10 | Apollo is a GraphQL 11 | client that allows you to easily query the exact data you need from a 12 | GraphQL server. In addition to fetching and mutating data, Apollo 13 | analyzes your queries and their results to construct a client-side cache 14 | of your data, which is kept up to date as further queries and mutations 15 | are run, fetching more results from the server. 16 |

17 |

18 | In this simple example, we integrate Apollo seamlessly with{' '} 19 | Next by wrapping our pages 20 | inside a{' '} 21 | 22 | higher-order component (HOC) 23 | 24 | . Using the HOC pattern we're able to pass down a central store of query 25 | result data created by Apollo into our React component hierarchy defined 26 | inside each page of our Next application. 27 |

28 |

29 | On initial page load, while on the server and inside getInitialProps, we 30 | invoke the Apollo method,{' '} 31 | 32 | getDataFromTree 33 | 34 | . This method returns a promise; at the point in which the promise 35 | resolves, our Apollo Client store is completely initialized. 36 |

37 |
38 | 39 | ) 40 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/pages/blog/hello.js: -------------------------------------------------------------------------------- 1 | import App from '../../components/App' 2 | 3 | export default () => ( 4 | 5 | This is hello component 6 | 7 | ) 8 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/pages/blog/index.js: -------------------------------------------------------------------------------- 1 | import App from '../../components/App' 2 | import Header from '../../components/Header' 3 | import AuthorList from '../../components/AuthorList' 4 | 5 | export default () => ( 6 | 7 |
8 | 9 | 10 | ) 11 | -------------------------------------------------------------------------------- /custom/nextjs-serverless/pages/index.js: -------------------------------------------------------------------------------- 1 | import App from '../components/App' 2 | import Header from '../components/Header' 3 | import AuthorList from '../components/AuthorList' 4 | 5 | export default () => ( 6 | 7 |
8 | 9 | 10 | ) 11 | -------------------------------------------------------------------------------- /event-triggers/README.md: -------------------------------------------------------------------------------- 1 | # Event Triggers 2 | -------------------------------------------------------------------------------- /event-triggers/echo/.url_env: -------------------------------------------------------------------------------- 1 | EVENT_TRIGGER_ECHO_URL -------------------------------------------------------------------------------- /event-triggers/echo/index.js: -------------------------------------------------------------------------------- 1 | // Lambda which just echoes back the event data 2 | 3 | function echo(event) { 4 | let responseBody = ''; 5 | if (event.op === "INSERT") { 6 | responseBody = `New user ${event.data.new.id} inserted, with data: ${event.data.new.name}`; 7 | } 8 | else if (event.op === "UPDATE") { 9 | responseBody = `User ${event.data.new.id} updated, with data: ${event.data.new.name}`; 10 | } 11 | else if (event.op === "DELETE") { 12 | responseBody = `User ${event.data.old.id} deleted, with data: ${event.data.old.name}`; 13 | } 14 | 15 | return responseBody; 16 | }; 17 | 18 | exports.echo = echo; 19 | -------------------------------------------------------------------------------- /event-triggers/echo/lambdaCtx.js: -------------------------------------------------------------------------------- 1 | const echo = require('./index').echo; 2 | 3 | exports.handler = (event, context, callback) => { 4 | const hasuraEvent = JSON.parse(event.body); 5 | console.log(`processing event ${hasuraEvent.id}`); 6 | try { 7 | var result = echo(hasuraEvent.event); 8 | return callback(null, { 9 | statusCode: 200, 10 | body: JSON.stringify(result) 11 | }); 12 | } catch(e) { 13 | console.log(e); 14 | return callback(null, { 15 | statusCode: 500, 16 | body: e.toString() 17 | }); 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /hasura/config.yaml: -------------------------------------------------------------------------------- 1 | endpoint: http://localhost:8080 2 | -------------------------------------------------------------------------------- /hasura/migrations/1549464976403_create_table_public_user.down.yaml: -------------------------------------------------------------------------------- 1 | - args: 2 | sql: DROP TABLE "public"."user" 3 | type: run_sql 4 | -------------------------------------------------------------------------------- /hasura/migrations/1549464976403_create_table_public_user.up.yaml: -------------------------------------------------------------------------------- 1 | - args: 2 | sql: CREATE TABLE "public"."user"("id" serial NOT NULL, "name" text NOT NULL, 3 | PRIMARY KEY ("id") ); 4 | type: run_sql 5 | - args: 6 | name: user 7 | schema: public 8 | type: add_existing_table_or_view 9 | -------------------------------------------------------------------------------- /hasura/migrations/1549618019541_create_trigger_echo.down.yaml: -------------------------------------------------------------------------------- 1 | - args: 2 | name: echo 3 | type: delete_event_trigger 4 | -------------------------------------------------------------------------------- /hasura/migrations/1549618019541_create_trigger_echo.up.yaml: -------------------------------------------------------------------------------- 1 | - args: 2 | delete: 3 | columns: 4 | - id 5 | - name 6 | headers: [] 7 | insert: 8 | columns: 9 | - id 10 | - name 11 | name: echo 12 | table: 13 | name: user 14 | schema: public 15 | update: 16 | columns: 17 | - id 18 | - name 19 | webhook_from_env: EVENT_TRIGGER_ECHO_URL 20 | type: create_event_trigger 21 | -------------------------------------------------------------------------------- /hasura/migrations/1549628697839_create_remote_schema_hello.down.yaml: -------------------------------------------------------------------------------- 1 | - args: 2 | name: hello 3 | type: remove_remote_schema 4 | -------------------------------------------------------------------------------- /hasura/migrations/1549628697839_create_remote_schema_hello.up.yaml: -------------------------------------------------------------------------------- 1 | - args: 2 | definition: 3 | forward_client_headers: true 4 | headers: [] 5 | url_from_env: REMOTE_SCHEMA_HELLO_URL 6 | name: hello 7 | type: add_remote_schema 8 | -------------------------------------------------------------------------------- /local/docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3.6' 2 | services: 3 | postgres: 4 | image: postgres 5 | restart: always 6 | network_mode: host 7 | graphql-engine: 8 | image: hasura/graphql-engine:v1.0.0-alpha37 9 | network_mode: host 10 | depends_on: 11 | - "postgres" 12 | restart: always 13 | environment: 14 | HASURA_GRAPHQL_DATABASE_URL: postgres://postgres:@localhost:5432/postgres 15 | HASURA_GRAPHQL_ENABLE_CONSOLE: "false" # set to "false" to disable console 16 | ## uncomment next line to set an access key 17 | # HASURA_GRAPHQL_ACCESS_KEY: mysecretaccesskey 18 | env_file: 19 | - event-triggers.env 20 | - remote-schemas.env 21 | 22 | 23 | -------------------------------------------------------------------------------- /local/event-triggers.env: -------------------------------------------------------------------------------- 1 | EVENT_TRIGGER_ECHO_URL=http://localhost:8081/echo 2 | -------------------------------------------------------------------------------- /local/localDevelopment.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const bodyParser = require('body-parser'); 3 | const { ApolloServer } = require('apollo-server'); 4 | const app = express(); 5 | 6 | const { echo } = require('../event-triggers/echo'); 7 | 8 | const { typeDefs, resolvers } = require('../remote-schemas/hello-schema'); 9 | 10 | app.use(bodyParser.json()); 11 | 12 | app.post('/echo', function (req, res) { 13 | try{ 14 | var result = echo(req.body.event); 15 | res.json(result); 16 | } catch(e) { 17 | console.log(e); 18 | res.status(500).json(e.toString()); 19 | } 20 | }); 21 | 22 | var server = app.listen(8081, function () { 23 | console.log("server listening on port 8081"); 24 | }); 25 | 26 | const helloSchema = new ApolloServer({ typeDefs, resolvers }); 27 | 28 | helloSchema.listen().then(({ url }) => { 29 | console.log(`hello schema ready at ${url}`); 30 | }); 31 | -------------------------------------------------------------------------------- /local/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "local", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@apollographql/apollo-tools": { 8 | "version": "0.3.2", 9 | "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.3.2.tgz", 10 | "integrity": "sha512-IiuO1XaxxvbZa19gGHBOEgQKmMHB+ghXaNjSbY5dWqCEQgBDgJBA/2a1Oq9tMPhEPAmEY2FOuhaWRxxKxmVdlQ==", 11 | "requires": { 12 | "apollo-env": "0.3.2" 13 | } 14 | }, 15 | "@apollographql/graphql-playground-html": { 16 | "version": "1.6.6", 17 | "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.6.tgz", 18 | "integrity": "sha512-lqK94b+caNtmKFs5oUVXlSpN3sm5IXZ+KfhMxOtr0LR2SqErzkoJilitjDvJ1WbjHlxLI7WtCjRmOLdOGJqtMQ==" 19 | }, 20 | "@protobufjs/aspromise": { 21 | "version": "1.1.2", 22 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 23 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 24 | }, 25 | "@protobufjs/base64": { 26 | "version": "1.1.2", 27 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 28 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 29 | }, 30 | "@protobufjs/codegen": { 31 | "version": "2.0.4", 32 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 33 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 34 | }, 35 | "@protobufjs/eventemitter": { 36 | "version": "1.1.0", 37 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 38 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 39 | }, 40 | "@protobufjs/fetch": { 41 | "version": "1.1.0", 42 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 43 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 44 | "requires": { 45 | "@protobufjs/aspromise": "^1.1.1", 46 | "@protobufjs/inquire": "^1.1.0" 47 | } 48 | }, 49 | "@protobufjs/float": { 50 | "version": "1.0.2", 51 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 52 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 53 | }, 54 | "@protobufjs/inquire": { 55 | "version": "1.1.0", 56 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 57 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 58 | }, 59 | "@protobufjs/path": { 60 | "version": "1.1.2", 61 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 62 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 63 | }, 64 | "@protobufjs/pool": { 65 | "version": "1.1.0", 66 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 67 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 68 | }, 69 | "@protobufjs/utf8": { 70 | "version": "1.1.0", 71 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 72 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 73 | }, 74 | "@types/accepts": { 75 | "version": "1.3.5", 76 | "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", 77 | "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", 78 | "requires": { 79 | "@types/node": "*" 80 | } 81 | }, 82 | "@types/body-parser": { 83 | "version": "1.17.0", 84 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", 85 | "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", 86 | "requires": { 87 | "@types/connect": "*", 88 | "@types/node": "*" 89 | } 90 | }, 91 | "@types/connect": { 92 | "version": "3.4.32", 93 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", 94 | "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", 95 | "requires": { 96 | "@types/node": "*" 97 | } 98 | }, 99 | "@types/cors": { 100 | "version": "2.8.4", 101 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.4.tgz", 102 | "integrity": "sha512-ipZjBVsm2tF/n8qFGOuGBkUij9X9ZswVi9G3bx/6dz7POpVa6gVHcj1wsX/LVEn9MMF41fxK/PnZPPoTD1UFPw==", 103 | "requires": { 104 | "@types/express": "*" 105 | } 106 | }, 107 | "@types/events": { 108 | "version": "3.0.0", 109 | "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", 110 | "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" 111 | }, 112 | "@types/express": { 113 | "version": "4.16.1", 114 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.1.tgz", 115 | "integrity": "sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg==", 116 | "requires": { 117 | "@types/body-parser": "*", 118 | "@types/express-serve-static-core": "*", 119 | "@types/serve-static": "*" 120 | } 121 | }, 122 | "@types/express-serve-static-core": { 123 | "version": "4.16.1", 124 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.1.tgz", 125 | "integrity": "sha512-QgbIMRU1EVRry5cIu1ORCQP4flSYqLM1lS5LYyGWfKnFT3E58f0gKto7BR13clBFVrVZ0G0rbLZ1hUpSkgQQOA==", 126 | "requires": { 127 | "@types/node": "*", 128 | "@types/range-parser": "*" 129 | } 130 | }, 131 | "@types/long": { 132 | "version": "4.0.0", 133 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", 134 | "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==" 135 | }, 136 | "@types/mime": { 137 | "version": "2.0.1", 138 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", 139 | "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" 140 | }, 141 | "@types/node": { 142 | "version": "10.12.23", 143 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.23.tgz", 144 | "integrity": "sha512-EKhb5NveQ3NlW5EV7B0VRtDKwUfVey8LuJRl9pp5iW0se87/ZqLjG0PMf2MCzPXAJYWZN5Ltg7pHIAf9/Dm1tQ==" 145 | }, 146 | "@types/range-parser": { 147 | "version": "1.2.3", 148 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 149 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" 150 | }, 151 | "@types/serve-static": { 152 | "version": "1.13.2", 153 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", 154 | "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", 155 | "requires": { 156 | "@types/express-serve-static-core": "*", 157 | "@types/mime": "*" 158 | } 159 | }, 160 | "@types/ws": { 161 | "version": "6.0.1", 162 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.1.tgz", 163 | "integrity": "sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q==", 164 | "requires": { 165 | "@types/events": "*", 166 | "@types/node": "*" 167 | } 168 | }, 169 | "accepts": { 170 | "version": "1.3.5", 171 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 172 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 173 | "requires": { 174 | "mime-types": "~2.1.18", 175 | "negotiator": "0.6.1" 176 | } 177 | }, 178 | "apollo-cache-control": { 179 | "version": "0.5.0", 180 | "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.5.0.tgz", 181 | "integrity": "sha512-zu26CFj7CboxLB6cckZQEiSUGXIr8MViEGIC5Vesz2yd37sjtevMfRwQhxFuK0HinR0T/WC3dz2k5cj+33vQQQ==", 182 | "requires": { 183 | "apollo-server-env": "2.2.0", 184 | "graphql-extensions": "0.5.0" 185 | } 186 | }, 187 | "apollo-datasource": { 188 | "version": "0.3.0", 189 | "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.3.0.tgz", 190 | "integrity": "sha512-+jWs3ezhx4lcAAPIHtlj0Zoiv2tvwfzn7feHuhxub3xFwkJm39T8hPjb3aMQCsuS7TukBD+F5ndgVob5hL/5Nw==", 191 | "requires": { 192 | "apollo-server-caching": "0.3.0", 193 | "apollo-server-env": "2.2.0" 194 | } 195 | }, 196 | "apollo-engine-reporting": { 197 | "version": "1.0.0", 198 | "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-1.0.0.tgz", 199 | "integrity": "sha512-9gZSME9ggZwL1nBBvfgSehwc+PtcvZC1/3NYrBOFgidJbrEFita2w5A0jM8Brjo+N2FMKNYWGj8WQ1ywO21JPg==", 200 | "requires": { 201 | "apollo-engine-reporting-protobuf": "0.2.0", 202 | "apollo-graphql": "0.1.0", 203 | "apollo-server-core": "2.4.0", 204 | "apollo-server-env": "2.2.0", 205 | "async-retry": "^1.2.1", 206 | "graphql-extensions": "0.5.0" 207 | } 208 | }, 209 | "apollo-engine-reporting-protobuf": { 210 | "version": "0.2.0", 211 | "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.2.0.tgz", 212 | "integrity": "sha512-qI+GJKN78UMJ9Aq/ORdiM2qymZ5yswem+/VDdVFocq+/e1QqxjnpKjQWISkswci5+WtpJl9SpHBNxG98uHDKkA==", 213 | "requires": { 214 | "protobufjs": "^6.8.6" 215 | } 216 | }, 217 | "apollo-env": { 218 | "version": "0.3.2", 219 | "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.3.2.tgz", 220 | "integrity": "sha512-r6nrOw5Pyk6YLNKEtvBiTguJK+oPI1sthKogd7tp6jfkJ+q8SR/9sOoTxyV3vsmR/mMENuBHF89BGLLo9rxDiA==", 221 | "requires": { 222 | "core-js": "3.0.0-beta.3", 223 | "node-fetch": "^2.2.0" 224 | } 225 | }, 226 | "apollo-graphql": { 227 | "version": "0.1.0", 228 | "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.1.0.tgz", 229 | "integrity": "sha512-Mi5GqZJz1A/0i8SEm9EVHWe/LkGbYzV5wzobUY+1Q0SI1NdFtRgqHZUdHU0hz1jDnL+dpRqK1huVmtOO/DGa/A==", 230 | "requires": { 231 | "lodash.sortby": "^4.7.0" 232 | } 233 | }, 234 | "apollo-link": { 235 | "version": "1.2.8", 236 | "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.8.tgz", 237 | "integrity": "sha512-lfzGRxhK9RmiH3HPFi7TIEBhhDY9M5a2ZDnllcfy5QDk7cCQHQ1WQArcw1FK0g1B+mV4Kl72DSrlvZHZJEolrA==", 238 | "requires": { 239 | "zen-observable-ts": "^0.8.15" 240 | } 241 | }, 242 | "apollo-server": { 243 | "version": "2.4.0", 244 | "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-2.4.0.tgz", 245 | "integrity": "sha512-dEc2lGA1qkvffnArlNXDtJ74+gh4dNKbtTYsnoTveve3ML96DK8G2u5yNqwRqxZHUQmLrx3jiehFaPBqk+Cuhw==", 246 | "requires": { 247 | "apollo-server-core": "2.4.0", 248 | "apollo-server-express": "2.4.0", 249 | "express": "^4.0.0", 250 | "graphql-subscriptions": "^1.0.0", 251 | "graphql-tools": "^4.0.0" 252 | } 253 | }, 254 | "apollo-server-caching": { 255 | "version": "0.3.0", 256 | "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.3.0.tgz", 257 | "integrity": "sha512-dHwWUsRZu7I1yUfzTwPJgOigMsftgp8w3X96Zdch1ICWN7cM6aNxks9tTnLd+liUSEzdYLlTmEy5VUturF2IAw==", 258 | "requires": { 259 | "lru-cache": "^5.0.0" 260 | } 261 | }, 262 | "apollo-server-core": { 263 | "version": "2.4.0", 264 | "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.4.0.tgz", 265 | "integrity": "sha512-rTFJa12NzTWC9IJrXDr8AZMs1Slbes9YxbyaI+cMC5fs8O9wkCkb34C/1Tp7xKX0fgauXrKZpXv7yPTSm+4YFg==", 266 | "requires": { 267 | "@apollographql/apollo-tools": "^0.3.0", 268 | "@apollographql/graphql-playground-html": "^1.6.6", 269 | "@types/ws": "^6.0.0", 270 | "apollo-cache-control": "0.5.0", 271 | "apollo-datasource": "0.3.0", 272 | "apollo-engine-reporting": "1.0.0", 273 | "apollo-server-caching": "0.3.0", 274 | "apollo-server-env": "2.2.0", 275 | "apollo-server-errors": "2.2.0", 276 | "apollo-server-plugin-base": "0.3.0", 277 | "apollo-tracing": "0.5.0", 278 | "fast-json-stable-stringify": "^2.0.0", 279 | "graphql-extensions": "0.5.0", 280 | "graphql-subscriptions": "^1.0.0", 281 | "graphql-tag": "^2.9.2", 282 | "graphql-tools": "^4.0.0", 283 | "graphql-upload": "^8.0.2", 284 | "lodash": "^4.17.10", 285 | "subscriptions-transport-ws": "^0.9.11", 286 | "ws": "^6.0.0" 287 | } 288 | }, 289 | "apollo-server-env": { 290 | "version": "2.2.0", 291 | "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.2.0.tgz", 292 | "integrity": "sha512-wjJiI5nQWPBpNmpiLP389Ezpstp71szS6DHAeTgYLb/ulCw3CTuuA+0/E1bsThVWiQaDeHZE0sE3yI8q2zrYiA==", 293 | "requires": { 294 | "node-fetch": "^2.1.2", 295 | "util.promisify": "^1.0.0" 296 | } 297 | }, 298 | "apollo-server-errors": { 299 | "version": "2.2.0", 300 | "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.2.0.tgz", 301 | "integrity": "sha512-gV9EZG2tovFtT1cLuCTavnJu2DaKxnXPRNGSTo+SDI6IAk6cdzyW0Gje5N2+3LybI0Wq5KAbW6VLei31S4MWmg==" 302 | }, 303 | "apollo-server-express": { 304 | "version": "2.4.0", 305 | "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.4.0.tgz", 306 | "integrity": "sha512-uDS7OZJ3EwFr4eZ9k1MiBtUTaqKgCXUUTCknPTdCbTzBel7TjNsa6PNKrSQk+jrLja2H8VwNjbra8uBF5z70Pw==", 307 | "requires": { 308 | "@apollographql/graphql-playground-html": "^1.6.6", 309 | "@types/accepts": "^1.3.5", 310 | "@types/body-parser": "1.17.0", 311 | "@types/cors": "^2.8.4", 312 | "@types/express": "4.16.1", 313 | "accepts": "^1.3.5", 314 | "apollo-server-core": "2.4.0", 315 | "body-parser": "^1.18.3", 316 | "cors": "^2.8.4", 317 | "graphql-subscriptions": "^1.0.0", 318 | "graphql-tools": "^4.0.0", 319 | "type-is": "^1.6.16" 320 | } 321 | }, 322 | "apollo-server-plugin-base": { 323 | "version": "0.3.0", 324 | "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.3.0.tgz", 325 | "integrity": "sha512-SOwp4cpZwyklvP1MkMcY6+12c1hrb5gwC4vK4a23kL5rr9FC0sENcXo3uVVM4XlDGOXIkY+sCM8ngKFuef2flw==" 326 | }, 327 | "apollo-tracing": { 328 | "version": "0.5.0", 329 | "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.5.0.tgz", 330 | "integrity": "sha512-j0icEhLYf0xS6Q/iCXA2j9KfpYw0a/XvLSUio7fm5yUwtXP2Pp11x5BtK1dI8sLMiaOqUrREz2XjV4PKLzQPuA==", 331 | "requires": { 332 | "apollo-server-env": "2.2.0", 333 | "graphql-extensions": "0.5.0" 334 | } 335 | }, 336 | "apollo-utilities": { 337 | "version": "1.1.2", 338 | "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.1.2.tgz", 339 | "integrity": "sha512-EjDx8vToK+zkWIxc76ZQY/irRX52puNg04xf/w8R0kVTDAgHuVfnFVC01O5vE25kFnIaa5em0pFI0p9b6YMkhQ==", 340 | "requires": { 341 | "fast-json-stable-stringify": "^2.0.0", 342 | "tslib": "^1.9.3" 343 | } 344 | }, 345 | "array-flatten": { 346 | "version": "1.1.1", 347 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 348 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 349 | }, 350 | "async-limiter": { 351 | "version": "1.0.0", 352 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 353 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 354 | }, 355 | "async-retry": { 356 | "version": "1.2.3", 357 | "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz", 358 | "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==", 359 | "requires": { 360 | "retry": "0.12.0" 361 | } 362 | }, 363 | "backo2": { 364 | "version": "1.0.2", 365 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 366 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 367 | }, 368 | "body-parser": { 369 | "version": "1.18.3", 370 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 371 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 372 | "requires": { 373 | "bytes": "3.0.0", 374 | "content-type": "~1.0.4", 375 | "debug": "2.6.9", 376 | "depd": "~1.1.2", 377 | "http-errors": "~1.6.3", 378 | "iconv-lite": "0.4.23", 379 | "on-finished": "~2.3.0", 380 | "qs": "6.5.2", 381 | "raw-body": "2.3.3", 382 | "type-is": "~1.6.16" 383 | } 384 | }, 385 | "busboy": { 386 | "version": "0.3.0", 387 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.0.tgz", 388 | "integrity": "sha512-e+kzZRAbbvJPLjQz2z+zAyr78BSi9IFeBTyLwF76g78Q2zRt/RZ1NtS3MS17v2yLqYfLz69zHdC+1L4ja8PwqQ==", 389 | "requires": { 390 | "dicer": "0.3.0" 391 | } 392 | }, 393 | "bytes": { 394 | "version": "3.0.0", 395 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 396 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 397 | }, 398 | "content-disposition": { 399 | "version": "0.5.2", 400 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 401 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 402 | }, 403 | "content-type": { 404 | "version": "1.0.4", 405 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 406 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 407 | }, 408 | "cookie": { 409 | "version": "0.3.1", 410 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 411 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 412 | }, 413 | "cookie-signature": { 414 | "version": "1.0.6", 415 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 416 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 417 | }, 418 | "core-js": { 419 | "version": "3.0.0-beta.3", 420 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.0-beta.3.tgz", 421 | "integrity": "sha512-kM/OfrnMThP5PwGAj5HhQLdjUqzjrllqN2EVnk/X9qrLsfYjR2hzZ+E/8CzH0xuosexZtqMTLQrk//BULrBj9w==" 422 | }, 423 | "cors": { 424 | "version": "2.8.5", 425 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 426 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 427 | "requires": { 428 | "object-assign": "^4", 429 | "vary": "^1" 430 | } 431 | }, 432 | "debug": { 433 | "version": "2.6.9", 434 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 435 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 436 | "requires": { 437 | "ms": "2.0.0" 438 | } 439 | }, 440 | "define-properties": { 441 | "version": "1.1.3", 442 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 443 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 444 | "requires": { 445 | "object-keys": "^1.0.12" 446 | } 447 | }, 448 | "depd": { 449 | "version": "1.1.2", 450 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 451 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 452 | }, 453 | "deprecated-decorator": { 454 | "version": "0.1.6", 455 | "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", 456 | "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" 457 | }, 458 | "destroy": { 459 | "version": "1.0.4", 460 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 461 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 462 | }, 463 | "dicer": { 464 | "version": "0.3.0", 465 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", 466 | "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", 467 | "requires": { 468 | "streamsearch": "0.1.2" 469 | } 470 | }, 471 | "ee-first": { 472 | "version": "1.1.1", 473 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 474 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 475 | }, 476 | "encodeurl": { 477 | "version": "1.0.2", 478 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 479 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 480 | }, 481 | "es-abstract": { 482 | "version": "1.13.0", 483 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", 484 | "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", 485 | "requires": { 486 | "es-to-primitive": "^1.2.0", 487 | "function-bind": "^1.1.1", 488 | "has": "^1.0.3", 489 | "is-callable": "^1.1.4", 490 | "is-regex": "^1.0.4", 491 | "object-keys": "^1.0.12" 492 | } 493 | }, 494 | "es-to-primitive": { 495 | "version": "1.2.0", 496 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 497 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 498 | "requires": { 499 | "is-callable": "^1.1.4", 500 | "is-date-object": "^1.0.1", 501 | "is-symbol": "^1.0.2" 502 | } 503 | }, 504 | "escape-html": { 505 | "version": "1.0.3", 506 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 507 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 508 | }, 509 | "etag": { 510 | "version": "1.8.1", 511 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 512 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 513 | }, 514 | "eventemitter3": { 515 | "version": "3.1.0", 516 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", 517 | "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" 518 | }, 519 | "express": { 520 | "version": "4.16.4", 521 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 522 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 523 | "requires": { 524 | "accepts": "~1.3.5", 525 | "array-flatten": "1.1.1", 526 | "body-parser": "1.18.3", 527 | "content-disposition": "0.5.2", 528 | "content-type": "~1.0.4", 529 | "cookie": "0.3.1", 530 | "cookie-signature": "1.0.6", 531 | "debug": "2.6.9", 532 | "depd": "~1.1.2", 533 | "encodeurl": "~1.0.2", 534 | "escape-html": "~1.0.3", 535 | "etag": "~1.8.1", 536 | "finalhandler": "1.1.1", 537 | "fresh": "0.5.2", 538 | "merge-descriptors": "1.0.1", 539 | "methods": "~1.1.2", 540 | "on-finished": "~2.3.0", 541 | "parseurl": "~1.3.2", 542 | "path-to-regexp": "0.1.7", 543 | "proxy-addr": "~2.0.4", 544 | "qs": "6.5.2", 545 | "range-parser": "~1.2.0", 546 | "safe-buffer": "5.1.2", 547 | "send": "0.16.2", 548 | "serve-static": "1.13.2", 549 | "setprototypeof": "1.1.0", 550 | "statuses": "~1.4.0", 551 | "type-is": "~1.6.16", 552 | "utils-merge": "1.0.1", 553 | "vary": "~1.1.2" 554 | }, 555 | "dependencies": { 556 | "statuses": { 557 | "version": "1.4.0", 558 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 559 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 560 | } 561 | } 562 | }, 563 | "fast-json-stable-stringify": { 564 | "version": "2.0.0", 565 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 566 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 567 | }, 568 | "finalhandler": { 569 | "version": "1.1.1", 570 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 571 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 572 | "requires": { 573 | "debug": "2.6.9", 574 | "encodeurl": "~1.0.2", 575 | "escape-html": "~1.0.3", 576 | "on-finished": "~2.3.0", 577 | "parseurl": "~1.3.2", 578 | "statuses": "~1.4.0", 579 | "unpipe": "~1.0.0" 580 | }, 581 | "dependencies": { 582 | "statuses": { 583 | "version": "1.4.0", 584 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 585 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 586 | } 587 | } 588 | }, 589 | "forwarded": { 590 | "version": "0.1.2", 591 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 592 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 593 | }, 594 | "fresh": { 595 | "version": "0.5.2", 596 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 597 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 598 | }, 599 | "fs-capacitor": { 600 | "version": "2.0.0", 601 | "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.0.tgz", 602 | "integrity": "sha512-CIJZpxbVWhO+qyODeCR55Q+6vj0p2oL8DAWd/DZi3Ev+25PimUoScw07K0fPgluaH3lFoqNvwW13BDYfHWFQJw==" 603 | }, 604 | "function-bind": { 605 | "version": "1.1.1", 606 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 607 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 608 | }, 609 | "graphql": { 610 | "version": "0.13.2", 611 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.13.2.tgz", 612 | "integrity": "sha512-QZ5BL8ZO/B20VA8APauGBg3GyEgZ19eduvpLWoq5x7gMmWnHoy8rlQWPLmWgFvo1yNgjSEFMesmS4R6pPr7xog==", 613 | "requires": { 614 | "iterall": "^1.2.1" 615 | } 616 | }, 617 | "graphql-extensions": { 618 | "version": "0.5.0", 619 | "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.5.0.tgz", 620 | "integrity": "sha512-2i0rpe4/D8jZj6XmxXGLFDAsGLhkFrSdpS5WfvTAzoXOc52hUAxNdsbgRQGeKMFhmanqA6FDXxO/s+BtPHChVA==", 621 | "requires": { 622 | "@apollographql/apollo-tools": "^0.3.0" 623 | } 624 | }, 625 | "graphql-subscriptions": { 626 | "version": "1.0.0", 627 | "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.0.0.tgz", 628 | "integrity": "sha512-+ytmryoHF1LVf58NKEaNPRUzYyXplm120ntxfPcgOBC7TnK7Tv/4VRHeh4FAR9iL+O1bqhZs4nkibxQ+OA5cDQ==", 629 | "requires": { 630 | "iterall": "^1.2.1" 631 | } 632 | }, 633 | "graphql-tag": { 634 | "version": "2.10.1", 635 | "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.1.tgz", 636 | "integrity": "sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==" 637 | }, 638 | "graphql-tools": { 639 | "version": "4.0.4", 640 | "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.4.tgz", 641 | "integrity": "sha512-chF12etTIGVVGy3fCTJ1ivJX2KB7OSG4c6UOJQuqOHCmBQwTyNgCDuejZKvpYxNZiEx7bwIjrodDgDe9RIkjlw==", 642 | "requires": { 643 | "apollo-link": "^1.2.3", 644 | "apollo-utilities": "^1.0.1", 645 | "deprecated-decorator": "^0.1.6", 646 | "iterall": "^1.1.3", 647 | "uuid": "^3.1.0" 648 | } 649 | }, 650 | "graphql-upload": { 651 | "version": "8.0.4", 652 | "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.0.4.tgz", 653 | "integrity": "sha512-jsTfVYXJ5mU6BXiiJ20CUCAcf41ICCQJ2ltwQFUuaFKiY4JhlG99uZZp5S3hbpQ/oA1kS7hz4pRtsnxPCa7Yfg==", 654 | "requires": { 655 | "busboy": "^0.3.0", 656 | "fs-capacitor": "^2.0.0", 657 | "http-errors": "^1.7.1", 658 | "object-path": "^0.11.4" 659 | }, 660 | "dependencies": { 661 | "http-errors": { 662 | "version": "1.7.1", 663 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.1.tgz", 664 | "integrity": "sha512-jWEUgtZWGSMba9I1N3gc1HmvpBUaNC9vDdA46yScAdp+C5rdEuKWUBLWTQpW9FwSWSbYYs++b6SDCxf9UEJzfw==", 665 | "requires": { 666 | "depd": "~1.1.2", 667 | "inherits": "2.0.3", 668 | "setprototypeof": "1.1.0", 669 | "statuses": ">= 1.5.0 < 2", 670 | "toidentifier": "1.0.0" 671 | } 672 | } 673 | } 674 | }, 675 | "has": { 676 | "version": "1.0.3", 677 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 678 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 679 | "requires": { 680 | "function-bind": "^1.1.1" 681 | } 682 | }, 683 | "has-symbols": { 684 | "version": "1.0.0", 685 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 686 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" 687 | }, 688 | "http-errors": { 689 | "version": "1.6.3", 690 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 691 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 692 | "requires": { 693 | "depd": "~1.1.2", 694 | "inherits": "2.0.3", 695 | "setprototypeof": "1.1.0", 696 | "statuses": ">= 1.4.0 < 2" 697 | } 698 | }, 699 | "iconv-lite": { 700 | "version": "0.4.23", 701 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 702 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 703 | "requires": { 704 | "safer-buffer": ">= 2.1.2 < 3" 705 | } 706 | }, 707 | "inherits": { 708 | "version": "2.0.3", 709 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 710 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 711 | }, 712 | "ipaddr.js": { 713 | "version": "1.8.0", 714 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 715 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 716 | }, 717 | "is-callable": { 718 | "version": "1.1.4", 719 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 720 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" 721 | }, 722 | "is-date-object": { 723 | "version": "1.0.1", 724 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 725 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" 726 | }, 727 | "is-regex": { 728 | "version": "1.0.4", 729 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 730 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 731 | "requires": { 732 | "has": "^1.0.1" 733 | } 734 | }, 735 | "is-symbol": { 736 | "version": "1.0.2", 737 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 738 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 739 | "requires": { 740 | "has-symbols": "^1.0.0" 741 | } 742 | }, 743 | "iterall": { 744 | "version": "1.2.2", 745 | "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", 746 | "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" 747 | }, 748 | "lodash": { 749 | "version": "4.17.11", 750 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 751 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 752 | }, 753 | "lodash.sortby": { 754 | "version": "4.7.0", 755 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 756 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 757 | }, 758 | "long": { 759 | "version": "4.0.0", 760 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 761 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 762 | }, 763 | "lru-cache": { 764 | "version": "5.1.1", 765 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 766 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 767 | "requires": { 768 | "yallist": "^3.0.2" 769 | } 770 | }, 771 | "media-typer": { 772 | "version": "0.3.0", 773 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 774 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 775 | }, 776 | "merge-descriptors": { 777 | "version": "1.0.1", 778 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 779 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 780 | }, 781 | "methods": { 782 | "version": "1.1.2", 783 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 784 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 785 | }, 786 | "mime": { 787 | "version": "1.4.1", 788 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 789 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 790 | }, 791 | "mime-db": { 792 | "version": "1.37.0", 793 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 794 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 795 | }, 796 | "mime-types": { 797 | "version": "2.1.21", 798 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 799 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 800 | "requires": { 801 | "mime-db": "~1.37.0" 802 | } 803 | }, 804 | "ms": { 805 | "version": "2.0.0", 806 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 807 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 808 | }, 809 | "negotiator": { 810 | "version": "0.6.1", 811 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 812 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 813 | }, 814 | "node-fetch": { 815 | "version": "2.3.0", 816 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", 817 | "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==" 818 | }, 819 | "object-assign": { 820 | "version": "4.1.1", 821 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 822 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 823 | }, 824 | "object-keys": { 825 | "version": "1.0.12", 826 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", 827 | "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" 828 | }, 829 | "object-path": { 830 | "version": "0.11.4", 831 | "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", 832 | "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" 833 | }, 834 | "object.getownpropertydescriptors": { 835 | "version": "2.0.3", 836 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", 837 | "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", 838 | "requires": { 839 | "define-properties": "^1.1.2", 840 | "es-abstract": "^1.5.1" 841 | } 842 | }, 843 | "on-finished": { 844 | "version": "2.3.0", 845 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 846 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 847 | "requires": { 848 | "ee-first": "1.1.1" 849 | } 850 | }, 851 | "parseurl": { 852 | "version": "1.3.2", 853 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 854 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 855 | }, 856 | "path-to-regexp": { 857 | "version": "0.1.7", 858 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 859 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 860 | }, 861 | "protobufjs": { 862 | "version": "6.8.8", 863 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", 864 | "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", 865 | "requires": { 866 | "@protobufjs/aspromise": "^1.1.2", 867 | "@protobufjs/base64": "^1.1.2", 868 | "@protobufjs/codegen": "^2.0.4", 869 | "@protobufjs/eventemitter": "^1.1.0", 870 | "@protobufjs/fetch": "^1.1.0", 871 | "@protobufjs/float": "^1.0.2", 872 | "@protobufjs/inquire": "^1.1.0", 873 | "@protobufjs/path": "^1.1.2", 874 | "@protobufjs/pool": "^1.1.0", 875 | "@protobufjs/utf8": "^1.1.0", 876 | "@types/long": "^4.0.0", 877 | "@types/node": "^10.1.0", 878 | "long": "^4.0.0" 879 | } 880 | }, 881 | "proxy-addr": { 882 | "version": "2.0.4", 883 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 884 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 885 | "requires": { 886 | "forwarded": "~0.1.2", 887 | "ipaddr.js": "1.8.0" 888 | } 889 | }, 890 | "qs": { 891 | "version": "6.5.2", 892 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 893 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 894 | }, 895 | "range-parser": { 896 | "version": "1.2.0", 897 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 898 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 899 | }, 900 | "raw-body": { 901 | "version": "2.3.3", 902 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 903 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 904 | "requires": { 905 | "bytes": "3.0.0", 906 | "http-errors": "1.6.3", 907 | "iconv-lite": "0.4.23", 908 | "unpipe": "1.0.0" 909 | } 910 | }, 911 | "retry": { 912 | "version": "0.12.0", 913 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 914 | "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" 915 | }, 916 | "safe-buffer": { 917 | "version": "5.1.2", 918 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 919 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 920 | }, 921 | "safer-buffer": { 922 | "version": "2.1.2", 923 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 924 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 925 | }, 926 | "send": { 927 | "version": "0.16.2", 928 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 929 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 930 | "requires": { 931 | "debug": "2.6.9", 932 | "depd": "~1.1.2", 933 | "destroy": "~1.0.4", 934 | "encodeurl": "~1.0.2", 935 | "escape-html": "~1.0.3", 936 | "etag": "~1.8.1", 937 | "fresh": "0.5.2", 938 | "http-errors": "~1.6.2", 939 | "mime": "1.4.1", 940 | "ms": "2.0.0", 941 | "on-finished": "~2.3.0", 942 | "range-parser": "~1.2.0", 943 | "statuses": "~1.4.0" 944 | }, 945 | "dependencies": { 946 | "statuses": { 947 | "version": "1.4.0", 948 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 949 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 950 | } 951 | } 952 | }, 953 | "serve-static": { 954 | "version": "1.13.2", 955 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 956 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 957 | "requires": { 958 | "encodeurl": "~1.0.2", 959 | "escape-html": "~1.0.3", 960 | "parseurl": "~1.3.2", 961 | "send": "0.16.2" 962 | } 963 | }, 964 | "setprototypeof": { 965 | "version": "1.1.0", 966 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 967 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 968 | }, 969 | "statuses": { 970 | "version": "1.5.0", 971 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 972 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 973 | }, 974 | "streamsearch": { 975 | "version": "0.1.2", 976 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 977 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 978 | }, 979 | "subscriptions-transport-ws": { 980 | "version": "0.9.15", 981 | "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.15.tgz", 982 | "integrity": "sha512-f9eBfWdHsePQV67QIX+VRhf++dn1adyC/PZHP6XI5AfKnZ4n0FW+v5omxwdHVpd4xq2ZijaHEcmlQrhBY79ZWQ==", 983 | "requires": { 984 | "backo2": "^1.0.2", 985 | "eventemitter3": "^3.1.0", 986 | "iterall": "^1.2.1", 987 | "symbol-observable": "^1.0.4", 988 | "ws": "^5.2.0" 989 | }, 990 | "dependencies": { 991 | "ws": { 992 | "version": "5.2.2", 993 | "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", 994 | "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", 995 | "requires": { 996 | "async-limiter": "~1.0.0" 997 | } 998 | } 999 | } 1000 | }, 1001 | "symbol-observable": { 1002 | "version": "1.2.0", 1003 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", 1004 | "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" 1005 | }, 1006 | "toidentifier": { 1007 | "version": "1.0.0", 1008 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1009 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1010 | }, 1011 | "tslib": { 1012 | "version": "1.9.3", 1013 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 1014 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" 1015 | }, 1016 | "type-is": { 1017 | "version": "1.6.16", 1018 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 1019 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 1020 | "requires": { 1021 | "media-typer": "0.3.0", 1022 | "mime-types": "~2.1.18" 1023 | } 1024 | }, 1025 | "unpipe": { 1026 | "version": "1.0.0", 1027 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1028 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1029 | }, 1030 | "util.promisify": { 1031 | "version": "1.0.0", 1032 | "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", 1033 | "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", 1034 | "requires": { 1035 | "define-properties": "^1.1.2", 1036 | "object.getownpropertydescriptors": "^2.0.3" 1037 | } 1038 | }, 1039 | "utils-merge": { 1040 | "version": "1.0.1", 1041 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1042 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1043 | }, 1044 | "uuid": { 1045 | "version": "3.3.2", 1046 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1047 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 1048 | }, 1049 | "vary": { 1050 | "version": "1.1.2", 1051 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1052 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1053 | }, 1054 | "ws": { 1055 | "version": "6.1.3", 1056 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.3.tgz", 1057 | "integrity": "sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg==", 1058 | "requires": { 1059 | "async-limiter": "~1.0.0" 1060 | } 1061 | }, 1062 | "yallist": { 1063 | "version": "3.0.3", 1064 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", 1065 | "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" 1066 | }, 1067 | "zen-observable": { 1068 | "version": "0.8.13", 1069 | "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.13.tgz", 1070 | "integrity": "sha512-fa+6aDUVvavYsefZw0zaZ/v3ckEtMgCFi30sn91SEZea4y/6jQp05E3omjkX91zV6RVdn15fqnFZ6RKjRGbp2g==" 1071 | }, 1072 | "zen-observable-ts": { 1073 | "version": "0.8.15", 1074 | "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.15.tgz", 1075 | "integrity": "sha512-sXKPWiw6JszNEkRv5dQ+lQCttyjHM2Iks74QU5NP8mMPS/NrzTlHDr780gf/wOBqmHkPO6NCLMlsa+fAQ8VE8w==", 1076 | "requires": { 1077 | "zen-observable": "^0.8.0" 1078 | } 1079 | } 1080 | } 1081 | } 1082 | -------------------------------------------------------------------------------- /local/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "local", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "localDevelopment.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "body-parser": "^1.18.3", 13 | "express": "^4.16.4", 14 | "apollo-server": "^2.2.2", 15 | "graphql": "^0.13.1" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /local/remote-schemas.env: -------------------------------------------------------------------------------- 1 | REMOTE_SCHEMA_HELLO_URL=http://localhost:4000 2 | -------------------------------------------------------------------------------- /remote-schemas/README.md: -------------------------------------------------------------------------------- 1 | # Remote Schemas 2 | -------------------------------------------------------------------------------- /remote-schemas/hello-schema/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | *.zip 4 | -------------------------------------------------------------------------------- /remote-schemas/hello-schema/.url_env: -------------------------------------------------------------------------------- 1 | REMOTE_SCHEMA_HELLO_URL 2 | -------------------------------------------------------------------------------- /remote-schemas/hello-schema/index.js: -------------------------------------------------------------------------------- 1 | const gql = require('graphql-tag'); 2 | 3 | const typeDefs = gql` 4 | type Query { 5 | hello: String 6 | } 7 | `; 8 | 9 | const resolvers = { 10 | Query: { 11 | hello: () => "world", 12 | }, 13 | }; 14 | 15 | exports.typeDefs = typeDefs; 16 | exports.resolvers = resolvers; 17 | -------------------------------------------------------------------------------- /remote-schemas/hello-schema/lambdaCtx.js: -------------------------------------------------------------------------------- 1 | const ApolloServerLambda = require('apollo-server-lambda').ApolloServer; 2 | const typeDefs = require('./index').typeDefs; 3 | const resolvers = require('./index').resolvers; 4 | 5 | const server = new ApolloServerLambda({ 6 | typeDefs, 7 | resolvers, 8 | context: ({ event, context }) => ({ 9 | headers: event.headers, 10 | functionName: context.functionName, 11 | event, 12 | context, 13 | }), 14 | }); 15 | 16 | exports.handler = server.createHandler({ 17 | cors: { 18 | origin: '*', 19 | credentials: true, 20 | allowedHeaders: 'Content-Type, Authorization' 21 | }, 22 | }); 23 | 24 | -------------------------------------------------------------------------------- /remote-schemas/hello-schema/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-lambda-nodejs", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@apollographql/apollo-tools": { 8 | "version": "0.2.8", 9 | "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.2.8.tgz", 10 | "integrity": "sha512-A7FTUigtpGCFBaLT1ILicdjM6pZ7LQNw7Vgos0t4aLYtvlKO/L1nMi/NO7bPypzZaJSToTgcxHJPRydP1Md+Kw==", 11 | "requires": { 12 | "apollo-env": "0.2.5" 13 | } 14 | }, 15 | "@apollographql/apollo-upload-server": { 16 | "version": "5.0.3", 17 | "resolved": "https://registry.npmjs.org/@apollographql/apollo-upload-server/-/apollo-upload-server-5.0.3.tgz", 18 | "integrity": "sha512-tGAp3ULNyoA8b5o9LsU2Lq6SwgVPUOKAqKywu2liEtTvrFSGPrObwanhYwArq3GPeOqp2bi+JknSJCIU3oQN1Q==", 19 | "requires": { 20 | "@babel/runtime-corejs2": "^7.0.0-rc.1", 21 | "busboy": "^0.2.14", 22 | "object-path": "^0.11.4" 23 | } 24 | }, 25 | "@apollographql/graphql-playground-html": { 26 | "version": "1.6.4", 27 | "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.4.tgz", 28 | "integrity": "sha512-gwvaQO6/Hv4DEwhDLmmu2tzCU9oPjC5Xl9Kk8Yd0IxyKhYLlLalmkMMjsZLzU5H3fGaalLD96OYfxHL0ClVUDQ==" 29 | }, 30 | "@babel/runtime-corejs2": { 31 | "version": "7.1.5", 32 | "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.1.5.tgz", 33 | "integrity": "sha512-WsYRwQsFhVmxkAqwypPTZyV9GpkqMEaAr2zOItOmqSX2GBFaI+eq98CN81e13o0zaUKJOQGYyjhNVqj56nnkYg==", 34 | "requires": { 35 | "core-js": "^2.5.7", 36 | "regenerator-runtime": "^0.12.0" 37 | }, 38 | "dependencies": { 39 | "core-js": { 40 | "version": "2.5.7", 41 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", 42 | "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" 43 | } 44 | } 45 | }, 46 | "@protobufjs/aspromise": { 47 | "version": "1.1.2", 48 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 49 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 50 | }, 51 | "@protobufjs/base64": { 52 | "version": "1.1.2", 53 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 54 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 55 | }, 56 | "@protobufjs/codegen": { 57 | "version": "2.0.4", 58 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 59 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 60 | }, 61 | "@protobufjs/eventemitter": { 62 | "version": "1.1.0", 63 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 64 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 65 | }, 66 | "@protobufjs/fetch": { 67 | "version": "1.1.0", 68 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 69 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 70 | "requires": { 71 | "@protobufjs/aspromise": "^1.1.1", 72 | "@protobufjs/inquire": "^1.1.0" 73 | } 74 | }, 75 | "@protobufjs/float": { 76 | "version": "1.0.2", 77 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 78 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 79 | }, 80 | "@protobufjs/inquire": { 81 | "version": "1.1.0", 82 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 83 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 84 | }, 85 | "@protobufjs/path": { 86 | "version": "1.1.2", 87 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 88 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 89 | }, 90 | "@protobufjs/pool": { 91 | "version": "1.1.0", 92 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 93 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 94 | }, 95 | "@protobufjs/utf8": { 96 | "version": "1.1.0", 97 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 98 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 99 | }, 100 | "@types/events": { 101 | "version": "1.2.0", 102 | "resolved": "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", 103 | "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==" 104 | }, 105 | "@types/long": { 106 | "version": "4.0.0", 107 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", 108 | "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==" 109 | }, 110 | "@types/node": { 111 | "version": "10.12.10", 112 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.10.tgz", 113 | "integrity": "sha512-8xZEYckCbUVgK8Eg7lf5Iy4COKJ5uXlnIOnePN0WUwSQggy9tolM+tDJf7wMOnT/JT/W9xDYIaYggt3mRV2O5w==" 114 | }, 115 | "@types/ws": { 116 | "version": "6.0.1", 117 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.1.tgz", 118 | "integrity": "sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q==", 119 | "requires": { 120 | "@types/events": "*", 121 | "@types/node": "*" 122 | } 123 | }, 124 | "apollo-cache-control": { 125 | "version": "0.3.2", 126 | "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.3.2.tgz", 127 | "integrity": "sha512-/fhgCWGEoTsgyA83usy/1NvJWi6hbD4rSGO5jvyNNtMZ9ledOvKUvIdzSQ1r5hxK5yds/eehWXhMJ4Pu200qrQ==", 128 | "requires": { 129 | "apollo-server-env": "2.2.0", 130 | "graphql-extensions": "0.3.2" 131 | } 132 | }, 133 | "apollo-datasource": { 134 | "version": "0.2.0", 135 | "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.2.0.tgz", 136 | "integrity": "sha512-WJM9Ix3uogIfAG7mjL1NZQM9+45rcikn4mPWhE1Iuyw2+Y857J3uKJqQgF5h9Fg64SlCJh9u5WL3N7N5mg1fVw==", 137 | "requires": { 138 | "apollo-server-caching": "0.2.0", 139 | "apollo-server-env": "2.2.0" 140 | } 141 | }, 142 | "apollo-engine-reporting": { 143 | "version": "0.1.2", 144 | "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-0.1.2.tgz", 145 | "integrity": "sha512-W6zBTypI2ZLe9ZpMI4EasyXJP2WG8CpxYOU3Q4iuCKh8HYJqrQC5QVFXRF7TRBQTE6tc1seYnAHdgqv0ozxBrw==", 146 | "requires": { 147 | "apollo-engine-reporting-protobuf": "0.1.0", 148 | "apollo-server-env": "2.2.0", 149 | "async-retry": "^1.2.1", 150 | "graphql-extensions": "0.3.2", 151 | "lodash": "^4.17.10" 152 | } 153 | }, 154 | "apollo-engine-reporting-protobuf": { 155 | "version": "0.1.0", 156 | "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.1.0.tgz", 157 | "integrity": "sha512-GReJtAYTmpwg0drb9VgFtqObYYTCHkJhlHEYCeXY8bJV4fOgXsAZ7CIXR9nPKO0mBaoHIHaGYvXGcyCLrZ36VA==", 158 | "requires": { 159 | "protobufjs": "^6.8.6" 160 | } 161 | }, 162 | "apollo-env": { 163 | "version": "0.2.5", 164 | "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.2.5.tgz", 165 | "integrity": "sha512-Gc7TEbwCl7jJVutnn8TWfzNSkrrqyoo0DP92BQJFU9pZbJhpidoXf2Sw1YwOJl82rRKH3ujM3C8vdZLOgpFcFA==", 166 | "requires": { 167 | "core-js": "^3.0.0-beta.3", 168 | "node-fetch": "^2.2.0" 169 | } 170 | }, 171 | "apollo-link": { 172 | "version": "1.2.4", 173 | "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.4.tgz", 174 | "integrity": "sha512-B1z+9H2nTyWEhMXRFSnoZ1vSuAYP+V/EdUJvRx9uZ8yuIBZMm6reyVtr1n0BWlKeSFyPieKJy2RLzmITAAQAMQ==", 175 | "requires": { 176 | "apollo-utilities": "^1.0.0", 177 | "zen-observable-ts": "^0.8.11" 178 | } 179 | }, 180 | "apollo-server-caching": { 181 | "version": "0.2.0", 182 | "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.2.0.tgz", 183 | "integrity": "sha512-/v7xWEcyyahs3hwX4baH/GekuHz3LRt9NoIYwg869G1eeqjuwY6NsowRIujZ100anJQwm9v5A9/sLtHBFvbgYg==", 184 | "requires": { 185 | "lru-cache": "^4.1.3" 186 | } 187 | }, 188 | "apollo-server-core": { 189 | "version": "2.2.2", 190 | "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.2.2.tgz", 191 | "integrity": "sha512-F6d4u5m1rJB4ucpLPGCoa9Dvo5OjGMIGdAzT9A35yOvlFWwvIR46jGmYmGmNp4Qx852rb1axSZVzNy7k/Dix0w==", 192 | "requires": { 193 | "@apollographql/apollo-tools": "^0.2.6", 194 | "@apollographql/apollo-upload-server": "^5.0.3", 195 | "@apollographql/graphql-playground-html": "^1.6.4", 196 | "@types/ws": "^6.0.0", 197 | "apollo-cache-control": "0.3.2", 198 | "apollo-datasource": "0.2.0", 199 | "apollo-engine-reporting": "0.1.2", 200 | "apollo-server-caching": "0.2.0", 201 | "apollo-server-env": "2.2.0", 202 | "apollo-server-errors": "2.2.0", 203 | "apollo-server-plugin-base": "0.1.2", 204 | "apollo-tracing": "0.3.2", 205 | "graphql-extensions": "0.3.2", 206 | "graphql-subscriptions": "^1.0.0", 207 | "graphql-tag": "^2.9.2", 208 | "graphql-tools": "^4.0.0", 209 | "json-stable-stringify": "^1.0.1", 210 | "lodash": "^4.17.10", 211 | "subscriptions-transport-ws": "^0.9.11", 212 | "ws": "^6.0.0" 213 | } 214 | }, 215 | "apollo-server-env": { 216 | "version": "2.2.0", 217 | "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.2.0.tgz", 218 | "integrity": "sha512-wjJiI5nQWPBpNmpiLP389Ezpstp71szS6DHAeTgYLb/ulCw3CTuuA+0/E1bsThVWiQaDeHZE0sE3yI8q2zrYiA==", 219 | "requires": { 220 | "node-fetch": "^2.1.2", 221 | "util.promisify": "^1.0.0" 222 | } 223 | }, 224 | "apollo-server-errors": { 225 | "version": "2.2.0", 226 | "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.2.0.tgz", 227 | "integrity": "sha512-gV9EZG2tovFtT1cLuCTavnJu2DaKxnXPRNGSTo+SDI6IAk6cdzyW0Gje5N2+3LybI0Wq5KAbW6VLei31S4MWmg==" 228 | }, 229 | "apollo-server-lambda": { 230 | "version": "2.2.2", 231 | "resolved": "https://registry.npmjs.org/apollo-server-lambda/-/apollo-server-lambda-2.2.2.tgz", 232 | "integrity": "sha512-SI528pEQWAE+oxS23EKdahUAkfiNkaWBFUBU72+gbwefGNaEu24dLy3jX0X0+5m5pJm3nxS7HvXvsqTBbIr2GA==", 233 | "requires": { 234 | "@apollographql/graphql-playground-html": "^1.6.4", 235 | "apollo-server-core": "2.2.2", 236 | "apollo-server-env": "2.2.0", 237 | "graphql-tools": "^4.0.0" 238 | } 239 | }, 240 | "apollo-server-plugin-base": { 241 | "version": "0.1.2", 242 | "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.1.2.tgz", 243 | "integrity": "sha512-+uicMcNctlP6YwIhzLLEycZzao/810OSzcxgPYKItXr5lGa1GuHD7sRIWldT3YoSdpw6Gal2lBuw6/DmnoDsPg==" 244 | }, 245 | "apollo-tracing": { 246 | "version": "0.3.2", 247 | "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.3.2.tgz", 248 | "integrity": "sha512-YwN1m1k0JJsxGh0QWsEM3OLnyem0GT2tZnGeO2OogCr6dH5lE0SjKPc6UzpcI/3fPyxRrx5QvpUiP+DJeehhTA==", 249 | "requires": { 250 | "apollo-server-env": "2.2.0", 251 | "graphql-extensions": "0.3.2" 252 | } 253 | }, 254 | "apollo-utilities": { 255 | "version": "1.0.26", 256 | "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.26.tgz", 257 | "integrity": "sha512-URw7o3phymliqYCYatcird2YRPUU2eWCNvip64U9gQrX56mEfK4m99yBIDCMTpmcvOFsKLii1sIEZsHIs/bvnw==", 258 | "requires": { 259 | "fast-json-stable-stringify": "^2.0.0" 260 | } 261 | }, 262 | "async-limiter": { 263 | "version": "1.0.0", 264 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 265 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 266 | }, 267 | "async-retry": { 268 | "version": "1.2.3", 269 | "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz", 270 | "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==", 271 | "requires": { 272 | "retry": "0.12.0" 273 | } 274 | }, 275 | "backo2": { 276 | "version": "1.0.2", 277 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 278 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 279 | }, 280 | "busboy": { 281 | "version": "0.2.14", 282 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", 283 | "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", 284 | "requires": { 285 | "dicer": "0.2.5", 286 | "readable-stream": "1.1.x" 287 | } 288 | }, 289 | "core-js": { 290 | "version": "3.0.0-beta.3", 291 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.0-beta.3.tgz", 292 | "integrity": "sha512-kM/OfrnMThP5PwGAj5HhQLdjUqzjrllqN2EVnk/X9qrLsfYjR2hzZ+E/8CzH0xuosexZtqMTLQrk//BULrBj9w==" 293 | }, 294 | "core-util-is": { 295 | "version": "1.0.2", 296 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 297 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 298 | }, 299 | "define-properties": { 300 | "version": "1.1.3", 301 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 302 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 303 | "requires": { 304 | "object-keys": "^1.0.12" 305 | } 306 | }, 307 | "deprecated-decorator": { 308 | "version": "0.1.6", 309 | "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", 310 | "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" 311 | }, 312 | "dicer": { 313 | "version": "0.2.5", 314 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", 315 | "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", 316 | "requires": { 317 | "readable-stream": "1.1.x", 318 | "streamsearch": "0.1.2" 319 | } 320 | }, 321 | "es-abstract": { 322 | "version": "1.12.0", 323 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", 324 | "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", 325 | "requires": { 326 | "es-to-primitive": "^1.1.1", 327 | "function-bind": "^1.1.1", 328 | "has": "^1.0.1", 329 | "is-callable": "^1.1.3", 330 | "is-regex": "^1.0.4" 331 | } 332 | }, 333 | "es-to-primitive": { 334 | "version": "1.2.0", 335 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 336 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 337 | "requires": { 338 | "is-callable": "^1.1.4", 339 | "is-date-object": "^1.0.1", 340 | "is-symbol": "^1.0.2" 341 | } 342 | }, 343 | "eventemitter3": { 344 | "version": "3.1.0", 345 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", 346 | "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" 347 | }, 348 | "fast-json-stable-stringify": { 349 | "version": "2.0.0", 350 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 351 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 352 | }, 353 | "function-bind": { 354 | "version": "1.1.1", 355 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 356 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 357 | }, 358 | "graphql": { 359 | "version": "0.13.2", 360 | "resolved": "http://registry.npmjs.org/graphql/-/graphql-0.13.2.tgz", 361 | "integrity": "sha512-QZ5BL8ZO/B20VA8APauGBg3GyEgZ19eduvpLWoq5x7gMmWnHoy8rlQWPLmWgFvo1yNgjSEFMesmS4R6pPr7xog==", 362 | "requires": { 363 | "iterall": "^1.2.1" 364 | } 365 | }, 366 | "graphql-extensions": { 367 | "version": "0.3.2", 368 | "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.3.2.tgz", 369 | "integrity": "sha512-eIAWwtZNlUAHtHF6uNP6+4M+GCksqUYfNBxW5rTAlCB4/ZcuIvchVtN1CgVM7MooW3akPM1Eci11WyeXvgOugQ==", 370 | "requires": { 371 | "@apollographql/apollo-tools": "^0.2.6" 372 | } 373 | }, 374 | "graphql-subscriptions": { 375 | "version": "1.0.0", 376 | "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.0.0.tgz", 377 | "integrity": "sha512-+ytmryoHF1LVf58NKEaNPRUzYyXplm120ntxfPcgOBC7TnK7Tv/4VRHeh4FAR9iL+O1bqhZs4nkibxQ+OA5cDQ==", 378 | "requires": { 379 | "iterall": "^1.2.1" 380 | } 381 | }, 382 | "graphql-tag": { 383 | "version": "2.10.1", 384 | "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.1.tgz", 385 | "integrity": "sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==" 386 | }, 387 | "graphql-tools": { 388 | "version": "4.0.3", 389 | "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.3.tgz", 390 | "integrity": "sha512-NNZM0WSnVLX1zIMUxu7SjzLZ4prCp15N5L2T2ro02OVyydZ0fuCnZYRnx/yK9xjGWbZA0Q58yEO//Bv/psJWrg==", 391 | "requires": { 392 | "apollo-link": "^1.2.3", 393 | "apollo-utilities": "^1.0.1", 394 | "deprecated-decorator": "^0.1.6", 395 | "iterall": "^1.1.3", 396 | "uuid": "^3.1.0" 397 | } 398 | }, 399 | "has": { 400 | "version": "1.0.3", 401 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 402 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 403 | "requires": { 404 | "function-bind": "^1.1.1" 405 | } 406 | }, 407 | "has-symbols": { 408 | "version": "1.0.0", 409 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 410 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" 411 | }, 412 | "inherits": { 413 | "version": "2.0.3", 414 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 415 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 416 | }, 417 | "is-callable": { 418 | "version": "1.1.4", 419 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 420 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" 421 | }, 422 | "is-date-object": { 423 | "version": "1.0.1", 424 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 425 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" 426 | }, 427 | "is-regex": { 428 | "version": "1.0.4", 429 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 430 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 431 | "requires": { 432 | "has": "^1.0.1" 433 | } 434 | }, 435 | "is-symbol": { 436 | "version": "1.0.2", 437 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 438 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 439 | "requires": { 440 | "has-symbols": "^1.0.0" 441 | } 442 | }, 443 | "isarray": { 444 | "version": "0.0.1", 445 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 446 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 447 | }, 448 | "iterall": { 449 | "version": "1.2.2", 450 | "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", 451 | "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" 452 | }, 453 | "json-stable-stringify": { 454 | "version": "1.0.1", 455 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 456 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 457 | "requires": { 458 | "jsonify": "~0.0.0" 459 | } 460 | }, 461 | "jsonify": { 462 | "version": "0.0.0", 463 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 464 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 465 | }, 466 | "lodash": { 467 | "version": "4.17.11", 468 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 469 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 470 | }, 471 | "long": { 472 | "version": "4.0.0", 473 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 474 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 475 | }, 476 | "lru-cache": { 477 | "version": "4.1.4", 478 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.4.tgz", 479 | "integrity": "sha512-EPstzZ23znHUVLKj+lcXO1KvZkrlw+ZirdwvOmnAnA/1PB4ggyXJ77LRkCqkff+ShQ+cqoxCxLQOh4cKITO5iA==", 480 | "requires": { 481 | "pseudomap": "^1.0.2", 482 | "yallist": "^3.0.2" 483 | } 484 | }, 485 | "node-fetch": { 486 | "version": "2.3.0", 487 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", 488 | "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==" 489 | }, 490 | "object-keys": { 491 | "version": "1.0.12", 492 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", 493 | "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" 494 | }, 495 | "object-path": { 496 | "version": "0.11.4", 497 | "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", 498 | "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" 499 | }, 500 | "object.getownpropertydescriptors": { 501 | "version": "2.0.3", 502 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", 503 | "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", 504 | "requires": { 505 | "define-properties": "^1.1.2", 506 | "es-abstract": "^1.5.1" 507 | } 508 | }, 509 | "protobufjs": { 510 | "version": "6.8.8", 511 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", 512 | "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", 513 | "requires": { 514 | "@protobufjs/aspromise": "^1.1.2", 515 | "@protobufjs/base64": "^1.1.2", 516 | "@protobufjs/codegen": "^2.0.4", 517 | "@protobufjs/eventemitter": "^1.1.0", 518 | "@protobufjs/fetch": "^1.1.0", 519 | "@protobufjs/float": "^1.0.2", 520 | "@protobufjs/inquire": "^1.1.0", 521 | "@protobufjs/path": "^1.1.2", 522 | "@protobufjs/pool": "^1.1.0", 523 | "@protobufjs/utf8": "^1.1.0", 524 | "@types/long": "^4.0.0", 525 | "@types/node": "^10.1.0", 526 | "long": "^4.0.0" 527 | } 528 | }, 529 | "pseudomap": { 530 | "version": "1.0.2", 531 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 532 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 533 | }, 534 | "readable-stream": { 535 | "version": "1.1.14", 536 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 537 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 538 | "requires": { 539 | "core-util-is": "~1.0.0", 540 | "inherits": "~2.0.1", 541 | "isarray": "0.0.1", 542 | "string_decoder": "~0.10.x" 543 | } 544 | }, 545 | "regenerator-runtime": { 546 | "version": "0.12.1", 547 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", 548 | "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" 549 | }, 550 | "retry": { 551 | "version": "0.12.0", 552 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 553 | "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" 554 | }, 555 | "streamsearch": { 556 | "version": "0.1.2", 557 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 558 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 559 | }, 560 | "string_decoder": { 561 | "version": "0.10.31", 562 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 563 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 564 | }, 565 | "subscriptions-transport-ws": { 566 | "version": "0.9.15", 567 | "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.15.tgz", 568 | "integrity": "sha512-f9eBfWdHsePQV67QIX+VRhf++dn1adyC/PZHP6XI5AfKnZ4n0FW+v5omxwdHVpd4xq2ZijaHEcmlQrhBY79ZWQ==", 569 | "requires": { 570 | "backo2": "^1.0.2", 571 | "eventemitter3": "^3.1.0", 572 | "iterall": "^1.2.1", 573 | "symbol-observable": "^1.0.4", 574 | "ws": "^5.2.0" 575 | }, 576 | "dependencies": { 577 | "ws": { 578 | "version": "5.2.2", 579 | "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", 580 | "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", 581 | "requires": { 582 | "async-limiter": "~1.0.0" 583 | } 584 | } 585 | } 586 | }, 587 | "symbol-observable": { 588 | "version": "1.2.0", 589 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", 590 | "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" 591 | }, 592 | "util.promisify": { 593 | "version": "1.0.0", 594 | "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", 595 | "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", 596 | "requires": { 597 | "define-properties": "^1.1.2", 598 | "object.getownpropertydescriptors": "^2.0.3" 599 | } 600 | }, 601 | "uuid": { 602 | "version": "3.3.2", 603 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 604 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 605 | }, 606 | "ws": { 607 | "version": "6.1.2", 608 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.2.tgz", 609 | "integrity": "sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==", 610 | "requires": { 611 | "async-limiter": "~1.0.0" 612 | } 613 | }, 614 | "yallist": { 615 | "version": "3.0.3", 616 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", 617 | "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" 618 | }, 619 | "zen-observable": { 620 | "version": "0.8.11", 621 | "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", 622 | "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" 623 | }, 624 | "zen-observable-ts": { 625 | "version": "0.8.11", 626 | "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.11.tgz", 627 | "integrity": "sha512-8bs7rgGV4kz5iTb9isudkuQjtWwPnQ8lXq6/T76vrepYZVMsDEv6BXaEA+DHdJSK3KVLduagi9jSpSAJ5NgKHw==", 628 | "requires": { 629 | "zen-observable": "^0.8.0" 630 | } 631 | } 632 | } 633 | } 634 | -------------------------------------------------------------------------------- /remote-schemas/hello-schema/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-lambda-nodejs", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "graphql.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "apollo-server-lambda": "^2.1.0", 14 | "graphql": "^0.13.1", 15 | "graphql-tag": "^2.10.1" 16 | } 17 | } 18 | --------------------------------------------------------------------------------