├── .github └── workflows │ └── build-test-publish.yaml ├── .gitignore ├── README.md ├── examples └── hello-world │ ├── README.md │ ├── package.json │ ├── schema.graphql │ ├── src │ ├── context.ts │ ├── generated │ │ └── nexus.ts │ ├── schema.ts │ └── server.ts │ ├── tsconfig.json │ └── yarn.lock ├── jest.config.js ├── package.json ├── src ├── error.ts ├── index.ts ├── resolver.ts └── rules.ts ├── tests ├── __snapshots__ │ └── validate-fn.test.ts.snap └── validate-fn.test.ts ├── tsconfig.json └── yarn.lock /.github/workflows/build-test-publish.yaml: -------------------------------------------------------------------------------- 1 | name: build-test-publish 2 | on: [push] 3 | 4 | jobs: 5 | test: 6 | name: build-test-publish 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | 11 | - run: yarn install 12 | 13 | - run: yarn build 14 | 15 | - run: yarn test --coverage 16 | 17 | - name: upload to codecov.io 18 | uses: codecov/codecov-action@v1.0.2 19 | with: 20 | token: ${{ secrets.CODECOV_TOKEN }} 21 | 22 | - name: semantic-release 23 | uses: cycjimmy/semantic-release-action@v2 24 | env: 25 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 26 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | dist 3 | logs 4 | *.log 5 | npm-debug.log* 6 | yarn-debug.log* 7 | yarn-error.log* 8 | node_modules/ 9 | .yarn-integrity 10 | .vscode-test 11 | coverage 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # nexus-validate 2 | 3 | [![npm](https://img.shields.io/npm/v/nexus-validate)](https://www.npmjs.com/package/nexus-validate) 4 | [![npm bundle size](https://img.shields.io/bundlephobia/min/nexus-validate)](https://bundlephobia.com/result?p=nexus-validate) 5 | ![build-publish](https://github.com/filipstefansson/nexus-validate/workflows/build-publish/badge.svg) 6 | [![codecov](https://codecov.io/gh/filipstefansson/nexus-validate/branch/alpha/graph/badge.svg?token=MR3OPGNYBU)](https://codecov.io/gh/filipstefansson/nexus-validate) 7 | 8 | Add extra validation to [GraphQL Nexus](https://github.com/graphql-nexus/nexus) in an easy and expressive way. 9 | 10 | ```ts 11 | const UserMutation = extendType({ 12 | type: 'Mutation', 13 | definition(t) { 14 | t.field('createUser', { 15 | type: 'User', 16 | 17 | // add arguments 18 | args: { 19 | email: stringArg(), 20 | age: intArg(), 21 | }, 22 | 23 | // add the extra validation 24 | validate: ({ string, number }) => ({ 25 | email: string().email(), 26 | age: number().moreThan(18).integer(), 27 | }), 28 | }); 29 | }, 30 | }); 31 | ``` 32 | 33 | ## Documentation 34 | 35 | - [Installation](#installation) 36 | - [Usage](#usage) 37 | - [Custom validations](#custom-validations) 38 | - [Custom errors](#custom-errors) 39 | - [Custom error messages](#custom-error-messages) 40 | - [API](#api) 41 | - [Examples](#examples) 42 | 43 | ## Installation 44 | 45 | ```console 46 | # npm 47 | npm i nexus-validate yup 48 | 49 | # yarn 50 | yarn add nexus-validate yup 51 | ``` 52 | 53 | > `nexus-validate` uses [`yup`](https://github.com/jquense/yup) under the hood so you need to install that too. `nexus` and `graphql` are also required, but if you are using Nexus then both of those should already be installed. 54 | 55 | ### Add the plugin to Nexus: 56 | 57 | Once installed you need to add the plugin to your nexus schema configuration: 58 | 59 | ```ts 60 | import { makeSchema } from 'nexus'; 61 | import { validatePlugin } from 'nexus-validate'; 62 | 63 | const schema = makeSchema({ 64 | ... 65 | plugins: [ 66 | ... 67 | validatePlugin(), 68 | ], 69 | }); 70 | ``` 71 | 72 | ## Usage 73 | 74 | The `validate` method can be added to any field with `args`: 75 | 76 | ```ts 77 | const UserMutation = extendType({ 78 | type: 'Mutation', 79 | definition(t) { 80 | t.field('createUser', { 81 | type: 'User', 82 | args: { 83 | email: stringArg(), 84 | }, 85 | validate: ({ string }) => ({ 86 | // validate that email is an actual email 87 | email: string().email(), 88 | }), 89 | }); 90 | }, 91 | }); 92 | ``` 93 | 94 | Trying to call the above with an invalid email will result in the following error: 95 | 96 | ```json 97 | { 98 | "errors": [ 99 | { 100 | "message": "email must be a valid email", 101 | "extensions": { 102 | "invalidArgs": ["email"], 103 | "code": "BAD_USER_INPUT" 104 | } 105 | ... 106 | } 107 | ] 108 | } 109 | ``` 110 | 111 | ### Custom validations 112 | 113 | If you don't want to use the built-in validation rules, you can roll your own by **throwing an error if an argument is invalid**, and **returning void** if everything is OK. 114 | 115 | ```ts 116 | import { UserInputError } from 'nexus-validate'; 117 | t.field('createUser', { 118 | type: 'User', 119 | args: { 120 | email: stringArg(), 121 | }, 122 | // use args and context to check if email is valid 123 | validate(_, args, context) { 124 | if (args.email !== context.user.email) { 125 | throw new UserInputError('not your email', { 126 | invalidArgs: ['email'], 127 | }); 128 | } 129 | }, 130 | }); 131 | ``` 132 | 133 | ### Custom errors 134 | 135 | The plugin provides a `formatError` option where you can format the error however you'd like: 136 | 137 | ```ts 138 | import { UserInputError } from 'apollo-server'; 139 | import { validatePlugin, ValidationError } from 'nexus-validate'; 140 | 141 | const schema = makeSchema({ 142 | ... 143 | plugins: [ 144 | ... 145 | validatePlugin({ 146 | formatError: ({ error }) => { 147 | if (error instanceof ValidationError) { 148 | // convert error to UserInputError from apollo-server 149 | return new UserInputError(error.message, { 150 | invalidArgs: [error.path], 151 | }); 152 | } 153 | 154 | return error; 155 | }, 156 | }), 157 | ], 158 | }); 159 | ``` 160 | 161 | ### Custom error messages 162 | 163 | If you want to change the error message for the validation rules, that's usually possible by passing a message to the rule: 164 | 165 | ```ts 166 | validate: ({ string }) => ({ 167 | email: string() 168 | .email('must be a valid email address') 169 | .required('email is required'), 170 | }); 171 | ``` 172 | 173 | ## API 174 | 175 | ##### `validate(rules: ValidationRules, args: Args, ctx: Context) => Promise` 176 | 177 | ### ValidationRules 178 | 179 | | Type | Docs | Example | 180 | | :------ | :--------------------------------------------- | :----------------------------------------- | 181 | | string | [docs](https://github.com/jquense/yup#string) | `string().email().max(20).required()` | 182 | | number | [docs](https://github.com/jquense/yup#number) | `number().moreThan(18).number()` | 183 | | boolean | [docs](https://github.com/jquense/yup#boolean) | `boolean()` | 184 | | date | [docs](https://github.com/jquense/yup#date) | `date().min('2000-01-01').max(new Date())` | 185 | | object | [docs](https://github.com/jquense/yup#object) | `object({ name: string() })` | 186 | | array | [docs](https://github.com/jquense/yup#array) | `array.min(5).of(string())` | 187 | 188 | ### Args 189 | 190 | The `Args` argument will return whatever you passed in to `args` in your field definition: 191 | 192 | ```ts 193 | t.field('createUser', { 194 | type: 'User', 195 | args: { 196 | email: stringArg(), 197 | age: numberArg(), 198 | }, 199 | // email and age will be typed as a string and a number 200 | validate: (_, { email, age }) => {} 201 | } 202 | ``` 203 | 204 | ### Context 205 | 206 | `Context` is your GraphQL context, which can give you access to things like the current user or your data sources. This will let you validation rules based on the context of your API. 207 | 208 | ```ts 209 | t.field('createUser', { 210 | type: 'User', 211 | args: { 212 | email: stringArg(), 213 | }, 214 | validate: async (_, { email }, { prisma }) => { 215 | const count = await prisma.user.count({ where: { email } }); 216 | if (count > 1) { 217 | throw new Error('email already taken'); 218 | } 219 | }, 220 | }); 221 | ``` 222 | 223 | ## Examples 224 | 225 | - [Hello World Example](examples/hello-world) 226 | 227 | ## License 228 | 229 | **nexus-validate** is provided under the MIT License. See LICENSE for details. 230 | -------------------------------------------------------------------------------- /examples/hello-world/README.md: -------------------------------------------------------------------------------- 1 | # Hello World Example 2 | 3 | This example shows how to integrate `nexus-validate` into a Nexus Graphql App. See [schema.ts](src/schema.ts) for relevant code. 4 | 5 | ## How to use 6 | 7 | ```console 8 | $ yarn 9 | $ yarn dev 10 | ``` 11 | -------------------------------------------------------------------------------- /examples/hello-world/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hello-world", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "scripts": { 6 | "start": "node dist/server", 7 | "clean": "rm -rf dist", 8 | "build": "yarn clean && yarn generate:nexus && tsc", 9 | "generate:nexus": "ts-node --transpile-only src/schema", 10 | "dev": "ts-node-dev --no-notify --respawn --transpile-only src/server" 11 | }, 12 | "dependencies": { 13 | "apollo-server": "^2.19.2", 14 | "graphql": "^15.5.3", 15 | "nexus": "^1.1.0", 16 | "nexus-validate": "^1.0.0", 17 | "yup": "^0.32.9" 18 | }, 19 | "devDependencies": { 20 | "ts-node": "^9.1.1", 21 | "ts-node-dev": "1.0.0", 22 | "typescript": "^4.1.3" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /examples/hello-world/schema.graphql: -------------------------------------------------------------------------------- 1 | ### This file was generated by Nexus Schema 2 | ### Do not make changes to this file directly 3 | 4 | 5 | type Mutation { 6 | createUser(age: Int, email: String, name: String, secret: String, website: String): User 7 | } 8 | 9 | type Query { 10 | user(email: String): User 11 | } 12 | 13 | type User { 14 | age: Int 15 | email: String 16 | friends(email: String): [User] 17 | name: String 18 | secret: String 19 | website: String 20 | } 21 | -------------------------------------------------------------------------------- /examples/hello-world/src/context.ts: -------------------------------------------------------------------------------- 1 | export interface Context { 2 | secret: string; 3 | } 4 | 5 | export function createContext(): Context { 6 | return { secret: 'nexus' }; 7 | } 8 | -------------------------------------------------------------------------------- /examples/hello-world/src/generated/nexus.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file was generated by Nexus Schema 3 | * Do not make changes to this file directly 4 | */ 5 | 6 | 7 | import type { Context } from "./../context" 8 | import type { ValidateResolver } from "nexus-validate" 9 | 10 | 11 | 12 | 13 | declare global { 14 | interface NexusGen extends NexusGenTypes {} 15 | } 16 | 17 | export interface NexusGenInputs { 18 | } 19 | 20 | export interface NexusGenEnums { 21 | } 22 | 23 | export interface NexusGenScalars { 24 | String: string 25 | Int: number 26 | Float: number 27 | Boolean: boolean 28 | ID: string 29 | } 30 | 31 | export interface NexusGenObjects { 32 | Mutation: {}; 33 | Query: {}; 34 | User: { // root type 35 | age?: number | null; // Int 36 | email?: string | null; // String 37 | name?: string | null; // String 38 | secret?: string | null; // String 39 | website?: string | null; // String 40 | } 41 | } 42 | 43 | export interface NexusGenInterfaces { 44 | } 45 | 46 | export interface NexusGenUnions { 47 | } 48 | 49 | export type NexusGenRootTypes = NexusGenObjects 50 | 51 | export type NexusGenAllTypes = NexusGenRootTypes & NexusGenScalars 52 | 53 | export interface NexusGenFieldTypes { 54 | Mutation: { // field return type 55 | createUser: NexusGenRootTypes['User'] | null; // User 56 | } 57 | Query: { // field return type 58 | user: NexusGenRootTypes['User'] | null; // User 59 | } 60 | User: { // field return type 61 | age: number | null; // Int 62 | email: string | null; // String 63 | friends: Array | null; // [User] 64 | name: string | null; // String 65 | secret: string | null; // String 66 | website: string | null; // String 67 | } 68 | } 69 | 70 | export interface NexusGenFieldTypeNames { 71 | Mutation: { // field return type name 72 | createUser: 'User' 73 | } 74 | Query: { // field return type name 75 | user: 'User' 76 | } 77 | User: { // field return type name 78 | age: 'Int' 79 | email: 'String' 80 | friends: 'User' 81 | name: 'String' 82 | secret: 'String' 83 | website: 'String' 84 | } 85 | } 86 | 87 | export interface NexusGenArgTypes { 88 | Mutation: { 89 | createUser: { // args 90 | age?: number | null; // Int 91 | email?: string | null; // String 92 | name?: string | null; // String 93 | secret?: string | null; // String 94 | website?: string | null; // String 95 | } 96 | } 97 | Query: { 98 | user: { // args 99 | email?: string | null; // String 100 | } 101 | } 102 | User: { 103 | friends: { // args 104 | email?: string | null; // String 105 | } 106 | } 107 | } 108 | 109 | export interface NexusGenAbstractTypeMembers { 110 | } 111 | 112 | export interface NexusGenTypeInterfaces { 113 | } 114 | 115 | export type NexusGenObjectNames = keyof NexusGenObjects; 116 | 117 | export type NexusGenInputNames = never; 118 | 119 | export type NexusGenEnumNames = never; 120 | 121 | export type NexusGenInterfaceNames = never; 122 | 123 | export type NexusGenScalarNames = keyof NexusGenScalars; 124 | 125 | export type NexusGenUnionNames = never; 126 | 127 | export type NexusGenObjectsUsingAbstractStrategyIsTypeOf = never; 128 | 129 | export type NexusGenAbstractsUsingStrategyResolveType = never; 130 | 131 | export type NexusGenFeaturesConfig = { 132 | abstractTypeStrategies: { 133 | isTypeOf: false 134 | resolveType: true 135 | __typename: false 136 | } 137 | } 138 | 139 | export interface NexusGenTypes { 140 | context: Context; 141 | inputTypes: NexusGenInputs; 142 | rootTypes: NexusGenRootTypes; 143 | inputTypeShapes: NexusGenInputs & NexusGenEnums & NexusGenScalars; 144 | argTypes: NexusGenArgTypes; 145 | fieldTypes: NexusGenFieldTypes; 146 | fieldTypeNames: NexusGenFieldTypeNames; 147 | allTypes: NexusGenAllTypes; 148 | typeInterfaces: NexusGenTypeInterfaces; 149 | objectNames: NexusGenObjectNames; 150 | inputNames: NexusGenInputNames; 151 | enumNames: NexusGenEnumNames; 152 | interfaceNames: NexusGenInterfaceNames; 153 | scalarNames: NexusGenScalarNames; 154 | unionNames: NexusGenUnionNames; 155 | allInputTypes: NexusGenTypes['inputNames'] | NexusGenTypes['enumNames'] | NexusGenTypes['scalarNames']; 156 | allOutputTypes: NexusGenTypes['objectNames'] | NexusGenTypes['enumNames'] | NexusGenTypes['unionNames'] | NexusGenTypes['interfaceNames'] | NexusGenTypes['scalarNames']; 157 | allNamedTypes: NexusGenTypes['allInputTypes'] | NexusGenTypes['allOutputTypes'] 158 | abstractTypes: NexusGenTypes['interfaceNames'] | NexusGenTypes['unionNames']; 159 | abstractTypeMembers: NexusGenAbstractTypeMembers; 160 | objectsUsingAbstractStrategyIsTypeOf: NexusGenObjectsUsingAbstractStrategyIsTypeOf; 161 | abstractsUsingStrategyResolveType: NexusGenAbstractsUsingStrategyResolveType; 162 | features: NexusGenFeaturesConfig; 163 | } 164 | 165 | 166 | declare global { 167 | interface NexusGenPluginTypeConfig { 168 | } 169 | interface NexusGenPluginInputTypeConfig { 170 | } 171 | interface NexusGenPluginFieldConfig { 172 | /** 173 | * Validate mutation arguments. 174 | */ 175 | validate?: ValidateResolver 176 | } 177 | interface NexusGenPluginInputFieldConfig { 178 | } 179 | interface NexusGenPluginSchemaConfig { 180 | } 181 | interface NexusGenPluginArgConfig { 182 | } 183 | } -------------------------------------------------------------------------------- /examples/hello-world/src/schema.ts: -------------------------------------------------------------------------------- 1 | import { 2 | stringArg, 3 | makeSchema, 4 | mutationType, 5 | objectType, 6 | intArg, 7 | queryType, 8 | } from 'nexus'; 9 | import { validatePlugin, ValidationError } from 'nexus-validate'; 10 | import { UserInputError } from 'apollo-server'; 11 | 12 | let USERS = [ 13 | { 14 | name: 'Test', 15 | email: 'test@test.com', 16 | age: 30, 17 | website: 'https://website.com', 18 | }, 19 | ]; 20 | 21 | export const User = objectType({ 22 | name: 'User', 23 | definition(t) { 24 | t.string('name'); 25 | t.string('email'); 26 | t.int('age'); 27 | t.string('website'); 28 | t.string('secret'); 29 | t.list.field('friends', { 30 | type: User, 31 | args: { 32 | email: stringArg(), 33 | }, 34 | validate: ({ string }) => ({ 35 | email: string().email(), 36 | }), 37 | resolve: (_, args) => { 38 | return USERS; 39 | }, 40 | }); 41 | }, 42 | }); 43 | 44 | const Mutation = mutationType({ 45 | definition(t) { 46 | t.field('createUser', { 47 | type: 'User', 48 | args: { 49 | name: stringArg(), 50 | email: stringArg(), 51 | age: intArg(), 52 | website: stringArg(), 53 | secret: stringArg(), 54 | }, 55 | // this will get called before the resolver and we can use 56 | // the rules from the first argument together with args and context 57 | // to figure out if the provided arguments are valid or not 58 | validate: ({ string, number }, args, ctx) => ({ 59 | name: string().trim(), 60 | email: string().email().trim(), 61 | age: number().min(18), 62 | website: string().url(), 63 | // create a custom rule for secret that uses a custom test, 64 | // the provided argument and the graphql context 65 | secret: string().test( 66 | 'valid-secret', 67 | `${args.secret} is not the correct secret`, 68 | (value) => value === ctx.secret 69 | ), 70 | }), 71 | resolve: (_, args) => { 72 | return { 73 | ...USERS[0], 74 | ...args, 75 | }; 76 | }, 77 | }); 78 | }, 79 | }); 80 | 81 | const Query = queryType({ 82 | definition(t) { 83 | t.field('user', { 84 | type: 'User', 85 | args: { 86 | email: stringArg(), 87 | }, 88 | validate: ({ string }, args, ctx) => ({ 89 | email: string().email(), 90 | }), 91 | resolve: (_, args) => { 92 | return { 93 | ...USERS[0], 94 | ...args, 95 | }; 96 | }, 97 | }); 98 | }, 99 | }); 100 | 101 | export const schema = makeSchema({ 102 | types: [User, Mutation, Query], 103 | contextType: { 104 | module: require.resolve('./context'), 105 | export: 'Context', 106 | }, 107 | outputs: { 108 | schema: __dirname + '/../schema.graphql', 109 | typegen: __dirname + '/generated/nexus.ts', 110 | }, 111 | // add the plugin with a custom `formatError` function 112 | // that passed the error to apollos UserInputError 113 | plugins: [ 114 | validatePlugin({ 115 | formatError: ({ error }) => { 116 | if (error instanceof ValidationError) { 117 | return new UserInputError(error.message, { 118 | invalidArgs: [error.path], 119 | }); 120 | } 121 | 122 | return error; 123 | }, 124 | }), 125 | ], 126 | }); 127 | -------------------------------------------------------------------------------- /examples/hello-world/src/server.ts: -------------------------------------------------------------------------------- 1 | import { ApolloServer } from 'apollo-server'; 2 | import { createContext } from './context'; 3 | import { schema } from './schema'; 4 | 5 | const server = new ApolloServer({ 6 | context: createContext(), 7 | schema, 8 | }); 9 | 10 | server.listen().then(({ url }) => { 11 | console.log(`🚀 Server ready at ${url}`); 12 | }); 13 | -------------------------------------------------------------------------------- /examples/hello-world/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "dist", 4 | "rootDir": "src", 5 | "lib": ["esnext"], 6 | "esModuleInterop": true, 7 | "strict": true, 8 | "noImplicitAny": false 9 | }, 10 | "include": ["src/**/*"] 11 | } 12 | -------------------------------------------------------------------------------- /examples/hello-world/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@apollo/protobufjs@^1.0.3": 6 | version "1.0.5" 7 | resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.0.5.tgz#a78b726147efc0795e74c8cb8a11aafc6e02f773" 8 | integrity sha512-ZtyaBH1icCgqwIGb3zrtopV2D5Q8yxibkJzlaViM08eOhTQc7rACdYu0pfORFfhllvdMZ3aq69vifYHszY4gNA== 9 | dependencies: 10 | "@protobufjs/aspromise" "^1.1.2" 11 | "@protobufjs/base64" "^1.1.2" 12 | "@protobufjs/codegen" "^2.0.4" 13 | "@protobufjs/eventemitter" "^1.1.0" 14 | "@protobufjs/fetch" "^1.1.0" 15 | "@protobufjs/float" "^1.0.2" 16 | "@protobufjs/inquire" "^1.1.0" 17 | "@protobufjs/path" "^1.1.2" 18 | "@protobufjs/pool" "^1.1.0" 19 | "@protobufjs/utf8" "^1.1.0" 20 | "@types/long" "^4.0.0" 21 | "@types/node" "^10.1.0" 22 | long "^4.0.0" 23 | 24 | "@apollographql/apollo-tools@^0.4.3": 25 | version "0.4.8" 26 | resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.4.8.tgz#d81da89ee880c2345eb86bddb92b35291f6135ed" 27 | integrity sha512-W2+HB8Y7ifowcf3YyPHgDI05izyRtOeZ4MqIr7LbTArtmJ0ZHULWpn84SGMW7NAvTV1tFExpHlveHhnXuJfuGA== 28 | dependencies: 29 | apollo-env "^0.6.5" 30 | 31 | "@apollographql/graphql-playground-html@1.6.26": 32 | version "1.6.26" 33 | resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz#2f7b610392e2a872722912fc342b43cf8d641cb3" 34 | integrity sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ== 35 | dependencies: 36 | xss "^1.0.6" 37 | 38 | "@babel/runtime@^7.10.5": 39 | version "7.12.5" 40 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" 41 | integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== 42 | dependencies: 43 | regenerator-runtime "^0.13.4" 44 | 45 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": 46 | version "1.1.2" 47 | resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" 48 | integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= 49 | 50 | "@protobufjs/base64@^1.1.2": 51 | version "1.1.2" 52 | resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" 53 | integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== 54 | 55 | "@protobufjs/codegen@^2.0.4": 56 | version "2.0.4" 57 | resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" 58 | integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== 59 | 60 | "@protobufjs/eventemitter@^1.1.0": 61 | version "1.1.0" 62 | resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" 63 | integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= 64 | 65 | "@protobufjs/fetch@^1.1.0": 66 | version "1.1.0" 67 | resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" 68 | integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= 69 | dependencies: 70 | "@protobufjs/aspromise" "^1.1.1" 71 | "@protobufjs/inquire" "^1.1.0" 72 | 73 | "@protobufjs/float@^1.0.2": 74 | version "1.0.2" 75 | resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" 76 | integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= 77 | 78 | "@protobufjs/inquire@^1.1.0": 79 | version "1.1.0" 80 | resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" 81 | integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= 82 | 83 | "@protobufjs/path@^1.1.2": 84 | version "1.1.2" 85 | resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" 86 | integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= 87 | 88 | "@protobufjs/pool@^1.1.0": 89 | version "1.1.0" 90 | resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" 91 | integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= 92 | 93 | "@protobufjs/utf8@^1.1.0": 94 | version "1.1.0" 95 | resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" 96 | integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= 97 | 98 | "@types/accepts@*", "@types/accepts@^1.3.5": 99 | version "1.3.5" 100 | resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" 101 | integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== 102 | dependencies: 103 | "@types/node" "*" 104 | 105 | "@types/body-parser@*", "@types/body-parser@1.19.0": 106 | version "1.19.0" 107 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" 108 | integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== 109 | dependencies: 110 | "@types/connect" "*" 111 | "@types/node" "*" 112 | 113 | "@types/connect@*": 114 | version "3.4.34" 115 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901" 116 | integrity sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ== 117 | dependencies: 118 | "@types/node" "*" 119 | 120 | "@types/content-disposition@*": 121 | version "0.5.3" 122 | resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.3.tgz#0aa116701955c2faa0717fc69cd1596095e49d96" 123 | integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg== 124 | 125 | "@types/cookies@*": 126 | version "0.7.6" 127 | resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.6.tgz#71212c5391a976d3bae57d4b09fac20fc6bda504" 128 | integrity sha512-FK4U5Qyn7/Sc5ih233OuHO0qAkOpEcD/eG6584yEiLKizTFRny86qHLe/rej3HFQrkBuUjF4whFliAdODbVN/w== 129 | dependencies: 130 | "@types/connect" "*" 131 | "@types/express" "*" 132 | "@types/keygrip" "*" 133 | "@types/node" "*" 134 | 135 | "@types/cors@2.8.8": 136 | version "2.8.8" 137 | resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.8.tgz#317a8d8561995c60e35b9e0fcaa8d36660c98092" 138 | integrity sha512-fO3gf3DxU2Trcbr75O7obVndW/X5k8rJNZkLXlQWStTHhP71PkRqjwPIEI0yMnJdg9R9OasjU+Bsr+Hr1xy/0w== 139 | dependencies: 140 | "@types/express" "*" 141 | 142 | "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": 143 | version "4.17.18" 144 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.18.tgz#8371e260f40e0e1ca0c116a9afcd9426fa094c40" 145 | integrity sha512-m4JTwx5RUBNZvky/JJ8swEJPKFd8si08pPF2PfizYjGZOKr/svUWPcoUmLow6MmPzhasphB7gSTINY67xn3JNA== 146 | dependencies: 147 | "@types/node" "*" 148 | "@types/qs" "*" 149 | "@types/range-parser" "*" 150 | 151 | "@types/express-serve-static-core@4.17.17": 152 | version "4.17.17" 153 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.17.tgz#6ba02465165b6c9c3d8db3a28def6b16fc9b70f5" 154 | integrity sha512-YYlVaCni5dnHc+bLZfY908IG1+x5xuibKZMGv8srKkvtul3wUuanYvpIj9GXXoWkQbaAdR+kgX46IETKUALWNQ== 155 | dependencies: 156 | "@types/node" "*" 157 | "@types/qs" "*" 158 | "@types/range-parser" "*" 159 | 160 | "@types/express@*": 161 | version "4.17.11" 162 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.11.tgz#debe3caa6f8e5fcda96b47bd54e2f40c4ee59545" 163 | integrity sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg== 164 | dependencies: 165 | "@types/body-parser" "*" 166 | "@types/express-serve-static-core" "^4.17.18" 167 | "@types/qs" "*" 168 | "@types/serve-static" "*" 169 | 170 | "@types/express@4.17.7": 171 | version "4.17.7" 172 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.7.tgz#42045be6475636d9801369cd4418ef65cdb0dd59" 173 | integrity sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ== 174 | dependencies: 175 | "@types/body-parser" "*" 176 | "@types/express-serve-static-core" "*" 177 | "@types/qs" "*" 178 | "@types/serve-static" "*" 179 | 180 | "@types/fs-capacitor@*": 181 | version "2.0.0" 182 | resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e" 183 | integrity sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ== 184 | dependencies: 185 | "@types/node" "*" 186 | 187 | "@types/graphql-upload@^8.0.0": 188 | version "8.0.4" 189 | resolved "https://registry.yarnpkg.com/@types/graphql-upload/-/graphql-upload-8.0.4.tgz#23a8ffb3d2fe6e0ee07e6f16ee9d9d5e995a2f4f" 190 | integrity sha512-0TRyJD2o8vbkmJF8InppFcPVcXKk+Rvlg/xvpHBIndSJYpmDWfmtx/ZAtl4f3jR2vfarpTqYgj8MZuJssSoU7Q== 191 | dependencies: 192 | "@types/express" "*" 193 | "@types/fs-capacitor" "*" 194 | "@types/koa" "*" 195 | graphql "^15.3.0" 196 | 197 | "@types/http-assert@*": 198 | version "1.5.1" 199 | resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b" 200 | integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ== 201 | 202 | "@types/http-errors@*": 203 | version "1.8.0" 204 | resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.0.tgz#682477dbbbd07cd032731cb3b0e7eaee3d026b69" 205 | integrity sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA== 206 | 207 | "@types/keygrip@*": 208 | version "1.0.2" 209 | resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" 210 | integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== 211 | 212 | "@types/koa-compose@*": 213 | version "3.2.5" 214 | resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" 215 | integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== 216 | dependencies: 217 | "@types/koa" "*" 218 | 219 | "@types/koa@*": 220 | version "2.11.6" 221 | resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.11.6.tgz#b7030caa6b44af801c2aea13ba77d74aff7484d5" 222 | integrity sha512-BhyrMj06eQkk04C97fovEDQMpLpd2IxCB4ecitaXwOKGq78Wi2tooaDOWOFGajPk8IkQOAtMppApgSVkYe1F/A== 223 | dependencies: 224 | "@types/accepts" "*" 225 | "@types/content-disposition" "*" 226 | "@types/cookies" "*" 227 | "@types/http-assert" "*" 228 | "@types/http-errors" "*" 229 | "@types/keygrip" "*" 230 | "@types/koa-compose" "*" 231 | "@types/node" "*" 232 | 233 | "@types/lodash@^4.14.165": 234 | version "4.14.168" 235 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" 236 | integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== 237 | 238 | "@types/long@^4.0.0": 239 | version "4.0.1" 240 | resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" 241 | integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== 242 | 243 | "@types/mime@^1": 244 | version "1.3.2" 245 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" 246 | integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== 247 | 248 | "@types/node-fetch@2.5.7": 249 | version "2.5.7" 250 | resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" 251 | integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw== 252 | dependencies: 253 | "@types/node" "*" 254 | form-data "^3.0.0" 255 | 256 | "@types/node@*": 257 | version "14.14.22" 258 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.22.tgz#0d29f382472c4ccf3bd96ff0ce47daf5b7b84b18" 259 | integrity sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw== 260 | 261 | "@types/node@^10.1.0": 262 | version "10.17.51" 263 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.51.tgz#639538575befbcf3d3861f95c41de8e47124d674" 264 | integrity sha512-KANw+MkL626tq90l++hGelbl67irOJzGhUJk6a1Bt8QHOeh9tztJx+L0AqttraWKinmZn7Qi5lJZJzx45Gq0dg== 265 | 266 | "@types/qs@*": 267 | version "6.9.5" 268 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" 269 | integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== 270 | 271 | "@types/range-parser@*": 272 | version "1.2.3" 273 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" 274 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 275 | 276 | "@types/serve-static@*": 277 | version "1.13.9" 278 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.9.tgz#aacf28a85a05ee29a11fb7c3ead935ac56f33e4e" 279 | integrity sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA== 280 | dependencies: 281 | "@types/mime" "^1" 282 | "@types/node" "*" 283 | 284 | "@types/strip-bom@^3.0.0": 285 | version "3.0.0" 286 | resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" 287 | integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= 288 | 289 | "@types/strip-json-comments@0.0.30": 290 | version "0.0.30" 291 | resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" 292 | integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== 293 | 294 | "@types/ws@^7.0.0": 295 | version "7.4.0" 296 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.0.tgz#499690ea08736e05a8186113dac37769ab251a0e" 297 | integrity sha512-Y29uQ3Uy+58bZrFLhX36hcI3Np37nqWE7ky5tjiDoy1GDZnIwVxS0CgF+s+1bXMzjKBFy+fqaRfb708iNzdinw== 298 | dependencies: 299 | "@types/node" "*" 300 | 301 | "@wry/equality@^0.1.2": 302 | version "0.1.11" 303 | resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" 304 | integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== 305 | dependencies: 306 | tslib "^1.9.3" 307 | 308 | accepts@^1.3.5, accepts@~1.3.7: 309 | version "1.3.7" 310 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 311 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 312 | dependencies: 313 | mime-types "~2.1.24" 314 | negotiator "0.6.2" 315 | 316 | anymatch@~3.1.1: 317 | version "3.1.1" 318 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 319 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 320 | dependencies: 321 | normalize-path "^3.0.0" 322 | picomatch "^2.0.4" 323 | 324 | apollo-cache-control@^0.11.6: 325 | version "0.11.6" 326 | resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.11.6.tgz#f7bdf924272af47ac474cf3f3f35cfc038cc9485" 327 | integrity sha512-YZ+uuIG+fPy+mkpBS2qKF0v1qlzZ3PW6xZVaDukeK3ed3iAs4L/2YnkTqau3OmoF/VPzX2FmSkocX/OVd59YSw== 328 | dependencies: 329 | apollo-server-env "^3.0.0" 330 | apollo-server-plugin-base "^0.10.4" 331 | 332 | apollo-datasource@^0.7.3: 333 | version "0.7.3" 334 | resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.7.3.tgz#c824eb1457bdee5a3173ced0e35e594547e687a0" 335 | integrity sha512-PE0ucdZYjHjUyXrFWRwT02yLcx2DACsZ0jm1Mp/0m/I9nZu/fEkvJxfsryXB6JndpmQO77gQHixf/xGCN976kA== 336 | dependencies: 337 | apollo-server-caching "^0.5.3" 338 | apollo-server-env "^3.0.0" 339 | 340 | apollo-env@^0.6.5: 341 | version "0.6.5" 342 | resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.6.5.tgz#5a36e699d39e2356381f7203493187260fded9f3" 343 | integrity sha512-jeBUVsGymeTHYWp3me0R2CZRZrFeuSZeICZHCeRflHTfnQtlmbSXdy5E0pOyRM9CU4JfQkKDC98S1YglQj7Bzg== 344 | dependencies: 345 | "@types/node-fetch" "2.5.7" 346 | core-js "^3.0.1" 347 | node-fetch "^2.2.0" 348 | sha.js "^2.4.11" 349 | 350 | apollo-graphql@^0.6.0: 351 | version "0.6.0" 352 | resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.6.0.tgz#37bee7dc853213269137f4c60bfdf2ee28658669" 353 | integrity sha512-BxTf5LOQe649e9BNTPdyCGItVv4Ll8wZ2BKnmiYpRAocYEXAVrQPWuSr3dO4iipqAU8X0gvle/Xu9mSqg5b7Qg== 354 | dependencies: 355 | apollo-env "^0.6.5" 356 | lodash.sortby "^4.7.0" 357 | 358 | apollo-link@^1.2.14: 359 | version "1.2.14" 360 | resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" 361 | integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== 362 | dependencies: 363 | apollo-utilities "^1.3.0" 364 | ts-invariant "^0.4.0" 365 | tslib "^1.9.3" 366 | zen-observable-ts "^0.8.21" 367 | 368 | apollo-reporting-protobuf@^0.6.2: 369 | version "0.6.2" 370 | resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.6.2.tgz#5572866be9b77f133916532b10e15fbaa4158304" 371 | integrity sha512-WJTJxLM+MRHNUxt1RTl4zD0HrLdH44F2mDzMweBj1yHL0kSt8I1WwoiF/wiGVSpnG48LZrBegCaOJeuVbJTbtw== 372 | dependencies: 373 | "@apollo/protobufjs" "^1.0.3" 374 | 375 | apollo-server-caching@^0.5.3: 376 | version "0.5.3" 377 | resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.5.3.tgz#cf42a77ad09a46290a246810075eaa029b5305e1" 378 | integrity sha512-iMi3087iphDAI0U2iSBE9qtx9kQoMMEWr6w+LwXruBD95ek9DWyj7OeC2U/ngLjRsXM43DoBDXlu7R+uMjahrQ== 379 | dependencies: 380 | lru-cache "^6.0.0" 381 | 382 | apollo-server-core@^2.19.2: 383 | version "2.19.2" 384 | resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.19.2.tgz#9a5651be233aceab6b062e82eef4c8072f6ac230" 385 | integrity sha512-liLgLhTIGWZtdQbxuxo3/Yv8j+faKQcI60kOL+uwfByGhoKLZEQp5nqi2IdMK6JXt1VuyKwKu7lTzj02a9S3jA== 386 | dependencies: 387 | "@apollographql/apollo-tools" "^0.4.3" 388 | "@apollographql/graphql-playground-html" "1.6.26" 389 | "@types/graphql-upload" "^8.0.0" 390 | "@types/ws" "^7.0.0" 391 | apollo-cache-control "^0.11.6" 392 | apollo-datasource "^0.7.3" 393 | apollo-graphql "^0.6.0" 394 | apollo-reporting-protobuf "^0.6.2" 395 | apollo-server-caching "^0.5.3" 396 | apollo-server-env "^3.0.0" 397 | apollo-server-errors "^2.4.2" 398 | apollo-server-plugin-base "^0.10.4" 399 | apollo-server-types "^0.6.3" 400 | apollo-tracing "^0.12.2" 401 | async-retry "^1.2.1" 402 | fast-json-stable-stringify "^2.0.0" 403 | graphql-extensions "^0.12.8" 404 | graphql-tag "^2.11.0" 405 | graphql-tools "^4.0.0" 406 | graphql-upload "^8.0.2" 407 | loglevel "^1.6.7" 408 | lru-cache "^6.0.0" 409 | sha.js "^2.4.11" 410 | subscriptions-transport-ws "^0.9.11" 411 | uuid "^8.0.0" 412 | ws "^6.0.0" 413 | 414 | apollo-server-env@^3.0.0: 415 | version "3.0.0" 416 | resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-3.0.0.tgz#0157c51f52b63aee39af190760acf789ffc744d9" 417 | integrity sha512-tPSN+VttnPsoQAl/SBVUpGbLA97MXG990XIwq6YUnJyAixrrsjW1xYG7RlaOqetxm80y5mBZKLrRDiiSsW/vog== 418 | dependencies: 419 | node-fetch "^2.1.2" 420 | util.promisify "^1.0.0" 421 | 422 | apollo-server-errors@^2.4.2: 423 | version "2.4.2" 424 | resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.4.2.tgz#1128738a1d14da989f58420896d70524784eabe5" 425 | integrity sha512-FeGxW3Batn6sUtX3OVVUm7o56EgjxDlmgpTLNyWcLb0j6P8mw9oLNyAm3B+deHA4KNdNHO5BmHS2g1SJYjqPCQ== 426 | 427 | apollo-server-express@^2.19.2: 428 | version "2.19.2" 429 | resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.19.2.tgz#8b185e8fb3b71cde09ca3d5a5d5af340b0421e7b" 430 | integrity sha512-1v2H6BgDkS4QzRbJ9djn2o0yv5m/filbpiupxAsCG9f+sAoSlY3eYSj84Sbex2r5+4itAvT9y84WI7d9RBYs/Q== 431 | dependencies: 432 | "@apollographql/graphql-playground-html" "1.6.26" 433 | "@types/accepts" "^1.3.5" 434 | "@types/body-parser" "1.19.0" 435 | "@types/cors" "2.8.8" 436 | "@types/express" "4.17.7" 437 | "@types/express-serve-static-core" "4.17.17" 438 | accepts "^1.3.5" 439 | apollo-server-core "^2.19.2" 440 | apollo-server-types "^0.6.3" 441 | body-parser "^1.18.3" 442 | cors "^2.8.4" 443 | express "^4.17.1" 444 | graphql-subscriptions "^1.0.0" 445 | graphql-tools "^4.0.0" 446 | parseurl "^1.3.2" 447 | subscriptions-transport-ws "^0.9.16" 448 | type-is "^1.6.16" 449 | 450 | apollo-server-plugin-base@^0.10.4: 451 | version "0.10.4" 452 | resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.10.4.tgz#fbf73f64f95537ca9f9639dd7c535eb5eeb95dcd" 453 | integrity sha512-HRhbyHgHFTLP0ImubQObYhSgpmVH4Rk1BinnceZmwudIVLKrqayIVOELdyext/QnSmmzg5W7vF3NLGBcVGMqDg== 454 | dependencies: 455 | apollo-server-types "^0.6.3" 456 | 457 | apollo-server-types@^0.6.3: 458 | version "0.6.3" 459 | resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.6.3.tgz#f7aa25ff7157863264d01a77d7934aa6e13399e8" 460 | integrity sha512-aVR7SlSGGY41E1f11YYz5bvwA89uGmkVUtzMiklDhZ7IgRJhysT5Dflt5IuwDxp+NdQkIhVCErUXakopocFLAg== 461 | dependencies: 462 | apollo-reporting-protobuf "^0.6.2" 463 | apollo-server-caching "^0.5.3" 464 | apollo-server-env "^3.0.0" 465 | 466 | apollo-server@^2.19.2: 467 | version "2.19.2" 468 | resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.19.2.tgz#af5dce17695801e0edd561328b665866e26104da" 469 | integrity sha512-fyl8U2O1haBOvaF3Z4+ZNj2Z9KXtw0Hb13NG2+J7vyHTdDL/hEwX9bp9AnWlfXOYL8s/VeankAUNqw8kggBeZw== 470 | dependencies: 471 | apollo-server-core "^2.19.2" 472 | apollo-server-express "^2.19.2" 473 | express "^4.0.0" 474 | graphql-subscriptions "^1.0.0" 475 | graphql-tools "^4.0.0" 476 | 477 | apollo-tracing@^0.12.2: 478 | version "0.12.2" 479 | resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.12.2.tgz#a261c3970bb421b6dadf50cd85d75b2567a7e52c" 480 | integrity sha512-SYN4o0C0wR1fyS3+P0FthyvsQVHFopdmN3IU64IaspR/RZScPxZ3Ae8uu++fTvkQflAkglnFM0aX6DkZERBp6w== 481 | dependencies: 482 | apollo-server-env "^3.0.0" 483 | apollo-server-plugin-base "^0.10.4" 484 | 485 | apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: 486 | version "1.3.4" 487 | resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" 488 | integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== 489 | dependencies: 490 | "@wry/equality" "^0.1.2" 491 | fast-json-stable-stringify "^2.0.0" 492 | ts-invariant "^0.4.0" 493 | tslib "^1.10.0" 494 | 495 | arg@^4.1.0: 496 | version "4.1.3" 497 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 498 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 499 | 500 | array-find-index@^1.0.1: 501 | version "1.0.2" 502 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 503 | integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= 504 | 505 | array-flatten@1.1.1: 506 | version "1.1.1" 507 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 508 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 509 | 510 | async-limiter@~1.0.0: 511 | version "1.0.1" 512 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" 513 | integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== 514 | 515 | async-retry@^1.2.1: 516 | version "1.3.1" 517 | resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" 518 | integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== 519 | dependencies: 520 | retry "0.12.0" 521 | 522 | asynckit@^0.4.0: 523 | version "0.4.0" 524 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 525 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 526 | 527 | backo2@^1.0.2: 528 | version "1.0.2" 529 | resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" 530 | integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= 531 | 532 | balanced-match@^1.0.0: 533 | version "1.0.0" 534 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 535 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 536 | 537 | binary-extensions@^2.0.0: 538 | version "2.2.0" 539 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 540 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 541 | 542 | body-parser@1.19.0, body-parser@^1.18.3: 543 | version "1.19.0" 544 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 545 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 546 | dependencies: 547 | bytes "3.1.0" 548 | content-type "~1.0.4" 549 | debug "2.6.9" 550 | depd "~1.1.2" 551 | http-errors "1.7.2" 552 | iconv-lite "0.4.24" 553 | on-finished "~2.3.0" 554 | qs "6.7.0" 555 | raw-body "2.4.0" 556 | type-is "~1.6.17" 557 | 558 | brace-expansion@^1.1.7: 559 | version "1.1.11" 560 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 561 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 562 | dependencies: 563 | balanced-match "^1.0.0" 564 | concat-map "0.0.1" 565 | 566 | braces@~3.0.2: 567 | version "3.0.2" 568 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 569 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 570 | dependencies: 571 | fill-range "^7.0.1" 572 | 573 | buffer-from@^1.0.0: 574 | version "1.1.1" 575 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 576 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 577 | 578 | busboy@^0.3.1: 579 | version "0.3.1" 580 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" 581 | integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== 582 | dependencies: 583 | dicer "0.3.0" 584 | 585 | bytes@3.1.0: 586 | version "3.1.0" 587 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 588 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 589 | 590 | call-bind@^1.0.0, call-bind@^1.0.2: 591 | version "1.0.2" 592 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 593 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 594 | dependencies: 595 | function-bind "^1.1.1" 596 | get-intrinsic "^1.0.2" 597 | 598 | camelcase-keys@^2.0.0: 599 | version "2.1.0" 600 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 601 | integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= 602 | dependencies: 603 | camelcase "^2.0.0" 604 | map-obj "^1.0.0" 605 | 606 | camelcase@^2.0.0: 607 | version "2.1.1" 608 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 609 | integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= 610 | 611 | chokidar@^3.4.0: 612 | version "3.5.1" 613 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" 614 | integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== 615 | dependencies: 616 | anymatch "~3.1.1" 617 | braces "~3.0.2" 618 | glob-parent "~5.1.0" 619 | is-binary-path "~2.1.0" 620 | is-glob "~4.0.1" 621 | normalize-path "~3.0.0" 622 | readdirp "~3.5.0" 623 | optionalDependencies: 624 | fsevents "~2.3.1" 625 | 626 | combined-stream@^1.0.8: 627 | version "1.0.8" 628 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 629 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 630 | dependencies: 631 | delayed-stream "~1.0.0" 632 | 633 | commander@^2.20.3: 634 | version "2.20.3" 635 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 636 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 637 | 638 | concat-map@0.0.1: 639 | version "0.0.1" 640 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 641 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 642 | 643 | content-disposition@0.5.3: 644 | version "0.5.3" 645 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 646 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 647 | dependencies: 648 | safe-buffer "5.1.2" 649 | 650 | content-type@~1.0.4: 651 | version "1.0.4" 652 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 653 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 654 | 655 | cookie-signature@1.0.6: 656 | version "1.0.6" 657 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 658 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 659 | 660 | cookie@0.4.0: 661 | version "0.4.0" 662 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 663 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 664 | 665 | core-js@^3.0.1: 666 | version "3.8.3" 667 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.3.tgz#c21906e1f14f3689f93abcc6e26883550dd92dd0" 668 | integrity sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q== 669 | 670 | cors@^2.8.4: 671 | version "2.8.5" 672 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 673 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 674 | dependencies: 675 | object-assign "^4" 676 | vary "^1" 677 | 678 | create-require@^1.1.0: 679 | version "1.1.1" 680 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 681 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 682 | 683 | cssfilter@0.0.10: 684 | version "0.0.10" 685 | resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" 686 | integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4= 687 | 688 | currently-unhandled@^0.4.1: 689 | version "0.4.1" 690 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 691 | integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= 692 | dependencies: 693 | array-find-index "^1.0.1" 694 | 695 | dateformat@~1.0.4-1.2.3: 696 | version "1.0.12" 697 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" 698 | integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= 699 | dependencies: 700 | get-stdin "^4.0.1" 701 | meow "^3.3.0" 702 | 703 | debug@2.6.9: 704 | version "2.6.9" 705 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 706 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 707 | dependencies: 708 | ms "2.0.0" 709 | 710 | decamelize@^1.1.2: 711 | version "1.2.0" 712 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 713 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 714 | 715 | define-properties@^1.1.3: 716 | version "1.1.3" 717 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 718 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 719 | dependencies: 720 | object-keys "^1.0.12" 721 | 722 | delayed-stream@~1.0.0: 723 | version "1.0.0" 724 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 725 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 726 | 727 | depd@~1.1.2: 728 | version "1.1.2" 729 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 730 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 731 | 732 | deprecated-decorator@^0.1.6: 733 | version "0.1.6" 734 | resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" 735 | integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= 736 | 737 | destroy@~1.0.4: 738 | version "1.0.4" 739 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 740 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 741 | 742 | dicer@0.3.0: 743 | version "0.3.0" 744 | resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" 745 | integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== 746 | dependencies: 747 | streamsearch "0.1.2" 748 | 749 | diff@^4.0.1: 750 | version "4.0.2" 751 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 752 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 753 | 754 | dynamic-dedupe@^0.3.0: 755 | version "0.3.0" 756 | resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" 757 | integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= 758 | dependencies: 759 | xtend "^4.0.0" 760 | 761 | ee-first@1.1.1: 762 | version "1.1.1" 763 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 764 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 765 | 766 | encodeurl@~1.0.2: 767 | version "1.0.2" 768 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 769 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 770 | 771 | error-ex@^1.2.0: 772 | version "1.3.2" 773 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 774 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 775 | dependencies: 776 | is-arrayish "^0.2.1" 777 | 778 | es-abstract@^1.18.0-next.1: 779 | version "1.18.0-next.2" 780 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" 781 | integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== 782 | dependencies: 783 | call-bind "^1.0.2" 784 | es-to-primitive "^1.2.1" 785 | function-bind "^1.1.1" 786 | get-intrinsic "^1.0.2" 787 | has "^1.0.3" 788 | has-symbols "^1.0.1" 789 | is-callable "^1.2.2" 790 | is-negative-zero "^2.0.1" 791 | is-regex "^1.1.1" 792 | object-inspect "^1.9.0" 793 | object-keys "^1.1.1" 794 | object.assign "^4.1.2" 795 | string.prototype.trimend "^1.0.3" 796 | string.prototype.trimstart "^1.0.3" 797 | 798 | es-to-primitive@^1.2.1: 799 | version "1.2.1" 800 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 801 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 802 | dependencies: 803 | is-callable "^1.1.4" 804 | is-date-object "^1.0.1" 805 | is-symbol "^1.0.2" 806 | 807 | escape-html@~1.0.3: 808 | version "1.0.3" 809 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 810 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 811 | 812 | etag@~1.8.1: 813 | version "1.8.1" 814 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 815 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 816 | 817 | eventemitter3@^3.1.0: 818 | version "3.1.2" 819 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" 820 | integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== 821 | 822 | express@^4.0.0, express@^4.17.1: 823 | version "4.17.1" 824 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 825 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 826 | dependencies: 827 | accepts "~1.3.7" 828 | array-flatten "1.1.1" 829 | body-parser "1.19.0" 830 | content-disposition "0.5.3" 831 | content-type "~1.0.4" 832 | cookie "0.4.0" 833 | cookie-signature "1.0.6" 834 | debug "2.6.9" 835 | depd "~1.1.2" 836 | encodeurl "~1.0.2" 837 | escape-html "~1.0.3" 838 | etag "~1.8.1" 839 | finalhandler "~1.1.2" 840 | fresh "0.5.2" 841 | merge-descriptors "1.0.1" 842 | methods "~1.1.2" 843 | on-finished "~2.3.0" 844 | parseurl "~1.3.3" 845 | path-to-regexp "0.1.7" 846 | proxy-addr "~2.0.5" 847 | qs "6.7.0" 848 | range-parser "~1.2.1" 849 | safe-buffer "5.1.2" 850 | send "0.17.1" 851 | serve-static "1.14.1" 852 | setprototypeof "1.1.1" 853 | statuses "~1.5.0" 854 | type-is "~1.6.18" 855 | utils-merge "1.0.1" 856 | vary "~1.1.2" 857 | 858 | fast-json-stable-stringify@^2.0.0: 859 | version "2.1.0" 860 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 861 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 862 | 863 | fill-range@^7.0.1: 864 | version "7.0.1" 865 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 866 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 867 | dependencies: 868 | to-regex-range "^5.0.1" 869 | 870 | finalhandler@~1.1.2: 871 | version "1.1.2" 872 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 873 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 874 | dependencies: 875 | debug "2.6.9" 876 | encodeurl "~1.0.2" 877 | escape-html "~1.0.3" 878 | on-finished "~2.3.0" 879 | parseurl "~1.3.3" 880 | statuses "~1.5.0" 881 | unpipe "~1.0.0" 882 | 883 | find-up@^1.0.0: 884 | version "1.1.2" 885 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 886 | integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= 887 | dependencies: 888 | path-exists "^2.0.0" 889 | pinkie-promise "^2.0.0" 890 | 891 | for-each@^0.3.3: 892 | version "0.3.3" 893 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" 894 | integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== 895 | dependencies: 896 | is-callable "^1.1.3" 897 | 898 | form-data@^3.0.0: 899 | version "3.0.0" 900 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" 901 | integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== 902 | dependencies: 903 | asynckit "^0.4.0" 904 | combined-stream "^1.0.8" 905 | mime-types "^2.1.12" 906 | 907 | forwarded@~0.1.2: 908 | version "0.1.2" 909 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 910 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 911 | 912 | fresh@0.5.2: 913 | version "0.5.2" 914 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 915 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 916 | 917 | fs-capacitor@^2.0.4: 918 | version "2.0.4" 919 | resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-2.0.4.tgz#5a22e72d40ae5078b4fe64fe4d08c0d3fc88ad3c" 920 | integrity sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA== 921 | 922 | fs.realpath@^1.0.0: 923 | version "1.0.0" 924 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 925 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 926 | 927 | fsevents@~2.3.1: 928 | version "2.3.1" 929 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f" 930 | integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw== 931 | 932 | function-bind@^1.1.1: 933 | version "1.1.1" 934 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 935 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 936 | 937 | get-intrinsic@^1.0.2: 938 | version "1.0.2" 939 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" 940 | integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== 941 | dependencies: 942 | function-bind "^1.1.1" 943 | has "^1.0.3" 944 | has-symbols "^1.0.1" 945 | 946 | get-stdin@^4.0.1: 947 | version "4.0.1" 948 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 949 | integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= 950 | 951 | glob-parent@~5.1.0: 952 | version "5.1.1" 953 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 954 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 955 | dependencies: 956 | is-glob "^4.0.1" 957 | 958 | glob@^7.1.3: 959 | version "7.1.6" 960 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 961 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 962 | dependencies: 963 | fs.realpath "^1.0.0" 964 | inflight "^1.0.4" 965 | inherits "2" 966 | minimatch "^3.0.4" 967 | once "^1.3.0" 968 | path-is-absolute "^1.0.0" 969 | 970 | graceful-fs@^4.1.2: 971 | version "4.2.4" 972 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 973 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 974 | 975 | graphql-extensions@^0.12.8: 976 | version "0.12.8" 977 | resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.12.8.tgz#9cdc2c43d8fe5e0f6c3177a004ac011da2a8aa0f" 978 | integrity sha512-xjsSaB6yKt9jarFNNdivl2VOx52WySYhxPgf8Y16g6GKZyAzBoIFiwyGw5PJDlOSUa6cpmzn6o7z8fVMbSAbkg== 979 | dependencies: 980 | "@apollographql/apollo-tools" "^0.4.3" 981 | apollo-server-env "^3.0.0" 982 | apollo-server-types "^0.6.3" 983 | 984 | graphql-subscriptions@^1.0.0: 985 | version "1.1.0" 986 | resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz#5f2fa4233eda44cf7570526adfcf3c16937aef11" 987 | integrity sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA== 988 | dependencies: 989 | iterall "^1.2.1" 990 | 991 | graphql-tag@^2.11.0: 992 | version "2.11.0" 993 | resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.11.0.tgz#1deb53a01c46a7eb401d6cb59dec86fa1cccbffd" 994 | integrity sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA== 995 | 996 | graphql-tools@^4.0.0: 997 | version "4.0.8" 998 | resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.8.tgz#e7fb9f0d43408fb0878ba66b522ce871bafe9d30" 999 | integrity sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg== 1000 | dependencies: 1001 | apollo-link "^1.2.14" 1002 | apollo-utilities "^1.0.1" 1003 | deprecated-decorator "^0.1.6" 1004 | iterall "^1.1.3" 1005 | uuid "^3.1.0" 1006 | 1007 | graphql-upload@^8.0.2: 1008 | version "8.1.0" 1009 | resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-8.1.0.tgz#6d0ab662db5677a68bfb1f2c870ab2544c14939a" 1010 | integrity sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q== 1011 | dependencies: 1012 | busboy "^0.3.1" 1013 | fs-capacitor "^2.0.4" 1014 | http-errors "^1.7.3" 1015 | object-path "^0.11.4" 1016 | 1017 | graphql@^15.3.0: 1018 | version "15.4.0" 1019 | resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.4.0.tgz#e459dea1150da5a106486ba7276518b5295a4347" 1020 | integrity sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA== 1021 | 1022 | graphql@^15.5.3: 1023 | version "15.5.3" 1024 | resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.3.tgz#c72349017d5c9f5446a897fe6908b3186db1da00" 1025 | integrity sha512-sM+jXaO5KinTui6lbK/7b7H/Knj9BpjGxZ+Ki35v7YbUJxxdBCUqNM0h3CRVU1ZF9t5lNiBzvBCSYPvIwxPOQA== 1026 | 1027 | has-symbols@^1.0.1: 1028 | version "1.0.1" 1029 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 1030 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 1031 | 1032 | has@^1.0.3: 1033 | version "1.0.3" 1034 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1035 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1036 | dependencies: 1037 | function-bind "^1.1.1" 1038 | 1039 | hosted-git-info@^2.1.4: 1040 | version "2.8.8" 1041 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" 1042 | integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== 1043 | 1044 | http-errors@1.7.2: 1045 | version "1.7.2" 1046 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 1047 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 1048 | dependencies: 1049 | depd "~1.1.2" 1050 | inherits "2.0.3" 1051 | setprototypeof "1.1.1" 1052 | statuses ">= 1.5.0 < 2" 1053 | toidentifier "1.0.0" 1054 | 1055 | http-errors@^1.7.3: 1056 | version "1.8.0" 1057 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" 1058 | integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== 1059 | dependencies: 1060 | depd "~1.1.2" 1061 | inherits "2.0.4" 1062 | setprototypeof "1.2.0" 1063 | statuses ">= 1.5.0 < 2" 1064 | toidentifier "1.0.0" 1065 | 1066 | http-errors@~1.7.2: 1067 | version "1.7.3" 1068 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 1069 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 1070 | dependencies: 1071 | depd "~1.1.2" 1072 | inherits "2.0.4" 1073 | setprototypeof "1.1.1" 1074 | statuses ">= 1.5.0 < 2" 1075 | toidentifier "1.0.0" 1076 | 1077 | iconv-lite@0.4.24: 1078 | version "0.4.24" 1079 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1080 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1081 | dependencies: 1082 | safer-buffer ">= 2.1.2 < 3" 1083 | 1084 | indent-string@^2.1.0: 1085 | version "2.1.0" 1086 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 1087 | integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= 1088 | dependencies: 1089 | repeating "^2.0.0" 1090 | 1091 | inflight@^1.0.4: 1092 | version "1.0.6" 1093 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1094 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1095 | dependencies: 1096 | once "^1.3.0" 1097 | wrappy "1" 1098 | 1099 | inherits@2, inherits@2.0.4, inherits@^2.0.1: 1100 | version "2.0.4" 1101 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1102 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1103 | 1104 | inherits@2.0.3: 1105 | version "2.0.3" 1106 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1107 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1108 | 1109 | ipaddr.js@1.9.1: 1110 | version "1.9.1" 1111 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 1112 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 1113 | 1114 | is-arrayish@^0.2.1: 1115 | version "0.2.1" 1116 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1117 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 1118 | 1119 | is-binary-path@~2.1.0: 1120 | version "2.1.0" 1121 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1122 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1123 | dependencies: 1124 | binary-extensions "^2.0.0" 1125 | 1126 | is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.2: 1127 | version "1.2.2" 1128 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" 1129 | integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== 1130 | 1131 | is-core-module@^2.1.0: 1132 | version "2.2.0" 1133 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" 1134 | integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== 1135 | dependencies: 1136 | has "^1.0.3" 1137 | 1138 | is-date-object@^1.0.1: 1139 | version "1.0.2" 1140 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 1141 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 1142 | 1143 | is-extglob@^2.1.1: 1144 | version "2.1.1" 1145 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1146 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1147 | 1148 | is-finite@^1.0.0: 1149 | version "1.1.0" 1150 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" 1151 | integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== 1152 | 1153 | is-glob@^4.0.1, is-glob@~4.0.1: 1154 | version "4.0.1" 1155 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1156 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1157 | dependencies: 1158 | is-extglob "^2.1.1" 1159 | 1160 | is-negative-zero@^2.0.1: 1161 | version "2.0.1" 1162 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" 1163 | integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== 1164 | 1165 | is-number@^7.0.0: 1166 | version "7.0.0" 1167 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1168 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1169 | 1170 | is-regex@^1.1.1: 1171 | version "1.1.1" 1172 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" 1173 | integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== 1174 | dependencies: 1175 | has-symbols "^1.0.1" 1176 | 1177 | is-symbol@^1.0.2: 1178 | version "1.0.3" 1179 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 1180 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 1181 | dependencies: 1182 | has-symbols "^1.0.1" 1183 | 1184 | is-utf8@^0.2.0: 1185 | version "0.2.1" 1186 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1187 | integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= 1188 | 1189 | iterall@^1.1.3, iterall@^1.2.1, iterall@^1.3.0: 1190 | version "1.3.0" 1191 | resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" 1192 | integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== 1193 | 1194 | load-json-file@^1.0.0: 1195 | version "1.1.0" 1196 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1197 | integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= 1198 | dependencies: 1199 | graceful-fs "^4.1.2" 1200 | parse-json "^2.2.0" 1201 | pify "^2.0.0" 1202 | pinkie-promise "^2.0.0" 1203 | strip-bom "^2.0.0" 1204 | 1205 | lodash-es@^4.17.15: 1206 | version "4.17.21" 1207 | resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" 1208 | integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== 1209 | 1210 | lodash.sortby@^4.7.0: 1211 | version "4.7.0" 1212 | resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" 1213 | integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= 1214 | 1215 | lodash@^4.17.20: 1216 | version "4.17.20" 1217 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" 1218 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== 1219 | 1220 | loglevel@^1.6.7: 1221 | version "1.7.1" 1222 | resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" 1223 | integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== 1224 | 1225 | long@^4.0.0: 1226 | version "4.0.0" 1227 | resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" 1228 | integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== 1229 | 1230 | loud-rejection@^1.0.0: 1231 | version "1.6.0" 1232 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 1233 | integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= 1234 | dependencies: 1235 | currently-unhandled "^0.4.1" 1236 | signal-exit "^3.0.0" 1237 | 1238 | lru-cache@^6.0.0: 1239 | version "6.0.0" 1240 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1241 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1242 | dependencies: 1243 | yallist "^4.0.0" 1244 | 1245 | make-error@^1.1.1: 1246 | version "1.3.6" 1247 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1248 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1249 | 1250 | map-obj@^1.0.0, map-obj@^1.0.1: 1251 | version "1.0.1" 1252 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1253 | integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= 1254 | 1255 | media-typer@0.3.0: 1256 | version "0.3.0" 1257 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1258 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1259 | 1260 | meow@^3.3.0: 1261 | version "3.7.0" 1262 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 1263 | integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= 1264 | dependencies: 1265 | camelcase-keys "^2.0.0" 1266 | decamelize "^1.1.2" 1267 | loud-rejection "^1.0.0" 1268 | map-obj "^1.0.1" 1269 | minimist "^1.1.3" 1270 | normalize-package-data "^2.3.4" 1271 | object-assign "^4.0.1" 1272 | read-pkg-up "^1.0.1" 1273 | redent "^1.0.0" 1274 | trim-newlines "^1.0.0" 1275 | 1276 | merge-descriptors@1.0.1: 1277 | version "1.0.1" 1278 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1279 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 1280 | 1281 | methods@~1.1.2: 1282 | version "1.1.2" 1283 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1284 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1285 | 1286 | mime-db@1.45.0: 1287 | version "1.45.0" 1288 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" 1289 | integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== 1290 | 1291 | mime-types@^2.1.12, mime-types@~2.1.24: 1292 | version "2.1.28" 1293 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" 1294 | integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== 1295 | dependencies: 1296 | mime-db "1.45.0" 1297 | 1298 | mime@1.6.0: 1299 | version "1.6.0" 1300 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1301 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1302 | 1303 | minimatch@^3.0.4: 1304 | version "3.0.4" 1305 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1306 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1307 | dependencies: 1308 | brace-expansion "^1.1.7" 1309 | 1310 | minimist@^1.1.3, minimist@^1.2.5: 1311 | version "1.2.5" 1312 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1313 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1314 | 1315 | mkdirp@^1.0.4: 1316 | version "1.0.4" 1317 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 1318 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 1319 | 1320 | ms@2.0.0: 1321 | version "2.0.0" 1322 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1323 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1324 | 1325 | ms@2.1.1: 1326 | version "2.1.1" 1327 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1328 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1329 | 1330 | nanoclone@^0.2.1: 1331 | version "0.2.1" 1332 | resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4" 1333 | integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== 1334 | 1335 | negotiator@0.6.2: 1336 | version "0.6.2" 1337 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 1338 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 1339 | 1340 | nexus-validate@^1.0.0: 1341 | version "1.0.0" 1342 | resolved "https://registry.yarnpkg.com/nexus-validate/-/nexus-validate-1.0.0.tgz#2bb2291cecb7a3909b647b75fde1ab666ba39b95" 1343 | integrity sha512-wmshQH2etCIgZoIMCQeEXCrMPx+LknUhUFrVyfezJvnpO5c4MPBLlQQQQJ4VYn0cLRCckU+Pof290jVleVxSuw== 1344 | 1345 | nexus@^1.1.0: 1346 | version "1.1.0" 1347 | resolved "https://registry.yarnpkg.com/nexus/-/nexus-1.1.0.tgz#3d8fa05c29e7a61aa55f64ef5e0ba43dd76b3ed6" 1348 | integrity sha512-jUhbg22gKVY2YwZm726BrbfHaQ7Xzc0hNXklygDhuqaVxCuHCgFMhWa2svNWd1npe8kfeiu5nbwnz+UnhNXzCQ== 1349 | dependencies: 1350 | iterall "^1.3.0" 1351 | tslib "^2.0.3" 1352 | 1353 | node-fetch@^2.1.2, node-fetch@^2.2.0: 1354 | version "2.6.1" 1355 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 1356 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 1357 | 1358 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 1359 | version "2.5.0" 1360 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1361 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1362 | dependencies: 1363 | hosted-git-info "^2.1.4" 1364 | resolve "^1.10.0" 1365 | semver "2 || 3 || 4 || 5" 1366 | validate-npm-package-license "^3.0.1" 1367 | 1368 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1369 | version "3.0.0" 1370 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1371 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1372 | 1373 | object-assign@^4, object-assign@^4.0.1: 1374 | version "4.1.1" 1375 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1376 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1377 | 1378 | object-inspect@^1.9.0: 1379 | version "1.9.0" 1380 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" 1381 | integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== 1382 | 1383 | object-keys@^1.0.12, object-keys@^1.1.1: 1384 | version "1.1.1" 1385 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1386 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1387 | 1388 | object-path@^0.11.4: 1389 | version "0.11.5" 1390 | resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.5.tgz#d4e3cf19601a5140a55a16ad712019a9c50b577a" 1391 | integrity sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg== 1392 | 1393 | object.assign@^4.1.2: 1394 | version "4.1.2" 1395 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" 1396 | integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== 1397 | dependencies: 1398 | call-bind "^1.0.0" 1399 | define-properties "^1.1.3" 1400 | has-symbols "^1.0.1" 1401 | object-keys "^1.1.1" 1402 | 1403 | object.getownpropertydescriptors@^2.1.1: 1404 | version "2.1.1" 1405 | resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" 1406 | integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== 1407 | dependencies: 1408 | call-bind "^1.0.0" 1409 | define-properties "^1.1.3" 1410 | es-abstract "^1.18.0-next.1" 1411 | 1412 | on-finished@~2.3.0: 1413 | version "2.3.0" 1414 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1415 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1416 | dependencies: 1417 | ee-first "1.1.1" 1418 | 1419 | once@^1.3.0: 1420 | version "1.4.0" 1421 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1422 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1423 | dependencies: 1424 | wrappy "1" 1425 | 1426 | parse-json@^2.2.0: 1427 | version "2.2.0" 1428 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1429 | integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= 1430 | dependencies: 1431 | error-ex "^1.2.0" 1432 | 1433 | parseurl@^1.3.2, parseurl@~1.3.3: 1434 | version "1.3.3" 1435 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1436 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1437 | 1438 | path-exists@^2.0.0: 1439 | version "2.1.0" 1440 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1441 | integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= 1442 | dependencies: 1443 | pinkie-promise "^2.0.0" 1444 | 1445 | path-is-absolute@^1.0.0: 1446 | version "1.0.1" 1447 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1448 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1449 | 1450 | path-parse@^1.0.6: 1451 | version "1.0.6" 1452 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1453 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1454 | 1455 | path-to-regexp@0.1.7: 1456 | version "0.1.7" 1457 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1458 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 1459 | 1460 | path-type@^1.0.0: 1461 | version "1.1.0" 1462 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1463 | integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= 1464 | dependencies: 1465 | graceful-fs "^4.1.2" 1466 | pify "^2.0.0" 1467 | pinkie-promise "^2.0.0" 1468 | 1469 | picomatch@^2.0.4, picomatch@^2.2.1: 1470 | version "2.2.2" 1471 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1472 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1473 | 1474 | pify@^2.0.0: 1475 | version "2.3.0" 1476 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1477 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1478 | 1479 | pinkie-promise@^2.0.0: 1480 | version "2.0.1" 1481 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1482 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 1483 | dependencies: 1484 | pinkie "^2.0.0" 1485 | 1486 | pinkie@^2.0.0: 1487 | version "2.0.4" 1488 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1489 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 1490 | 1491 | property-expr@^2.0.4: 1492 | version "2.0.4" 1493 | resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.4.tgz#37b925478e58965031bb612ec5b3260f8241e910" 1494 | integrity sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg== 1495 | 1496 | proxy-addr@~2.0.5: 1497 | version "2.0.6" 1498 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 1499 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 1500 | dependencies: 1501 | forwarded "~0.1.2" 1502 | ipaddr.js "1.9.1" 1503 | 1504 | qs@6.7.0: 1505 | version "6.7.0" 1506 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 1507 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 1508 | 1509 | range-parser@~1.2.1: 1510 | version "1.2.1" 1511 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1512 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1513 | 1514 | raw-body@2.4.0: 1515 | version "2.4.0" 1516 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 1517 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 1518 | dependencies: 1519 | bytes "3.1.0" 1520 | http-errors "1.7.2" 1521 | iconv-lite "0.4.24" 1522 | unpipe "1.0.0" 1523 | 1524 | read-pkg-up@^1.0.1: 1525 | version "1.0.1" 1526 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1527 | integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= 1528 | dependencies: 1529 | find-up "^1.0.0" 1530 | read-pkg "^1.0.0" 1531 | 1532 | read-pkg@^1.0.0: 1533 | version "1.1.0" 1534 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1535 | integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= 1536 | dependencies: 1537 | load-json-file "^1.0.0" 1538 | normalize-package-data "^2.3.2" 1539 | path-type "^1.0.0" 1540 | 1541 | readdirp@~3.5.0: 1542 | version "3.5.0" 1543 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" 1544 | integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== 1545 | dependencies: 1546 | picomatch "^2.2.1" 1547 | 1548 | redent@^1.0.0: 1549 | version "1.0.0" 1550 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 1551 | integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= 1552 | dependencies: 1553 | indent-string "^2.1.0" 1554 | strip-indent "^1.0.1" 1555 | 1556 | regenerator-runtime@^0.13.4: 1557 | version "0.13.7" 1558 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" 1559 | integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== 1560 | 1561 | repeating@^2.0.0: 1562 | version "2.0.1" 1563 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1564 | integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= 1565 | dependencies: 1566 | is-finite "^1.0.0" 1567 | 1568 | resolve@^1.0.0, resolve@^1.10.0: 1569 | version "1.19.0" 1570 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" 1571 | integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== 1572 | dependencies: 1573 | is-core-module "^2.1.0" 1574 | path-parse "^1.0.6" 1575 | 1576 | retry@0.12.0: 1577 | version "0.12.0" 1578 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" 1579 | integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= 1580 | 1581 | rimraf@^2.6.1: 1582 | version "2.7.1" 1583 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 1584 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 1585 | dependencies: 1586 | glob "^7.1.3" 1587 | 1588 | safe-buffer@5.1.2: 1589 | version "5.1.2" 1590 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1591 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1592 | 1593 | safe-buffer@^5.0.1: 1594 | version "5.2.1" 1595 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1596 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1597 | 1598 | "safer-buffer@>= 2.1.2 < 3": 1599 | version "2.1.2" 1600 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1601 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1602 | 1603 | "semver@2 || 3 || 4 || 5": 1604 | version "5.7.1" 1605 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1606 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1607 | 1608 | send@0.17.1: 1609 | version "0.17.1" 1610 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 1611 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 1612 | dependencies: 1613 | debug "2.6.9" 1614 | depd "~1.1.2" 1615 | destroy "~1.0.4" 1616 | encodeurl "~1.0.2" 1617 | escape-html "~1.0.3" 1618 | etag "~1.8.1" 1619 | fresh "0.5.2" 1620 | http-errors "~1.7.2" 1621 | mime "1.6.0" 1622 | ms "2.1.1" 1623 | on-finished "~2.3.0" 1624 | range-parser "~1.2.1" 1625 | statuses "~1.5.0" 1626 | 1627 | serve-static@1.14.1: 1628 | version "1.14.1" 1629 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 1630 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 1631 | dependencies: 1632 | encodeurl "~1.0.2" 1633 | escape-html "~1.0.3" 1634 | parseurl "~1.3.3" 1635 | send "0.17.1" 1636 | 1637 | setprototypeof@1.1.1: 1638 | version "1.1.1" 1639 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 1640 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1641 | 1642 | setprototypeof@1.2.0: 1643 | version "1.2.0" 1644 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1645 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1646 | 1647 | sha.js@^2.4.11: 1648 | version "2.4.11" 1649 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 1650 | integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 1651 | dependencies: 1652 | inherits "^2.0.1" 1653 | safe-buffer "^5.0.1" 1654 | 1655 | signal-exit@^3.0.0: 1656 | version "3.0.3" 1657 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1658 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1659 | 1660 | source-map-support@^0.5.12, source-map-support@^0.5.17: 1661 | version "0.5.19" 1662 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 1663 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 1664 | dependencies: 1665 | buffer-from "^1.0.0" 1666 | source-map "^0.6.0" 1667 | 1668 | source-map@^0.6.0: 1669 | version "0.6.1" 1670 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1671 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1672 | 1673 | spdx-correct@^3.0.0: 1674 | version "3.1.1" 1675 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" 1676 | integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== 1677 | dependencies: 1678 | spdx-expression-parse "^3.0.0" 1679 | spdx-license-ids "^3.0.0" 1680 | 1681 | spdx-exceptions@^2.1.0: 1682 | version "2.3.0" 1683 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 1684 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 1685 | 1686 | spdx-expression-parse@^3.0.0: 1687 | version "3.0.1" 1688 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 1689 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== 1690 | dependencies: 1691 | spdx-exceptions "^2.1.0" 1692 | spdx-license-ids "^3.0.0" 1693 | 1694 | spdx-license-ids@^3.0.0: 1695 | version "3.0.7" 1696 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" 1697 | integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== 1698 | 1699 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 1700 | version "1.5.0" 1701 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1702 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1703 | 1704 | streamsearch@0.1.2: 1705 | version "0.1.2" 1706 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" 1707 | integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= 1708 | 1709 | string.prototype.trimend@^1.0.3: 1710 | version "1.0.3" 1711 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" 1712 | integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== 1713 | dependencies: 1714 | call-bind "^1.0.0" 1715 | define-properties "^1.1.3" 1716 | 1717 | string.prototype.trimstart@^1.0.3: 1718 | version "1.0.3" 1719 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" 1720 | integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== 1721 | dependencies: 1722 | call-bind "^1.0.0" 1723 | define-properties "^1.1.3" 1724 | 1725 | strip-bom@^2.0.0: 1726 | version "2.0.0" 1727 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1728 | integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= 1729 | dependencies: 1730 | is-utf8 "^0.2.0" 1731 | 1732 | strip-bom@^3.0.0: 1733 | version "3.0.0" 1734 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1735 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 1736 | 1737 | strip-indent@^1.0.1: 1738 | version "1.0.1" 1739 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 1740 | integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= 1741 | dependencies: 1742 | get-stdin "^4.0.1" 1743 | 1744 | strip-json-comments@^2.0.0: 1745 | version "2.0.1" 1746 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1747 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1748 | 1749 | subscriptions-transport-ws@^0.9.11, subscriptions-transport-ws@^0.9.16: 1750 | version "0.9.18" 1751 | resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.18.tgz#bcf02320c911fbadb054f7f928e51c6041a37b97" 1752 | integrity sha512-tztzcBTNoEbuErsVQpTN2xUNN/efAZXyCyL5m3x4t6SKrEiTL2N8SaKWBFWM4u56pL79ULif3zjyeq+oV+nOaA== 1753 | dependencies: 1754 | backo2 "^1.0.2" 1755 | eventemitter3 "^3.1.0" 1756 | iterall "^1.2.1" 1757 | symbol-observable "^1.0.4" 1758 | ws "^5.2.0" 1759 | 1760 | symbol-observable@^1.0.4: 1761 | version "1.2.0" 1762 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" 1763 | integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== 1764 | 1765 | to-regex-range@^5.0.1: 1766 | version "5.0.1" 1767 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1768 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1769 | dependencies: 1770 | is-number "^7.0.0" 1771 | 1772 | toidentifier@1.0.0: 1773 | version "1.0.0" 1774 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1775 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1776 | 1777 | toposort@^2.0.2: 1778 | version "2.0.2" 1779 | resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" 1780 | integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= 1781 | 1782 | tree-kill@^1.2.2: 1783 | version "1.2.2" 1784 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 1785 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 1786 | 1787 | trim-newlines@^1.0.0: 1788 | version "1.0.0" 1789 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 1790 | integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= 1791 | 1792 | ts-invariant@^0.4.0: 1793 | version "0.4.4" 1794 | resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" 1795 | integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== 1796 | dependencies: 1797 | tslib "^1.9.3" 1798 | 1799 | ts-node-dev@1.0.0: 1800 | version "1.0.0" 1801 | resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.0.0.tgz#24a2270d225c29ce269de2a31f88b1b259fc84cb" 1802 | integrity sha512-leA/3TgGtnVU77fGngBwVZztqyDRXirytR7dMtMWZS5b2hGpLl+VDnB0F/gf3A+HEPSzS/KwxgXFP7/LtgX4MQ== 1803 | dependencies: 1804 | chokidar "^3.4.0" 1805 | dateformat "~1.0.4-1.2.3" 1806 | dynamic-dedupe "^0.3.0" 1807 | minimist "^1.2.5" 1808 | mkdirp "^1.0.4" 1809 | resolve "^1.0.0" 1810 | rimraf "^2.6.1" 1811 | source-map-support "^0.5.12" 1812 | tree-kill "^1.2.2" 1813 | ts-node "^9.0.0" 1814 | tsconfig "^7.0.0" 1815 | 1816 | ts-node@^9.0.0, ts-node@^9.1.1: 1817 | version "9.1.1" 1818 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" 1819 | integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== 1820 | dependencies: 1821 | arg "^4.1.0" 1822 | create-require "^1.1.0" 1823 | diff "^4.0.1" 1824 | make-error "^1.1.1" 1825 | source-map-support "^0.5.17" 1826 | yn "3.1.1" 1827 | 1828 | tsconfig@^7.0.0: 1829 | version "7.0.0" 1830 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" 1831 | integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== 1832 | dependencies: 1833 | "@types/strip-bom" "^3.0.0" 1834 | "@types/strip-json-comments" "0.0.30" 1835 | strip-bom "^3.0.0" 1836 | strip-json-comments "^2.0.0" 1837 | 1838 | tslib@^1.10.0, tslib@^1.9.3: 1839 | version "1.14.1" 1840 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 1841 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1842 | 1843 | tslib@^2.0.3: 1844 | version "2.1.0" 1845 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" 1846 | integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== 1847 | 1848 | type-is@^1.6.16, type-is@~1.6.17, type-is@~1.6.18: 1849 | version "1.6.18" 1850 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1851 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1852 | dependencies: 1853 | media-typer "0.3.0" 1854 | mime-types "~2.1.24" 1855 | 1856 | typescript@^4.1.3: 1857 | version "4.1.3" 1858 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" 1859 | integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== 1860 | 1861 | unpipe@1.0.0, unpipe@~1.0.0: 1862 | version "1.0.0" 1863 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1864 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1865 | 1866 | util.promisify@^1.0.0: 1867 | version "1.1.1" 1868 | resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" 1869 | integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== 1870 | dependencies: 1871 | call-bind "^1.0.0" 1872 | define-properties "^1.1.3" 1873 | for-each "^0.3.3" 1874 | has-symbols "^1.0.1" 1875 | object.getownpropertydescriptors "^2.1.1" 1876 | 1877 | utils-merge@1.0.1: 1878 | version "1.0.1" 1879 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1880 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1881 | 1882 | uuid@^3.1.0: 1883 | version "3.4.0" 1884 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 1885 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 1886 | 1887 | uuid@^8.0.0: 1888 | version "8.3.2" 1889 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 1890 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 1891 | 1892 | validate-npm-package-license@^3.0.1: 1893 | version "3.0.4" 1894 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 1895 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 1896 | dependencies: 1897 | spdx-correct "^3.0.0" 1898 | spdx-expression-parse "^3.0.0" 1899 | 1900 | vary@^1, vary@~1.1.2: 1901 | version "1.1.2" 1902 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1903 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1904 | 1905 | wrappy@1: 1906 | version "1.0.2" 1907 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1908 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1909 | 1910 | ws@^5.2.0: 1911 | version "5.2.2" 1912 | resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" 1913 | integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== 1914 | dependencies: 1915 | async-limiter "~1.0.0" 1916 | 1917 | ws@^6.0.0: 1918 | version "6.2.1" 1919 | resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" 1920 | integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== 1921 | dependencies: 1922 | async-limiter "~1.0.0" 1923 | 1924 | xss@^1.0.6: 1925 | version "1.0.8" 1926 | resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.8.tgz#32feb87feb74b3dcd3d404b7a68ababf10700535" 1927 | integrity sha512-3MgPdaXV8rfQ/pNn16Eio6VXYPTkqwa0vc7GkiymmY/DqR1SE/7VPAAVZz1GJsJFrllMYO3RHfEaiUGjab6TNw== 1928 | dependencies: 1929 | commander "^2.20.3" 1930 | cssfilter "0.0.10" 1931 | 1932 | xtend@^4.0.0: 1933 | version "4.0.2" 1934 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 1935 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 1936 | 1937 | yallist@^4.0.0: 1938 | version "4.0.0" 1939 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1940 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1941 | 1942 | yn@3.1.1: 1943 | version "3.1.1" 1944 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1945 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1946 | 1947 | yup@^0.32.9: 1948 | version "0.32.9" 1949 | resolved "https://registry.yarnpkg.com/yup/-/yup-0.32.9.tgz#9367bec6b1b0e39211ecbca598702e106019d872" 1950 | integrity sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg== 1951 | dependencies: 1952 | "@babel/runtime" "^7.10.5" 1953 | "@types/lodash" "^4.14.165" 1954 | lodash "^4.17.20" 1955 | lodash-es "^4.17.15" 1956 | nanoclone "^0.2.1" 1957 | property-expr "^2.0.4" 1958 | toposort "^2.0.2" 1959 | 1960 | zen-observable-ts@^0.8.21: 1961 | version "0.8.21" 1962 | resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" 1963 | integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== 1964 | dependencies: 1965 | tslib "^1.9.3" 1966 | zen-observable "^0.8.0" 1967 | 1968 | zen-observable@^0.8.0: 1969 | version "0.8.15" 1970 | resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" 1971 | integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== 1972 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: 'ts-jest', 3 | testEnvironment: 'node', 4 | }; 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nexus-validate", 3 | "version": "1.0.0", 4 | "description": "Validation plugin for Nexus.", 5 | "repository": "https://github.com/filipstefansson/nexus-validate", 6 | "author": "Filip Stefansson ", 7 | "license": "MIT", 8 | "main": "dist/index.js", 9 | "files": [ 10 | "dist" 11 | ], 12 | "scripts": { 13 | "prepare": "install-peers", 14 | "build": "tsc", 15 | "test": "jest" 16 | }, 17 | "peerDependencies": { 18 | "graphql": "^16.x", 19 | "nexus": "^1.3.x", 20 | "yup": "^0.32.9" 21 | }, 22 | "devDependencies": { 23 | "@types/jest": "^26.0.20", 24 | "install-peers-cli": "^2.2.0", 25 | "jest": "^26.6.3", 26 | "ts-jest": "^26.4.4", 27 | "typescript": "^4.1.3" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/error.ts: -------------------------------------------------------------------------------- 1 | import { GetGen } from 'nexus/dist/core'; 2 | import { ValidationError } from 'yup'; 3 | 4 | export interface ValidatePluginErrorConfig { 5 | error: Error | ValidationError; 6 | args: any; 7 | ctx: GetGen<'context'>; 8 | } 9 | 10 | export class UserInputError extends Error { 11 | extensions: { 12 | invalidArgs: string[]; 13 | code: string; 14 | }; 15 | 16 | constructor( 17 | message: string, 18 | extensions: { 19 | invalidArgs: string[]; 20 | code?: string; 21 | } 22 | ) { 23 | super(message); 24 | this.extensions = { 25 | ...extensions, 26 | code: extensions.code || 'BAD_USER_INPUT', 27 | }; 28 | } 29 | } 30 | 31 | export const defaultFormatError = ({ 32 | error, 33 | }: ValidatePluginErrorConfig): Error => { 34 | if (error instanceof ValidationError) { 35 | return new UserInputError(error.message, { 36 | invalidArgs: error.path ? [error.path] : [], 37 | }); 38 | } 39 | 40 | return error; 41 | }; 42 | 43 | export { ValidationError }; 44 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { plugin } from 'nexus'; 2 | import { printedGenTyping, printedGenTypingImport } from 'nexus/dist/utils'; 3 | 4 | import { ValidatePluginErrorConfig, ValidationError } from './error'; 5 | import { resolver } from './resolver'; 6 | 7 | const ValidateResolverImport = printedGenTypingImport({ 8 | module: 'nexus-validate', 9 | bindings: ['ValidateResolver'], 10 | }); 11 | 12 | const fieldDefTypes = printedGenTyping({ 13 | optional: true, 14 | name: 'validate', 15 | description: 'Validate mutation arguments.', 16 | type: 'ValidateResolver', 17 | imports: [ValidateResolverImport], 18 | }); 19 | 20 | export interface ValidatePluginConfig { 21 | formatError?: (config: ValidatePluginErrorConfig) => Error; 22 | } 23 | 24 | export const validatePlugin = (validateConfig: ValidatePluginConfig = {}) => { 25 | return plugin({ 26 | name: 'NexusValidate', 27 | description: 'The validate plugin provides validation for arguments.', 28 | fieldDefTypes: fieldDefTypes, 29 | onCreateFieldResolver: resolver(validateConfig), 30 | }); 31 | }; 32 | 33 | export * from './resolver'; 34 | export * from './error'; 35 | export { ValidationError }; 36 | -------------------------------------------------------------------------------- /src/resolver.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ArgsValue, 3 | CreateFieldResolverInfo, 4 | GetGen, 5 | MaybePromise, 6 | MiddlewareFn, 7 | } from 'nexus/dist/core'; 8 | import { ValidationError } from 'yup'; 9 | 10 | import { ObjectShape, rules, ValidationRules } from './rules'; 11 | import { ValidatePluginConfig } from './index'; 12 | import { defaultFormatError } from './error'; 13 | 14 | export type ValidateResolver< 15 | TypeName extends string, 16 | FieldName extends string 17 | > = ( 18 | rules: ValidationRules, 19 | args: ArgsValue, 20 | ctx: GetGen<'context'> 21 | ) => MaybePromise; 22 | 23 | export const resolver = 24 | (validateConfig: ValidatePluginConfig = {}) => 25 | (config: CreateFieldResolverInfo): MiddlewareFn | undefined => { 26 | const { formatError = defaultFormatError } = validateConfig; 27 | 28 | const validate: ValidateResolver = 29 | config.fieldConfig.extensions?.nexus?.config.validate; 30 | 31 | // if the field doesn't have an validate field, 32 | // don't worry about wrapping the resolver 33 | if (validate == null) { 34 | return; 35 | } 36 | 37 | // if it does have this field, but it's not a function, 38 | // it's wrong - let's provide a warning 39 | if (typeof validate !== 'function') { 40 | console.error( 41 | '\x1b[33m%s\x1b[0m', 42 | `The validate property provided to [${ 43 | config.fieldConfig.name 44 | }] with type [${ 45 | config.fieldConfig.type 46 | }]. Should be a function, saw [${typeof validate}]` 47 | ); 48 | return; 49 | } 50 | 51 | const args = config?.fieldConfig?.args ?? {}; 52 | if (Object.keys(args).length === 0) { 53 | console.error( 54 | '\x1b[33m%s\x1b[0m', 55 | `[${config.parentTypeConfig.name}.${config.fieldConfig.name}] does not have any arguments, but a validate function was passed` 56 | ); 57 | } 58 | 59 | return async (root, rawArgs, ctx, info, next) => { 60 | try { 61 | const schemaBase = await validate(rules, rawArgs, ctx); 62 | // clone args so we can transform them when validating with yup 63 | let args = { ...rawArgs }; 64 | if (typeof schemaBase !== 'undefined') { 65 | const schema = rules.object().shape(schemaBase); 66 | // update args to the transformed ones by yup 67 | args = await schema.validate(args, { context: ctx }); 68 | } 69 | return next(root, args, ctx, info); 70 | } catch (_error) { 71 | const error = _error as Error | ValidationError; 72 | throw formatError({ error, args, ctx }); 73 | } 74 | }; 75 | }; 76 | -------------------------------------------------------------------------------- /src/rules.ts: -------------------------------------------------------------------------------- 1 | import { string, number, boolean, date, object, array } from 'yup'; 2 | import { ObjectShape } from 'yup/lib/object'; 3 | 4 | export const rules = { 5 | string, 6 | number, 7 | boolean, 8 | date, 9 | object, 10 | array, 11 | }; 12 | 13 | export type ValidationRules = typeof rules; 14 | export { ObjectShape }; 15 | -------------------------------------------------------------------------------- /tests/__snapshots__/validate-fn.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`validatePlugin warns if field are missing arguments 1`] = ` 4 | Array [ 5 | "%s", 6 | "[ShouldWarn.id] does not have any arguments, but a validate function was passed", 7 | ] 8 | `; 9 | 10 | exports[`validatePlugin warns if validate is not a function 1`] = ` 11 | Array [ 12 | "%s", 13 | "The validate property provided to [shouldWarn] with type [ShouldWarn!]. Should be a function, saw [object]", 14 | ] 15 | `; 16 | -------------------------------------------------------------------------------- /tests/validate-fn.test.ts: -------------------------------------------------------------------------------- 1 | import { graphql } from 'graphql'; 2 | import { makeSchema, objectType } from 'nexus'; 3 | import { floatArg, intArg, mutationField, stringArg } from 'nexus/dist/core'; 4 | import { UserInputError, validatePlugin } from '../src/index'; 5 | 6 | describe('validatePlugin', () => { 7 | const consoleErrorSpy = jest 8 | .spyOn(console, 'error') 9 | .mockImplementation(() => {}); 10 | 11 | afterEach(() => { 12 | jest.resetAllMocks(); 13 | }); 14 | 15 | const schemaTypes = [ 16 | objectType({ 17 | name: 'User', 18 | definition(t) { 19 | t.int('id'); 20 | }, 21 | }), 22 | mutationField('validate', { 23 | type: 'User', 24 | args: { 25 | email: stringArg(), 26 | id: intArg(), 27 | }, 28 | // @ts-ignore 29 | validate: ({ string }, args, ctx) => { 30 | if (args.id !== ctx.user.id) { 31 | throw new UserInputError('invalid id', { 32 | invalidArgs: ['id'], 33 | }); 34 | } 35 | return { 36 | email: string().email(), 37 | }; 38 | }, 39 | resolve: () => ({ id: 1 }), 40 | }), 41 | ]; 42 | const testSchema = makeSchema({ 43 | outputs: false, 44 | types: schemaTypes, 45 | nonNullDefaults: { 46 | output: true, 47 | }, 48 | plugins: [validatePlugin()], 49 | }); 50 | const mockCtx = { user: { id: 1 } }; 51 | const testOperation = ( 52 | mutation: string, 53 | schema = testSchema, 54 | fields?: string 55 | ) => { 56 | return graphql({ 57 | schema, 58 | source: ` 59 | mutation { 60 | ${mutation} { 61 | ${fields ? fields : 'id'} 62 | } 63 | } 64 | `, 65 | rootValue: {}, 66 | contextValue: mockCtx 67 | }); 68 | }; 69 | 70 | it('returns error of validation error', async () => { 71 | const { data, errors = [] } = await testOperation( 72 | 'validate(email: "bad@email", id: 1)' 73 | ); 74 | expect(data).toBeNull(); 75 | expect(errors.length).toEqual(1); 76 | expect(errors[0].message).toEqual('email must be a valid email'); 77 | expect(errors[0].extensions).toEqual({ 78 | code: 'BAD_USER_INPUT', 79 | invalidArgs: ['email'], 80 | }); 81 | }); 82 | 83 | it('can returns data if validation passed', async () => { 84 | const { data, errors = [] } = await testOperation( 85 | 'validate(email: "god@email.com", id: 1)' 86 | ); 87 | expect(errors).toEqual([]); 88 | expect(data?.validate).toEqual({ id: 1 }); 89 | }); 90 | 91 | it('can check args agains context', async () => { 92 | const { data, errors = [] } = await testOperation( 93 | 'validate(email: "good@email.com", id: 2)' 94 | ); 95 | expect(data).toBeNull(); 96 | expect(errors.length).toEqual(1); 97 | expect(errors[0].message).toEqual('invalid id'); 98 | expect(errors[0].extensions).toEqual({ 99 | code: 'BAD_USER_INPUT', 100 | invalidArgs: ['id'], 101 | }); 102 | }); 103 | 104 | it('warns if field are missing arguments', async () => { 105 | const schema = makeSchema({ 106 | outputs: false, 107 | nonNullDefaults: { 108 | output: true, 109 | }, 110 | plugins: [validatePlugin()], 111 | types: [ 112 | objectType({ 113 | name: 'ShouldWarn', 114 | definition(t) { 115 | t.int('id', { 116 | // @ts-ignore 117 | validate: () => {}, 118 | }); 119 | }, 120 | }), 121 | mutationField('shouldWarn', { 122 | type: 'ShouldWarn', 123 | // @ts-ignore 124 | resolve: () => ({ id: 1 }), 125 | }), 126 | ], 127 | }); 128 | const { data } = await testOperation('shouldWarn', schema); 129 | expect(data?.shouldWarn).toEqual({ id: 1 }); 130 | expect(consoleErrorSpy).toHaveBeenCalledTimes(1); 131 | expect(consoleErrorSpy.mock.calls[0]).toMatchSnapshot(); 132 | }); 133 | 134 | it('warns if validate is not a function', async () => { 135 | const schema = makeSchema({ 136 | outputs: false, 137 | nonNullDefaults: { 138 | output: true, 139 | }, 140 | plugins: [validatePlugin()], 141 | types: [ 142 | objectType({ 143 | name: 'ShouldWarn', 144 | definition(t) { 145 | t.int('id'); 146 | }, 147 | }), 148 | mutationField('shouldWarn', { 149 | type: 'ShouldWarn', 150 | // @ts-ignore 151 | validate: {}, 152 | resolve: () => ({ id: 1 }), 153 | }), 154 | ], 155 | }); 156 | const { data } = await testOperation('shouldWarn', schema); 157 | expect(data?.shouldWarn).toEqual({ id: 1 }); 158 | expect(consoleErrorSpy).toHaveBeenCalledTimes(1); 159 | expect(consoleErrorSpy.mock.calls[0]).toMatchSnapshot(); 160 | }); 161 | 162 | it('it transforms data if validation passed', async () => { 163 | const schema = makeSchema({ 164 | outputs: false, 165 | nonNullDefaults: { 166 | output: true, 167 | }, 168 | plugins: [validatePlugin()], 169 | types: [ 170 | objectType({ 171 | name: 'ShouldTransform', 172 | definition(t) { 173 | t.int('round'); 174 | t.int('truncate'); 175 | t.string('trim'); 176 | t.string('lowercase'); 177 | }, 178 | }), 179 | mutationField('shouldTransform', { 180 | type: 'ShouldTransform', 181 | args: { 182 | round: floatArg(), 183 | truncate: floatArg(), 184 | trim: stringArg(), 185 | lowercase: stringArg(), 186 | }, 187 | 188 | // @ts-ignore 189 | validate: ({ string, number }) => { 190 | return { 191 | round: number().round(), 192 | truncate: number().truncate(), 193 | trim: string().trim(), 194 | lowercase: string().lowercase(), 195 | }; 196 | }, 197 | resolve: (_, args) => args, 198 | }), 199 | ], 200 | }); 201 | 202 | const { data } = await testOperation( 203 | ` 204 | shouldTransform(round:5.9, trim: " trim me", lowercase: "LOWERCASE", truncate: 5.888) 205 | `, 206 | schema, 207 | ` 208 | round 209 | trim 210 | lowercase 211 | truncate 212 | ` 213 | ); 214 | expect(data?.shouldTransform).toEqual({ 215 | round: 6, 216 | trim: 'trim me', 217 | lowercase: 'lowercase', 218 | truncate: 5, 219 | }); 220 | }); 221 | 222 | it('can check args against context inside of yup schema', async () => { 223 | const schemaTypes = [ 224 | objectType({ 225 | name: 'User', 226 | definition(t) { 227 | t.int('id'); 228 | }, 229 | }), 230 | mutationField('validate', { 231 | type: 'User', 232 | args: { 233 | id: intArg() 234 | }, 235 | // @ts-ignore 236 | validate: ({ number }) => ({ 237 | id: number().test( 238 | 'is-allowed-id', 239 | 'given id is not allowed', 240 | (value: number, testContext: any) => { 241 | const graphQLContext = testContext.options.context; 242 | return graphQLContext.user.id === value; 243 | }, 244 | ), 245 | }), 246 | resolve: (_, args) => args, 247 | }) 248 | , 249 | ]; 250 | 251 | const testSchema = makeSchema({ 252 | outputs: false, 253 | types: schemaTypes, 254 | nonNullDefaults: { 255 | output: true, 256 | }, 257 | plugins: [validatePlugin()], 258 | }); 259 | 260 | const responseSuccess = await testOperation(`validate(id:1)`, testSchema) 261 | expect(responseSuccess.data).toEqual({ validate: { id: 1 } }) 262 | expect(responseSuccess.errors).not.toBeDefined() 263 | 264 | const responseError = await testOperation(`validate(id:2)`, testSchema) 265 | expect(responseError.data).toBeNull() 266 | expect(responseError.errors).toHaveLength(1) 267 | expect(responseError.errors![0].message).toEqual('given id is not allowed'); 268 | }) 269 | }); 270 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "declaration": true, 6 | "outDir": "./dist", 7 | "baseUrl": "src", 8 | "strict": true, 9 | "noUnusedLocals": true, 10 | "noUnusedParameters": true, 11 | "esModuleInterop": true, 12 | "skipLibCheck": true, 13 | "forceConsistentCasingInFileNames": true 14 | }, 15 | "exclude": ["examples", "dist", "tests"] 16 | } 17 | --------------------------------------------------------------------------------