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

Configure Feed

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

feat(core): add support for multiple schemas (#303)

authored by

Jovi De Croock and committed by
GitHub
b9b34019 c4630f62

+473 -135
+26
.changeset/light-penguins-explain.md
··· 1 + --- 2 + '@0no-co/graphqlsp': minor 3 + --- 4 + 5 + Add support for defining multiple indepenent schemas through a new config property called `schemas`, you can 6 + pass a config like the following: 7 + 8 + ```json 9 + { 10 + "name": "@0no-co/graphqlsp", 11 + "schemas": [ 12 + { 13 + "name": "pokemons", 14 + "schema": "./pokemons.graphql", 15 + "tadaOutputLocation": "./pokemons-introspection.d.ts" 16 + }, 17 + { 18 + "name": "weather", 19 + "schema": "./weather.graphql", 20 + "tadaOutputLocation": "./weather-introspection.d.ts" 21 + } 22 + ] 23 + } 24 + ``` 25 + 26 + The LSP will depending on what `graphql()` template you use figure out what API you are reaching out to.
+6 -11
packages/example-tada/introspection.d.ts
··· 10 10 * instead save to a .ts instead of a .d.ts file. 11 11 */ 12 12 export type introspection = { 13 + name: 'pokemons'; 13 14 query: 'Query'; 14 15 mutation: never; 15 16 subscription: never; 16 17 types: { 17 18 'Attack': { kind: 'OBJECT'; name: 'Attack'; fields: { 'damage': { name: 'damage'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; } }; 'name': { name: 'name'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'type': { name: 'type'; type: { kind: 'ENUM'; name: 'PokemonType'; ofType: null; } }; }; }; 18 - 'Int': unknown; 19 - 'String': unknown; 20 19 'AttacksConnection': { kind: 'OBJECT'; name: 'AttacksConnection'; fields: { 'fast': { name: 'fast'; type: { kind: 'LIST'; name: never; ofType: { kind: 'OBJECT'; name: 'Attack'; ofType: null; }; } }; 'special': { name: 'special'; type: { kind: 'LIST'; name: never; ofType: { kind: 'OBJECT'; name: 'Attack'; ofType: null; }; } }; }; }; 20 + 'Boolean': unknown; 21 21 'EvolutionRequirement': { kind: 'OBJECT'; name: 'EvolutionRequirement'; fields: { 'amount': { name: 'amount'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; } }; 'name': { name: 'name'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; }; }; 22 - 'Pokemon': { kind: 'OBJECT'; name: 'Pokemon'; fields: { 'attacks': { name: 'attacks'; type: { kind: 'OBJECT'; name: 'AttacksConnection'; ofType: null; } }; 'classification': { name: 'classification'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'evolutionRequirements': { name: 'evolutionRequirements'; type: { kind: 'LIST'; name: never; ofType: { kind: 'OBJECT'; name: 'EvolutionRequirement'; ofType: null; }; } }; 'evolutions': { name: 'evolutions'; type: { kind: 'LIST'; name: never; ofType: { kind: 'OBJECT'; name: 'Pokemon'; ofType: null; }; } }; 'fleeRate': { name: 'fleeRate'; type: { kind: 'SCALAR'; name: 'Float'; ofType: null; } }; 'height': { name: 'height'; type: { kind: 'OBJECT'; name: 'PokemonDimension'; ofType: null; } }; 'id': { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'ID'; ofType: null; }; } }; 'maxCP': { name: 'maxCP'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; } }; 'maxHP': { name: 'maxHP'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; } }; 'name': { name: 'name'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'resistant': { name: 'resistant'; type: { kind: 'LIST'; name: never; ofType: { kind: 'ENUM'; name: 'PokemonType'; ofType: null; }; } }; 'types': { name: 'types'; type: { kind: 'LIST'; name: never; ofType: { kind: 'ENUM'; name: 'PokemonType'; ofType: null; }; } }; 'weaknesses': { name: 'weaknesses'; type: { kind: 'LIST'; name: never; ofType: { kind: 'ENUM'; name: 'PokemonType'; ofType: null; }; } }; 'weight': { name: 'weight'; type: { kind: 'OBJECT'; name: 'PokemonDimension'; ofType: null; } }; }; }; 23 22 'Float': unknown; 24 23 'ID': unknown; 24 + 'Int': unknown; 25 + 'Pokemon': { kind: 'OBJECT'; name: 'Pokemon'; fields: { 'attacks': { name: 'attacks'; type: { kind: 'OBJECT'; name: 'AttacksConnection'; ofType: null; } }; 'classification': { name: 'classification'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'evolutionRequirements': { name: 'evolutionRequirements'; type: { kind: 'LIST'; name: never; ofType: { kind: 'OBJECT'; name: 'EvolutionRequirement'; ofType: null; }; } }; 'evolutions': { name: 'evolutions'; type: { kind: 'LIST'; name: never; ofType: { kind: 'OBJECT'; name: 'Pokemon'; ofType: null; }; } }; 'fleeRate': { name: 'fleeRate'; type: { kind: 'SCALAR'; name: 'Float'; ofType: null; } }; 'height': { name: 'height'; type: { kind: 'OBJECT'; name: 'PokemonDimension'; ofType: null; } }; 'id': { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'ID'; ofType: null; }; } }; 'maxCP': { name: 'maxCP'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; } }; 'maxHP': { name: 'maxHP'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; } }; 'name': { name: 'name'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'resistant': { name: 'resistant'; type: { kind: 'LIST'; name: never; ofType: { kind: 'ENUM'; name: 'PokemonType'; ofType: null; }; } }; 'types': { name: 'types'; type: { kind: 'LIST'; name: never; ofType: { kind: 'ENUM'; name: 'PokemonType'; ofType: null; }; } }; 'weaknesses': { name: 'weaknesses'; type: { kind: 'LIST'; name: never; ofType: { kind: 'ENUM'; name: 'PokemonType'; ofType: null; }; } }; 'weight': { name: 'weight'; type: { kind: 'OBJECT'; name: 'PokemonDimension'; ofType: null; } }; }; }; 25 26 'PokemonDimension': { kind: 'OBJECT'; name: 'PokemonDimension'; fields: { 'maximum': { name: 'maximum'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'minimum': { name: 'minimum'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; }; }; 26 - 'PokemonType': { kind: 'ENUM'; name: 'PokemonType'; type: 'Bug' | 'Dark' | 'Dragon' | 'Electric' | 'Fairy' | 'Fighting' | 'Fire' | 'Flying' | 'Ghost' | 'Grass' | 'Ground' | 'Ice' | 'Normal' | 'Poison' | 'Psychic' | 'Rock' | 'Steel' | 'Water'; }; 27 + 'PokemonType': { name: 'PokemonType'; enumValues: 'Bug' | 'Dark' | 'Dragon' | 'Electric' | 'Fairy' | 'Fighting' | 'Fire' | 'Flying' | 'Ghost' | 'Grass' | 'Ground' | 'Ice' | 'Normal' | 'Poison' | 'Psychic' | 'Rock' | 'Steel' | 'Water'; }; 27 28 'Query': { kind: 'OBJECT'; name: 'Query'; fields: { 'pokemon': { name: 'pokemon'; type: { kind: 'OBJECT'; name: 'Pokemon'; ofType: null; } }; 'pokemons': { name: 'pokemons'; type: { kind: 'LIST'; name: never; ofType: { kind: 'OBJECT'; name: 'Pokemon'; ofType: null; }; } }; }; }; 28 - 'Boolean': unknown; 29 + 'String': unknown; 29 30 }; 30 31 }; 31 32 32 33 import * as gqlTada from 'gql.tada'; 33 - 34 - declare module 'gql.tada' { 35 - interface setupSchema { 36 - introspection: introspection; 37 - } 38 - }
+1 -1
packages/example-tada/package.json
··· 11 11 "license": "ISC", 12 12 "dependencies": { 13 13 "@graphql-typed-document-node/core": "^3.2.0", 14 - "gql.tada": "^1.4.0", 14 + "gql.tada": "1.5.9-canary-8711af177005f46fa3e06d990b6ba28e353e7f9b", 15 15 "@urql/core": "^3.0.0", 16 16 "graphql": "^16.8.1", 17 17 "urql": "^4.0.6"
+7 -2
packages/example-tada/tsconfig.json
··· 3 3 "plugins": [ 4 4 { 5 5 "name": "@0no-co/graphqlsp", 6 - "schema": "./schema.graphql", 7 - "tadaOutputLocation": "./introspection.d.ts" 6 + "schemas": [ 7 + { 8 + "name": "pokemons", 9 + "schema": "./schema.graphql", 10 + "tadaOutputLocation": "./introspection.d.ts" 11 + } 12 + ] 8 13 } 9 14 ], 10 15 "jsx": "react-jsx",
+1 -1
packages/graphqlsp/package.json
··· 51 51 "typescript": "^5.3.3" 52 52 }, 53 53 "dependencies": { 54 - "@gql.tada/internal": "^0.1.2", 54 + "@gql.tada/internal": "0.3.0-canary-8711af177005f46fa3e06d990b6ba28e353e7f9b", 55 55 "graphql": "^16.8.1", 56 56 "node-fetch": "^2.0.0" 57 57 },
+47 -8
packages/graphqlsp/src/ast/index.ts
··· 124 124 return wip; 125 125 } 126 126 127 + export const getSchemaName = ( 128 + node: ts.CallExpression, 129 + typeChecker?: ts.TypeChecker 130 + ): string | null => { 131 + if (!typeChecker) return null; 132 + 133 + const expression = ts.isPropertyAccessExpression(node.expression) 134 + ? node.expression.expression 135 + : node.expression; 136 + const type = typeChecker.getTypeAtLocation(expression); 137 + if (type) { 138 + const brandTypeSymbol = type.getProperty('__name'); 139 + if (brandTypeSymbol) { 140 + const brand = typeChecker.getTypeOfSymbol(brandTypeSymbol); 141 + if (brand.isUnionOrIntersection()) { 142 + const found = brand.types.find(x => x.isStringLiteral()); 143 + return found && found.isStringLiteral() ? found.value : null; 144 + } else if (brand.isStringLiteral()) { 145 + return brand.value; 146 + } 147 + } 148 + } 149 + 150 + return null; 151 + }; 152 + 127 153 export function findAllCallExpressions( 128 154 sourceFile: ts.SourceFile, 129 155 info: ts.server.PluginCreateInfo, 130 156 shouldSearchFragments: boolean = true 131 157 ): { 132 - nodes: Array<ts.NoSubstitutionTemplateLiteral>; 158 + nodes: Array<{ 159 + node: ts.NoSubstitutionTemplateLiteral; 160 + schema: string | null; 161 + }>; 133 162 fragments: Array<FragmentDefinitionNode>; 134 163 } { 135 - const result: Array<ts.NoSubstitutionTemplateLiteral> = []; 164 + const typeChecker = info.languageService.getProgram()?.getTypeChecker(); 165 + const result: Array<{ 166 + node: ts.NoSubstitutionTemplateLiteral; 167 + schema: string | null; 168 + }> = []; 136 169 let fragments: Array<FragmentDefinitionNode> = []; 137 170 let hasTriedToFindFragments = shouldSearchFragments ? false : true; 138 171 function find(node: ts.Node) { 139 172 if (ts.isCallExpression(node) && templates.has(node.expression.getText())) { 173 + const name = getSchemaName(node, typeChecker); 174 + 140 175 const [arg, arg2] = node.arguments; 141 176 142 177 if (!hasTriedToFindFragments && !arg2) { ··· 160 195 } 161 196 162 197 if (arg && ts.isNoSubstitutionTemplateLiteral(arg)) { 163 - result.push(arg); 198 + result.push({ node: arg, schema: name }); 164 199 } 165 200 return; 166 201 } else { ··· 172 207 } 173 208 174 209 export function findAllPersistedCallExpressions( 175 - sourceFile: ts.SourceFile 176 - ): Array<ts.CallExpression> { 177 - const result: Array<ts.CallExpression> = []; 210 + sourceFile: ts.SourceFile, 211 + info: ts.server.PluginCreateInfo 212 + ): Array<{ node: ts.CallExpression; schema: string | null }> { 213 + const result: Array<{ node: ts.CallExpression; schema: string | null }> = []; 214 + const typeChecker = info.languageService.getProgram()?.getTypeChecker(); 178 215 function find(node: ts.Node) { 179 - if (ts.isCallExpression(node)) { 216 + if (node && ts.isCallExpression(node)) { 180 217 // This expression ideally for us looks like <template>.persisted 181 218 const expression = node.expression.getText(); 182 219 const parts = expression.split('.'); ··· 185 222 const [template, method] = parts; 186 223 if (!templates.has(template) || method !== 'persisted') return; 187 224 188 - result.push(node); 225 + const name = getSchemaName(node, typeChecker); 226 + 227 + result.push({ node, schema: name }); 189 228 } else { 190 229 ts.forEachChild(node, find); 191 230 }
+15 -4
packages/graphqlsp/src/autoComplete.ts
··· 20 20 bubbleUpTemplate, 21 21 findNode, 22 22 getAllFragments, 23 + getSchemaName, 23 24 getSource, 24 25 } from './ast'; 25 26 import { Cursor } from './ast/cursor'; ··· 27 28 import { getToken } from './ast/token'; 28 29 import { getSuggestionsForFragmentSpread } from './graphql/getFragmentSpreadSuggestions'; 29 30 import { templates } from './ast/templates'; 31 + import { SchemaRef } from './graphql/getSchema'; 30 32 31 33 export function getGraphQLCompletions( 32 34 filename: string, 33 35 cursorPosition: number, 34 - schema: { current: GraphQLSchema | null }, 36 + schema: SchemaRef, 35 37 info: ts.server.PluginCreateInfo 36 38 ): ts.WithMetadata<ts.CompletionInfo> | undefined { 37 39 const isCallExpression = info.config.templateIsCallExpression ?? true; ··· 46 48 ? bubbleUpCallExpression(node) 47 49 : bubbleUpTemplate(node); 48 50 49 - let text, cursor; 51 + let text, cursor, schemaToUse: GraphQLSchema | undefined; 50 52 if ( 51 53 ts.isCallExpression(node) && 52 54 isCallExpression && ··· 54 56 node.arguments.length > 0 && 55 57 ts.isNoSubstitutionTemplateLiteral(node.arguments[0]) 56 58 ) { 59 + const typeChecker = info.languageService.getProgram()?.getTypeChecker(); 60 + const schemaName = getSchemaName(node, typeChecker); 61 + 62 + schemaToUse = 63 + schemaName && schema.multi[schemaName] 64 + ? schema.multi[schemaName]?.schema 65 + : schema.current?.schema; 66 + 57 67 const foundToken = getToken(node.arguments[0], cursorPosition); 58 - if (!schema.current || !foundToken) return undefined; 68 + if (!schemaToUse || !foundToken) return undefined; 59 69 60 70 const queryText = node.arguments[0].getText().slice(1, -1); 61 71 const fragments = getAllFragments(filename, node, info); ··· 88 98 89 99 text = combinedText; 90 100 cursor = new Cursor(foundToken.line, foundToken.start - 1); 101 + schemaToUse = schema.current.schema; 91 102 } else { 92 103 return undefined; 93 104 } 94 105 95 106 const [suggestions, spreadSuggestions] = getSuggestionsInternal( 96 - schema.current, 107 + schemaToUse, 97 108 text, 98 109 cursor 99 110 );
+2 -2
packages/graphqlsp/src/checkImports.ts
··· 174 174 const exports = typeChecker.getExportsOfModule(symbol); 175 175 const exportedNames = exports.map(symb => symb.name); 176 176 const nodes = callExpressions.nodes.filter(x => { 177 - let parent = x.parent; 177 + let parent = x.node.parent; 178 178 while ( 179 179 parent && 180 180 !ts.isSourceFile(parent) && ··· 191 191 }); 192 192 193 193 nodes.forEach(node => { 194 - const text = resolveTemplate(node, src.fileName, info).combinedText; 194 + const text = resolveTemplate(node.node, src.fileName, info).combinedText; 195 195 try { 196 196 const parsed = parse(text, { noLocation: true }); 197 197 if (parsed.definitions.every(x => x.kind === Kind.FRAGMENT_DEFINITION)) {
+37 -19
packages/graphqlsp/src/diagnostics.ts
··· 29 29 getDocumentReferenceFromDocumentNode, 30 30 getDocumentReferenceFromTypeQuery, 31 31 } from './persisted'; 32 + import { SchemaRef } from './graphql/getSchema'; 32 33 33 34 const clientDirectives = new Set([ 34 35 'populate', ··· 76 77 77 78 export function getGraphQLDiagnostics( 78 79 filename: string, 79 - schema: { current: GraphQLSchema | null; version: number }, 80 + schema: SchemaRef, 80 81 info: ts.server.PluginCreateInfo 81 82 ): ts.Diagnostic[] | undefined { 82 83 const isCallExpression = info.config.templateIsCallExpression ?? true; ··· 85 86 if (!source) return undefined; 86 87 87 88 let fragments: Array<FragmentDefinitionNode> = [], 88 - nodes: (ts.TaggedTemplateExpression | ts.NoSubstitutionTemplateLiteral)[]; 89 + nodes: { 90 + node: ts.NoSubstitutionTemplateLiteral | ts.TaggedTemplateExpression; 91 + schema: string | null; 92 + }[]; 89 93 if (isCallExpression) { 90 94 const result = findAllCallExpressions(source, info); 91 95 fragments = result.fragments; 92 96 nodes = result.nodes; 93 97 } else { 94 - nodes = findAllTaggedTemplateNodes(source); 98 + nodes = findAllTaggedTemplateNodes(source).map(x => ({ 99 + node: x, 100 + schema: null, 101 + })); 95 102 } 96 103 97 - const texts = nodes.map(node => { 104 + const texts = nodes.map(({ node }) => { 98 105 if ( 99 106 (ts.isNoSubstitutionTemplateLiteral(node) || 100 107 ts.isTemplateExpression(node)) && ··· 131 138 let fragmentDiagnostics: ts.Diagnostic[] = []; 132 139 133 140 if (isCallExpression) { 134 - const persistedCalls = findAllPersistedCallExpressions(source); 141 + const persistedCalls = findAllPersistedCallExpressions(source, info); 135 142 // We need to check whether the user has correctly inserted a hash, 136 143 // by means of providing an argument to the function and that they 137 144 // are establishing a reference to the document by means of the generic. 138 - // 139 - // OPTIONAL: we could also check whether the hash is out of date with the 140 - // document but this removes support for self-generating identifiers 141 145 const persistedDiagnostics = persistedCalls 142 - .map<ts.Diagnostic | null>(callExpression => { 146 + .map<ts.Diagnostic | null>(found => { 147 + const { node: callExpression } = found; 143 148 if (!callExpression.typeArguments && !callExpression.arguments[1]) { 144 149 return { 145 150 category: ts.DiagnosticCategory.Warning, ··· 252 257 253 258 const hash = callExpression.arguments[0].getText().slice(1, -1); 254 259 if (hash.startsWith('sha256:')) { 255 - const hash = generateHashForDocument( 260 + const generatedHash = generateHashForDocument( 256 261 info, 257 262 initializer.arguments[0], 258 263 foundFilename 259 264 ); 260 - if (!hash) return null; 261 - const upToDateHash = `sha256:${hash}`; 265 + if (!generatedHash) return null; 266 + 267 + const upToDateHash = `sha256:${generatedHash}`; 262 268 if (upToDateHash !== hash) { 263 269 return { 264 270 category: ts.DiagnosticCategory.Warning, ··· 283 289 const moduleSpecifierToFragments = getColocatedFragmentNames(source, info); 284 290 285 291 const usedFragments = new Set(); 286 - nodes.forEach(node => { 292 + nodes.forEach(({ node }) => { 287 293 try { 288 294 const parsed = parse(node.getText().slice(1, -1), { 289 295 noLocation: true, ··· 331 337 nodes, 332 338 fragments, 333 339 }: { 334 - nodes: (ts.TaggedTemplateExpression | ts.NoSubstitutionTemplateLiteral)[]; 340 + nodes: { 341 + node: ts.TaggedTemplateExpression | ts.NoSubstitutionTemplateLiteral; 342 + schema: string | null; 343 + }[]; 335 344 fragments: FragmentDefinitionNode[]; 336 345 }, 337 - schema: { current: GraphQLSchema | null; version: number }, 346 + schema: SchemaRef, 338 347 info: ts.server.PluginCreateInfo 339 348 ) => { 340 349 const filename = source.fileName; ··· 342 351 343 352 const diagnostics = nodes 344 353 .map(originalNode => { 345 - let node = originalNode; 354 + let node = originalNode.node; 346 355 if ( 347 356 !isCallExpression && 348 357 (ts.isNoSubstitutionTemplateLiteral(node) || ··· 397 406 } catch (e) {} 398 407 } 399 408 409 + const schemaToUse = 410 + originalNode.schema && schema.multi[originalNode.schema] 411 + ? schema.multi[originalNode.schema]?.schema 412 + : schema.current?.schema; 413 + 414 + if (!schemaToUse) { 415 + return undefined; 416 + } 417 + 400 418 const graphQLDiagnostics = getDiagnostics( 401 419 text, 402 - schema.current, 420 + schemaToUse, 403 421 undefined, 404 422 undefined, 405 423 docFragments ··· 482 500 message: 'Operation should contain a name.', 483 501 start: node.getStart(), 484 502 code: MISSING_OPERATION_NAME_CODE, 485 - length: originalNode.getText().length, 503 + length: originalNode.node.getText().length, 486 504 range: {} as any, 487 505 severity: 2, 488 506 } as any); ··· 516 534 const usageDiagnostics = 517 535 checkFieldUsageInFile( 518 536 source, 519 - nodes as ts.NoSubstitutionTemplateLiteral[], 537 + nodes.map(x => x.node) as ts.NoSubstitutionTemplateLiteral[], 520 538 info 521 539 ) || []; 522 540
+43 -35
packages/graphqlsp/src/graphql/getSchema.ts
··· 2 2 import fs from 'node:fs/promises'; 3 3 import path from 'path'; 4 4 5 - import type { GraphQLSchema, IntrospectionQuery } from 'graphql'; 5 + import type { IntrospectionQuery } from 'graphql'; 6 6 7 7 import { 8 - type SchemaOrigin, 9 8 type SchemaLoaderResult, 10 - load, 11 - resolveTypeScriptRootDir, 9 + type SchemaRef as _SchemaRef, 10 + type GraphQLSPConfig, 11 + loadRef, 12 12 minifyIntrospection, 13 13 outputIntrospectionFile, 14 + resolveTypeScriptRootDir, 14 15 } from '@gql.tada/internal'; 15 16 16 17 import { ts } from '../ts'; ··· 93 94 } 94 95 } 95 96 96 - export interface SchemaRef { 97 - current: GraphQLSchema | null; 98 - version: number; 99 - } 97 + export type SchemaRef = _SchemaRef<SchemaLoaderResult | null>; 100 98 101 99 export const loadSchema = ( 102 100 // TODO: abstract info away 103 101 info: ts.server.PluginCreateInfo, 104 - origin: SchemaOrigin, 102 + origin: GraphQLSPConfig, 105 103 logger: Logger 106 - ): SchemaRef => { 107 - let loaderResult: SchemaLoaderResult | null = null; 108 - const ref: SchemaRef = { current: null, version: 0 }; 104 + ): _SchemaRef<SchemaLoaderResult | null> => { 105 + const ref = loadRef(origin); 109 106 110 107 (async () => { 111 108 const rootPath = 112 109 (await resolveTypeScriptRootDir(info.project.getProjectName())) || 113 110 path.dirname(info.project.getProjectName()); 111 + 114 112 const tadaDisablePreprocessing = 115 113 info.config.tadaDisablePreprocessing ?? false; 116 114 const tadaOutputLocation = ··· 120 118 logger('Got root-directory to resolve schema from: ' + rootPath); 121 119 logger('Resolving schema from "schema" config: ' + JSON.stringify(origin)); 122 120 123 - const loader = load({ origin, rootPath }); 124 - 125 121 try { 126 - logger(`Loading schema from "${origin}"`); 127 - loaderResult = await loader.load(); 122 + logger(`Loading schema...`); 123 + await ref.load({ rootPath }); 128 124 } catch (error) { 129 125 logger(`Failed to load schema: ${error}`); 130 126 } 131 127 132 - if (loaderResult) { 133 - ref.current = loaderResult && loaderResult.schema; 134 - ref.version++; 135 - if (tadaOutputLocation) { 136 - saveTadaIntrospection( 137 - loaderResult.introspection, 138 - tadaOutputLocation, 139 - tadaDisablePreprocessing, 140 - logger 141 - ); 142 - } 128 + if (ref.current) { 129 + saveTadaIntrospection( 130 + ref.current.introspection, 131 + tadaOutputLocation, 132 + tadaDisablePreprocessing, 133 + logger 134 + ); 135 + } else if (ref.multi) { 136 + Object.values(ref.multi).forEach(value => { 137 + if (!value) return; 138 + 139 + if (value.tadaOutputLocation) { 140 + saveTadaIntrospection( 141 + value.introspection, 142 + path.resolve(rootPath, value.tadaOutputLocation), 143 + tadaDisablePreprocessing, 144 + logger 145 + ); 146 + } 147 + }); 143 148 } 144 149 145 - loader.notifyOnUpdate(result => { 146 - logger(`Got schema for origin "${origin}"`); 147 - ref.current = (loaderResult = result).schema; 148 - ref.version++; 149 - if (tadaOutputLocation) { 150 + ref.autoupdate({ rootPath }, (schemaRef, value) => { 151 + if (!value) return; 152 + 153 + if (value.tadaOutputLocation) { 154 + const found = schemaRef.multi 155 + ? schemaRef.multi[value.name as string] 156 + : schemaRef.current; 157 + if (!found) return; 150 158 saveTadaIntrospection( 151 - loaderResult.introspection, 152 - tadaOutputLocation, 159 + found.introspection, 160 + path.resolve(rootPath, value.tadaOutputLocation), 153 161 tadaDisablePreprocessing, 154 162 logger 155 163 ); ··· 157 165 }); 158 166 })(); 159 167 160 - return ref; 168 + return ref as any; 161 169 };
+3 -2
packages/graphqlsp/src/index.ts
··· 25 25 26 26 interface Config { 27 27 schema: SchemaOrigin; 28 + schemas: SchemaOrigin[]; 28 29 tadaDisablePreprocessing?: boolean; 29 30 templateIsCallExpression?: boolean; 30 31 shouldCheckForColocatedFragments?: boolean; ··· 39 40 const config: Config = info.config; 40 41 41 42 logger('config: ' + JSON.stringify(config)); 42 - if (!config.schema) { 43 + if (!config.schema && !config.schemas) { 43 44 logger('Missing "schema" option in configuration.'); 44 45 throw new Error('Please provide a GraphQL Schema!'); 45 46 } ··· 52 53 53 54 const proxy = createBasicDecorator(info); 54 55 55 - const schema = loadSchema(info, config.schema, logger); 56 + const schema = loadSchema(info, config, logger); 56 57 57 58 proxy.getSemanticDiagnostics = (filename: string): ts.Diagnostic[] => { 58 59 const originalDiagnostics =
+1 -1
packages/graphqlsp/src/persisted.ts
··· 78 78 // is more defined we will need to use the ts.Symbol to support re-exporting 79 79 // this function by means of "export const peristed = graphql.persisted". 80 80 if ( 81 - !ts.isCallExpression(callExpression) || 81 + (callExpression && !ts.isCallExpression(callExpression)) || 82 82 !isPersistedCall(callExpression.expression) || 83 83 (!callExpression.typeArguments && !callExpression.arguments[1]) 84 84 )
+15 -4
packages/graphqlsp/src/quickInfo.ts
··· 6 6 bubbleUpCallExpression, 7 7 bubbleUpTemplate, 8 8 findNode, 9 + getSchemaName, 9 10 getSource, 10 11 } from './ast'; 11 12 import { resolveTemplate } from './ast/resolve'; 12 13 import { getToken } from './ast/token'; 13 14 import { Cursor } from './ast/cursor'; 14 15 import { templates } from './ast/templates'; 16 + import { SchemaRef } from './graphql/getSchema'; 15 17 16 18 export function getGraphQLQuickInfo( 17 19 filename: string, 18 20 cursorPosition: number, 19 - schema: { current: GraphQLSchema | null }, 21 + schema: SchemaRef, 20 22 info: ts.server.PluginCreateInfo 21 23 ): ts.QuickInfo | undefined { 22 24 const isCallExpression = info.config.templateIsCallExpression ?? true; ··· 31 33 ? bubbleUpCallExpression(node) 32 34 : bubbleUpTemplate(node); 33 35 34 - let cursor, text; 36 + let cursor, text, schemaToUse: GraphQLSchema | undefined; 35 37 if ( 36 38 ts.isCallExpression(node) && 37 39 isCallExpression && ··· 39 41 node.arguments.length > 0 && 40 42 ts.isNoSubstitutionTemplateLiteral(node.arguments[0]) 41 43 ) { 44 + const typeChecker = info.languageService.getProgram()?.getTypeChecker(); 45 + const schemaName = getSchemaName(node, typeChecker); 46 + 47 + schemaToUse = 48 + schemaName && schema.multi[schemaName] 49 + ? schema.multi[schemaName]?.schema 50 + : schema.current?.schema; 51 + 42 52 const foundToken = getToken(node.arguments[0], cursorPosition); 43 - if (!schema.current || !foundToken) return undefined; 53 + if (!schemaToUse || !foundToken) return undefined; 44 54 45 55 text = node.arguments[0].getText(); 46 56 cursor = new Cursor(foundToken.line, foundToken.start - 1); ··· 69 79 foundToken.line = foundToken.line + amountOfLines; 70 80 text = combinedText; 71 81 cursor = new Cursor(foundToken.line, foundToken.start - 1); 82 + schemaToUse = schema.current.schema; 72 83 } else { 73 84 return undefined; 74 85 } 75 86 76 - const hoverInfo = getHoverInformation(schema.current, text, cursor); 87 + const hoverInfo = getHoverInformation(schemaToUse, text, cursor); 77 88 78 89 return { 79 90 kind: ts.ScriptElementKind.label,
+269 -45
pnpm-lock.yaml
··· 144 144 specifier: ^3.0.0 145 145 version: 3.2.2(graphql@16.8.1) 146 146 gql.tada: 147 - specifier: ^1.4.0 148 - version: 1.4.0(graphql@16.8.1) 147 + specifier: 1.5.9-canary-8711af177005f46fa3e06d990b6ba28e353e7f9b 148 + version: 1.5.9-canary-8711af177005f46fa3e06d990b6ba28e353e7f9b(graphql@16.8.1)(svelte@4.2.15)(typescript@5.3.3) 149 149 graphql: 150 150 specifier: ^16.8.1 151 151 version: 16.8.1 ··· 175 175 packages/graphqlsp: 176 176 dependencies: 177 177 '@gql.tada/internal': 178 - specifier: ^0.1.2 179 - version: 0.1.2(graphql@16.8.1)(typescript@5.3.3) 178 + specifier: 0.3.0-canary-8711af177005f46fa3e06d990b6ba28e353e7f9b 179 + version: 0.3.0-canary-8711af177005f46fa3e06d990b6ba28e353e7f9b(graphql@16.8.1)(typescript@5.3.3) 180 180 graphql: 181 181 specifier: ^16.8.1 182 182 version: 16.8.1 ··· 213 213 version: link:../../../packages/graphqlsp 214 214 '@urql/core': 215 215 specifier: ^4.0.4 216 - version: 4.2.2(graphql@16.8.1) 216 + version: 4.2.2 217 217 devDependencies: 218 218 typescript: 219 219 specifier: ^5.3.3 ··· 307 307 dependencies: 308 308 graphql: 16.8.1 309 309 310 + /@0no-co/graphqlsp@1.11.0(typescript@5.3.3): 311 + resolution: {integrity: sha512-P8DRsT+pRgXXZ+8szO1ISUXLxtaL9ukKddjLqSh+oBvWVCzUDyUM4Une0Co0Y7XC017wI4pdcrR/3hWqw9uuDg==} 312 + peerDependencies: 313 + typescript: ^5.0.0 314 + dependencies: 315 + '@gql.tada/internal': 0.1.3(graphql@16.8.1)(typescript@5.3.3) 316 + graphql: 16.8.1 317 + node-fetch: 2.6.7 318 + typescript: 5.3.3 319 + transitivePeerDependencies: 320 + - encoding 321 + dev: false 322 + 310 323 /@actions/core@1.10.1: 311 324 resolution: {integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==} 312 325 dependencies: ··· 338 351 dependencies: 339 352 '@jridgewell/gen-mapping': 0.3.3 340 353 '@jridgewell/trace-mapping': 0.3.21 341 - dev: true 342 354 343 355 /@ardatan/relay-compiler@12.0.0(graphql@16.8.1): 344 356 resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==} ··· 556 568 /@babel/helper-string-parser@7.23.4: 557 569 resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} 558 570 engines: {node: '>=6.9.0'} 559 - dev: true 560 571 561 572 /@babel/helper-validator-identifier@7.22.20: 562 573 resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 563 574 engines: {node: '>=6.9.0'} 564 - dev: true 565 575 566 576 /@babel/helper-validator-option@7.23.5: 567 577 resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} ··· 596 606 '@babel/types': 7.23.6 597 607 dev: true 598 608 609 + /@babel/parser@7.24.4: 610 + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} 611 + engines: {node: '>=6.0.0'} 612 + hasBin: true 613 + dependencies: 614 + '@babel/types': 7.23.6 615 + dev: false 616 + 599 617 /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.7): 600 618 resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} 601 619 engines: {node: '>=6.9.0'} ··· 954 972 '@babel/helper-string-parser': 7.23.4 955 973 '@babel/helper-validator-identifier': 7.22.20 956 974 to-fast-properties: 2.0.0 957 - dev: true 958 975 959 976 /@changesets/apply-release-plan@6.1.4: 960 977 resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==} ··· 1359 1376 engines: {node: '>=14'} 1360 1377 dev: true 1361 1378 1362 - /@gql.tada/cli-utils@0.3.0: 1363 - resolution: {integrity: sha512-kDebLVuM5r3/bI1MmlhHr9VKHxXeq8Gxy1wHVTPva4R5ObfbhzxnHsTCvR6MUp8ziy9Pg9MESb8S1YZW8ohM3A==} 1379 + /@gql.tada/cli-utils@1.2.3-canary-8711af177005f46fa3e06d990b6ba28e353e7f9b(svelte@4.2.15)(typescript@5.3.3): 1380 + resolution: {integrity: sha512-tCKCGD4VmdSrnt7wvvzuJ1dtDf0nB6rBlYkOAvgmwDzDQgkWnwP97Xv6t6i1HAWiE9f9uzMl8y1eAr4IbySPrQ==} 1381 + peerDependencies: 1382 + typescript: ^5.0.0 1364 1383 dependencies: 1365 - '@gql.tada/internal': 0.1.0 1384 + '@0no-co/graphqlsp': 1.11.0(typescript@5.3.3) 1385 + '@gql.tada/internal': 0.3.0-canary-8711af177005f46fa3e06d990b6ba28e353e7f9b(graphql@16.8.1)(typescript@5.3.3) 1386 + '@vue/compiler-dom': 3.4.25 1387 + '@vue/language-core': 2.0.14(typescript@5.3.3) 1366 1388 graphql: 16.8.1 1389 + svelte2tsx: 0.7.7(svelte@4.2.15)(typescript@5.3.3) 1390 + typescript: 5.3.3 1391 + transitivePeerDependencies: 1392 + - encoding 1393 + - svelte 1367 1394 dev: false 1368 1395 1369 - /@gql.tada/internal@0.1.0: 1370 - resolution: {integrity: sha512-FTvBVXVvt0xUo8hvRlwFoyeNXpUDqc+e20MzFkF8ozbsa5PoYb/gksmmnHMjUphsIq1H3Hq8o4RGstFN5LKH4w==} 1396 + /@gql.tada/internal@0.1.3(graphql@16.8.1)(typescript@5.3.3): 1397 + resolution: {integrity: sha512-wIvykBId7O0gaizmSl5n5AhbQsgJVLTUsFBm3RsfQ9dVfpmT+Fhy2yHX+yNgiVECg2EimXMhs4ltcE4EuZ2WOA==} 1398 + peerDependencies: 1399 + graphql: ^16.8.1 1400 + typescript: ^5.0.0 1371 1401 dependencies: 1402 + '@0no-co/graphql.web': 1.0.6(graphql@16.8.1) 1372 1403 graphql: 16.8.1 1373 1404 typescript: 5.3.3 1374 1405 dev: false 1375 1406 1376 - /@gql.tada/internal@0.1.2(graphql@16.8.1)(typescript@5.3.3): 1377 - resolution: {integrity: sha512-8I4Z1zxYYGK66FWdB3yIZBn3cITLPnciEgjChp3K2+Ha1e/AEBGtZv9AUlodraO/RZafDMkpFhoi+tMpluBjeg==} 1407 + /@gql.tada/internal@0.3.0-canary-8711af177005f46fa3e06d990b6ba28e353e7f9b(graphql@16.8.1)(typescript@5.3.3): 1408 + resolution: {integrity: sha512-CPx00hSOue+XK1KUZhovuN0sZ3sCcUx99Y/iv9obL8ea2rLJ7HbehJ1uI8zwLVtfPoX/tLz+Cc34TFF1znSR7Q==} 1378 1409 peerDependencies: 1379 1410 graphql: ^16.8.1 1380 - typescript: ^5.3.3 1411 + typescript: ^5.0.0 1381 1412 dependencies: 1382 1413 '@0no-co/graphql.web': 1.0.6(graphql@16.8.1) 1383 1414 graphql: 16.8.1 ··· 1996 2027 '@jridgewell/set-array': 1.1.2 1997 2028 '@jridgewell/sourcemap-codec': 1.4.15 1998 2029 '@jridgewell/trace-mapping': 0.3.21 1999 - dev: true 2000 2030 2001 2031 /@jridgewell/resolve-uri@3.1.1: 2002 2032 resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 2003 2033 engines: {node: '>=6.0.0'} 2004 - dev: true 2005 2034 2006 2035 /@jridgewell/set-array@1.1.2: 2007 2036 resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 2008 2037 engines: {node: '>=6.0.0'} 2009 - dev: true 2010 2038 2011 2039 /@jridgewell/source-map@0.3.3: 2012 2040 resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} ··· 2017 2045 2018 2046 /@jridgewell/sourcemap-codec@1.4.15: 2019 2047 resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 2020 - dev: true 2021 2048 2022 2049 /@jridgewell/trace-mapping@0.3.21: 2023 2050 resolution: {integrity: sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==} 2024 2051 dependencies: 2025 2052 '@jridgewell/resolve-uri': 3.1.1 2026 2053 '@jridgewell/sourcemap-codec': 1.4.15 2027 - dev: true 2028 2054 2029 2055 /@jridgewell/trace-mapping@0.3.9: 2030 2056 resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} ··· 2268 2294 peerDependencies: 2269 2295 rollup: ^2.14.0||^3.0.0||^4.0.0 2270 2296 tslib: '*' 2271 - typescript: ^5.3.3 2297 + typescript: '>=3.7.0' 2272 2298 peerDependenciesMeta: 2273 2299 rollup: 2274 2300 optional: true ··· 2437 2463 2438 2464 /@types/estree@1.0.5: 2439 2465 resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 2440 - dev: true 2441 2466 2442 2467 /@types/is-ci@3.0.0: 2443 2468 resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} ··· 2515 2540 wonka: 6.3.4 2516 2541 dev: false 2517 2542 2543 + /@urql/core@4.2.2: 2544 + resolution: {integrity: sha512-TP1kheq9bnrEdnVbJqh0g0ZY/wfdpPeAzjiiDK+Tm+Pbi0O1Xdu6+fUJ/wJo5QpHZzkIyya4/AecG63e6scFqQ==} 2545 + dependencies: 2546 + '@0no-co/graphql.web': 1.0.4(graphql@16.8.1) 2547 + wonka: 6.3.4 2548 + transitivePeerDependencies: 2549 + - graphql 2550 + dev: false 2551 + 2518 2552 /@urql/core@4.2.2(graphql@16.8.1): 2519 2553 resolution: {integrity: sha512-TP1kheq9bnrEdnVbJqh0g0ZY/wfdpPeAzjiiDK+Tm+Pbi0O1Xdu6+fUJ/wJo5QpHZzkIyya4/AecG63e6scFqQ==} 2520 2554 dependencies: 2521 - '@0no-co/graphql.web': 1.0.4(graphql@16.8.1) 2555 + '@0no-co/graphql.web': 1.0.6(graphql@16.8.1) 2522 2556 wonka: 6.3.4 2523 2557 transitivePeerDependencies: 2524 2558 - graphql ··· 2562 2596 pretty-format: 29.7.0 2563 2597 dev: true 2564 2598 2599 + /@volar/language-core@2.2.0-alpha.10: 2600 + resolution: {integrity: sha512-njVJLtpu0zMvDaEk7K5q4BRpOgbyEUljU++un9TfJoJNhxG0z/hWwpwgTRImO42EKvwIxF3XUzeMk+qatAFy7Q==} 2601 + dependencies: 2602 + '@volar/source-map': 2.2.0-alpha.10 2603 + dev: false 2604 + 2605 + /@volar/source-map@2.2.0-alpha.10: 2606 + resolution: {integrity: sha512-nrdWApVkP5cksAnDEyy1JD9rKdwOJsEq1B+seWO4vNXmZNcxQQCx4DULLBvKt7AzRUAQiAuw5aQkb9RBaSqdVA==} 2607 + dependencies: 2608 + muggle-string: 0.4.1 2609 + dev: false 2610 + 2611 + /@vue/compiler-core@3.4.25: 2612 + resolution: {integrity: sha512-Y2pLLopaElgWnMNolgG8w3C5nNUVev80L7hdQ5iIKPtMJvhVpG0zhnBG/g3UajJmZdvW0fktyZTotEHD1Srhbg==} 2613 + dependencies: 2614 + '@babel/parser': 7.24.4 2615 + '@vue/shared': 3.4.25 2616 + entities: 4.5.0 2617 + estree-walker: 2.0.2 2618 + source-map-js: 1.2.0 2619 + dev: false 2620 + 2621 + /@vue/compiler-dom@3.4.25: 2622 + resolution: {integrity: sha512-Ugz5DusW57+HjllAugLci19NsDK+VyjGvmbB2TXaTcSlQxwL++2PETHx/+Qv6qFwNLzSt7HKepPe4DcTE3pBWg==} 2623 + dependencies: 2624 + '@vue/compiler-core': 3.4.25 2625 + '@vue/shared': 3.4.25 2626 + dev: false 2627 + 2628 + /@vue/language-core@2.0.14(typescript@5.3.3): 2629 + resolution: {integrity: sha512-3q8mHSNcGTR7sfp2X6jZdcb4yt8AjBXAfKk0qkZIh7GAJxOnoZ10h5HToZglw4ToFvAnq+xu/Z2FFbglh9Icag==} 2630 + peerDependencies: 2631 + typescript: '*' 2632 + peerDependenciesMeta: 2633 + typescript: 2634 + optional: true 2635 + dependencies: 2636 + '@volar/language-core': 2.2.0-alpha.10 2637 + '@vue/compiler-dom': 3.4.25 2638 + '@vue/shared': 3.4.25 2639 + computeds: 0.0.1 2640 + minimatch: 9.0.4 2641 + path-browserify: 1.0.1 2642 + typescript: 5.3.3 2643 + vue-template-compiler: 2.7.16 2644 + dev: false 2645 + 2646 + /@vue/shared@3.4.25: 2647 + resolution: {integrity: sha512-k0yappJ77g2+KNrIaF0FFnzwLvUBLUYr8VOwz+/6vLsmItFp51AcxLL7Ey3iPd7BIRyWPOcqUjMnm7OkahXllA==} 2648 + dev: false 2649 + 2565 2650 /@whatwg-node/events@0.0.3: 2566 2651 resolution: {integrity: sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==} 2567 2652 dev: true ··· 2619 2704 resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} 2620 2705 engines: {node: '>=0.4.0'} 2621 2706 hasBin: true 2622 - dev: true 2623 2707 2624 2708 /agent-base@7.1.0: 2625 2709 resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} ··· 2705 2789 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 2706 2790 dev: true 2707 2791 2792 + /aria-query@5.3.0: 2793 + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} 2794 + dependencies: 2795 + dequal: 2.0.3 2796 + dev: false 2797 + 2708 2798 /array-buffer-byte-length@1.0.0: 2709 2799 resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} 2710 2800 dependencies: ··· 2768 2858 engines: {node: '>= 0.4'} 2769 2859 dev: true 2770 2860 2861 + /axobject-query@4.0.0: 2862 + resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} 2863 + dependencies: 2864 + dequal: 2.0.3 2865 + dev: false 2866 + 2771 2867 /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: 2772 2868 resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} 2773 2869 dev: true ··· 2809 2905 2810 2906 /balanced-match@1.0.2: 2811 2907 resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 2812 - dev: true 2813 2908 2814 2909 /base64-js@1.5.1: 2815 2910 resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} ··· 2845 2940 resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 2846 2941 dependencies: 2847 2942 balanced-match: 1.0.2 2848 - dev: true 2849 2943 2850 2944 /braces@3.0.2: 2851 2945 resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} ··· 3104 3198 engines: {node: '>=0.8'} 3105 3199 dev: true 3106 3200 3201 + /code-red@1.0.4: 3202 + resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} 3203 + dependencies: 3204 + '@jridgewell/sourcemap-codec': 1.4.15 3205 + '@types/estree': 1.0.5 3206 + acorn: 8.11.2 3207 + estree-walker: 3.0.3 3208 + periscopic: 3.1.0 3209 + dev: false 3210 + 3107 3211 /color-convert@1.9.3: 3108 3212 resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 3109 3213 dependencies: ··· 3154 3258 resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} 3155 3259 dev: true 3156 3260 3261 + /computeds@0.0.1: 3262 + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} 3263 + dev: false 3264 + 3157 3265 /concat-map@0.0.1: 3158 3266 resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 3159 3267 dev: true ··· 3174 3282 resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} 3175 3283 engines: {node: '>=14'} 3176 3284 peerDependencies: 3177 - typescript: ^5.3.3 3285 + typescript: '>=4.9.5' 3178 3286 peerDependenciesMeta: 3179 3287 typescript: 3180 3288 optional: true ··· 3222 3330 which: 2.0.2 3223 3331 dev: true 3224 3332 3333 + /css-tree@2.3.1: 3334 + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} 3335 + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 3336 + dependencies: 3337 + mdn-data: 2.0.30 3338 + source-map-js: 1.2.0 3339 + dev: false 3340 + 3225 3341 /csstype@3.1.3: 3226 3342 resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 3227 3343 dev: true ··· 3256 3372 resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} 3257 3373 dev: true 3258 3374 3375 + /de-indent@1.0.2: 3376 + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} 3377 + dev: false 3378 + 3259 3379 /debounce@1.2.1: 3260 3380 resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} 3261 3381 dev: true ··· 3284 3404 resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} 3285 3405 engines: {node: '>=0.10.0'} 3286 3406 dev: true 3407 + 3408 + /dedent-js@1.0.1: 3409 + resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} 3410 + dev: false 3287 3411 3288 3412 /deep-eql@4.1.3: 3289 3413 resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} ··· 3333 3457 /deprecation@2.3.1: 3334 3458 resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} 3335 3459 dev: true 3460 + 3461 + /dequal@2.0.3: 3462 + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 3463 + engines: {node: '>=6'} 3464 + dev: false 3336 3465 3337 3466 /detect-indent@6.1.0: 3338 3467 resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} ··· 3396 3525 ansi-colors: 4.1.3 3397 3526 dev: true 3398 3527 3528 + /entities@4.5.0: 3529 + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 3530 + engines: {node: '>=0.12'} 3531 + dev: false 3532 + 3399 3533 /error-ex@1.3.2: 3400 3534 resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 3401 3535 dependencies: ··· 3514 3648 3515 3649 /estree-walker@2.0.2: 3516 3650 resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 3517 - dev: true 3651 + 3652 + /estree-walker@3.0.3: 3653 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 3654 + dependencies: 3655 + '@types/estree': 1.0.5 3656 + dev: false 3518 3657 3519 3658 /eventemitter3@5.0.1: 3520 3659 resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} ··· 3813 3952 - graphql 3814 3953 dev: false 3815 3954 3816 - /gql.tada@1.4.0(graphql@16.8.1): 3817 - resolution: {integrity: sha512-/LZJmInJQESn0QafOrDCJRk9ASeI65caU/HmarPtcSNitNWBrH7UfNOsHtISnTTA/CS80eUYqy3M4ogasFZWPQ==} 3955 + /gql.tada@1.5.9-canary-8711af177005f46fa3e06d990b6ba28e353e7f9b(graphql@16.8.1)(svelte@4.2.15)(typescript@5.3.3): 3956 + resolution: {integrity: sha512-3tglGLiGY1zyMyZAow2kpy8GBi35xGAGiEDiPAIPXOUyU35B0HpY0lmMZhf5jEs0fv2FTMgWvFXO6Z3378B6FA==} 3818 3957 hasBin: true 3958 + peerDependencies: 3959 + typescript: ^5.0.0 3819 3960 dependencies: 3820 - '@0no-co/graphql.web': 1.0.4(graphql@16.8.1) 3821 - '@gql.tada/cli-utils': 0.3.0 3822 - '@gql.tada/internal': 0.1.0 3961 + '@0no-co/graphql.web': 1.0.6(graphql@16.8.1) 3962 + '@gql.tada/cli-utils': 1.2.3-canary-8711af177005f46fa3e06d990b6ba28e353e7f9b(svelte@4.2.15)(typescript@5.3.3) 3963 + '@gql.tada/internal': 0.3.0-canary-8711af177005f46fa3e06d990b6ba28e353e7f9b(graphql@16.8.1)(typescript@5.3.3) 3964 + typescript: 5.3.3 3823 3965 transitivePeerDependencies: 3966 + - encoding 3824 3967 - graphql 3968 + - svelte 3825 3969 dev: false 3826 3970 3827 3971 /graceful-fs@4.2.11: ··· 3964 4108 function-bind: 1.1.2 3965 4109 dev: true 3966 4110 4111 + /he@1.2.0: 4112 + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 4113 + hasBin: true 4114 + dev: false 4115 + 3967 4116 /header-case@2.0.4: 3968 4117 resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} 3969 4118 dependencies: ··· 4232 4381 '@types/estree': 1.0.5 4233 4382 dev: true 4234 4383 4384 + /is-reference@3.0.2: 4385 + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} 4386 + dependencies: 4387 + '@types/estree': 1.0.5 4388 + dev: false 4389 + 4235 4390 /is-regex@1.1.4: 4236 4391 resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 4237 4392 engines: {node: '>= 0.4'} ··· 4494 4649 engines: {node: '>=14'} 4495 4650 dev: true 4496 4651 4652 + /locate-character@3.0.0: 4653 + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 4654 + dev: false 4655 + 4497 4656 /locate-path@5.0.0: 4498 4657 resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 4499 4658 engines: {node: '>=8'} ··· 4572 4731 resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 4573 4732 dependencies: 4574 4733 tslib: 2.6.2 4575 - dev: true 4576 4734 4577 4735 /lru-cache@10.0.1: 4578 4736 resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} ··· 4604 4762 engines: {node: '>=12'} 4605 4763 dependencies: 4606 4764 '@jridgewell/sourcemap-codec': 1.4.15 4607 - dev: true 4608 4765 4609 4766 /make-error@1.3.6: 4610 4767 resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} ··· 4625 4782 engines: {node: '>=8'} 4626 4783 dev: true 4627 4784 4785 + /mdn-data@2.0.30: 4786 + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} 4787 + dev: false 4788 + 4628 4789 /meow@6.1.1: 4629 4790 resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} 4630 4791 engines: {node: '>=8'} ··· 4718 4879 brace-expansion: 2.0.1 4719 4880 dev: true 4720 4881 4882 + /minimatch@9.0.4: 4883 + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} 4884 + engines: {node: '>=16 || 14 >=14.17'} 4885 + dependencies: 4886 + brace-expansion: 2.0.1 4887 + dev: false 4888 + 4721 4889 /minimist-options@4.1.0: 4722 4890 resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} 4723 4891 engines: {node: '>= 6'} ··· 4745 4913 resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 4746 4914 dev: true 4747 4915 4916 + /muggle-string@0.4.1: 4917 + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} 4918 + dev: false 4919 + 4748 4920 /mute-stream@0.0.8: 4749 4921 resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} 4750 4922 dev: true ··· 4760 4932 dependencies: 4761 4933 lower-case: 2.0.2 4762 4934 tslib: 2.6.2 4763 - dev: true 4764 4935 4765 4936 /node-fetch@2.6.7: 4766 4937 resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} ··· 4973 5144 dependencies: 4974 5145 no-case: 3.0.4 4975 5146 tslib: 2.6.2 4976 - dev: true 5147 + 5148 + /path-browserify@1.0.1: 5149 + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 5150 + dev: false 4977 5151 4978 5152 /path-case@3.0.4: 4979 5153 resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} ··· 5031 5205 resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} 5032 5206 dev: true 5033 5207 5208 + /periscopic@3.1.0: 5209 + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} 5210 + dependencies: 5211 + '@types/estree': 1.0.5 5212 + estree-walker: 3.0.3 5213 + is-reference: 3.0.2 5214 + dev: false 5215 + 5034 5216 /picocolors@1.0.0: 5035 5217 resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 5036 5218 dev: true ··· 5301 5483 engines: {node: '>=16'} 5302 5484 peerDependencies: 5303 5485 rollup: ^3.29.4 || ^4 5304 - typescript: ^5.3.3 5486 + typescript: ^4.5 || ^5.0 5305 5487 dependencies: 5306 5488 magic-string: 0.30.5 5307 5489 rollup: 4.9.5 ··· 5533 5715 engines: {node: '>=0.10.0'} 5534 5716 dev: true 5535 5717 5718 + /source-map-js@1.2.0: 5719 + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 5720 + engines: {node: '>=0.10.0'} 5721 + dev: false 5722 + 5536 5723 /source-map-support@0.5.21: 5537 5724 resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 5538 5725 dependencies: ··· 5717 5904 engines: {node: '>= 0.4'} 5718 5905 dev: true 5719 5906 5907 + /svelte2tsx@0.7.7(svelte@4.2.15)(typescript@5.3.3): 5908 + resolution: {integrity: sha512-HAIxtk5TUHXvCRKApKfxoh1BGT85S/17lS3DvbfxRKFd+Ghr5YScqBvd+sU+p7vJFw48LNkzdFk+ooNVk3e4kA==} 5909 + peerDependencies: 5910 + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 5911 + typescript: ^4.9.4 || ^5.0.0 5912 + dependencies: 5913 + dedent-js: 1.0.1 5914 + pascal-case: 3.1.2 5915 + svelte: 4.2.15 5916 + typescript: 5.3.3 5917 + dev: false 5918 + 5919 + /svelte@4.2.15: 5920 + resolution: {integrity: sha512-j9KJSccHgLeRERPlhMKrCXpk2TqL2m5Z+k+OBTQhZOhIdCCd3WfqV+ylPWeipEwq17P/ekiSFWwrVQv93i3bsg==} 5921 + engines: {node: '>=16'} 5922 + dependencies: 5923 + '@ampproject/remapping': 2.2.1 5924 + '@jridgewell/sourcemap-codec': 1.4.15 5925 + '@jridgewell/trace-mapping': 0.3.21 5926 + '@types/estree': 1.0.5 5927 + acorn: 8.11.2 5928 + aria-query: 5.3.0 5929 + axobject-query: 4.0.0 5930 + code-red: 1.0.4 5931 + css-tree: 2.3.1 5932 + estree-walker: 3.0.3 5933 + is-reference: 3.0.2 5934 + locate-character: 3.0.0 5935 + magic-string: 0.30.5 5936 + periscopic: 3.1.0 5937 + dev: false 5938 + 5720 5939 /swap-case@2.0.2: 5721 5940 resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==} 5722 5941 dependencies: ··· 5773 5992 /to-fast-properties@2.0.0: 5774 5993 resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 5775 5994 engines: {node: '>=4'} 5776 - dev: true 5777 5995 5778 5996 /to-regex-range@5.0.1: 5779 5997 resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} ··· 5801 6019 '@swc/core': '>=1.2.50' 5802 6020 '@swc/wasm': '>=1.2.50' 5803 6021 '@types/node': '*' 5804 - typescript: ^5.3.3 6022 + typescript: '>=2.7' 5805 6023 peerDependenciesMeta: 5806 6024 '@swc/core': 5807 6025 optional: true ··· 5831 6049 5832 6050 /tslib@2.6.2: 5833 6051 resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 5834 - dev: true 5835 6052 5836 6053 /tty-table@4.2.1: 5837 6054 resolution: {integrity: sha512-xz0uKo+KakCQ+Dxj1D/tKn2FSyreSYWzdkL/BYhgN6oMW808g8QRMuh1atAV9fjTPbWBjfbkKQpI/5rEcnAc7g==} ··· 6135 6352 resolution: {integrity: sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==} 6136 6353 dev: true 6137 6354 6355 + /vue-template-compiler@2.7.16: 6356 + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} 6357 + dependencies: 6358 + de-indent: 1.0.2 6359 + he: 1.2.0 6360 + dev: false 6361 + 6138 6362 /wcwidth@1.0.1: 6139 6363 resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} 6140 6364 dependencies: ··· 6364 6588 id: file:packages/graphqlsp 6365 6589 name: '@0no-co/graphqlsp' 6366 6590 peerDependencies: 6367 - typescript: ^5.3.3 6591 + typescript: ^5.0.0 6368 6592 dependencies: 6369 - '@gql.tada/internal': 0.1.2(graphql@16.8.1)(typescript@5.3.3) 6593 + '@gql.tada/internal': 0.3.0-canary-8711af177005f46fa3e06d990b6ba28e353e7f9b(graphql@16.8.1)(typescript@5.3.3) 6370 6594 graphql: 16.8.1 6371 6595 node-fetch: 2.6.7 6372 6596 typescript: 5.3.3