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

Support global fragments (#109)

* try and facilitate global fragments

* omg it works

* autocomplete

* finish this up

* cleanup

* do changes

* add tests

* yeet

+5
.changeset/perfect-news-talk.md
···
+
---
+
'@0no-co/graphqlsp': minor
+
---
+
+
Support the GraphQL Code Generator client preset
+3
packages/example-external-generator/.vscode/settings.json
···
+
{
+
"typescript.tsdk": "node_modules/typescript/lib"
+
}
+14
packages/example-external-generator/codegen.ts
···
+
import { CodegenConfig } from '@graphql-codegen/cli';
+
+
const config: CodegenConfig = {
+
schema: './schema.graphql',
+
documents: ['src/**/*.tsx'],
+
ignoreNoDocuments: true, // for better experience with the watcher
+
generates: {
+
'./src/gql/': {
+
preset: 'client',
+
},
+
},
+
};
+
+
export default config;
+24
packages/example-external-generator/package.json
···
+
{
+
"name": "example",
+
"private": true,
+
"version": "1.0.0",
+
"description": "",
+
"main": "index.js",
+
"scripts": {
+
"test": "echo \"Error: no test specified\" && exit 1"
+
},
+
"author": "",
+
"license": "ISC",
+
"dependencies": {
+
"@graphql-typed-document-node/core": "^3.2.0",
+
"@urql/core": "^3.0.0",
+
"graphql": "^16.8.1"
+
},
+
"devDependencies": {
+
"@0no-co/graphqlsp": "file:../graphqlsp",
+
"@graphql-codegen/cli": "^5.0.0",
+
"@graphql-codegen/client-preset": "^4.1.0",
+
"ts-node": "^10.9.1",
+
"typescript": "^5.0.4"
+
}
+
}
+94
packages/example-external-generator/schema.graphql
···
+
### This file was generated by Nexus Schema
+
### Do not make changes to this file directly
+
+
"""
+
Move a Pokémon can perform with the associated damage and type.
+
"""
+
type Attack {
+
damage: Int
+
name: String
+
type: PokemonType
+
}
+
+
type AttacksConnection {
+
fast: [Attack]
+
special: [Attack]
+
}
+
+
"""
+
Requirement that prevents an evolution through regular means of levelling up.
+
"""
+
type EvolutionRequirement {
+
amount: Int
+
name: String
+
}
+
+
type Pokemon {
+
attacks: AttacksConnection
+
classification: String @deprecated(reason: "And this is the reason why")
+
evolutionRequirements: [EvolutionRequirement]
+
evolutions: [Pokemon]
+
+
"""
+
Likelihood of an attempt to catch a Pokémon to fail.
+
"""
+
fleeRate: Float
+
height: PokemonDimension
+
id: ID!
+
+
"""
+
Maximum combat power a Pokémon may achieve at max level.
+
"""
+
maxCP: Int
+
+
"""
+
Maximum health points a Pokémon may achieve at max level.
+
"""
+
maxHP: Int
+
name: String!
+
resistant: [PokemonType]
+
types: [PokemonType]
+
weaknesses: [PokemonType]
+
weight: PokemonDimension
+
}
+
+
type PokemonDimension {
+
maximum: String
+
minimum: String
+
}
+
+
"""
+
Elemental property associated with either a Pokémon or one of their moves.
+
"""
+
enum PokemonType {
+
Bug
+
Dark
+
Dragon
+
Electric
+
Fairy
+
Fighting
+
Fire
+
Flying
+
Ghost
+
Grass
+
Ground
+
Ice
+
Normal
+
Poison
+
Psychic
+
Rock
+
Steel
+
Water
+
}
+
+
type Query {
+
"""
+
Get a single Pokémon by its ID, a three character long identifier padded with zeroes
+
"""
+
pokemon(id: ID!): Pokemon
+
+
"""
+
List out all Pokémon, optionally in pages
+
"""
+
pokemons(limit: Int, skip: Int): [Pokemon]
+
}
+37
packages/example-external-generator/src/Pokemon.tsx
···
+
import { TypedDocumentNode } from '@graphql-typed-document-node/core';
+
import { graphql } from './gql';
+
+
export const PokemonFields = graphql(`
+
fragment pokemonFields on Pokemon {
+
id
+
name
+
attacks {
+
fast {
+
damage
+
name
+
}
+
}
+
}
+
`)
+
+
export const WeakFields = graphql(`
+
fragment weaknessFields on Pokemon {
+
weaknesses
+
}
+
`)
+
+
export const Pokemon = (data: any) => {
+
const pokemon = useFragment(PokemonFields, data);
+
return `hi ${pokemon.name}`;
+
};
+
+
type X = { hello: string };
+
+
const x: X = { hello: '' };
+
+
export function useFragment<Type>(
+
_fragment: TypedDocumentNode<Type>,
+
data: any
+
): Type {
+
return data;
+
}
+85
packages/example-external-generator/src/gql/fragment-masking.ts
···
+
import {
+
ResultOf,
+
DocumentTypeDecoration,
+
TypedDocumentNode,
+
} from '@graphql-typed-document-node/core';
+
import { FragmentDefinitionNode } from 'graphql';
+
import { Incremental } from './graphql';
+
+
export type FragmentType<
+
TDocumentType extends DocumentTypeDecoration<any, any>
+
> = TDocumentType extends DocumentTypeDecoration<infer TType, any>
+
? [TType] extends [{ ' $fragmentName'?: infer TKey }]
+
? TKey extends string
+
? { ' $fragmentRefs'?: { [key in TKey]: TType } }
+
: never
+
: never
+
: never;
+
+
// return non-nullable if `fragmentType` is non-nullable
+
export function useFragment<TType>(
+
_documentNode: DocumentTypeDecoration<TType, any>,
+
fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>
+
): TType;
+
// return nullable if `fragmentType` is nullable
+
export function useFragment<TType>(
+
_documentNode: DocumentTypeDecoration<TType, any>,
+
fragmentType:
+
| FragmentType<DocumentTypeDecoration<TType, any>>
+
| null
+
| undefined
+
): TType | null | undefined;
+
// return array of non-nullable if `fragmentType` is array of non-nullable
+
export function useFragment<TType>(
+
_documentNode: DocumentTypeDecoration<TType, any>,
+
fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>
+
): ReadonlyArray<TType>;
+
// return array of nullable if `fragmentType` is array of nullable
+
export function useFragment<TType>(
+
_documentNode: DocumentTypeDecoration<TType, any>,
+
fragmentType:
+
| ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>
+
| null
+
| undefined
+
): ReadonlyArray<TType> | null | undefined;
+
export function useFragment<TType>(
+
_documentNode: DocumentTypeDecoration<TType, any>,
+
fragmentType:
+
| FragmentType<DocumentTypeDecoration<TType, any>>
+
| ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>
+
| null
+
| undefined
+
): TType | ReadonlyArray<TType> | null | undefined {
+
return fragmentType as any;
+
}
+
+
export function makeFragmentData<
+
F extends DocumentTypeDecoration<any, any>,
+
FT extends ResultOf<F>
+
>(data: FT, _fragment: F): FragmentType<F> {
+
return data as FragmentType<F>;
+
}
+
export function isFragmentReady<TQuery, TFrag>(
+
queryNode: DocumentTypeDecoration<TQuery, any>,
+
fragmentNode: TypedDocumentNode<TFrag>,
+
data:
+
| FragmentType<TypedDocumentNode<Incremental<TFrag>, any>>
+
| null
+
| undefined
+
): data is FragmentType<typeof fragmentNode> {
+
const deferredFields = (
+
queryNode as {
+
__meta__?: { deferredFields: Record<string, (keyof TFrag)[]> };
+
}
+
).__meta__?.deferredFields;
+
+
if (!deferredFields) return true;
+
+
const fragDef = fragmentNode.definitions[0] as
+
| FragmentDefinitionNode
+
| undefined;
+
const fragName = fragDef?.name?.value;
+
+
const fields = (fragName && deferredFields[fragName]) || [];
+
return fields.length > 0 && fields.every(field => data && field in data);
+
}
+78
packages/example-external-generator/src/gql/gql.ts
···
+
/* eslint-disable */
+
import * as types from './graphql';
+
import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
+
+
/**
+
* Map of all GraphQL operations in the project.
+
*
+
* This map has several performance disadvantages:
+
* 1. It is not tree-shakeable, so it will include all operations in the project.
+
* 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.
+
* 3. It does not support dead code elimination, so it will add unused operations.
+
*
+
* Therefore it is highly recommended to use the babel or swc plugin for production.
+
*/
+
const documents = {
+
'\n fragment pokemonFields on Pokemon {\n id\n name\n attacks {\n fast {\n damage\n name\n }\n }\n }\n':
+
types.PokemonFieldsFragmentDoc,
+
'\n fragment weaknessFields on Pokemon {\n weaknesses\n }\n':
+
types.WeaknessFieldsFragmentDoc,
+
'\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':
+
types.PokDocument,
+
'\n query Po($id: ID!) {\n pokemon(id: $id) {\n id\n fleeRate\n __typename\n }\n }\n':
+
types.PoDocument,
+
'\n query PokemonsAreAwesome {\n pokemons {\n id\n }\n }\n':
+
types.PokemonsAreAwesomeDocument,
+
};
+
+
/**
+
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+
*
+
*
+
* @example
+
* ```ts
+
* const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);
+
* ```
+
*
+
* The query argument is unknown!
+
* Please regenerate the types.
+
*/
+
export function graphql(source: string): unknown;
+
+
/**
+
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+
*/
+
export function graphql(
+
source: '\n fragment pokemonFields on Pokemon {\n id\n name\n attacks {\n fast {\n damage\n name\n }\n }\n }\n'
+
): (typeof documents)['\n fragment pokemonFields on Pokemon {\n id\n name\n attacks {\n fast {\n damage\n name\n }\n }\n }\n'];
+
/**
+
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+
*/
+
export function graphql(
+
source: '\n fragment weaknessFields on Pokemon {\n weaknesses\n }\n'
+
): (typeof documents)['\n fragment weaknessFields on Pokemon {\n weaknesses\n }\n'];
+
/**
+
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+
*/
+
export function graphql(
+
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'
+
): (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'];
+
/**
+
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+
*/
+
export function graphql(
+
source: '\n query Po($id: ID!) {\n pokemon(id: $id) {\n id\n fleeRate\n __typename\n }\n }\n'
+
): (typeof documents)['\n query Po($id: ID!) {\n pokemon(id: $id) {\n id\n fleeRate\n __typename\n }\n }\n'];
+
/**
+
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+
*/
+
export function graphql(
+
source: '\n query PokemonsAreAwesome {\n pokemons {\n id\n }\n }\n'
+
): (typeof documents)['\n query PokemonsAreAwesome {\n pokemons {\n id\n }\n }\n'];
+
+
export function graphql(source: string) {
+
return (documents as any)[source] ?? {};
+
}
+
+
export type DocumentType<TDocumentNode extends DocumentNode<any, any>> =
+
TDocumentNode extends DocumentNode<infer TType, any> ? TType : never;
+433
packages/example-external-generator/src/gql/graphql.ts
···
+
/* eslint-disable */
+
import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
+
export type Maybe<T> = T | null;
+
export type InputMaybe<T> = Maybe<T>;
+
export type Exact<T extends { [key: string]: unknown }> = {
+
[K in keyof T]: T[K];
+
};
+
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & {
+
[SubKey in K]?: Maybe<T[SubKey]>;
+
};
+
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & {
+
[SubKey in K]: Maybe<T[SubKey]>;
+
};
+
export type MakeEmpty<
+
T extends { [key: string]: unknown },
+
K extends keyof T
+
> = { [_ in K]?: never };
+
export type Incremental<T> =
+
| T
+
| {
+
[P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never;
+
};
+
/** All built-in and custom scalars, mapped to their actual values */
+
export type Scalars = {
+
ID: { input: string; output: string };
+
String: { input: string; output: string };
+
Boolean: { input: boolean; output: boolean };
+
Int: { input: number; output: number };
+
Float: { input: number; output: number };
+
};
+
+
/** Move a Pokémon can perform with the associated damage and type. */
+
export type Attack = {
+
__typename?: 'Attack';
+
damage?: Maybe<Scalars['Int']['output']>;
+
name?: Maybe<Scalars['String']['output']>;
+
type?: Maybe<PokemonType>;
+
};
+
+
export type AttacksConnection = {
+
__typename?: 'AttacksConnection';
+
fast?: Maybe<Array<Maybe<Attack>>>;
+
special?: Maybe<Array<Maybe<Attack>>>;
+
};
+
+
/** Requirement that prevents an evolution through regular means of levelling up. */
+
export type EvolutionRequirement = {
+
__typename?: 'EvolutionRequirement';
+
amount?: Maybe<Scalars['Int']['output']>;
+
name?: Maybe<Scalars['String']['output']>;
+
};
+
+
export type Pokemon = {
+
__typename?: 'Pokemon';
+
attacks?: Maybe<AttacksConnection>;
+
/** @deprecated And this is the reason why */
+
classification?: Maybe<Scalars['String']['output']>;
+
evolutionRequirements?: Maybe<Array<Maybe<EvolutionRequirement>>>;
+
evolutions?: Maybe<Array<Maybe<Pokemon>>>;
+
/** Likelihood of an attempt to catch a Pokémon to fail. */
+
fleeRate?: Maybe<Scalars['Float']['output']>;
+
height?: Maybe<PokemonDimension>;
+
id: Scalars['ID']['output'];
+
/** Maximum combat power a Pokémon may achieve at max level. */
+
maxCP?: Maybe<Scalars['Int']['output']>;
+
/** Maximum health points a Pokémon may achieve at max level. */
+
maxHP?: Maybe<Scalars['Int']['output']>;
+
name: Scalars['String']['output'];
+
resistant?: Maybe<Array<Maybe<PokemonType>>>;
+
types?: Maybe<Array<Maybe<PokemonType>>>;
+
weaknesses?: Maybe<Array<Maybe<PokemonType>>>;
+
weight?: Maybe<PokemonDimension>;
+
};
+
+
export type PokemonDimension = {
+
__typename?: 'PokemonDimension';
+
maximum?: Maybe<Scalars['String']['output']>;
+
minimum?: Maybe<Scalars['String']['output']>;
+
};
+
+
/** Elemental property associated with either a Pokémon or one of their moves. */
+
export enum PokemonType {
+
Bug = 'Bug',
+
Dark = 'Dark',
+
Dragon = 'Dragon',
+
Electric = 'Electric',
+
Fairy = 'Fairy',
+
Fighting = 'Fighting',
+
Fire = 'Fire',
+
Flying = 'Flying',
+
Ghost = 'Ghost',
+
Grass = 'Grass',
+
Ground = 'Ground',
+
Ice = 'Ice',
+
Normal = 'Normal',
+
Poison = 'Poison',
+
Psychic = 'Psychic',
+
Rock = 'Rock',
+
Steel = 'Steel',
+
Water = 'Water',
+
}
+
+
export type Query = {
+
__typename?: 'Query';
+
/** Get a single Pokémon by its ID, a three character long identifier padded with zeroes */
+
pokemon?: Maybe<Pokemon>;
+
/** List out all Pokémon, optionally in pages */
+
pokemons?: Maybe<Array<Maybe<Pokemon>>>;
+
};
+
+
export type QueryPokemonArgs = {
+
id: Scalars['ID']['input'];
+
};
+
+
export type QueryPokemonsArgs = {
+
limit?: InputMaybe<Scalars['Int']['input']>;
+
skip?: InputMaybe<Scalars['Int']['input']>;
+
};
+
+
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;
+
} & { ' $fragmentName'?: 'PokemonFieldsFragment' };
+
+
export type WeaknessFieldsFragment = {
+
__typename?: 'Pokemon';
+
weaknesses?: Array<PokemonType | null> | null;
+
} & { ' $fragmentName'?: 'WeaknessFieldsFragment' };
+
+
export type PokQueryVariables = Exact<{
+
limit: Scalars['Int']['input'];
+
}>;
+
+
export type PokQuery = {
+
__typename?: 'Query';
+
pokemons?: Array<
+
| ({
+
__typename: 'Pokemon';
+
id: string;
+
name: string;
+
fleeRate?: number | null;
+
classification?: string | null;
+
} & {
+
' $fragmentRefs'?: {
+
PokemonFieldsFragment: PokemonFieldsFragment;
+
WeaknessFieldsFragment: WeaknessFieldsFragment;
+
};
+
})
+
| null
+
> | null;
+
};
+
+
export type PoQueryVariables = Exact<{
+
id: Scalars['ID']['input'];
+
}>;
+
+
export type PoQuery = {
+
__typename?: 'Query';
+
pokemon?: {
+
__typename: 'Pokemon';
+
id: string;
+
fleeRate?: number | null;
+
} | null;
+
};
+
+
export type PokemonsAreAwesomeQueryVariables = Exact<{ [key: string]: never }>;
+
+
export type PokemonsAreAwesomeQuery = {
+
__typename?: 'Query';
+
pokemons?: Array<{ __typename?: 'Pokemon'; id: string } | null> | null;
+
};
+
+
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>;
+
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>;
+
export const PokDocument = {
+
kind: 'Document',
+
definitions: [
+
{
+
kind: 'OperationDefinition',
+
operation: 'query',
+
name: { kind: 'Name', value: 'Pok' },
+
variableDefinitions: [
+
{
+
kind: 'VariableDefinition',
+
variable: {
+
kind: 'Variable',
+
name: { kind: 'Name', value: 'limit' },
+
},
+
type: {
+
kind: 'NonNullType',
+
type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } },
+
},
+
},
+
],
+
selectionSet: {
+
kind: 'SelectionSet',
+
selections: [
+
{
+
kind: 'Field',
+
name: { kind: 'Name', value: 'pokemons' },
+
arguments: [
+
{
+
kind: 'Argument',
+
name: { kind: 'Name', value: 'limit' },
+
value: {
+
kind: 'Variable',
+
name: { kind: 'Name', value: 'limit' },
+
},
+
},
+
],
+
selectionSet: {
+
kind: 'SelectionSet',
+
selections: [
+
{ kind: 'Field', name: { kind: 'Name', value: 'id' } },
+
{ kind: 'Field', name: { kind: 'Name', value: 'name' } },
+
{ kind: 'Field', name: { kind: 'Name', value: 'fleeRate' } },
+
{
+
kind: 'Field',
+
name: { kind: 'Name', value: 'classification' },
+
},
+
{
+
kind: 'FragmentSpread',
+
name: { kind: 'Name', value: 'pokemonFields' },
+
},
+
{
+
kind: 'FragmentSpread',
+
name: { kind: 'Name', value: 'weaknessFields' },
+
},
+
{ kind: 'Field', name: { kind: 'Name', value: '__typename' } },
+
],
+
},
+
},
+
],
+
},
+
},
+
{
+
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' } },
+
],
+
},
+
},
+
],
+
},
+
},
+
],
+
},
+
},
+
{
+
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<PokQuery, PokQueryVariables>;
+
export const PoDocument = {
+
kind: 'Document',
+
definitions: [
+
{
+
kind: 'OperationDefinition',
+
operation: 'query',
+
name: { kind: 'Name', value: 'Po' },
+
variableDefinitions: [
+
{
+
kind: 'VariableDefinition',
+
variable: { kind: 'Variable', name: { kind: 'Name', value: 'id' } },
+
type: {
+
kind: 'NonNullType',
+
type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } },
+
},
+
},
+
],
+
selectionSet: {
+
kind: 'SelectionSet',
+
selections: [
+
{
+
kind: 'Field',
+
name: { kind: 'Name', value: 'pokemon' },
+
arguments: [
+
{
+
kind: 'Argument',
+
name: { kind: 'Name', value: 'id' },
+
value: {
+
kind: 'Variable',
+
name: { kind: 'Name', value: 'id' },
+
},
+
},
+
],
+
selectionSet: {
+
kind: 'SelectionSet',
+
selections: [
+
{ kind: 'Field', name: { kind: 'Name', value: 'id' } },
+
{ kind: 'Field', name: { kind: 'Name', value: 'fleeRate' } },
+
{ kind: 'Field', name: { kind: 'Name', value: '__typename' } },
+
],
+
},
+
},
+
],
+
},
+
},
+
],
+
} as unknown as DocumentNode<PoQuery, PoQueryVariables>;
+
export const PokemonsAreAwesomeDocument = {
+
kind: 'Document',
+
definitions: [
+
{
+
kind: 'OperationDefinition',
+
operation: 'query',
+
name: { kind: 'Name', value: 'PokemonsAreAwesome' },
+
selectionSet: {
+
kind: 'SelectionSet',
+
selections: [
+
{
+
kind: 'Field',
+
name: { kind: 'Name', value: 'pokemons' },
+
selectionSet: {
+
kind: 'SelectionSet',
+
selections: [
+
{ kind: 'Field', name: { kind: 'Name', value: 'id' } },
+
],
+
},
+
},
+
],
+
},
+
},
+
],
+
} as unknown as DocumentNode<
+
PokemonsAreAwesomeQuery,
+
PokemonsAreAwesomeQueryVariables
+
>;
+2
packages/example-external-generator/src/gql/index.ts
···
+
export * from './fragment-masking';
+
export * from './gql';
+45
packages/example-external-generator/src/index.tsx
···
+
import { createClient } from '@urql/core';
+
import { graphql } from './gql';
+
+
const x = graphql(`
+
query Pok($limit: Int!) {
+
pokemons(limit: $limit) {
+
id
+
name
+
fleeRate
+
classification
+
...pokemonFields
+
...weaknessFields
+
__typename
+
}
+
}
+
`)
+
+
const client = createClient({
+
url: '',
+
});
+
+
const PokemonQuery = graphql(`
+
query Po($id: ID!) {
+
pokemon(id: $id) {
+
id
+
fleeRate
+
__typename
+
}
+
}
+
`);
+
+
client
+
.query(PokemonQuery, { id: '' })
+
.toPromise()
+
.then(result => {
+
result.data?.pokemon;
+
});
+
+
const myQuery = graphql(`
+
query PokemonsAreAwesome {
+
pokemons {
+
id
+
}
+
}
+
`);
+23
packages/example-external-generator/tsconfig.json
···
+
{
+
"compilerOptions": {
+
"plugins": [
+
{
+
"name": "@0no-co/graphqlsp",
+
"schema": "./schema.graphql",
+
"disableTypegen": true,
+
"shouldCheckForColocatedFragments": false,
+
"template": "graphql",
+
"templateIsCallExpression": true
+
}
+
],
+
/* Language and Environment */
+
"target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
+
/* Modules */
+
"module": "commonjs" /* Specify what module code is generated. */,
+
"esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */,
+
"forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
+
/* Type Checking */
+
"strict": true /* Enable all strict type-checking options. */,
+
"skipLibCheck": true /* Skip type checking all .d.ts files. */
+
}
+
}
+5 -80
packages/example/src/Pokemon.generated.ts
···
-
import * as Types from '../__generated__/baseGraphQLSP';
+
import * as Types from "../__generated__/baseGraphQLSP"
import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
-
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;
-
};
+
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 };
-
export type WeaknessFieldsFragment = {
-
__typename: 'Pokemon';
-
weaknesses?: Array<Types.PokemonType | null> | null;
-
};
+
export type WeaknessFieldsFragment = { __typename: 'Pokemon', weaknesses?: Array<Types.PokemonType | null> | null };
-
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>;
-
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>;
+
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>;
+
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
···
**Optional**
+
- `template` the shape of your template, by default `gql`
+
- `templateIsCallExpression` this tells our client that you are using `graphql('doc')`
- `disableTypegen` disables type-generation in general, this could be needed if offset bugs are introduced
- `scalars` allows you to pass an object of scalars that we'll feed into `graphql-code-generator`
- `extraTypes` allows you to specify imports or declare types to help with `scalar` definitions
- `shouldCheckForColocatedFragments` when turned on, this will scan your imports to find
unused fragments and provide a message notifying you about them
+
+
### GraphQL Code Generator client-preset
+
+
For folks using the `client-preset` you can ues the following config
+
+
```json
+
{
+
"compilerOptions": {
+
"plugins": [
+
{
+
"name": "@0no-co/graphqlsp",
+
"schema": "./schema.graphql",
+
"disableTypegen": true,
+
"templateIsCallExpression": true,
+
"template": "graphql"
+
}
+
]
+
}
+
}
+
```
## Fragment masking
+112 -15
packages/graphqlsp/src/ast/index.ts
···
import ts from 'typescript/lib/tsserverlibrary';
-
import {
-
isImportDeclaration,
-
isNoSubstitutionTemplateLiteral,
-
isTaggedTemplateExpression,
-
isTemplateExpression,
-
isTemplateSpan,
-
isToken,
-
} from 'typescript';
import fs from 'fs';
+
import { FragmentDefinitionNode, parse } from 'graphql';
export function isFileDirty(fileName: string, source: ts.SourceFile) {
const contents = fs.readFileSync(fileName, 'utf-8');
···
> = [];
function find(node: ts.Node) {
if (
-
isTaggedTemplateExpression(node) ||
-
isNoSubstitutionTemplateLiteral(node)
+
ts.isTaggedTemplateExpression(node) ||
+
ts.isNoSubstitutionTemplateLiteral(node)
) {
result.push(node);
return;
···
return result;
}
+
export function findAllCallExpressions(
+
sourceFile: ts.SourceFile,
+
template: string,
+
info: ts.server.PluginCreateInfo
+
): {
+
nodes: Array<ts.NoSubstitutionTemplateLiteral>;
+
fragments: Array<FragmentDefinitionNode>;
+
} {
+
const result: Array<ts.NoSubstitutionTemplateLiteral> = [];
+
let fragments: Array<FragmentDefinitionNode> = [];
+
let hasTriedToFindFragments = false;
+
function find(node: ts.Node) {
+
if (ts.isCallExpression(node) && node.expression.getText() === template) {
+
if (!hasTriedToFindFragments) {
+
hasTriedToFindFragments = true;
+
fragments = getAllFragments(sourceFile.fileName, node, info);
+
}
+
const [arg] = node.arguments;
+
if (arg && ts.isNoSubstitutionTemplateLiteral(arg)) {
+
result.push(arg);
+
}
+
return;
+
} else {
+
ts.forEachChild(node, find);
+
}
+
}
+
find(sourceFile);
+
return { nodes: result, fragments };
+
}
+
+
export function getAllFragments(
+
fileName: string,
+
node: ts.CallExpression,
+
info: ts.server.PluginCreateInfo
+
) {
+
let fragments: Array<FragmentDefinitionNode> = [];
+
+
const definitions = info.languageService.getDefinitionAtPosition(
+
fileName,
+
node.expression.getStart()
+
);
+
if (!definitions) return fragments;
+
+
const def = definitions[0];
+
const src = getSource(info, def.fileName);
+
if (!src) return fragments;
+
+
ts.forEachChild(src, node => {
+
if (
+
ts.isVariableStatement(node) &&
+
node.declarationList &&
+
node.declarationList.declarations[0].name.getText() === 'documents'
+
) {
+
const [declaration] = node.declarationList.declarations;
+
if (
+
declaration.initializer &&
+
ts.isObjectLiteralExpression(declaration.initializer)
+
) {
+
declaration.initializer.properties.forEach(property => {
+
if (
+
ts.isPropertyAssignment(property) &&
+
ts.isStringLiteral(property.name)
+
) {
+
try {
+
const possibleFragment = JSON.parse(
+
`${property.name.getText().replace(/'/g, '"')}`
+
);
+
+
if (
+
possibleFragment.includes('fragment ') &&
+
possibleFragment.includes(' on ')
+
) {
+
const parsed = parse(possibleFragment, {
+
noLocation: true,
+
});
+
parsed.definitions.forEach(definition => {
+
if (definition.kind === 'FragmentDefinition') {
+
fragments.push(definition);
+
}
+
});
+
}
+
} catch (e: any) {}
+
}
+
});
+
}
+
}
+
});
+
+
return fragments;
+
}
+
export function findAllImports(
sourceFile: ts.SourceFile
): Array<ts.ImportDeclaration> {
-
return sourceFile.statements.filter(isImportDeclaration);
+
return sourceFile.statements.filter(ts.isImportDeclaration);
}
export function bubbleUpTemplate(node: ts.Node): ts.Node {
while (
-
isNoSubstitutionTemplateLiteral(node) ||
-
isToken(node) ||
-
isTemplateExpression(node) ||
-
isTemplateSpan(node)
+
ts.isNoSubstitutionTemplateLiteral(node) ||
+
ts.isToken(node) ||
+
ts.isTemplateExpression(node) ||
+
ts.isTemplateSpan(node)
+
) {
+
node = node.parent;
+
}
+
+
return node;
+
}
+
+
export function bubbleUpCallExpression(node: ts.Node): ts.Node {
+
while (
+
ts.isNoSubstitutionTemplateLiteral(node) ||
+
ts.isToken(node) ||
+
ts.isTemplateExpression(node) ||
+
ts.isTemplateSpan(node)
) {
node = node.parent;
}
+15 -17
packages/graphqlsp/src/ast/resolve.ts
···
-
import {
-
isAsExpression,
-
isIdentifier,
-
isNoSubstitutionTemplateLiteral,
-
isObjectLiteralExpression,
-
isTaggedTemplateExpression,
-
TaggedTemplateExpression,
-
} from 'typescript';
import { print } from 'graphql';
import ts from 'typescript/lib/tsserverlibrary';
import { findNode } from '.';
···
};
export function resolveTemplate(
-
node: TaggedTemplateExpression,
+
node: ts.TaggedTemplateExpression | ts.NoSubstitutionTemplateLiteral,
filename: string,
info: ts.server.PluginCreateInfo
): TemplateResult {
+
if (ts.isNoSubstitutionTemplateLiteral(node)) {
+
return { combinedText: node.getText().slice(1, -1), resolvedSpans: [] };
+
}
+
let templateText = node.template.getText().slice(1, -1);
if (
-
isNoSubstitutionTemplateLiteral(node.template) ||
+
ts.isNoSubstitutionTemplateLiteral(node.template) ||
node.template.templateSpans.length === 0
) {
return { combinedText: templateText, resolvedSpans: [] };
···
let addedCharacters = 0;
const resolvedSpans = node.template.templateSpans
.map(span => {
-
if (isIdentifier(span.expression)) {
+
if (ts.isIdentifier(span.expression)) {
const definitions = info.languageService.getDefinitionAtPosition(
filename,
span.expression.getStart()
···
};
if (
parent.initializer &&
-
isTaggedTemplateExpression(parent.initializer)
+
ts.isTaggedTemplateExpression(parent.initializer)
) {
const text = resolveTemplate(
parent.initializer,
···
return alteredSpan;
} else if (
parent.initializer &&
-
isAsExpression(parent.initializer) &&
-
isTaggedTemplateExpression(parent.initializer.expression)
+
ts.isAsExpression(parent.initializer) &&
+
ts.isTaggedTemplateExpression(parent.initializer.expression)
) {
const text = resolveTemplate(
parent.initializer.expression,
···
return alteredSpan;
} else if (
parent.initializer &&
-
isAsExpression(parent.initializer) &&
-
isAsExpression(parent.initializer.expression) &&
-
isObjectLiteralExpression(parent.initializer.expression.expression)
+
ts.isAsExpression(parent.initializer) &&
+
ts.isAsExpression(parent.initializer.expression) &&
+
ts.isObjectLiteralExpression(
+
parent.initializer.expression.expression
+
)
) {
const astObject = JSON.parse(
parent.initializer.expression.expression.getText()
+55 -3
packages/graphqlsp/src/autoComplete.ts
···
import {
ScriptElementKind,
isIdentifier,
+
isNoSubstitutionTemplateLiteral,
isTaggedTemplateExpression,
} from 'typescript';
import {
···
} from 'graphql-language-service';
import { FragmentDefinitionNode, GraphQLSchema, Kind, parse } from 'graphql';
-
import { bubbleUpTemplate, findNode, getSource } from './ast';
+
import {
+
bubbleUpCallExpression,
+
bubbleUpTemplate,
+
findNode,
+
getAllFragments,
+
getSource,
+
} from './ast';
import { Cursor } from './ast/cursor';
import { resolveTemplate } from './ast/resolve';
import { getToken } from './ast/token';
import { getSuggestionsForFragmentSpread } from './graphql/getFragmentSpreadSuggestions';
+
import { Logger } from '.';
export function getGraphQLCompletions(
filename: string,
···
schema: { current: GraphQLSchema | null },
info: ts.server.PluginCreateInfo
): ts.WithMetadata<ts.CompletionInfo> | undefined {
+
const logger: Logger = (msg: string) =>
+
info.project.projectService.logger.info(`[GraphQLSP] ${msg}`);
const tagTemplate = info.config.template || 'gql';
+
const isCallExpression = info.config.templateIsCallExpression ?? false;
const source = getSource(info, filename);
if (!source) return undefined;
···
let node = findNode(source, cursorPosition);
if (!node) return undefined;
-
node = bubbleUpTemplate(node);
+
node = isCallExpression
+
? bubbleUpCallExpression(node)
+
: bubbleUpTemplate(node);
-
if (isTaggedTemplateExpression(node)) {
+
if (
+
ts.isCallExpression(node) &&
+
isCallExpression &&
+
node.expression.getText() === tagTemplate &&
+
node.arguments.length > 0 &&
+
isNoSubstitutionTemplateLiteral(node.arguments[0])
+
) {
+
const foundToken = getToken(node.arguments[0], cursorPosition);
+
if (!schema.current || !foundToken) return undefined;
+
+
const queryText = node.arguments[0].getText();
+
const fragments = getAllFragments(filename, node, info);
+
const cursor = new Cursor(foundToken.line, foundToken.start);
+
const items = getAutocompleteSuggestions(
+
schema.current,
+
queryText,
+
cursor,
+
undefined,
+
fragments
+
);
+
+
return {
+
isGlobalCompletion: false,
+
isMemberCompletion: false,
+
isNewIdentifierLocation: false,
+
entries: items.map(suggestion => ({
+
...suggestion,
+
kind: ScriptElementKind.variableElement,
+
name: suggestion.label,
+
kindModifiers: 'declare',
+
sortText: suggestion.sortText || '0',
+
labelDetails: {
+
detail: suggestion.type
+
? ' ' + suggestion.type?.toString()
+
: undefined,
+
description: suggestion.documentation,
+
},
+
})),
+
};
+
} else if (isTaggedTemplateExpression(node)) {
const { template, tag } = node;
if (!isIdentifier(tag) || tag.text !== tagTemplate) return undefined;
+60 -36
packages/graphqlsp/src/diagnostics.ts
···
import ts from 'typescript/lib/tsserverlibrary';
-
import {
-
ImportTypeNode,
-
isAsExpression,
-
isExpressionStatement,
-
isImportTypeNode,
-
isNamedImportBindings,
-
isNamespaceImport,
-
isNoSubstitutionTemplateLiteral,
-
isTaggedTemplateExpression,
-
isTemplateExpression,
-
} from 'typescript';
import { Diagnostic, getDiagnostics } from 'graphql-language-service';
import {
FragmentDefinitionNode,
···
import fnv1a from '@sindresorhus/fnv1a';
import {
+
findAllCallExpressions,
findAllImports,
findAllTaggedTemplateNodes,
getSource,
···
} from './ast';
import { resolveTemplate } from './ast/resolve';
import { generateTypedDocumentNodes } from './graphql/generateTypes';
+
import { Logger } from '.';
export const SEMANTIC_DIAGNOSTIC_CODE = 52001;
export const MISSING_OPERATION_NAME_CODE = 52002;
···
schema: { current: GraphQLSchema | null; version: number },
info: ts.server.PluginCreateInfo
): ts.Diagnostic[] | undefined {
-
const logger = (msg: string) =>
+
const logger: Logger = (msg: string) =>
info.project.projectService.logger.info(`[GraphQLSP] ${msg}`);
-
const disableTypegen = info.config.disableTypegen;
+
const disableTypegen = info.config.disableTypegen ?? false;
const tagTemplate = info.config.template || 'gql';
const scalars = info.config.scalars || {};
const shouldCheckForColocatedFragments =
info.config.shouldCheckForColocatedFragments ?? false;
+
const isCallExpression = info.config.templateIsCallExpression ?? false;
let source = getSource(info, filename);
if (!source) return undefined;
-
const nodes = findAllTaggedTemplateNodes(source);
+
let fragments: Array<FragmentDefinitionNode> = [],
+
nodes: (ts.TaggedTemplateExpression | ts.NoSubstitutionTemplateLiteral)[];
+
if (isCallExpression) {
+
const result = findAllCallExpressions(source, tagTemplate, info);
+
fragments = result.fragments;
+
nodes = result.nodes;
+
} else {
+
nodes = findAllTaggedTemplateNodes(source);
+
}
const texts = nodes.map(node => {
-
if (isNoSubstitutionTemplateLiteral(node) || isTemplateExpression(node)) {
-
if (isTaggedTemplateExpression(node.parent)) {
+
if (
+
(ts.isNoSubstitutionTemplateLiteral(node) ||
+
ts.isTemplateExpression(node)) &&
+
!isCallExpression
+
) {
+
if (ts.isTaggedTemplateExpression(node.parent)) {
node = node.parent;
} else {
return undefined;
···
.map(originalNode => {
let node = originalNode;
if (
-
isNoSubstitutionTemplateLiteral(node) ||
-
isTemplateExpression(node)
+
!isCallExpression &&
+
(ts.isNoSubstitutionTemplateLiteral(node) ||
+
ts.isTemplateExpression(node))
) {
-
if (isTaggedTemplateExpression(node.parent)) {
+
if (ts.isTaggedTemplateExpression(node.parent)) {
node = node.parent;
} else {
return undefined;
···
const lines = text.split('\n');
let isExpression = false;
-
if (isAsExpression(node.parent)) {
-
if (isExpressionStatement(node.parent.parent)) {
-
isExpression = true;
-
}
-
} else {
-
if (isExpressionStatement(node.parent)) {
+
if (ts.isAsExpression(node.parent)) {
+
if (ts.isExpressionStatement(node.parent.parent)) {
isExpression = true;
}
+
} else if (ts.isExpressionStatement(node.parent)) {
+
isExpression = true;
}
// When we are dealing with a plain gql statement we have to add two these can be recognised
// by the fact that the parent is an expressionStatement
let startingPosition =
-
node.pos + (tagTemplate.length + (isExpression ? 2 : 1));
+
node.pos +
+
(isCallExpression ? 0 : tagTemplate.length + (isExpression ? 2 : 1));
const endPosition = startingPosition + node.getText().length;
-
const graphQLDiagnostics = getDiagnostics(text, schema.current)
+
+
let docFragments = [...fragments];
+
if (isCallExpression) {
+
const documentFragments = parse(text, {
+
noLocation: true,
+
}).definitions.filter(x => x.kind === Kind.FRAGMENT_DEFINITION);
+
docFragments = docFragments.filter(
+
x =>
+
!documentFragments.some(
+
y =>
+
y.kind === Kind.FRAGMENT_DEFINITION &&
+
y.name.value === x.name.value
+
)
+
);
+
}
+
+
const graphQLDiagnostics = getDiagnostics(
+
text,
+
schema.current,
+
undefined,
+
undefined,
+
docFragments
+
)
.map(x => {
const { start, end } = x.range;
···
if (
imp.importClause.namedBindings &&
-
isNamespaceImport(imp.importClause.namedBindings)
+
ts.isNamespaceImport(imp.importClause.namedBindings)
) {
// TODO: we might need to warn here when the fragment is unused as a namespace import
return;
} else if (
imp.importClause.namedBindings &&
-
isNamedImportBindings(imp.importClause.namedBindings)
+
ts.isNamedImportBindings(imp.importClause.namedBindings)
) {
imp.importClause.namedBindings.elements.forEach(el => {
importedNames.push(el.name.text);
···
if (template) {
let node = template;
if (
-
isNoSubstitutionTemplateLiteral(node) ||
-
isTemplateExpression(node)
+
ts.isNoSubstitutionTemplateLiteral(node) ||
+
ts.isTemplateExpression(node)
) {
-
if (isTaggedTemplateExpression(node.parent)) {
+
if (ts.isTaggedTemplateExpression(node.parent)) {
node = node.parent;
} else {
return;
···
.filter(Boolean);
if (missingImports.length) {
-
// TODO: we could use getCodeFixesAtPosition
-
// to build on this
tsDiagnostics.push({
file: source,
length: imp.getText().length,
···
// This checks whether one of the children is an import-type
// which is a short-circuit if there is no as
const typeImport = parentChildren.find(x =>
-
isImportTypeNode(x)
-
) as ImportTypeNode;
+
ts.isImportTypeNode(x)
+
) as ts.ImportTypeNode;
if (typeImport && typeImport.getText().includes(exportName))
return sourceText;
+2 -1
packages/graphqlsp/src/index.ts
···
type Config = {
schema: SchemaOrigin | string;
template?: string;
+
templateIsCallExpression?: boolean;
disableTypegen?: boolean;
extraTypes?: string;
scalars?: Record<string, unknown>;
···
const scalars = config.scalars || {};
const extraTypes = config.extraTypes || '';
-
const disableTypegen = config.disableTypegen || false;
+
const disableTypegen = config.disableTypegen ?? false;
const proxy = createBasicDecorator(info);
+37 -8
packages/graphqlsp/src/quickInfo.ts
···
import ts from 'typescript/lib/tsserverlibrary';
-
import { isIdentifier, isTaggedTemplateExpression } from 'typescript';
import { getHoverInformation } from 'graphql-language-service';
import { GraphQLSchema } from 'graphql';
-
import { bubbleUpTemplate, findNode, getSource } from './ast';
+
import {
+
bubbleUpCallExpression,
+
bubbleUpTemplate,
+
findNode,
+
getSource,
+
} from './ast';
import { resolveTemplate } from './ast/resolve';
import { getToken } from './ast/token';
import { Cursor } from './ast/cursor';
···
schema: { current: GraphQLSchema | null },
info: ts.server.PluginCreateInfo
): ts.QuickInfo | undefined {
-
const logger = (msg: string) =>
-
info.project.projectService.logger.info(`[GraphQLSP] ${msg}`);
-
const tagTemplate = info.config.template || 'gql';
+
const isCallExpression = info.config.templateIsCallExpression ?? false;
const source = getSource(info, filename);
if (!source) return undefined;
···
let node = findNode(source, cursorPosition);
if (!node) return undefined;
-
node = bubbleUpTemplate(node);
+
node = isCallExpression
+
? bubbleUpCallExpression(node)
+
: bubbleUpTemplate(node);
+
+
if (
+
ts.isCallExpression(node) &&
+
isCallExpression &&
+
node.expression.getText() === tagTemplate &&
+
node.arguments.length > 0 &&
+
ts.isNoSubstitutionTemplateLiteral(node.arguments[0])
+
) {
+
const foundToken = getToken(node.arguments[0], cursorPosition);
+
if (!schema.current || !foundToken) return undefined;
+
+
const queryText = node.arguments[0].getText();
+
const cursor = new Cursor(foundToken.line, foundToken.start);
+
const hoverInfo = getHoverInformation(schema.current, queryText, cursor);
-
if (isTaggedTemplateExpression(node)) {
+
return {
+
kind: ts.ScriptElementKind.string,
+
textSpan: {
+
start: cursorPosition,
+
length: 1,
+
},
+
kindModifiers: '',
+
displayParts: Array.isArray(hoverInfo)
+
? hoverInfo.map(item => ({ kind: '', text: item as string }))
+
: [{ kind: '', text: hoverInfo as string }],
+
};
+
} else if (ts.isTaggedTemplateExpression(node)) {
const { template, tag } = node;
-
if (!isIdentifier(tag) || tag.text !== tagTemplate) return undefined;
+
if (!ts.isIdentifier(tag) || tag.text !== tagTemplate) return undefined;
const foundToken = getToken(template, cursorPosition);
+1601 -4
pnpm-lock.yaml
···
specifier: ^5.0.0
version: 5.0.4
+
packages/example-external-generator:
+
dependencies:
+
'@graphql-typed-document-node/core':
+
specifier: ^3.2.0
+
version: 3.2.0(graphql@16.8.1)
+
'@urql/core':
+
specifier: ^3.0.0
+
version: 3.2.2(graphql@16.8.1)
+
graphql:
+
specifier: ^16.8.1
+
version: 16.8.1
+
devDependencies:
+
'@0no-co/graphqlsp':
+
specifier: file:../graphqlsp
+
version: file:packages/graphqlsp(graphql@16.8.1)
+
'@graphql-codegen/cli':
+
specifier: ^5.0.0
+
version: 5.0.0(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.0.4)
+
'@graphql-codegen/client-preset':
+
specifier: ^4.1.0
+
version: 4.1.0(graphql@16.8.1)
+
ts-node:
+
specifier: ^10.9.1
+
version: 10.9.1(@types/node@18.15.11)(typescript@5.0.4)
+
typescript:
+
specifier: ^5.0.4
+
version: 5.0.4
+
packages/graphqlsp:
dependencies:
'@graphql-codegen/add':
···
version: link:../../../packages/graphqlsp
'@urql/core':
specifier: ^4.0.4
-
version: 4.0.4
+
version: 4.0.4(graphql@16.8.1)
+
devDependencies:
+
typescript:
+
specifier: ^5.0.4
+
version: 5.0.4
+
+
test/e2e/fixture-project-client-preset:
+
dependencies:
+
'@0no-co/graphqlsp':
+
specifier: workspace:*
+
version: link:../../../packages/graphqlsp
+
'@graphql-typed-document-node/core':
+
specifier: ^3.0.0
+
version: 3.2.0(graphql@16.8.1)
+
'@urql/core':
+
specifier: ^4.0.4
+
version: 4.0.4(graphql@16.8.1)
+
graphql:
+
specifier: ^16.0.0
+
version: 16.8.1
devDependencies:
typescript:
specifier: ^5.0.4
···
packages:
-
/@0no-co/graphql.web@1.0.0:
+
/@0no-co/graphql.web@1.0.0(graphql@16.8.1):
resolution: {integrity: sha512-JBq2pWyDchE1vVjj/+c4dzZ8stbpew4RrzpZ3vYdn1WJFGHfYg6YIX1fDdMKtSXJJM9FUlsoDOxemr9WMM2p+A==}
peerDependencies:
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0
peerDependenciesMeta:
graphql:
optional: true
+
dependencies:
+
graphql: 16.8.1
dev: false
/@ampproject/remapping@2.2.0:
···
- encoding
- supports-color
+
/@ardatan/sync-fetch@0.0.1:
+
resolution: {integrity: sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==}
+
engines: {node: '>=14'}
+
dependencies:
+
node-fetch: 2.6.7
+
transitivePeerDependencies:
+
- encoding
+
dev: true
+
/@babel/code-frame@7.18.6:
resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/highlight': 7.18.6
+
/@babel/code-frame@7.23.4:
+
resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@babel/highlight': 7.23.4
+
chalk: 2.4.2
+
dev: true
+
/@babel/compat-data@7.20.5:
resolution: {integrity: sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==}
engines: {node: '>=6.9.0'}
+
+
/@babel/compat-data@7.23.3:
+
resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==}
+
engines: {node: '>=6.9.0'}
+
dev: true
/@babel/core@7.20.5:
resolution: {integrity: sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==}
···
transitivePeerDependencies:
- supports-color
+
/@babel/core@7.23.3:
+
resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@ampproject/remapping': 2.2.0
+
'@babel/code-frame': 7.23.4
+
'@babel/generator': 7.23.4
+
'@babel/helper-compilation-targets': 7.22.15
+
'@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3)
+
'@babel/helpers': 7.23.4
+
'@babel/parser': 7.23.4
+
'@babel/template': 7.22.15
+
'@babel/traverse': 7.23.4
+
'@babel/types': 7.23.4
+
convert-source-map: 2.0.0
+
debug: 4.3.4
+
gensync: 1.0.0-beta.2
+
json5: 2.2.3
+
semver: 6.3.1
+
transitivePeerDependencies:
+
- supports-color
+
dev: true
+
/@babel/generator@7.20.5:
resolution: {integrity: sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==}
engines: {node: '>=6.9.0'}
···
'@jridgewell/gen-mapping': 0.3.2
jsesc: 2.5.2
+
/@babel/generator@7.23.4:
+
resolution: {integrity: sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@babel/types': 7.23.4
+
'@jridgewell/gen-mapping': 0.3.2
+
'@jridgewell/trace-mapping': 0.3.20
+
jsesc: 2.5.2
+
dev: true
+
/@babel/helper-annotate-as-pure@7.18.6:
resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==}
engines: {node: '>=6.9.0'}
···
browserslist: 4.21.4
semver: 6.3.0
+
/@babel/helper-compilation-targets@7.22.15:
+
resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@babel/compat-data': 7.23.3
+
'@babel/helper-validator-option': 7.22.15
+
browserslist: 4.22.1
+
lru-cache: 5.1.1
+
semver: 6.3.1
+
dev: true
+
/@babel/helper-create-class-features-plugin@7.20.5(@babel/core@7.20.5):
resolution: {integrity: sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==}
engines: {node: '>=6.9.0'}
···
resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==}
engines: {node: '>=6.9.0'}
+
/@babel/helper-environment-visitor@7.22.20:
+
resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
+
engines: {node: '>=6.9.0'}
+
dev: true
+
/@babel/helper-function-name@7.19.0:
resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==}
engines: {node: '>=6.9.0'}
···
'@babel/template': 7.18.10
'@babel/types': 7.20.5
+
/@babel/helper-function-name@7.23.0:
+
resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@babel/template': 7.22.15
+
'@babel/types': 7.23.4
+
dev: true
+
/@babel/helper-hoist-variables@7.18.6:
resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.20.5
+
+
/@babel/helper-hoist-variables@7.22.5:
+
resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@babel/types': 7.23.4
+
dev: true
/@babel/helper-member-expression-to-functions@7.18.9:
resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==}
···
dependencies:
'@babel/types': 7.20.5
+
/@babel/helper-module-imports@7.22.15:
+
resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@babel/types': 7.23.4
+
dev: true
+
/@babel/helper-module-transforms@7.20.2:
resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==}
engines: {node: '>=6.9.0'}
···
transitivePeerDependencies:
- supports-color
+
/@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3):
+
resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==}
+
engines: {node: '>=6.9.0'}
+
peerDependencies:
+
'@babel/core': ^7.0.0
+
dependencies:
+
'@babel/core': 7.23.3
+
'@babel/helper-environment-visitor': 7.22.20
+
'@babel/helper-module-imports': 7.22.15
+
'@babel/helper-simple-access': 7.22.5
+
'@babel/helper-split-export-declaration': 7.22.6
+
'@babel/helper-validator-identifier': 7.22.20
+
dev: true
+
/@babel/helper-optimise-call-expression@7.18.6:
resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==}
engines: {node: '>=6.9.0'}
···
resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==}
engines: {node: '>=6.9.0'}
+
/@babel/helper-plugin-utils@7.22.5:
+
resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==}
+
engines: {node: '>=6.9.0'}
+
dev: true
+
/@babel/helper-replace-supers@7.19.1:
resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==}
engines: {node: '>=6.9.0'}
···
dependencies:
'@babel/types': 7.20.5
+
/@babel/helper-simple-access@7.22.5:
+
resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@babel/types': 7.23.4
+
dev: true
+
/@babel/helper-skip-transparent-expression-wrappers@7.20.0:
resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==}
engines: {node: '>=6.9.0'}
···
dependencies:
'@babel/types': 7.20.5
+
/@babel/helper-split-export-declaration@7.22.6:
+
resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@babel/types': 7.23.4
+
dev: true
+
/@babel/helper-string-parser@7.19.4:
resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
engines: {node: '>=6.9.0'}
+
/@babel/helper-string-parser@7.23.4:
+
resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
+
engines: {node: '>=6.9.0'}
+
dev: true
+
/@babel/helper-validator-identifier@7.19.1:
resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
engines: {node: '>=6.9.0'}
+
+
/@babel/helper-validator-identifier@7.22.20:
+
resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+
engines: {node: '>=6.9.0'}
+
dev: true
/@babel/helper-validator-option@7.18.6:
resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==}
engines: {node: '>=6.9.0'}
+
/@babel/helper-validator-option@7.22.15:
+
resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==}
+
engines: {node: '>=6.9.0'}
+
dev: true
+
/@babel/helpers@7.20.6:
resolution: {integrity: sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==}
engines: {node: '>=6.9.0'}
···
transitivePeerDependencies:
- supports-color
+
/@babel/helpers@7.23.4:
+
resolution: {integrity: sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@babel/template': 7.22.15
+
'@babel/traverse': 7.23.4
+
'@babel/types': 7.23.4
+
transitivePeerDependencies:
+
- supports-color
+
dev: true
+
/@babel/highlight@7.18.6:
resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
engines: {node: '>=6.9.0'}
···
chalk: 2.4.2
js-tokens: 4.0.0
+
/@babel/highlight@7.23.4:
+
resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@babel/helper-validator-identifier': 7.22.20
+
chalk: 2.4.2
+
js-tokens: 4.0.0
+
dev: true
+
/@babel/parser@7.20.5:
resolution: {integrity: sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==}
engines: {node: '>=6.0.0'}
···
dependencies:
'@babel/types': 7.20.5
+
/@babel/parser@7.23.4:
+
resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==}
+
engines: {node: '>=6.0.0'}
+
hasBin: true
+
dependencies:
+
'@babel/types': 7.23.4
+
dev: true
+
/@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.20.5):
resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==}
engines: {node: '>=6.9.0'}
···
dependencies:
'@babel/core': 7.20.5
'@babel/helper-plugin-utils': 7.20.2
+
+
/@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.3):
+
resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==}
+
engines: {node: '>=6.9.0'}
+
peerDependencies:
+
'@babel/core': ^7.0.0-0
+
dependencies:
+
'@babel/core': 7.23.3
+
'@babel/helper-plugin-utils': 7.22.5
+
dev: true
/@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.20.5):
resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==}
···
'@babel/parser': 7.20.5
'@babel/types': 7.20.5
+
/@babel/template@7.22.15:
+
resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@babel/code-frame': 7.23.4
+
'@babel/parser': 7.23.4
+
'@babel/types': 7.23.4
+
dev: true
+
/@babel/traverse@7.20.5:
resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==}
engines: {node: '>=6.9.0'}
···
transitivePeerDependencies:
- supports-color
+
/@babel/traverse@7.23.4:
+
resolution: {integrity: sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@babel/code-frame': 7.23.4
+
'@babel/generator': 7.23.4
+
'@babel/helper-environment-visitor': 7.22.20
+
'@babel/helper-function-name': 7.23.0
+
'@babel/helper-hoist-variables': 7.22.5
+
'@babel/helper-split-export-declaration': 7.22.6
+
'@babel/parser': 7.23.4
+
'@babel/types': 7.23.4
+
debug: 4.3.4
+
globals: 11.12.0
+
transitivePeerDependencies:
+
- supports-color
+
dev: true
+
/@babel/types@7.20.5:
resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==}
engines: {node: '>=6.9.0'}
···
'@babel/helper-validator-identifier': 7.19.1
to-fast-properties: 2.0.0
+
/@babel/types@7.23.4:
+
resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==}
+
engines: {node: '>=6.9.0'}
+
dependencies:
+
'@babel/helper-string-parser': 7.23.4
+
'@babel/helper-validator-identifier': 7.22.20
+
to-fast-properties: 2.0.0
+
dev: true
+
/@changesets/apply-release-plan@6.1.4:
resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==}
dependencies:
···
fs-extra: 7.0.1
human-id: 1.0.2
prettier: 2.8.7
+
dev: true
+
+
/@cspotcode/source-map-support@0.8.1:
+
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+
engines: {node: '>=12'}
+
dependencies:
+
'@jridgewell/trace-mapping': 0.3.9
dev: true
/@esbuild/android-arm64@0.17.16:
···
graphql: 16.8.1
tslib: 2.5.0
+
/@graphql-codegen/cli@5.0.0(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.0.4):
+
resolution: {integrity: sha512-A7J7+be/a6e+/ul2KI5sfJlpoqeqwX8EzktaKCeduyVKgOLA6W5t+NUGf6QumBDXU8PEOqXk3o3F+RAwCWOiqA==}
+
hasBin: true
+
peerDependencies:
+
'@parcel/watcher': ^2.1.0
+
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
+
peerDependenciesMeta:
+
'@parcel/watcher':
+
optional: true
+
dependencies:
+
'@babel/generator': 7.20.5
+
'@babel/template': 7.18.10
+
'@babel/types': 7.20.5
+
'@graphql-codegen/core': 4.0.0(graphql@16.8.1)
+
'@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1)
+
'@graphql-tools/apollo-engine-loader': 8.0.0(graphql@16.8.1)
+
'@graphql-tools/code-file-loader': 8.0.3(graphql@16.8.1)
+
'@graphql-tools/git-loader': 8.0.3(graphql@16.8.1)
+
'@graphql-tools/github-loader': 8.0.0(@types/node@18.15.11)(graphql@16.8.1)
+
'@graphql-tools/graphql-file-loader': 8.0.0(graphql@16.8.1)
+
'@graphql-tools/json-file-loader': 8.0.0(graphql@16.8.1)
+
'@graphql-tools/load': 8.0.1(graphql@16.8.1)
+
'@graphql-tools/prisma-loader': 8.0.2(@types/node@18.15.11)(graphql@16.8.1)
+
'@graphql-tools/url-loader': 8.0.0(@types/node@18.15.11)(graphql@16.8.1)
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
'@whatwg-node/fetch': 0.8.8
+
chalk: 4.1.2
+
cosmiconfig: 8.3.6(typescript@5.0.4)
+
debounce: 1.2.1
+
detect-indent: 6.1.0
+
graphql: 16.8.1
+
graphql-config: 5.0.3(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.0.4)
+
inquirer: 8.2.6
+
is-glob: 4.0.3
+
jiti: 1.21.0
+
json-to-pretty-yaml: 1.2.2
+
listr2: 4.0.5
+
log-symbols: 4.1.0
+
micromatch: 4.0.5
+
shell-quote: 1.8.1
+
string-env-interpolation: 1.0.1
+
ts-log: 2.2.5
+
tslib: 2.5.0
+
yaml: 2.3.2
+
yargs: 17.7.1
+
transitivePeerDependencies:
+
- '@types/node'
+
- bufferutil
+
- cosmiconfig-toml-loader
+
- encoding
+
- enquirer
+
- supports-color
+
- typescript
+
- utf-8-validate
+
dev: true
+
+
/@graphql-codegen/client-preset@4.1.0(graphql@16.8.1):
+
resolution: {integrity: sha512-/3Ymb/fjxIF1+HGmaI1YwSZbWsrZAWMSQjh3dU425eBjctjsVQ6gzGRr+l/gE5F1mtmCf+vlbTAT03heAc/QIw==}
+
peerDependencies:
+
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
+
dependencies:
+
'@babel/helper-plugin-utils': 7.22.5
+
'@babel/template': 7.22.15
+
'@graphql-codegen/add': 5.0.0(graphql@16.8.1)
+
'@graphql-codegen/gql-tag-operations': 4.0.1(graphql@16.8.1)
+
'@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1)
+
'@graphql-codegen/typed-document-node': 5.0.1(graphql@16.8.1)
+
'@graphql-codegen/typescript': 4.0.1(graphql@16.8.1)
+
'@graphql-codegen/typescript-operations': 4.0.1(graphql@16.8.1)
+
'@graphql-codegen/visitor-plugin-common': 4.0.1(graphql@16.8.1)
+
'@graphql-tools/documents': 1.0.0(graphql@16.8.1)
+
'@graphql-tools/utils': 10.0.11(graphql@16.8.1)
+
'@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1)
+
graphql: 16.8.1
+
tslib: 2.5.0
+
transitivePeerDependencies:
+
- encoding
+
- supports-color
+
dev: true
+
/@graphql-codegen/core@4.0.0(graphql@16.8.1):
resolution: {integrity: sha512-JAGRn49lEtSsZVxeIlFVIRxts2lWObR+OQo7V2LHDJ7ohYYw3ilv7nJ8pf8P4GTg/w6ptcYdSdVVdkI8kUHB/Q==}
peerDependencies:
···
graphql: 16.8.1
tslib: 2.5.0
+
/@graphql-codegen/gql-tag-operations@4.0.1(graphql@16.8.1):
+
resolution: {integrity: sha512-qF6wIbBzW8BNT+wiVsBxrYOs2oYcsxQ7mRvCpfEI3HnNZMAST/uX76W8MqFEJvj4mw7NIDv7xYJAcAZIWM5LWw==}
+
peerDependencies:
+
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
+
dependencies:
+
'@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1)
+
'@graphql-codegen/visitor-plugin-common': 4.0.1(graphql@16.8.1)
+
'@graphql-tools/utils': 10.0.11(graphql@16.8.1)
+
auto-bind: 4.0.0
+
graphql: 16.8.1
+
tslib: 2.5.0
+
transitivePeerDependencies:
+
- encoding
+
- supports-color
+
dev: true
+
/@graphql-codegen/plugin-helpers@5.0.0(graphql@16.8.1):
resolution: {integrity: sha512-suL2ZMkBAU2a4YbBHaZvUPsV1z0q3cW6S96Z/eYYfkRIsJoe2vN+wNZ9Xdzmqx0JLmeeFCBSoBGC0imFyXlkDQ==}
peerDependencies:
···
import-from: 4.0.0
lodash: 4.17.21
tslib: 2.5.0
+
+
/@graphql-codegen/plugin-helpers@5.0.1(graphql@16.8.1):
+
resolution: {integrity: sha512-6L5sb9D8wptZhnhLLBcheSPU7Tg//DGWgc5tQBWX46KYTOTQHGqDpv50FxAJJOyFVJrveN9otWk9UT9/yfY4ww==}
+
peerDependencies:
+
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
+
dependencies:
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
change-case-all: 1.0.15
+
common-tags: 1.8.2
+
graphql: 16.8.1
+
import-from: 4.0.0
+
lodash: 4.17.21
+
tslib: 2.5.0
+
dev: true
/@graphql-codegen/schema-ast@4.0.0(graphql@16.8.1):
resolution: {integrity: sha512-WIzkJFa9Gz28FITAPILbt+7A8+yzOyd1NxgwFh7ie+EmO9a5zQK6UQ3U/BviirguXCYnn+AR4dXsoDrSrtRA1g==}
···
- encoding
- supports-color
+
/@graphql-tools/apollo-engine-loader@8.0.0(graphql@16.8.1):
+
resolution: {integrity: sha512-axQTbN5+Yxs1rJ6cWQBOfw3AEeC+fvIuZSfJLPLLvFJLj4pUm9fhxey/g6oQZAAQJqKPfw+tLDUQvnfvRK8Kmg==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@ardatan/sync-fetch': 0.0.1
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
'@whatwg-node/fetch': 0.9.14
+
graphql: 16.8.1
+
tslib: 2.5.0
+
transitivePeerDependencies:
+
- encoding
+
dev: true
+
+
/@graphql-tools/batch-execute@9.0.2(graphql@16.8.1):
+
resolution: {integrity: sha512-Y2uwdZI6ZnatopD/SYfZ1eGuQFI7OU2KGZ2/B/7G9ISmgMl5K+ZZWz/PfIEXeiHirIDhyk54s4uka5rj2xwKqQ==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/utils': 10.0.11(graphql@16.8.1)
+
dataloader: 2.2.2
+
graphql: 16.8.1
+
tslib: 2.5.0
+
value-or-promise: 1.0.12
+
dev: true
+
+
/@graphql-tools/code-file-loader@8.0.3(graphql@16.8.1):
+
resolution: {integrity: sha512-gVnnlWs0Ua+5FkuHHEriFUOI3OIbHv6DS1utxf28n6NkfGMJldC4j0xlJRY0LS6dWK34IGYgD4HelKYz2l8KiA==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/graphql-tag-pluck': 8.1.0(graphql@16.8.1)
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
globby: 11.1.0
+
graphql: 16.8.1
+
tslib: 2.5.0
+
unixify: 1.0.0
+
transitivePeerDependencies:
+
- supports-color
+
dev: true
+
+
/@graphql-tools/delegate@10.0.3(graphql@16.8.1):
+
resolution: {integrity: sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/batch-execute': 9.0.2(graphql@16.8.1)
+
'@graphql-tools/executor': 1.2.0(graphql@16.8.1)
+
'@graphql-tools/schema': 10.0.0(graphql@16.8.1)
+
'@graphql-tools/utils': 10.0.11(graphql@16.8.1)
+
dataloader: 2.2.2
+
graphql: 16.8.1
+
tslib: 2.5.0
+
dev: true
+
+
/@graphql-tools/documents@1.0.0(graphql@16.8.1):
+
resolution: {integrity: sha512-rHGjX1vg/nZ2DKqRGfDPNC55CWZBMldEVcH+91BThRa6JeT80NqXknffLLEZLRUxyikCfkwMsk6xR3UNMqG0Rg==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
graphql: 16.8.1
+
lodash.sortby: 4.7.0
+
tslib: 2.6.2
+
dev: true
+
+
/@graphql-tools/executor-graphql-ws@1.1.0(graphql@16.8.1):
+
resolution: {integrity: sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/utils': 10.0.11(graphql@16.8.1)
+
'@types/ws': 8.5.10
+
graphql: 16.8.1
+
graphql-ws: 5.14.2(graphql@16.8.1)
+
isomorphic-ws: 5.0.0(ws@8.14.2)
+
tslib: 2.5.0
+
ws: 8.14.2
+
transitivePeerDependencies:
+
- bufferutil
+
- utf-8-validate
+
dev: true
+
+
/@graphql-tools/executor-http@1.0.3(@types/node@18.15.11)(graphql@16.8.1):
+
resolution: {integrity: sha512-5WZIMBevRaxMabZ8U2Ty0dTUPy/PpeYSlMNEmC/YJjKKykgSfc/AwSejx2sE4FFKZ0I2kxRKRenyoWMHRAV49Q==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/utils': 10.0.11(graphql@16.8.1)
+
'@repeaterjs/repeater': 3.0.5
+
'@whatwg-node/fetch': 0.9.14
+
extract-files: 11.0.0
+
graphql: 16.8.1
+
meros: 1.3.0(@types/node@18.15.11)
+
tslib: 2.5.0
+
value-or-promise: 1.0.12
+
transitivePeerDependencies:
+
- '@types/node'
+
dev: true
+
+
/@graphql-tools/executor-legacy-ws@1.0.4(graphql@16.8.1):
+
resolution: {integrity: sha512-b7aGuRekZDS+m3af3BIvMKxu15bmVPMt5eGQVuP2v5pxmbaPTh+iv5mx9b3Plt32z5Ke5tycBnNm5urSFtW8ng==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
'@types/ws': 8.5.10
+
graphql: 16.8.1
+
isomorphic-ws: 5.0.0(ws@8.14.2)
+
tslib: 2.5.0
+
ws: 8.14.2
+
transitivePeerDependencies:
+
- bufferutil
+
- utf-8-validate
+
dev: true
+
+
/@graphql-tools/executor@1.2.0(graphql@16.8.1):
+
resolution: {integrity: sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/utils': 10.0.11(graphql@16.8.1)
+
'@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1)
+
'@repeaterjs/repeater': 3.0.5
+
graphql: 16.8.1
+
tslib: 2.5.0
+
value-or-promise: 1.0.12
+
dev: true
+
+
/@graphql-tools/git-loader@8.0.3(graphql@16.8.1):
+
resolution: {integrity: sha512-Iz9KbRUAkuOe8JGTS0qssyJ+D5Snle17W+z9anwWrLFrkBhHrRFUy5AdjZqgJuhls0x30QkZBnnCtnHDBdQ4nA==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/graphql-tag-pluck': 8.1.0(graphql@16.8.1)
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
graphql: 16.8.1
+
is-glob: 4.0.3
+
micromatch: 4.0.5
+
tslib: 2.5.0
+
unixify: 1.0.0
+
transitivePeerDependencies:
+
- supports-color
+
dev: true
+
+
/@graphql-tools/github-loader@8.0.0(@types/node@18.15.11)(graphql@16.8.1):
+
resolution: {integrity: sha512-VuroArWKcG4yaOWzV0r19ElVIV6iH6UKDQn1MXemND0xu5TzrFme0kf3U9o0YwNo0kUYEk9CyFM0BYg4he17FA==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@ardatan/sync-fetch': 0.0.1
+
'@graphql-tools/executor-http': 1.0.3(@types/node@18.15.11)(graphql@16.8.1)
+
'@graphql-tools/graphql-tag-pluck': 8.1.0(graphql@16.8.1)
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
'@whatwg-node/fetch': 0.9.14
+
graphql: 16.8.1
+
tslib: 2.5.0
+
value-or-promise: 1.0.12
+
transitivePeerDependencies:
+
- '@types/node'
+
- encoding
+
- supports-color
+
dev: true
+
+
/@graphql-tools/graphql-file-loader@8.0.0(graphql@16.8.1):
+
resolution: {integrity: sha512-wRXj9Z1IFL3+zJG1HWEY0S4TXal7+s1vVhbZva96MSp0kbb/3JBF7j0cnJ44Eq0ClccMgGCDFqPFXty4JlpaPg==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/import': 7.0.0(graphql@16.8.1)
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
globby: 11.1.0
+
graphql: 16.8.1
+
tslib: 2.5.0
+
unixify: 1.0.0
+
dev: true
+
+
/@graphql-tools/graphql-tag-pluck@8.1.0(graphql@16.8.1):
+
resolution: {integrity: sha512-kt5l6H/7QxQcIaewInTcune6NpATojdFEW98/8xWcgmy7dgXx5vU9e0AicFZIH+ewGyZzTpwFqO2RI03roxj2w==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@babel/core': 7.23.3
+
'@babel/parser': 7.20.5
+
'@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.3)
+
'@babel/traverse': 7.20.5
+
'@babel/types': 7.20.5
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
graphql: 16.8.1
+
tslib: 2.5.0
+
transitivePeerDependencies:
+
- supports-color
+
dev: true
+
+
/@graphql-tools/import@7.0.0(graphql@16.8.1):
+
resolution: {integrity: sha512-NVZiTO8o1GZs6OXzNfjB+5CtQtqsZZpQOq+Uu0w57kdUkT4RlQKlwhT8T81arEsbV55KpzkpFsOZP7J1wdmhBw==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
graphql: 16.8.1
+
resolve-from: 5.0.0
+
tslib: 2.5.0
+
dev: true
+
+
/@graphql-tools/json-file-loader@8.0.0(graphql@16.8.1):
+
resolution: {integrity: sha512-ki6EF/mobBWJjAAC84xNrFMhNfnUFD6Y0rQMGXekrUgY0NdeYXHU0ZUgHzC9O5+55FslqUmAUHABePDHTyZsLg==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
globby: 11.1.0
+
graphql: 16.8.1
+
tslib: 2.5.0
+
unixify: 1.0.0
+
dev: true
+
+
/@graphql-tools/load@8.0.1(graphql@16.8.1):
+
resolution: {integrity: sha512-qSMsKngJhDqRbuWyo3NvakEFqFL6+eSjy8ooJ1o5qYD26N7dqXkKzIMycQsX7rBK19hOuINAUSaRcVWH6hTccw==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/schema': 10.0.0(graphql@16.8.1)
+
'@graphql-tools/utils': 10.0.11(graphql@16.8.1)
+
graphql: 16.8.1
+
p-limit: 3.1.0
+
tslib: 2.5.0
+
dev: true
+
/@graphql-tools/merge@9.0.0(graphql@16.8.1):
resolution: {integrity: sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q==}
engines: {node: '>=16.0.0'}
···
graphql: 16.8.1
tslib: 2.5.0
+
/@graphql-tools/prisma-loader@8.0.2(@types/node@18.15.11)(graphql@16.8.1):
+
resolution: {integrity: sha512-8d28bIB0bZ9Bj0UOz9sHagVPW+6AHeqvGljjERtwCnWl8OCQw2c2pNboYXISLYUG5ub76r4lDciLLTU+Ks7Q0w==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/url-loader': 8.0.0(@types/node@18.15.11)(graphql@16.8.1)
+
'@graphql-tools/utils': 10.0.11(graphql@16.8.1)
+
'@types/js-yaml': 4.0.9
+
'@types/json-stable-stringify': 1.0.36
+
'@whatwg-node/fetch': 0.9.14
+
chalk: 4.1.2
+
debug: 4.3.4
+
dotenv: 16.0.3
+
graphql: 16.8.1
+
graphql-request: 6.1.0(graphql@16.8.1)
+
http-proxy-agent: 7.0.0
+
https-proxy-agent: 7.0.2
+
jose: 5.1.1
+
js-yaml: 4.1.0
+
json-stable-stringify: 1.1.0
+
lodash: 4.17.21
+
scuid: 1.1.0
+
tslib: 2.5.0
+
yaml-ast-parser: 0.0.43
+
transitivePeerDependencies:
+
- '@types/node'
+
- bufferutil
+
- encoding
+
- supports-color
+
- utf-8-validate
+
dev: true
+
/@graphql-tools/relay-operation-optimizer@7.0.0(graphql@16.8.1):
resolution: {integrity: sha512-UNlJi5y3JylhVWU4MBpL0Hun4Q7IoJwv9xYtmAz+CgRa066szzY7dcuPfxrA7cIGgG/Q6TVsKsYaiF4OHPs1Fw==}
engines: {node: '>=16.0.0'}
···
tslib: 2.5.0
value-or-promise: 1.0.12
+
/@graphql-tools/url-loader@8.0.0(@types/node@18.15.11)(graphql@16.8.1):
+
resolution: {integrity: sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@ardatan/sync-fetch': 0.0.1
+
'@graphql-tools/delegate': 10.0.3(graphql@16.8.1)
+
'@graphql-tools/executor-graphql-ws': 1.1.0(graphql@16.8.1)
+
'@graphql-tools/executor-http': 1.0.3(@types/node@18.15.11)(graphql@16.8.1)
+
'@graphql-tools/executor-legacy-ws': 1.0.4(graphql@16.8.1)
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
'@graphql-tools/wrap': 10.0.1(graphql@16.8.1)
+
'@types/ws': 8.5.10
+
'@whatwg-node/fetch': 0.9.14
+
graphql: 16.8.1
+
isomorphic-ws: 5.0.0(ws@8.14.2)
+
tslib: 2.5.0
+
value-or-promise: 1.0.12
+
ws: 8.14.2
+
transitivePeerDependencies:
+
- '@types/node'
+
- bufferutil
+
- encoding
+
- utf-8-validate
+
dev: true
+
/@graphql-tools/utils@10.0.1(graphql@16.8.1):
resolution: {integrity: sha512-i1FozbDGHgdsFA47V/JvQZ0FE8NAy0Eiz7HGCJO2MkNdZAKNnwei66gOq0JWYVFztwpwbVQ09GkKhq7Kjcq5Cw==}
engines: {node: '>=16.0.0'}
···
graphql: 16.8.1
tslib: 2.5.0
+
/@graphql-tools/utils@10.0.11(graphql@16.8.1):
+
resolution: {integrity: sha512-vVjXgKn6zjXIlYBd7yJxCVMYGb5j18gE3hx3Qw3mNsSEsYQXbJbPdlwb7Fc9FogsJei5AaqiQerqH4kAosp1nQ==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1)
+
cross-inspect: 1.0.0
+
dset: 3.1.3
+
graphql: 16.8.1
+
tslib: 2.5.0
+
dev: true
+
+
/@graphql-tools/wrap@10.0.1(graphql@16.8.1):
+
resolution: {integrity: sha512-Cw6hVrKGM2OKBXeuAGltgy4tzuqQE0Nt7t/uAqnuokSXZhMHXJUb124Bnvxc2gPZn5chfJSDafDe4Cp8ZAVJgg==}
+
engines: {node: '>=16.0.0'}
+
peerDependencies:
+
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+
dependencies:
+
'@graphql-tools/delegate': 10.0.3(graphql@16.8.1)
+
'@graphql-tools/schema': 10.0.0(graphql@16.8.1)
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
graphql: 16.8.1
+
tslib: 2.5.0
+
value-or-promise: 1.0.12
+
dev: true
+
/@graphql-typed-document-node/core@3.2.0(graphql@16.8.1):
resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==}
peerDependencies:
···
'@jridgewell/resolve-uri': 3.1.0
'@jridgewell/sourcemap-codec': 1.4.14
+
/@jridgewell/trace-mapping@0.3.20:
+
resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==}
+
dependencies:
+
'@jridgewell/resolve-uri': 3.1.0
+
'@jridgewell/sourcemap-codec': 1.4.15
+
dev: true
+
+
/@jridgewell/trace-mapping@0.3.9:
+
resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+
dependencies:
+
'@jridgewell/resolve-uri': 3.1.0
+
'@jridgewell/sourcemap-codec': 1.4.15
+
dev: true
+
/@manypkg/find-root@1.1.0:
resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==}
dependencies:
···
fastq: 1.13.0
dev: true
+
/@peculiar/asn1-schema@2.3.8:
+
resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==}
+
dependencies:
+
asn1js: 3.0.5
+
pvtsutils: 1.3.5
+
tslib: 2.6.2
+
dev: true
+
+
/@peculiar/json-schema@1.1.12:
+
resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==}
+
engines: {node: '>=8.0.0'}
+
dependencies:
+
tslib: 2.5.0
+
dev: true
+
+
/@peculiar/webcrypto@1.4.3:
+
resolution: {integrity: sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A==}
+
engines: {node: '>=10.12.0'}
+
dependencies:
+
'@peculiar/asn1-schema': 2.3.8
+
'@peculiar/json-schema': 1.1.12
+
pvtsutils: 1.3.5
+
tslib: 2.5.0
+
webcrypto-core: 1.7.7
+
dev: true
+
+
/@repeaterjs/repeater@3.0.5:
+
resolution: {integrity: sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA==}
+
dev: true
+
/@rollup/plugin-terser@0.4.4(rollup@3.20.2):
resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==}
engines: {node: '>=14.0.0'}
···
engines: {node: '>=10'}
dev: true
+
/@tsconfig/node10@1.0.9:
+
resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
+
dev: true
+
+
/@tsconfig/node12@1.0.11:
+
resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+
dev: true
+
+
/@tsconfig/node14@1.0.3:
+
resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+
dev: true
+
+
/@tsconfig/node16@1.0.4:
+
resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+
dev: true
+
/@types/chai-subset@1.3.3:
resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==}
dependencies:
···
ci-info: 3.8.0
dev: true
+
/@types/js-yaml@4.0.9:
+
resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==}
+
dev: true
+
+
/@types/json-stable-stringify@1.0.36:
+
resolution: {integrity: sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw==}
+
dev: true
+
/@types/minimist@1.2.2:
resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==}
dev: true
···
resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==}
dev: true
+
/@types/ws@8.5.10:
+
resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
+
dependencies:
+
'@types/node': 18.15.11
+
dev: true
+
/@urql/core@3.2.2(graphql@16.8.1):
resolution: {integrity: sha512-i046Cz8cZ4xIzGMTyHZrbdgzcFMcKD7+yhCAH5FwWBRjcKrc+RjEOuR9X5AMuBvr8c6IAaE92xAqa4wmlGfWTQ==}
peerDependencies:
···
wonka: 6.3.1
dev: false
-
/@urql/core@4.0.4:
+
/@urql/core@4.0.4(graphql@16.8.1):
resolution: {integrity: sha512-r1rB/VMVpCnfnMTTzCAs+HY+UqOHUgpZ+GimLtU4DCTP3C78DK+m4qr36M7KKleggrKgcpcC1TE8eFEVcKzfSQ==}
dependencies:
-
'@0no-co/graphql.web': 1.0.0
+
'@0no-co/graphql.web': 1.0.0(graphql@16.8.1)
wonka: 6.3.1
transitivePeerDependencies:
- graphql
···
pretty-format: 29.7.0
dev: true
+
/@whatwg-node/events@0.0.3:
+
resolution: {integrity: sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==}
+
dev: true
+
+
/@whatwg-node/events@0.1.1:
+
resolution: {integrity: sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==}
+
engines: {node: '>=16.0.0'}
+
dev: true
+
+
/@whatwg-node/fetch@0.8.8:
+
resolution: {integrity: sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==}
+
dependencies:
+
'@peculiar/webcrypto': 1.4.3
+
'@whatwg-node/node-fetch': 0.3.6
+
busboy: 1.6.0
+
urlpattern-polyfill: 8.0.2
+
web-streams-polyfill: 3.2.1
+
dev: true
+
+
/@whatwg-node/fetch@0.9.14:
+
resolution: {integrity: sha512-wurZC82zzZwXRDSW0OS9l141DynaJQh7Yt0FD1xZ8niX7/Et/7RoiLiltbVU1fSF1RR9z6ndEaTUQBAmddTm1w==}
+
engines: {node: '>=16.0.0'}
+
dependencies:
+
'@whatwg-node/node-fetch': 0.5.1
+
urlpattern-polyfill: 9.0.0
+
dev: true
+
+
/@whatwg-node/node-fetch@0.3.6:
+
resolution: {integrity: sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==}
+
dependencies:
+
'@whatwg-node/events': 0.0.3
+
busboy: 1.6.0
+
fast-querystring: 1.1.2
+
fast-url-parser: 1.1.3
+
tslib: 2.5.0
+
dev: true
+
+
/@whatwg-node/node-fetch@0.5.1:
+
resolution: {integrity: sha512-sQz/s3NyyzIZxQ7PHxDFUMM1k4kQQbi2jU8ILdTbt5+S59ME8aI7XF30O9qohRIIYdSrUvm/OwKQmVP1y6e2WQ==}
+
engines: {node: '>=16.0.0'}
+
dependencies:
+
'@whatwg-node/events': 0.1.1
+
busboy: 1.6.0
+
fast-querystring: 1.1.2
+
fast-url-parser: 1.1.3
+
tslib: 2.5.0
+
dev: true
+
/acorn-walk@8.2.0:
resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
engines: {node: '>=0.4.0'}
···
hasBin: true
dev: true
+
/agent-base@7.1.0:
+
resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
+
engines: {node: '>= 14'}
+
dependencies:
+
debug: 4.3.4
+
transitivePeerDependencies:
+
- supports-color
+
dev: true
+
+
/aggregate-error@3.1.0:
+
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+
engines: {node: '>=8'}
+
dependencies:
+
clean-stack: 2.2.0
+
indent-string: 4.0.0
+
dev: true
+
/ansi-colors@4.1.3:
resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
engines: {node: '>=6'}
+
dev: true
+
+
/ansi-escapes@4.3.2:
+
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+
engines: {node: '>=8'}
+
dependencies:
+
type-fest: 0.21.3
dev: true
/ansi-escapes@5.0.0:
···
engines: {node: '>=12'}
dev: true
+
/arg@4.1.3:
+
resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+
dev: true
+
/argparse@1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
dependencies:
sprintf-js: 1.0.3
+
dev: true
+
+
/argparse@2.0.1:
+
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
dev: true
/array-buffer-byte-length@1.0.0:
···
/asap@2.0.6:
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
+
/asn1js@3.0.5:
+
resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==}
+
engines: {node: '>=12.0.0'}
+
dependencies:
+
pvtsutils: 1.3.5
+
pvutils: 1.1.3
+
tslib: 2.6.2
+
dev: true
+
/assertion-error@1.1.0:
resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
+
dev: true
+
+
/astral-regex@2.0.0:
+
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+
engines: {node: '>=8'}
dev: true
/asynckit@0.4.0:
···
/balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+
/base64-js@1.5.1:
+
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
dev: true
/better-path-resolve@1.0.0:
resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==}
···
is-windows: 1.0.2
dev: true
+
/bl@4.1.0:
+
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+
dependencies:
+
buffer: 5.7.1
+
inherits: 2.0.4
+
readable-stream: 3.6.2
+
dev: true
+
/brace-expansion@1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
dependencies:
···
node-releases: 2.0.6
update-browserslist-db: 1.0.10(browserslist@4.21.4)
+
/browserslist@4.22.1:
+
resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==}
+
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+
hasBin: true
+
dependencies:
+
caniuse-lite: 1.0.30001564
+
electron-to-chromium: 1.4.593
+
node-releases: 2.0.13
+
update-browserslist-db: 1.0.13(browserslist@4.22.1)
+
dev: true
+
/bser@2.1.1:
resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
dependencies:
···
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
dev: true
+
/buffer@5.7.1:
+
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+
dependencies:
+
base64-js: 1.5.1
+
ieee754: 1.2.1
+
dev: true
+
+
/busboy@1.6.0:
+
resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
+
engines: {node: '>=10.16.0'}
+
dependencies:
+
streamsearch: 1.1.0
+
dev: true
+
/cac@6.7.14:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
···
get-intrinsic: 1.2.0
dev: true
+
/call-bind@1.0.5:
+
resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==}
+
dependencies:
+
function-bind: 1.1.2
+
get-intrinsic: 1.2.2
+
set-function-length: 1.1.1
+
dev: true
+
+
/callsites@3.1.0:
+
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+
engines: {node: '>=6'}
+
dev: true
+
/camel-case@4.1.2:
resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
dependencies:
···
/caniuse-lite@1.0.30001436:
resolution: {integrity: sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg==}
+
+
/caniuse-lite@1.0.30001564:
+
resolution: {integrity: sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==}
+
dev: true
/capital-case@1.0.4:
resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==}
···
/ci-info@3.8.0:
resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==}
engines: {node: '>=8'}
+
dev: true
+
+
/clean-stack@2.2.0:
+
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+
engines: {node: '>=6'}
+
dev: true
+
+
/cli-cursor@3.1.0:
+
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+
engines: {node: '>=8'}
+
dependencies:
+
restore-cursor: 3.1.0
dev: true
/cli-cursor@4.0.0:
···
restore-cursor: 4.0.0
dev: true
+
/cli-spinners@2.9.1:
+
resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==}
+
engines: {node: '>=6'}
+
dev: true
+
+
/cli-truncate@2.1.0:
+
resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
+
engines: {node: '>=8'}
+
dependencies:
+
slice-ansi: 3.0.0
+
string-width: 4.2.3
+
dev: true
+
/cli-truncate@3.1.0:
resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
slice-ansi: 5.0.0
string-width: 5.1.2
+
dev: true
+
+
/cli-width@3.0.0:
+
resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
+
engines: {node: '>= 10'}
dev: true
/cliui@6.0.0:
···
/convert-source-map@1.9.0:
resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
/convert-source-map@2.0.0:
+
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
dev: true
+
+
/cosmiconfig@8.3.6(typescript@5.0.4):
+
resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+
engines: {node: '>=14'}
+
peerDependencies:
+
typescript: '>=4.9.5'
+
peerDependenciesMeta:
+
typescript:
+
optional: true
+
dependencies:
+
import-fresh: 3.3.0
+
js-yaml: 4.1.0
+
parse-json: 5.2.0
+
path-type: 4.0.0
+
typescript: 5.0.4
+
dev: true
+
+
/create-require@1.1.1:
+
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+
dev: true
+
/cross-fetch@3.1.5:
resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==}
dependencies:
node-fetch: 2.6.7
transitivePeerDependencies:
- encoding
+
+
/cross-inspect@1.0.0:
+
resolution: {integrity: sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ==}
+
engines: {node: '>=16.0.0'}
+
dependencies:
+
tslib: 2.5.0
+
dev: true
/cross-spawn@5.1.0:
resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==}
···
resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==}
dev: true
+
/dataloader@2.2.2:
+
resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==}
+
dev: true
+
+
/debounce@1.2.1:
+
resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
+
dev: true
+
/debug@4.3.4:
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
engines: {node: '>=6.0'}
···
clone: 1.0.4
dev: true
+
/define-data-property@1.1.1:
+
resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==}
+
engines: {node: '>= 0.4'}
+
dependencies:
+
get-intrinsic: 1.2.2
+
gopd: 1.0.1
+
has-property-descriptors: 1.0.0
+
dev: true
+
/define-properties@1.2.0:
resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
engines: {node: '>= 0.4'}
···
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
dev: true
+
/diff@4.0.2:
+
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+
engines: {node: '>=0.3.1'}
+
dev: true
+
/dir-glob@3.0.1:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'}
···
engines: {node: '>=12'}
dev: true
+
/dset@3.1.3:
+
resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==}
+
engines: {node: '>=4'}
+
dev: true
+
/eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
dev: true
/electron-to-chromium@1.4.284:
resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==}
+
+
/electron-to-chromium@1.4.593:
+
resolution: {integrity: sha512-c7+Hhj87zWmdpmjDONbvNKNo24tvmD4mjal1+qqTYTrlF0/sNpAcDlU0Ki84ftA/5yj3BF2QhSGEC0Rky6larg==}
+
dev: true
/emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
···
tmp: 0.0.33
dev: true
+
/extract-files@11.0.0:
+
resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==}
+
engines: {node: ^12.20 || >= 14.13}
+
dev: true
+
+
/fast-decode-uri-component@1.0.1:
+
resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==}
+
dev: true
+
/fast-glob@3.2.11:
resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==}
engines: {node: '>=8.6.0'}
···
micromatch: 4.0.5
dev: true
+
/fast-querystring@1.1.2:
+
resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==}
+
dependencies:
+
fast-decode-uri-component: 1.0.1
+
dev: true
+
+
/fast-url-parser@1.1.3:
+
resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==}
+
dependencies:
+
punycode: 1.4.1
+
dev: true
+
/fastq@1.13.0:
resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
dependencies:
···
ua-parser-js: 0.7.32
transitivePeerDependencies:
- encoding
+
+
/figures@3.2.0:
+
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+
engines: {node: '>=8'}
+
dependencies:
+
escape-string-regexp: 1.0.5
+
dev: true
/fill-range@7.0.1:
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
···
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
dev: true
+
/function-bind@1.1.2:
+
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
dev: true
+
/function.prototype.name@1.1.5:
resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
engines: {node: '>= 0.4'}
···
has-symbols: 1.0.3
dev: true
+
/get-intrinsic@1.2.2:
+
resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==}
+
dependencies:
+
function-bind: 1.1.2
+
has-proto: 1.0.1
+
has-symbols: 1.0.3
+
hasown: 2.0.0
+
dev: true
+
/get-stream@8.0.1:
resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
engines: {node: '>=16'}
···
resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
dev: true
+
/graphql-config@5.0.3(@types/node@18.15.11)(graphql@16.8.1)(typescript@5.0.4):
+
resolution: {integrity: sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ==}
+
engines: {node: '>= 16.0.0'}
+
peerDependencies:
+
cosmiconfig-toml-loader: ^1.0.0
+
graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+
peerDependenciesMeta:
+
cosmiconfig-toml-loader:
+
optional: true
+
dependencies:
+
'@graphql-tools/graphql-file-loader': 8.0.0(graphql@16.8.1)
+
'@graphql-tools/json-file-loader': 8.0.0(graphql@16.8.1)
+
'@graphql-tools/load': 8.0.1(graphql@16.8.1)
+
'@graphql-tools/merge': 9.0.0(graphql@16.8.1)
+
'@graphql-tools/url-loader': 8.0.0(@types/node@18.15.11)(graphql@16.8.1)
+
'@graphql-tools/utils': 10.0.1(graphql@16.8.1)
+
cosmiconfig: 8.3.6(typescript@5.0.4)
+
graphql: 16.8.1
+
jiti: 1.21.0
+
minimatch: 4.2.3
+
string-env-interpolation: 1.0.1
+
tslib: 2.5.0
+
transitivePeerDependencies:
+
- '@types/node'
+
- bufferutil
+
- encoding
+
- typescript
+
- utf-8-validate
+
dev: true
+
/graphql-language-service@5.2.0(graphql@16.8.1):
resolution: {integrity: sha512-o/ZgTS0pBxWm3hSF4+6GwiV1//DxzoLWEbS38+jqpzzy1d/QXBidwQuVYTOksclbtOJZ3KR/tZ8fi/tI6VpVMg==}
hasBin: true
···
nullthrows: 1.1.1
vscode-languageserver-types: 3.17.2
+
/graphql-request@6.1.0(graphql@16.8.1):
+
resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==}
+
peerDependencies:
+
graphql: 14 - 16
+
dependencies:
+
'@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1)
+
cross-fetch: 3.1.5
+
graphql: 16.8.1
+
transitivePeerDependencies:
+
- encoding
+
dev: true
+
/graphql-tag@2.12.6(graphql@16.8.1):
resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==}
engines: {node: '>=10'}
···
dependencies:
graphql: 16.8.1
tslib: 2.5.0
+
+
/graphql-ws@5.14.2(graphql@16.8.1):
+
resolution: {integrity: sha512-LycmCwhZ+Op2GlHz4BZDsUYHKRiiUz+3r9wbhBATMETNlORQJAaFlAgTFoeRh6xQoQegwYwIylVD1Qns9/DA3w==}
+
engines: {node: '>=10'}
+
peerDependencies:
+
graphql: '>=0.11 <=16'
+
dependencies:
+
graphql: 16.8.1
+
dev: true
/graphql@16.8.1:
resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==}
···
function-bind: 1.1.1
dev: true
+
/hasown@2.0.0:
+
resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==}
+
engines: {node: '>= 0.4'}
+
dependencies:
+
function-bind: 1.1.2
+
dev: true
+
/header-case@2.0.4:
resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==}
dependencies:
···
resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
dev: true
+
/http-proxy-agent@7.0.0:
+
resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==}
+
engines: {node: '>= 14'}
+
dependencies:
+
agent-base: 7.1.0
+
debug: 4.3.4
+
transitivePeerDependencies:
+
- supports-color
+
dev: true
+
+
/https-proxy-agent@7.0.2:
+
resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==}
+
engines: {node: '>= 14'}
+
dependencies:
+
agent-base: 7.1.0
+
debug: 4.3.4
+
transitivePeerDependencies:
+
- supports-color
+
dev: true
+
/human-id@1.0.2:
resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==}
dev: true
···
safer-buffer: 2.1.2
dev: true
+
/ieee754@1.2.1:
+
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
dev: true
+
/ignore@5.2.0:
resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
engines: {node: '>= 4'}
···
resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==}
engines: {node: '>=0.8.0'}
+
/import-fresh@3.3.0:
+
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+
engines: {node: '>=6'}
+
dependencies:
+
parent-module: 1.0.1
+
resolve-from: 4.0.0
+
dev: true
+
/import-from@4.0.0:
resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==}
engines: {node: '>=12.2'}
···
/inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
/inquirer@8.2.6:
+
resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==}
+
engines: {node: '>=12.0.0'}
+
dependencies:
+
ansi-escapes: 4.3.2
+
chalk: 4.1.2
+
cli-cursor: 3.1.0
+
cli-width: 3.0.0
+
external-editor: 3.1.0
+
figures: 3.2.0
+
lodash: 4.17.21
+
mute-stream: 0.0.8
+
ora: 5.4.1
+
run-async: 2.4.1
+
rxjs: 7.8.1
+
string-width: 4.2.3
+
strip-ansi: 6.0.1
+
through: 2.3.8
+
wrap-ansi: 6.2.0
+
dev: true
+
/internal-slot@1.0.5:
resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
engines: {node: '>= 0.4'}
···
is-extglob: 2.1.1
dev: true
+
/is-interactive@1.0.0:
+
resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+
engines: {node: '>=8'}
+
dev: true
+
/is-lower-case@2.0.2:
resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==}
dependencies:
···
dependencies:
unc-path-regex: 0.1.2
+
/is-unicode-supported@0.1.0:
+
resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+
engines: {node: '>=10'}
+
dev: true
+
/is-upper-case@2.0.2:
resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==}
dependencies:
···
resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
engines: {node: '>=0.10.0'}
+
/isarray@2.0.5:
+
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
dev: true
+
/isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true
+
/isomorphic-ws@5.0.0(ws@8.14.2):
+
resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==}
+
peerDependencies:
+
ws: '*'
+
dependencies:
+
ws: 8.14.2
+
dev: true
+
+
/jiti@1.21.0:
+
resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
+
hasBin: true
+
dev: true
+
+
/jose@5.1.1:
+
resolution: {integrity: sha512-bfB+lNxowY49LfrBO0ITUn93JbUhxUN8I11K6oI5hJu/G6PO6fEUddVLjqdD0cQ9SXIHWXuWh7eJYwZF7Z0N/g==}
+
dev: true
+
/js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
···
esprima: 4.0.1
dev: true
+
/js-yaml@4.1.0:
+
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+
hasBin: true
+
dependencies:
+
argparse: 2.0.1
+
dev: true
+
/jsesc@2.5.2:
resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
engines: {node: '>=4'}
···
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
dev: true
+
/json-stable-stringify@1.1.0:
+
resolution: {integrity: sha512-zfA+5SuwYN2VWqN1/5HZaDzQKLJHaBVMZIIM+wuYjdptkaQsqzDdqjqf+lZZJUuJq1aanHiY8LhH8LmH+qBYJA==}
+
engines: {node: '>= 0.4'}
+
dependencies:
+
call-bind: 1.0.5
+
isarray: 2.0.5
+
jsonify: 0.0.1
+
object-keys: 1.1.1
+
dev: true
+
+
/json-to-pretty-yaml@1.2.2:
+
resolution: {integrity: sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==}
+
engines: {node: '>= 0.2.0'}
+
dependencies:
+
remedial: 1.0.8
+
remove-trailing-spaces: 1.0.8
+
dev: true
+
/json5@2.2.1:
resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==}
engines: {node: '>=6'}
hasBin: true
+
/json5@2.2.3:
+
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+
engines: {node: '>=6'}
+
hasBin: true
+
dev: true
+
/jsonc-parser@3.2.0:
resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==}
dev: true
···
resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
optionalDependencies:
graceful-fs: 4.2.11
+
dev: true
+
+
/jsonify@0.0.1:
+
resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==}
dev: true
/kind-of@6.0.3:
···
- supports-color
dev: true
+
/listr2@4.0.5:
+
resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==}
+
engines: {node: '>=12'}
+
peerDependencies:
+
enquirer: '>= 2.3.0 < 3'
+
peerDependenciesMeta:
+
enquirer:
+
optional: true
+
dependencies:
+
cli-truncate: 2.1.0
+
colorette: 2.0.20
+
log-update: 4.0.0
+
p-map: 4.0.0
+
rfdc: 1.3.0
+
rxjs: 7.8.1
+
through: 2.3.8
+
wrap-ansi: 7.0.0
+
dev: true
+
/listr2@7.0.1:
resolution: {integrity: sha512-nz+7hwgbDp8eWNoDgzdl4hA/xDSLrNRzPu1TLgOYs6l5Y+Ma6zVWWy9Oyt9TQFONwKoSPoka3H50D3vD5EuNwg==}
engines: {node: '>=16.0.0'}
···
p-locate: 5.0.0
dev: true
+
/lodash.sortby@4.7.0:
+
resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==}
+
dev: true
+
/lodash.startcase@4.4.0:
resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==}
dev: true
···
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
/log-symbols@4.1.0:
+
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+
engines: {node: '>=10'}
+
dependencies:
+
chalk: 4.1.2
+
is-unicode-supported: 0.1.0
+
dev: true
+
+
/log-update@4.0.0:
+
resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==}
+
engines: {node: '>=10'}
+
dependencies:
+
ansi-escapes: 4.3.2
+
cli-cursor: 3.1.0
+
slice-ansi: 4.0.0
+
wrap-ansi: 6.2.0
+
dev: true
+
/log-update@5.0.1:
resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
···
yallist: 2.1.2
dev: true
+
/lru-cache@5.1.1:
+
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
dependencies:
+
yallist: 3.1.1
+
dev: true
+
/lru-cache@6.0.0:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
···
engines: {node: '>=12'}
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
+
dev: true
+
+
/make-error@1.3.6:
+
resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
dev: true
/map-cache@0.2.2:
···
engines: {node: '>= 8'}
dev: true
+
/meros@1.3.0(@types/node@18.15.11):
+
resolution: {integrity: sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==}
+
engines: {node: '>=13'}
+
peerDependencies:
+
'@types/node': '>=13'
+
peerDependenciesMeta:
+
'@types/node':
+
optional: true
+
dependencies:
+
'@types/node': 18.15.11
+
dev: true
+
/micromatch@4.0.5:
resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
engines: {node: '>=8.6'}
···
dependencies:
brace-expansion: 1.1.11
+
/minimatch@4.2.3:
+
resolution: {integrity: sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng==}
+
engines: {node: '>=10'}
+
dependencies:
+
brace-expansion: 1.1.11
+
dev: true
+
/minimist-options@4.1.0:
resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
engines: {node: '>= 6'}
···
/ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
/mute-stream@0.0.8:
+
resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
+
dev: true
+
/nanoid@3.3.6:
resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
···
/node-int64@0.4.0:
resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+
+
/node-releases@2.0.13:
+
resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
+
dev: true
/node-releases@2.0.6:
resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==}
···
validate-npm-package-license: 3.0.4
dev: true
+
/normalize-path@2.1.1:
+
resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==}
+
engines: {node: '>=0.10.0'}
+
dependencies:
+
remove-trailing-separator: 1.1.0
+
dev: true
+
/npm-run-path@5.1.0:
resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
···
mimic-fn: 4.0.0
dev: true
+
/ora@5.4.1:
+
resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+
engines: {node: '>=10'}
+
dependencies:
+
bl: 4.1.0
+
chalk: 4.1.2
+
cli-cursor: 3.1.0
+
cli-spinners: 2.9.1
+
is-interactive: 1.0.0
+
is-unicode-supported: 0.1.0
+
log-symbols: 4.1.0
+
strip-ansi: 6.0.1
+
wcwidth: 1.0.1
+
dev: true
+
/os-tmpdir@1.0.2:
resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
engines: {node: '>=0.10.0'}
···
engines: {node: '>=6'}
dev: true
+
/p-map@4.0.0:
+
resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
+
engines: {node: '>=10'}
+
dependencies:
+
aggregate-error: 3.1.0
+
dev: true
+
/p-try@2.2.0:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
···
dependencies:
dot-case: 3.0.4
tslib: 2.5.0
+
+
/parent-module@1.0.1:
+
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+
engines: {node: '>=6'}
+
dependencies:
+
callsites: 3.1.0
+
dev: true
/parse-filepath@1.0.2:
resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==}
···
resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==}
dev: true
+
/punycode@1.4.1:
+
resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+
dev: true
+
+
/pvtsutils@1.3.5:
+
resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==}
+
dependencies:
+
tslib: 2.6.2
+
dev: true
+
+
/pvutils@1.1.3:
+
resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==}
+
engines: {node: '>=6.0.0'}
+
dev: true
+
/queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
dev: true
···
strip-bom: 3.0.0
dev: true
+
/readable-stream@3.6.2:
+
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+
engines: {node: '>= 6'}
+
dependencies:
+
inherits: 2.0.4
+
string_decoder: 1.3.0
+
util-deprecate: 1.0.2
+
dev: true
+
/redent@3.0.0:
resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
engines: {node: '>=8'}
···
transitivePeerDependencies:
- encoding
+
/remedial@1.0.8:
+
resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==}
+
dev: true
+
+
/remove-trailing-separator@1.1.0:
+
resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==}
+
dev: true
+
+
/remove-trailing-spaces@1.0.8:
+
resolution: {integrity: sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA==}
+
dev: true
+
/require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
···
/require-main-filename@2.0.0:
resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
+
/resolve-from@4.0.0:
+
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+
engines: {node: '>=4'}
+
dev: true
+
/resolve-from@5.0.0:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
engines: {node: '>=8'}
···
is-core-module: 2.12.0
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
+
dev: true
+
+
/restore-cursor@3.1.0:
+
resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+
engines: {node: '>=8'}
+
dependencies:
+
onetime: 5.1.2
+
signal-exit: 3.0.7
dev: true
/restore-cursor@4.0.0:
···
fsevents: 2.3.2
dev: true
+
/run-async@2.4.1:
+
resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+
engines: {node: '>=0.12.0'}
+
dev: true
+
/run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies:
queue-microtask: 1.2.3
+
dev: true
+
+
/rxjs@7.8.1:
+
resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+
dependencies:
+
tslib: 2.5.0
dev: true
/safe-buffer@5.2.1:
···
/safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
dev: true
+
+
/scuid@1.1.0:
+
resolution: {integrity: sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==}
dev: true
/semver@5.7.1:
···
resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
hasBin: true
+
/semver@6.3.1:
+
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+
hasBin: true
+
dev: true
+
/semver@7.5.4:
resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
engines: {node: '>=10'}
···
/set-blocking@2.0.0:
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+
/set-function-length@1.1.1:
+
resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==}
+
engines: {node: '>= 0.4'}
+
dependencies:
+
define-data-property: 1.1.1
+
get-intrinsic: 1.2.2
+
gopd: 1.0.1
+
has-property-descriptors: 1.0.0
+
dev: true
+
/setimmediate@1.0.5:
resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
···
/shebang-regex@3.0.0:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
+
dev: true
+
+
/shell-quote@1.8.1:
+
resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==}
dev: true
/side-channel@1.0.4:
···
engines: {node: '>=8'}
dev: true
+
/slice-ansi@3.0.0:
+
resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
+
engines: {node: '>=8'}
+
dependencies:
+
ansi-styles: 4.3.0
+
astral-regex: 2.0.0
+
is-fullwidth-code-point: 3.0.0
+
dev: true
+
+
/slice-ansi@4.0.0:
+
resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
+
engines: {node: '>=10'}
+
dependencies:
+
ansi-styles: 4.3.0
+
astral-regex: 2.0.0
+
is-fullwidth-code-point: 3.0.0
+
dev: true
+
/slice-ansi@5.0.0:
resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
engines: {node: '>=12'}
···
mixme: 0.5.9
dev: true
+
/streamsearch@1.1.0:
+
resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
+
engines: {node: '>=10.0.0'}
+
dev: true
+
/string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
+
dev: true
+
+
/string-env-interpolation@1.0.1:
+
resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==}
dev: true
/string-width@4.2.3:
···
es-abstract: 1.21.2
dev: true
+
/string_decoder@1.3.0:
+
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
dependencies:
+
safe-buffer: 5.2.1
+
dev: true
+
/strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
···
source-map-support: 0.5.21
dev: true
+
/through@2.3.8:
+
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
dev: true
+
/tinybench@2.5.1:
resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==}
dev: true
···
engines: {node: '>=8'}
dev: true
+
/ts-log@2.2.5:
+
resolution: {integrity: sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==}
+
dev: true
+
+
/ts-node@10.9.1(@types/node@18.15.11)(typescript@5.0.4):
+
resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
+
hasBin: true
+
peerDependencies:
+
'@swc/core': '>=1.2.50'
+
'@swc/wasm': '>=1.2.50'
+
'@types/node': '*'
+
typescript: '>=2.7'
+
peerDependenciesMeta:
+
'@swc/core':
+
optional: true
+
'@swc/wasm':
+
optional: true
+
dependencies:
+
'@cspotcode/source-map-support': 0.8.1
+
'@tsconfig/node10': 1.0.9
+
'@tsconfig/node12': 1.0.11
+
'@tsconfig/node14': 1.0.3
+
'@tsconfig/node16': 1.0.4
+
'@types/node': 18.15.11
+
acorn: 8.11.2
+
acorn-walk: 8.2.0
+
arg: 4.1.3
+
create-require: 1.1.1
+
diff: 4.0.2
+
make-error: 1.3.6
+
typescript: 5.0.4
+
v8-compile-cache-lib: 3.0.1
+
yn: 3.1.1
+
dev: true
+
/tslib@2.5.0:
resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
+
+
/tslib@2.6.2:
+
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+
dev: true
/tty-table@4.2.1:
resolution: {integrity: sha512-xz0uKo+KakCQ+Dxj1D/tKn2FSyreSYWzdkL/BYhgN6oMW808g8QRMuh1atAV9fjTPbWBjfbkKQpI/5rEcnAc7g==}
···
/type-fest@0.13.1:
resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==}
+
engines: {node: '>=10'}
+
dev: true
+
+
/type-fest@0.21.3:
+
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
engines: {node: '>=10'}
dev: true
···
engines: {node: '>= 4.0.0'}
dev: true
+
/unixify@1.0.0:
+
resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==}
+
engines: {node: '>=0.10.0'}
+
dependencies:
+
normalize-path: 2.1.1
+
dev: true
+
/update-browserslist-db@1.0.10(browserslist@4.21.4):
resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==}
hasBin: true
···
escalade: 3.1.1
picocolors: 1.0.0
+
/update-browserslist-db@1.0.13(browserslist@4.22.1):
+
resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
+
hasBin: true
+
peerDependencies:
+
browserslist: '>= 4.21.0'
+
dependencies:
+
browserslist: 4.22.1
+
escalade: 3.1.1
+
picocolors: 1.0.0
+
dev: true
+
/upper-case-first@2.0.2:
resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==}
dependencies:
···
dependencies:
tslib: 2.5.0
+
/urlpattern-polyfill@8.0.2:
+
resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==}
+
dev: true
+
+
/urlpattern-polyfill@9.0.0:
+
resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==}
+
dev: true
+
+
/util-deprecate@1.0.2:
+
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
dev: true
+
+
/v8-compile-cache-lib@3.0.1:
+
resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+
dev: true
+
/validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
dependencies:
···
defaults: 1.0.4
dev: true
+
/web-streams-polyfill@3.2.1:
+
resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
+
engines: {node: '>= 8'}
+
dev: true
+
+
/webcrypto-core@1.7.7:
+
resolution: {integrity: sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==}
+
dependencies:
+
'@peculiar/asn1-schema': 2.3.8
+
'@peculiar/json-schema': 1.1.12
+
asn1js: 3.0.5
+
pvtsutils: 1.3.5
+
tslib: 2.5.0
+
dev: true
+
/webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
···
/wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
/ws@8.14.2:
+
resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==}
+
engines: {node: '>=10.0.0'}
+
peerDependencies:
+
bufferutil: ^4.0.1
+
utf-8-validate: '>=5.0.2'
+
peerDependenciesMeta:
+
bufferutil:
+
optional: true
+
utf-8-validate:
+
optional: true
+
dev: true
+
/y18n@4.0.3:
resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
···
resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==}
dev: true
+
/yallist@3.1.1:
+
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
dev: true
+
/yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
dev: true
+
+
/yaml-ast-parser@0.0.43:
+
resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==}
dev: true
/yaml@2.3.2:
···
string-width: 4.2.3
y18n: 5.0.8
yargs-parser: 21.1.1
+
dev: true
+
+
/yn@3.1.1:
+
resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+
engines: {node: '>=6'}
dev: true
/yocto-queue@0.1.0:
+402
test/e2e/client-preset.test.ts
···
+
import { expect, afterAll, beforeAll, it, describe } from 'vitest';
+
import { TSServer } from './server';
+
import path from 'node:path';
+
import fs from 'node:fs';
+
import url from 'node:url';
+
import ts from 'typescript/lib/tsserverlibrary';
+
+
const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
+
+
const projectPath = path.resolve(__dirname, 'fixture-project-client-preset');
+
describe('Fragment + operations', () => {
+
const outfileCombo = path.join(projectPath, 'simple.ts');
+
const outfileCombinations = path.join(projectPath, 'fragment.ts');
+
const outfileGql = path.join(projectPath, 'gql', 'gql.ts');
+
const outfileGraphql = path.join(projectPath, 'gql', 'graphql.ts');
+
+
let server: TSServer;
+
beforeAll(async () => {
+
server = new TSServer(projectPath, { debugLog: false });
+
+
server.sendCommand('open', {
+
file: outfileCombo,
+
fileContent: '// empty',
+
scriptKindName: 'TS',
+
} satisfies ts.server.protocol.OpenRequestArgs);
+
server.sendCommand('open', {
+
file: outfileCombinations,
+
fileContent: '// empty',
+
scriptKindName: 'TS',
+
} satisfies ts.server.protocol.OpenRequestArgs);
+
server.sendCommand('open', {
+
file: outfileGql,
+
fileContent: '// empty',
+
scriptKindName: 'TS',
+
} satisfies ts.server.protocol.OpenRequestArgs);
+
server.sendCommand('open', {
+
file: outfileGraphql,
+
fileContent: '// empty',
+
scriptKindName: 'TS',
+
} satisfies ts.server.protocol.OpenRequestArgs);
+
+
server.sendCommand('updateOpen', {
+
openFiles: [
+
{
+
file: outfileGraphql,
+
fileContent: fs.readFileSync(
+
path.join(projectPath, 'fixtures/gql/graphql.ts'),
+
'utf-8'
+
),
+
},
+
{
+
file: outfileGql,
+
fileContent: fs.readFileSync(
+
path.join(projectPath, 'fixtures/gql/gql.ts'),
+
'utf-8'
+
),
+
},
+
{
+
file: outfileCombinations,
+
fileContent: fs.readFileSync(
+
path.join(projectPath, 'fixtures/fragment.ts'),
+
'utf-8'
+
),
+
},
+
{
+
file: outfileCombo,
+
fileContent: fs.readFileSync(
+
path.join(projectPath, 'fixtures/simple.ts'),
+
'utf-8'
+
),
+
},
+
],
+
} satisfies ts.server.protocol.UpdateOpenRequestArgs);
+
+
server.sendCommand('saveto', {
+
file: outfileGraphql,
+
tmpfile: outfileGraphql,
+
} satisfies ts.server.protocol.SavetoRequestArgs);
+
server.sendCommand('saveto', {
+
file: outfileGql,
+
tmpfile: outfileGql,
+
} satisfies ts.server.protocol.SavetoRequestArgs);
+
server.sendCommand('saveto', {
+
file: outfileCombo,
+
tmpfile: outfileCombo,
+
} satisfies ts.server.protocol.SavetoRequestArgs);
+
server.sendCommand('saveto', {
+
file: outfileCombinations,
+
tmpfile: outfileCombinations,
+
} satisfies ts.server.protocol.SavetoRequestArgs);
+
});
+
+
afterAll(() => {
+
try {
+
fs.unlinkSync(outfileCombinations);
+
fs.unlinkSync(outfileCombo);
+
fs.unlinkSync(outfileGql);
+
fs.unlinkSync(outfileGraphql);
+
} catch {}
+
});
+
+
it('gives semantic-diagnostics with preceding fragments', async () => {
+
await server.waitForResponse(
+
e => e.type === 'event' && e.event === 'semanticDiag'
+
);
+
const res = server.responses.filter(
+
resp => resp.type === 'event' && resp.event === 'semanticDiag'
+
);
+
expect(res[0].body.diagnostics).toMatchInlineSnapshot(`
+
[
+
{
+
"category": "warning",
+
"code": 52004,
+
"end": {
+
"line": 10,
+
"offset": 1,
+
},
+
"start": {
+
"line": 9,
+
"offset": 7,
+
},
+
"text": "The field Pokemon.classification is deprecated. And this is the reason why",
+
},
+
]
+
`);
+
}, 30000);
+
+
it('gives quick-info with preceding fragments', async () => {
+
server.send({
+
seq: 9,
+
type: 'request',
+
command: 'quickinfo',
+
arguments: {
+
file: outfileCombinations,
+
line: 6,
+
offset: 8,
+
},
+
});
+
+
await server.waitForResponse(
+
response =>
+
response.type === 'response' && response.command === 'quickinfo'
+
);
+
+
const res = server.responses
+
.reverse()
+
.find(resp => resp.type === 'response' && resp.command === 'quickinfo');
+
+
expect(res).toBeDefined();
+
expect(typeof res?.body).toEqual('object');
+
expect(res?.body.displayString).toEqual(`Pokemon.name: String!`);
+
}, 30000);
+
+
it('gives quick-info with documents', async () => {
+
server.send({
+
seq: 9,
+
type: 'request',
+
command: 'quickinfo',
+
arguments: {
+
file: outfileCombo,
+
line: 5,
+
offset: 10,
+
},
+
});
+
+
await server.waitForResponse(
+
response =>
+
response.type === 'response' && response.command === 'quickinfo'
+
);
+
+
const res = server.responses
+
.reverse()
+
.find(resp => resp.type === 'response' && resp.command === 'quickinfo');
+
+
expect(res).toBeDefined();
+
expect(typeof res?.body).toEqual('object');
+
expect(res?.body.displayString).toEqual(
+
`Query.pokemons: [Pokemon]
+
+
List out all Pokémon, optionally in pages`
+
);
+
}, 30000);
+
+
it('gives suggestions with preceding fragments', async () => {
+
server.send({
+
seq: 10,
+
type: 'request',
+
command: 'completionInfo',
+
arguments: {
+
file: outfileCombinations,
+
line: 8,
+
offset: 5,
+
includeExternalModuleExports: true,
+
includeInsertTextCompletions: true,
+
triggerKind: 1,
+
},
+
});
+
+
await server.waitForResponse(
+
response =>
+
response.type === 'response' && response.command === 'completionInfo'
+
);
+
+
const res = server.responses
+
.reverse()
+
.find(
+
resp => resp.type === 'response' && resp.command === 'completionInfo'
+
);
+
+
expect(res).toBeDefined();
+
expect(typeof res?.body.entries).toEqual('object');
+
expect(res?.body.entries).toMatchInlineSnapshot(`
+
[
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " AttacksConnection",
+
},
+
"name": "attacks",
+
"sortText": "0attacks",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " [EvolutionRequirement]",
+
},
+
"name": "evolutionRequirements",
+
"sortText": "2evolutionRequirements",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " [Pokemon]",
+
},
+
"name": "evolutions",
+
"sortText": "3evolutions",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"description": "Likelihood of an attempt to catch a Pokémon to fail.",
+
"detail": " Float",
+
},
+
"name": "fleeRate",
+
"sortText": "4fleeRate",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " PokemonDimension",
+
},
+
"name": "height",
+
"sortText": "5height",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " ID!",
+
},
+
"name": "id",
+
"sortText": "6id",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"description": "Maximum combat power a Pokémon may achieve at max level.",
+
"detail": " Int",
+
},
+
"name": "maxCP",
+
"sortText": "7maxCP",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"description": "Maximum health points a Pokémon may achieve at max level.",
+
"detail": " Int",
+
},
+
"name": "maxHP",
+
"sortText": "8maxHP",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " String!",
+
},
+
"name": "name",
+
"sortText": "9name",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " [PokemonType]",
+
},
+
"name": "resistant",
+
"sortText": "10resistant",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " [PokemonType]",
+
},
+
"name": "types",
+
"sortText": "11types",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " [PokemonType]",
+
},
+
"name": "weaknesses",
+
"sortText": "12weaknesses",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " PokemonDimension",
+
},
+
"name": "weight",
+
"sortText": "13weight",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"description": "The name of the current Object type at runtime.",
+
"detail": " String!",
+
},
+
"name": "__typename",
+
"sortText": "14__typename",
+
},
+
{
+
"kind": "string",
+
"kindModifiers": "",
+
"name": "
+
fragment pokemonFields on Pokemon {
+
id
+
name
+
attacks {
+
fast {
+
damage
+
name
+
}
+
}
+
}
+
",
+
"replacementSpan": {
+
"end": {
+
"line": 10,
+
"offset": 1,
+
},
+
"start": {
+
"line": 3,
+
"offset": 39,
+
},
+
},
+
"sortText": "11",
+
},
+
{
+
"kind": "string",
+
"kindModifiers": "",
+
"name": "
+
query Pok($limit: Int!) {
+
pokemons(limit: $limit) {
+
id
+
name
+
fleeRate
+
classification
+
...pokemonFields
+
...weaknessFields
+
__typename
+
}
+
}
+
",
+
"replacementSpan": {
+
"end": {
+
"line": 10,
+
"offset": 1,
+
},
+
"start": {
+
"line": 3,
+
"offset": 39,
+
},
+
},
+
"sortText": "11",
+
},
+
]
+
`);
+
}, 30000);
+
});
+3
test/e2e/fixture-project-client-preset/.vscode/settings.json
···
+
{
+
"typescript.tsdk": "node_modules/typescript/lib"
+
}
+115
test/e2e/fixture-project-client-preset/__generated__/baseGraphQLSP.ts
···
+
export type Maybe<T> = T | null;
+
export type InputMaybe<T> = Maybe<T>;
+
export type Exact<T extends { [key: string]: unknown }> = {
+
[K in keyof T]: T[K];
+
};
+
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & {
+
[SubKey in K]?: Maybe<T[SubKey]>;
+
};
+
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & {
+
[SubKey in K]: Maybe<T[SubKey]>;
+
};
+
export type MakeEmpty<
+
T extends { [key: string]: unknown },
+
K extends keyof T
+
> = { [_ in K]?: never };
+
export type Incremental<T> =
+
| T
+
| {
+
[P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never;
+
};
+
/** All built-in and custom scalars, mapped to their actual values */
+
export type Scalars = {
+
ID: { input: string; output: string };
+
String: { input: string; output: string };
+
Boolean: { input: boolean; output: boolean };
+
Int: { input: number; output: number };
+
Float: { input: number; output: number };
+
};
+
+
/** Move a Pokémon can perform with the associated damage and type. */
+
export type Attack = {
+
__typename: 'Attack';
+
damage?: Maybe<Scalars['Int']['output']>;
+
name?: Maybe<Scalars['String']['output']>;
+
type?: Maybe<PokemonType>;
+
};
+
+
export type AttacksConnection = {
+
__typename: 'AttacksConnection';
+
fast?: Maybe<Array<Maybe<Attack>>>;
+
special?: Maybe<Array<Maybe<Attack>>>;
+
};
+
+
/** Requirement that prevents an evolution through regular means of levelling up. */
+
export type EvolutionRequirement = {
+
__typename: 'EvolutionRequirement';
+
amount?: Maybe<Scalars['Int']['output']>;
+
name?: Maybe<Scalars['String']['output']>;
+
};
+
+
export type Pokemon = {
+
__typename: 'Pokemon';
+
attacks?: Maybe<AttacksConnection>;
+
/** @deprecated And this is the reason why */
+
classification?: Maybe<Scalars['String']['output']>;
+
evolutionRequirements?: Maybe<Array<Maybe<EvolutionRequirement>>>;
+
evolutions?: Maybe<Array<Maybe<Pokemon>>>;
+
/** Likelihood of an attempt to catch a Pokémon to fail. */
+
fleeRate?: Maybe<Scalars['Float']['output']>;
+
height?: Maybe<PokemonDimension>;
+
id: Scalars['ID']['output'];
+
/** Maximum combat power a Pokémon may achieve at max level. */
+
maxCP?: Maybe<Scalars['Int']['output']>;
+
/** Maximum health points a Pokémon may achieve at max level. */
+
maxHP?: Maybe<Scalars['Int']['output']>;
+
name: Scalars['String']['output'];
+
resistant?: Maybe<Array<Maybe<PokemonType>>>;
+
types?: Maybe<Array<Maybe<PokemonType>>>;
+
weaknesses?: Maybe<Array<Maybe<PokemonType>>>;
+
weight?: Maybe<PokemonDimension>;
+
};
+
+
export type PokemonDimension = {
+
__typename: 'PokemonDimension';
+
maximum?: Maybe<Scalars['String']['output']>;
+
minimum?: Maybe<Scalars['String']['output']>;
+
};
+
+
/** Elemental property associated with either a Pokémon or one of their moves. */
+
export type PokemonType =
+
| 'Bug'
+
| 'Dark'
+
| 'Dragon'
+
| 'Electric'
+
| 'Fairy'
+
| 'Fighting'
+
| 'Fire'
+
| 'Flying'
+
| 'Ghost'
+
| 'Grass'
+
| 'Ground'
+
| 'Ice'
+
| 'Normal'
+
| 'Poison'
+
| 'Psychic'
+
| 'Rock'
+
| 'Steel'
+
| 'Water';
+
+
export type Query = {
+
__typename: 'Query';
+
/** Get a single Pokémon by its ID, a three character long identifier padded with zeroes */
+
pokemon?: Maybe<Pokemon>;
+
/** List out all Pokémon, optionally in pages */
+
pokemons?: Maybe<Array<Maybe<Pokemon>>>;
+
};
+
+
export type QueryPokemonArgs = {
+
id: Scalars['ID']['input'];
+
};
+
+
export type QueryPokemonsArgs = {
+
limit?: InputMaybe<Scalars['Int']['input']>;
+
skip?: InputMaybe<Scalars['Int']['input']>;
+
};
+10
test/e2e/fixture-project-client-preset/fixtures/fragment.ts
···
+
import { graphql } from './gql/gql';
+
+
export const PokemonFields = graphql(`
+
fragment pokemonFields on Pokemon {
+
id
+
name
+
fleeRate
+
+
}
+
`);
+85
test/e2e/fixture-project-client-preset/fixtures/gql/fragment-masking.ts
···
+
import {
+
ResultOf,
+
DocumentTypeDecoration,
+
TypedDocumentNode,
+
} from '@graphql-typed-document-node/core';
+
import { FragmentDefinitionNode } from 'graphql';
+
import { Incremental } from './graphql';
+
+
export type FragmentType<
+
TDocumentType extends DocumentTypeDecoration<any, any>
+
> = TDocumentType extends DocumentTypeDecoration<infer TType, any>
+
? [TType] extends [{ ' $fragmentName'?: infer TKey }]
+
? TKey extends string
+
? { ' $fragmentRefs'?: { [key in TKey]: TType } }
+
: never
+
: never
+
: never;
+
+
// return non-nullable if `fragmentType` is non-nullable
+
export function useFragment<TType>(
+
_documentNode: DocumentTypeDecoration<TType, any>,
+
fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>
+
): TType;
+
// return nullable if `fragmentType` is nullable
+
export function useFragment<TType>(
+
_documentNode: DocumentTypeDecoration<TType, any>,
+
fragmentType:
+
| FragmentType<DocumentTypeDecoration<TType, any>>
+
| null
+
| undefined
+
): TType | null | undefined;
+
// return array of non-nullable if `fragmentType` is array of non-nullable
+
export function useFragment<TType>(
+
_documentNode: DocumentTypeDecoration<TType, any>,
+
fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>
+
): ReadonlyArray<TType>;
+
// return array of nullable if `fragmentType` is array of nullable
+
export function useFragment<TType>(
+
_documentNode: DocumentTypeDecoration<TType, any>,
+
fragmentType:
+
| ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>
+
| null
+
| undefined
+
): ReadonlyArray<TType> | null | undefined;
+
export function useFragment<TType>(
+
_documentNode: DocumentTypeDecoration<TType, any>,
+
fragmentType:
+
| FragmentType<DocumentTypeDecoration<TType, any>>
+
| ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>
+
| null
+
| undefined
+
): TType | ReadonlyArray<TType> | null | undefined {
+
return fragmentType as any;
+
}
+
+
export function makeFragmentData<
+
F extends DocumentTypeDecoration<any, any>,
+
FT extends ResultOf<F>
+
>(data: FT, _fragment: F): FragmentType<F> {
+
return data as FragmentType<F>;
+
}
+
export function isFragmentReady<TQuery, TFrag>(
+
queryNode: DocumentTypeDecoration<TQuery, any>,
+
fragmentNode: TypedDocumentNode<TFrag>,
+
data:
+
| FragmentType<TypedDocumentNode<Incremental<TFrag>, any>>
+
| null
+
| undefined
+
): data is FragmentType<typeof fragmentNode> {
+
const deferredFields = (
+
queryNode as {
+
__meta__?: { deferredFields: Record<string, (keyof TFrag)[]> };
+
}
+
).__meta__?.deferredFields;
+
+
if (!deferredFields) return true;
+
+
const fragDef = fragmentNode.definitions[0] as
+
| FragmentDefinitionNode
+
| undefined;
+
const fragName = fragDef?.name?.value;
+
+
const fields = (fragName && deferredFields[fragName]) || [];
+
return fields.length > 0 && fields.every(field => data && field in data);
+
}
+54
test/e2e/fixture-project-client-preset/fixtures/gql/gql.ts
···
+
/* eslint-disable */
+
import * as types from './graphql';
+
import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
+
+
/**
+
* Map of all GraphQL operations in the project.
+
*
+
* This map has several performance disadvantages:
+
* 1. It is not tree-shakeable, so it will include all operations in the project.
+
* 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.
+
* 3. It does not support dead code elimination, so it will add unused operations.
+
*
+
* Therefore it is highly recommended to use the babel or swc plugin for production.
+
*/
+
const documents = {
+
'\n fragment pokemonFields on Pokemon {\n id\n name\n attacks {\n fast {\n damage\n name\n }\n }\n }\n':
+
types.PokemonFieldsFragmentDoc,
+
'\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':
+
types.PokDocument,
+
};
+
+
/**
+
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+
*
+
*
+
* @example
+
* ```ts
+
* const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);
+
* ```
+
*
+
* The query argument is unknown!
+
* Please regenerate the types.
+
*/
+
export function graphql(source: string): unknown;
+
+
/**
+
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+
*/
+
export function graphql(
+
source: '\n fragment pokemonFields on Pokemon {\n id\n name\n attacks {\n fast {\n damage\n name\n }\n }\n }\n'
+
): (typeof documents)['\n fragment pokemonFields on Pokemon {\n id\n name\n attacks {\n fast {\n damage\n name\n }\n }\n }\n'];
+
/**
+
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+
*/
+
export function graphql(
+
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'
+
): (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'];
+
+
export function graphql(source: string) {
+
return (documents as any)[source] ?? {};
+
}
+
+
export type DocumentType<TDocumentNode extends DocumentNode<any, any>> =
+
TDocumentNode extends DocumentNode<infer TType, any> ? TType : never;
+433
test/e2e/fixture-project-client-preset/fixtures/gql/graphql.ts
···
+
/* eslint-disable */
+
import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
+
export type Maybe<T> = T | null;
+
export type InputMaybe<T> = Maybe<T>;
+
export type Exact<T extends { [key: string]: unknown }> = {
+
[K in keyof T]: T[K];
+
};
+
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & {
+
[SubKey in K]?: Maybe<T[SubKey]>;
+
};
+
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & {
+
[SubKey in K]: Maybe<T[SubKey]>;
+
};
+
export type MakeEmpty<
+
T extends { [key: string]: unknown },
+
K extends keyof T
+
> = { [_ in K]?: never };
+
export type Incremental<T> =
+
| T
+
| {
+
[P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never;
+
};
+
/** All built-in and custom scalars, mapped to their actual values */
+
export type Scalars = {
+
ID: { input: string; output: string };
+
String: { input: string; output: string };
+
Boolean: { input: boolean; output: boolean };
+
Int: { input: number; output: number };
+
Float: { input: number; output: number };
+
};
+
+
/** Move a Pokémon can perform with the associated damage and type. */
+
export type Attack = {
+
__typename?: 'Attack';
+
damage?: Maybe<Scalars['Int']['output']>;
+
name?: Maybe<Scalars['String']['output']>;
+
type?: Maybe<PokemonType>;
+
};
+
+
export type AttacksConnection = {
+
__typename?: 'AttacksConnection';
+
fast?: Maybe<Array<Maybe<Attack>>>;
+
special?: Maybe<Array<Maybe<Attack>>>;
+
};
+
+
/** Requirement that prevents an evolution through regular means of levelling up. */
+
export type EvolutionRequirement = {
+
__typename?: 'EvolutionRequirement';
+
amount?: Maybe<Scalars['Int']['output']>;
+
name?: Maybe<Scalars['String']['output']>;
+
};
+
+
export type Pokemon = {
+
__typename?: 'Pokemon';
+
attacks?: Maybe<AttacksConnection>;
+
/** @deprecated And this is the reason why */
+
classification?: Maybe<Scalars['String']['output']>;
+
evolutionRequirements?: Maybe<Array<Maybe<EvolutionRequirement>>>;
+
evolutions?: Maybe<Array<Maybe<Pokemon>>>;
+
/** Likelihood of an attempt to catch a Pokémon to fail. */
+
fleeRate?: Maybe<Scalars['Float']['output']>;
+
height?: Maybe<PokemonDimension>;
+
id: Scalars['ID']['output'];
+
/** Maximum combat power a Pokémon may achieve at max level. */
+
maxCP?: Maybe<Scalars['Int']['output']>;
+
/** Maximum health points a Pokémon may achieve at max level. */
+
maxHP?: Maybe<Scalars['Int']['output']>;
+
name: Scalars['String']['output'];
+
resistant?: Maybe<Array<Maybe<PokemonType>>>;
+
types?: Maybe<Array<Maybe<PokemonType>>>;
+
weaknesses?: Maybe<Array<Maybe<PokemonType>>>;
+
weight?: Maybe<PokemonDimension>;
+
};
+
+
export type PokemonDimension = {
+
__typename?: 'PokemonDimension';
+
maximum?: Maybe<Scalars['String']['output']>;
+
minimum?: Maybe<Scalars['String']['output']>;
+
};
+
+
/** Elemental property associated with either a Pokémon or one of their moves. */
+
export enum PokemonType {
+
Bug = 'Bug',
+
Dark = 'Dark',
+
Dragon = 'Dragon',
+
Electric = 'Electric',
+
Fairy = 'Fairy',
+
Fighting = 'Fighting',
+
Fire = 'Fire',
+
Flying = 'Flying',
+
Ghost = 'Ghost',
+
Grass = 'Grass',
+
Ground = 'Ground',
+
Ice = 'Ice',
+
Normal = 'Normal',
+
Poison = 'Poison',
+
Psychic = 'Psychic',
+
Rock = 'Rock',
+
Steel = 'Steel',
+
Water = 'Water',
+
}
+
+
export type Query = {
+
__typename?: 'Query';
+
/** Get a single Pokémon by its ID, a three character long identifier padded with zeroes */
+
pokemon?: Maybe<Pokemon>;
+
/** List out all Pokémon, optionally in pages */
+
pokemons?: Maybe<Array<Maybe<Pokemon>>>;
+
};
+
+
export type QueryPokemonArgs = {
+
id: Scalars['ID']['input'];
+
};
+
+
export type QueryPokemonsArgs = {
+
limit?: InputMaybe<Scalars['Int']['input']>;
+
skip?: InputMaybe<Scalars['Int']['input']>;
+
};
+
+
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;
+
} & { ' $fragmentName'?: 'PokemonFieldsFragment' };
+
+
export type WeaknessFieldsFragment = {
+
__typename?: 'Pokemon';
+
weaknesses?: Array<PokemonType | null> | null;
+
} & { ' $fragmentName'?: 'WeaknessFieldsFragment' };
+
+
export type PokQueryVariables = Exact<{
+
limit: Scalars['Int']['input'];
+
}>;
+
+
export type PokQuery = {
+
__typename?: 'Query';
+
pokemons?: Array<
+
| ({
+
__typename: 'Pokemon';
+
id: string;
+
name: string;
+
fleeRate?: number | null;
+
classification?: string | null;
+
} & {
+
' $fragmentRefs'?: {
+
PokemonFieldsFragment: PokemonFieldsFragment;
+
WeaknessFieldsFragment: WeaknessFieldsFragment;
+
};
+
})
+
| null
+
> | null;
+
};
+
+
export type PoQueryVariables = Exact<{
+
id: Scalars['ID']['input'];
+
}>;
+
+
export type PoQuery = {
+
__typename?: 'Query';
+
pokemon?: {
+
__typename: 'Pokemon';
+
id: string;
+
fleeRate?: number | null;
+
} | null;
+
};
+
+
export type PokemonsAreAwesomeQueryVariables = Exact<{ [key: string]: never }>;
+
+
export type PokemonsAreAwesomeQuery = {
+
__typename?: 'Query';
+
pokemons?: Array<{ __typename?: 'Pokemon'; id: string } | null> | null;
+
};
+
+
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>;
+
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>;
+
export const PokDocument = {
+
kind: 'Document',
+
definitions: [
+
{
+
kind: 'OperationDefinition',
+
operation: 'query',
+
name: { kind: 'Name', value: 'Pok' },
+
variableDefinitions: [
+
{
+
kind: 'VariableDefinition',
+
variable: {
+
kind: 'Variable',
+
name: { kind: 'Name', value: 'limit' },
+
},
+
type: {
+
kind: 'NonNullType',
+
type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } },
+
},
+
},
+
],
+
selectionSet: {
+
kind: 'SelectionSet',
+
selections: [
+
{
+
kind: 'Field',
+
name: { kind: 'Name', value: 'pokemons' },
+
arguments: [
+
{
+
kind: 'Argument',
+
name: { kind: 'Name', value: 'limit' },
+
value: {
+
kind: 'Variable',
+
name: { kind: 'Name', value: 'limit' },
+
},
+
},
+
],
+
selectionSet: {
+
kind: 'SelectionSet',
+
selections: [
+
{ kind: 'Field', name: { kind: 'Name', value: 'id' } },
+
{ kind: 'Field', name: { kind: 'Name', value: 'name' } },
+
{ kind: 'Field', name: { kind: 'Name', value: 'fleeRate' } },
+
{
+
kind: 'Field',
+
name: { kind: 'Name', value: 'classification' },
+
},
+
{
+
kind: 'FragmentSpread',
+
name: { kind: 'Name', value: 'pokemonFields' },
+
},
+
{
+
kind: 'FragmentSpread',
+
name: { kind: 'Name', value: 'weaknessFields' },
+
},
+
{ kind: 'Field', name: { kind: 'Name', value: '__typename' } },
+
],
+
},
+
},
+
],
+
},
+
},
+
{
+
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' } },
+
],
+
},
+
},
+
],
+
},
+
},
+
],
+
},
+
},
+
{
+
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<PokQuery, PokQueryVariables>;
+
export const PoDocument = {
+
kind: 'Document',
+
definitions: [
+
{
+
kind: 'OperationDefinition',
+
operation: 'query',
+
name: { kind: 'Name', value: 'Po' },
+
variableDefinitions: [
+
{
+
kind: 'VariableDefinition',
+
variable: { kind: 'Variable', name: { kind: 'Name', value: 'id' } },
+
type: {
+
kind: 'NonNullType',
+
type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } },
+
},
+
},
+
],
+
selectionSet: {
+
kind: 'SelectionSet',
+
selections: [
+
{
+
kind: 'Field',
+
name: { kind: 'Name', value: 'pokemon' },
+
arguments: [
+
{
+
kind: 'Argument',
+
name: { kind: 'Name', value: 'id' },
+
value: {
+
kind: 'Variable',
+
name: { kind: 'Name', value: 'id' },
+
},
+
},
+
],
+
selectionSet: {
+
kind: 'SelectionSet',
+
selections: [
+
{ kind: 'Field', name: { kind: 'Name', value: 'id' } },
+
{ kind: 'Field', name: { kind: 'Name', value: 'fleeRate' } },
+
{ kind: 'Field', name: { kind: 'Name', value: '__typename' } },
+
],
+
},
+
},
+
],
+
},
+
},
+
],
+
} as unknown as DocumentNode<PoQuery, PoQueryVariables>;
+
export const PokemonsAreAwesomeDocument = {
+
kind: 'Document',
+
definitions: [
+
{
+
kind: 'OperationDefinition',
+
operation: 'query',
+
name: { kind: 'Name', value: 'PokemonsAreAwesome' },
+
selectionSet: {
+
kind: 'SelectionSet',
+
selections: [
+
{
+
kind: 'Field',
+
name: { kind: 'Name', value: 'pokemons' },
+
selectionSet: {
+
kind: 'SelectionSet',
+
selections: [
+
{ kind: 'Field', name: { kind: 'Name', value: 'id' } },
+
],
+
},
+
},
+
],
+
},
+
},
+
],
+
} as unknown as DocumentNode<
+
PokemonsAreAwesomeQuery,
+
PokemonsAreAwesomeQueryVariables
+
>;
+2
test/e2e/fixture-project-client-preset/fixtures/gql/index.ts
···
+
export * from './fragment-masking';
+
export * from './gql';
+14
test/e2e/fixture-project-client-preset/fixtures/simple.ts
···
+
import { graphql } from './gql/gql';
+
+
const x = graphql(`
+
query Pok($limit: Int!) {
+
pokemons(limit: $limit) {
+
id
+
name
+
fleeRate
+
classification
+
...pokemonFields
+
__typename
+
}
+
}
+
`);
+13
test/e2e/fixture-project-client-preset/package.json
···
+
{
+
"name": "fixtures",
+
"private": true,
+
"dependencies": {
+
"graphql": "^16.0.0",
+
"@graphql-typed-document-node/core": "^3.0.0",
+
"@0no-co/graphqlsp": "workspace:*",
+
"@urql/core": "^4.0.4"
+
},
+
"devDependencies": {
+
"typescript": "^5.0.4"
+
}
+
}
+94
test/e2e/fixture-project-client-preset/schema.graphql
···
+
### This file was generated by Nexus Schema
+
### Do not make changes to this file directly
+
+
"""
+
Move a Pokémon can perform with the associated damage and type.
+
"""
+
type Attack {
+
damage: Int
+
name: String
+
type: PokemonType
+
}
+
+
type AttacksConnection {
+
fast: [Attack]
+
special: [Attack]
+
}
+
+
"""
+
Requirement that prevents an evolution through regular means of levelling up.
+
"""
+
type EvolutionRequirement {
+
amount: Int
+
name: String
+
}
+
+
type Pokemon {
+
attacks: AttacksConnection
+
classification: String @deprecated(reason: "And this is the reason why")
+
evolutionRequirements: [EvolutionRequirement]
+
evolutions: [Pokemon]
+
+
"""
+
Likelihood of an attempt to catch a Pokémon to fail.
+
"""
+
fleeRate: Float
+
height: PokemonDimension
+
id: ID!
+
+
"""
+
Maximum combat power a Pokémon may achieve at max level.
+
"""
+
maxCP: Int
+
+
"""
+
Maximum health points a Pokémon may achieve at max level.
+
"""
+
maxHP: Int
+
name: String!
+
resistant: [PokemonType]
+
types: [PokemonType]
+
weaknesses: [PokemonType]
+
weight: PokemonDimension
+
}
+
+
type PokemonDimension {
+
maximum: String
+
minimum: String
+
}
+
+
"""
+
Elemental property associated with either a Pokémon or one of their moves.
+
"""
+
enum PokemonType {
+
Bug
+
Dark
+
Dragon
+
Electric
+
Fairy
+
Fighting
+
Fire
+
Flying
+
Ghost
+
Grass
+
Ground
+
Ice
+
Normal
+
Poison
+
Psychic
+
Rock
+
Steel
+
Water
+
}
+
+
type Query {
+
"""
+
Get a single Pokémon by its ID, a three character long identifier padded with zeroes
+
"""
+
pokemon(id: ID!): Pokemon
+
+
"""
+
List out all Pokémon, optionally in pages
+
"""
+
pokemons(limit: Int, skip: Int): [Pokemon]
+
}
+21
test/e2e/fixture-project-client-preset/tsconfig.json
···
+
{
+
"compilerOptions": {
+
"plugins": [
+
{
+
"name": "@0no-co/graphqlsp",
+
"schema": "./schema.graphql",
+
"disableTypegen": true,
+
"shouldCheckForColocatedFragments": false,
+
"template": "graphql",
+
"templateIsCallExpression": true
+
}
+
],
+
"target": "es2016",
+
"esModuleInterop": true,
+
"moduleResolution": "node",
+
"forceConsistentCasingInFileNames": true,
+
"strict": true,
+
"skipLibCheck": true
+
},
+
"exclude": ["node_modules", "fixtures"]
+
}