Mirror: TypeScript LSP plugin that finds GraphQL documents in your code and provides diagnostics, auto-complete and hover-information.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Support global fragments (#109)

* try and facilitate global fragments

* omg it works

* autocomplete

* finish this up

* cleanup

* do changes

* add tests

* yeet

authored by

Jovi De Croock and committed by
GitHub
3f434d32 78889ec0

+3998 -164
+5
.changeset/perfect-news-talk.md
··· 1 + --- 2 + '@0no-co/graphqlsp': minor 3 + --- 4 + 5 + Support the GraphQL Code Generator client preset
+3
packages/example-external-generator/.vscode/settings.json
··· 1 + { 2 + "typescript.tsdk": "node_modules/typescript/lib" 3 + }
+14
packages/example-external-generator/codegen.ts
··· 1 + import { CodegenConfig } from '@graphql-codegen/cli'; 2 + 3 + const config: CodegenConfig = { 4 + schema: './schema.graphql', 5 + documents: ['src/**/*.tsx'], 6 + ignoreNoDocuments: true, // for better experience with the watcher 7 + generates: { 8 + './src/gql/': { 9 + preset: 'client', 10 + }, 11 + }, 12 + }; 13 + 14 + export default config;
+24
packages/example-external-generator/package.json
··· 1 + { 2 + "name": "example", 3 + "private": true, 4 + "version": "1.0.0", 5 + "description": "", 6 + "main": "index.js", 7 + "scripts": { 8 + "test": "echo \"Error: no test specified\" && exit 1" 9 + }, 10 + "author": "", 11 + "license": "ISC", 12 + "dependencies": { 13 + "@graphql-typed-document-node/core": "^3.2.0", 14 + "@urql/core": "^3.0.0", 15 + "graphql": "^16.8.1" 16 + }, 17 + "devDependencies": { 18 + "@0no-co/graphqlsp": "file:../graphqlsp", 19 + "@graphql-codegen/cli": "^5.0.0", 20 + "@graphql-codegen/client-preset": "^4.1.0", 21 + "ts-node": "^10.9.1", 22 + "typescript": "^5.0.4" 23 + } 24 + }
+94
packages/example-external-generator/schema.graphql
··· 1 + ### This file was generated by Nexus Schema 2 + ### Do not make changes to this file directly 3 + 4 + """ 5 + Move a Pokémon can perform with the associated damage and type. 6 + """ 7 + type Attack { 8 + damage: Int 9 + name: String 10 + type: PokemonType 11 + } 12 + 13 + type AttacksConnection { 14 + fast: [Attack] 15 + special: [Attack] 16 + } 17 + 18 + """ 19 + Requirement that prevents an evolution through regular means of levelling up. 20 + """ 21 + type EvolutionRequirement { 22 + amount: Int 23 + name: String 24 + } 25 + 26 + type Pokemon { 27 + attacks: AttacksConnection 28 + classification: String @deprecated(reason: "And this is the reason why") 29 + evolutionRequirements: [EvolutionRequirement] 30 + evolutions: [Pokemon] 31 + 32 + """ 33 + Likelihood of an attempt to catch a Pokémon to fail. 34 + """ 35 + fleeRate: Float 36 + height: PokemonDimension 37 + id: ID! 38 + 39 + """ 40 + Maximum combat power a Pokémon may achieve at max level. 41 + """ 42 + maxCP: Int 43 + 44 + """ 45 + Maximum health points a Pokémon may achieve at max level. 46 + """ 47 + maxHP: Int 48 + name: String! 49 + resistant: [PokemonType] 50 + types: [PokemonType] 51 + weaknesses: [PokemonType] 52 + weight: PokemonDimension 53 + } 54 + 55 + type PokemonDimension { 56 + maximum: String 57 + minimum: String 58 + } 59 + 60 + """ 61 + Elemental property associated with either a Pokémon or one of their moves. 62 + """ 63 + enum PokemonType { 64 + Bug 65 + Dark 66 + Dragon 67 + Electric 68 + Fairy 69 + Fighting 70 + Fire 71 + Flying 72 + Ghost 73 + Grass 74 + Ground 75 + Ice 76 + Normal 77 + Poison 78 + Psychic 79 + Rock 80 + Steel 81 + Water 82 + } 83 + 84 + type Query { 85 + """ 86 + Get a single Pokémon by its ID, a three character long identifier padded with zeroes 87 + """ 88 + pokemon(id: ID!): Pokemon 89 + 90 + """ 91 + List out all Pokémon, optionally in pages 92 + """ 93 + pokemons(limit: Int, skip: Int): [Pokemon] 94 + }
+37
packages/example-external-generator/src/Pokemon.tsx
··· 1 + import { TypedDocumentNode } from '@graphql-typed-document-node/core'; 2 + import { graphql } from './gql'; 3 + 4 + export const PokemonFields = graphql(` 5 + fragment pokemonFields on Pokemon { 6 + id 7 + name 8 + attacks { 9 + fast { 10 + damage 11 + name 12 + } 13 + } 14 + } 15 + `) 16 + 17 + export const WeakFields = graphql(` 18 + fragment weaknessFields on Pokemon { 19 + weaknesses 20 + } 21 + `) 22 + 23 + export const Pokemon = (data: any) => { 24 + const pokemon = useFragment(PokemonFields, data); 25 + return `hi ${pokemon.name}`; 26 + }; 27 + 28 + type X = { hello: string }; 29 + 30 + const x: X = { hello: '' }; 31 + 32 + export function useFragment<Type>( 33 + _fragment: TypedDocumentNode<Type>, 34 + data: any 35 + ): Type { 36 + return data; 37 + }
+85
packages/example-external-generator/src/gql/fragment-masking.ts
··· 1 + import { 2 + ResultOf, 3 + DocumentTypeDecoration, 4 + TypedDocumentNode, 5 + } from '@graphql-typed-document-node/core'; 6 + import { FragmentDefinitionNode } from 'graphql'; 7 + import { Incremental } from './graphql'; 8 + 9 + export type FragmentType< 10 + TDocumentType extends DocumentTypeDecoration<any, any> 11 + > = TDocumentType extends DocumentTypeDecoration<infer TType, any> 12 + ? [TType] extends [{ ' $fragmentName'?: infer TKey }] 13 + ? TKey extends string 14 + ? { ' $fragmentRefs'?: { [key in TKey]: TType } } 15 + : never 16 + : never 17 + : never; 18 + 19 + // return non-nullable if `fragmentType` is non-nullable 20 + export function useFragment<TType>( 21 + _documentNode: DocumentTypeDecoration<TType, any>, 22 + fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> 23 + ): TType; 24 + // return nullable if `fragmentType` is nullable 25 + export function useFragment<TType>( 26 + _documentNode: DocumentTypeDecoration<TType, any>, 27 + fragmentType: 28 + | FragmentType<DocumentTypeDecoration<TType, any>> 29 + | null 30 + | undefined 31 + ): TType | null | undefined; 32 + // return array of non-nullable if `fragmentType` is array of non-nullable 33 + export function useFragment<TType>( 34 + _documentNode: DocumentTypeDecoration<TType, any>, 35 + fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> 36 + ): ReadonlyArray<TType>; 37 + // return array of nullable if `fragmentType` is array of nullable 38 + export function useFragment<TType>( 39 + _documentNode: DocumentTypeDecoration<TType, any>, 40 + fragmentType: 41 + | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> 42 + | null 43 + | undefined 44 + ): ReadonlyArray<TType> | null | undefined; 45 + export function useFragment<TType>( 46 + _documentNode: DocumentTypeDecoration<TType, any>, 47 + fragmentType: 48 + | FragmentType<DocumentTypeDecoration<TType, any>> 49 + | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> 50 + | null 51 + | undefined 52 + ): TType | ReadonlyArray<TType> | null | undefined { 53 + return fragmentType as any; 54 + } 55 + 56 + export function makeFragmentData< 57 + F extends DocumentTypeDecoration<any, any>, 58 + FT extends ResultOf<F> 59 + >(data: FT, _fragment: F): FragmentType<F> { 60 + return data as FragmentType<F>; 61 + } 62 + export function isFragmentReady<TQuery, TFrag>( 63 + queryNode: DocumentTypeDecoration<TQuery, any>, 64 + fragmentNode: TypedDocumentNode<TFrag>, 65 + data: 66 + | FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> 67 + | null 68 + | undefined 69 + ): data is FragmentType<typeof fragmentNode> { 70 + const deferredFields = ( 71 + queryNode as { 72 + __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> }; 73 + } 74 + ).__meta__?.deferredFields; 75 + 76 + if (!deferredFields) return true; 77 + 78 + const fragDef = fragmentNode.definitions[0] as 79 + | FragmentDefinitionNode 80 + | undefined; 81 + const fragName = fragDef?.name?.value; 82 + 83 + const fields = (fragName && deferredFields[fragName]) || []; 84 + return fields.length > 0 && fields.every(field => data && field in data); 85 + }
+78
packages/example-external-generator/src/gql/gql.ts
··· 1 + /* eslint-disable */ 2 + import * as types from './graphql'; 3 + import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; 4 + 5 + /** 6 + * Map of all GraphQL operations in the project. 7 + * 8 + * This map has several performance disadvantages: 9 + * 1. It is not tree-shakeable, so it will include all operations in the project. 10 + * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle. 11 + * 3. It does not support dead code elimination, so it will add unused operations. 12 + * 13 + * Therefore it is highly recommended to use the babel or swc plugin for production. 14 + */ 15 + const documents = { 16 + '\n fragment pokemonFields on Pokemon {\n id\n name\n attacks {\n fast {\n damage\n name\n }\n }\n }\n': 17 + types.PokemonFieldsFragmentDoc, 18 + '\n fragment weaknessFields on Pokemon {\n weaknesses\n }\n': 19 + types.WeaknessFieldsFragmentDoc, 20 + '\n query Pok($limit: Int!) {\n pokemons(limit: $limit) {\n id\n name\n fleeRate\n classification\n ...pokemonFields\n ...weaknessFields\n __typename\n }\n }\n': 21 + types.PokDocument, 22 + '\n query Po($id: ID!) {\n pokemon(id: $id) {\n id\n fleeRate\n __typename\n }\n }\n': 23 + types.PoDocument, 24 + '\n query PokemonsAreAwesome {\n pokemons {\n id\n }\n }\n': 25 + types.PokemonsAreAwesomeDocument, 26 + }; 27 + 28 + /** 29 + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. 30 + * 31 + * 32 + * @example 33 + * ```ts 34 + * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`); 35 + * ``` 36 + * 37 + * The query argument is unknown! 38 + * Please regenerate the types. 39 + */ 40 + export function graphql(source: string): unknown; 41 + 42 + /** 43 + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. 44 + */ 45 + export function graphql( 46 + source: '\n fragment pokemonFields on Pokemon {\n id\n name\n attacks {\n fast {\n damage\n name\n }\n }\n }\n' 47 + ): (typeof documents)['\n fragment pokemonFields on Pokemon {\n id\n name\n attacks {\n fast {\n damage\n name\n }\n }\n }\n']; 48 + /** 49 + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. 50 + */ 51 + export function graphql( 52 + source: '\n fragment weaknessFields on Pokemon {\n weaknesses\n }\n' 53 + ): (typeof documents)['\n fragment weaknessFields on Pokemon {\n weaknesses\n }\n']; 54 + /** 55 + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. 56 + */ 57 + export function graphql( 58 + source: '\n query Pok($limit: Int!) {\n pokemons(limit: $limit) {\n id\n name\n fleeRate\n classification\n ...pokemonFields\n ...weaknessFields\n __typename\n }\n }\n' 59 + ): (typeof documents)['\n query Pok($limit: Int!) {\n pokemons(limit: $limit) {\n id\n name\n fleeRate\n classification\n ...pokemonFields\n ...weaknessFields\n __typename\n }\n }\n']; 60 + /** 61 + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. 62 + */ 63 + export function graphql( 64 + source: '\n query Po($id: ID!) {\n pokemon(id: $id) {\n id\n fleeRate\n __typename\n }\n }\n' 65 + ): (typeof documents)['\n query Po($id: ID!) {\n pokemon(id: $id) {\n id\n fleeRate\n __typename\n }\n }\n']; 66 + /** 67 + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. 68 + */ 69 + export function graphql( 70 + source: '\n query PokemonsAreAwesome {\n pokemons {\n id\n }\n }\n' 71 + ): (typeof documents)['\n query PokemonsAreAwesome {\n pokemons {\n id\n }\n }\n']; 72 + 73 + export function graphql(source: string) { 74 + return (documents as any)[source] ?? {}; 75 + } 76 + 77 + export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = 78 + TDocumentNode extends DocumentNode<infer TType, any> ? TType : never;
+433
packages/example-external-generator/src/gql/graphql.ts
··· 1 + /* eslint-disable */ 2 + import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; 3 + export type Maybe<T> = T | null; 4 + export type InputMaybe<T> = Maybe<T>; 5 + export type Exact<T extends { [key: string]: unknown }> = { 6 + [K in keyof T]: T[K]; 7 + }; 8 + export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { 9 + [SubKey in K]?: Maybe<T[SubKey]>; 10 + }; 11 + export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { 12 + [SubKey in K]: Maybe<T[SubKey]>; 13 + }; 14 + export type MakeEmpty< 15 + T extends { [key: string]: unknown }, 16 + K extends keyof T 17 + > = { [_ in K]?: never }; 18 + export type Incremental<T> = 19 + | T 20 + | { 21 + [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never; 22 + }; 23 + /** All built-in and custom scalars, mapped to their actual values */ 24 + export type Scalars = { 25 + ID: { input: string; output: string }; 26 + String: { input: string; output: string }; 27 + Boolean: { input: boolean; output: boolean }; 28 + Int: { input: number; output: number }; 29 + Float: { input: number; output: number }; 30 + }; 31 + 32 + /** Move a Pokémon can perform with the associated damage and type. */ 33 + export type Attack = { 34 + __typename?: 'Attack'; 35 + damage?: Maybe<Scalars['Int']['output']>; 36 + name?: Maybe<Scalars['String']['output']>; 37 + type?: Maybe<PokemonType>; 38 + }; 39 + 40 + export type AttacksConnection = { 41 + __typename?: 'AttacksConnection'; 42 + fast?: Maybe<Array<Maybe<Attack>>>; 43 + special?: Maybe<Array<Maybe<Attack>>>; 44 + }; 45 + 46 + /** Requirement that prevents an evolution through regular means of levelling up. */ 47 + export type EvolutionRequirement = { 48 + __typename?: 'EvolutionRequirement'; 49 + amount?: Maybe<Scalars['Int']['output']>; 50 + name?: Maybe<Scalars['String']['output']>; 51 + }; 52 + 53 + export type Pokemon = { 54 + __typename?: 'Pokemon'; 55 + attacks?: Maybe<AttacksConnection>; 56 + /** @deprecated And this is the reason why */ 57 + classification?: Maybe<Scalars['String']['output']>; 58 + evolutionRequirements?: Maybe<Array<Maybe<EvolutionRequirement>>>; 59 + evolutions?: Maybe<Array<Maybe<Pokemon>>>; 60 + /** Likelihood of an attempt to catch a Pokémon to fail. */ 61 + fleeRate?: Maybe<Scalars['Float']['output']>; 62 + height?: Maybe<PokemonDimension>; 63 + id: Scalars['ID']['output']; 64 + /** Maximum combat power a Pokémon may achieve at max level. */ 65 + maxCP?: Maybe<Scalars['Int']['output']>; 66 + /** Maximum health points a Pokémon may achieve at max level. */ 67 + maxHP?: Maybe<Scalars['Int']['output']>; 68 + name: Scalars['String']['output']; 69 + resistant?: Maybe<Array<Maybe<PokemonType>>>; 70 + types?: Maybe<Array<Maybe<PokemonType>>>; 71 + weaknesses?: Maybe<Array<Maybe<PokemonType>>>; 72 + weight?: Maybe<PokemonDimension>; 73 + }; 74 + 75 + export type PokemonDimension = { 76 + __typename?: 'PokemonDimension'; 77 + maximum?: Maybe<Scalars['String']['output']>; 78 + minimum?: Maybe<Scalars['String']['output']>; 79 + }; 80 + 81 + /** Elemental property associated with either a Pokémon or one of their moves. */ 82 + export enum PokemonType { 83 + Bug = 'Bug', 84 + Dark = 'Dark', 85 + Dragon = 'Dragon', 86 + Electric = 'Electric', 87 + Fairy = 'Fairy', 88 + Fighting = 'Fighting', 89 + Fire = 'Fire', 90 + Flying = 'Flying', 91 + Ghost = 'Ghost', 92 + Grass = 'Grass', 93 + Ground = 'Ground', 94 + Ice = 'Ice', 95 + Normal = 'Normal', 96 + Poison = 'Poison', 97 + Psychic = 'Psychic', 98 + Rock = 'Rock', 99 + Steel = 'Steel', 100 + Water = 'Water', 101 + } 102 + 103 + export type Query = { 104 + __typename?: 'Query'; 105 + /** Get a single Pokémon by its ID, a three character long identifier padded with zeroes */ 106 + pokemon?: Maybe<Pokemon>; 107 + /** List out all Pokémon, optionally in pages */ 108 + pokemons?: Maybe<Array<Maybe<Pokemon>>>; 109 + }; 110 + 111 + export type QueryPokemonArgs = { 112 + id: Scalars['ID']['input']; 113 + }; 114 + 115 + export type QueryPokemonsArgs = { 116 + limit?: InputMaybe<Scalars['Int']['input']>; 117 + skip?: InputMaybe<Scalars['Int']['input']>; 118 + }; 119 + 120 + export type PokemonFieldsFragment = { 121 + __typename?: 'Pokemon'; 122 + id: string; 123 + name: string; 124 + attacks?: { 125 + __typename?: 'AttacksConnection'; 126 + fast?: Array<{ 127 + __typename?: 'Attack'; 128 + damage?: number | null; 129 + name?: string | null; 130 + } | null> | null; 131 + } | null; 132 + } & { ' $fragmentName'?: 'PokemonFieldsFragment' }; 133 + 134 + export type WeaknessFieldsFragment = { 135 + __typename?: 'Pokemon'; 136 + weaknesses?: Array<PokemonType | null> | null; 137 + } & { ' $fragmentName'?: 'WeaknessFieldsFragment' }; 138 + 139 + export type PokQueryVariables = Exact<{ 140 + limit: Scalars['Int']['input']; 141 + }>; 142 + 143 + export type PokQuery = { 144 + __typename?: 'Query'; 145 + pokemons?: Array< 146 + | ({ 147 + __typename: 'Pokemon'; 148 + id: string; 149 + name: string; 150 + fleeRate?: number | null; 151 + classification?: string | null; 152 + } & { 153 + ' $fragmentRefs'?: { 154 + PokemonFieldsFragment: PokemonFieldsFragment; 155 + WeaknessFieldsFragment: WeaknessFieldsFragment; 156 + }; 157 + }) 158 + | null 159 + > | null; 160 + }; 161 + 162 + export type PoQueryVariables = Exact<{ 163 + id: Scalars['ID']['input']; 164 + }>; 165 + 166 + export type PoQuery = { 167 + __typename?: 'Query'; 168 + pokemon?: { 169 + __typename: 'Pokemon'; 170 + id: string; 171 + fleeRate?: number | null; 172 + } | null; 173 + }; 174 + 175 + export type PokemonsAreAwesomeQueryVariables = Exact<{ [key: string]: never }>; 176 + 177 + export type PokemonsAreAwesomeQuery = { 178 + __typename?: 'Query'; 179 + pokemons?: Array<{ __typename?: 'Pokemon'; id: string } | null> | null; 180 + }; 181 + 182 + export const PokemonFieldsFragmentDoc = { 183 + kind: 'Document', 184 + definitions: [ 185 + { 186 + kind: 'FragmentDefinition', 187 + name: { kind: 'Name', value: 'pokemonFields' }, 188 + typeCondition: { 189 + kind: 'NamedType', 190 + name: { kind: 'Name', value: 'Pokemon' }, 191 + }, 192 + selectionSet: { 193 + kind: 'SelectionSet', 194 + selections: [ 195 + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, 196 + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, 197 + { 198 + kind: 'Field', 199 + name: { kind: 'Name', value: 'attacks' }, 200 + selectionSet: { 201 + kind: 'SelectionSet', 202 + selections: [ 203 + { 204 + kind: 'Field', 205 + name: { kind: 'Name', value: 'fast' }, 206 + selectionSet: { 207 + kind: 'SelectionSet', 208 + selections: [ 209 + { 210 + kind: 'Field', 211 + name: { kind: 'Name', value: 'damage' }, 212 + }, 213 + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, 214 + ], 215 + }, 216 + }, 217 + ], 218 + }, 219 + }, 220 + ], 221 + }, 222 + }, 223 + ], 224 + } as unknown as DocumentNode<PokemonFieldsFragment, unknown>; 225 + export const WeaknessFieldsFragmentDoc = { 226 + kind: 'Document', 227 + definitions: [ 228 + { 229 + kind: 'FragmentDefinition', 230 + name: { kind: 'Name', value: 'weaknessFields' }, 231 + typeCondition: { 232 + kind: 'NamedType', 233 + name: { kind: 'Name', value: 'Pokemon' }, 234 + }, 235 + selectionSet: { 236 + kind: 'SelectionSet', 237 + selections: [ 238 + { kind: 'Field', name: { kind: 'Name', value: 'weaknesses' } }, 239 + ], 240 + }, 241 + }, 242 + ], 243 + } as unknown as DocumentNode<WeaknessFieldsFragment, unknown>; 244 + export const PokDocument = { 245 + kind: 'Document', 246 + definitions: [ 247 + { 248 + kind: 'OperationDefinition', 249 + operation: 'query', 250 + name: { kind: 'Name', value: 'Pok' }, 251 + variableDefinitions: [ 252 + { 253 + kind: 'VariableDefinition', 254 + variable: { 255 + kind: 'Variable', 256 + name: { kind: 'Name', value: 'limit' }, 257 + }, 258 + type: { 259 + kind: 'NonNullType', 260 + type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } }, 261 + }, 262 + }, 263 + ], 264 + selectionSet: { 265 + kind: 'SelectionSet', 266 + selections: [ 267 + { 268 + kind: 'Field', 269 + name: { kind: 'Name', value: 'pokemons' }, 270 + arguments: [ 271 + { 272 + kind: 'Argument', 273 + name: { kind: 'Name', value: 'limit' }, 274 + value: { 275 + kind: 'Variable', 276 + name: { kind: 'Name', value: 'limit' }, 277 + }, 278 + }, 279 + ], 280 + selectionSet: { 281 + kind: 'SelectionSet', 282 + selections: [ 283 + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, 284 + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, 285 + { kind: 'Field', name: { kind: 'Name', value: 'fleeRate' } }, 286 + { 287 + kind: 'Field', 288 + name: { kind: 'Name', value: 'classification' }, 289 + }, 290 + { 291 + kind: 'FragmentSpread', 292 + name: { kind: 'Name', value: 'pokemonFields' }, 293 + }, 294 + { 295 + kind: 'FragmentSpread', 296 + name: { kind: 'Name', value: 'weaknessFields' }, 297 + }, 298 + { kind: 'Field', name: { kind: 'Name', value: '__typename' } }, 299 + ], 300 + }, 301 + }, 302 + ], 303 + }, 304 + }, 305 + { 306 + kind: 'FragmentDefinition', 307 + name: { kind: 'Name', value: 'pokemonFields' }, 308 + typeCondition: { 309 + kind: 'NamedType', 310 + name: { kind: 'Name', value: 'Pokemon' }, 311 + }, 312 + selectionSet: { 313 + kind: 'SelectionSet', 314 + selections: [ 315 + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, 316 + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, 317 + { 318 + kind: 'Field', 319 + name: { kind: 'Name', value: 'attacks' }, 320 + selectionSet: { 321 + kind: 'SelectionSet', 322 + selections: [ 323 + { 324 + kind: 'Field', 325 + name: { kind: 'Name', value: 'fast' }, 326 + selectionSet: { 327 + kind: 'SelectionSet', 328 + selections: [ 329 + { 330 + kind: 'Field', 331 + name: { kind: 'Name', value: 'damage' }, 332 + }, 333 + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, 334 + ], 335 + }, 336 + }, 337 + ], 338 + }, 339 + }, 340 + ], 341 + }, 342 + }, 343 + { 344 + kind: 'FragmentDefinition', 345 + name: { kind: 'Name', value: 'weaknessFields' }, 346 + typeCondition: { 347 + kind: 'NamedType', 348 + name: { kind: 'Name', value: 'Pokemon' }, 349 + }, 350 + selectionSet: { 351 + kind: 'SelectionSet', 352 + selections: [ 353 + { kind: 'Field', name: { kind: 'Name', value: 'weaknesses' } }, 354 + ], 355 + }, 356 + }, 357 + ], 358 + } as unknown as DocumentNode<PokQuery, PokQueryVariables>; 359 + export const PoDocument = { 360 + kind: 'Document', 361 + definitions: [ 362 + { 363 + kind: 'OperationDefinition', 364 + operation: 'query', 365 + name: { kind: 'Name', value: 'Po' }, 366 + variableDefinitions: [ 367 + { 368 + kind: 'VariableDefinition', 369 + variable: { kind: 'Variable', name: { kind: 'Name', value: 'id' } }, 370 + type: { 371 + kind: 'NonNullType', 372 + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, 373 + }, 374 + }, 375 + ], 376 + selectionSet: { 377 + kind: 'SelectionSet', 378 + selections: [ 379 + { 380 + kind: 'Field', 381 + name: { kind: 'Name', value: 'pokemon' }, 382 + arguments: [ 383 + { 384 + kind: 'Argument', 385 + name: { kind: 'Name', value: 'id' }, 386 + value: { 387 + kind: 'Variable', 388 + name: { kind: 'Name', value: 'id' }, 389 + }, 390 + }, 391 + ], 392 + selectionSet: { 393 + kind: 'SelectionSet', 394 + selections: [ 395 + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, 396 + { kind: 'Field', name: { kind: 'Name', value: 'fleeRate' } }, 397 + { kind: 'Field', name: { kind: 'Name', value: '__typename' } }, 398 + ], 399 + }, 400 + }, 401 + ], 402 + }, 403 + }, 404 + ], 405 + } as unknown as DocumentNode<PoQuery, PoQueryVariables>; 406 + export const PokemonsAreAwesomeDocument = { 407 + kind: 'Document', 408 + definitions: [ 409 + { 410 + kind: 'OperationDefinition', 411 + operation: 'query', 412 + name: { kind: 'Name', value: 'PokemonsAreAwesome' }, 413 + selectionSet: { 414 + kind: 'SelectionSet', 415 + selections: [ 416 + { 417 + kind: 'Field', 418 + name: { kind: 'Name', value: 'pokemons' }, 419 + selectionSet: { 420 + kind: 'SelectionSet', 421 + selections: [ 422 + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, 423 + ], 424 + }, 425 + }, 426 + ], 427 + }, 428 + }, 429 + ], 430 + } as unknown as DocumentNode< 431 + PokemonsAreAwesomeQuery, 432 + PokemonsAreAwesomeQueryVariables 433 + >;
+2
packages/example-external-generator/src/gql/index.ts
··· 1 + export * from './fragment-masking'; 2 + export * from './gql';
+45
packages/example-external-generator/src/index.tsx
··· 1 + import { createClient } from '@urql/core'; 2 + import { graphql } from './gql'; 3 + 4 + const x = graphql(` 5 + query Pok($limit: Int!) { 6 + pokemons(limit: $limit) { 7 + id 8 + name 9 + fleeRate 10 + classification 11 + ...pokemonFields 12 + ...weaknessFields 13 + __typename 14 + } 15 + } 16 + `) 17 + 18 + const client = createClient({ 19 + url: '', 20 + }); 21 + 22 + const PokemonQuery = graphql(` 23 + query Po($id: ID!) { 24 + pokemon(id: $id) { 25 + id 26 + fleeRate 27 + __typename 28 + } 29 + } 30 + `); 31 + 32 + client 33 + .query(PokemonQuery, { id: '' }) 34 + .toPromise() 35 + .then(result => { 36 + result.data?.pokemon; 37 + }); 38 + 39 + const myQuery = graphql(` 40 + query PokemonsAreAwesome { 41 + pokemons { 42 + id 43 + } 44 + } 45 + `);
+23
packages/example-external-generator/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "plugins": [ 4 + { 5 + "name": "@0no-co/graphqlsp", 6 + "schema": "./schema.graphql", 7 + "disableTypegen": true, 8 + "shouldCheckForColocatedFragments": false, 9 + "template": "graphql", 10 + "templateIsCallExpression": true 11 + } 12 + ], 13 + /* Language and Environment */ 14 + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, 15 + /* Modules */ 16 + "module": "commonjs" /* Specify what module code is generated. */, 17 + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, 18 + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, 19 + /* Type Checking */ 20 + "strict": true /* Enable all strict type-checking options. */, 21 + "skipLibCheck": true /* Skip type checking all .d.ts files. */ 22 + } 23 + }
+5 -80
packages/example/src/Pokemon.generated.ts
··· 1 - import * as Types from '../__generated__/baseGraphQLSP'; 1 + import * as Types from "../__generated__/baseGraphQLSP" 2 2 import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; 3 - export type PokemonFieldsFragment = { 4 - __typename: 'Pokemon'; 5 - id: string; 6 - name: string; 7 - attacks?: { 8 - __typename: 'AttacksConnection'; 9 - fast?: Array<{ 10 - __typename: 'Attack'; 11 - damage?: number | null; 12 - name?: string | null; 13 - } | null> | null; 14 - } | null; 15 - }; 3 + export type PokemonFieldsFragment = { __typename: 'Pokemon', id: string, name: string, attacks?: { __typename: 'AttacksConnection', fast?: Array<{ __typename: 'Attack', damage?: number | null, name?: string | null } | null> | null } | null }; 16 4 17 - export type WeaknessFieldsFragment = { 18 - __typename: 'Pokemon'; 19 - weaknesses?: Array<Types.PokemonType | null> | null; 20 - }; 5 + export type WeaknessFieldsFragment = { __typename: 'Pokemon', weaknesses?: Array<Types.PokemonType | null> | null }; 21 6 22 - export const PokemonFieldsFragmentDoc = { 23 - kind: 'Document', 24 - definitions: [ 25 - { 26 - kind: 'FragmentDefinition', 27 - name: { kind: 'Name', value: 'pokemonFields' }, 28 - typeCondition: { 29 - kind: 'NamedType', 30 - name: { kind: 'Name', value: 'Pokemon' }, 31 - }, 32 - selectionSet: { 33 - kind: 'SelectionSet', 34 - selections: [ 35 - { kind: 'Field', name: { kind: 'Name', value: 'id' } }, 36 - { kind: 'Field', name: { kind: 'Name', value: 'name' } }, 37 - { 38 - kind: 'Field', 39 - name: { kind: 'Name', value: 'attacks' }, 40 - selectionSet: { 41 - kind: 'SelectionSet', 42 - selections: [ 43 - { 44 - kind: 'Field', 45 - name: { kind: 'Name', value: 'fast' }, 46 - selectionSet: { 47 - kind: 'SelectionSet', 48 - selections: [ 49 - { 50 - kind: 'Field', 51 - name: { kind: 'Name', value: 'damage' }, 52 - }, 53 - { kind: 'Field', name: { kind: 'Name', value: 'name' } }, 54 - ], 55 - }, 56 - }, 57 - ], 58 - }, 59 - }, 60 - ], 61 - }, 62 - }, 63 - ], 64 - } as unknown as DocumentNode<PokemonFieldsFragment, unknown>; 65 - export const WeaknessFieldsFragmentDoc = { 66 - kind: 'Document', 67 - definitions: [ 68 - { 69 - kind: 'FragmentDefinition', 70 - name: { kind: 'Name', value: 'weaknessFields' }, 71 - typeCondition: { 72 - kind: 'NamedType', 73 - name: { kind: 'Name', value: 'Pokemon' }, 74 - }, 75 - selectionSet: { 76 - kind: 'SelectionSet', 77 - selections: [ 78 - { kind: 'Field', name: { kind: 'Name', value: 'weaknesses' } }, 79 - ], 80 - }, 81 - }, 82 - ], 83 - } as unknown as DocumentNode<WeaknessFieldsFragment, unknown>; 7 + export const PokemonFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"pokemonFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Pokemon"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"attacks"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"fast"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"damage"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]} as unknown as DocumentNode<PokemonFieldsFragment, unknown>; 8 + export const WeaknessFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"weaknessFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Pokemon"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"weaknesses"}}]}}]} as unknown as DocumentNode<WeaknessFieldsFragment, unknown>;
+22
packages/graphqlsp/README.md
··· 50 50 51 51 **Optional** 52 52 53 + - `template` the shape of your template, by default `gql` 54 + - `templateIsCallExpression` this tells our client that you are using `graphql('doc')` 53 55 - `disableTypegen` disables type-generation in general, this could be needed if offset bugs are introduced 54 56 - `scalars` allows you to pass an object of scalars that we'll feed into `graphql-code-generator` 55 57 - `extraTypes` allows you to specify imports or declare types to help with `scalar` definitions 56 58 - `shouldCheckForColocatedFragments` when turned on, this will scan your imports to find 57 59 unused fragments and provide a message notifying you about them 60 + 61 + ### GraphQL Code Generator client-preset 62 + 63 + For folks using the `client-preset` you can ues the following config 64 + 65 + ```json 66 + { 67 + "compilerOptions": { 68 + "plugins": [ 69 + { 70 + "name": "@0no-co/graphqlsp", 71 + "schema": "./schema.graphql", 72 + "disableTypegen": true, 73 + "templateIsCallExpression": true, 74 + "template": "graphql" 75 + } 76 + ] 77 + } 78 + } 79 + ``` 58 80 59 81 ## Fragment masking 60 82
+112 -15
packages/graphqlsp/src/ast/index.ts
··· 1 1 import ts from 'typescript/lib/tsserverlibrary'; 2 - import { 3 - isImportDeclaration, 4 - isNoSubstitutionTemplateLiteral, 5 - isTaggedTemplateExpression, 6 - isTemplateExpression, 7 - isTemplateSpan, 8 - isToken, 9 - } from 'typescript'; 10 2 import fs from 'fs'; 3 + import { FragmentDefinitionNode, parse } from 'graphql'; 11 4 12 5 export function isFileDirty(fileName: string, source: ts.SourceFile) { 13 6 const contents = fs.readFileSync(fileName, 'utf-8'); ··· 46 39 > = []; 47 40 function find(node: ts.Node) { 48 41 if ( 49 - isTaggedTemplateExpression(node) || 50 - isNoSubstitutionTemplateLiteral(node) 42 + ts.isTaggedTemplateExpression(node) || 43 + ts.isNoSubstitutionTemplateLiteral(node) 51 44 ) { 52 45 result.push(node); 53 46 return; ··· 59 52 return result; 60 53 } 61 54 55 + export function findAllCallExpressions( 56 + sourceFile: ts.SourceFile, 57 + template: string, 58 + info: ts.server.PluginCreateInfo 59 + ): { 60 + nodes: Array<ts.NoSubstitutionTemplateLiteral>; 61 + fragments: Array<FragmentDefinitionNode>; 62 + } { 63 + const result: Array<ts.NoSubstitutionTemplateLiteral> = []; 64 + let fragments: Array<FragmentDefinitionNode> = []; 65 + let hasTriedToFindFragments = false; 66 + function find(node: ts.Node) { 67 + if (ts.isCallExpression(node) && node.expression.getText() === template) { 68 + if (!hasTriedToFindFragments) { 69 + hasTriedToFindFragments = true; 70 + fragments = getAllFragments(sourceFile.fileName, node, info); 71 + } 72 + const [arg] = node.arguments; 73 + if (arg && ts.isNoSubstitutionTemplateLiteral(arg)) { 74 + result.push(arg); 75 + } 76 + return; 77 + } else { 78 + ts.forEachChild(node, find); 79 + } 80 + } 81 + find(sourceFile); 82 + return { nodes: result, fragments }; 83 + } 84 + 85 + export function getAllFragments( 86 + fileName: string, 87 + node: ts.CallExpression, 88 + info: ts.server.PluginCreateInfo 89 + ) { 90 + let fragments: Array<FragmentDefinitionNode> = []; 91 + 92 + const definitions = info.languageService.getDefinitionAtPosition( 93 + fileName, 94 + node.expression.getStart() 95 + ); 96 + if (!definitions) return fragments; 97 + 98 + const def = definitions[0]; 99 + const src = getSource(info, def.fileName); 100 + if (!src) return fragments; 101 + 102 + ts.forEachChild(src, node => { 103 + if ( 104 + ts.isVariableStatement(node) && 105 + node.declarationList && 106 + node.declarationList.declarations[0].name.getText() === 'documents' 107 + ) { 108 + const [declaration] = node.declarationList.declarations; 109 + if ( 110 + declaration.initializer && 111 + ts.isObjectLiteralExpression(declaration.initializer) 112 + ) { 113 + declaration.initializer.properties.forEach(property => { 114 + if ( 115 + ts.isPropertyAssignment(property) && 116 + ts.isStringLiteral(property.name) 117 + ) { 118 + try { 119 + const possibleFragment = JSON.parse( 120 + `${property.name.getText().replace(/'/g, '"')}` 121 + ); 122 + 123 + if ( 124 + possibleFragment.includes('fragment ') && 125 + possibleFragment.includes(' on ') 126 + ) { 127 + const parsed = parse(possibleFragment, { 128 + noLocation: true, 129 + }); 130 + parsed.definitions.forEach(definition => { 131 + if (definition.kind === 'FragmentDefinition') { 132 + fragments.push(definition); 133 + } 134 + }); 135 + } 136 + } catch (e: any) {} 137 + } 138 + }); 139 + } 140 + } 141 + }); 142 + 143 + return fragments; 144 + } 145 + 62 146 export function findAllImports( 63 147 sourceFile: ts.SourceFile 64 148 ): Array<ts.ImportDeclaration> { 65 - return sourceFile.statements.filter(isImportDeclaration); 149 + return sourceFile.statements.filter(ts.isImportDeclaration); 66 150 } 67 151 68 152 export function bubbleUpTemplate(node: ts.Node): ts.Node { 69 153 while ( 70 - isNoSubstitutionTemplateLiteral(node) || 71 - isToken(node) || 72 - isTemplateExpression(node) || 73 - isTemplateSpan(node) 154 + ts.isNoSubstitutionTemplateLiteral(node) || 155 + ts.isToken(node) || 156 + ts.isTemplateExpression(node) || 157 + ts.isTemplateSpan(node) 158 + ) { 159 + node = node.parent; 160 + } 161 + 162 + return node; 163 + } 164 + 165 + export function bubbleUpCallExpression(node: ts.Node): ts.Node { 166 + while ( 167 + ts.isNoSubstitutionTemplateLiteral(node) || 168 + ts.isToken(node) || 169 + ts.isTemplateExpression(node) || 170 + ts.isTemplateSpan(node) 74 171 ) { 75 172 node = node.parent; 76 173 }
+15 -17
packages/graphqlsp/src/ast/resolve.ts
··· 1 - import { 2 - isAsExpression, 3 - isIdentifier, 4 - isNoSubstitutionTemplateLiteral, 5 - isObjectLiteralExpression, 6 - isTaggedTemplateExpression, 7 - TaggedTemplateExpression, 8 - } from 'typescript'; 9 1 import { print } from 'graphql'; 10 2 import ts from 'typescript/lib/tsserverlibrary'; 11 3 import { findNode } from '.'; ··· 22 14 }; 23 15 24 16 export function resolveTemplate( 25 - node: TaggedTemplateExpression, 17 + node: ts.TaggedTemplateExpression | ts.NoSubstitutionTemplateLiteral, 26 18 filename: string, 27 19 info: ts.server.PluginCreateInfo 28 20 ): TemplateResult { 21 + if (ts.isNoSubstitutionTemplateLiteral(node)) { 22 + return { combinedText: node.getText().slice(1, -1), resolvedSpans: [] }; 23 + } 24 + 29 25 let templateText = node.template.getText().slice(1, -1); 30 26 if ( 31 - isNoSubstitutionTemplateLiteral(node.template) || 27 + ts.isNoSubstitutionTemplateLiteral(node.template) || 32 28 node.template.templateSpans.length === 0 33 29 ) { 34 30 return { combinedText: templateText, resolvedSpans: [] }; ··· 37 33 let addedCharacters = 0; 38 34 const resolvedSpans = node.template.templateSpans 39 35 .map(span => { 40 - if (isIdentifier(span.expression)) { 36 + if (ts.isIdentifier(span.expression)) { 41 37 const definitions = info.languageService.getDefinitionAtPosition( 42 38 filename, 43 39 span.expression.getStart() ··· 63 59 }; 64 60 if ( 65 61 parent.initializer && 66 - isTaggedTemplateExpression(parent.initializer) 62 + ts.isTaggedTemplateExpression(parent.initializer) 67 63 ) { 68 64 const text = resolveTemplate( 69 65 parent.initializer, ··· 88 84 return alteredSpan; 89 85 } else if ( 90 86 parent.initializer && 91 - isAsExpression(parent.initializer) && 92 - isTaggedTemplateExpression(parent.initializer.expression) 87 + ts.isAsExpression(parent.initializer) && 88 + ts.isTaggedTemplateExpression(parent.initializer.expression) 93 89 ) { 94 90 const text = resolveTemplate( 95 91 parent.initializer.expression, ··· 113 109 return alteredSpan; 114 110 } else if ( 115 111 parent.initializer && 116 - isAsExpression(parent.initializer) && 117 - isAsExpression(parent.initializer.expression) && 118 - isObjectLiteralExpression(parent.initializer.expression.expression) 112 + ts.isAsExpression(parent.initializer) && 113 + ts.isAsExpression(parent.initializer.expression) && 114 + ts.isObjectLiteralExpression( 115 + parent.initializer.expression.expression 116 + ) 119 117 ) { 120 118 const astObject = JSON.parse( 121 119 parent.initializer.expression.expression.getText()
+55 -3
packages/graphqlsp/src/autoComplete.ts
··· 2 2 import { 3 3 ScriptElementKind, 4 4 isIdentifier, 5 + isNoSubstitutionTemplateLiteral, 5 6 isTaggedTemplateExpression, 6 7 } from 'typescript'; 7 8 import { ··· 18 19 } from 'graphql-language-service'; 19 20 import { FragmentDefinitionNode, GraphQLSchema, Kind, parse } from 'graphql'; 20 21 21 - import { bubbleUpTemplate, findNode, getSource } from './ast'; 22 + import { 23 + bubbleUpCallExpression, 24 + bubbleUpTemplate, 25 + findNode, 26 + getAllFragments, 27 + getSource, 28 + } from './ast'; 22 29 import { Cursor } from './ast/cursor'; 23 30 import { resolveTemplate } from './ast/resolve'; 24 31 import { getToken } from './ast/token'; 25 32 import { getSuggestionsForFragmentSpread } from './graphql/getFragmentSpreadSuggestions'; 33 + import { Logger } from '.'; 26 34 27 35 export function getGraphQLCompletions( 28 36 filename: string, ··· 30 38 schema: { current: GraphQLSchema | null }, 31 39 info: ts.server.PluginCreateInfo 32 40 ): ts.WithMetadata<ts.CompletionInfo> | undefined { 41 + const logger: Logger = (msg: string) => 42 + info.project.projectService.logger.info(`[GraphQLSP] ${msg}`); 33 43 const tagTemplate = info.config.template || 'gql'; 44 + const isCallExpression = info.config.templateIsCallExpression ?? false; 34 45 35 46 const source = getSource(info, filename); 36 47 if (!source) return undefined; ··· 38 49 let node = findNode(source, cursorPosition); 39 50 if (!node) return undefined; 40 51 41 - node = bubbleUpTemplate(node); 52 + node = isCallExpression 53 + ? bubbleUpCallExpression(node) 54 + : bubbleUpTemplate(node); 42 55 43 - if (isTaggedTemplateExpression(node)) { 56 + if ( 57 + ts.isCallExpression(node) && 58 + isCallExpression && 59 + node.expression.getText() === tagTemplate && 60 + node.arguments.length > 0 && 61 + isNoSubstitutionTemplateLiteral(node.arguments[0]) 62 + ) { 63 + const foundToken = getToken(node.arguments[0], cursorPosition); 64 + if (!schema.current || !foundToken) return undefined; 65 + 66 + const queryText = node.arguments[0].getText(); 67 + const fragments = getAllFragments(filename, node, info); 68 + const cursor = new Cursor(foundToken.line, foundToken.start); 69 + const items = getAutocompleteSuggestions( 70 + schema.current, 71 + queryText, 72 + cursor, 73 + undefined, 74 + fragments 75 + ); 76 + 77 + return { 78 + isGlobalCompletion: false, 79 + isMemberCompletion: false, 80 + isNewIdentifierLocation: false, 81 + entries: items.map(suggestion => ({ 82 + ...suggestion, 83 + kind: ScriptElementKind.variableElement, 84 + name: suggestion.label, 85 + kindModifiers: 'declare', 86 + sortText: suggestion.sortText || '0', 87 + labelDetails: { 88 + detail: suggestion.type 89 + ? ' ' + suggestion.type?.toString() 90 + : undefined, 91 + description: suggestion.documentation, 92 + }, 93 + })), 94 + }; 95 + } else if (isTaggedTemplateExpression(node)) { 44 96 const { template, tag } = node; 45 97 46 98 if (!isIdentifier(tag) || tag.text !== tagTemplate) return undefined;
+60 -36
packages/graphqlsp/src/diagnostics.ts
··· 1 1 import ts from 'typescript/lib/tsserverlibrary'; 2 - import { 3 - ImportTypeNode, 4 - isAsExpression, 5 - isExpressionStatement, 6 - isImportTypeNode, 7 - isNamedImportBindings, 8 - isNamespaceImport, 9 - isNoSubstitutionTemplateLiteral, 10 - isTaggedTemplateExpression, 11 - isTemplateExpression, 12 - } from 'typescript'; 13 2 import { Diagnostic, getDiagnostics } from 'graphql-language-service'; 14 3 import { 15 4 FragmentDefinitionNode, ··· 22 11 import fnv1a from '@sindresorhus/fnv1a'; 23 12 24 13 import { 14 + findAllCallExpressions, 25 15 findAllImports, 26 16 findAllTaggedTemplateNodes, 27 17 getSource, ··· 29 19 } from './ast'; 30 20 import { resolveTemplate } from './ast/resolve'; 31 21 import { generateTypedDocumentNodes } from './graphql/generateTypes'; 22 + import { Logger } from '.'; 32 23 33 24 export const SEMANTIC_DIAGNOSTIC_CODE = 52001; 34 25 export const MISSING_OPERATION_NAME_CODE = 52002; ··· 52 43 schema: { current: GraphQLSchema | null; version: number }, 53 44 info: ts.server.PluginCreateInfo 54 45 ): ts.Diagnostic[] | undefined { 55 - const logger = (msg: string) => 46 + const logger: Logger = (msg: string) => 56 47 info.project.projectService.logger.info(`[GraphQLSP] ${msg}`); 57 - const disableTypegen = info.config.disableTypegen; 48 + const disableTypegen = info.config.disableTypegen ?? false; 58 49 const tagTemplate = info.config.template || 'gql'; 59 50 const scalars = info.config.scalars || {}; 60 51 const shouldCheckForColocatedFragments = 61 52 info.config.shouldCheckForColocatedFragments ?? false; 53 + const isCallExpression = info.config.templateIsCallExpression ?? false; 62 54 63 55 let source = getSource(info, filename); 64 56 if (!source) return undefined; 65 57 66 - const nodes = findAllTaggedTemplateNodes(source); 58 + let fragments: Array<FragmentDefinitionNode> = [], 59 + nodes: (ts.TaggedTemplateExpression | ts.NoSubstitutionTemplateLiteral)[]; 60 + if (isCallExpression) { 61 + const result = findAllCallExpressions(source, tagTemplate, info); 62 + fragments = result.fragments; 63 + nodes = result.nodes; 64 + } else { 65 + nodes = findAllTaggedTemplateNodes(source); 66 + } 67 67 68 68 const texts = nodes.map(node => { 69 - if (isNoSubstitutionTemplateLiteral(node) || isTemplateExpression(node)) { 70 - if (isTaggedTemplateExpression(node.parent)) { 69 + if ( 70 + (ts.isNoSubstitutionTemplateLiteral(node) || 71 + ts.isTemplateExpression(node)) && 72 + !isCallExpression 73 + ) { 74 + if (ts.isTaggedTemplateExpression(node.parent)) { 71 75 node = node.parent; 72 76 } else { 73 77 return undefined; ··· 86 90 .map(originalNode => { 87 91 let node = originalNode; 88 92 if ( 89 - isNoSubstitutionTemplateLiteral(node) || 90 - isTemplateExpression(node) 93 + !isCallExpression && 94 + (ts.isNoSubstitutionTemplateLiteral(node) || 95 + ts.isTemplateExpression(node)) 91 96 ) { 92 - if (isTaggedTemplateExpression(node.parent)) { 97 + if (ts.isTaggedTemplateExpression(node.parent)) { 93 98 node = node.parent; 94 99 } else { 95 100 return undefined; ··· 104 109 const lines = text.split('\n'); 105 110 106 111 let isExpression = false; 107 - if (isAsExpression(node.parent)) { 108 - if (isExpressionStatement(node.parent.parent)) { 109 - isExpression = true; 110 - } 111 - } else { 112 - if (isExpressionStatement(node.parent)) { 112 + if (ts.isAsExpression(node.parent)) { 113 + if (ts.isExpressionStatement(node.parent.parent)) { 113 114 isExpression = true; 114 115 } 116 + } else if (ts.isExpressionStatement(node.parent)) { 117 + isExpression = true; 115 118 } 116 119 // When we are dealing with a plain gql statement we have to add two these can be recognised 117 120 // by the fact that the parent is an expressionStatement 118 121 let startingPosition = 119 - node.pos + (tagTemplate.length + (isExpression ? 2 : 1)); 122 + node.pos + 123 + (isCallExpression ? 0 : tagTemplate.length + (isExpression ? 2 : 1)); 120 124 const endPosition = startingPosition + node.getText().length; 121 - const graphQLDiagnostics = getDiagnostics(text, schema.current) 125 + 126 + let docFragments = [...fragments]; 127 + if (isCallExpression) { 128 + const documentFragments = parse(text, { 129 + noLocation: true, 130 + }).definitions.filter(x => x.kind === Kind.FRAGMENT_DEFINITION); 131 + docFragments = docFragments.filter( 132 + x => 133 + !documentFragments.some( 134 + y => 135 + y.kind === Kind.FRAGMENT_DEFINITION && 136 + y.name.value === x.name.value 137 + ) 138 + ); 139 + } 140 + 141 + const graphQLDiagnostics = getDiagnostics( 142 + text, 143 + schema.current, 144 + undefined, 145 + undefined, 146 + docFragments 147 + ) 122 148 .map(x => { 123 149 const { start, end } = x.range; 124 150 ··· 232 258 233 259 if ( 234 260 imp.importClause.namedBindings && 235 - isNamespaceImport(imp.importClause.namedBindings) 261 + ts.isNamespaceImport(imp.importClause.namedBindings) 236 262 ) { 237 263 // TODO: we might need to warn here when the fragment is unused as a namespace import 238 264 return; 239 265 } else if ( 240 266 imp.importClause.namedBindings && 241 - isNamedImportBindings(imp.importClause.namedBindings) 267 + ts.isNamedImportBindings(imp.importClause.namedBindings) 242 268 ) { 243 269 imp.importClause.namedBindings.elements.forEach(el => { 244 270 importedNames.push(el.name.text); ··· 270 296 if (template) { 271 297 let node = template; 272 298 if ( 273 - isNoSubstitutionTemplateLiteral(node) || 274 - isTemplateExpression(node) 299 + ts.isNoSubstitutionTemplateLiteral(node) || 300 + ts.isTemplateExpression(node) 275 301 ) { 276 - if (isTaggedTemplateExpression(node.parent)) { 302 + if (ts.isTaggedTemplateExpression(node.parent)) { 277 303 node = node.parent; 278 304 } else { 279 305 return; ··· 302 328 .filter(Boolean); 303 329 304 330 if (missingImports.length) { 305 - // TODO: we could use getCodeFixesAtPosition 306 - // to build on this 307 331 tsDiagnostics.push({ 308 332 file: source, 309 333 length: imp.getText().length, ··· 392 416 // This checks whether one of the children is an import-type 393 417 // which is a short-circuit if there is no as 394 418 const typeImport = parentChildren.find(x => 395 - isImportTypeNode(x) 396 - ) as ImportTypeNode; 419 + ts.isImportTypeNode(x) 420 + ) as ts.ImportTypeNode; 397 421 398 422 if (typeImport && typeImport.getText().includes(exportName)) 399 423 return sourceText;
+2 -1
packages/graphqlsp/src/index.ts
··· 23 23 type Config = { 24 24 schema: SchemaOrigin | string; 25 25 template?: string; 26 + templateIsCallExpression?: boolean; 26 27 disableTypegen?: boolean; 27 28 extraTypes?: string; 28 29 scalars?: Record<string, unknown>; ··· 44 45 45 46 const scalars = config.scalars || {}; 46 47 const extraTypes = config.extraTypes || ''; 47 - const disableTypegen = config.disableTypegen || false; 48 + const disableTypegen = config.disableTypegen ?? false; 48 49 49 50 const proxy = createBasicDecorator(info); 50 51
+37 -8
packages/graphqlsp/src/quickInfo.ts
··· 1 1 import ts from 'typescript/lib/tsserverlibrary'; 2 - import { isIdentifier, isTaggedTemplateExpression } from 'typescript'; 3 2 import { getHoverInformation } from 'graphql-language-service'; 4 3 import { GraphQLSchema } from 'graphql'; 5 4 6 - import { bubbleUpTemplate, findNode, getSource } from './ast'; 5 + import { 6 + bubbleUpCallExpression, 7 + bubbleUpTemplate, 8 + findNode, 9 + getSource, 10 + } from './ast'; 7 11 import { resolveTemplate } from './ast/resolve'; 8 12 import { getToken } from './ast/token'; 9 13 import { Cursor } from './ast/cursor'; ··· 14 18 schema: { current: GraphQLSchema | null }, 15 19 info: ts.server.PluginCreateInfo 16 20 ): ts.QuickInfo | undefined { 17 - const logger = (msg: string) => 18 - info.project.projectService.logger.info(`[GraphQLSP] ${msg}`); 19 - 20 21 const tagTemplate = info.config.template || 'gql'; 22 + const isCallExpression = info.config.templateIsCallExpression ?? false; 21 23 22 24 const source = getSource(info, filename); 23 25 if (!source) return undefined; ··· 25 27 let node = findNode(source, cursorPosition); 26 28 if (!node) return undefined; 27 29 28 - node = bubbleUpTemplate(node); 30 + node = isCallExpression 31 + ? bubbleUpCallExpression(node) 32 + : bubbleUpTemplate(node); 33 + 34 + if ( 35 + ts.isCallExpression(node) && 36 + isCallExpression && 37 + node.expression.getText() === tagTemplate && 38 + node.arguments.length > 0 && 39 + ts.isNoSubstitutionTemplateLiteral(node.arguments[0]) 40 + ) { 41 + const foundToken = getToken(node.arguments[0], cursorPosition); 42 + if (!schema.current || !foundToken) return undefined; 43 + 44 + const queryText = node.arguments[0].getText(); 45 + const cursor = new Cursor(foundToken.line, foundToken.start); 46 + const hoverInfo = getHoverInformation(schema.current, queryText, cursor); 29 47 30 - if (isTaggedTemplateExpression(node)) { 48 + return { 49 + kind: ts.ScriptElementKind.string, 50 + textSpan: { 51 + start: cursorPosition, 52 + length: 1, 53 + }, 54 + kindModifiers: '', 55 + displayParts: Array.isArray(hoverInfo) 56 + ? hoverInfo.map(item => ({ kind: '', text: item as string })) 57 + : [{ kind: '', text: hoverInfo as string }], 58 + }; 59 + } else if (ts.isTaggedTemplateExpression(node)) { 31 60 const { template, tag } = node; 32 - if (!isIdentifier(tag) || tag.text !== tagTemplate) return undefined; 61 + if (!ts.isIdentifier(tag) || tag.text !== tagTemplate) return undefined; 33 62 34 63 const foundToken = getToken(template, cursorPosition); 35 64
+1601 -4
pnpm-lock.yaml
··· 64 64 specifier: ^5.0.0 65 65 version: 5.0.4 66 66 67 + packages/example-external-generator: 68 + dependencies: 69 + '@graphql-typed-document-node/core': 70 + specifier: ^3.2.0 71 + version: 3.2.0(graphql@16.8.1) 72 + '@urql/core': 73 + specifier: ^3.0.0 74 + version: 3.2.2(graphql@16.8.1) 75 + graphql: 76 + specifier: ^16.8.1 77 + version: 16.8.1 78 + devDependencies: 79 + '@0no-co/graphqlsp': 80 + specifier: file:../graphqlsp 81 + version: file:packages/graphqlsp(graphql@16.8.1) 82 + '@graphql-codegen/cli': 83 + specifier: ^5.0.0 84 + version: 5.0.0(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.0.4) 85 + '@graphql-codegen/client-preset': 86 + specifier: ^4.1.0 87 + version: 4.1.0(graphql@16.8.1) 88 + ts-node: 89 + specifier: ^10.9.1 90 + version: 10.9.1(@types/node@18.15.11)(typescript@5.0.4) 91 + typescript: 92 + specifier: ^5.0.4 93 + version: 5.0.4 94 + 67 95 packages/graphqlsp: 68 96 dependencies: 69 97 '@graphql-codegen/add': ··· 117 145 version: link:../../../packages/graphqlsp 118 146 '@urql/core': 119 147 specifier: ^4.0.4 120 - version: 4.0.4 148 + version: 4.0.4(graphql@16.8.1) 149 + devDependencies: 150 + typescript: 151 + specifier: ^5.0.4 152 + version: 5.0.4 153 + 154 + test/e2e/fixture-project-client-preset: 155 + dependencies: 156 + '@0no-co/graphqlsp': 157 + specifier: workspace:* 158 + version: link:../../../packages/graphqlsp 159 + '@graphql-typed-document-node/core': 160 + specifier: ^3.0.0 161 + version: 3.2.0(graphql@16.8.1) 162 + '@urql/core': 163 + specifier: ^4.0.4 164 + version: 4.0.4(graphql@16.8.1) 165 + graphql: 166 + specifier: ^16.0.0 167 + version: 16.8.1 121 168 devDependencies: 122 169 typescript: 123 170 specifier: ^5.0.4 ··· 125 172 126 173 packages: 127 174 128 - /@0no-co/graphql.web@1.0.0: 175 + /@0no-co/graphql.web@1.0.0(graphql@16.8.1): 129 176 resolution: {integrity: sha512-JBq2pWyDchE1vVjj/+c4dzZ8stbpew4RrzpZ3vYdn1WJFGHfYg6YIX1fDdMKtSXJJM9FUlsoDOxemr9WMM2p+A==} 130 177 peerDependencies: 131 178 graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 132 179 peerDependenciesMeta: 133 180 graphql: 134 181 optional: true 182 + dependencies: 183 + graphql: 16.8.1 135 184 dev: false 136 185 137 186 /@ampproject/remapping@2.2.0: ··· 169 218 - encoding 170 219 - supports-color 171 220 221 + /@ardatan/sync-fetch@0.0.1: 222 + resolution: {integrity: sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==} 223 + engines: {node: '>=14'} 224 + dependencies: 225 + node-fetch: 2.6.7 226 + transitivePeerDependencies: 227 + - encoding 228 + dev: true 229 + 172 230 /@babel/code-frame@7.18.6: 173 231 resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} 174 232 engines: {node: '>=6.9.0'} 175 233 dependencies: 176 234 '@babel/highlight': 7.18.6 177 235 236 + /@babel/code-frame@7.23.4: 237 + resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} 238 + engines: {node: '>=6.9.0'} 239 + dependencies: 240 + '@babel/highlight': 7.23.4 241 + chalk: 2.4.2 242 + dev: true 243 + 178 244 /@babel/compat-data@7.20.5: 179 245 resolution: {integrity: sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==} 180 246 engines: {node: '>=6.9.0'} 247 + 248 + /@babel/compat-data@7.23.3: 249 + resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==} 250 + engines: {node: '>=6.9.0'} 251 + dev: true 181 252 182 253 /@babel/core@7.20.5: 183 254 resolution: {integrity: sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==} ··· 201 272 transitivePeerDependencies: 202 273 - supports-color 203 274 275 + /@babel/core@7.23.3: 276 + resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} 277 + engines: {node: '>=6.9.0'} 278 + dependencies: 279 + '@ampproject/remapping': 2.2.0 280 + '@babel/code-frame': 7.23.4 281 + '@babel/generator': 7.23.4 282 + '@babel/helper-compilation-targets': 7.22.15 283 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) 284 + '@babel/helpers': 7.23.4 285 + '@babel/parser': 7.23.4 286 + '@babel/template': 7.22.15 287 + '@babel/traverse': 7.23.4 288 + '@babel/types': 7.23.4 289 + convert-source-map: 2.0.0 290 + debug: 4.3.4 291 + gensync: 1.0.0-beta.2 292 + json5: 2.2.3 293 + semver: 6.3.1 294 + transitivePeerDependencies: 295 + - supports-color 296 + dev: true 297 + 204 298 /@babel/generator@7.20.5: 205 299 resolution: {integrity: sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==} 206 300 engines: {node: '>=6.9.0'} ··· 209 303 '@jridgewell/gen-mapping': 0.3.2 210 304 jsesc: 2.5.2 211 305 306 + /@babel/generator@7.23.4: 307 + resolution: {integrity: sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==} 308 + engines: {node: '>=6.9.0'} 309 + dependencies: 310 + '@babel/types': 7.23.4 311 + '@jridgewell/gen-mapping': 0.3.2 312 + '@jridgewell/trace-mapping': 0.3.20 313 + jsesc: 2.5.2 314 + dev: true 315 + 212 316 /@babel/helper-annotate-as-pure@7.18.6: 213 317 resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} 214 318 engines: {node: '>=6.9.0'} ··· 227 331 browserslist: 4.21.4 228 332 semver: 6.3.0 229 333 334 + /@babel/helper-compilation-targets@7.22.15: 335 + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} 336 + engines: {node: '>=6.9.0'} 337 + dependencies: 338 + '@babel/compat-data': 7.23.3 339 + '@babel/helper-validator-option': 7.22.15 340 + browserslist: 4.22.1 341 + lru-cache: 5.1.1 342 + semver: 6.3.1 343 + dev: true 344 + 230 345 /@babel/helper-create-class-features-plugin@7.20.5(@babel/core@7.20.5): 231 346 resolution: {integrity: sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==} 232 347 engines: {node: '>=6.9.0'} ··· 248 363 resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} 249 364 engines: {node: '>=6.9.0'} 250 365 366 + /@babel/helper-environment-visitor@7.22.20: 367 + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} 368 + engines: {node: '>=6.9.0'} 369 + dev: true 370 + 251 371 /@babel/helper-function-name@7.19.0: 252 372 resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} 253 373 engines: {node: '>=6.9.0'} ··· 255 375 '@babel/template': 7.18.10 256 376 '@babel/types': 7.20.5 257 377 378 + /@babel/helper-function-name@7.23.0: 379 + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} 380 + engines: {node: '>=6.9.0'} 381 + dependencies: 382 + '@babel/template': 7.22.15 383 + '@babel/types': 7.23.4 384 + dev: true 385 + 258 386 /@babel/helper-hoist-variables@7.18.6: 259 387 resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} 260 388 engines: {node: '>=6.9.0'} 261 389 dependencies: 262 390 '@babel/types': 7.20.5 391 + 392 + /@babel/helper-hoist-variables@7.22.5: 393 + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 394 + engines: {node: '>=6.9.0'} 395 + dependencies: 396 + '@babel/types': 7.23.4 397 + dev: true 263 398 264 399 /@babel/helper-member-expression-to-functions@7.18.9: 265 400 resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==} ··· 273 408 dependencies: 274 409 '@babel/types': 7.20.5 275 410 411 + /@babel/helper-module-imports@7.22.15: 412 + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} 413 + engines: {node: '>=6.9.0'} 414 + dependencies: 415 + '@babel/types': 7.23.4 416 + dev: true 417 + 276 418 /@babel/helper-module-transforms@7.20.2: 277 419 resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==} 278 420 engines: {node: '>=6.9.0'} ··· 288 430 transitivePeerDependencies: 289 431 - supports-color 290 432 433 + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): 434 + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} 435 + engines: {node: '>=6.9.0'} 436 + peerDependencies: 437 + '@babel/core': ^7.0.0 438 + dependencies: 439 + '@babel/core': 7.23.3 440 + '@babel/helper-environment-visitor': 7.22.20 441 + '@babel/helper-module-imports': 7.22.15 442 + '@babel/helper-simple-access': 7.22.5 443 + '@babel/helper-split-export-declaration': 7.22.6 444 + '@babel/helper-validator-identifier': 7.22.20 445 + dev: true 446 + 291 447 /@babel/helper-optimise-call-expression@7.18.6: 292 448 resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} 293 449 engines: {node: '>=6.9.0'} ··· 298 454 resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} 299 455 engines: {node: '>=6.9.0'} 300 456 457 + /@babel/helper-plugin-utils@7.22.5: 458 + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} 459 + engines: {node: '>=6.9.0'} 460 + dev: true 461 + 301 462 /@babel/helper-replace-supers@7.19.1: 302 463 resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==} 303 464 engines: {node: '>=6.9.0'} ··· 316 477 dependencies: 317 478 '@babel/types': 7.20.5 318 479 480 + /@babel/helper-simple-access@7.22.5: 481 + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} 482 + engines: {node: '>=6.9.0'} 483 + dependencies: 484 + '@babel/types': 7.23.4 485 + dev: true 486 + 319 487 /@babel/helper-skip-transparent-expression-wrappers@7.20.0: 320 488 resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} 321 489 engines: {node: '>=6.9.0'} ··· 328 496 dependencies: 329 497 '@babel/types': 7.20.5 330 498 499 + /@babel/helper-split-export-declaration@7.22.6: 500 + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 501 + engines: {node: '>=6.9.0'} 502 + dependencies: 503 + '@babel/types': 7.23.4 504 + dev: true 505 + 331 506 /@babel/helper-string-parser@7.19.4: 332 507 resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} 333 508 engines: {node: '>=6.9.0'} 334 509 510 + /@babel/helper-string-parser@7.23.4: 511 + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} 512 + engines: {node: '>=6.9.0'} 513 + dev: true 514 + 335 515 /@babel/helper-validator-identifier@7.19.1: 336 516 resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} 337 517 engines: {node: '>=6.9.0'} 518 + 519 + /@babel/helper-validator-identifier@7.22.20: 520 + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 521 + engines: {node: '>=6.9.0'} 522 + dev: true 338 523 339 524 /@babel/helper-validator-option@7.18.6: 340 525 resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} 341 526 engines: {node: '>=6.9.0'} 342 527 528 + /@babel/helper-validator-option@7.22.15: 529 + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} 530 + engines: {node: '>=6.9.0'} 531 + dev: true 532 + 343 533 /@babel/helpers@7.20.6: 344 534 resolution: {integrity: sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==} 345 535 engines: {node: '>=6.9.0'} ··· 350 540 transitivePeerDependencies: 351 541 - supports-color 352 542 543 + /@babel/helpers@7.23.4: 544 + resolution: {integrity: sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==} 545 + engines: {node: '>=6.9.0'} 546 + dependencies: 547 + '@babel/template': 7.22.15 548 + '@babel/traverse': 7.23.4 549 + '@babel/types': 7.23.4 550 + transitivePeerDependencies: 551 + - supports-color 552 + dev: true 553 + 353 554 /@babel/highlight@7.18.6: 354 555 resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} 355 556 engines: {node: '>=6.9.0'} ··· 358 559 chalk: 2.4.2 359 560 js-tokens: 4.0.0 360 561 562 + /@babel/highlight@7.23.4: 563 + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} 564 + engines: {node: '>=6.9.0'} 565 + dependencies: 566 + '@babel/helper-validator-identifier': 7.22.20 567 + chalk: 2.4.2 568 + js-tokens: 4.0.0 569 + dev: true 570 + 361 571 /@babel/parser@7.20.5: 362 572 resolution: {integrity: sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==} 363 573 engines: {node: '>=6.0.0'} ··· 365 575 dependencies: 366 576 '@babel/types': 7.20.5 367 577 578 + /@babel/parser@7.23.4: 579 + resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==} 580 + engines: {node: '>=6.0.0'} 581 + hasBin: true 582 + dependencies: 583 + '@babel/types': 7.23.4 584 + dev: true 585 + 368 586 /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.20.5): 369 587 resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} 370 588 engines: {node: '>=6.9.0'} ··· 408 626 dependencies: 409 627 '@babel/core': 7.20.5 410 628 '@babel/helper-plugin-utils': 7.20.2 629 + 630 + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.3): 631 + resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} 632 + engines: {node: '>=6.9.0'} 633 + peerDependencies: 634 + '@babel/core': ^7.0.0-0 635 + dependencies: 636 + '@babel/core': 7.23.3 637 + '@babel/helper-plugin-utils': 7.22.5 638 + dev: true 411 639 412 640 /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.20.5): 413 641 resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} ··· 645 873 '@babel/parser': 7.20.5 646 874 '@babel/types': 7.20.5 647 875 876 + /@babel/template@7.22.15: 877 + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} 878 + engines: {node: '>=6.9.0'} 879 + dependencies: 880 + '@babel/code-frame': 7.23.4 881 + '@babel/parser': 7.23.4 882 + '@babel/types': 7.23.4 883 + dev: true 884 + 648 885 /@babel/traverse@7.20.5: 649 886 resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==} 650 887 engines: {node: '>=6.9.0'} ··· 662 899 transitivePeerDependencies: 663 900 - supports-color 664 901 902 + /@babel/traverse@7.23.4: 903 + resolution: {integrity: sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==} 904 + engines: {node: '>=6.9.0'} 905 + dependencies: 906 + '@babel/code-frame': 7.23.4 907 + '@babel/generator': 7.23.4 908 + '@babel/helper-environment-visitor': 7.22.20 909 + '@babel/helper-function-name': 7.23.0 910 + '@babel/helper-hoist-variables': 7.22.5 911 + '@babel/helper-split-export-declaration': 7.22.6 912 + '@babel/parser': 7.23.4 913 + '@babel/types': 7.23.4 914 + debug: 4.3.4 915 + globals: 11.12.0 916 + transitivePeerDependencies: 917 + - supports-color 918 + dev: true 919 + 665 920 /@babel/types@7.20.5: 666 921 resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==} 667 922 engines: {node: '>=6.9.0'} ··· 670 925 '@babel/helper-validator-identifier': 7.19.1 671 926 to-fast-properties: 2.0.0 672 927 928 + /@babel/types@7.23.4: 929 + resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==} 930 + engines: {node: '>=6.9.0'} 931 + dependencies: 932 + '@babel/helper-string-parser': 7.23.4 933 + '@babel/helper-validator-identifier': 7.22.20 934 + to-fast-properties: 2.0.0 935 + dev: true 936 + 673 937 /@changesets/apply-release-plan@6.1.4: 674 938 resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==} 675 939 dependencies: ··· 861 1125 fs-extra: 7.0.1 862 1126 human-id: 1.0.2 863 1127 prettier: 2.8.7 1128 + dev: true 1129 + 1130 + /@cspotcode/source-map-support@0.8.1: 1131 + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 1132 + engines: {node: '>=12'} 1133 + dependencies: 1134 + '@jridgewell/trace-mapping': 0.3.9 864 1135 dev: true 865 1136 866 1137 /@esbuild/android-arm64@0.17.16: ··· 1070 1341 graphql: 16.8.1 1071 1342 tslib: 2.5.0 1072 1343 1344 + /@graphql-codegen/cli@5.0.0(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.0.4): 1345 + resolution: {integrity: sha512-A7J7+be/a6e+/ul2KI5sfJlpoqeqwX8EzktaKCeduyVKgOLA6W5t+NUGf6QumBDXU8PEOqXk3o3F+RAwCWOiqA==} 1346 + hasBin: true 1347 + peerDependencies: 1348 + '@parcel/watcher': ^2.1.0 1349 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 1350 + peerDependenciesMeta: 1351 + '@parcel/watcher': 1352 + optional: true 1353 + dependencies: 1354 + '@babel/generator': 7.20.5 1355 + '@babel/template': 7.18.10 1356 + '@babel/types': 7.20.5 1357 + '@graphql-codegen/core': 4.0.0(graphql@16.8.1) 1358 + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) 1359 + '@graphql-tools/apollo-engine-loader': 8.0.0(graphql@16.8.1) 1360 + '@graphql-tools/code-file-loader': 8.0.3(graphql@16.8.1) 1361 + '@graphql-tools/git-loader': 8.0.3(graphql@16.8.1) 1362 + '@graphql-tools/github-loader': 8.0.0(@types/node@18.15.11)(graphql@16.8.1) 1363 + '@graphql-tools/graphql-file-loader': 8.0.0(graphql@16.8.1) 1364 + '@graphql-tools/json-file-loader': 8.0.0(graphql@16.8.1) 1365 + '@graphql-tools/load': 8.0.1(graphql@16.8.1) 1366 + '@graphql-tools/prisma-loader': 8.0.2(@types/node@18.15.11)(graphql@16.8.1) 1367 + '@graphql-tools/url-loader': 8.0.0(@types/node@18.15.11)(graphql@16.8.1) 1368 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 1369 + '@whatwg-node/fetch': 0.8.8 1370 + chalk: 4.1.2 1371 + cosmiconfig: 8.3.6(typescript@5.0.4) 1372 + debounce: 1.2.1 1373 + detect-indent: 6.1.0 1374 + graphql: 16.8.1 1375 + graphql-config: 5.0.3(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.0.4) 1376 + inquirer: 8.2.6 1377 + is-glob: 4.0.3 1378 + jiti: 1.21.0 1379 + json-to-pretty-yaml: 1.2.2 1380 + listr2: 4.0.5 1381 + log-symbols: 4.1.0 1382 + micromatch: 4.0.5 1383 + shell-quote: 1.8.1 1384 + string-env-interpolation: 1.0.1 1385 + ts-log: 2.2.5 1386 + tslib: 2.5.0 1387 + yaml: 2.3.2 1388 + yargs: 17.7.1 1389 + transitivePeerDependencies: 1390 + - '@types/node' 1391 + - bufferutil 1392 + - cosmiconfig-toml-loader 1393 + - encoding 1394 + - enquirer 1395 + - supports-color 1396 + - typescript 1397 + - utf-8-validate 1398 + dev: true 1399 + 1400 + /@graphql-codegen/client-preset@4.1.0(graphql@16.8.1): 1401 + resolution: {integrity: sha512-/3Ymb/fjxIF1+HGmaI1YwSZbWsrZAWMSQjh3dU425eBjctjsVQ6gzGRr+l/gE5F1mtmCf+vlbTAT03heAc/QIw==} 1402 + peerDependencies: 1403 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 1404 + dependencies: 1405 + '@babel/helper-plugin-utils': 7.22.5 1406 + '@babel/template': 7.22.15 1407 + '@graphql-codegen/add': 5.0.0(graphql@16.8.1) 1408 + '@graphql-codegen/gql-tag-operations': 4.0.1(graphql@16.8.1) 1409 + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) 1410 + '@graphql-codegen/typed-document-node': 5.0.1(graphql@16.8.1) 1411 + '@graphql-codegen/typescript': 4.0.1(graphql@16.8.1) 1412 + '@graphql-codegen/typescript-operations': 4.0.1(graphql@16.8.1) 1413 + '@graphql-codegen/visitor-plugin-common': 4.0.1(graphql@16.8.1) 1414 + '@graphql-tools/documents': 1.0.0(graphql@16.8.1) 1415 + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) 1416 + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) 1417 + graphql: 16.8.1 1418 + tslib: 2.5.0 1419 + transitivePeerDependencies: 1420 + - encoding 1421 + - supports-color 1422 + dev: true 1423 + 1073 1424 /@graphql-codegen/core@4.0.0(graphql@16.8.1): 1074 1425 resolution: {integrity: sha512-JAGRn49lEtSsZVxeIlFVIRxts2lWObR+OQo7V2LHDJ7ohYYw3ilv7nJ8pf8P4GTg/w6ptcYdSdVVdkI8kUHB/Q==} 1075 1426 peerDependencies: ··· 1081 1432 graphql: 16.8.1 1082 1433 tslib: 2.5.0 1083 1434 1435 + /@graphql-codegen/gql-tag-operations@4.0.1(graphql@16.8.1): 1436 + resolution: {integrity: sha512-qF6wIbBzW8BNT+wiVsBxrYOs2oYcsxQ7mRvCpfEI3HnNZMAST/uX76W8MqFEJvj4mw7NIDv7xYJAcAZIWM5LWw==} 1437 + peerDependencies: 1438 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 1439 + dependencies: 1440 + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) 1441 + '@graphql-codegen/visitor-plugin-common': 4.0.1(graphql@16.8.1) 1442 + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) 1443 + auto-bind: 4.0.0 1444 + graphql: 16.8.1 1445 + tslib: 2.5.0 1446 + transitivePeerDependencies: 1447 + - encoding 1448 + - supports-color 1449 + dev: true 1450 + 1084 1451 /@graphql-codegen/plugin-helpers@5.0.0(graphql@16.8.1): 1085 1452 resolution: {integrity: sha512-suL2ZMkBAU2a4YbBHaZvUPsV1z0q3cW6S96Z/eYYfkRIsJoe2vN+wNZ9Xdzmqx0JLmeeFCBSoBGC0imFyXlkDQ==} 1086 1453 peerDependencies: ··· 1093 1460 import-from: 4.0.0 1094 1461 lodash: 4.17.21 1095 1462 tslib: 2.5.0 1463 + 1464 + /@graphql-codegen/plugin-helpers@5.0.1(graphql@16.8.1): 1465 + resolution: {integrity: sha512-6L5sb9D8wptZhnhLLBcheSPU7Tg//DGWgc5tQBWX46KYTOTQHGqDpv50FxAJJOyFVJrveN9otWk9UT9/yfY4ww==} 1466 + peerDependencies: 1467 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 1468 + dependencies: 1469 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 1470 + change-case-all: 1.0.15 1471 + common-tags: 1.8.2 1472 + graphql: 16.8.1 1473 + import-from: 4.0.0 1474 + lodash: 4.17.21 1475 + tslib: 2.5.0 1476 + dev: true 1096 1477 1097 1478 /@graphql-codegen/schema-ast@4.0.0(graphql@16.8.1): 1098 1479 resolution: {integrity: sha512-WIzkJFa9Gz28FITAPILbt+7A8+yzOyd1NxgwFh7ie+EmO9a5zQK6UQ3U/BviirguXCYnn+AR4dXsoDrSrtRA1g==} ··· 1169 1550 - encoding 1170 1551 - supports-color 1171 1552 1553 + /@graphql-tools/apollo-engine-loader@8.0.0(graphql@16.8.1): 1554 + resolution: {integrity: sha512-axQTbN5+Yxs1rJ6cWQBOfw3AEeC+fvIuZSfJLPLLvFJLj4pUm9fhxey/g6oQZAAQJqKPfw+tLDUQvnfvRK8Kmg==} 1555 + engines: {node: '>=16.0.0'} 1556 + peerDependencies: 1557 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1558 + dependencies: 1559 + '@ardatan/sync-fetch': 0.0.1 1560 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 1561 + '@whatwg-node/fetch': 0.9.14 1562 + graphql: 16.8.1 1563 + tslib: 2.5.0 1564 + transitivePeerDependencies: 1565 + - encoding 1566 + dev: true 1567 + 1568 + /@graphql-tools/batch-execute@9.0.2(graphql@16.8.1): 1569 + resolution: {integrity: sha512-Y2uwdZI6ZnatopD/SYfZ1eGuQFI7OU2KGZ2/B/7G9ISmgMl5K+ZZWz/PfIEXeiHirIDhyk54s4uka5rj2xwKqQ==} 1570 + engines: {node: '>=16.0.0'} 1571 + peerDependencies: 1572 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1573 + dependencies: 1574 + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) 1575 + dataloader: 2.2.2 1576 + graphql: 16.8.1 1577 + tslib: 2.5.0 1578 + value-or-promise: 1.0.12 1579 + dev: true 1580 + 1581 + /@graphql-tools/code-file-loader@8.0.3(graphql@16.8.1): 1582 + resolution: {integrity: sha512-gVnnlWs0Ua+5FkuHHEriFUOI3OIbHv6DS1utxf28n6NkfGMJldC4j0xlJRY0LS6dWK34IGYgD4HelKYz2l8KiA==} 1583 + engines: {node: '>=16.0.0'} 1584 + peerDependencies: 1585 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1586 + dependencies: 1587 + '@graphql-tools/graphql-tag-pluck': 8.1.0(graphql@16.8.1) 1588 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 1589 + globby: 11.1.0 1590 + graphql: 16.8.1 1591 + tslib: 2.5.0 1592 + unixify: 1.0.0 1593 + transitivePeerDependencies: 1594 + - supports-color 1595 + dev: true 1596 + 1597 + /@graphql-tools/delegate@10.0.3(graphql@16.8.1): 1598 + resolution: {integrity: sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw==} 1599 + engines: {node: '>=16.0.0'} 1600 + peerDependencies: 1601 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1602 + dependencies: 1603 + '@graphql-tools/batch-execute': 9.0.2(graphql@16.8.1) 1604 + '@graphql-tools/executor': 1.2.0(graphql@16.8.1) 1605 + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) 1606 + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) 1607 + dataloader: 2.2.2 1608 + graphql: 16.8.1 1609 + tslib: 2.5.0 1610 + dev: true 1611 + 1612 + /@graphql-tools/documents@1.0.0(graphql@16.8.1): 1613 + resolution: {integrity: sha512-rHGjX1vg/nZ2DKqRGfDPNC55CWZBMldEVcH+91BThRa6JeT80NqXknffLLEZLRUxyikCfkwMsk6xR3UNMqG0Rg==} 1614 + engines: {node: '>=16.0.0'} 1615 + peerDependencies: 1616 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1617 + dependencies: 1618 + graphql: 16.8.1 1619 + lodash.sortby: 4.7.0 1620 + tslib: 2.6.2 1621 + dev: true 1622 + 1623 + /@graphql-tools/executor-graphql-ws@1.1.0(graphql@16.8.1): 1624 + resolution: {integrity: sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg==} 1625 + engines: {node: '>=16.0.0'} 1626 + peerDependencies: 1627 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1628 + dependencies: 1629 + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) 1630 + '@types/ws': 8.5.10 1631 + graphql: 16.8.1 1632 + graphql-ws: 5.14.2(graphql@16.8.1) 1633 + isomorphic-ws: 5.0.0(ws@8.14.2) 1634 + tslib: 2.5.0 1635 + ws: 8.14.2 1636 + transitivePeerDependencies: 1637 + - bufferutil 1638 + - utf-8-validate 1639 + dev: true 1640 + 1641 + /@graphql-tools/executor-http@1.0.3(@types/node@18.15.11)(graphql@16.8.1): 1642 + resolution: {integrity: sha512-5WZIMBevRaxMabZ8U2Ty0dTUPy/PpeYSlMNEmC/YJjKKykgSfc/AwSejx2sE4FFKZ0I2kxRKRenyoWMHRAV49Q==} 1643 + engines: {node: '>=16.0.0'} 1644 + peerDependencies: 1645 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1646 + dependencies: 1647 + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) 1648 + '@repeaterjs/repeater': 3.0.5 1649 + '@whatwg-node/fetch': 0.9.14 1650 + extract-files: 11.0.0 1651 + graphql: 16.8.1 1652 + meros: 1.3.0(@types/node@18.15.11) 1653 + tslib: 2.5.0 1654 + value-or-promise: 1.0.12 1655 + transitivePeerDependencies: 1656 + - '@types/node' 1657 + dev: true 1658 + 1659 + /@graphql-tools/executor-legacy-ws@1.0.4(graphql@16.8.1): 1660 + resolution: {integrity: sha512-b7aGuRekZDS+m3af3BIvMKxu15bmVPMt5eGQVuP2v5pxmbaPTh+iv5mx9b3Plt32z5Ke5tycBnNm5urSFtW8ng==} 1661 + engines: {node: '>=16.0.0'} 1662 + peerDependencies: 1663 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1664 + dependencies: 1665 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 1666 + '@types/ws': 8.5.10 1667 + graphql: 16.8.1 1668 + isomorphic-ws: 5.0.0(ws@8.14.2) 1669 + tslib: 2.5.0 1670 + ws: 8.14.2 1671 + transitivePeerDependencies: 1672 + - bufferutil 1673 + - utf-8-validate 1674 + dev: true 1675 + 1676 + /@graphql-tools/executor@1.2.0(graphql@16.8.1): 1677 + resolution: {integrity: sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg==} 1678 + engines: {node: '>=16.0.0'} 1679 + peerDependencies: 1680 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1681 + dependencies: 1682 + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) 1683 + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) 1684 + '@repeaterjs/repeater': 3.0.5 1685 + graphql: 16.8.1 1686 + tslib: 2.5.0 1687 + value-or-promise: 1.0.12 1688 + dev: true 1689 + 1690 + /@graphql-tools/git-loader@8.0.3(graphql@16.8.1): 1691 + resolution: {integrity: sha512-Iz9KbRUAkuOe8JGTS0qssyJ+D5Snle17W+z9anwWrLFrkBhHrRFUy5AdjZqgJuhls0x30QkZBnnCtnHDBdQ4nA==} 1692 + engines: {node: '>=16.0.0'} 1693 + peerDependencies: 1694 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1695 + dependencies: 1696 + '@graphql-tools/graphql-tag-pluck': 8.1.0(graphql@16.8.1) 1697 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 1698 + graphql: 16.8.1 1699 + is-glob: 4.0.3 1700 + micromatch: 4.0.5 1701 + tslib: 2.5.0 1702 + unixify: 1.0.0 1703 + transitivePeerDependencies: 1704 + - supports-color 1705 + dev: true 1706 + 1707 + /@graphql-tools/github-loader@8.0.0(@types/node@18.15.11)(graphql@16.8.1): 1708 + resolution: {integrity: sha512-VuroArWKcG4yaOWzV0r19ElVIV6iH6UKDQn1MXemND0xu5TzrFme0kf3U9o0YwNo0kUYEk9CyFM0BYg4he17FA==} 1709 + engines: {node: '>=16.0.0'} 1710 + peerDependencies: 1711 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1712 + dependencies: 1713 + '@ardatan/sync-fetch': 0.0.1 1714 + '@graphql-tools/executor-http': 1.0.3(@types/node@18.15.11)(graphql@16.8.1) 1715 + '@graphql-tools/graphql-tag-pluck': 8.1.0(graphql@16.8.1) 1716 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 1717 + '@whatwg-node/fetch': 0.9.14 1718 + graphql: 16.8.1 1719 + tslib: 2.5.0 1720 + value-or-promise: 1.0.12 1721 + transitivePeerDependencies: 1722 + - '@types/node' 1723 + - encoding 1724 + - supports-color 1725 + dev: true 1726 + 1727 + /@graphql-tools/graphql-file-loader@8.0.0(graphql@16.8.1): 1728 + resolution: {integrity: sha512-wRXj9Z1IFL3+zJG1HWEY0S4TXal7+s1vVhbZva96MSp0kbb/3JBF7j0cnJ44Eq0ClccMgGCDFqPFXty4JlpaPg==} 1729 + engines: {node: '>=16.0.0'} 1730 + peerDependencies: 1731 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1732 + dependencies: 1733 + '@graphql-tools/import': 7.0.0(graphql@16.8.1) 1734 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 1735 + globby: 11.1.0 1736 + graphql: 16.8.1 1737 + tslib: 2.5.0 1738 + unixify: 1.0.0 1739 + dev: true 1740 + 1741 + /@graphql-tools/graphql-tag-pluck@8.1.0(graphql@16.8.1): 1742 + resolution: {integrity: sha512-kt5l6H/7QxQcIaewInTcune6NpATojdFEW98/8xWcgmy7dgXx5vU9e0AicFZIH+ewGyZzTpwFqO2RI03roxj2w==} 1743 + engines: {node: '>=16.0.0'} 1744 + peerDependencies: 1745 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1746 + dependencies: 1747 + '@babel/core': 7.23.3 1748 + '@babel/parser': 7.20.5 1749 + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.3) 1750 + '@babel/traverse': 7.20.5 1751 + '@babel/types': 7.20.5 1752 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 1753 + graphql: 16.8.1 1754 + tslib: 2.5.0 1755 + transitivePeerDependencies: 1756 + - supports-color 1757 + dev: true 1758 + 1759 + /@graphql-tools/import@7.0.0(graphql@16.8.1): 1760 + resolution: {integrity: sha512-NVZiTO8o1GZs6OXzNfjB+5CtQtqsZZpQOq+Uu0w57kdUkT4RlQKlwhT8T81arEsbV55KpzkpFsOZP7J1wdmhBw==} 1761 + engines: {node: '>=16.0.0'} 1762 + peerDependencies: 1763 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1764 + dependencies: 1765 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 1766 + graphql: 16.8.1 1767 + resolve-from: 5.0.0 1768 + tslib: 2.5.0 1769 + dev: true 1770 + 1771 + /@graphql-tools/json-file-loader@8.0.0(graphql@16.8.1): 1772 + resolution: {integrity: sha512-ki6EF/mobBWJjAAC84xNrFMhNfnUFD6Y0rQMGXekrUgY0NdeYXHU0ZUgHzC9O5+55FslqUmAUHABePDHTyZsLg==} 1773 + engines: {node: '>=16.0.0'} 1774 + peerDependencies: 1775 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1776 + dependencies: 1777 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 1778 + globby: 11.1.0 1779 + graphql: 16.8.1 1780 + tslib: 2.5.0 1781 + unixify: 1.0.0 1782 + dev: true 1783 + 1784 + /@graphql-tools/load@8.0.1(graphql@16.8.1): 1785 + resolution: {integrity: sha512-qSMsKngJhDqRbuWyo3NvakEFqFL6+eSjy8ooJ1o5qYD26N7dqXkKzIMycQsX7rBK19hOuINAUSaRcVWH6hTccw==} 1786 + engines: {node: '>=16.0.0'} 1787 + peerDependencies: 1788 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1789 + dependencies: 1790 + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) 1791 + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) 1792 + graphql: 16.8.1 1793 + p-limit: 3.1.0 1794 + tslib: 2.5.0 1795 + dev: true 1796 + 1172 1797 /@graphql-tools/merge@9.0.0(graphql@16.8.1): 1173 1798 resolution: {integrity: sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q==} 1174 1799 engines: {node: '>=16.0.0'} ··· 1188 1813 graphql: 16.8.1 1189 1814 tslib: 2.5.0 1190 1815 1816 + /@graphql-tools/prisma-loader@8.0.2(@types/node@18.15.11)(graphql@16.8.1): 1817 + resolution: {integrity: sha512-8d28bIB0bZ9Bj0UOz9sHagVPW+6AHeqvGljjERtwCnWl8OCQw2c2pNboYXISLYUG5ub76r4lDciLLTU+Ks7Q0w==} 1818 + engines: {node: '>=16.0.0'} 1819 + peerDependencies: 1820 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1821 + dependencies: 1822 + '@graphql-tools/url-loader': 8.0.0(@types/node@18.15.11)(graphql@16.8.1) 1823 + '@graphql-tools/utils': 10.0.11(graphql@16.8.1) 1824 + '@types/js-yaml': 4.0.9 1825 + '@types/json-stable-stringify': 1.0.36 1826 + '@whatwg-node/fetch': 0.9.14 1827 + chalk: 4.1.2 1828 + debug: 4.3.4 1829 + dotenv: 16.0.3 1830 + graphql: 16.8.1 1831 + graphql-request: 6.1.0(graphql@16.8.1) 1832 + http-proxy-agent: 7.0.0 1833 + https-proxy-agent: 7.0.2 1834 + jose: 5.1.1 1835 + js-yaml: 4.1.0 1836 + json-stable-stringify: 1.1.0 1837 + lodash: 4.17.21 1838 + scuid: 1.1.0 1839 + tslib: 2.5.0 1840 + yaml-ast-parser: 0.0.43 1841 + transitivePeerDependencies: 1842 + - '@types/node' 1843 + - bufferutil 1844 + - encoding 1845 + - supports-color 1846 + - utf-8-validate 1847 + dev: true 1848 + 1191 1849 /@graphql-tools/relay-operation-optimizer@7.0.0(graphql@16.8.1): 1192 1850 resolution: {integrity: sha512-UNlJi5y3JylhVWU4MBpL0Hun4Q7IoJwv9xYtmAz+CgRa066szzY7dcuPfxrA7cIGgG/Q6TVsKsYaiF4OHPs1Fw==} 1193 1851 engines: {node: '>=16.0.0'} ··· 1214 1872 tslib: 2.5.0 1215 1873 value-or-promise: 1.0.12 1216 1874 1875 + /@graphql-tools/url-loader@8.0.0(@types/node@18.15.11)(graphql@16.8.1): 1876 + resolution: {integrity: sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA==} 1877 + engines: {node: '>=16.0.0'} 1878 + peerDependencies: 1879 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1880 + dependencies: 1881 + '@ardatan/sync-fetch': 0.0.1 1882 + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) 1883 + '@graphql-tools/executor-graphql-ws': 1.1.0(graphql@16.8.1) 1884 + '@graphql-tools/executor-http': 1.0.3(@types/node@18.15.11)(graphql@16.8.1) 1885 + '@graphql-tools/executor-legacy-ws': 1.0.4(graphql@16.8.1) 1886 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 1887 + '@graphql-tools/wrap': 10.0.1(graphql@16.8.1) 1888 + '@types/ws': 8.5.10 1889 + '@whatwg-node/fetch': 0.9.14 1890 + graphql: 16.8.1 1891 + isomorphic-ws: 5.0.0(ws@8.14.2) 1892 + tslib: 2.5.0 1893 + value-or-promise: 1.0.12 1894 + ws: 8.14.2 1895 + transitivePeerDependencies: 1896 + - '@types/node' 1897 + - bufferutil 1898 + - encoding 1899 + - utf-8-validate 1900 + dev: true 1901 + 1217 1902 /@graphql-tools/utils@10.0.1(graphql@16.8.1): 1218 1903 resolution: {integrity: sha512-i1FozbDGHgdsFA47V/JvQZ0FE8NAy0Eiz7HGCJO2MkNdZAKNnwei66gOq0JWYVFztwpwbVQ09GkKhq7Kjcq5Cw==} 1219 1904 engines: {node: '>=16.0.0'} ··· 1224 1909 graphql: 16.8.1 1225 1910 tslib: 2.5.0 1226 1911 1912 + /@graphql-tools/utils@10.0.11(graphql@16.8.1): 1913 + resolution: {integrity: sha512-vVjXgKn6zjXIlYBd7yJxCVMYGb5j18gE3hx3Qw3mNsSEsYQXbJbPdlwb7Fc9FogsJei5AaqiQerqH4kAosp1nQ==} 1914 + engines: {node: '>=16.0.0'} 1915 + peerDependencies: 1916 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1917 + dependencies: 1918 + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) 1919 + cross-inspect: 1.0.0 1920 + dset: 3.1.3 1921 + graphql: 16.8.1 1922 + tslib: 2.5.0 1923 + dev: true 1924 + 1925 + /@graphql-tools/wrap@10.0.1(graphql@16.8.1): 1926 + resolution: {integrity: sha512-Cw6hVrKGM2OKBXeuAGltgy4tzuqQE0Nt7t/uAqnuokSXZhMHXJUb124Bnvxc2gPZn5chfJSDafDe4Cp8ZAVJgg==} 1927 + engines: {node: '>=16.0.0'} 1928 + peerDependencies: 1929 + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 1930 + dependencies: 1931 + '@graphql-tools/delegate': 10.0.3(graphql@16.8.1) 1932 + '@graphql-tools/schema': 10.0.0(graphql@16.8.1) 1933 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 1934 + graphql: 16.8.1 1935 + tslib: 2.5.0 1936 + value-or-promise: 1.0.12 1937 + dev: true 1938 + 1227 1939 /@graphql-typed-document-node/core@3.2.0(graphql@16.8.1): 1228 1940 resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} 1229 1941 peerDependencies: ··· 1281 1993 '@jridgewell/resolve-uri': 3.1.0 1282 1994 '@jridgewell/sourcemap-codec': 1.4.14 1283 1995 1996 + /@jridgewell/trace-mapping@0.3.20: 1997 + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} 1998 + dependencies: 1999 + '@jridgewell/resolve-uri': 3.1.0 2000 + '@jridgewell/sourcemap-codec': 1.4.15 2001 + dev: true 2002 + 2003 + /@jridgewell/trace-mapping@0.3.9: 2004 + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 2005 + dependencies: 2006 + '@jridgewell/resolve-uri': 3.1.0 2007 + '@jridgewell/sourcemap-codec': 1.4.15 2008 + dev: true 2009 + 1284 2010 /@manypkg/find-root@1.1.0: 1285 2011 resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} 1286 2012 dependencies: ··· 1322 2048 fastq: 1.13.0 1323 2049 dev: true 1324 2050 2051 + /@peculiar/asn1-schema@2.3.8: 2052 + resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==} 2053 + dependencies: 2054 + asn1js: 3.0.5 2055 + pvtsutils: 1.3.5 2056 + tslib: 2.6.2 2057 + dev: true 2058 + 2059 + /@peculiar/json-schema@1.1.12: 2060 + resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} 2061 + engines: {node: '>=8.0.0'} 2062 + dependencies: 2063 + tslib: 2.5.0 2064 + dev: true 2065 + 2066 + /@peculiar/webcrypto@1.4.3: 2067 + resolution: {integrity: sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A==} 2068 + engines: {node: '>=10.12.0'} 2069 + dependencies: 2070 + '@peculiar/asn1-schema': 2.3.8 2071 + '@peculiar/json-schema': 1.1.12 2072 + pvtsutils: 1.3.5 2073 + tslib: 2.5.0 2074 + webcrypto-core: 1.7.7 2075 + dev: true 2076 + 2077 + /@repeaterjs/repeater@3.0.5: 2078 + resolution: {integrity: sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA==} 2079 + dev: true 2080 + 1325 2081 /@rollup/plugin-terser@0.4.4(rollup@3.20.2): 1326 2082 resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} 1327 2083 engines: {node: '>=14.0.0'} ··· 1385 2141 engines: {node: '>=10'} 1386 2142 dev: true 1387 2143 2144 + /@tsconfig/node10@1.0.9: 2145 + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} 2146 + dev: true 2147 + 2148 + /@tsconfig/node12@1.0.11: 2149 + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 2150 + dev: true 2151 + 2152 + /@tsconfig/node14@1.0.3: 2153 + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 2154 + dev: true 2155 + 2156 + /@tsconfig/node16@1.0.4: 2157 + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} 2158 + dev: true 2159 + 1388 2160 /@types/chai-subset@1.3.3: 1389 2161 resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} 1390 2162 dependencies: ··· 1405 2177 ci-info: 3.8.0 1406 2178 dev: true 1407 2179 2180 + /@types/js-yaml@4.0.9: 2181 + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} 2182 + dev: true 2183 + 2184 + /@types/json-stable-stringify@1.0.36: 2185 + resolution: {integrity: sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw==} 2186 + dev: true 2187 + 1408 2188 /@types/minimist@1.2.2: 1409 2189 resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} 1410 2190 dev: true ··· 1432 2212 resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==} 1433 2213 dev: true 1434 2214 2215 + /@types/ws@8.5.10: 2216 + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} 2217 + dependencies: 2218 + '@types/node': 18.15.11 2219 + dev: true 2220 + 1435 2221 /@urql/core@3.2.2(graphql@16.8.1): 1436 2222 resolution: {integrity: sha512-i046Cz8cZ4xIzGMTyHZrbdgzcFMcKD7+yhCAH5FwWBRjcKrc+RjEOuR9X5AMuBvr8c6IAaE92xAqa4wmlGfWTQ==} 1437 2223 peerDependencies: ··· 1441 2227 wonka: 6.3.1 1442 2228 dev: false 1443 2229 1444 - /@urql/core@4.0.4: 2230 + /@urql/core@4.0.4(graphql@16.8.1): 1445 2231 resolution: {integrity: sha512-r1rB/VMVpCnfnMTTzCAs+HY+UqOHUgpZ+GimLtU4DCTP3C78DK+m4qr36M7KKleggrKgcpcC1TE8eFEVcKzfSQ==} 1446 2232 dependencies: 1447 - '@0no-co/graphql.web': 1.0.0 2233 + '@0no-co/graphql.web': 1.0.0(graphql@16.8.1) 1448 2234 wonka: 6.3.1 1449 2235 transitivePeerDependencies: 1450 2236 - graphql ··· 1488 2274 pretty-format: 29.7.0 1489 2275 dev: true 1490 2276 2277 + /@whatwg-node/events@0.0.3: 2278 + resolution: {integrity: sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==} 2279 + dev: true 2280 + 2281 + /@whatwg-node/events@0.1.1: 2282 + resolution: {integrity: sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==} 2283 + engines: {node: '>=16.0.0'} 2284 + dev: true 2285 + 2286 + /@whatwg-node/fetch@0.8.8: 2287 + resolution: {integrity: sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==} 2288 + dependencies: 2289 + '@peculiar/webcrypto': 1.4.3 2290 + '@whatwg-node/node-fetch': 0.3.6 2291 + busboy: 1.6.0 2292 + urlpattern-polyfill: 8.0.2 2293 + web-streams-polyfill: 3.2.1 2294 + dev: true 2295 + 2296 + /@whatwg-node/fetch@0.9.14: 2297 + resolution: {integrity: sha512-wurZC82zzZwXRDSW0OS9l141DynaJQh7Yt0FD1xZ8niX7/Et/7RoiLiltbVU1fSF1RR9z6ndEaTUQBAmddTm1w==} 2298 + engines: {node: '>=16.0.0'} 2299 + dependencies: 2300 + '@whatwg-node/node-fetch': 0.5.1 2301 + urlpattern-polyfill: 9.0.0 2302 + dev: true 2303 + 2304 + /@whatwg-node/node-fetch@0.3.6: 2305 + resolution: {integrity: sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==} 2306 + dependencies: 2307 + '@whatwg-node/events': 0.0.3 2308 + busboy: 1.6.0 2309 + fast-querystring: 1.1.2 2310 + fast-url-parser: 1.1.3 2311 + tslib: 2.5.0 2312 + dev: true 2313 + 2314 + /@whatwg-node/node-fetch@0.5.1: 2315 + resolution: {integrity: sha512-sQz/s3NyyzIZxQ7PHxDFUMM1k4kQQbi2jU8ILdTbt5+S59ME8aI7XF30O9qohRIIYdSrUvm/OwKQmVP1y6e2WQ==} 2316 + engines: {node: '>=16.0.0'} 2317 + dependencies: 2318 + '@whatwg-node/events': 0.1.1 2319 + busboy: 1.6.0 2320 + fast-querystring: 1.1.2 2321 + fast-url-parser: 1.1.3 2322 + tslib: 2.5.0 2323 + dev: true 2324 + 1491 2325 /acorn-walk@8.2.0: 1492 2326 resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 1493 2327 engines: {node: '>=0.4.0'} ··· 1505 2339 hasBin: true 1506 2340 dev: true 1507 2341 2342 + /agent-base@7.1.0: 2343 + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} 2344 + engines: {node: '>= 14'} 2345 + dependencies: 2346 + debug: 4.3.4 2347 + transitivePeerDependencies: 2348 + - supports-color 2349 + dev: true 2350 + 2351 + /aggregate-error@3.1.0: 2352 + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} 2353 + engines: {node: '>=8'} 2354 + dependencies: 2355 + clean-stack: 2.2.0 2356 + indent-string: 4.0.0 2357 + dev: true 2358 + 1508 2359 /ansi-colors@4.1.3: 1509 2360 resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 1510 2361 engines: {node: '>=6'} 2362 + dev: true 2363 + 2364 + /ansi-escapes@4.3.2: 2365 + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 2366 + engines: {node: '>=8'} 2367 + dependencies: 2368 + type-fest: 0.21.3 1511 2369 dev: true 1512 2370 1513 2371 /ansi-escapes@5.0.0: ··· 1548 2406 engines: {node: '>=12'} 1549 2407 dev: true 1550 2408 2409 + /arg@4.1.3: 2410 + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 2411 + dev: true 2412 + 1551 2413 /argparse@1.0.10: 1552 2414 resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 1553 2415 dependencies: 1554 2416 sprintf-js: 1.0.3 2417 + dev: true 2418 + 2419 + /argparse@2.0.1: 2420 + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 1555 2421 dev: true 1556 2422 1557 2423 /array-buffer-byte-length@1.0.0: ··· 1584 2450 /asap@2.0.6: 1585 2451 resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} 1586 2452 2453 + /asn1js@3.0.5: 2454 + resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} 2455 + engines: {node: '>=12.0.0'} 2456 + dependencies: 2457 + pvtsutils: 1.3.5 2458 + pvutils: 1.1.3 2459 + tslib: 2.6.2 2460 + dev: true 2461 + 1587 2462 /assertion-error@1.1.0: 1588 2463 resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 2464 + dev: true 2465 + 2466 + /astral-regex@2.0.0: 2467 + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} 2468 + engines: {node: '>=8'} 1589 2469 dev: true 1590 2470 1591 2471 /asynckit@0.4.0: ··· 1642 2522 1643 2523 /balanced-match@1.0.2: 1644 2524 resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 2525 + 2526 + /base64-js@1.5.1: 2527 + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 2528 + dev: true 1645 2529 1646 2530 /better-path-resolve@1.0.0: 1647 2531 resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} ··· 1650 2534 is-windows: 1.0.2 1651 2535 dev: true 1652 2536 2537 + /bl@4.1.0: 2538 + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 2539 + dependencies: 2540 + buffer: 5.7.1 2541 + inherits: 2.0.4 2542 + readable-stream: 3.6.2 2543 + dev: true 2544 + 1653 2545 /brace-expansion@1.1.11: 1654 2546 resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1655 2547 dependencies: ··· 1679 2571 node-releases: 2.0.6 1680 2572 update-browserslist-db: 1.0.10(browserslist@4.21.4) 1681 2573 2574 + /browserslist@4.22.1: 2575 + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} 2576 + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 2577 + hasBin: true 2578 + dependencies: 2579 + caniuse-lite: 1.0.30001564 2580 + electron-to-chromium: 1.4.593 2581 + node-releases: 2.0.13 2582 + update-browserslist-db: 1.0.13(browserslist@4.22.1) 2583 + dev: true 2584 + 1682 2585 /bser@2.1.1: 1683 2586 resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 1684 2587 dependencies: ··· 1688 2591 resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 1689 2592 dev: true 1690 2593 2594 + /buffer@5.7.1: 2595 + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 2596 + dependencies: 2597 + base64-js: 1.5.1 2598 + ieee754: 1.2.1 2599 + dev: true 2600 + 2601 + /busboy@1.6.0: 2602 + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 2603 + engines: {node: '>=10.16.0'} 2604 + dependencies: 2605 + streamsearch: 1.1.0 2606 + dev: true 2607 + 1691 2608 /cac@6.7.14: 1692 2609 resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 1693 2610 engines: {node: '>=8'} ··· 1700 2617 get-intrinsic: 1.2.0 1701 2618 dev: true 1702 2619 2620 + /call-bind@1.0.5: 2621 + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} 2622 + dependencies: 2623 + function-bind: 1.1.2 2624 + get-intrinsic: 1.2.2 2625 + set-function-length: 1.1.1 2626 + dev: true 2627 + 2628 + /callsites@3.1.0: 2629 + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 2630 + engines: {node: '>=6'} 2631 + dev: true 2632 + 1703 2633 /camel-case@4.1.2: 1704 2634 resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} 1705 2635 dependencies: ··· 1721 2651 1722 2652 /caniuse-lite@1.0.30001436: 1723 2653 resolution: {integrity: sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg==} 2654 + 2655 + /caniuse-lite@1.0.30001564: 2656 + resolution: {integrity: sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==} 2657 + dev: true 1724 2658 1725 2659 /capital-case@1.0.4: 1726 2660 resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} ··· 1805 2739 /ci-info@3.8.0: 1806 2740 resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} 1807 2741 engines: {node: '>=8'} 2742 + dev: true 2743 + 2744 + /clean-stack@2.2.0: 2745 + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} 2746 + engines: {node: '>=6'} 2747 + dev: true 2748 + 2749 + /cli-cursor@3.1.0: 2750 + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} 2751 + engines: {node: '>=8'} 2752 + dependencies: 2753 + restore-cursor: 3.1.0 1808 2754 dev: true 1809 2755 1810 2756 /cli-cursor@4.0.0: ··· 1814 2760 restore-cursor: 4.0.0 1815 2761 dev: true 1816 2762 2763 + /cli-spinners@2.9.1: 2764 + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} 2765 + engines: {node: '>=6'} 2766 + dev: true 2767 + 2768 + /cli-truncate@2.1.0: 2769 + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} 2770 + engines: {node: '>=8'} 2771 + dependencies: 2772 + slice-ansi: 3.0.0 2773 + string-width: 4.2.3 2774 + dev: true 2775 + 1817 2776 /cli-truncate@3.1.0: 1818 2777 resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} 1819 2778 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1820 2779 dependencies: 1821 2780 slice-ansi: 5.0.0 1822 2781 string-width: 5.1.2 2782 + dev: true 2783 + 2784 + /cli-width@3.0.0: 2785 + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} 2786 + engines: {node: '>= 10'} 1823 2787 dev: true 1824 2788 1825 2789 /cliui@6.0.0: ··· 1897 2861 /convert-source-map@1.9.0: 1898 2862 resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 1899 2863 2864 + /convert-source-map@2.0.0: 2865 + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 2866 + dev: true 2867 + 2868 + /cosmiconfig@8.3.6(typescript@5.0.4): 2869 + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} 2870 + engines: {node: '>=14'} 2871 + peerDependencies: 2872 + typescript: '>=4.9.5' 2873 + peerDependenciesMeta: 2874 + typescript: 2875 + optional: true 2876 + dependencies: 2877 + import-fresh: 3.3.0 2878 + js-yaml: 4.1.0 2879 + parse-json: 5.2.0 2880 + path-type: 4.0.0 2881 + typescript: 5.0.4 2882 + dev: true 2883 + 2884 + /create-require@1.1.1: 2885 + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 2886 + dev: true 2887 + 1900 2888 /cross-fetch@3.1.5: 1901 2889 resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} 1902 2890 dependencies: 1903 2891 node-fetch: 2.6.7 1904 2892 transitivePeerDependencies: 1905 2893 - encoding 2894 + 2895 + /cross-inspect@1.0.0: 2896 + resolution: {integrity: sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ==} 2897 + engines: {node: '>=16.0.0'} 2898 + dependencies: 2899 + tslib: 2.5.0 2900 + dev: true 1906 2901 1907 2902 /cross-spawn@5.1.0: 1908 2903 resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} ··· 1947 2942 resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} 1948 2943 dev: true 1949 2944 2945 + /dataloader@2.2.2: 2946 + resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} 2947 + dev: true 2948 + 2949 + /debounce@1.2.1: 2950 + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} 2951 + dev: true 2952 + 1950 2953 /debug@4.3.4: 1951 2954 resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1952 2955 engines: {node: '>=6.0'} ··· 1983 2986 clone: 1.0.4 1984 2987 dev: true 1985 2988 2989 + /define-data-property@1.1.1: 2990 + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} 2991 + engines: {node: '>= 0.4'} 2992 + dependencies: 2993 + get-intrinsic: 1.2.2 2994 + gopd: 1.0.1 2995 + has-property-descriptors: 1.0.0 2996 + dev: true 2997 + 1986 2998 /define-properties@1.2.0: 1987 2999 resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} 1988 3000 engines: {node: '>= 0.4'} ··· 2010 3022 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2011 3023 dev: true 2012 3024 3025 + /diff@4.0.2: 3026 + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 3027 + engines: {node: '>=0.3.1'} 3028 + dev: true 3029 + 2013 3030 /dir-glob@3.0.1: 2014 3031 resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 2015 3032 engines: {node: '>=8'} ··· 2028 3045 engines: {node: '>=12'} 2029 3046 dev: true 2030 3047 3048 + /dset@3.1.3: 3049 + resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} 3050 + engines: {node: '>=4'} 3051 + dev: true 3052 + 2031 3053 /eastasianwidth@0.2.0: 2032 3054 resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 2033 3055 dev: true 2034 3056 2035 3057 /electron-to-chromium@1.4.284: 2036 3058 resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} 3059 + 3060 + /electron-to-chromium@1.4.593: 3061 + resolution: {integrity: sha512-c7+Hhj87zWmdpmjDONbvNKNo24tvmD4mjal1+qqTYTrlF0/sNpAcDlU0Ki84ftA/5yj3BF2QhSGEC0Rky6larg==} 3062 + dev: true 2037 3063 2038 3064 /emoji-regex@8.0.0: 2039 3065 resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} ··· 2199 3225 tmp: 0.0.33 2200 3226 dev: true 2201 3227 3228 + /extract-files@11.0.0: 3229 + resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==} 3230 + engines: {node: ^12.20 || >= 14.13} 3231 + dev: true 3232 + 3233 + /fast-decode-uri-component@1.0.1: 3234 + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} 3235 + dev: true 3236 + 2202 3237 /fast-glob@3.2.11: 2203 3238 resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} 2204 3239 engines: {node: '>=8.6.0'} ··· 2210 3245 micromatch: 4.0.5 2211 3246 dev: true 2212 3247 3248 + /fast-querystring@1.1.2: 3249 + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} 3250 + dependencies: 3251 + fast-decode-uri-component: 1.0.1 3252 + dev: true 3253 + 3254 + /fast-url-parser@1.1.3: 3255 + resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} 3256 + dependencies: 3257 + punycode: 1.4.1 3258 + dev: true 3259 + 2213 3260 /fastq@1.13.0: 2214 3261 resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 2215 3262 dependencies: ··· 2236 3283 ua-parser-js: 0.7.32 2237 3284 transitivePeerDependencies: 2238 3285 - encoding 3286 + 3287 + /figures@3.2.0: 3288 + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} 3289 + engines: {node: '>=8'} 3290 + dependencies: 3291 + escape-string-regexp: 1.0.5 3292 + dev: true 2239 3293 2240 3294 /fill-range@7.0.1: 2241 3295 resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} ··· 2314 3368 resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 2315 3369 dev: true 2316 3370 3371 + /function-bind@1.1.2: 3372 + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 3373 + dev: true 3374 + 2317 3375 /function.prototype.name@1.1.5: 2318 3376 resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} 2319 3377 engines: {node: '>= 0.4'} ··· 2348 3406 has-symbols: 1.0.3 2349 3407 dev: true 2350 3408 3409 + /get-intrinsic@1.2.2: 3410 + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} 3411 + dependencies: 3412 + function-bind: 1.1.2 3413 + has-proto: 1.0.1 3414 + has-symbols: 1.0.3 3415 + hasown: 2.0.0 3416 + dev: true 3417 + 2351 3418 /get-stream@8.0.1: 2352 3419 resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} 2353 3420 engines: {node: '>=16'} ··· 2415 3482 resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} 2416 3483 dev: true 2417 3484 3485 + /graphql-config@5.0.3(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.0.4): 3486 + resolution: {integrity: sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ==} 3487 + engines: {node: '>= 16.0.0'} 3488 + peerDependencies: 3489 + cosmiconfig-toml-loader: ^1.0.0 3490 + graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 3491 + peerDependenciesMeta: 3492 + cosmiconfig-toml-loader: 3493 + optional: true 3494 + dependencies: 3495 + '@graphql-tools/graphql-file-loader': 8.0.0(graphql@16.8.1) 3496 + '@graphql-tools/json-file-loader': 8.0.0(graphql@16.8.1) 3497 + '@graphql-tools/load': 8.0.1(graphql@16.8.1) 3498 + '@graphql-tools/merge': 9.0.0(graphql@16.8.1) 3499 + '@graphql-tools/url-loader': 8.0.0(@types/node@18.15.11)(graphql@16.8.1) 3500 + '@graphql-tools/utils': 10.0.1(graphql@16.8.1) 3501 + cosmiconfig: 8.3.6(typescript@5.0.4) 3502 + graphql: 16.8.1 3503 + jiti: 1.21.0 3504 + minimatch: 4.2.3 3505 + string-env-interpolation: 1.0.1 3506 + tslib: 2.5.0 3507 + transitivePeerDependencies: 3508 + - '@types/node' 3509 + - bufferutil 3510 + - encoding 3511 + - typescript 3512 + - utf-8-validate 3513 + dev: true 3514 + 2418 3515 /graphql-language-service@5.2.0(graphql@16.8.1): 2419 3516 resolution: {integrity: sha512-o/ZgTS0pBxWm3hSF4+6GwiV1//DxzoLWEbS38+jqpzzy1d/QXBidwQuVYTOksclbtOJZ3KR/tZ8fi/tI6VpVMg==} 2420 3517 hasBin: true ··· 2425 3522 nullthrows: 1.1.1 2426 3523 vscode-languageserver-types: 3.17.2 2427 3524 3525 + /graphql-request@6.1.0(graphql@16.8.1): 3526 + resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} 3527 + peerDependencies: 3528 + graphql: 14 - 16 3529 + dependencies: 3530 + '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) 3531 + cross-fetch: 3.1.5 3532 + graphql: 16.8.1 3533 + transitivePeerDependencies: 3534 + - encoding 3535 + dev: true 3536 + 2428 3537 /graphql-tag@2.12.6(graphql@16.8.1): 2429 3538 resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} 2430 3539 engines: {node: '>=10'} ··· 2433 3542 dependencies: 2434 3543 graphql: 16.8.1 2435 3544 tslib: 2.5.0 3545 + 3546 + /graphql-ws@5.14.2(graphql@16.8.1): 3547 + resolution: {integrity: sha512-LycmCwhZ+Op2GlHz4BZDsUYHKRiiUz+3r9wbhBATMETNlORQJAaFlAgTFoeRh6xQoQegwYwIylVD1Qns9/DA3w==} 3548 + engines: {node: '>=10'} 3549 + peerDependencies: 3550 + graphql: '>=0.11 <=16' 3551 + dependencies: 3552 + graphql: 16.8.1 3553 + dev: true 2436 3554 2437 3555 /graphql@16.8.1: 2438 3556 resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==} ··· 2485 3603 function-bind: 1.1.1 2486 3604 dev: true 2487 3605 3606 + /hasown@2.0.0: 3607 + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} 3608 + engines: {node: '>= 0.4'} 3609 + dependencies: 3610 + function-bind: 1.1.2 3611 + dev: true 3612 + 2488 3613 /header-case@2.0.4: 2489 3614 resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} 2490 3615 dependencies: ··· 2495 3620 resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 2496 3621 dev: true 2497 3622 3623 + /http-proxy-agent@7.0.0: 3624 + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} 3625 + engines: {node: '>= 14'} 3626 + dependencies: 3627 + agent-base: 7.1.0 3628 + debug: 4.3.4 3629 + transitivePeerDependencies: 3630 + - supports-color 3631 + dev: true 3632 + 3633 + /https-proxy-agent@7.0.2: 3634 + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} 3635 + engines: {node: '>= 14'} 3636 + dependencies: 3637 + agent-base: 7.1.0 3638 + debug: 4.3.4 3639 + transitivePeerDependencies: 3640 + - supports-color 3641 + dev: true 3642 + 2498 3643 /human-id@1.0.2: 2499 3644 resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} 2500 3645 dev: true ··· 2517 3662 safer-buffer: 2.1.2 2518 3663 dev: true 2519 3664 3665 + /ieee754@1.2.1: 3666 + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 3667 + dev: true 3668 + 2520 3669 /ignore@5.2.0: 2521 3670 resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} 2522 3671 engines: {node: '>= 4'} ··· 2526 3675 resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==} 2527 3676 engines: {node: '>=0.8.0'} 2528 3677 3678 + /import-fresh@3.3.0: 3679 + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 3680 + engines: {node: '>=6'} 3681 + dependencies: 3682 + parent-module: 1.0.1 3683 + resolve-from: 4.0.0 3684 + dev: true 3685 + 2529 3686 /import-from@4.0.0: 2530 3687 resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} 2531 3688 engines: {node: '>=12.2'} ··· 2544 3701 /inherits@2.0.4: 2545 3702 resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 2546 3703 3704 + /inquirer@8.2.6: 3705 + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} 3706 + engines: {node: '>=12.0.0'} 3707 + dependencies: 3708 + ansi-escapes: 4.3.2 3709 + chalk: 4.1.2 3710 + cli-cursor: 3.1.0 3711 + cli-width: 3.0.0 3712 + external-editor: 3.1.0 3713 + figures: 3.2.0 3714 + lodash: 4.17.21 3715 + mute-stream: 0.0.8 3716 + ora: 5.4.1 3717 + run-async: 2.4.1 3718 + rxjs: 7.8.1 3719 + string-width: 4.2.3 3720 + strip-ansi: 6.0.1 3721 + through: 2.3.8 3722 + wrap-ansi: 6.2.0 3723 + dev: true 3724 + 2547 3725 /internal-slot@1.0.5: 2548 3726 resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} 2549 3727 engines: {node: '>= 0.4'} ··· 2637 3815 is-extglob: 2.1.1 2638 3816 dev: true 2639 3817 3818 + /is-interactive@1.0.0: 3819 + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} 3820 + engines: {node: '>=8'} 3821 + dev: true 3822 + 2640 3823 /is-lower-case@2.0.2: 2641 3824 resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} 2642 3825 dependencies: ··· 2727 3910 dependencies: 2728 3911 unc-path-regex: 0.1.2 2729 3912 3913 + /is-unicode-supported@0.1.0: 3914 + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 3915 + engines: {node: '>=10'} 3916 + dev: true 3917 + 2730 3918 /is-upper-case@2.0.2: 2731 3919 resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} 2732 3920 dependencies: ··· 2742 3930 resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 2743 3931 engines: {node: '>=0.10.0'} 2744 3932 3933 + /isarray@2.0.5: 3934 + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 3935 + dev: true 3936 + 2745 3937 /isexe@2.0.0: 2746 3938 resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 2747 3939 dev: true 2748 3940 3941 + /isomorphic-ws@5.0.0(ws@8.14.2): 3942 + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} 3943 + peerDependencies: 3944 + ws: '*' 3945 + dependencies: 3946 + ws: 8.14.2 3947 + dev: true 3948 + 3949 + /jiti@1.21.0: 3950 + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} 3951 + hasBin: true 3952 + dev: true 3953 + 3954 + /jose@5.1.1: 3955 + resolution: {integrity: sha512-bfB+lNxowY49LfrBO0ITUn93JbUhxUN8I11K6oI5hJu/G6PO6fEUddVLjqdD0cQ9SXIHWXuWh7eJYwZF7Z0N/g==} 3956 + dev: true 3957 + 2749 3958 /js-tokens@4.0.0: 2750 3959 resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 2751 3960 ··· 2757 3966 esprima: 4.0.1 2758 3967 dev: true 2759 3968 3969 + /js-yaml@4.1.0: 3970 + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 3971 + hasBin: true 3972 + dependencies: 3973 + argparse: 2.0.1 3974 + dev: true 3975 + 2760 3976 /jsesc@2.5.2: 2761 3977 resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 2762 3978 engines: {node: '>=4'} ··· 2766 3982 resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 2767 3983 dev: true 2768 3984 3985 + /json-stable-stringify@1.1.0: 3986 + resolution: {integrity: sha512-zfA+5SuwYN2VWqN1/5HZaDzQKLJHaBVMZIIM+wuYjdptkaQsqzDdqjqf+lZZJUuJq1aanHiY8LhH8LmH+qBYJA==} 3987 + engines: {node: '>= 0.4'} 3988 + dependencies: 3989 + call-bind: 1.0.5 3990 + isarray: 2.0.5 3991 + jsonify: 0.0.1 3992 + object-keys: 1.1.1 3993 + dev: true 3994 + 3995 + /json-to-pretty-yaml@1.2.2: 3996 + resolution: {integrity: sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==} 3997 + engines: {node: '>= 0.2.0'} 3998 + dependencies: 3999 + remedial: 1.0.8 4000 + remove-trailing-spaces: 1.0.8 4001 + dev: true 4002 + 2769 4003 /json5@2.2.1: 2770 4004 resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} 2771 4005 engines: {node: '>=6'} 2772 4006 hasBin: true 2773 4007 4008 + /json5@2.2.3: 4009 + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 4010 + engines: {node: '>=6'} 4011 + hasBin: true 4012 + dev: true 4013 + 2774 4014 /jsonc-parser@3.2.0: 2775 4015 resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} 2776 4016 dev: true ··· 2779 4019 resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 2780 4020 optionalDependencies: 2781 4021 graceful-fs: 4.2.11 4022 + dev: true 4023 + 4024 + /jsonify@0.0.1: 4025 + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} 2782 4026 dev: true 2783 4027 2784 4028 /kind-of@6.0.3: ··· 2819 4063 - supports-color 2820 4064 dev: true 2821 4065 4066 + /listr2@4.0.5: 4067 + resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} 4068 + engines: {node: '>=12'} 4069 + peerDependencies: 4070 + enquirer: '>= 2.3.0 < 3' 4071 + peerDependenciesMeta: 4072 + enquirer: 4073 + optional: true 4074 + dependencies: 4075 + cli-truncate: 2.1.0 4076 + colorette: 2.0.20 4077 + log-update: 4.0.0 4078 + p-map: 4.0.0 4079 + rfdc: 1.3.0 4080 + rxjs: 7.8.1 4081 + through: 2.3.8 4082 + wrap-ansi: 7.0.0 4083 + dev: true 4084 + 2822 4085 /listr2@7.0.1: 2823 4086 resolution: {integrity: sha512-nz+7hwgbDp8eWNoDgzdl4hA/xDSLrNRzPu1TLgOYs6l5Y+Ma6zVWWy9Oyt9TQFONwKoSPoka3H50D3vD5EuNwg==} 2824 4087 engines: {node: '>=16.0.0'} ··· 2859 4122 p-locate: 5.0.0 2860 4123 dev: true 2861 4124 4125 + /lodash.sortby@4.7.0: 4126 + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 4127 + dev: true 4128 + 2862 4129 /lodash.startcase@4.4.0: 2863 4130 resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 2864 4131 dev: true ··· 2866 4133 /lodash@4.17.21: 2867 4134 resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 2868 4135 4136 + /log-symbols@4.1.0: 4137 + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 4138 + engines: {node: '>=10'} 4139 + dependencies: 4140 + chalk: 4.1.2 4141 + is-unicode-supported: 0.1.0 4142 + dev: true 4143 + 4144 + /log-update@4.0.0: 4145 + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} 4146 + engines: {node: '>=10'} 4147 + dependencies: 4148 + ansi-escapes: 4.3.2 4149 + cli-cursor: 3.1.0 4150 + slice-ansi: 4.0.0 4151 + wrap-ansi: 6.2.0 4152 + dev: true 4153 + 2869 4154 /log-update@5.0.1: 2870 4155 resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} 2871 4156 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} ··· 2910 4195 yallist: 2.1.2 2911 4196 dev: true 2912 4197 4198 + /lru-cache@5.1.1: 4199 + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 4200 + dependencies: 4201 + yallist: 3.1.1 4202 + dev: true 4203 + 2913 4204 /lru-cache@6.0.0: 2914 4205 resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 2915 4206 engines: {node: '>=10'} ··· 2922 4213 engines: {node: '>=12'} 2923 4214 dependencies: 2924 4215 '@jridgewell/sourcemap-codec': 1.4.15 4216 + dev: true 4217 + 4218 + /make-error@1.3.6: 4219 + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 2925 4220 dev: true 2926 4221 2927 4222 /map-cache@0.2.2: ··· 2964 4259 engines: {node: '>= 8'} 2965 4260 dev: true 2966 4261 4262 + /meros@1.3.0(@types/node@18.15.11): 4263 + resolution: {integrity: sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==} 4264 + engines: {node: '>=13'} 4265 + peerDependencies: 4266 + '@types/node': '>=13' 4267 + peerDependenciesMeta: 4268 + '@types/node': 4269 + optional: true 4270 + dependencies: 4271 + '@types/node': 18.15.11 4272 + dev: true 4273 + 2967 4274 /micromatch@4.0.5: 2968 4275 resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 2969 4276 engines: {node: '>=8.6'} ··· 3004 4311 dependencies: 3005 4312 brace-expansion: 1.1.11 3006 4313 4314 + /minimatch@4.2.3: 4315 + resolution: {integrity: sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng==} 4316 + engines: {node: '>=10'} 4317 + dependencies: 4318 + brace-expansion: 1.1.11 4319 + dev: true 4320 + 3007 4321 /minimist-options@4.1.0: 3008 4322 resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} 3009 4323 engines: {node: '>= 6'} ··· 3030 4344 /ms@2.1.2: 3031 4345 resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 3032 4346 4347 + /mute-stream@0.0.8: 4348 + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} 4349 + dev: true 4350 + 3033 4351 /nanoid@3.3.6: 3034 4352 resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 3035 4353 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} ··· 3055 4373 3056 4374 /node-int64@0.4.0: 3057 4375 resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 4376 + 4377 + /node-releases@2.0.13: 4378 + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} 4379 + dev: true 3058 4380 3059 4381 /node-releases@2.0.6: 3060 4382 resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} ··· 3068 4390 validate-npm-package-license: 3.0.4 3069 4391 dev: true 3070 4392 4393 + /normalize-path@2.1.1: 4394 + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} 4395 + engines: {node: '>=0.10.0'} 4396 + dependencies: 4397 + remove-trailing-separator: 1.1.0 4398 + dev: true 4399 + 3071 4400 /npm-run-path@5.1.0: 3072 4401 resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} 3073 4402 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} ··· 3120 4449 mimic-fn: 4.0.0 3121 4450 dev: true 3122 4451 4452 + /ora@5.4.1: 4453 + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} 4454 + engines: {node: '>=10'} 4455 + dependencies: 4456 + bl: 4.1.0 4457 + chalk: 4.1.2 4458 + cli-cursor: 3.1.0 4459 + cli-spinners: 2.9.1 4460 + is-interactive: 1.0.0 4461 + is-unicode-supported: 0.1.0 4462 + log-symbols: 4.1.0 4463 + strip-ansi: 6.0.1 4464 + wcwidth: 1.0.1 4465 + dev: true 4466 + 3123 4467 /os-tmpdir@1.0.2: 3124 4468 resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 3125 4469 engines: {node: '>=0.10.0'} ··· 3174 4518 engines: {node: '>=6'} 3175 4519 dev: true 3176 4520 4521 + /p-map@4.0.0: 4522 + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} 4523 + engines: {node: '>=10'} 4524 + dependencies: 4525 + aggregate-error: 3.1.0 4526 + dev: true 4527 + 3177 4528 /p-try@2.2.0: 3178 4529 resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 3179 4530 engines: {node: '>=6'} ··· 3183 4534 dependencies: 3184 4535 dot-case: 3.0.4 3185 4536 tslib: 2.5.0 4537 + 4538 + /parent-module@1.0.1: 4539 + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 4540 + engines: {node: '>=6'} 4541 + dependencies: 4542 + callsites: 3.1.0 4543 + dev: true 3186 4544 3187 4545 /parse-filepath@1.0.2: 3188 4546 resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} ··· 3336 4694 resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} 3337 4695 dev: true 3338 4696 4697 + /punycode@1.4.1: 4698 + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} 4699 + dev: true 4700 + 4701 + /pvtsutils@1.3.5: 4702 + resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} 4703 + dependencies: 4704 + tslib: 2.6.2 4705 + dev: true 4706 + 4707 + /pvutils@1.1.3: 4708 + resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} 4709 + engines: {node: '>=6.0.0'} 4710 + dev: true 4711 + 3339 4712 /queue-microtask@1.2.3: 3340 4713 resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 3341 4714 dev: true ··· 3384 4757 strip-bom: 3.0.0 3385 4758 dev: true 3386 4759 4760 + /readable-stream@3.6.2: 4761 + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 4762 + engines: {node: '>= 6'} 4763 + dependencies: 4764 + inherits: 2.0.4 4765 + string_decoder: 1.3.0 4766 + util-deprecate: 1.0.2 4767 + dev: true 4768 + 3387 4769 /redent@3.0.0: 3388 4770 resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 3389 4771 engines: {node: '>=8'} ··· 3413 4795 transitivePeerDependencies: 3414 4796 - encoding 3415 4797 4798 + /remedial@1.0.8: 4799 + resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==} 4800 + dev: true 4801 + 4802 + /remove-trailing-separator@1.1.0: 4803 + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} 4804 + dev: true 4805 + 4806 + /remove-trailing-spaces@1.0.8: 4807 + resolution: {integrity: sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA==} 4808 + dev: true 4809 + 3416 4810 /require-directory@2.1.1: 3417 4811 resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 3418 4812 engines: {node: '>=0.10.0'} ··· 3420 4814 /require-main-filename@2.0.0: 3421 4815 resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} 3422 4816 4817 + /resolve-from@4.0.0: 4818 + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 4819 + engines: {node: '>=4'} 4820 + dev: true 4821 + 3423 4822 /resolve-from@5.0.0: 3424 4823 resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 3425 4824 engines: {node: '>=8'} ··· 3432 4831 is-core-module: 2.12.0 3433 4832 path-parse: 1.0.7 3434 4833 supports-preserve-symlinks-flag: 1.0.0 4834 + dev: true 4835 + 4836 + /restore-cursor@3.1.0: 4837 + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} 4838 + engines: {node: '>=8'} 4839 + dependencies: 4840 + onetime: 5.1.2 4841 + signal-exit: 3.0.7 3435 4842 dev: true 3436 4843 3437 4844 /restore-cursor@4.0.0: ··· 3459 4866 fsevents: 2.3.2 3460 4867 dev: true 3461 4868 4869 + /run-async@2.4.1: 4870 + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} 4871 + engines: {node: '>=0.12.0'} 4872 + dev: true 4873 + 3462 4874 /run-parallel@1.2.0: 3463 4875 resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 3464 4876 dependencies: 3465 4877 queue-microtask: 1.2.3 4878 + dev: true 4879 + 4880 + /rxjs@7.8.1: 4881 + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} 4882 + dependencies: 4883 + tslib: 2.5.0 3466 4884 dev: true 3467 4885 3468 4886 /safe-buffer@5.2.1: ··· 3479 4897 3480 4898 /safer-buffer@2.1.2: 3481 4899 resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 4900 + dev: true 4901 + 4902 + /scuid@1.1.0: 4903 + resolution: {integrity: sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==} 3482 4904 dev: true 3483 4905 3484 4906 /semver@5.7.1: ··· 3490 4912 resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 3491 4913 hasBin: true 3492 4914 4915 + /semver@6.3.1: 4916 + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 4917 + hasBin: true 4918 + dev: true 4919 + 3493 4920 /semver@7.5.4: 3494 4921 resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 3495 4922 engines: {node: '>=10'} ··· 3514 4941 /set-blocking@2.0.0: 3515 4942 resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 3516 4943 4944 + /set-function-length@1.1.1: 4945 + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} 4946 + engines: {node: '>= 0.4'} 4947 + dependencies: 4948 + define-data-property: 1.1.1 4949 + get-intrinsic: 1.2.2 4950 + gopd: 1.0.1 4951 + has-property-descriptors: 1.0.0 4952 + dev: true 4953 + 3517 4954 /setimmediate@1.0.5: 3518 4955 resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} 3519 4956 ··· 3539 4976 /shebang-regex@3.0.0: 3540 4977 resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 3541 4978 engines: {node: '>=8'} 4979 + dev: true 4980 + 4981 + /shell-quote@1.8.1: 4982 + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} 3542 4983 dev: true 3543 4984 3544 4985 /side-channel@1.0.4: ··· 3570 5011 engines: {node: '>=8'} 3571 5012 dev: true 3572 5013 5014 + /slice-ansi@3.0.0: 5015 + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} 5016 + engines: {node: '>=8'} 5017 + dependencies: 5018 + ansi-styles: 4.3.0 5019 + astral-regex: 2.0.0 5020 + is-fullwidth-code-point: 3.0.0 5021 + dev: true 5022 + 5023 + /slice-ansi@4.0.0: 5024 + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} 5025 + engines: {node: '>=10'} 5026 + dependencies: 5027 + ansi-styles: 4.3.0 5028 + astral-regex: 2.0.0 5029 + is-fullwidth-code-point: 3.0.0 5030 + dev: true 5031 + 3573 5032 /slice-ansi@5.0.0: 3574 5033 resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} 3575 5034 engines: {node: '>=12'} ··· 3670 5129 mixme: 0.5.9 3671 5130 dev: true 3672 5131 5132 + /streamsearch@1.1.0: 5133 + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 5134 + engines: {node: '>=10.0.0'} 5135 + dev: true 5136 + 3673 5137 /string-argv@0.3.2: 3674 5138 resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} 3675 5139 engines: {node: '>=0.6.19'} 5140 + dev: true 5141 + 5142 + /string-env-interpolation@1.0.1: 5143 + resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==} 3676 5144 dev: true 3677 5145 3678 5146 /string-width@4.2.3: ··· 3717 5185 es-abstract: 1.21.2 3718 5186 dev: true 3719 5187 5188 + /string_decoder@1.3.0: 5189 + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 5190 + dependencies: 5191 + safe-buffer: 5.2.1 5192 + dev: true 5193 + 3720 5194 /strip-ansi@6.0.1: 3721 5195 resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 3722 5196 engines: {node: '>=8'} ··· 3791 5265 source-map-support: 0.5.21 3792 5266 dev: true 3793 5267 5268 + /through@2.3.8: 5269 + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 5270 + dev: true 5271 + 3794 5272 /tinybench@2.5.1: 3795 5273 resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} 3796 5274 dev: true ··· 3836 5314 engines: {node: '>=8'} 3837 5315 dev: true 3838 5316 5317 + /ts-log@2.2.5: 5318 + resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==} 5319 + dev: true 5320 + 5321 + /ts-node@10.9.1(@types/node@18.15.11)(typescript@5.0.4): 5322 + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} 5323 + hasBin: true 5324 + peerDependencies: 5325 + '@swc/core': '>=1.2.50' 5326 + '@swc/wasm': '>=1.2.50' 5327 + '@types/node': '*' 5328 + typescript: '>=2.7' 5329 + peerDependenciesMeta: 5330 + '@swc/core': 5331 + optional: true 5332 + '@swc/wasm': 5333 + optional: true 5334 + dependencies: 5335 + '@cspotcode/source-map-support': 0.8.1 5336 + '@tsconfig/node10': 1.0.9 5337 + '@tsconfig/node12': 1.0.11 5338 + '@tsconfig/node14': 1.0.3 5339 + '@tsconfig/node16': 1.0.4 5340 + '@types/node': 18.15.11 5341 + acorn: 8.11.2 5342 + acorn-walk: 8.2.0 5343 + arg: 4.1.3 5344 + create-require: 1.1.1 5345 + diff: 4.0.2 5346 + make-error: 1.3.6 5347 + typescript: 5.0.4 5348 + v8-compile-cache-lib: 3.0.1 5349 + yn: 3.1.1 5350 + dev: true 5351 + 3839 5352 /tslib@2.5.0: 3840 5353 resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} 5354 + 5355 + /tslib@2.6.2: 5356 + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 5357 + dev: true 3841 5358 3842 5359 /tty-table@4.2.1: 3843 5360 resolution: {integrity: sha512-xz0uKo+KakCQ+Dxj1D/tKn2FSyreSYWzdkL/BYhgN6oMW808g8QRMuh1atAV9fjTPbWBjfbkKQpI/5rEcnAc7g==} ··· 3860 5377 3861 5378 /type-fest@0.13.1: 3862 5379 resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} 5380 + engines: {node: '>=10'} 5381 + dev: true 5382 + 5383 + /type-fest@0.21.3: 5384 + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 3863 5385 engines: {node: '>=10'} 3864 5386 dev: true 3865 5387 ··· 3917 5439 engines: {node: '>= 4.0.0'} 3918 5440 dev: true 3919 5441 5442 + /unixify@1.0.0: 5443 + resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} 5444 + engines: {node: '>=0.10.0'} 5445 + dependencies: 5446 + normalize-path: 2.1.1 5447 + dev: true 5448 + 3920 5449 /update-browserslist-db@1.0.10(browserslist@4.21.4): 3921 5450 resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} 3922 5451 hasBin: true ··· 3927 5456 escalade: 3.1.1 3928 5457 picocolors: 1.0.0 3929 5458 5459 + /update-browserslist-db@1.0.13(browserslist@4.22.1): 5460 + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 5461 + hasBin: true 5462 + peerDependencies: 5463 + browserslist: '>= 4.21.0' 5464 + dependencies: 5465 + browserslist: 4.22.1 5466 + escalade: 3.1.1 5467 + picocolors: 1.0.0 5468 + dev: true 5469 + 3930 5470 /upper-case-first@2.0.2: 3931 5471 resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} 3932 5472 dependencies: ··· 3937 5477 dependencies: 3938 5478 tslib: 2.5.0 3939 5479 5480 + /urlpattern-polyfill@8.0.2: 5481 + resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} 5482 + dev: true 5483 + 5484 + /urlpattern-polyfill@9.0.0: 5485 + resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} 5486 + dev: true 5487 + 5488 + /util-deprecate@1.0.2: 5489 + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 5490 + dev: true 5491 + 5492 + /v8-compile-cache-lib@3.0.1: 5493 + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 5494 + dev: true 5495 + 3940 5496 /validate-npm-package-license@3.0.4: 3941 5497 resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 3942 5498 dependencies: ··· 4076 5632 defaults: 1.0.4 4077 5633 dev: true 4078 5634 5635 + /web-streams-polyfill@3.2.1: 5636 + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} 5637 + engines: {node: '>= 8'} 5638 + dev: true 5639 + 5640 + /webcrypto-core@1.7.7: 5641 + resolution: {integrity: sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==} 5642 + dependencies: 5643 + '@peculiar/asn1-schema': 2.3.8 5644 + '@peculiar/json-schema': 1.1.12 5645 + asn1js: 3.0.5 5646 + pvtsutils: 1.3.5 5647 + tslib: 2.5.0 5648 + dev: true 5649 + 4079 5650 /webidl-conversions@3.0.1: 4080 5651 resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 4081 5652 ··· 4175 5746 /wrappy@1.0.2: 4176 5747 resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 4177 5748 5749 + /ws@8.14.2: 5750 + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} 5751 + engines: {node: '>=10.0.0'} 5752 + peerDependencies: 5753 + bufferutil: ^4.0.1 5754 + utf-8-validate: '>=5.0.2' 5755 + peerDependenciesMeta: 5756 + bufferutil: 5757 + optional: true 5758 + utf-8-validate: 5759 + optional: true 5760 + dev: true 5761 + 4178 5762 /y18n@4.0.3: 4179 5763 resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} 4180 5764 ··· 4187 5771 resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} 4188 5772 dev: true 4189 5773 5774 + /yallist@3.1.1: 5775 + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 5776 + dev: true 5777 + 4190 5778 /yallist@4.0.0: 4191 5779 resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 5780 + dev: true 5781 + 5782 + /yaml-ast-parser@0.0.43: 5783 + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} 4192 5784 dev: true 4193 5785 4194 5786 /yaml@2.3.2: ··· 4235 5827 string-width: 4.2.3 4236 5828 y18n: 5.0.8 4237 5829 yargs-parser: 21.1.1 5830 + dev: true 5831 + 5832 + /yn@3.1.1: 5833 + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 5834 + engines: {node: '>=6'} 4238 5835 dev: true 4239 5836 4240 5837 /yocto-queue@0.1.0:
+402
test/e2e/client-preset.test.ts
··· 1 + import { expect, afterAll, beforeAll, it, describe } from 'vitest'; 2 + import { TSServer } from './server'; 3 + import path from 'node:path'; 4 + import fs from 'node:fs'; 5 + import url from 'node:url'; 6 + import ts from 'typescript/lib/tsserverlibrary'; 7 + 8 + const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); 9 + 10 + const projectPath = path.resolve(__dirname, 'fixture-project-client-preset'); 11 + describe('Fragment + operations', () => { 12 + const outfileCombo = path.join(projectPath, 'simple.ts'); 13 + const outfileCombinations = path.join(projectPath, 'fragment.ts'); 14 + const outfileGql = path.join(projectPath, 'gql', 'gql.ts'); 15 + const outfileGraphql = path.join(projectPath, 'gql', 'graphql.ts'); 16 + 17 + let server: TSServer; 18 + beforeAll(async () => { 19 + server = new TSServer(projectPath, { debugLog: false }); 20 + 21 + server.sendCommand('open', { 22 + file: outfileCombo, 23 + fileContent: '// empty', 24 + scriptKindName: 'TS', 25 + } satisfies ts.server.protocol.OpenRequestArgs); 26 + server.sendCommand('open', { 27 + file: outfileCombinations, 28 + fileContent: '// empty', 29 + scriptKindName: 'TS', 30 + } satisfies ts.server.protocol.OpenRequestArgs); 31 + server.sendCommand('open', { 32 + file: outfileGql, 33 + fileContent: '// empty', 34 + scriptKindName: 'TS', 35 + } satisfies ts.server.protocol.OpenRequestArgs); 36 + server.sendCommand('open', { 37 + file: outfileGraphql, 38 + fileContent: '// empty', 39 + scriptKindName: 'TS', 40 + } satisfies ts.server.protocol.OpenRequestArgs); 41 + 42 + server.sendCommand('updateOpen', { 43 + openFiles: [ 44 + { 45 + file: outfileGraphql, 46 + fileContent: fs.readFileSync( 47 + path.join(projectPath, 'fixtures/gql/graphql.ts'), 48 + 'utf-8' 49 + ), 50 + }, 51 + { 52 + file: outfileGql, 53 + fileContent: fs.readFileSync( 54 + path.join(projectPath, 'fixtures/gql/gql.ts'), 55 + 'utf-8' 56 + ), 57 + }, 58 + { 59 + file: outfileCombinations, 60 + fileContent: fs.readFileSync( 61 + path.join(projectPath, 'fixtures/fragment.ts'), 62 + 'utf-8' 63 + ), 64 + }, 65 + { 66 + file: outfileCombo, 67 + fileContent: fs.readFileSync( 68 + path.join(projectPath, 'fixtures/simple.ts'), 69 + 'utf-8' 70 + ), 71 + }, 72 + ], 73 + } satisfies ts.server.protocol.UpdateOpenRequestArgs); 74 + 75 + server.sendCommand('saveto', { 76 + file: outfileGraphql, 77 + tmpfile: outfileGraphql, 78 + } satisfies ts.server.protocol.SavetoRequestArgs); 79 + server.sendCommand('saveto', { 80 + file: outfileGql, 81 + tmpfile: outfileGql, 82 + } satisfies ts.server.protocol.SavetoRequestArgs); 83 + server.sendCommand('saveto', { 84 + file: outfileCombo, 85 + tmpfile: outfileCombo, 86 + } satisfies ts.server.protocol.SavetoRequestArgs); 87 + server.sendCommand('saveto', { 88 + file: outfileCombinations, 89 + tmpfile: outfileCombinations, 90 + } satisfies ts.server.protocol.SavetoRequestArgs); 91 + }); 92 + 93 + afterAll(() => { 94 + try { 95 + fs.unlinkSync(outfileCombinations); 96 + fs.unlinkSync(outfileCombo); 97 + fs.unlinkSync(outfileGql); 98 + fs.unlinkSync(outfileGraphql); 99 + } catch {} 100 + }); 101 + 102 + it('gives semantic-diagnostics with preceding fragments', async () => { 103 + await server.waitForResponse( 104 + e => e.type === 'event' && e.event === 'semanticDiag' 105 + ); 106 + const res = server.responses.filter( 107 + resp => resp.type === 'event' && resp.event === 'semanticDiag' 108 + ); 109 + expect(res[0].body.diagnostics).toMatchInlineSnapshot(` 110 + [ 111 + { 112 + "category": "warning", 113 + "code": 52004, 114 + "end": { 115 + "line": 10, 116 + "offset": 1, 117 + }, 118 + "start": { 119 + "line": 9, 120 + "offset": 7, 121 + }, 122 + "text": "The field Pokemon.classification is deprecated. And this is the reason why", 123 + }, 124 + ] 125 + `); 126 + }, 30000); 127 + 128 + it('gives quick-info with preceding fragments', async () => { 129 + server.send({ 130 + seq: 9, 131 + type: 'request', 132 + command: 'quickinfo', 133 + arguments: { 134 + file: outfileCombinations, 135 + line: 6, 136 + offset: 8, 137 + }, 138 + }); 139 + 140 + await server.waitForResponse( 141 + response => 142 + response.type === 'response' && response.command === 'quickinfo' 143 + ); 144 + 145 + const res = server.responses 146 + .reverse() 147 + .find(resp => resp.type === 'response' && resp.command === 'quickinfo'); 148 + 149 + expect(res).toBeDefined(); 150 + expect(typeof res?.body).toEqual('object'); 151 + expect(res?.body.displayString).toEqual(`Pokemon.name: String!`); 152 + }, 30000); 153 + 154 + it('gives quick-info with documents', async () => { 155 + server.send({ 156 + seq: 9, 157 + type: 'request', 158 + command: 'quickinfo', 159 + arguments: { 160 + file: outfileCombo, 161 + line: 5, 162 + offset: 10, 163 + }, 164 + }); 165 + 166 + await server.waitForResponse( 167 + response => 168 + response.type === 'response' && response.command === 'quickinfo' 169 + ); 170 + 171 + const res = server.responses 172 + .reverse() 173 + .find(resp => resp.type === 'response' && resp.command === 'quickinfo'); 174 + 175 + expect(res).toBeDefined(); 176 + expect(typeof res?.body).toEqual('object'); 177 + expect(res?.body.displayString).toEqual( 178 + `Query.pokemons: [Pokemon] 179 + 180 + List out all Pokémon, optionally in pages` 181 + ); 182 + }, 30000); 183 + 184 + it('gives suggestions with preceding fragments', async () => { 185 + server.send({ 186 + seq: 10, 187 + type: 'request', 188 + command: 'completionInfo', 189 + arguments: { 190 + file: outfileCombinations, 191 + line: 8, 192 + offset: 5, 193 + includeExternalModuleExports: true, 194 + includeInsertTextCompletions: true, 195 + triggerKind: 1, 196 + }, 197 + }); 198 + 199 + await server.waitForResponse( 200 + response => 201 + response.type === 'response' && response.command === 'completionInfo' 202 + ); 203 + 204 + const res = server.responses 205 + .reverse() 206 + .find( 207 + resp => resp.type === 'response' && resp.command === 'completionInfo' 208 + ); 209 + 210 + expect(res).toBeDefined(); 211 + expect(typeof res?.body.entries).toEqual('object'); 212 + expect(res?.body.entries).toMatchInlineSnapshot(` 213 + [ 214 + { 215 + "kind": "var", 216 + "kindModifiers": "declare", 217 + "labelDetails": { 218 + "detail": " AttacksConnection", 219 + }, 220 + "name": "attacks", 221 + "sortText": "0attacks", 222 + }, 223 + { 224 + "kind": "var", 225 + "kindModifiers": "declare", 226 + "labelDetails": { 227 + "detail": " [EvolutionRequirement]", 228 + }, 229 + "name": "evolutionRequirements", 230 + "sortText": "2evolutionRequirements", 231 + }, 232 + { 233 + "kind": "var", 234 + "kindModifiers": "declare", 235 + "labelDetails": { 236 + "detail": " [Pokemon]", 237 + }, 238 + "name": "evolutions", 239 + "sortText": "3evolutions", 240 + }, 241 + { 242 + "kind": "var", 243 + "kindModifiers": "declare", 244 + "labelDetails": { 245 + "description": "Likelihood of an attempt to catch a Pokémon to fail.", 246 + "detail": " Float", 247 + }, 248 + "name": "fleeRate", 249 + "sortText": "4fleeRate", 250 + }, 251 + { 252 + "kind": "var", 253 + "kindModifiers": "declare", 254 + "labelDetails": { 255 + "detail": " PokemonDimension", 256 + }, 257 + "name": "height", 258 + "sortText": "5height", 259 + }, 260 + { 261 + "kind": "var", 262 + "kindModifiers": "declare", 263 + "labelDetails": { 264 + "detail": " ID!", 265 + }, 266 + "name": "id", 267 + "sortText": "6id", 268 + }, 269 + { 270 + "kind": "var", 271 + "kindModifiers": "declare", 272 + "labelDetails": { 273 + "description": "Maximum combat power a Pokémon may achieve at max level.", 274 + "detail": " Int", 275 + }, 276 + "name": "maxCP", 277 + "sortText": "7maxCP", 278 + }, 279 + { 280 + "kind": "var", 281 + "kindModifiers": "declare", 282 + "labelDetails": { 283 + "description": "Maximum health points a Pokémon may achieve at max level.", 284 + "detail": " Int", 285 + }, 286 + "name": "maxHP", 287 + "sortText": "8maxHP", 288 + }, 289 + { 290 + "kind": "var", 291 + "kindModifiers": "declare", 292 + "labelDetails": { 293 + "detail": " String!", 294 + }, 295 + "name": "name", 296 + "sortText": "9name", 297 + }, 298 + { 299 + "kind": "var", 300 + "kindModifiers": "declare", 301 + "labelDetails": { 302 + "detail": " [PokemonType]", 303 + }, 304 + "name": "resistant", 305 + "sortText": "10resistant", 306 + }, 307 + { 308 + "kind": "var", 309 + "kindModifiers": "declare", 310 + "labelDetails": { 311 + "detail": " [PokemonType]", 312 + }, 313 + "name": "types", 314 + "sortText": "11types", 315 + }, 316 + { 317 + "kind": "var", 318 + "kindModifiers": "declare", 319 + "labelDetails": { 320 + "detail": " [PokemonType]", 321 + }, 322 + "name": "weaknesses", 323 + "sortText": "12weaknesses", 324 + }, 325 + { 326 + "kind": "var", 327 + "kindModifiers": "declare", 328 + "labelDetails": { 329 + "detail": " PokemonDimension", 330 + }, 331 + "name": "weight", 332 + "sortText": "13weight", 333 + }, 334 + { 335 + "kind": "var", 336 + "kindModifiers": "declare", 337 + "labelDetails": { 338 + "description": "The name of the current Object type at runtime.", 339 + "detail": " String!", 340 + }, 341 + "name": "__typename", 342 + "sortText": "14__typename", 343 + }, 344 + { 345 + "kind": "string", 346 + "kindModifiers": "", 347 + "name": " 348 + fragment pokemonFields on Pokemon { 349 + id 350 + name 351 + attacks { 352 + fast { 353 + damage 354 + name 355 + } 356 + } 357 + } 358 + ", 359 + "replacementSpan": { 360 + "end": { 361 + "line": 10, 362 + "offset": 1, 363 + }, 364 + "start": { 365 + "line": 3, 366 + "offset": 39, 367 + }, 368 + }, 369 + "sortText": "11", 370 + }, 371 + { 372 + "kind": "string", 373 + "kindModifiers": "", 374 + "name": " 375 + query Pok($limit: Int!) { 376 + pokemons(limit: $limit) { 377 + id 378 + name 379 + fleeRate 380 + classification 381 + ...pokemonFields 382 + ...weaknessFields 383 + __typename 384 + } 385 + } 386 + ", 387 + "replacementSpan": { 388 + "end": { 389 + "line": 10, 390 + "offset": 1, 391 + }, 392 + "start": { 393 + "line": 3, 394 + "offset": 39, 395 + }, 396 + }, 397 + "sortText": "11", 398 + }, 399 + ] 400 + `); 401 + }, 30000); 402 + });
+3
test/e2e/fixture-project-client-preset/.vscode/settings.json
··· 1 + { 2 + "typescript.tsdk": "node_modules/typescript/lib" 3 + }
+115
test/e2e/fixture-project-client-preset/__generated__/baseGraphQLSP.ts
··· 1 + export type Maybe<T> = T | null; 2 + export type InputMaybe<T> = Maybe<T>; 3 + export type Exact<T extends { [key: string]: unknown }> = { 4 + [K in keyof T]: T[K]; 5 + }; 6 + export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { 7 + [SubKey in K]?: Maybe<T[SubKey]>; 8 + }; 9 + export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { 10 + [SubKey in K]: Maybe<T[SubKey]>; 11 + }; 12 + export type MakeEmpty< 13 + T extends { [key: string]: unknown }, 14 + K extends keyof T 15 + > = { [_ in K]?: never }; 16 + export type Incremental<T> = 17 + | T 18 + | { 19 + [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never; 20 + }; 21 + /** All built-in and custom scalars, mapped to their actual values */ 22 + export type Scalars = { 23 + ID: { input: string; output: string }; 24 + String: { input: string; output: string }; 25 + Boolean: { input: boolean; output: boolean }; 26 + Int: { input: number; output: number }; 27 + Float: { input: number; output: number }; 28 + }; 29 + 30 + /** Move a Pokémon can perform with the associated damage and type. */ 31 + export type Attack = { 32 + __typename: 'Attack'; 33 + damage?: Maybe<Scalars['Int']['output']>; 34 + name?: Maybe<Scalars['String']['output']>; 35 + type?: Maybe<PokemonType>; 36 + }; 37 + 38 + export type AttacksConnection = { 39 + __typename: 'AttacksConnection'; 40 + fast?: Maybe<Array<Maybe<Attack>>>; 41 + special?: Maybe<Array<Maybe<Attack>>>; 42 + }; 43 + 44 + /** Requirement that prevents an evolution through regular means of levelling up. */ 45 + export type EvolutionRequirement = { 46 + __typename: 'EvolutionRequirement'; 47 + amount?: Maybe<Scalars['Int']['output']>; 48 + name?: Maybe<Scalars['String']['output']>; 49 + }; 50 + 51 + export type Pokemon = { 52 + __typename: 'Pokemon'; 53 + attacks?: Maybe<AttacksConnection>; 54 + /** @deprecated And this is the reason why */ 55 + classification?: Maybe<Scalars['String']['output']>; 56 + evolutionRequirements?: Maybe<Array<Maybe<EvolutionRequirement>>>; 57 + evolutions?: Maybe<Array<Maybe<Pokemon>>>; 58 + /** Likelihood of an attempt to catch a Pokémon to fail. */ 59 + fleeRate?: Maybe<Scalars['Float']['output']>; 60 + height?: Maybe<PokemonDimension>; 61 + id: Scalars['ID']['output']; 62 + /** Maximum combat power a Pokémon may achieve at max level. */ 63 + maxCP?: Maybe<Scalars['Int']['output']>; 64 + /** Maximum health points a Pokémon may achieve at max level. */ 65 + maxHP?: Maybe<Scalars['Int']['output']>; 66 + name: Scalars['String']['output']; 67 + resistant?: Maybe<Array<Maybe<PokemonType>>>; 68 + types?: Maybe<Array<Maybe<PokemonType>>>; 69 + weaknesses?: Maybe<Array<Maybe<PokemonType>>>; 70 + weight?: Maybe<PokemonDimension>; 71 + }; 72 + 73 + export type PokemonDimension = { 74 + __typename: 'PokemonDimension'; 75 + maximum?: Maybe<Scalars['String']['output']>; 76 + minimum?: Maybe<Scalars['String']['output']>; 77 + }; 78 + 79 + /** Elemental property associated with either a Pokémon or one of their moves. */ 80 + export type PokemonType = 81 + | 'Bug' 82 + | 'Dark' 83 + | 'Dragon' 84 + | 'Electric' 85 + | 'Fairy' 86 + | 'Fighting' 87 + | 'Fire' 88 + | 'Flying' 89 + | 'Ghost' 90 + | 'Grass' 91 + | 'Ground' 92 + | 'Ice' 93 + | 'Normal' 94 + | 'Poison' 95 + | 'Psychic' 96 + | 'Rock' 97 + | 'Steel' 98 + | 'Water'; 99 + 100 + export type Query = { 101 + __typename: 'Query'; 102 + /** Get a single Pokémon by its ID, a three character long identifier padded with zeroes */ 103 + pokemon?: Maybe<Pokemon>; 104 + /** List out all Pokémon, optionally in pages */ 105 + pokemons?: Maybe<Array<Maybe<Pokemon>>>; 106 + }; 107 + 108 + export type QueryPokemonArgs = { 109 + id: Scalars['ID']['input']; 110 + }; 111 + 112 + export type QueryPokemonsArgs = { 113 + limit?: InputMaybe<Scalars['Int']['input']>; 114 + skip?: InputMaybe<Scalars['Int']['input']>; 115 + };
+10
test/e2e/fixture-project-client-preset/fixtures/fragment.ts
··· 1 + import { graphql } from './gql/gql'; 2 + 3 + export const PokemonFields = graphql(` 4 + fragment pokemonFields on Pokemon { 5 + id 6 + name 7 + fleeRate 8 + 9 + } 10 + `);
+85
test/e2e/fixture-project-client-preset/fixtures/gql/fragment-masking.ts
··· 1 + import { 2 + ResultOf, 3 + DocumentTypeDecoration, 4 + TypedDocumentNode, 5 + } from '@graphql-typed-document-node/core'; 6 + import { FragmentDefinitionNode } from 'graphql'; 7 + import { Incremental } from './graphql'; 8 + 9 + export type FragmentType< 10 + TDocumentType extends DocumentTypeDecoration<any, any> 11 + > = TDocumentType extends DocumentTypeDecoration<infer TType, any> 12 + ? [TType] extends [{ ' $fragmentName'?: infer TKey }] 13 + ? TKey extends string 14 + ? { ' $fragmentRefs'?: { [key in TKey]: TType } } 15 + : never 16 + : never 17 + : never; 18 + 19 + // return non-nullable if `fragmentType` is non-nullable 20 + export function useFragment<TType>( 21 + _documentNode: DocumentTypeDecoration<TType, any>, 22 + fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> 23 + ): TType; 24 + // return nullable if `fragmentType` is nullable 25 + export function useFragment<TType>( 26 + _documentNode: DocumentTypeDecoration<TType, any>, 27 + fragmentType: 28 + | FragmentType<DocumentTypeDecoration<TType, any>> 29 + | null 30 + | undefined 31 + ): TType | null | undefined; 32 + // return array of non-nullable if `fragmentType` is array of non-nullable 33 + export function useFragment<TType>( 34 + _documentNode: DocumentTypeDecoration<TType, any>, 35 + fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> 36 + ): ReadonlyArray<TType>; 37 + // return array of nullable if `fragmentType` is array of nullable 38 + export function useFragment<TType>( 39 + _documentNode: DocumentTypeDecoration<TType, any>, 40 + fragmentType: 41 + | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> 42 + | null 43 + | undefined 44 + ): ReadonlyArray<TType> | null | undefined; 45 + export function useFragment<TType>( 46 + _documentNode: DocumentTypeDecoration<TType, any>, 47 + fragmentType: 48 + | FragmentType<DocumentTypeDecoration<TType, any>> 49 + | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> 50 + | null 51 + | undefined 52 + ): TType | ReadonlyArray<TType> | null | undefined { 53 + return fragmentType as any; 54 + } 55 + 56 + export function makeFragmentData< 57 + F extends DocumentTypeDecoration<any, any>, 58 + FT extends ResultOf<F> 59 + >(data: FT, _fragment: F): FragmentType<F> { 60 + return data as FragmentType<F>; 61 + } 62 + export function isFragmentReady<TQuery, TFrag>( 63 + queryNode: DocumentTypeDecoration<TQuery, any>, 64 + fragmentNode: TypedDocumentNode<TFrag>, 65 + data: 66 + | FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> 67 + | null 68 + | undefined 69 + ): data is FragmentType<typeof fragmentNode> { 70 + const deferredFields = ( 71 + queryNode as { 72 + __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> }; 73 + } 74 + ).__meta__?.deferredFields; 75 + 76 + if (!deferredFields) return true; 77 + 78 + const fragDef = fragmentNode.definitions[0] as 79 + | FragmentDefinitionNode 80 + | undefined; 81 + const fragName = fragDef?.name?.value; 82 + 83 + const fields = (fragName && deferredFields[fragName]) || []; 84 + return fields.length > 0 && fields.every(field => data && field in data); 85 + }
+54
test/e2e/fixture-project-client-preset/fixtures/gql/gql.ts
··· 1 + /* eslint-disable */ 2 + import * as types from './graphql'; 3 + import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; 4 + 5 + /** 6 + * Map of all GraphQL operations in the project. 7 + * 8 + * This map has several performance disadvantages: 9 + * 1. It is not tree-shakeable, so it will include all operations in the project. 10 + * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle. 11 + * 3. It does not support dead code elimination, so it will add unused operations. 12 + * 13 + * Therefore it is highly recommended to use the babel or swc plugin for production. 14 + */ 15 + const documents = { 16 + '\n fragment pokemonFields on Pokemon {\n id\n name\n attacks {\n fast {\n damage\n name\n }\n }\n }\n': 17 + types.PokemonFieldsFragmentDoc, 18 + '\n query Pok($limit: Int!) {\n pokemons(limit: $limit) {\n id\n name\n fleeRate\n classification\n ...pokemonFields\n ...weaknessFields\n __typename\n }\n }\n': 19 + types.PokDocument, 20 + }; 21 + 22 + /** 23 + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. 24 + * 25 + * 26 + * @example 27 + * ```ts 28 + * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`); 29 + * ``` 30 + * 31 + * The query argument is unknown! 32 + * Please regenerate the types. 33 + */ 34 + export function graphql(source: string): unknown; 35 + 36 + /** 37 + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. 38 + */ 39 + export function graphql( 40 + source: '\n fragment pokemonFields on Pokemon {\n id\n name\n attacks {\n fast {\n damage\n name\n }\n }\n }\n' 41 + ): (typeof documents)['\n fragment pokemonFields on Pokemon {\n id\n name\n attacks {\n fast {\n damage\n name\n }\n }\n }\n']; 42 + /** 43 + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. 44 + */ 45 + export function graphql( 46 + source: '\n query Pok($limit: Int!) {\n pokemons(limit: $limit) {\n id\n name\n fleeRate\n classification\n ...pokemonFields\n ...weaknessFields\n __typename\n }\n }\n' 47 + ): (typeof documents)['\n query Pok($limit: Int!) {\n pokemons(limit: $limit) {\n id\n name\n fleeRate\n classification\n ...pokemonFields\n ...weaknessFields\n __typename\n }\n }\n']; 48 + 49 + export function graphql(source: string) { 50 + return (documents as any)[source] ?? {}; 51 + } 52 + 53 + export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = 54 + TDocumentNode extends DocumentNode<infer TType, any> ? TType : never;
+433
test/e2e/fixture-project-client-preset/fixtures/gql/graphql.ts
··· 1 + /* eslint-disable */ 2 + import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; 3 + export type Maybe<T> = T | null; 4 + export type InputMaybe<T> = Maybe<T>; 5 + export type Exact<T extends { [key: string]: unknown }> = { 6 + [K in keyof T]: T[K]; 7 + }; 8 + export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { 9 + [SubKey in K]?: Maybe<T[SubKey]>; 10 + }; 11 + export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { 12 + [SubKey in K]: Maybe<T[SubKey]>; 13 + }; 14 + export type MakeEmpty< 15 + T extends { [key: string]: unknown }, 16 + K extends keyof T 17 + > = { [_ in K]?: never }; 18 + export type Incremental<T> = 19 + | T 20 + | { 21 + [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never; 22 + }; 23 + /** All built-in and custom scalars, mapped to their actual values */ 24 + export type Scalars = { 25 + ID: { input: string; output: string }; 26 + String: { input: string; output: string }; 27 + Boolean: { input: boolean; output: boolean }; 28 + Int: { input: number; output: number }; 29 + Float: { input: number; output: number }; 30 + }; 31 + 32 + /** Move a Pokémon can perform with the associated damage and type. */ 33 + export type Attack = { 34 + __typename?: 'Attack'; 35 + damage?: Maybe<Scalars['Int']['output']>; 36 + name?: Maybe<Scalars['String']['output']>; 37 + type?: Maybe<PokemonType>; 38 + }; 39 + 40 + export type AttacksConnection = { 41 + __typename?: 'AttacksConnection'; 42 + fast?: Maybe<Array<Maybe<Attack>>>; 43 + special?: Maybe<Array<Maybe<Attack>>>; 44 + }; 45 + 46 + /** Requirement that prevents an evolution through regular means of levelling up. */ 47 + export type EvolutionRequirement = { 48 + __typename?: 'EvolutionRequirement'; 49 + amount?: Maybe<Scalars['Int']['output']>; 50 + name?: Maybe<Scalars['String']['output']>; 51 + }; 52 + 53 + export type Pokemon = { 54 + __typename?: 'Pokemon'; 55 + attacks?: Maybe<AttacksConnection>; 56 + /** @deprecated And this is the reason why */ 57 + classification?: Maybe<Scalars['String']['output']>; 58 + evolutionRequirements?: Maybe<Array<Maybe<EvolutionRequirement>>>; 59 + evolutions?: Maybe<Array<Maybe<Pokemon>>>; 60 + /** Likelihood of an attempt to catch a Pokémon to fail. */ 61 + fleeRate?: Maybe<Scalars['Float']['output']>; 62 + height?: Maybe<PokemonDimension>; 63 + id: Scalars['ID']['output']; 64 + /** Maximum combat power a Pokémon may achieve at max level. */ 65 + maxCP?: Maybe<Scalars['Int']['output']>; 66 + /** Maximum health points a Pokémon may achieve at max level. */ 67 + maxHP?: Maybe<Scalars['Int']['output']>; 68 + name: Scalars['String']['output']; 69 + resistant?: Maybe<Array<Maybe<PokemonType>>>; 70 + types?: Maybe<Array<Maybe<PokemonType>>>; 71 + weaknesses?: Maybe<Array<Maybe<PokemonType>>>; 72 + weight?: Maybe<PokemonDimension>; 73 + }; 74 + 75 + export type PokemonDimension = { 76 + __typename?: 'PokemonDimension'; 77 + maximum?: Maybe<Scalars['String']['output']>; 78 + minimum?: Maybe<Scalars['String']['output']>; 79 + }; 80 + 81 + /** Elemental property associated with either a Pokémon or one of their moves. */ 82 + export enum PokemonType { 83 + Bug = 'Bug', 84 + Dark = 'Dark', 85 + Dragon = 'Dragon', 86 + Electric = 'Electric', 87 + Fairy = 'Fairy', 88 + Fighting = 'Fighting', 89 + Fire = 'Fire', 90 + Flying = 'Flying', 91 + Ghost = 'Ghost', 92 + Grass = 'Grass', 93 + Ground = 'Ground', 94 + Ice = 'Ice', 95 + Normal = 'Normal', 96 + Poison = 'Poison', 97 + Psychic = 'Psychic', 98 + Rock = 'Rock', 99 + Steel = 'Steel', 100 + Water = 'Water', 101 + } 102 + 103 + export type Query = { 104 + __typename?: 'Query'; 105 + /** Get a single Pokémon by its ID, a three character long identifier padded with zeroes */ 106 + pokemon?: Maybe<Pokemon>; 107 + /** List out all Pokémon, optionally in pages */ 108 + pokemons?: Maybe<Array<Maybe<Pokemon>>>; 109 + }; 110 + 111 + export type QueryPokemonArgs = { 112 + id: Scalars['ID']['input']; 113 + }; 114 + 115 + export type QueryPokemonsArgs = { 116 + limit?: InputMaybe<Scalars['Int']['input']>; 117 + skip?: InputMaybe<Scalars['Int']['input']>; 118 + }; 119 + 120 + export type PokemonFieldsFragment = { 121 + __typename?: 'Pokemon'; 122 + id: string; 123 + name: string; 124 + attacks?: { 125 + __typename?: 'AttacksConnection'; 126 + fast?: Array<{ 127 + __typename?: 'Attack'; 128 + damage?: number | null; 129 + name?: string | null; 130 + } | null> | null; 131 + } | null; 132 + } & { ' $fragmentName'?: 'PokemonFieldsFragment' }; 133 + 134 + export type WeaknessFieldsFragment = { 135 + __typename?: 'Pokemon'; 136 + weaknesses?: Array<PokemonType | null> | null; 137 + } & { ' $fragmentName'?: 'WeaknessFieldsFragment' }; 138 + 139 + export type PokQueryVariables = Exact<{ 140 + limit: Scalars['Int']['input']; 141 + }>; 142 + 143 + export type PokQuery = { 144 + __typename?: 'Query'; 145 + pokemons?: Array< 146 + | ({ 147 + __typename: 'Pokemon'; 148 + id: string; 149 + name: string; 150 + fleeRate?: number | null; 151 + classification?: string | null; 152 + } & { 153 + ' $fragmentRefs'?: { 154 + PokemonFieldsFragment: PokemonFieldsFragment; 155 + WeaknessFieldsFragment: WeaknessFieldsFragment; 156 + }; 157 + }) 158 + | null 159 + > | null; 160 + }; 161 + 162 + export type PoQueryVariables = Exact<{ 163 + id: Scalars['ID']['input']; 164 + }>; 165 + 166 + export type PoQuery = { 167 + __typename?: 'Query'; 168 + pokemon?: { 169 + __typename: 'Pokemon'; 170 + id: string; 171 + fleeRate?: number | null; 172 + } | null; 173 + }; 174 + 175 + export type PokemonsAreAwesomeQueryVariables = Exact<{ [key: string]: never }>; 176 + 177 + export type PokemonsAreAwesomeQuery = { 178 + __typename?: 'Query'; 179 + pokemons?: Array<{ __typename?: 'Pokemon'; id: string } | null> | null; 180 + }; 181 + 182 + export const PokemonFieldsFragmentDoc = { 183 + kind: 'Document', 184 + definitions: [ 185 + { 186 + kind: 'FragmentDefinition', 187 + name: { kind: 'Name', value: 'pokemonFields' }, 188 + typeCondition: { 189 + kind: 'NamedType', 190 + name: { kind: 'Name', value: 'Pokemon' }, 191 + }, 192 + selectionSet: { 193 + kind: 'SelectionSet', 194 + selections: [ 195 + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, 196 + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, 197 + { 198 + kind: 'Field', 199 + name: { kind: 'Name', value: 'attacks' }, 200 + selectionSet: { 201 + kind: 'SelectionSet', 202 + selections: [ 203 + { 204 + kind: 'Field', 205 + name: { kind: 'Name', value: 'fast' }, 206 + selectionSet: { 207 + kind: 'SelectionSet', 208 + selections: [ 209 + { 210 + kind: 'Field', 211 + name: { kind: 'Name', value: 'damage' }, 212 + }, 213 + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, 214 + ], 215 + }, 216 + }, 217 + ], 218 + }, 219 + }, 220 + ], 221 + }, 222 + }, 223 + ], 224 + } as unknown as DocumentNode<PokemonFieldsFragment, unknown>; 225 + export const WeaknessFieldsFragmentDoc = { 226 + kind: 'Document', 227 + definitions: [ 228 + { 229 + kind: 'FragmentDefinition', 230 + name: { kind: 'Name', value: 'weaknessFields' }, 231 + typeCondition: { 232 + kind: 'NamedType', 233 + name: { kind: 'Name', value: 'Pokemon' }, 234 + }, 235 + selectionSet: { 236 + kind: 'SelectionSet', 237 + selections: [ 238 + { kind: 'Field', name: { kind: 'Name', value: 'weaknesses' } }, 239 + ], 240 + }, 241 + }, 242 + ], 243 + } as unknown as DocumentNode<WeaknessFieldsFragment, unknown>; 244 + export const PokDocument = { 245 + kind: 'Document', 246 + definitions: [ 247 + { 248 + kind: 'OperationDefinition', 249 + operation: 'query', 250 + name: { kind: 'Name', value: 'Pok' }, 251 + variableDefinitions: [ 252 + { 253 + kind: 'VariableDefinition', 254 + variable: { 255 + kind: 'Variable', 256 + name: { kind: 'Name', value: 'limit' }, 257 + }, 258 + type: { 259 + kind: 'NonNullType', 260 + type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } }, 261 + }, 262 + }, 263 + ], 264 + selectionSet: { 265 + kind: 'SelectionSet', 266 + selections: [ 267 + { 268 + kind: 'Field', 269 + name: { kind: 'Name', value: 'pokemons' }, 270 + arguments: [ 271 + { 272 + kind: 'Argument', 273 + name: { kind: 'Name', value: 'limit' }, 274 + value: { 275 + kind: 'Variable', 276 + name: { kind: 'Name', value: 'limit' }, 277 + }, 278 + }, 279 + ], 280 + selectionSet: { 281 + kind: 'SelectionSet', 282 + selections: [ 283 + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, 284 + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, 285 + { kind: 'Field', name: { kind: 'Name', value: 'fleeRate' } }, 286 + { 287 + kind: 'Field', 288 + name: { kind: 'Name', value: 'classification' }, 289 + }, 290 + { 291 + kind: 'FragmentSpread', 292 + name: { kind: 'Name', value: 'pokemonFields' }, 293 + }, 294 + { 295 + kind: 'FragmentSpread', 296 + name: { kind: 'Name', value: 'weaknessFields' }, 297 + }, 298 + { kind: 'Field', name: { kind: 'Name', value: '__typename' } }, 299 + ], 300 + }, 301 + }, 302 + ], 303 + }, 304 + }, 305 + { 306 + kind: 'FragmentDefinition', 307 + name: { kind: 'Name', value: 'pokemonFields' }, 308 + typeCondition: { 309 + kind: 'NamedType', 310 + name: { kind: 'Name', value: 'Pokemon' }, 311 + }, 312 + selectionSet: { 313 + kind: 'SelectionSet', 314 + selections: [ 315 + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, 316 + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, 317 + { 318 + kind: 'Field', 319 + name: { kind: 'Name', value: 'attacks' }, 320 + selectionSet: { 321 + kind: 'SelectionSet', 322 + selections: [ 323 + { 324 + kind: 'Field', 325 + name: { kind: 'Name', value: 'fast' }, 326 + selectionSet: { 327 + kind: 'SelectionSet', 328 + selections: [ 329 + { 330 + kind: 'Field', 331 + name: { kind: 'Name', value: 'damage' }, 332 + }, 333 + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, 334 + ], 335 + }, 336 + }, 337 + ], 338 + }, 339 + }, 340 + ], 341 + }, 342 + }, 343 + { 344 + kind: 'FragmentDefinition', 345 + name: { kind: 'Name', value: 'weaknessFields' }, 346 + typeCondition: { 347 + kind: 'NamedType', 348 + name: { kind: 'Name', value: 'Pokemon' }, 349 + }, 350 + selectionSet: { 351 + kind: 'SelectionSet', 352 + selections: [ 353 + { kind: 'Field', name: { kind: 'Name', value: 'weaknesses' } }, 354 + ], 355 + }, 356 + }, 357 + ], 358 + } as unknown as DocumentNode<PokQuery, PokQueryVariables>; 359 + export const PoDocument = { 360 + kind: 'Document', 361 + definitions: [ 362 + { 363 + kind: 'OperationDefinition', 364 + operation: 'query', 365 + name: { kind: 'Name', value: 'Po' }, 366 + variableDefinitions: [ 367 + { 368 + kind: 'VariableDefinition', 369 + variable: { kind: 'Variable', name: { kind: 'Name', value: 'id' } }, 370 + type: { 371 + kind: 'NonNullType', 372 + type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } }, 373 + }, 374 + }, 375 + ], 376 + selectionSet: { 377 + kind: 'SelectionSet', 378 + selections: [ 379 + { 380 + kind: 'Field', 381 + name: { kind: 'Name', value: 'pokemon' }, 382 + arguments: [ 383 + { 384 + kind: 'Argument', 385 + name: { kind: 'Name', value: 'id' }, 386 + value: { 387 + kind: 'Variable', 388 + name: { kind: 'Name', value: 'id' }, 389 + }, 390 + }, 391 + ], 392 + selectionSet: { 393 + kind: 'SelectionSet', 394 + selections: [ 395 + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, 396 + { kind: 'Field', name: { kind: 'Name', value: 'fleeRate' } }, 397 + { kind: 'Field', name: { kind: 'Name', value: '__typename' } }, 398 + ], 399 + }, 400 + }, 401 + ], 402 + }, 403 + }, 404 + ], 405 + } as unknown as DocumentNode<PoQuery, PoQueryVariables>; 406 + export const PokemonsAreAwesomeDocument = { 407 + kind: 'Document', 408 + definitions: [ 409 + { 410 + kind: 'OperationDefinition', 411 + operation: 'query', 412 + name: { kind: 'Name', value: 'PokemonsAreAwesome' }, 413 + selectionSet: { 414 + kind: 'SelectionSet', 415 + selections: [ 416 + { 417 + kind: 'Field', 418 + name: { kind: 'Name', value: 'pokemons' }, 419 + selectionSet: { 420 + kind: 'SelectionSet', 421 + selections: [ 422 + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, 423 + ], 424 + }, 425 + }, 426 + ], 427 + }, 428 + }, 429 + ], 430 + } as unknown as DocumentNode< 431 + PokemonsAreAwesomeQuery, 432 + PokemonsAreAwesomeQueryVariables 433 + >;
+2
test/e2e/fixture-project-client-preset/fixtures/gql/index.ts
··· 1 + export * from './fragment-masking'; 2 + export * from './gql';
+14
test/e2e/fixture-project-client-preset/fixtures/simple.ts
··· 1 + import { graphql } from './gql/gql'; 2 + 3 + const x = graphql(` 4 + query Pok($limit: Int!) { 5 + pokemons(limit: $limit) { 6 + id 7 + name 8 + fleeRate 9 + classification 10 + ...pokemonFields 11 + __typename 12 + } 13 + } 14 + `);
+13
test/e2e/fixture-project-client-preset/package.json
··· 1 + { 2 + "name": "fixtures", 3 + "private": true, 4 + "dependencies": { 5 + "graphql": "^16.0.0", 6 + "@graphql-typed-document-node/core": "^3.0.0", 7 + "@0no-co/graphqlsp": "workspace:*", 8 + "@urql/core": "^4.0.4" 9 + }, 10 + "devDependencies": { 11 + "typescript": "^5.0.4" 12 + } 13 + }
+94
test/e2e/fixture-project-client-preset/schema.graphql
··· 1 + ### This file was generated by Nexus Schema 2 + ### Do not make changes to this file directly 3 + 4 + """ 5 + Move a Pokémon can perform with the associated damage and type. 6 + """ 7 + type Attack { 8 + damage: Int 9 + name: String 10 + type: PokemonType 11 + } 12 + 13 + type AttacksConnection { 14 + fast: [Attack] 15 + special: [Attack] 16 + } 17 + 18 + """ 19 + Requirement that prevents an evolution through regular means of levelling up. 20 + """ 21 + type EvolutionRequirement { 22 + amount: Int 23 + name: String 24 + } 25 + 26 + type Pokemon { 27 + attacks: AttacksConnection 28 + classification: String @deprecated(reason: "And this is the reason why") 29 + evolutionRequirements: [EvolutionRequirement] 30 + evolutions: [Pokemon] 31 + 32 + """ 33 + Likelihood of an attempt to catch a Pokémon to fail. 34 + """ 35 + fleeRate: Float 36 + height: PokemonDimension 37 + id: ID! 38 + 39 + """ 40 + Maximum combat power a Pokémon may achieve at max level. 41 + """ 42 + maxCP: Int 43 + 44 + """ 45 + Maximum health points a Pokémon may achieve at max level. 46 + """ 47 + maxHP: Int 48 + name: String! 49 + resistant: [PokemonType] 50 + types: [PokemonType] 51 + weaknesses: [PokemonType] 52 + weight: PokemonDimension 53 + } 54 + 55 + type PokemonDimension { 56 + maximum: String 57 + minimum: String 58 + } 59 + 60 + """ 61 + Elemental property associated with either a Pokémon or one of their moves. 62 + """ 63 + enum PokemonType { 64 + Bug 65 + Dark 66 + Dragon 67 + Electric 68 + Fairy 69 + Fighting 70 + Fire 71 + Flying 72 + Ghost 73 + Grass 74 + Ground 75 + Ice 76 + Normal 77 + Poison 78 + Psychic 79 + Rock 80 + Steel 81 + Water 82 + } 83 + 84 + type Query { 85 + """ 86 + Get a single Pokémon by its ID, a three character long identifier padded with zeroes 87 + """ 88 + pokemon(id: ID!): Pokemon 89 + 90 + """ 91 + List out all Pokémon, optionally in pages 92 + """ 93 + pokemons(limit: Int, skip: Int): [Pokemon] 94 + }
+21
test/e2e/fixture-project-client-preset/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "plugins": [ 4 + { 5 + "name": "@0no-co/graphqlsp", 6 + "schema": "./schema.graphql", 7 + "disableTypegen": true, 8 + "shouldCheckForColocatedFragments": false, 9 + "template": "graphql", 10 + "templateIsCallExpression": true 11 + } 12 + ], 13 + "target": "es2016", 14 + "esModuleInterop": true, 15 + "moduleResolution": "node", 16 + "forceConsistentCasingInFileNames": true, 17 + "strict": true, 18 + "skipLibCheck": true 19 + }, 20 + "exclude": ["node_modules", "fixtures"] 21 + }