@soda-gql/lsp 0.14.0 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-C1MSX490.cjs","names":["GraphQLUnionType","nested: TypedFieldNested | null","branches: TypedUnionBranch[]","inString: false | '\"' | \"'\"","match: RegExpExecArray | null","module","declaration: ImportDeclaration | null","fragments: IndexedFragment[]","parseSyncFn: typeof import(\"@swc/core\").parseSync | null","positionCtx: PositionTrackingContext","state: DocumentState","result: IndexedFragment[]","locations: FragmentSpreadLocation[]","match: RegExpExecArray | null","offsets: number[]","positionToOffset","positionToOffset","integer","uinteger","MarkupKind","SelectionRange","TextDocument","undefined","diagnostics: Diagnostic[]","documents: DocumentNode[]","files: SchemaFileInfo[]","resolver: SchemaResolver","errors: LspError[]","sep","errors: LspError[]","positionToOffset","ast: ReturnType<typeof parse>","TypeInfo","replaceEdit: TextEdit","insertEdit: TextEdit","result: ExtractResult | null","ts","lastToken: ts.SyntaxKind","positionToOffset","result: ObjectTypeInfo[]","found: FragmentSpreadNode | null","match: RegExpExecArray | null","ranges: FragmentRange[]","locations: Location[]","positionToOffset","ast: DocumentNode","matchedNode: NamedTypeNode | null","matchedTypeName: string | null","matchedDirectiveName: string | null","Kind","KIND_MAP: Record<string, SymbolKind>","children: DocumentSymbol[]","symbols: DocumentSymbol[]","toContentPos: PositionConverter","positionToOffset","items: CompletionItem[]","GraphQLUnionType","Kind","defaultFormatGraphql: FormatGraphqlFn","positionToOffset","contents: MarkupContent","positionToOffset","locations: Location[]","positionToOffset","changes: Record<string, TextEdit[]>","schemaEntry","TextDocumentSyncKind","ProposedFeatures","TextDocuments","TextDocument","registry: ConfigRegistry | undefined","swcNotification: SwcNotificationState","initializeResult: InitializeResult | undefined","DidChangeWatchedFilesNotification","FileChangeType","result: string[]"],"sources":["../src/field-tree-resolver.ts","../src/fragment-args-preprocessor.ts","../src/document-manager.ts","../src/position-mapping.ts","../src/handlers/diagnostics.ts","../../../node_modules/vscode-languageserver-types/lib/esm/main.js","../src/handlers/field-tree-diagnostics.ts","../src/diagnostics-collector.ts","../src/errors.ts","../src/schema-resolver.ts","../src/config-registry.ts","../src/handlers/code-action.ts","../src/handlers/completion.ts","../src/handlers/_utils.ts","../src/handlers/definition.ts","../src/handlers/document-symbol.ts","../src/handlers/field-tree-completion.ts","../src/handlers/field-tree-definition.ts","../src/handlers/field-tree-hover.ts","../src/handlers/formatting.ts","../src/handlers/hover.ts","../src/handlers/references.ts","../src/handlers/rename.ts","../src/server.ts"],"sourcesContent":["/**\n * Resolves untyped ExtractedFieldTree against a GraphQL schema\n * to produce TypedFieldTree with full type context.\n * @module\n */\n\nimport type { ExtractedFieldTree, FieldCallNode, OperationKind, UnionBranchNode } from \"@soda-gql/common/template-extraction\";\nimport {\n type GraphQLField,\n type GraphQLNamedType,\n type GraphQLSchema,\n GraphQLUnionType,\n getNamedType,\n isObjectType,\n} from \"graphql\";\n\n/** A field node resolved against the schema. */\nexport type TypedFieldNode = {\n readonly fieldName: string;\n readonly fieldNameSpan: { readonly start: number; readonly end: number };\n readonly callSpan: { readonly start: number; readonly end: number };\n readonly parentTypeName: string;\n /** null if field not found in schema */\n readonly fieldTypeName: string | null;\n readonly fieldTypeKind: \"object\" | \"union\" | \"scalar\" | \"enum\" | null;\n readonly nested: TypedFieldNested | null;\n};\n\nexport type TypedFieldNested =\n | {\n readonly kind: \"object\";\n readonly span: { readonly start: number; readonly end: number };\n readonly children: readonly TypedFieldNode[];\n }\n | {\n readonly kind: \"union\";\n readonly span: { readonly start: number; readonly end: number };\n readonly branches: readonly TypedUnionBranch[];\n };\n\nexport type TypedUnionBranch = {\n readonly typeName: string;\n readonly typeNameSpan: { readonly start: number; readonly end: number };\n readonly branchSpan: { readonly start: number; readonly end: number };\n /** Whether typeName is a valid member of the parent union type. */\n readonly valid: boolean;\n readonly children: readonly TypedFieldNode[];\n};\n\nexport type TypedFieldTree = {\n readonly schemaName: string;\n readonly rootTypeName: string;\n readonly rootSpan: { readonly start: number; readonly end: number };\n readonly children: readonly TypedFieldNode[];\n};\n\nexport type FieldTreeLookupResult =\n | { readonly kind: \"field\"; readonly node: TypedFieldNode }\n | { readonly kind: \"unionMember\"; readonly branch: TypedUnionBranch; readonly parentNode: TypedFieldNode };\n\n/** Get the root type name for an operation kind from the schema. */\nconst getRootTypeName = (schema: GraphQLSchema, kind: OperationKind): string | null => {\n switch (kind) {\n case \"query\":\n return schema.getQueryType()?.name ?? null;\n case \"mutation\":\n return schema.getMutationType()?.name ?? null;\n case \"subscription\":\n return schema.getSubscriptionType()?.name ?? null;\n default:\n return null;\n }\n};\n\n/** Classify a GraphQL named type into a kind string. */\nconst classifyType = (namedType: GraphQLNamedType): \"object\" | \"union\" | \"scalar\" | \"enum\" => {\n if (isObjectType(namedType)) return \"object\";\n if (namedType instanceof GraphQLUnionType) return \"union\";\n if (\"getValues\" in namedType) return \"enum\";\n return \"scalar\";\n};\n\n/** Resolve a single field from a parent object type. */\nconst resolveField = (\n schema: GraphQLSchema,\n parentTypeName: string,\n fieldName: string,\n): { fieldDef: GraphQLField<unknown, unknown>; namedType: GraphQLNamedType } | null => {\n const parentType = schema.getType(parentTypeName);\n if (!parentType || !isObjectType(parentType)) return null;\n\n const fields = parentType.getFields();\n const fieldDef = fields[fieldName];\n if (!fieldDef) return null;\n\n const namedType = getNamedType(fieldDef.type);\n if (!namedType) return null;\n\n return { fieldDef, namedType };\n};\n\n/** Resolve untyped FieldCallNode children into typed nodes. */\nconst resolveChildren = (\n schema: GraphQLSchema,\n parentTypeName: string,\n children: readonly FieldCallNode[],\n): readonly TypedFieldNode[] => {\n return children.map((child) => resolveNode(schema, parentTypeName, child));\n};\n\n/** Resolve a single FieldCallNode into a TypedFieldNode. */\nconst resolveNode = (schema: GraphQLSchema, parentTypeName: string, node: FieldCallNode): TypedFieldNode => {\n const resolved = resolveField(schema, parentTypeName, node.fieldName);\n\n const fieldTypeName = resolved?.namedType.name ?? null;\n const fieldTypeKind = resolved ? classifyType(resolved.namedType) : null;\n\n let nested: TypedFieldNested | null = null;\n if (node.nested) {\n if (node.nested.kind === \"object\" && fieldTypeName) {\n nested = {\n kind: \"object\",\n span: node.nested.span,\n children: resolveChildren(schema, fieldTypeName, node.nested.children),\n };\n } else if (node.nested.kind === \"union\") {\n nested = resolveUnionNested(schema, resolved?.namedType ?? null, node.nested);\n }\n }\n\n return {\n fieldName: node.fieldName,\n fieldNameSpan: node.fieldNameSpan,\n callSpan: node.callSpan,\n parentTypeName,\n fieldTypeName,\n fieldTypeKind,\n nested,\n };\n};\n\n/** Resolve union branches against a union type. */\nconst resolveUnionNested = (\n schema: GraphQLSchema,\n unionType: GraphQLNamedType | null,\n nested: {\n readonly kind: \"union\";\n readonly span: { readonly start: number; readonly end: number };\n readonly branches: readonly UnionBranchNode[];\n },\n): TypedFieldNested => {\n const memberNames = new Set<string>();\n if (unionType instanceof GraphQLUnionType) {\n for (const member of unionType.getTypes()) {\n memberNames.add(member.name);\n }\n }\n\n const branches: TypedUnionBranch[] = nested.branches.map((branch) => ({\n typeName: branch.typeName,\n typeNameSpan: branch.typeNameSpan,\n branchSpan: branch.branchSpan,\n valid: memberNames.has(branch.typeName),\n children: resolveChildren(schema, branch.typeName, branch.children),\n }));\n\n return { kind: \"union\", span: nested.span, branches };\n};\n\n/**\n * Resolve an ExtractedFieldTree against a GraphQL schema.\n * Returns null if the operation kind has no corresponding root type.\n */\nexport const resolveFieldTree = (tree: ExtractedFieldTree, schema: GraphQLSchema): TypedFieldTree | null => {\n const rootTypeName = getRootTypeName(schema, tree.kind);\n if (!rootTypeName) return null;\n\n return {\n schemaName: tree.schemaName,\n rootTypeName,\n rootSpan: tree.rootSpan,\n children: resolveChildren(schema, rootTypeName, tree.children),\n };\n};\n\n/**\n * Find the TypedFieldNode or TypedUnionBranch at a given offset.\n * Searches fieldNameSpan for field matches and typeNameSpan for union member matches.\n */\nexport const findNodeAtOffset = (tree: TypedFieldTree, offset: number): FieldTreeLookupResult | null => {\n return findInChildren(tree.children, offset, null);\n};\n\nconst findInChildren = (\n children: readonly TypedFieldNode[],\n offset: number,\n _parentForUnion: TypedFieldNode | null,\n): FieldTreeLookupResult | null => {\n for (const node of children) {\n // Check if offset is within the field name string literal\n if (offset >= node.fieldNameSpan.start && offset <= node.fieldNameSpan.end) {\n return { kind: \"field\", node };\n }\n\n // Recurse into nested structure\n if (node.nested) {\n if (node.nested.kind === \"object\") {\n const result = findInChildren(node.nested.children, offset, null);\n if (result) return result;\n } else if (node.nested.kind === \"union\") {\n for (const branch of node.nested.branches) {\n // Check union member type name\n if (offset >= branch.typeNameSpan.start && offset <= branch.typeNameSpan.end) {\n return { kind: \"unionMember\", branch, parentNode: node };\n }\n // Recurse into branch children\n const result = findInChildren(branch.children, offset, node);\n if (result) return result;\n }\n }\n }\n }\n return null;\n};\n","/**\n * Preprocessor for Fragment Arguments RFC syntax.\n *\n * Strips fragment argument declarations and spread arguments by replacing\n * them with equal-length whitespace to preserve line/column alignment.\n *\n * @module\n */\n\n/** Result of fragment arguments preprocessing. */\nexport type PreprocessResult = {\n /** Content with Fragment Arguments syntax replaced by whitespace. */\n readonly preprocessed: string;\n /** Whether any preprocessing was applied. */\n readonly modified: boolean;\n};\n\n/**\n * Find the matching closing parenthesis for a balanced group.\n * Handles nested parentheses, string literals, and comments.\n * Returns the index of the closing ')' or -1 if not found.\n */\nconst findMatchingParen = (content: string, openIndex: number): number => {\n let depth = 1;\n let inString: false | '\"' | \"'\" = false;\n\n for (let i = openIndex + 1; i < content.length; i++) {\n const ch = content[i];\n if (ch === undefined) break;\n\n if (inString) {\n if (ch === inString) {\n let backslashes = 0;\n for (let j = i - 1; j >= 0 && content[j] === \"\\\\\"; j--) {\n backslashes++;\n }\n if (backslashes % 2 === 0) {\n inString = false;\n }\n }\n continue;\n }\n\n if (ch === '\"' || ch === \"'\") {\n inString = ch;\n continue;\n }\n\n if (ch === \"(\") {\n depth++;\n } else if (ch === \")\") {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n\n return -1;\n};\n\n/**\n * Replace a range [start, end] (inclusive) with spaces, preserving newlines.\n */\nconst replaceWithSpaces = (content: string, start: number, end: number): string => {\n let result = content.slice(0, start);\n for (let i = start; i <= end; i++) {\n result += content[i] === \"\\n\" ? \"\\n\" : \" \";\n }\n result += content.slice(end + 1);\n return result;\n};\n\n// Pattern: fragment Name( at word boundary — old reconstructed format (args before \"on Type\")\nconst FRAGMENT_DEF_PATTERN = /\\bfragment\\s+(\\w+)\\s*\\(/g;\n\n// Pattern: fragment Name on Type ( — curried reconstructed format (args after \"on Type\")\nconst FRAGMENT_DEF_CURRIED_PATTERN = /\\bfragment\\s+\\w+\\s+on\\s+\\w+\\s*\\(/g;\n\n// Pattern: ...FragmentName(\nconst FRAGMENT_SPREAD_PATTERN = /\\.\\.\\.(\\w+)\\s*\\(/g;\n\n/**\n * Preprocess Fragment Arguments RFC syntax by replacing argument lists with spaces.\n *\n * Transforms:\n * - `fragment UserProfile($showEmail: Boolean = false) on User` → `fragment UserProfile on User`\n * - `...UserProfile(showEmail: true)` → `...UserProfile `\n */\nexport const preprocessFragmentArgs = (content: string): PreprocessResult => {\n let result = content;\n let modified = false;\n\n // Pass 1: Fragment definition arguments\n // Match \"fragment Name(\" and find the matching \")\" to strip\n let match: RegExpExecArray | null;\n FRAGMENT_DEF_PATTERN.lastIndex = 0;\n while ((match = FRAGMENT_DEF_PATTERN.exec(result)) !== null) {\n const openParenIndex = match.index + match[0].length - 1;\n\n // Check that the next non-whitespace after \")\" is \"on\" (to distinguish from non-fragment-args parens)\n const closeParenIndex = findMatchingParen(result, openParenIndex);\n if (closeParenIndex === -1) {\n continue;\n }\n\n // Verify this is a fragment definition (followed by \"on\")\n const afterParen = result.slice(closeParenIndex + 1).trimStart();\n if (!afterParen.startsWith(\"on\")) {\n continue;\n }\n\n result = replaceWithSpaces(result, openParenIndex, closeParenIndex);\n modified = true;\n // Reset regex since we modified the string (positions may shift)\n FRAGMENT_DEF_PATTERN.lastIndex = 0;\n }\n\n // Pass 1b: Fragment definition arguments (curried reconstructed format: fragment Name on Type ($args) { ... })\n FRAGMENT_DEF_CURRIED_PATTERN.lastIndex = 0;\n while ((match = FRAGMENT_DEF_CURRIED_PATTERN.exec(result)) !== null) {\n const openParenIndex = match.index + match[0].length - 1;\n const closeParenIndex = findMatchingParen(result, openParenIndex);\n if (closeParenIndex === -1) {\n continue;\n }\n\n // Verify this is followed by \"{\" (fragment body)\n const afterParen = result.slice(closeParenIndex + 1).trimStart();\n if (!afterParen.startsWith(\"{\")) {\n continue;\n }\n\n result = replaceWithSpaces(result, openParenIndex, closeParenIndex);\n modified = true;\n FRAGMENT_DEF_CURRIED_PATTERN.lastIndex = 0;\n }\n\n // Pass 2: Fragment spread arguments\n FRAGMENT_SPREAD_PATTERN.lastIndex = 0;\n while ((match = FRAGMENT_SPREAD_PATTERN.exec(result)) !== null) {\n const openParenIndex = match.index + match[0].length - 1;\n const closeParenIndex = findMatchingParen(result, openParenIndex);\n if (closeParenIndex === -1) {\n continue;\n }\n\n result = replaceWithSpaces(result, openParenIndex, closeParenIndex);\n modified = true;\n FRAGMENT_SPREAD_PATTERN.lastIndex = 0;\n }\n\n return { preprocessed: result, modified };\n};\n","/**\n * Document manager: tracks open documents and extracts tagged templates using SWC.\n * @module\n */\n\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport type { GraphqlSystemIdentifyHelper } from \"@soda-gql/builder\";\nimport { createSwcSpanConverter } from \"@soda-gql/common\";\nimport { type PositionTrackingContext, walkAndExtract, walkAndExtractFieldTrees } from \"@soda-gql/common/template-extraction\";\nimport type { ImportDeclaration, Module } from \"@swc/types\";\nimport { type FragmentDefinitionNode, parse, visit } from \"graphql\";\nimport { preprocessFragmentArgs } from \"./fragment-args-preprocessor\";\nimport type { DocumentState, ExtractedFieldTree, ExtractedTemplate, FragmentSpreadLocation, IndexedFragment } from \"./types\";\n\nexport type DocumentManager = {\n readonly update: (uri: string, version: number, source: string) => DocumentState;\n readonly get: (uri: string) => DocumentState | undefined;\n readonly remove: (uri: string) => void;\n readonly findTemplateAtOffset: (uri: string, offset: number) => ExtractedTemplate | undefined;\n /** Find the field call tree containing the given offset. */\n readonly findFieldTreeAtOffset: (uri: string, offset: number) => ExtractedFieldTree | undefined;\n /** Find a template whose typeNameSpan contains the given offset. */\n readonly findTemplateByTypeNameOffset: (uri: string, offset: number) => ExtractedTemplate | undefined;\n /** Get fragments from other documents for a given schema, excluding the specified URI. */\n readonly getExternalFragments: (uri: string, schemaName: string) => readonly IndexedFragment[];\n /** Get ALL indexed fragments (including self) for a given schema. */\n readonly getAllFragments: (schemaName: string) => readonly IndexedFragment[];\n /** Find all fragment spread locations across all documents for a given fragment name and schema. */\n readonly findFragmentSpreadLocations: (fragmentName: string, schemaName: string) => readonly FragmentSpreadLocation[];\n};\n\ntype SwcLoaderOptions = {\n /** Override parseSync for testing. Pass null to simulate SWC unavailable. */\n readonly parseSync?: typeof import(\"@swc/core\").parseSync | null;\n /** Config file path used as the base for createRequire resolution of @swc/core. */\n readonly resolveFrom?: string;\n};\n\n/**\n * Collect gql identifiers from import declarations.\n * Adapted from builder's collectGqlIdentifiers pattern.\n */\nconst collectGqlIdentifiers = (module: Module, filePath: string, helper: GraphqlSystemIdentifyHelper): ReadonlySet<string> => {\n const identifiers = new Set<string>();\n\n for (const item of module.body) {\n let declaration: ImportDeclaration | null = null;\n\n if (item.type === \"ImportDeclaration\") {\n declaration = item;\n } else if (\n \"declaration\" in item &&\n item.declaration &&\n // biome-ignore lint/suspicious/noExplicitAny: SWC AST type checking\n (item.declaration as any).type === \"ImportDeclaration\"\n ) {\n declaration = item.declaration as unknown as ImportDeclaration;\n }\n\n if (!declaration) {\n continue;\n }\n\n if (!helper.isGraphqlSystemImportSpecifier({ filePath, specifier: declaration.source.value })) {\n continue;\n }\n\n for (const specifier of declaration.specifiers ?? []) {\n if (specifier.type === \"ImportSpecifier\") {\n const imported = specifier.imported ? specifier.imported.value : specifier.local.value;\n if (imported === \"gql\" && !specifier.imported) {\n identifiers.add(specifier.local.value);\n }\n }\n }\n }\n\n return identifiers;\n};\n\n/**\n * Index fragment definitions from extracted templates.\n * Parses each fragment template to extract FragmentDefinitionNode for cross-file resolution.\n */\n/**\n * Reconstruct full GraphQL source from an extracted template.\n * Prepends the definition header from curried tag call arguments.\n *\n * For callback-variables templates (source === \"callback-variables\"), wraps the\n * partial variables string in a dummy operation to produce valid GraphQL that\n * graphql-language-service can parse.\n */\nexport const reconstructGraphql = (template: ExtractedTemplate): string => {\n const content = template.content;\n\n // Callback builder variables: wrap in dummy operation for graphql-language-service.\n // Content is e.g. \"($id: ID!)\" — not standalone valid GraphQL.\n // The content appears in the MIDDLE of the reconstructed string (prefix + content + suffix),\n // so use computeHeaderLen() instead of (reconstructed.length - content.length) for offset.\n if (template.source === \"callback-variables\") {\n const name = template.elementName ?? \"__variables__\";\n // kind is always query|mutation|subscription (fragment has no callback builder path)\n return `${template.kind} ${name} ${content} { __typename }`;\n }\n\n if (template.elementName) {\n if (template.kind === \"fragment\" && template.typeName) {\n // fragment(\"Name\", \"Type\")`($vars) { ... }` -> fragment Name on Type ($vars) { ... }\n return `fragment ${template.elementName} on ${template.typeName} ${content}`;\n }\n // query(\"Name\")`($vars) { ... }` -> query Name ($vars) { ... }\n return `${template.kind} ${template.elementName} ${content}`;\n }\n\n return content;\n};\n\n/**\n * Compute the length of the synthesized prefix before the template content\n * in the reconstructed GraphQL string.\n *\n * For tagged templates, headerLen = reconstructed.length - content.length (content is at the end).\n * For callback-variables, content is in the MIDDLE (prefix + content + suffix), so we must\n * compute the prefix length explicitly.\n */\nexport const computeHeaderLen = (template: ExtractedTemplate, reconstructed: string): number => {\n if (template.source === \"callback-variables\") {\n // Reconstructed: \"query GetUser ($id: ID!) { __typename }\"\n // Prefix: \"query GetUser \"\n const name = template.elementName ?? \"__variables__\";\n return `${template.kind} ${name} `.length;\n }\n // For tagged templates, content is always at the end\n return reconstructed.length - template.content.length;\n};\n\nconst indexFragments = (uri: string, templates: readonly ExtractedTemplate[], source: string): readonly IndexedFragment[] => {\n const fragments: IndexedFragment[] = [];\n\n for (const template of templates) {\n // Skip non-fragment templates. This also skips callback-variables templates\n // (which always have kind === query|mutation|subscription, never fragment).\n if (template.kind !== \"fragment\") {\n continue;\n }\n\n const reconstructed = reconstructGraphql(template);\n const headerLen = computeHeaderLen(template, reconstructed);\n const { preprocessed } = preprocessFragmentArgs(reconstructed);\n\n try {\n const ast = parse(preprocessed, { noLocation: false });\n for (const def of ast.definitions) {\n if (def.kind === \"FragmentDefinition\") {\n fragments.push({\n uri,\n schemaName: template.schemaName,\n fragmentName: def.name.value,\n definition: def as FragmentDefinitionNode,\n content: preprocessed,\n contentRange: template.contentRange,\n tsSource: source,\n headerLen,\n });\n }\n }\n } catch {\n // Invalid GraphQL — skip indexing this template\n }\n }\n\n return fragments;\n};\n\n/** Create a document manager that tracks open documents and extracts templates. */\nexport const createDocumentManager = (helper: GraphqlSystemIdentifyHelper, swcOptions?: SwcLoaderOptions): DocumentManager => {\n // Per-instance SWC state (avoids cross-instance contamination in multi-config setups)\n let parseSyncFn: typeof import(\"@swc/core\").parseSync | null =\n swcOptions?.parseSync !== undefined ? (swcOptions.parseSync ?? null) : null;\n let swcLoadAttempted = swcOptions?.parseSync !== undefined;\n let swcUnavailable = swcOptions?.parseSync === null;\n\n /** Get this module's base path for createRequire fallback (works in both CJS and ESM). */\n const getModuleBase = (): string | undefined => {\n try {\n if (typeof __filename !== \"undefined\") return __filename;\n } catch {\n // __filename not defined in strict ESM\n }\n try {\n if (import.meta.url) return import.meta.url;\n } catch {\n // import.meta not available in CJS\n }\n return undefined;\n };\n\n const getParseSync = (): typeof import(\"@swc/core\").parseSync | null => {\n if (!swcLoadAttempted) {\n swcLoadAttempted = true;\n // Try resolveFrom first (project-local), then fall back to this module's location\n const fallback = getModuleBase();\n const resolveBases = [...(swcOptions?.resolveFrom ? [swcOptions.resolveFrom] : []), ...(fallback ? [fallback] : [])];\n for (const base of resolveBases) {\n try {\n const localRequire = createRequire(base);\n const candidate = localRequire(\"@swc/core\")?.parseSync;\n if (typeof candidate === \"function\") {\n parseSyncFn = candidate;\n return parseSyncFn;\n }\n } catch {\n // Try next base\n }\n }\n swcUnavailable = true;\n }\n return parseSyncFn;\n };\n\n /** Wrap SWC parseSync (which throws) to return null on failure. */\n const safeParseSync = (source: string, tsx: boolean): Module | null => {\n const parseSync = getParseSync();\n if (!parseSync) return null;\n try {\n const result = parseSync(source, {\n syntax: \"typescript\",\n tsx,\n decorators: false,\n dynamicImport: true,\n });\n return result.type === \"Module\" ? result : null;\n } catch {\n return null;\n }\n };\n\n const cache = new Map<string, DocumentState>();\n const fragmentIndex = new Map<string, readonly IndexedFragment[]>();\n\n const extractAll = (\n uri: string,\n source: string,\n ): { templates: readonly ExtractedTemplate[]; fieldTrees: readonly ExtractedFieldTree[] } => {\n const isTsx = uri.endsWith(\".tsx\");\n\n const program = safeParseSync(source, isTsx);\n if (!program) {\n return { templates: [], fieldTrees: [] };\n }\n\n // SWC's BytePos counter accumulates across parseSync calls within the same process.\n // Use UTF-8 byte length (not source.length which is UTF-16 code units) for correct offset.\n const converter = createSwcSpanConverter(source);\n const spanOffset = program.span.end - converter.byteLength + 1;\n\n // Convert URI to a file path for the helper\n const filePath = uri.startsWith(\"file://\") ? fileURLToPath(uri) : uri;\n\n const gqlIdentifiers = collectGqlIdentifiers(program, filePath, helper);\n if (gqlIdentifiers.size === 0) {\n return { templates: [], fieldTrees: [] };\n }\n\n const positionCtx: PositionTrackingContext = { spanOffset, converter };\n const templates = walkAndExtract(program, gqlIdentifiers, positionCtx);\n const fieldTrees = walkAndExtractFieldTrees(program, gqlIdentifiers, positionCtx);\n return { templates, fieldTrees };\n };\n\n return {\n update: (uri, version, source) => {\n const { templates, fieldTrees } = extractAll(uri, source);\n const state: DocumentState = {\n uri,\n version,\n source,\n templates,\n fieldTrees,\n ...(swcUnavailable ? { swcUnavailable: true as const } : {}),\n };\n cache.set(uri, state);\n if (swcUnavailable) {\n fragmentIndex.delete(uri);\n } else {\n fragmentIndex.set(uri, indexFragments(uri, templates, source));\n }\n return state;\n },\n\n get: (uri) => cache.get(uri),\n\n remove: (uri) => {\n cache.delete(uri);\n fragmentIndex.delete(uri);\n },\n\n findTemplateAtOffset: (uri, offset) => {\n const state = cache.get(uri);\n if (!state) {\n return undefined;\n }\n return state.templates.find((t) => offset >= t.contentRange.start && offset <= t.contentRange.end);\n },\n\n findFieldTreeAtOffset: (uri, offset) => {\n const state = cache.get(uri);\n if (!state) {\n return undefined;\n }\n return state.fieldTrees.find((t) => offset >= t.rootSpan.start && offset <= t.rootSpan.end);\n },\n\n findTemplateByTypeNameOffset: (uri, offset) => {\n const state = cache.get(uri);\n if (!state) {\n return undefined;\n }\n return state.templates.find((t) => t.typeNameSpan && offset >= t.typeNameSpan.start && offset <= t.typeNameSpan.end);\n },\n\n getExternalFragments: (uri, schemaName) => {\n const result: IndexedFragment[] = [];\n for (const [fragmentUri, fragments] of fragmentIndex) {\n if (fragmentUri === uri) {\n continue;\n }\n for (const fragment of fragments) {\n if (fragment.schemaName === schemaName) {\n result.push(fragment);\n }\n }\n }\n return result;\n },\n\n getAllFragments: (schemaName) => {\n const result: IndexedFragment[] = [];\n for (const [, fragments] of fragmentIndex) {\n for (const fragment of fragments) {\n if (fragment.schemaName === schemaName) {\n result.push(fragment);\n }\n }\n }\n return result;\n },\n\n findFragmentSpreadLocations: (fragmentName, schemaName) => {\n const locations: FragmentSpreadLocation[] = [];\n\n for (const [uri, state] of cache) {\n for (const template of state.templates) {\n if (template.schemaName !== schemaName) {\n continue;\n }\n\n const reconstructed = reconstructGraphql(template);\n const headerLen = computeHeaderLen(template, reconstructed);\n const { preprocessed } = preprocessFragmentArgs(reconstructed);\n\n try {\n const ast = parse(preprocessed, { noLocation: false });\n visit(ast, {\n FragmentSpread(node) {\n if (node.name.value === fragmentName && node.name.loc) {\n // Adjust offset from reconstructed space to template-content space\n locations.push({\n uri,\n tsSource: state.source,\n template,\n nameOffset: node.name.loc.start - headerLen,\n nameLength: fragmentName.length,\n });\n }\n },\n });\n } catch {\n // Parse error — fall back to regex\n const pattern = new RegExp(`\\\\.\\\\.\\\\.${fragmentName}\\\\b`, \"g\");\n let match: RegExpExecArray | null = null;\n while ((match = pattern.exec(preprocessed)) !== null) {\n // Adjust offset from reconstructed space to template-content space\n locations.push({\n uri,\n tsSource: state.source,\n template,\n nameOffset: match.index + 3 - headerLen, // skip \"...\"\n nameLength: fragmentName.length,\n });\n }\n }\n }\n }\n\n return locations;\n },\n };\n};\n","/**\n * Bidirectional position mapping between TypeScript file and GraphQL content.\n * @module\n */\n\n/** 0-indexed line and character position. */\nexport type Position = {\n readonly line: number;\n readonly character: number;\n};\n\nexport type PositionMapper = {\n /** Map TS file position to GraphQL content position. Returns null if outside template. */\n readonly tsToGraphql: (tsPosition: Position) => Position | null;\n /** Map GraphQL content position back to TS file position. */\n readonly graphqlToTs: (gqlPosition: Position) => Position;\n};\n\nexport type PositionMapperInput = {\n readonly tsSource: string;\n /** Byte offset of the first character of GraphQL content (after opening backtick). */\n readonly contentStartOffset: number;\n readonly graphqlContent: string;\n};\n\n/** Compute byte offsets for the start of each line in the source text. */\nexport const computeLineOffsets = (source: string): readonly number[] => {\n const offsets: number[] = [0];\n for (let i = 0; i < source.length; i++) {\n if (source.charCodeAt(i) === 10) {\n // newline\n offsets.push(i + 1);\n }\n }\n return offsets;\n};\n\n/** Convert a Position to a byte offset within the source text. */\nexport const positionToOffset = (lineOffsets: readonly number[], position: Position): number => {\n if (position.line < 0 || position.line >= lineOffsets.length) {\n return -1;\n }\n return (lineOffsets[position.line] ?? 0) + position.character;\n};\n\n/** Convert a byte offset to a Position within the source text. */\nexport const offsetToPosition = (lineOffsets: readonly number[], offset: number): Position => {\n // Binary search for the line containing the offset\n let low = 0;\n let high = lineOffsets.length - 1;\n while (low < high) {\n const mid = Math.ceil((low + high) / 2);\n if ((lineOffsets[mid] ?? 0) <= offset) {\n low = mid;\n } else {\n high = mid - 1;\n }\n }\n return { line: low, character: offset - (lineOffsets[low] ?? 0) };\n};\n\n/** Convert a Position to an IPosition compatible with graphql-language-service. */\nexport const toIPosition = (\n pos: Position,\n): {\n line: number;\n character: number;\n setLine: (l: number) => void;\n setCharacter: (c: number) => void;\n lessThanOrEqualTo: (other: Position) => boolean;\n} => {\n const p = {\n line: pos.line,\n character: pos.character,\n setLine: (l: number) => {\n p.line = l;\n },\n setCharacter: (c: number) => {\n p.character = c;\n },\n lessThanOrEqualTo: (other: Position) => p.line < other.line || (p.line === other.line && p.character <= other.character),\n };\n return p;\n};\n\n/** Create a bidirectional position mapper between TS file and GraphQL content. */\nexport const createPositionMapper = (input: PositionMapperInput): PositionMapper => {\n const { tsSource, contentStartOffset, graphqlContent } = input;\n const tsLineOffsets = computeLineOffsets(tsSource);\n const gqlLineOffsets = computeLineOffsets(graphqlContent);\n\n return {\n tsToGraphql: (tsPosition) => {\n const tsOffset = positionToOffset(tsLineOffsets, tsPosition);\n if (tsOffset < 0) {\n return null;\n }\n const gqlOffset = tsOffset - contentStartOffset;\n if (gqlOffset < 0 || gqlOffset > graphqlContent.length) {\n return null;\n }\n return offsetToPosition(gqlLineOffsets, gqlOffset);\n },\n\n graphqlToTs: (gqlPosition) => {\n const gqlOffset = positionToOffset(gqlLineOffsets, gqlPosition);\n const tsOffset = gqlOffset + contentStartOffset;\n return offsetToPosition(tsLineOffsets, tsOffset);\n },\n };\n};\n","/**\n * Diagnostics handler: validates GraphQL templates against schema.\n * @module\n */\n\nimport type { FragmentDefinitionNode, GraphQLSchema } from \"graphql\";\nimport { getDiagnostics } from \"graphql-language-service\";\nimport type { Diagnostic } from \"vscode-languageserver-types\";\nimport { computeHeaderLen, reconstructGraphql } from \"../document-manager\";\nimport { preprocessFragmentArgs } from \"../fragment-args-preprocessor\";\nimport { computeLineOffsets, createPositionMapper, offsetToPosition, positionToOffset } from \"../position-mapping\";\nimport type { ExtractedTemplate } from \"../types\";\n\nexport type ComputeDiagnosticsInput = {\n readonly template: ExtractedTemplate;\n readonly schema: GraphQLSchema;\n readonly tsSource: string;\n /** External fragment definitions for cross-file resolution. */\n readonly externalFragments?: readonly FragmentDefinitionNode[];\n};\n\n/** Compute LSP diagnostics for a single GraphQL template. */\nexport const computeTemplateDiagnostics = (input: ComputeDiagnosticsInput): readonly Diagnostic[] => {\n const { template, schema, tsSource } = input;\n const reconstructed = reconstructGraphql(template);\n const headerLen = computeHeaderLen(template, reconstructed);\n const { preprocessed } = preprocessFragmentArgs(reconstructed);\n\n const mapper = createPositionMapper({\n tsSource,\n contentStartOffset: template.contentRange.start,\n graphqlContent: template.content,\n });\n\n // getDiagnostics returns positions relative to the reconstructed source\n const gqlDiagnostics = getDiagnostics(\n preprocessed,\n schema,\n undefined,\n undefined,\n input.externalFragments as FragmentDefinitionNode[] | undefined,\n );\n\n // Pattern to detect interpolation placeholder fragments\n const placeholderPattern = /__FRAG_SPREAD_\\d+__/;\n\n // For callback-variables templates, the dummy body \"{ __typename }\" never uses\n // the declared variables, so \"variable is never used\" diagnostics are false positives.\n const isCallbackVariables = template.source === \"callback-variables\";\n\n // Convert position from reconstructed source to template content\n const reconstructedLineOffsets = computeLineOffsets(preprocessed);\n const contentLineOffsets = computeLineOffsets(template.content);\n const toContentPosition = (pos: { line: number; character: number }) => {\n const offset = positionToOffset(reconstructedLineOffsets, pos);\n const contentOffset = Math.max(0, offset - headerLen);\n return offsetToPosition(contentLineOffsets, contentOffset);\n };\n\n return gqlDiagnostics\n .filter((diag) => {\n // Suppress diagnostics about placeholder fragments (from interpolation)\n if (placeholderPattern.test(diag.message)) {\n return false;\n }\n // Suppress \"variable is never used\" for callback-variables (dummy body doesn't use them)\n if (isCallbackVariables && diag.message.includes(\"is never used\")) {\n return false;\n }\n // Suppress diagnostics that point into the synthesized header or suffix\n const offset = positionToOffset(reconstructedLineOffsets, diag.range.start);\n if (offset < headerLen) {\n return false;\n }\n // For callback-variables, also suppress diagnostics in the suffix \"{ __typename }\"\n if (isCallbackVariables) {\n const contentEnd = headerLen + template.content.length;\n if (offset >= contentEnd) {\n return false;\n }\n }\n return true;\n })\n .map((diag): Diagnostic => {\n // Convert from reconstructed space to content space, then to TS space\n const startContent = toContentPosition(diag.range.start);\n const endContent = toContentPosition(diag.range.end);\n const startTs = mapper.graphqlToTs(startContent);\n const endTs = mapper.graphqlToTs(endContent);\n\n return {\n range: {\n start: { line: startTs.line, character: startTs.character },\n end: { line: endTs.line, character: endTs.character },\n },\n message: diag.message,\n severity: diag.severity,\n source: \"soda-gql\",\n };\n });\n};\n","/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n'use strict';\nexport var DocumentUri;\n(function (DocumentUri) {\n function is(value) {\n return typeof value === 'string';\n }\n DocumentUri.is = is;\n})(DocumentUri || (DocumentUri = {}));\nexport var URI;\n(function (URI) {\n function is(value) {\n return typeof value === 'string';\n }\n URI.is = is;\n})(URI || (URI = {}));\nexport var integer;\n(function (integer) {\n integer.MIN_VALUE = -2147483648;\n integer.MAX_VALUE = 2147483647;\n function is(value) {\n return typeof value === 'number' && integer.MIN_VALUE <= value && value <= integer.MAX_VALUE;\n }\n integer.is = is;\n})(integer || (integer = {}));\nexport var uinteger;\n(function (uinteger) {\n uinteger.MIN_VALUE = 0;\n uinteger.MAX_VALUE = 2147483647;\n function is(value) {\n return typeof value === 'number' && uinteger.MIN_VALUE <= value && value <= uinteger.MAX_VALUE;\n }\n uinteger.is = is;\n})(uinteger || (uinteger = {}));\n/**\n * The Position namespace provides helper functions to work with\n * {@link Position} literals.\n */\nexport var Position;\n(function (Position) {\n /**\n * Creates a new Position literal from the given line and character.\n * @param line The position's line.\n * @param character The position's character.\n */\n function create(line, character) {\n if (line === Number.MAX_VALUE) {\n line = uinteger.MAX_VALUE;\n }\n if (character === Number.MAX_VALUE) {\n character = uinteger.MAX_VALUE;\n }\n return { line, character };\n }\n Position.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Position} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Is.uinteger(candidate.line) && Is.uinteger(candidate.character);\n }\n Position.is = is;\n})(Position || (Position = {}));\n/**\n * The Range namespace provides helper functions to work with\n * {@link Range} literals.\n */\nexport var Range;\n(function (Range) {\n function create(one, two, three, four) {\n if (Is.uinteger(one) && Is.uinteger(two) && Is.uinteger(three) && Is.uinteger(four)) {\n return { start: Position.create(one, two), end: Position.create(three, four) };\n }\n else if (Position.is(one) && Position.is(two)) {\n return { start: one, end: two };\n }\n else {\n throw new Error(`Range#create called with invalid arguments[${one}, ${two}, ${three}, ${four}]`);\n }\n }\n Range.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Range} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Position.is(candidate.start) && Position.is(candidate.end);\n }\n Range.is = is;\n})(Range || (Range = {}));\n/**\n * The Location namespace provides helper functions to work with\n * {@link Location} literals.\n */\nexport var Location;\n(function (Location) {\n /**\n * Creates a Location literal.\n * @param uri The location's uri.\n * @param range The location's range.\n */\n function create(uri, range) {\n return { uri, range };\n }\n Location.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Location} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && (Is.string(candidate.uri) || Is.undefined(candidate.uri));\n }\n Location.is = is;\n})(Location || (Location = {}));\n/**\n * The LocationLink namespace provides helper functions to work with\n * {@link LocationLink} literals.\n */\nexport var LocationLink;\n(function (LocationLink) {\n /**\n * Creates a LocationLink literal.\n * @param targetUri The definition's uri.\n * @param targetRange The full range of the definition.\n * @param targetSelectionRange The span of the symbol definition at the target.\n * @param originSelectionRange The span of the symbol being defined in the originating source file.\n */\n function create(targetUri, targetRange, targetSelectionRange, originSelectionRange) {\n return { targetUri, targetRange, targetSelectionRange, originSelectionRange };\n }\n LocationLink.create = create;\n /**\n * Checks whether the given literal conforms to the {@link LocationLink} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.targetRange) && Is.string(candidate.targetUri)\n && Range.is(candidate.targetSelectionRange)\n && (Range.is(candidate.originSelectionRange) || Is.undefined(candidate.originSelectionRange));\n }\n LocationLink.is = is;\n})(LocationLink || (LocationLink = {}));\n/**\n * The Color namespace provides helper functions to work with\n * {@link Color} literals.\n */\nexport var Color;\n(function (Color) {\n /**\n * Creates a new Color literal.\n */\n function create(red, green, blue, alpha) {\n return {\n red,\n green,\n blue,\n alpha,\n };\n }\n Color.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Color} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.numberRange(candidate.red, 0, 1)\n && Is.numberRange(candidate.green, 0, 1)\n && Is.numberRange(candidate.blue, 0, 1)\n && Is.numberRange(candidate.alpha, 0, 1);\n }\n Color.is = is;\n})(Color || (Color = {}));\n/**\n * The ColorInformation namespace provides helper functions to work with\n * {@link ColorInformation} literals.\n */\nexport var ColorInformation;\n(function (ColorInformation) {\n /**\n * Creates a new ColorInformation literal.\n */\n function create(range, color) {\n return {\n range,\n color,\n };\n }\n ColorInformation.create = create;\n /**\n * Checks whether the given literal conforms to the {@link ColorInformation} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && Color.is(candidate.color);\n }\n ColorInformation.is = is;\n})(ColorInformation || (ColorInformation = {}));\n/**\n * The Color namespace provides helper functions to work with\n * {@link ColorPresentation} literals.\n */\nexport var ColorPresentation;\n(function (ColorPresentation) {\n /**\n * Creates a new ColorInformation literal.\n */\n function create(label, textEdit, additionalTextEdits) {\n return {\n label,\n textEdit,\n additionalTextEdits,\n };\n }\n ColorPresentation.create = create;\n /**\n * Checks whether the given literal conforms to the {@link ColorInformation} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.label)\n && (Is.undefined(candidate.textEdit) || TextEdit.is(candidate))\n && (Is.undefined(candidate.additionalTextEdits) || Is.typedArray(candidate.additionalTextEdits, TextEdit.is));\n }\n ColorPresentation.is = is;\n})(ColorPresentation || (ColorPresentation = {}));\n/**\n * A set of predefined range kinds.\n */\nexport var FoldingRangeKind;\n(function (FoldingRangeKind) {\n /**\n * Folding range for a comment\n */\n FoldingRangeKind.Comment = 'comment';\n /**\n * Folding range for an import or include\n */\n FoldingRangeKind.Imports = 'imports';\n /**\n * Folding range for a region (e.g. `#region`)\n */\n FoldingRangeKind.Region = 'region';\n})(FoldingRangeKind || (FoldingRangeKind = {}));\n/**\n * The folding range namespace provides helper functions to work with\n * {@link FoldingRange} literals.\n */\nexport var FoldingRange;\n(function (FoldingRange) {\n /**\n * Creates a new FoldingRange literal.\n */\n function create(startLine, endLine, startCharacter, endCharacter, kind, collapsedText) {\n const result = {\n startLine,\n endLine\n };\n if (Is.defined(startCharacter)) {\n result.startCharacter = startCharacter;\n }\n if (Is.defined(endCharacter)) {\n result.endCharacter = endCharacter;\n }\n if (Is.defined(kind)) {\n result.kind = kind;\n }\n if (Is.defined(collapsedText)) {\n result.collapsedText = collapsedText;\n }\n return result;\n }\n FoldingRange.create = create;\n /**\n * Checks whether the given literal conforms to the {@link FoldingRange} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.uinteger(candidate.startLine) && Is.uinteger(candidate.startLine)\n && (Is.undefined(candidate.startCharacter) || Is.uinteger(candidate.startCharacter))\n && (Is.undefined(candidate.endCharacter) || Is.uinteger(candidate.endCharacter))\n && (Is.undefined(candidate.kind) || Is.string(candidate.kind));\n }\n FoldingRange.is = is;\n})(FoldingRange || (FoldingRange = {}));\n/**\n * The DiagnosticRelatedInformation namespace provides helper functions to work with\n * {@link DiagnosticRelatedInformation} literals.\n */\nexport var DiagnosticRelatedInformation;\n(function (DiagnosticRelatedInformation) {\n /**\n * Creates a new DiagnosticRelatedInformation literal.\n */\n function create(location, message) {\n return {\n location,\n message\n };\n }\n DiagnosticRelatedInformation.create = create;\n /**\n * Checks whether the given literal conforms to the {@link DiagnosticRelatedInformation} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Location.is(candidate.location) && Is.string(candidate.message);\n }\n DiagnosticRelatedInformation.is = is;\n})(DiagnosticRelatedInformation || (DiagnosticRelatedInformation = {}));\n/**\n * The diagnostic's severity.\n */\nexport var DiagnosticSeverity;\n(function (DiagnosticSeverity) {\n /**\n * Reports an error.\n */\n DiagnosticSeverity.Error = 1;\n /**\n * Reports a warning.\n */\n DiagnosticSeverity.Warning = 2;\n /**\n * Reports an information.\n */\n DiagnosticSeverity.Information = 3;\n /**\n * Reports a hint.\n */\n DiagnosticSeverity.Hint = 4;\n})(DiagnosticSeverity || (DiagnosticSeverity = {}));\n/**\n * The diagnostic tags.\n *\n * @since 3.15.0\n */\nexport var DiagnosticTag;\n(function (DiagnosticTag) {\n /**\n * Unused or unnecessary code.\n *\n * Clients are allowed to render diagnostics with this tag faded out instead of having\n * an error squiggle.\n */\n DiagnosticTag.Unnecessary = 1;\n /**\n * Deprecated or obsolete code.\n *\n * Clients are allowed to rendered diagnostics with this tag strike through.\n */\n DiagnosticTag.Deprecated = 2;\n})(DiagnosticTag || (DiagnosticTag = {}));\n/**\n * The CodeDescription namespace provides functions to deal with descriptions for diagnostic codes.\n *\n * @since 3.16.0\n */\nexport var CodeDescription;\n(function (CodeDescription) {\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.href);\n }\n CodeDescription.is = is;\n})(CodeDescription || (CodeDescription = {}));\n/**\n * The Diagnostic namespace provides helper functions to work with\n * {@link Diagnostic} literals.\n */\nexport var Diagnostic;\n(function (Diagnostic) {\n /**\n * Creates a new Diagnostic literal.\n */\n function create(range, message, severity, code, source, relatedInformation) {\n let result = { range, message };\n if (Is.defined(severity)) {\n result.severity = severity;\n }\n if (Is.defined(code)) {\n result.code = code;\n }\n if (Is.defined(source)) {\n result.source = source;\n }\n if (Is.defined(relatedInformation)) {\n result.relatedInformation = relatedInformation;\n }\n return result;\n }\n Diagnostic.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Diagnostic} interface.\n */\n function is(value) {\n var _a;\n let candidate = value;\n return Is.defined(candidate)\n && Range.is(candidate.range)\n && Is.string(candidate.message)\n && (Is.number(candidate.severity) || Is.undefined(candidate.severity))\n && (Is.integer(candidate.code) || Is.string(candidate.code) || Is.undefined(candidate.code))\n && (Is.undefined(candidate.codeDescription) || (Is.string((_a = candidate.codeDescription) === null || _a === void 0 ? void 0 : _a.href)))\n && (Is.string(candidate.source) || Is.undefined(candidate.source))\n && (Is.undefined(candidate.relatedInformation) || Is.typedArray(candidate.relatedInformation, DiagnosticRelatedInformation.is));\n }\n Diagnostic.is = is;\n})(Diagnostic || (Diagnostic = {}));\n/**\n * The Command namespace provides helper functions to work with\n * {@link Command} literals.\n */\nexport var Command;\n(function (Command) {\n /**\n * Creates a new Command literal.\n */\n function create(title, command, ...args) {\n let result = { title, command };\n if (Is.defined(args) && args.length > 0) {\n result.arguments = args;\n }\n return result;\n }\n Command.create = create;\n /**\n * Checks whether the given literal conforms to the {@link Command} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.title) && Is.string(candidate.command);\n }\n Command.is = is;\n})(Command || (Command = {}));\n/**\n * The TextEdit namespace provides helper function to create replace,\n * insert and delete edits more easily.\n */\nexport var TextEdit;\n(function (TextEdit) {\n /**\n * Creates a replace text edit.\n * @param range The range of text to be replaced.\n * @param newText The new text.\n */\n function replace(range, newText) {\n return { range, newText };\n }\n TextEdit.replace = replace;\n /**\n * Creates an insert text edit.\n * @param position The position to insert the text at.\n * @param newText The text to be inserted.\n */\n function insert(position, newText) {\n return { range: { start: position, end: position }, newText };\n }\n TextEdit.insert = insert;\n /**\n * Creates a delete text edit.\n * @param range The range of text to be deleted.\n */\n function del(range) {\n return { range, newText: '' };\n }\n TextEdit.del = del;\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate)\n && Is.string(candidate.newText)\n && Range.is(candidate.range);\n }\n TextEdit.is = is;\n})(TextEdit || (TextEdit = {}));\nexport var ChangeAnnotation;\n(function (ChangeAnnotation) {\n function create(label, needsConfirmation, description) {\n const result = { label };\n if (needsConfirmation !== undefined) {\n result.needsConfirmation = needsConfirmation;\n }\n if (description !== undefined) {\n result.description = description;\n }\n return result;\n }\n ChangeAnnotation.create = create;\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.label) &&\n (Is.boolean(candidate.needsConfirmation) || candidate.needsConfirmation === undefined) &&\n (Is.string(candidate.description) || candidate.description === undefined);\n }\n ChangeAnnotation.is = is;\n})(ChangeAnnotation || (ChangeAnnotation = {}));\nexport var ChangeAnnotationIdentifier;\n(function (ChangeAnnotationIdentifier) {\n function is(value) {\n const candidate = value;\n return Is.string(candidate);\n }\n ChangeAnnotationIdentifier.is = is;\n})(ChangeAnnotationIdentifier || (ChangeAnnotationIdentifier = {}));\nexport var AnnotatedTextEdit;\n(function (AnnotatedTextEdit) {\n /**\n * Creates an annotated replace text edit.\n *\n * @param range The range of text to be replaced.\n * @param newText The new text.\n * @param annotation The annotation.\n */\n function replace(range, newText, annotation) {\n return { range, newText, annotationId: annotation };\n }\n AnnotatedTextEdit.replace = replace;\n /**\n * Creates an annotated insert text edit.\n *\n * @param position The position to insert the text at.\n * @param newText The text to be inserted.\n * @param annotation The annotation.\n */\n function insert(position, newText, annotation) {\n return { range: { start: position, end: position }, newText, annotationId: annotation };\n }\n AnnotatedTextEdit.insert = insert;\n /**\n * Creates an annotated delete text edit.\n *\n * @param range The range of text to be deleted.\n * @param annotation The annotation.\n */\n function del(range, annotation) {\n return { range, newText: '', annotationId: annotation };\n }\n AnnotatedTextEdit.del = del;\n function is(value) {\n const candidate = value;\n return TextEdit.is(candidate) && (ChangeAnnotation.is(candidate.annotationId) || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n AnnotatedTextEdit.is = is;\n})(AnnotatedTextEdit || (AnnotatedTextEdit = {}));\n/**\n * The TextDocumentEdit namespace provides helper function to create\n * an edit that manipulates a text document.\n */\nexport var TextDocumentEdit;\n(function (TextDocumentEdit) {\n /**\n * Creates a new `TextDocumentEdit`\n */\n function create(textDocument, edits) {\n return { textDocument, edits };\n }\n TextDocumentEdit.create = create;\n function is(value) {\n let candidate = value;\n return Is.defined(candidate)\n && OptionalVersionedTextDocumentIdentifier.is(candidate.textDocument)\n && Array.isArray(candidate.edits);\n }\n TextDocumentEdit.is = is;\n})(TextDocumentEdit || (TextDocumentEdit = {}));\nexport var CreateFile;\n(function (CreateFile) {\n function create(uri, options, annotation) {\n let result = {\n kind: 'create',\n uri\n };\n if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n CreateFile.create = create;\n function is(value) {\n let candidate = value;\n return candidate && candidate.kind === 'create' && Is.string(candidate.uri) && (candidate.options === undefined ||\n ((candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n CreateFile.is = is;\n})(CreateFile || (CreateFile = {}));\nexport var RenameFile;\n(function (RenameFile) {\n function create(oldUri, newUri, options, annotation) {\n let result = {\n kind: 'rename',\n oldUri,\n newUri\n };\n if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n RenameFile.create = create;\n function is(value) {\n let candidate = value;\n return candidate && candidate.kind === 'rename' && Is.string(candidate.oldUri) && Is.string(candidate.newUri) && (candidate.options === undefined ||\n ((candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n RenameFile.is = is;\n})(RenameFile || (RenameFile = {}));\nexport var DeleteFile;\n(function (DeleteFile) {\n function create(uri, options, annotation) {\n let result = {\n kind: 'delete',\n uri\n };\n if (options !== undefined && (options.recursive !== undefined || options.ignoreIfNotExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n DeleteFile.create = create;\n function is(value) {\n let candidate = value;\n return candidate && candidate.kind === 'delete' && Is.string(candidate.uri) && (candidate.options === undefined ||\n ((candidate.options.recursive === undefined || Is.boolean(candidate.options.recursive)) && (candidate.options.ignoreIfNotExists === undefined || Is.boolean(candidate.options.ignoreIfNotExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n DeleteFile.is = is;\n})(DeleteFile || (DeleteFile = {}));\nexport var WorkspaceEdit;\n(function (WorkspaceEdit) {\n function is(value) {\n let candidate = value;\n return candidate &&\n (candidate.changes !== undefined || candidate.documentChanges !== undefined) &&\n (candidate.documentChanges === undefined || candidate.documentChanges.every((change) => {\n if (Is.string(change.kind)) {\n return CreateFile.is(change) || RenameFile.is(change) || DeleteFile.is(change);\n }\n else {\n return TextDocumentEdit.is(change);\n }\n }));\n }\n WorkspaceEdit.is = is;\n})(WorkspaceEdit || (WorkspaceEdit = {}));\nclass TextEditChangeImpl {\n constructor(edits, changeAnnotations) {\n this.edits = edits;\n this.changeAnnotations = changeAnnotations;\n }\n insert(position, newText, annotation) {\n let edit;\n let id;\n if (annotation === undefined) {\n edit = TextEdit.insert(position, newText);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.insert(position, newText, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.insert(position, newText, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n }\n replace(range, newText, annotation) {\n let edit;\n let id;\n if (annotation === undefined) {\n edit = TextEdit.replace(range, newText);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.replace(range, newText, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.replace(range, newText, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n }\n delete(range, annotation) {\n let edit;\n let id;\n if (annotation === undefined) {\n edit = TextEdit.del(range);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.del(range, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.del(range, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n }\n add(edit) {\n this.edits.push(edit);\n }\n all() {\n return this.edits;\n }\n clear() {\n this.edits.splice(0, this.edits.length);\n }\n assertChangeAnnotations(value) {\n if (value === undefined) {\n throw new Error(`Text edit change is not configured to manage change annotations.`);\n }\n }\n}\n/**\n * A helper class\n */\nclass ChangeAnnotations {\n constructor(annotations) {\n this._annotations = annotations === undefined ? Object.create(null) : annotations;\n this._counter = 0;\n this._size = 0;\n }\n all() {\n return this._annotations;\n }\n get size() {\n return this._size;\n }\n manage(idOrAnnotation, annotation) {\n let id;\n if (ChangeAnnotationIdentifier.is(idOrAnnotation)) {\n id = idOrAnnotation;\n }\n else {\n id = this.nextId();\n annotation = idOrAnnotation;\n }\n if (this._annotations[id] !== undefined) {\n throw new Error(`Id ${id} is already in use.`);\n }\n if (annotation === undefined) {\n throw new Error(`No annotation provided for id ${id}`);\n }\n this._annotations[id] = annotation;\n this._size++;\n return id;\n }\n nextId() {\n this._counter++;\n return this._counter.toString();\n }\n}\n/**\n * A workspace change helps constructing changes to a workspace.\n */\nexport class WorkspaceChange {\n constructor(workspaceEdit) {\n this._textEditChanges = Object.create(null);\n if (workspaceEdit !== undefined) {\n this._workspaceEdit = workspaceEdit;\n if (workspaceEdit.documentChanges) {\n this._changeAnnotations = new ChangeAnnotations(workspaceEdit.changeAnnotations);\n workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n workspaceEdit.documentChanges.forEach((change) => {\n if (TextDocumentEdit.is(change)) {\n const textEditChange = new TextEditChangeImpl(change.edits, this._changeAnnotations);\n this._textEditChanges[change.textDocument.uri] = textEditChange;\n }\n });\n }\n else if (workspaceEdit.changes) {\n Object.keys(workspaceEdit.changes).forEach((key) => {\n const textEditChange = new TextEditChangeImpl(workspaceEdit.changes[key]);\n this._textEditChanges[key] = textEditChange;\n });\n }\n }\n else {\n this._workspaceEdit = {};\n }\n }\n /**\n * Returns the underlying {@link WorkspaceEdit} literal\n * use to be returned from a workspace edit operation like rename.\n */\n get edit() {\n this.initDocumentChanges();\n if (this._changeAnnotations !== undefined) {\n if (this._changeAnnotations.size === 0) {\n this._workspaceEdit.changeAnnotations = undefined;\n }\n else {\n this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n }\n }\n return this._workspaceEdit;\n }\n getTextEditChange(key) {\n if (OptionalVersionedTextDocumentIdentifier.is(key)) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n const textDocument = { uri: key.uri, version: key.version };\n let result = this._textEditChanges[textDocument.uri];\n if (!result) {\n const edits = [];\n const textDocumentEdit = {\n textDocument,\n edits\n };\n this._workspaceEdit.documentChanges.push(textDocumentEdit);\n result = new TextEditChangeImpl(edits, this._changeAnnotations);\n this._textEditChanges[textDocument.uri] = result;\n }\n return result;\n }\n else {\n this.initChanges();\n if (this._workspaceEdit.changes === undefined) {\n throw new Error('Workspace edit is not configured for normal text edit changes.');\n }\n let result = this._textEditChanges[key];\n if (!result) {\n let edits = [];\n this._workspaceEdit.changes[key] = edits;\n result = new TextEditChangeImpl(edits);\n this._textEditChanges[key] = result;\n }\n return result;\n }\n }\n initDocumentChanges() {\n if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) {\n this._changeAnnotations = new ChangeAnnotations();\n this._workspaceEdit.documentChanges = [];\n this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n }\n }\n initChanges() {\n if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) {\n this._workspaceEdit.changes = Object.create(null);\n }\n }\n createFile(uri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n let annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n let operation;\n let id;\n if (annotation === undefined) {\n operation = CreateFile.create(uri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = CreateFile.create(uri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n }\n renameFile(oldUri, newUri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n let annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n let operation;\n let id;\n if (annotation === undefined) {\n operation = RenameFile.create(oldUri, newUri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = RenameFile.create(oldUri, newUri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n }\n deleteFile(uri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n let annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n let operation;\n let id;\n if (annotation === undefined) {\n operation = DeleteFile.create(uri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = DeleteFile.create(uri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n }\n}\n/**\n * The TextDocumentIdentifier namespace provides helper functions to work with\n * {@link TextDocumentIdentifier} literals.\n */\nexport var TextDocumentIdentifier;\n(function (TextDocumentIdentifier) {\n /**\n * Creates a new TextDocumentIdentifier literal.\n * @param uri The document's uri.\n */\n function create(uri) {\n return { uri };\n }\n TextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the {@link TextDocumentIdentifier} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri);\n }\n TextDocumentIdentifier.is = is;\n})(TextDocumentIdentifier || (TextDocumentIdentifier = {}));\n/**\n * The VersionedTextDocumentIdentifier namespace provides helper functions to work with\n * {@link VersionedTextDocumentIdentifier} literals.\n */\nexport var VersionedTextDocumentIdentifier;\n(function (VersionedTextDocumentIdentifier) {\n /**\n * Creates a new VersionedTextDocumentIdentifier literal.\n * @param uri The document's uri.\n * @param version The document's version.\n */\n function create(uri, version) {\n return { uri, version };\n }\n VersionedTextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the {@link VersionedTextDocumentIdentifier} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && Is.integer(candidate.version);\n }\n VersionedTextDocumentIdentifier.is = is;\n})(VersionedTextDocumentIdentifier || (VersionedTextDocumentIdentifier = {}));\n/**\n * The OptionalVersionedTextDocumentIdentifier namespace provides helper functions to work with\n * {@link OptionalVersionedTextDocumentIdentifier} literals.\n */\nexport var OptionalVersionedTextDocumentIdentifier;\n(function (OptionalVersionedTextDocumentIdentifier) {\n /**\n * Creates a new OptionalVersionedTextDocumentIdentifier literal.\n * @param uri The document's uri.\n * @param version The document's version.\n */\n function create(uri, version) {\n return { uri, version };\n }\n OptionalVersionedTextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the {@link OptionalVersionedTextDocumentIdentifier} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && (candidate.version === null || Is.integer(candidate.version));\n }\n OptionalVersionedTextDocumentIdentifier.is = is;\n})(OptionalVersionedTextDocumentIdentifier || (OptionalVersionedTextDocumentIdentifier = {}));\n/**\n * The TextDocumentItem namespace provides helper functions to work with\n * {@link TextDocumentItem} literals.\n */\nexport var TextDocumentItem;\n(function (TextDocumentItem) {\n /**\n * Creates a new TextDocumentItem literal.\n * @param uri The document's uri.\n * @param languageId The document's language identifier.\n * @param version The document's version number.\n * @param text The document's text.\n */\n function create(uri, languageId, version, text) {\n return { uri, languageId, version, text };\n }\n TextDocumentItem.create = create;\n /**\n * Checks whether the given literal conforms to the {@link TextDocumentItem} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && Is.string(candidate.languageId) && Is.integer(candidate.version) && Is.string(candidate.text);\n }\n TextDocumentItem.is = is;\n})(TextDocumentItem || (TextDocumentItem = {}));\n/**\n * Describes the content type that a client supports in various\n * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.\n *\n * Please note that `MarkupKinds` must not start with a `$`. This kinds\n * are reserved for internal usage.\n */\nexport var MarkupKind;\n(function (MarkupKind) {\n /**\n * Plain text is supported as a content format\n */\n MarkupKind.PlainText = 'plaintext';\n /**\n * Markdown is supported as a content format\n */\n MarkupKind.Markdown = 'markdown';\n /**\n * Checks whether the given value is a value of the {@link MarkupKind} type.\n */\n function is(value) {\n const candidate = value;\n return candidate === MarkupKind.PlainText || candidate === MarkupKind.Markdown;\n }\n MarkupKind.is = is;\n})(MarkupKind || (MarkupKind = {}));\nexport var MarkupContent;\n(function (MarkupContent) {\n /**\n * Checks whether the given value conforms to the {@link MarkupContent} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(value) && MarkupKind.is(candidate.kind) && Is.string(candidate.value);\n }\n MarkupContent.is = is;\n})(MarkupContent || (MarkupContent = {}));\n/**\n * The kind of a completion entry.\n */\nexport var CompletionItemKind;\n(function (CompletionItemKind) {\n CompletionItemKind.Text = 1;\n CompletionItemKind.Method = 2;\n CompletionItemKind.Function = 3;\n CompletionItemKind.Constructor = 4;\n CompletionItemKind.Field = 5;\n CompletionItemKind.Variable = 6;\n CompletionItemKind.Class = 7;\n CompletionItemKind.Interface = 8;\n CompletionItemKind.Module = 9;\n CompletionItemKind.Property = 10;\n CompletionItemKind.Unit = 11;\n CompletionItemKind.Value = 12;\n CompletionItemKind.Enum = 13;\n CompletionItemKind.Keyword = 14;\n CompletionItemKind.Snippet = 15;\n CompletionItemKind.Color = 16;\n CompletionItemKind.File = 17;\n CompletionItemKind.Reference = 18;\n CompletionItemKind.Folder = 19;\n CompletionItemKind.EnumMember = 20;\n CompletionItemKind.Constant = 21;\n CompletionItemKind.Struct = 22;\n CompletionItemKind.Event = 23;\n CompletionItemKind.Operator = 24;\n CompletionItemKind.TypeParameter = 25;\n})(CompletionItemKind || (CompletionItemKind = {}));\n/**\n * Defines whether the insert text in a completion item should be interpreted as\n * plain text or a snippet.\n */\nexport var InsertTextFormat;\n(function (InsertTextFormat) {\n /**\n * The primary text to be inserted is treated as a plain string.\n */\n InsertTextFormat.PlainText = 1;\n /**\n * The primary text to be inserted is treated as a snippet.\n *\n * A snippet can define tab stops and placeholders with `$1`, `$2`\n * and `${3:foo}`. `$0` defines the final tab stop, it defaults to\n * the end of the snippet. Placeholders with equal identifiers are linked,\n * that is typing in one will update others too.\n *\n * See also: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#snippet_syntax\n */\n InsertTextFormat.Snippet = 2;\n})(InsertTextFormat || (InsertTextFormat = {}));\n/**\n * Completion item tags are extra annotations that tweak the rendering of a completion\n * item.\n *\n * @since 3.15.0\n */\nexport var CompletionItemTag;\n(function (CompletionItemTag) {\n /**\n * Render a completion as obsolete, usually using a strike-out.\n */\n CompletionItemTag.Deprecated = 1;\n})(CompletionItemTag || (CompletionItemTag = {}));\n/**\n * The InsertReplaceEdit namespace provides functions to deal with insert / replace edits.\n *\n * @since 3.16.0\n */\nexport var InsertReplaceEdit;\n(function (InsertReplaceEdit) {\n /**\n * Creates a new insert / replace edit\n */\n function create(newText, insert, replace) {\n return { newText, insert, replace };\n }\n InsertReplaceEdit.create = create;\n /**\n * Checks whether the given literal conforms to the {@link InsertReplaceEdit} interface.\n */\n function is(value) {\n const candidate = value;\n return candidate && Is.string(candidate.newText) && Range.is(candidate.insert) && Range.is(candidate.replace);\n }\n InsertReplaceEdit.is = is;\n})(InsertReplaceEdit || (InsertReplaceEdit = {}));\n/**\n * How whitespace and indentation is handled during completion\n * item insertion.\n *\n * @since 3.16.0\n */\nexport var InsertTextMode;\n(function (InsertTextMode) {\n /**\n * The insertion or replace strings is taken as it is. If the\n * value is multi line the lines below the cursor will be\n * inserted using the indentation defined in the string value.\n * The client will not apply any kind of adjustments to the\n * string.\n */\n InsertTextMode.asIs = 1;\n /**\n * The editor adjusts leading whitespace of new lines so that\n * they match the indentation up to the cursor of the line for\n * which the item is accepted.\n *\n * Consider a line like this: <2tabs><cursor><3tabs>foo. Accepting a\n * multi line completion item is indented using 2 tabs and all\n * following lines inserted will be indented using 2 tabs as well.\n */\n InsertTextMode.adjustIndentation = 2;\n})(InsertTextMode || (InsertTextMode = {}));\nexport var CompletionItemLabelDetails;\n(function (CompletionItemLabelDetails) {\n function is(value) {\n const candidate = value;\n return candidate && (Is.string(candidate.detail) || candidate.detail === undefined) &&\n (Is.string(candidate.description) || candidate.description === undefined);\n }\n CompletionItemLabelDetails.is = is;\n})(CompletionItemLabelDetails || (CompletionItemLabelDetails = {}));\n/**\n * The CompletionItem namespace provides functions to deal with\n * completion items.\n */\nexport var CompletionItem;\n(function (CompletionItem) {\n /**\n * Create a completion item and seed it with a label.\n * @param label The completion item's label\n */\n function create(label) {\n return { label };\n }\n CompletionItem.create = create;\n})(CompletionItem || (CompletionItem = {}));\n/**\n * The CompletionList namespace provides functions to deal with\n * completion lists.\n */\nexport var CompletionList;\n(function (CompletionList) {\n /**\n * Creates a new completion list.\n *\n * @param items The completion items.\n * @param isIncomplete The list is not complete.\n */\n function create(items, isIncomplete) {\n return { items: items ? items : [], isIncomplete: !!isIncomplete };\n }\n CompletionList.create = create;\n})(CompletionList || (CompletionList = {}));\nexport var MarkedString;\n(function (MarkedString) {\n /**\n * Creates a marked string from plain text.\n *\n * @param plainText The plain text.\n */\n function fromPlainText(plainText) {\n return plainText.replace(/[\\\\`*_{}[\\]()#+\\-.!]/g, '\\\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash\n }\n MarkedString.fromPlainText = fromPlainText;\n /**\n * Checks whether the given value conforms to the {@link MarkedString} type.\n */\n function is(value) {\n const candidate = value;\n return Is.string(candidate) || (Is.objectLiteral(candidate) && Is.string(candidate.language) && Is.string(candidate.value));\n }\n MarkedString.is = is;\n})(MarkedString || (MarkedString = {}));\nexport var Hover;\n(function (Hover) {\n /**\n * Checks whether the given value conforms to the {@link Hover} interface.\n */\n function is(value) {\n let candidate = value;\n return !!candidate && Is.objectLiteral(candidate) && (MarkupContent.is(candidate.contents) ||\n MarkedString.is(candidate.contents) ||\n Is.typedArray(candidate.contents, MarkedString.is)) && (value.range === undefined || Range.is(value.range));\n }\n Hover.is = is;\n})(Hover || (Hover = {}));\n/**\n * The ParameterInformation namespace provides helper functions to work with\n * {@link ParameterInformation} literals.\n */\nexport var ParameterInformation;\n(function (ParameterInformation) {\n /**\n * Creates a new parameter information literal.\n *\n * @param label A label string.\n * @param documentation A doc string.\n */\n function create(label, documentation) {\n return documentation ? { label, documentation } : { label };\n }\n ParameterInformation.create = create;\n})(ParameterInformation || (ParameterInformation = {}));\n/**\n * The SignatureInformation namespace provides helper functions to work with\n * {@link SignatureInformation} literals.\n */\nexport var SignatureInformation;\n(function (SignatureInformation) {\n function create(label, documentation, ...parameters) {\n let result = { label };\n if (Is.defined(documentation)) {\n result.documentation = documentation;\n }\n if (Is.defined(parameters)) {\n result.parameters = parameters;\n }\n else {\n result.parameters = [];\n }\n return result;\n }\n SignatureInformation.create = create;\n})(SignatureInformation || (SignatureInformation = {}));\n/**\n * A document highlight kind.\n */\nexport var DocumentHighlightKind;\n(function (DocumentHighlightKind) {\n /**\n * A textual occurrence.\n */\n DocumentHighlightKind.Text = 1;\n /**\n * Read-access of a symbol, like reading a variable.\n */\n DocumentHighlightKind.Read = 2;\n /**\n * Write-access of a symbol, like writing to a variable.\n */\n DocumentHighlightKind.Write = 3;\n})(DocumentHighlightKind || (DocumentHighlightKind = {}));\n/**\n * DocumentHighlight namespace to provide helper functions to work with\n * {@link DocumentHighlight} literals.\n */\nexport var DocumentHighlight;\n(function (DocumentHighlight) {\n /**\n * Create a DocumentHighlight object.\n * @param range The range the highlight applies to.\n * @param kind The highlight kind\n */\n function create(range, kind) {\n let result = { range };\n if (Is.number(kind)) {\n result.kind = kind;\n }\n return result;\n }\n DocumentHighlight.create = create;\n})(DocumentHighlight || (DocumentHighlight = {}));\n/**\n * A symbol kind.\n */\nexport var SymbolKind;\n(function (SymbolKind) {\n SymbolKind.File = 1;\n SymbolKind.Module = 2;\n SymbolKind.Namespace = 3;\n SymbolKind.Package = 4;\n SymbolKind.Class = 5;\n SymbolKind.Method = 6;\n SymbolKind.Property = 7;\n SymbolKind.Field = 8;\n SymbolKind.Constructor = 9;\n SymbolKind.Enum = 10;\n SymbolKind.Interface = 11;\n SymbolKind.Function = 12;\n SymbolKind.Variable = 13;\n SymbolKind.Constant = 14;\n SymbolKind.String = 15;\n SymbolKind.Number = 16;\n SymbolKind.Boolean = 17;\n SymbolKind.Array = 18;\n SymbolKind.Object = 19;\n SymbolKind.Key = 20;\n SymbolKind.Null = 21;\n SymbolKind.EnumMember = 22;\n SymbolKind.Struct = 23;\n SymbolKind.Event = 24;\n SymbolKind.Operator = 25;\n SymbolKind.TypeParameter = 26;\n})(SymbolKind || (SymbolKind = {}));\n/**\n * Symbol tags are extra annotations that tweak the rendering of a symbol.\n *\n * @since 3.16\n */\nexport var SymbolTag;\n(function (SymbolTag) {\n /**\n * Render a symbol as obsolete, usually using a strike-out.\n */\n SymbolTag.Deprecated = 1;\n})(SymbolTag || (SymbolTag = {}));\nexport var SymbolInformation;\n(function (SymbolInformation) {\n /**\n * Creates a new symbol information literal.\n *\n * @param name The name of the symbol.\n * @param kind The kind of the symbol.\n * @param range The range of the location of the symbol.\n * @param uri The resource of the location of symbol.\n * @param containerName The name of the symbol containing the symbol.\n */\n function create(name, kind, range, uri, containerName) {\n let result = {\n name,\n kind,\n location: { uri, range }\n };\n if (containerName) {\n result.containerName = containerName;\n }\n return result;\n }\n SymbolInformation.create = create;\n})(SymbolInformation || (SymbolInformation = {}));\nexport var WorkspaceSymbol;\n(function (WorkspaceSymbol) {\n /**\n * Create a new workspace symbol.\n *\n * @param name The name of the symbol.\n * @param kind The kind of the symbol.\n * @param uri The resource of the location of the symbol.\n * @param range An options range of the location.\n * @returns A WorkspaceSymbol.\n */\n function create(name, kind, uri, range) {\n return range !== undefined\n ? { name, kind, location: { uri, range } }\n : { name, kind, location: { uri } };\n }\n WorkspaceSymbol.create = create;\n})(WorkspaceSymbol || (WorkspaceSymbol = {}));\nexport var DocumentSymbol;\n(function (DocumentSymbol) {\n /**\n * Creates a new symbol information literal.\n *\n * @param name The name of the symbol.\n * @param detail The detail of the symbol.\n * @param kind The kind of the symbol.\n * @param range The range of the symbol.\n * @param selectionRange The selectionRange of the symbol.\n * @param children Children of the symbol.\n */\n function create(name, detail, kind, range, selectionRange, children) {\n let result = {\n name,\n detail,\n kind,\n range,\n selectionRange\n };\n if (children !== undefined) {\n result.children = children;\n }\n return result;\n }\n DocumentSymbol.create = create;\n /**\n * Checks whether the given literal conforms to the {@link DocumentSymbol} interface.\n */\n function is(value) {\n let candidate = value;\n return candidate &&\n Is.string(candidate.name) && Is.number(candidate.kind) &&\n Range.is(candidate.range) && Range.is(candidate.selectionRange) &&\n (candidate.detail === undefined || Is.string(candidate.detail)) &&\n (candidate.deprecated === undefined || Is.boolean(candidate.deprecated)) &&\n (candidate.children === undefined || Array.isArray(candidate.children)) &&\n (candidate.tags === undefined || Array.isArray(candidate.tags));\n }\n DocumentSymbol.is = is;\n})(DocumentSymbol || (DocumentSymbol = {}));\n/**\n * A set of predefined code action kinds\n */\nexport var CodeActionKind;\n(function (CodeActionKind) {\n /**\n * Empty kind.\n */\n CodeActionKind.Empty = '';\n /**\n * Base kind for quickfix actions: 'quickfix'\n */\n CodeActionKind.QuickFix = 'quickfix';\n /**\n * Base kind for refactoring actions: 'refactor'\n */\n CodeActionKind.Refactor = 'refactor';\n /**\n * Base kind for refactoring extraction actions: 'refactor.extract'\n *\n * Example extract actions:\n *\n * - Extract method\n * - Extract function\n * - Extract variable\n * - Extract interface from class\n * - ...\n */\n CodeActionKind.RefactorExtract = 'refactor.extract';\n /**\n * Base kind for refactoring inline actions: 'refactor.inline'\n *\n * Example inline actions:\n *\n * - Inline function\n * - Inline variable\n * - Inline constant\n * - ...\n */\n CodeActionKind.RefactorInline = 'refactor.inline';\n /**\n * Base kind for refactoring rewrite actions: 'refactor.rewrite'\n *\n * Example rewrite actions:\n *\n * - Convert JavaScript function to class\n * - Add or remove parameter\n * - Encapsulate field\n * - Make method static\n * - Move method to base class\n * - ...\n */\n CodeActionKind.RefactorRewrite = 'refactor.rewrite';\n /**\n * Base kind for source actions: `source`\n *\n * Source code actions apply to the entire file.\n */\n CodeActionKind.Source = 'source';\n /**\n * Base kind for an organize imports source action: `source.organizeImports`\n */\n CodeActionKind.SourceOrganizeImports = 'source.organizeImports';\n /**\n * Base kind for auto-fix source actions: `source.fixAll`.\n *\n * Fix all actions automatically fix errors that have a clear fix that do not require user input.\n * They should not suppress errors or perform unsafe fixes such as generating new types or classes.\n *\n * @since 3.15.0\n */\n CodeActionKind.SourceFixAll = 'source.fixAll';\n})(CodeActionKind || (CodeActionKind = {}));\n/**\n * The reason why code actions were requested.\n *\n * @since 3.17.0\n */\nexport var CodeActionTriggerKind;\n(function (CodeActionTriggerKind) {\n /**\n * Code actions were explicitly requested by the user or by an extension.\n */\n CodeActionTriggerKind.Invoked = 1;\n /**\n * Code actions were requested automatically.\n *\n * This typically happens when current selection in a file changes, but can\n * also be triggered when file content changes.\n */\n CodeActionTriggerKind.Automatic = 2;\n})(CodeActionTriggerKind || (CodeActionTriggerKind = {}));\n/**\n * The CodeActionContext namespace provides helper functions to work with\n * {@link CodeActionContext} literals.\n */\nexport var CodeActionContext;\n(function (CodeActionContext) {\n /**\n * Creates a new CodeActionContext literal.\n */\n function create(diagnostics, only, triggerKind) {\n let result = { diagnostics };\n if (only !== undefined && only !== null) {\n result.only = only;\n }\n if (triggerKind !== undefined && triggerKind !== null) {\n result.triggerKind = triggerKind;\n }\n return result;\n }\n CodeActionContext.create = create;\n /**\n * Checks whether the given literal conforms to the {@link CodeActionContext} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.typedArray(candidate.diagnostics, Diagnostic.is)\n && (candidate.only === undefined || Is.typedArray(candidate.only, Is.string))\n && (candidate.triggerKind === undefined || candidate.triggerKind === CodeActionTriggerKind.Invoked || candidate.triggerKind === CodeActionTriggerKind.Automatic);\n }\n CodeActionContext.is = is;\n})(CodeActionContext || (CodeActionContext = {}));\nexport var CodeAction;\n(function (CodeAction) {\n function create(title, kindOrCommandOrEdit, kind) {\n let result = { title };\n let checkKind = true;\n if (typeof kindOrCommandOrEdit === 'string') {\n checkKind = false;\n result.kind = kindOrCommandOrEdit;\n }\n else if (Command.is(kindOrCommandOrEdit)) {\n result.command = kindOrCommandOrEdit;\n }\n else {\n result.edit = kindOrCommandOrEdit;\n }\n if (checkKind && kind !== undefined) {\n result.kind = kind;\n }\n return result;\n }\n CodeAction.create = create;\n function is(value) {\n let candidate = value;\n return candidate && Is.string(candidate.title) &&\n (candidate.diagnostics === undefined || Is.typedArray(candidate.diagnostics, Diagnostic.is)) &&\n (candidate.kind === undefined || Is.string(candidate.kind)) &&\n (candidate.edit !== undefined || candidate.command !== undefined) &&\n (candidate.command === undefined || Command.is(candidate.command)) &&\n (candidate.isPreferred === undefined || Is.boolean(candidate.isPreferred)) &&\n (candidate.edit === undefined || WorkspaceEdit.is(candidate.edit));\n }\n CodeAction.is = is;\n})(CodeAction || (CodeAction = {}));\n/**\n * The CodeLens namespace provides helper functions to work with\n * {@link CodeLens} literals.\n */\nexport var CodeLens;\n(function (CodeLens) {\n /**\n * Creates a new CodeLens literal.\n */\n function create(range, data) {\n let result = { range };\n if (Is.defined(data)) {\n result.data = data;\n }\n return result;\n }\n CodeLens.create = create;\n /**\n * Checks whether the given literal conforms to the {@link CodeLens} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.command) || Command.is(candidate.command));\n }\n CodeLens.is = is;\n})(CodeLens || (CodeLens = {}));\n/**\n * The FormattingOptions namespace provides helper functions to work with\n * {@link FormattingOptions} literals.\n */\nexport var FormattingOptions;\n(function (FormattingOptions) {\n /**\n * Creates a new FormattingOptions literal.\n */\n function create(tabSize, insertSpaces) {\n return { tabSize, insertSpaces };\n }\n FormattingOptions.create = create;\n /**\n * Checks whether the given literal conforms to the {@link FormattingOptions} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.uinteger(candidate.tabSize) && Is.boolean(candidate.insertSpaces);\n }\n FormattingOptions.is = is;\n})(FormattingOptions || (FormattingOptions = {}));\n/**\n * The DocumentLink namespace provides helper functions to work with\n * {@link DocumentLink} literals.\n */\nexport var DocumentLink;\n(function (DocumentLink) {\n /**\n * Creates a new DocumentLink literal.\n */\n function create(range, target, data) {\n return { range, target, data };\n }\n DocumentLink.create = create;\n /**\n * Checks whether the given literal conforms to the {@link DocumentLink} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.target) || Is.string(candidate.target));\n }\n DocumentLink.is = is;\n})(DocumentLink || (DocumentLink = {}));\n/**\n * The SelectionRange namespace provides helper function to work with\n * SelectionRange literals.\n */\nexport var SelectionRange;\n(function (SelectionRange) {\n /**\n * Creates a new SelectionRange\n * @param range the range.\n * @param parent an optional parent.\n */\n function create(range, parent) {\n return { range, parent };\n }\n SelectionRange.create = create;\n function is(value) {\n let candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && (candidate.parent === undefined || SelectionRange.is(candidate.parent));\n }\n SelectionRange.is = is;\n})(SelectionRange || (SelectionRange = {}));\n/**\n * A set of predefined token types. This set is not fixed\n * an clients can specify additional token types via the\n * corresponding client capabilities.\n *\n * @since 3.16.0\n */\nexport var SemanticTokenTypes;\n(function (SemanticTokenTypes) {\n SemanticTokenTypes[\"namespace\"] = \"namespace\";\n /**\n * Represents a generic type. Acts as a fallback for types which can't be mapped to\n * a specific type like class or enum.\n */\n SemanticTokenTypes[\"type\"] = \"type\";\n SemanticTokenTypes[\"class\"] = \"class\";\n SemanticTokenTypes[\"enum\"] = \"enum\";\n SemanticTokenTypes[\"interface\"] = \"interface\";\n SemanticTokenTypes[\"struct\"] = \"struct\";\n SemanticTokenTypes[\"typeParameter\"] = \"typeParameter\";\n SemanticTokenTypes[\"parameter\"] = \"parameter\";\n SemanticTokenTypes[\"variable\"] = \"variable\";\n SemanticTokenTypes[\"property\"] = \"property\";\n SemanticTokenTypes[\"enumMember\"] = \"enumMember\";\n SemanticTokenTypes[\"event\"] = \"event\";\n SemanticTokenTypes[\"function\"] = \"function\";\n SemanticTokenTypes[\"method\"] = \"method\";\n SemanticTokenTypes[\"macro\"] = \"macro\";\n SemanticTokenTypes[\"keyword\"] = \"keyword\";\n SemanticTokenTypes[\"modifier\"] = \"modifier\";\n SemanticTokenTypes[\"comment\"] = \"comment\";\n SemanticTokenTypes[\"string\"] = \"string\";\n SemanticTokenTypes[\"number\"] = \"number\";\n SemanticTokenTypes[\"regexp\"] = \"regexp\";\n SemanticTokenTypes[\"operator\"] = \"operator\";\n /**\n * @since 3.17.0\n */\n SemanticTokenTypes[\"decorator\"] = \"decorator\";\n})(SemanticTokenTypes || (SemanticTokenTypes = {}));\n/**\n * A set of predefined token modifiers. This set is not fixed\n * an clients can specify additional token types via the\n * corresponding client capabilities.\n *\n * @since 3.16.0\n */\nexport var SemanticTokenModifiers;\n(function (SemanticTokenModifiers) {\n SemanticTokenModifiers[\"declaration\"] = \"declaration\";\n SemanticTokenModifiers[\"definition\"] = \"definition\";\n SemanticTokenModifiers[\"readonly\"] = \"readonly\";\n SemanticTokenModifiers[\"static\"] = \"static\";\n SemanticTokenModifiers[\"deprecated\"] = \"deprecated\";\n SemanticTokenModifiers[\"abstract\"] = \"abstract\";\n SemanticTokenModifiers[\"async\"] = \"async\";\n SemanticTokenModifiers[\"modification\"] = \"modification\";\n SemanticTokenModifiers[\"documentation\"] = \"documentation\";\n SemanticTokenModifiers[\"defaultLibrary\"] = \"defaultLibrary\";\n})(SemanticTokenModifiers || (SemanticTokenModifiers = {}));\n/**\n * @since 3.16.0\n */\nexport var SemanticTokens;\n(function (SemanticTokens) {\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && (candidate.resultId === undefined || typeof candidate.resultId === 'string') &&\n Array.isArray(candidate.data) && (candidate.data.length === 0 || typeof candidate.data[0] === 'number');\n }\n SemanticTokens.is = is;\n})(SemanticTokens || (SemanticTokens = {}));\n/**\n * The InlineValueText namespace provides functions to deal with InlineValueTexts.\n *\n * @since 3.17.0\n */\nexport var InlineValueText;\n(function (InlineValueText) {\n /**\n * Creates a new InlineValueText literal.\n */\n function create(range, text) {\n return { range, text };\n }\n InlineValueText.create = create;\n function is(value) {\n const candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.string(candidate.text);\n }\n InlineValueText.is = is;\n})(InlineValueText || (InlineValueText = {}));\n/**\n * The InlineValueVariableLookup namespace provides functions to deal with InlineValueVariableLookups.\n *\n * @since 3.17.0\n */\nexport var InlineValueVariableLookup;\n(function (InlineValueVariableLookup) {\n /**\n * Creates a new InlineValueText literal.\n */\n function create(range, variableName, caseSensitiveLookup) {\n return { range, variableName, caseSensitiveLookup };\n }\n InlineValueVariableLookup.create = create;\n function is(value) {\n const candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.boolean(candidate.caseSensitiveLookup)\n && (Is.string(candidate.variableName) || candidate.variableName === undefined);\n }\n InlineValueVariableLookup.is = is;\n})(InlineValueVariableLookup || (InlineValueVariableLookup = {}));\n/**\n * The InlineValueEvaluatableExpression namespace provides functions to deal with InlineValueEvaluatableExpression.\n *\n * @since 3.17.0\n */\nexport var InlineValueEvaluatableExpression;\n(function (InlineValueEvaluatableExpression) {\n /**\n * Creates a new InlineValueEvaluatableExpression literal.\n */\n function create(range, expression) {\n return { range, expression };\n }\n InlineValueEvaluatableExpression.create = create;\n function is(value) {\n const candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range)\n && (Is.string(candidate.expression) || candidate.expression === undefined);\n }\n InlineValueEvaluatableExpression.is = is;\n})(InlineValueEvaluatableExpression || (InlineValueEvaluatableExpression = {}));\n/**\n * The InlineValueContext namespace provides helper functions to work with\n * {@link InlineValueContext} literals.\n *\n * @since 3.17.0\n */\nexport var InlineValueContext;\n(function (InlineValueContext) {\n /**\n * Creates a new InlineValueContext literal.\n */\n function create(frameId, stoppedLocation) {\n return { frameId, stoppedLocation };\n }\n InlineValueContext.create = create;\n /**\n * Checks whether the given literal conforms to the {@link InlineValueContext} interface.\n */\n function is(value) {\n const candidate = value;\n return Is.defined(candidate) && Range.is(value.stoppedLocation);\n }\n InlineValueContext.is = is;\n})(InlineValueContext || (InlineValueContext = {}));\n/**\n * Inlay hint kinds.\n *\n * @since 3.17.0\n */\nexport var InlayHintKind;\n(function (InlayHintKind) {\n /**\n * An inlay hint that for a type annotation.\n */\n InlayHintKind.Type = 1;\n /**\n * An inlay hint that is for a parameter.\n */\n InlayHintKind.Parameter = 2;\n function is(value) {\n return value === 1 || value === 2;\n }\n InlayHintKind.is = is;\n})(InlayHintKind || (InlayHintKind = {}));\nexport var InlayHintLabelPart;\n(function (InlayHintLabelPart) {\n function create(value) {\n return { value };\n }\n InlayHintLabelPart.create = create;\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate)\n && (candidate.tooltip === undefined || Is.string(candidate.tooltip) || MarkupContent.is(candidate.tooltip))\n && (candidate.location === undefined || Location.is(candidate.location))\n && (candidate.command === undefined || Command.is(candidate.command));\n }\n InlayHintLabelPart.is = is;\n})(InlayHintLabelPart || (InlayHintLabelPart = {}));\nexport var InlayHint;\n(function (InlayHint) {\n function create(position, label, kind) {\n const result = { position, label };\n if (kind !== undefined) {\n result.kind = kind;\n }\n return result;\n }\n InlayHint.create = create;\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && Position.is(candidate.position)\n && (Is.string(candidate.label) || Is.typedArray(candidate.label, InlayHintLabelPart.is))\n && (candidate.kind === undefined || InlayHintKind.is(candidate.kind))\n && (candidate.textEdits === undefined) || Is.typedArray(candidate.textEdits, TextEdit.is)\n && (candidate.tooltip === undefined || Is.string(candidate.tooltip) || MarkupContent.is(candidate.tooltip))\n && (candidate.paddingLeft === undefined || Is.boolean(candidate.paddingLeft))\n && (candidate.paddingRight === undefined || Is.boolean(candidate.paddingRight));\n }\n InlayHint.is = is;\n})(InlayHint || (InlayHint = {}));\nexport var StringValue;\n(function (StringValue) {\n function createSnippet(value) {\n return { kind: 'snippet', value };\n }\n StringValue.createSnippet = createSnippet;\n})(StringValue || (StringValue = {}));\nexport var InlineCompletionItem;\n(function (InlineCompletionItem) {\n function create(insertText, filterText, range, command) {\n return { insertText, filterText, range, command };\n }\n InlineCompletionItem.create = create;\n})(InlineCompletionItem || (InlineCompletionItem = {}));\nexport var InlineCompletionList;\n(function (InlineCompletionList) {\n function create(items) {\n return { items };\n }\n InlineCompletionList.create = create;\n})(InlineCompletionList || (InlineCompletionList = {}));\n/**\n * Describes how an {@link InlineCompletionItemProvider inline completion provider} was triggered.\n *\n * @since 3.18.0\n * @proposed\n */\nexport var InlineCompletionTriggerKind;\n(function (InlineCompletionTriggerKind) {\n /**\n * Completion was triggered explicitly by a user gesture.\n */\n InlineCompletionTriggerKind.Invoked = 0;\n /**\n * Completion was triggered automatically while editing.\n */\n InlineCompletionTriggerKind.Automatic = 1;\n})(InlineCompletionTriggerKind || (InlineCompletionTriggerKind = {}));\nexport var SelectedCompletionInfo;\n(function (SelectedCompletionInfo) {\n function create(range, text) {\n return { range, text };\n }\n SelectedCompletionInfo.create = create;\n})(SelectedCompletionInfo || (SelectedCompletionInfo = {}));\nexport var InlineCompletionContext;\n(function (InlineCompletionContext) {\n function create(triggerKind, selectedCompletionInfo) {\n return { triggerKind, selectedCompletionInfo };\n }\n InlineCompletionContext.create = create;\n})(InlineCompletionContext || (InlineCompletionContext = {}));\nexport var WorkspaceFolder;\n(function (WorkspaceFolder) {\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && URI.is(candidate.uri) && Is.string(candidate.name);\n }\n WorkspaceFolder.is = is;\n})(WorkspaceFolder || (WorkspaceFolder = {}));\nexport const EOL = ['\\n', '\\r\\n', '\\r'];\n/**\n * @deprecated Use the text document from the new vscode-languageserver-textdocument package.\n */\nexport var TextDocument;\n(function (TextDocument) {\n /**\n * Creates a new ITextDocument literal from the given uri and content.\n * @param uri The document's uri.\n * @param languageId The document's language Id.\n * @param version The document's version.\n * @param content The document's content.\n */\n function create(uri, languageId, version, content) {\n return new FullTextDocument(uri, languageId, version, content);\n }\n TextDocument.create = create;\n /**\n * Checks whether the given literal conforms to the {@link ITextDocument} interface.\n */\n function is(value) {\n let candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && (Is.undefined(candidate.languageId) || Is.string(candidate.languageId)) && Is.uinteger(candidate.lineCount)\n && Is.func(candidate.getText) && Is.func(candidate.positionAt) && Is.func(candidate.offsetAt) ? true : false;\n }\n TextDocument.is = is;\n function applyEdits(document, edits) {\n let text = document.getText();\n let sortedEdits = mergeSort(edits, (a, b) => {\n let diff = a.range.start.line - b.range.start.line;\n if (diff === 0) {\n return a.range.start.character - b.range.start.character;\n }\n return diff;\n });\n let lastModifiedOffset = text.length;\n for (let i = sortedEdits.length - 1; i >= 0; i--) {\n let e = sortedEdits[i];\n let startOffset = document.offsetAt(e.range.start);\n let endOffset = document.offsetAt(e.range.end);\n if (endOffset <= lastModifiedOffset) {\n text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length);\n }\n else {\n throw new Error('Overlapping edit');\n }\n lastModifiedOffset = startOffset;\n }\n return text;\n }\n TextDocument.applyEdits = applyEdits;\n function mergeSort(data, compare) {\n if (data.length <= 1) {\n // sorted\n return data;\n }\n const p = (data.length / 2) | 0;\n const left = data.slice(0, p);\n const right = data.slice(p);\n mergeSort(left, compare);\n mergeSort(right, compare);\n let leftIdx = 0;\n let rightIdx = 0;\n let i = 0;\n while (leftIdx < left.length && rightIdx < right.length) {\n let ret = compare(left[leftIdx], right[rightIdx]);\n if (ret <= 0) {\n // smaller_equal -> take left to preserve order\n data[i++] = left[leftIdx++];\n }\n else {\n // greater -> take right\n data[i++] = right[rightIdx++];\n }\n }\n while (leftIdx < left.length) {\n data[i++] = left[leftIdx++];\n }\n while (rightIdx < right.length) {\n data[i++] = right[rightIdx++];\n }\n return data;\n }\n})(TextDocument || (TextDocument = {}));\n/**\n * @deprecated Use the text document from the new vscode-languageserver-textdocument package.\n */\nclass FullTextDocument {\n constructor(uri, languageId, version, content) {\n this._uri = uri;\n this._languageId = languageId;\n this._version = version;\n this._content = content;\n this._lineOffsets = undefined;\n }\n get uri() {\n return this._uri;\n }\n get languageId() {\n return this._languageId;\n }\n get version() {\n return this._version;\n }\n getText(range) {\n if (range) {\n let start = this.offsetAt(range.start);\n let end = this.offsetAt(range.end);\n return this._content.substring(start, end);\n }\n return this._content;\n }\n update(event, version) {\n this._content = event.text;\n this._version = version;\n this._lineOffsets = undefined;\n }\n getLineOffsets() {\n if (this._lineOffsets === undefined) {\n let lineOffsets = [];\n let text = this._content;\n let isLineStart = true;\n for (let i = 0; i < text.length; i++) {\n if (isLineStart) {\n lineOffsets.push(i);\n isLineStart = false;\n }\n let ch = text.charAt(i);\n isLineStart = (ch === '\\r' || ch === '\\n');\n if (ch === '\\r' && i + 1 < text.length && text.charAt(i + 1) === '\\n') {\n i++;\n }\n }\n if (isLineStart && text.length > 0) {\n lineOffsets.push(text.length);\n }\n this._lineOffsets = lineOffsets;\n }\n return this._lineOffsets;\n }\n positionAt(offset) {\n offset = Math.max(Math.min(offset, this._content.length), 0);\n let lineOffsets = this.getLineOffsets();\n let low = 0, high = lineOffsets.length;\n if (high === 0) {\n return Position.create(0, offset);\n }\n while (low < high) {\n let mid = Math.floor((low + high) / 2);\n if (lineOffsets[mid] > offset) {\n high = mid;\n }\n else {\n low = mid + 1;\n }\n }\n // low is the least x for which the line offset is larger than the current offset\n // or array.length if no line offset is larger than the current offset\n let line = low - 1;\n return Position.create(line, offset - lineOffsets[line]);\n }\n offsetAt(position) {\n let lineOffsets = this.getLineOffsets();\n if (position.line >= lineOffsets.length) {\n return this._content.length;\n }\n else if (position.line < 0) {\n return 0;\n }\n let lineOffset = lineOffsets[position.line];\n let nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;\n return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);\n }\n get lineCount() {\n return this.getLineOffsets().length;\n }\n}\nvar Is;\n(function (Is) {\n const toString = Object.prototype.toString;\n function defined(value) {\n return typeof value !== 'undefined';\n }\n Is.defined = defined;\n function undefined(value) {\n return typeof value === 'undefined';\n }\n Is.undefined = undefined;\n function boolean(value) {\n return value === true || value === false;\n }\n Is.boolean = boolean;\n function string(value) {\n return toString.call(value) === '[object String]';\n }\n Is.string = string;\n function number(value) {\n return toString.call(value) === '[object Number]';\n }\n Is.number = number;\n function numberRange(value, min, max) {\n return toString.call(value) === '[object Number]' && min <= value && value <= max;\n }\n Is.numberRange = numberRange;\n function integer(value) {\n return toString.call(value) === '[object Number]' && -2147483648 <= value && value <= 2147483647;\n }\n Is.integer = integer;\n function uinteger(value) {\n return toString.call(value) === '[object Number]' && 0 <= value && value <= 2147483647;\n }\n Is.uinteger = uinteger;\n function func(value) {\n return toString.call(value) === '[object Function]';\n }\n Is.func = func;\n function objectLiteral(value) {\n // Strictly speaking class instances pass this check as well. Since the LSP\n // doesn't use classes we ignore this for now. If we do we need to add something\n // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null`\n return value !== null && typeof value === 'object';\n }\n Is.objectLiteral = objectLiteral;\n function typedArray(value, check) {\n return Array.isArray(value) && value.every(check);\n }\n Is.typedArray = typedArray;\n})(Is || (Is = {}));\n","/**\n * Diagnostics handler for callback builder field tree nodes.\n * Reports unknown fields and invalid union member types.\n * @module\n */\n\nimport { type Diagnostic, DiagnosticSeverity } from \"vscode-languageserver-types\";\nimport type { TypedFieldNested, TypedFieldNode, TypedFieldTree } from \"../field-tree-resolver\";\nimport { computeLineOffsets, offsetToPosition } from \"../position-mapping\";\n\nexport type ComputeFieldTreeDiagnosticsInput = {\n readonly fieldTree: TypedFieldTree;\n readonly tsSource: string;\n};\n\n/** Compute LSP diagnostics for a callback builder field tree. */\nexport const computeFieldTreeDiagnostics = (input: ComputeFieldTreeDiagnosticsInput): readonly Diagnostic[] => {\n const { fieldTree, tsSource } = input;\n const lineOffsets = computeLineOffsets(tsSource);\n const diagnostics: Diagnostic[] = [];\n\n const walkNodes = (nodes: readonly TypedFieldNode[]): void => {\n for (const node of nodes) {\n if (node.fieldTypeName === null) {\n const start = offsetToPosition(lineOffsets, node.fieldNameSpan.start);\n const end = offsetToPosition(lineOffsets, node.fieldNameSpan.end);\n diagnostics.push({\n range: { start, end },\n message: `Unknown field \"${node.fieldName}\" on type \"${node.parentTypeName}\"`,\n severity: DiagnosticSeverity.Error,\n source: \"soda-gql\",\n });\n }\n if (node.nested) {\n walkNested(node.nested);\n }\n }\n };\n\n const walkNested = (nested: TypedFieldNested): void => {\n if (nested.kind === \"object\") {\n walkNodes(nested.children);\n } else {\n for (const branch of nested.branches) {\n if (!branch.valid) {\n const start = offsetToPosition(lineOffsets, branch.typeNameSpan.start);\n const end = offsetToPosition(lineOffsets, branch.typeNameSpan.end);\n diagnostics.push({\n range: { start, end },\n message: `Type \"${branch.typeName}\" is not a member of union type`,\n severity: DiagnosticSeverity.Error,\n source: \"soda-gql\",\n });\n }\n walkNodes(branch.children);\n }\n }\n };\n\n walkNodes(fieldTree.children);\n return diagnostics;\n};\n","/**\n * Shared diagnostics collection logic used by LSP server and CLI.\n * @module\n */\n\nimport type { Diagnostic } from \"vscode-languageserver-types\";\nimport type { ConfigContext } from \"./config-registry\";\nimport { resolveFieldTree } from \"./field-tree-resolver\";\nimport { computeTemplateDiagnostics } from \"./handlers/diagnostics\";\nimport { computeFieldTreeDiagnostics } from \"./handlers/field-tree-diagnostics\";\nimport type { DocumentState } from \"./types\";\n\n/** Collect all diagnostics (template + field tree) for a document state. */\nexport const collectRawDiagnostics = (state: DocumentState, ctx: ConfigContext): readonly Diagnostic[] => {\n const templateDiagnostics = state.templates.flatMap((template) => {\n const entry = ctx.schemaResolver.getSchema(template.schemaName);\n if (!entry) {\n return [];\n }\n const externalFragments = ctx.documentManager.getExternalFragments(state.uri, template.schemaName).map((f) => f.definition);\n return [...computeTemplateDiagnostics({ template, schema: entry.schema, tsSource: state.source, externalFragments })];\n });\n\n const fieldTreeDiagnostics = state.fieldTrees.flatMap((tree) => {\n const entry = ctx.schemaResolver.getSchema(tree.schemaName);\n if (!entry) {\n return [];\n }\n const typedTree = resolveFieldTree(tree, entry.schema);\n if (!typedTree) {\n return [];\n }\n return [...computeFieldTreeDiagnostics({ fieldTree: typedTree, tsSource: state.source })];\n });\n\n return [...templateDiagnostics, ...fieldTreeDiagnostics];\n};\n","/**\n * Structured error types for the LSP server.\n * @module\n */\n\nimport type { Result } from \"neverthrow\";\n\n/** Error code taxonomy for LSP operations. */\nexport type LspErrorCode =\n | \"CONFIG_LOAD_FAILED\"\n | \"SCHEMA_LOAD_FAILED\"\n | \"SCHEMA_BUILD_FAILED\"\n | \"SCHEMA_NOT_CONFIGURED\"\n | \"PARSE_FAILED\"\n | \"INTERNAL_INVARIANT\"\n | \"SWC_RESOLUTION_FAILED\";\n\ntype ConfigLoadFailed = { readonly code: \"CONFIG_LOAD_FAILED\"; readonly message: string; readonly cause?: unknown };\ntype SchemaLoadFailed = {\n readonly code: \"SCHEMA_LOAD_FAILED\";\n readonly message: string;\n readonly schemaName: string;\n readonly cause?: unknown;\n};\ntype SchemaBuildFailed = {\n readonly code: \"SCHEMA_BUILD_FAILED\";\n readonly message: string;\n readonly schemaName: string;\n readonly cause?: unknown;\n};\ntype SchemaNotConfigured = { readonly code: \"SCHEMA_NOT_CONFIGURED\"; readonly message: string; readonly schemaName: string };\ntype ParseFailed = { readonly code: \"PARSE_FAILED\"; readonly message: string; readonly uri: string; readonly cause?: unknown };\ntype InternalInvariant = {\n readonly code: \"INTERNAL_INVARIANT\";\n readonly message: string;\n readonly context?: string;\n readonly cause?: unknown;\n};\ntype SwcResolutionFailed = { readonly code: \"SWC_RESOLUTION_FAILED\"; readonly message: string };\n\n/** Structured error type for all LSP operations. */\nexport type LspError =\n | ConfigLoadFailed\n | SchemaLoadFailed\n | SchemaBuildFailed\n | SchemaNotConfigured\n | ParseFailed\n | InternalInvariant\n | SwcResolutionFailed;\n\n/** Helper type for LSP operation results. */\nexport type LspResult<T> = Result<T, LspError>;\n\n/** Error constructor helpers for concise error creation. */\nexport const lspErrors = {\n configLoadFailed: (message: string, cause?: unknown): ConfigLoadFailed => ({\n code: \"CONFIG_LOAD_FAILED\",\n message,\n cause,\n }),\n\n schemaLoadFailed: (schemaName: string, message?: string, cause?: unknown): SchemaLoadFailed => ({\n code: \"SCHEMA_LOAD_FAILED\",\n message: message ?? `Failed to load schema: ${schemaName}`,\n schemaName,\n cause,\n }),\n\n schemaBuildFailed: (schemaName: string, message?: string, cause?: unknown): SchemaBuildFailed => ({\n code: \"SCHEMA_BUILD_FAILED\",\n message: message ?? `Failed to build schema: ${schemaName}`,\n schemaName,\n cause,\n }),\n\n schemaNotConfigured: (schemaName: string): SchemaNotConfigured => ({\n code: \"SCHEMA_NOT_CONFIGURED\",\n message: `Schema \"${schemaName}\" is not configured in soda-gql.config`,\n schemaName,\n }),\n\n parseFailed: (uri: string, message?: string, cause?: unknown): ParseFailed => ({\n code: \"PARSE_FAILED\",\n message: message ?? `Failed to parse: ${uri}`,\n uri,\n cause,\n }),\n\n internalInvariant: (message: string, context?: string, cause?: unknown): InternalInvariant => ({\n code: \"INTERNAL_INVARIANT\",\n message,\n context,\n cause,\n }),\n\n swcResolutionFailed: (message?: string): SwcResolutionFailed => ({\n code: \"SWC_RESOLUTION_FAILED\",\n message:\n message ??\n \"@swc/core not found. Install @soda-gql/builder (which provides @swc/core) in your project and restart the LSP server to enable template extraction.\",\n }),\n} as const;\n","/**\n * Schema resolver: maps schema names to GraphQLSchema objects.\n * @module\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { ResolvedSodaGqlConfig } from \"@soda-gql/config\";\nimport { hashSchema } from \"@soda-gql/tools/codegen\";\nimport { buildASTSchema, concatAST, type DocumentNode, type GraphQLSchema, parse } from \"graphql\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport type { LspError } from \"./errors\";\nimport { lspErrors } from \"./errors\";\n\n/** Per-file schema source info for go-to-definition. */\nexport type SchemaFileInfo = {\n readonly filePath: string;\n readonly content: string;\n};\n\n/** Cached schema entry. */\nexport type SchemaEntry = {\n readonly name: string;\n readonly schema: import(\"graphql\").GraphQLSchema;\n readonly documentNode: DocumentNode;\n readonly hash: string;\n readonly files: readonly SchemaFileInfo[];\n};\n\nexport type SchemaResolver = {\n readonly getSchema: (schemaName: string) => SchemaEntry | undefined;\n readonly getSchemaNames: () => readonly string[];\n readonly reloadSchema: (schemaName: string) => Result<SchemaEntry, LspError>;\n readonly reloadAll: () => Result<void, LspError[]>;\n};\n\n/** Wrap buildASTSchema (which throws) in a Result. */\nconst safeBuildASTSchema = (schemaName: string, documentNode: DocumentNode): Result<GraphQLSchema, LspError> => {\n try {\n return ok(buildASTSchema(documentNode));\n } catch (e) {\n return err(lspErrors.schemaBuildFailed(schemaName, e instanceof Error ? e.message : String(e), e));\n }\n};\n\nconst loadAndBuildSchema = (schemaName: string, schemaPaths: readonly string[]): Result<SchemaEntry, LspError> => {\n const documents: DocumentNode[] = [];\n const files: SchemaFileInfo[] = [];\n\n for (const schemaPath of schemaPaths) {\n const resolvedPath = resolve(schemaPath);\n try {\n const content = readFileSync(resolvedPath, \"utf8\");\n documents.push(parse(content));\n files.push({ filePath: resolvedPath, content });\n } catch (e) {\n return err(lspErrors.schemaLoadFailed(schemaName, e instanceof Error ? e.message : String(e)));\n }\n }\n\n const documentNode = concatAST(documents);\n const hash = hashSchema(documentNode as Parameters<typeof hashSchema>[0]);\n\n const buildResult = safeBuildASTSchema(schemaName, documentNode);\n if (buildResult.isErr()) {\n return err(buildResult.error);\n }\n\n return ok({ name: schemaName, schema: buildResult.value, documentNode, hash, files });\n};\n\n/** Create a schema resolver from config. Loads all schemas eagerly. */\nexport const createSchemaResolver = (config: ResolvedSodaGqlConfig): Result<SchemaResolver, LspError> => {\n const cache = new Map<string, SchemaEntry>();\n\n // Load all schemas from config\n for (const [name, schemaConfig] of Object.entries(config.schemas)) {\n const result = loadAndBuildSchema(name, schemaConfig.schema);\n if (result.isErr()) {\n return err(result.error);\n }\n cache.set(name, result.value);\n }\n\n const resolver: SchemaResolver = {\n getSchema: (schemaName) => cache.get(schemaName),\n\n getSchemaNames: () => [...cache.keys()],\n\n reloadSchema: (schemaName) => {\n const schemaConfig = config.schemas[schemaName];\n if (!schemaConfig) {\n return err(lspErrors.schemaNotConfigured(schemaName));\n }\n const result = loadAndBuildSchema(schemaName, schemaConfig.schema);\n if (result.isErr()) {\n return err(result.error);\n }\n cache.set(schemaName, result.value);\n return ok(result.value);\n },\n\n reloadAll: () => {\n const errors: LspError[] = [];\n for (const [name, schemaConfig] of Object.entries(config.schemas)) {\n const result = loadAndBuildSchema(name, schemaConfig.schema);\n if (result.isErr()) {\n errors.push(result.error);\n } else {\n cache.set(name, result.value);\n }\n }\n return errors.length > 0 ? err(errors) : ok(undefined);\n },\n };\n\n return ok(resolver);\n};\n","/**\n * Config registry: maps document URIs to their nearest config context.\n * Supports multiple soda-gql configs in a monorepo workspace.\n * @module\n */\n\nimport { dirname, sep } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createGraphqlSystemIdentifyHelper, type GraphqlSystemIdentifyHelper } from \"@soda-gql/builder\";\nimport { loadConfig, type ResolvedSodaGqlConfig } from \"@soda-gql/config\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport { createDocumentManager, type DocumentManager } from \"./document-manager\";\nimport type { LspError } from \"./errors\";\nimport { lspErrors } from \"./errors\";\nimport { createSchemaResolver, type SchemaResolver } from \"./schema-resolver\";\n\nexport type ConfigContext = {\n readonly configPath: string;\n readonly config: ResolvedSodaGqlConfig;\n readonly helper: GraphqlSystemIdentifyHelper;\n readonly schemaResolver: SchemaResolver;\n readonly documentManager: DocumentManager;\n};\n\nexport type ConfigRegistry = {\n readonly resolveForUri: (uri: string) => ConfigContext | undefined;\n readonly getAllContexts: () => readonly ConfigContext[];\n readonly reloadSchemas: (configPath: string) => Result<void, LspError[]>;\n readonly reloadAllSchemas: () => Result<void, LspError[]>;\n};\n\nexport const createConfigRegistry = (configPaths: readonly string[]): Result<ConfigRegistry, LspError> => {\n // Sort by path depth descending so deeper configs are checked first\n const sortedPaths = [...configPaths].sort((a, b) => b.length - a.length);\n\n const contexts = new Map<string, ConfigContext>();\n\n for (const configPath of sortedPaths) {\n const configResult = loadConfig(configPath);\n if (configResult.isErr()) {\n return err(\n lspErrors.configLoadFailed(`Failed to load config ${configPath}: ${configResult.error.message}`, configResult.error),\n );\n }\n\n const config = configResult.value;\n const helper = createGraphqlSystemIdentifyHelper(config);\n\n const resolverResult = createSchemaResolver(config);\n if (resolverResult.isErr()) {\n return err(resolverResult.error);\n }\n\n contexts.set(configPath, {\n configPath,\n config,\n helper,\n schemaResolver: resolverResult.value,\n documentManager: createDocumentManager(helper, { resolveFrom: configPath }),\n });\n }\n\n // Cache: directory path → configPath (or null if no match)\n const uriCache = new Map<string, string | null>();\n\n const resolveConfigPath = (dirPath: string): string | null => {\n const cached = uriCache.get(dirPath);\n if (cached !== undefined) {\n return cached;\n }\n\n for (const configPath of sortedPaths) {\n const configDir = dirname(configPath);\n if (dirPath === configDir || dirPath.startsWith(`${configDir}${sep}`)) {\n uriCache.set(dirPath, configPath);\n return configPath;\n }\n }\n\n uriCache.set(dirPath, null);\n return null;\n };\n\n return ok({\n resolveForUri: (uri: string) => {\n // Only handle file:// URIs and absolute paths — remote/virtual schemes are unsupported\n if (!uri.startsWith(\"file://\") && !uri.startsWith(\"/\")) {\n return undefined;\n }\n const filePath = uri.startsWith(\"file://\") ? fileURLToPath(uri) : uri;\n const dirPath = dirname(filePath);\n const configPath = resolveConfigPath(dirPath);\n return configPath ? contexts.get(configPath) : undefined;\n },\n\n getAllContexts: () => [...contexts.values()],\n\n reloadSchemas: (configPath: string) => {\n const ctx = contexts.get(configPath);\n if (!ctx) {\n return err([lspErrors.configLoadFailed(`Config not found: ${configPath}`)]);\n }\n return ctx.schemaResolver.reloadAll();\n },\n\n reloadAllSchemas: () => {\n const errors: LspError[] = [];\n for (const ctx of contexts.values()) {\n const result = ctx.schemaResolver.reloadAll();\n if (result.isErr()) {\n errors.push(...result.error);\n }\n }\n return errors.length > 0 ? err(errors) : ok(undefined);\n },\n });\n};\n","/**\n * Code action handler: provides Extract Fragment refactoring.\n * @module\n */\n\nimport type { SelectionNode } from \"graphql\";\nimport { type GraphQLSchema, parse, TypeInfo, visit, visitWithTypeInfo } from \"graphql\";\nimport ts from \"typescript\";\nimport { type CodeAction, CodeActionKind, type TextEdit } from \"vscode-languageserver-types\";\nimport { preprocessFragmentArgs } from \"../fragment-args-preprocessor\";\nimport { computeLineOffsets, createPositionMapper, offsetToPosition, type Position, positionToOffset } from \"../position-mapping\";\nimport type { ExtractedTemplate } from \"../types\";\n\nexport type HandleCodeActionInput = {\n readonly template: ExtractedTemplate;\n readonly schema: GraphQLSchema;\n readonly tsSource: string;\n readonly uri: string;\n readonly selectionRange: { readonly start: Position; readonly end: Position };\n};\n\n/** Handle a code action request for a GraphQL template. */\nexport const handleCodeAction = (input: HandleCodeActionInput): CodeAction[] => {\n const { template, schema, tsSource, uri, selectionRange } = input;\n\n // Only support queries/mutations/subscriptions, not fragment definitions\n if (template.kind === \"fragment\") {\n return [];\n }\n\n const { preprocessed } = preprocessFragmentArgs(template.content);\n\n const mapper = createPositionMapper({\n tsSource,\n contentStartOffset: template.contentRange.start,\n graphqlContent: template.content,\n });\n\n // Convert selection range to GraphQL offsets\n const gqlStart = mapper.tsToGraphql(selectionRange.start);\n const gqlEnd = mapper.tsToGraphql(selectionRange.end);\n if (!gqlStart || !gqlEnd) {\n return [];\n }\n\n const preprocessedLineOffsets = computeLineOffsets(preprocessed);\n const startOffset = positionToOffset(preprocessedLineOffsets, gqlStart);\n const endOffset = positionToOffset(preprocessedLineOffsets, gqlEnd);\n\n // Parse the GraphQL\n let ast: ReturnType<typeof parse>;\n try {\n ast = parse(preprocessed, { noLocation: false });\n } catch {\n return [];\n }\n\n // Walk AST with TypeInfo to find the selection set and parent type\n const typeInfo = new TypeInfo(schema);\n const extractResult = findExtractableSelections(ast, typeInfo, startOffset, endOffset);\n\n if (!extractResult) {\n return [];\n }\n\n const { selections: matchedSelections, parentTypeName } = extractResult;\n\n // Extract the selected fields' source text\n const firstSel = matchedSelections[0];\n const lastSel = matchedSelections[matchedSelections.length - 1];\n if (!firstSel?.loc || !lastSel?.loc) {\n return [];\n }\n\n const selectedText = template.content.slice(firstSel.loc.start, lastSel.loc.end);\n const escapedText = selectedText.replace(/`/g, \"\\\\`\").replace(/\\$\\{/g, \"\\\\${\");\n const fragmentName = \"ExtractedFragment\";\n\n // Build the fragment definition\n const fragmentDef = `fragment ${fragmentName} on ${parentTypeName} {\\n ${escapedText.trim()}\\n}`;\n\n // Build the new gql expression to insert\n const newGqlExpr = `export const ${fragmentName} = gql.${template.schemaName}(({ fragment }) => fragment\\`\\n ${fragmentDef}\\n\\`);\\n\\n`;\n\n // Find the insertion point: the start of the line containing the current gql expression\n // Walk backwards from contentRange.start to find the beginning of the export/const statement\n const insertionOffset = findStatementStart(tsSource, template.contentRange.start);\n\n const tsLineOffsets = computeLineOffsets(tsSource);\n const gqlLineOffsets = computeLineOffsets(preprocessed);\n\n // TextEdit 1: Replace selected fields with fragment spread\n const replaceStart = mapper.graphqlToTs(offsetToPosition(gqlLineOffsets, firstSel.loc.start));\n const replaceEnd = mapper.graphqlToTs(offsetToPosition(gqlLineOffsets, lastSel.loc.end));\n\n const replaceEdit: TextEdit = {\n range: { start: replaceStart, end: replaceEnd },\n newText: `...${fragmentName}`,\n };\n\n // TextEdit 2: Insert the new fragment gql expression\n const insertPos = offsetToPosition(tsLineOffsets, insertionOffset);\n const insertEdit: TextEdit = {\n range: { start: insertPos, end: insertPos },\n newText: newGqlExpr,\n };\n\n return [\n {\n title: `Extract Fragment \"${fragmentName}\"`,\n kind: CodeActionKind.RefactorExtract,\n edit: {\n changes: {\n [uri]: [insertEdit, replaceEdit],\n },\n },\n },\n ];\n};\n\ntype ExtractResult = {\n readonly selections: readonly SelectionNode[];\n readonly parentTypeName: string;\n};\n\n/** Find selections within the user's range that can be extracted into a fragment. */\nconst findExtractableSelections = (\n ast: ReturnType<typeof parse>,\n typeInfo: TypeInfo,\n startOffset: number,\n endOffset: number,\n): ExtractResult | null => {\n let result: ExtractResult | null = null;\n\n visit(\n ast,\n visitWithTypeInfo(typeInfo, {\n SelectionSet(node) {\n if (!node.loc || result) {\n return;\n }\n\n const selected = node.selections.filter((sel) => {\n if (!sel.loc) {\n return false;\n }\n return sel.loc.start >= startOffset && sel.loc.end <= endOffset;\n });\n\n if (selected.length > 0) {\n const typeName = typeInfo.getParentType()?.name;\n if (typeName) {\n result = { selections: selected, parentTypeName: typeName };\n }\n }\n },\n }),\n );\n\n return result;\n};\n\n/**\n * Compute brace depth at a given offset using TypeScript scanner.\n * Correctly handles strings, comments, regex, and template literals.\n */\nconst braceDepthAt = (source: string, offset: number): number => {\n const scanner = ts.createScanner(ts.ScriptTarget.Latest, false, ts.LanguageVariant.Standard, source);\n let depth = 0;\n let lastToken: ts.SyntaxKind = ts.SyntaxKind.Unknown;\n\n while (true) {\n let token = scanner.scan();\n if (token === ts.SyntaxKind.EndOfFileToken) break;\n\n // Re-scan / as regex literal when it follows certain tokens\n if (token === ts.SyntaxKind.SlashToken || token === ts.SyntaxKind.SlashEqualsToken) {\n if (\n lastToken === ts.SyntaxKind.FirstAssignment ||\n lastToken === ts.SyntaxKind.EqualsEqualsToken ||\n lastToken === ts.SyntaxKind.EqualsEqualsEqualsToken ||\n lastToken === ts.SyntaxKind.ExclamationEqualsToken ||\n lastToken === ts.SyntaxKind.ExclamationEqualsEqualsToken ||\n lastToken === ts.SyntaxKind.OpenParenToken ||\n lastToken === ts.SyntaxKind.CommaToken ||\n lastToken === ts.SyntaxKind.OpenBracketToken ||\n lastToken === ts.SyntaxKind.ColonToken ||\n lastToken === ts.SyntaxKind.SemicolonToken ||\n lastToken === ts.SyntaxKind.OpenBraceToken ||\n lastToken === ts.SyntaxKind.QuestionToken ||\n lastToken === ts.SyntaxKind.BarBarToken ||\n lastToken === ts.SyntaxKind.AmpersandAmpersandToken ||\n lastToken === ts.SyntaxKind.ExclamationToken ||\n lastToken === ts.SyntaxKind.ReturnKeyword ||\n lastToken === ts.SyntaxKind.CaseKeyword ||\n lastToken === ts.SyntaxKind.NewKeyword\n ) {\n token = scanner.reScanSlashToken();\n }\n }\n\n const tokenStart = scanner.getTokenStart();\n if (tokenStart >= offset) break;\n\n if (token === ts.SyntaxKind.OpenBraceToken) {\n depth++;\n } else if (token === ts.SyntaxKind.CloseBraceToken) {\n depth--;\n }\n\n // Track last non-trivia token for regex detection\n if (\n token !== ts.SyntaxKind.WhitespaceTrivia &&\n token !== ts.SyntaxKind.NewLineTrivia &&\n token !== ts.SyntaxKind.SingleLineCommentTrivia &&\n token !== ts.SyntaxKind.MultiLineCommentTrivia\n ) {\n lastToken = token;\n }\n }\n\n return depth;\n};\n\n/** Find the start of the top-level statement containing the given offset. */\nconst findStatementStart = (source: string, offset: number): number => {\n let pos = offset;\n\n // Find the start of the current line\n while (pos > 0 && source.charCodeAt(pos - 1) !== 10) {\n pos--;\n }\n\n // Walk back through lines to find the top-level statement start\n while (pos > 0) {\n const lineStart = pos;\n const lineText = source.slice(lineStart, source.indexOf(\"\\n\", lineStart)).trimStart();\n const depth = braceDepthAt(source, lineStart);\n\n if (\n depth === 0 &&\n (lineText.startsWith(\"export \") ||\n lineText.startsWith(\"const \") ||\n lineText.startsWith(\"let \") ||\n lineText.startsWith(\"var \") ||\n lineText.startsWith(\"function \") ||\n lineText.startsWith(\"async \"))\n ) {\n return lineStart;\n }\n\n // Go to previous line\n pos--;\n while (pos > 0 && source.charCodeAt(pos - 1) !== 10) {\n pos--;\n }\n\n // At top level, if we hit a statement boundary, the statement starts at lineStart\n if (depth === 0) {\n const prevLine = source.slice(pos, lineStart - 1).trim();\n if (prevLine.endsWith(\";\") || prevLine.endsWith(\"}\")) {\n return lineStart;\n }\n }\n }\n\n return pos;\n};\n","/**\n * Completion handler: provides GraphQL autocompletion in templates.\n * @module\n */\n\nimport type { FragmentDefinitionNode, GraphQLSchema } from \"graphql\";\nimport { getAutocompleteSuggestions } from \"graphql-language-service\";\nimport type { CompletionItem } from \"vscode-languageserver-types\";\nimport { computeHeaderLen, reconstructGraphql } from \"../document-manager\";\nimport { preprocessFragmentArgs } from \"../fragment-args-preprocessor\";\nimport {\n computeLineOffsets,\n createPositionMapper,\n offsetToPosition,\n type Position,\n positionToOffset,\n toIPosition,\n} from \"../position-mapping\";\nimport type { ExtractedTemplate } from \"../types\";\n\nexport type HandleCompletionInput = {\n readonly template: ExtractedTemplate;\n readonly schema: GraphQLSchema;\n readonly tsSource: string;\n /** LSP Position (0-indexed line, 0-indexed character) in the TS file. */\n readonly tsPosition: Position;\n /** External fragment definitions for cross-file resolution. */\n readonly externalFragments?: readonly FragmentDefinitionNode[];\n};\n\n/** Handle a completion request for a GraphQL template. */\nexport const handleCompletion = (input: HandleCompletionInput): CompletionItem[] => {\n const { template, schema, tsSource, tsPosition } = input;\n const reconstructed = reconstructGraphql(template);\n const headerLen = computeHeaderLen(template, reconstructed);\n const { preprocessed } = preprocessFragmentArgs(reconstructed);\n\n const mapper = createPositionMapper({\n tsSource,\n contentStartOffset: template.contentRange.start,\n graphqlContent: template.content,\n });\n\n const contentPos = mapper.tsToGraphql(tsPosition);\n if (!contentPos) {\n return [];\n }\n\n // Shift content position to reconstructed position (account for synthesized header)\n const contentLineOffsets = computeLineOffsets(template.content);\n const contentOffset = positionToOffset(contentLineOffsets, contentPos);\n const reconstructedOffset = contentOffset + headerLen;\n const reconstructedLineOffsets = computeLineOffsets(preprocessed);\n const gqlPosition = offsetToPosition(reconstructedLineOffsets, reconstructedOffset);\n\n // graphql-language-service expects IPosition with line/character (0-indexed)\n const suggestions = getAutocompleteSuggestions(\n schema,\n preprocessed,\n toIPosition(gqlPosition),\n undefined,\n input.externalFragments as FragmentDefinitionNode[] | undefined,\n );\n\n return suggestions as CompletionItem[];\n};\n","/**\n * Shared handler utilities for fragment spread and definition lookup.\n * @module\n */\n\nimport { pathToFileURL } from \"node:url\";\nimport type { FragmentSpreadNode, TypeDefinitionNode } from \"graphql\";\nimport { isTypeDefinitionNode, parse, visit } from \"graphql\";\nimport type { ObjectTypeInfo } from \"graphql-language-service\";\nimport type { Location } from \"vscode-languageserver-types\";\nimport { computeLineOffsets, createPositionMapper, offsetToPosition, type Position } from \"../position-mapping\";\nimport type { SchemaFileInfo } from \"../schema-resolver\";\nimport type { FragmentSpreadLocation, IndexedFragment } from \"../types\";\n\n/** Build ObjectTypeInfo[] from schema file info for graphql-language-service definition APIs. */\nexport const buildObjectTypeInfos = (files: readonly SchemaFileInfo[]): ObjectTypeInfo[] => {\n const result: ObjectTypeInfo[] = [];\n for (const file of files) {\n const doc = parse(file.content);\n for (const def of doc.definitions) {\n if (isTypeDefinitionNode(def)) {\n result.push({\n filePath: pathToFileURL(file.filePath).href,\n content: file.content,\n definition: def as TypeDefinitionNode,\n });\n }\n }\n }\n return result;\n};\n\n/**\n * Find the fragment spread node at the given GraphQL offset using AST.\n * Returns the FragmentSpreadNode if cursor is on a `...FragmentName` pattern.\n */\nexport const findFragmentSpreadAtOffset = (preprocessed: string, offset: number): FragmentSpreadNode | null => {\n try {\n const ast = parse(preprocessed, { noLocation: false });\n let found: FragmentSpreadNode | null = null;\n\n visit(ast, {\n FragmentSpread(node) {\n if (!node.loc) {\n return;\n }\n if (offset >= node.loc.start && offset < node.loc.end) {\n found = node;\n }\n },\n });\n\n return found;\n } catch {\n return findFragmentSpreadByText(preprocessed, offset);\n }\n};\n\n/**\n * Text-based fallback: find fragment spread name at offset.\n * Handles documents with parse errors.\n */\nexport const findFragmentSpreadByText = (text: string, offset: number): FragmentSpreadNode | null => {\n const spreadPattern = /\\.\\.\\.([A-Za-z_]\\w*)/g;\n let match: RegExpExecArray | null = null;\n\n while ((match = spreadPattern.exec(text)) !== null) {\n const start = match.index;\n const end = start + match[0].length;\n if (offset >= start && offset < end) {\n return {\n kind: \"FragmentSpread\" as const,\n name: { kind: \"Name\" as const, value: match[1] ?? \"\" },\n } as FragmentSpreadNode;\n }\n }\n\n return null;\n};\n\nexport type FragmentDefinitionMatch = {\n readonly name: string;\n readonly loc: { readonly start: number; readonly end: number };\n};\n\n/**\n * Find a FragmentDefinition at a given offset.\n * Returns the name and location, or null.\n */\nexport const findFragmentDefinitionAtOffset = (preprocessed: string, offset: number): FragmentDefinitionMatch | null => {\n try {\n const ast = parse(preprocessed, { noLocation: false });\n for (const def of ast.definitions) {\n if (def.kind === \"FragmentDefinition\" && def.name.loc) {\n if (offset >= def.name.loc.start && offset < def.name.loc.end) {\n return { name: def.name.value, loc: { start: def.name.loc.start, end: def.name.loc.end } };\n }\n }\n }\n } catch {\n // ignore parse errors\n }\n return null;\n};\n\n/**\n * Resolve the fragment name at a given offset, checking both definitions and spreads.\n */\nexport const resolveFragmentNameAtOffset = (preprocessed: string, offset: number): string | null => {\n const def = findFragmentDefinitionAtOffset(preprocessed, offset);\n if (def) {\n return def.name;\n }\n\n const spread = findFragmentSpreadAtOffset(preprocessed, offset);\n if (spread) {\n return spread.name.value;\n }\n\n return null;\n};\n\n/** Range result from fragment location computation. */\nexport type FragmentRange = {\n readonly uri: string;\n readonly range: { readonly start: Position; readonly end: Position };\n};\n\n/** Compute TS ranges for all definitions of a named fragment. */\nexport const computeFragmentDefinitionRanges = (\n fragmentName: string,\n allFragments: readonly IndexedFragment[],\n): FragmentRange[] => {\n const ranges: FragmentRange[] = [];\n\n for (const frag of allFragments) {\n if (frag.fragmentName !== fragmentName) {\n continue;\n }\n if (!frag.definition.name.loc) {\n continue;\n }\n\n const defMapper = createPositionMapper({\n tsSource: frag.tsSource,\n contentStartOffset: frag.contentRange.start,\n graphqlContent: frag.content,\n });\n\n const defGqlLineOffsets = computeLineOffsets(frag.content);\n const nameStart = offsetToPosition(defGqlLineOffsets, frag.definition.name.loc.start);\n const nameEnd = offsetToPosition(defGqlLineOffsets, frag.definition.name.loc.end);\n\n ranges.push({\n uri: frag.uri,\n range: {\n start: defMapper.graphqlToTs(nameStart),\n end: defMapper.graphqlToTs(nameEnd),\n },\n });\n }\n\n return ranges;\n};\n\n/** Compute TS ranges for all fragment spread locations. */\nexport const computeSpreadLocationRanges = (spreadLocations: readonly FragmentSpreadLocation[]): FragmentRange[] => {\n const ranges: FragmentRange[] = [];\n\n for (const loc of spreadLocations) {\n const spreadMapper = createPositionMapper({\n tsSource: loc.tsSource,\n contentStartOffset: loc.template.contentRange.start,\n graphqlContent: loc.template.content,\n });\n\n const spreadGqlLineOffsets = computeLineOffsets(loc.template.content);\n const spreadStart = offsetToPosition(spreadGqlLineOffsets, loc.nameOffset);\n const spreadEnd = offsetToPosition(spreadGqlLineOffsets, loc.nameOffset + loc.nameLength);\n\n ranges.push({\n uri: loc.uri,\n range: {\n start: spreadMapper.graphqlToTs(spreadStart),\n end: spreadMapper.graphqlToTs(spreadEnd),\n },\n });\n }\n\n return ranges;\n};\n\n/**\n * Resolve a directive name to its definition in schema files.\n * Parses each schema file and finds DirectiveDefinitionNode matching the name.\n */\nexport const resolveDirectiveDefinition = (directiveName: string, schemaFiles: readonly SchemaFileInfo[]): Location[] => {\n const locations: Location[] = [];\n for (const file of schemaFiles) {\n try {\n const doc = parse(file.content, { noLocation: false });\n const lineOffsets = computeLineOffsets(file.content);\n for (const def of doc.definitions) {\n if (def.kind === \"DirectiveDefinition\" && def.name.value === directiveName && def.name.loc) {\n const start = offsetToPosition(lineOffsets, def.name.loc.start);\n const end = offsetToPosition(lineOffsets, def.name.loc.end);\n locations.push({\n uri: pathToFileURL(file.filePath).href,\n range: { start, end },\n });\n }\n }\n } catch {\n // Parse error — skip\n }\n }\n return locations;\n};\n","/**\n * Definition handler: provides go-to-definition for fragment spreads and schema fields/types.\n * @module\n */\n\nimport type { DocumentNode, GraphQLSchema, NamedTypeNode, TypeNode } from \"graphql\";\nimport { getNamedType, Kind, parse, visit } from \"graphql\";\nimport {\n getContextAtPosition,\n getDefinitionQueryResultForField,\n getDefinitionQueryResultForFragmentSpread,\n getDefinitionQueryResultForNamedType,\n} from \"graphql-language-service\";\nimport type { Location } from \"vscode-languageserver-types\";\nimport { computeHeaderLen, reconstructGraphql } from \"../document-manager\";\nimport { preprocessFragmentArgs } from \"../fragment-args-preprocessor\";\nimport {\n computeLineOffsets,\n createPositionMapper,\n offsetToPosition,\n type Position,\n positionToOffset,\n toIPosition,\n} from \"../position-mapping\";\nimport type { SchemaFileInfo } from \"../schema-resolver\";\nimport type { ExtractedTemplate, IndexedFragment } from \"../types\";\nimport { buildObjectTypeInfos, findFragmentSpreadAtOffset, resolveDirectiveDefinition } from \"./_utils\";\n\nexport type HandleDefinitionInput = {\n readonly template: ExtractedTemplate;\n readonly tsSource: string;\n /** LSP Position (0-indexed line, 0-indexed character) in the TS file. */\n readonly tsPosition: Position;\n /** External fragment definitions for cross-file resolution. */\n readonly externalFragments: readonly IndexedFragment[];\n /** GraphQL schema for field/type resolution. */\n readonly schema?: GraphQLSchema;\n /** Per-file schema source info for go-to-definition in schema files. */\n readonly schemaFiles?: readonly SchemaFileInfo[];\n};\n\n/** Handle a definition request for a GraphQL template. */\nexport const handleDefinition = async (input: HandleDefinitionInput): Promise<Location[]> => {\n const { template, tsSource, tsPosition, externalFragments } = input;\n const reconstructed = reconstructGraphql(template);\n const headerLen = computeHeaderLen(template, reconstructed);\n const { preprocessed } = preprocessFragmentArgs(reconstructed);\n\n const mapper = createPositionMapper({\n tsSource,\n contentStartOffset: template.contentRange.start,\n graphqlContent: template.content,\n });\n\n const gqlPosition = mapper.tsToGraphql(tsPosition);\n if (!gqlPosition) {\n return [];\n }\n\n // Convert from content-relative position to reconstructed-relative offset\n const contentLineOffsets = computeLineOffsets(template.content);\n const contentOffset = positionToOffset(contentLineOffsets, gqlPosition);\n const reconstructedOffset = contentOffset + headerLen;\n\n // 1. Try fragment spread navigation (existing behavior)\n const fragmentSpread = findFragmentSpreadAtOffset(preprocessed, reconstructedOffset);\n if (fragmentSpread) {\n return resolveFragmentSpreadDefinition(preprocessed, fragmentSpread, externalFragments);\n }\n\n // 2. Try variable type navigation (works for all template types)\n if (input.schemaFiles && input.schemaFiles.length > 0) {\n const varTypeResult = await resolveVariableTypeDefinition(preprocessed, reconstructedOffset, input.schemaFiles);\n if (varTypeResult.length > 0) {\n return varTypeResult;\n }\n }\n\n // 3. Try field/type navigation in schema files\n if (input.schema && input.schemaFiles && input.schemaFiles.length > 0) {\n const reconstructedLineOffsets = computeLineOffsets(preprocessed);\n const reconstructedPosition = offsetToPosition(reconstructedLineOffsets, reconstructedOffset);\n return resolveSchemaDefinition(preprocessed, reconstructedPosition, reconstructedOffset, input.schema, input.schemaFiles);\n }\n\n return [];\n};\n\n/** Resolve fragment spread to its definition in an external TypeScript file. */\nconst resolveFragmentSpreadDefinition = async (\n preprocessed: string,\n fragmentSpread: ReturnType<typeof findFragmentSpreadAtOffset> & {},\n externalFragments: readonly IndexedFragment[],\n): Promise<Location[]> => {\n const fragmentInfos = externalFragments.map((f) => ({\n filePath: f.uri,\n content: f.content,\n definition: f.definition,\n }));\n\n try {\n const result = await getDefinitionQueryResultForFragmentSpread(preprocessed, fragmentSpread, fragmentInfos);\n\n return result.definitions.map((def): Location => {\n const defPosition = toIPosition(def.position);\n const endLine = def.range?.end?.line ?? defPosition.line;\n const endChar = def.range?.end?.character ?? defPosition.character;\n\n // Map GraphQL-relative positions to TS file positions for the target document\n const targetFragment = externalFragments.find((f) => f.uri === def.path);\n if (targetFragment) {\n const targetReconstructedLineOffsets = computeLineOffsets(targetFragment.content);\n const targetContentLineOffsets = computeLineOffsets(targetFragment.content.slice(targetFragment.headerLen));\n\n const toOriginalPos = (pos: { line: number; character: number }) => {\n const offset = positionToOffset(targetReconstructedLineOffsets, pos);\n const originalOffset = Math.max(0, offset - targetFragment.headerLen);\n return offsetToPosition(targetContentLineOffsets, originalOffset);\n };\n\n const targetMapper = createPositionMapper({\n tsSource: targetFragment.tsSource,\n contentStartOffset: targetFragment.contentRange.start,\n graphqlContent: targetFragment.content.slice(targetFragment.headerLen),\n });\n const tsStart = targetMapper.graphqlToTs(toOriginalPos({ line: defPosition.line, character: defPosition.character }));\n const tsEnd = targetMapper.graphqlToTs(toOriginalPos({ line: endLine, character: endChar }));\n return {\n uri: def.path,\n range: { start: tsStart, end: tsEnd },\n };\n }\n\n return {\n uri: def.path,\n range: {\n start: { line: defPosition.line, character: defPosition.character },\n end: { line: endLine, character: endChar },\n },\n };\n });\n } catch {\n return [];\n }\n};\n\n/** Unwrap NonNullType/ListType wrappers to get the inner NamedType node. */\nconst unwrapToNamedType = (typeNode: TypeNode): NamedTypeNode | null => {\n if (typeNode.kind === \"NamedType\") return typeNode;\n if (typeNode.kind === \"NonNullType\" || typeNode.kind === \"ListType\") {\n return unwrapToNamedType(typeNode.type);\n }\n return null;\n};\n\n/**\n * Resolve variable type reference to its definition in a schema file.\n * Parses the GraphQL source to find VariableDefinition nodes, checks if the\n * cursor offset falls within a type name, and resolves via getDefinitionQueryResultForNamedType.\n */\nconst resolveVariableTypeDefinition = async (\n preprocessed: string,\n reconstructedOffset: number,\n schemaFiles: readonly SchemaFileInfo[],\n): Promise<Location[]> => {\n let ast: DocumentNode;\n try {\n ast = parse(preprocessed, { noLocation: false });\n } catch {\n return [];\n }\n\n // Collect all NamedType nodes from variable definitions\n let matchedNode: NamedTypeNode | null = null;\n visit(ast, {\n VariableDefinition(node) {\n if (matchedNode) return;\n const namedType = unwrapToNamedType(node.type);\n if (!namedType?.name.loc) return;\n const { start, end } = namedType.name.loc;\n if (reconstructedOffset >= start && reconstructedOffset < end) {\n matchedNode = namedType;\n }\n },\n });\n\n if (!matchedNode) return [];\n\n const objectTypeInfos = buildObjectTypeInfos(schemaFiles);\n try {\n const result = await getDefinitionQueryResultForNamedType(preprocessed, matchedNode, objectTypeInfos);\n return result.definitions.map(\n (def): Location => ({\n uri: def.path ?? \"\",\n range: {\n start: { line: def.position.line, character: def.position.character },\n end: {\n line: def.range?.end?.line ?? def.position.line,\n character: def.range?.end?.character ?? def.position.character,\n },\n },\n }),\n );\n } catch {\n // Built-in scalars (ID, String, etc.) have no definition in schema files\n return [];\n }\n};\n\n/** Resolve field or type name to its definition in a schema .graphql file. */\nconst resolveSchemaDefinition = async (\n preprocessed: string,\n position: Position,\n reconstructedOffset: number,\n schema: GraphQLSchema,\n schemaFiles: readonly SchemaFileInfo[],\n): Promise<Location[]> => {\n // Try type condition / directive resolution first (AST-based).\n // This must run before field resolution because getContextAtPosition's\n // typeInfo.fieldDef stays populated at inline fragment and directive positions\n // (from the enclosing field), which would incorrectly match the field path.\n // When matched, return the locations even if empty (e.g., built-in directives\n // have no schema file definition — returning empty is correct, not a signal to\n // fall through to field resolution).\n const astResult = await tryResolveTypeConditionOrDirective(preprocessed, reconstructedOffset, schemaFiles);\n if (astResult.matched) {\n return astResult.locations;\n }\n\n const context = getContextAtPosition(preprocessed, toIPosition(position), schema);\n if (!context) {\n return [];\n }\n\n const { typeInfo } = context;\n\n // Field definition: cursor is on a field name\n if (typeInfo.fieldDef && typeInfo.parentType) {\n const fieldName = typeInfo.fieldDef.name;\n const namedParentType = getNamedType(typeInfo.parentType);\n if (!namedParentType) {\n return [];\n }\n const parentTypeName = namedParentType.name;\n const objectTypeInfos = buildObjectTypeInfos(schemaFiles);\n const result = await getDefinitionQueryResultForField(fieldName, parentTypeName, objectTypeInfos);\n return result.definitions.map(\n (def): Location => ({\n uri: def.path ?? \"\",\n range: {\n start: { line: def.position.line, character: def.position.character },\n end: {\n line: def.range?.end?.line ?? def.position.line,\n character: def.range?.end?.character ?? def.position.character,\n },\n },\n }),\n );\n }\n\n return [];\n};\n\n/**\n * Try to resolve inline fragment type conditions and directive names via AST walking.\n * Returns { matched: true, locations } when cursor is on a type condition or directive,\n * or { matched: false } when cursor is on neither (caller should try field resolution).\n */\nconst tryResolveTypeConditionOrDirective = async (\n preprocessed: string,\n reconstructedOffset: number,\n schemaFiles: readonly SchemaFileInfo[],\n): Promise<{ matched: true; locations: Location[] } | { matched: false }> => {\n let ast: DocumentNode;\n try {\n ast = parse(preprocessed, { noLocation: false });\n } catch {\n return { matched: false };\n }\n\n let matchedTypeName: string | null = null;\n let matchedDirectiveName: string | null = null;\n\n visit(ast, {\n InlineFragment(node) {\n const loc = node.typeCondition?.name.loc;\n if (loc && reconstructedOffset >= loc.start && reconstructedOffset < loc.end) {\n matchedTypeName = node.typeCondition!.name.value;\n }\n },\n FragmentDefinition(node) {\n const loc = node.typeCondition.name.loc;\n if (loc && reconstructedOffset >= loc.start && reconstructedOffset < loc.end) {\n matchedTypeName = node.typeCondition.name.value;\n }\n },\n Directive(node) {\n const loc = node.name.loc;\n if (loc && reconstructedOffset >= loc.start && reconstructedOffset < loc.end) {\n matchedDirectiveName = node.name.value;\n }\n },\n });\n\n if (matchedTypeName) {\n return { matched: true, locations: await resolveTypeNameToSchemaDefinition(matchedTypeName, schemaFiles) };\n }\n if (matchedDirectiveName) {\n return { matched: true, locations: resolveDirectiveDefinition(matchedDirectiveName, schemaFiles) };\n }\n return { matched: false };\n};\n\n/**\n * Resolve a type name to its definition in a schema file.\n * Used for fragment type names and inline fragment type conditions.\n */\nexport const resolveTypeNameToSchemaDefinition = async (\n typeName: string,\n schemaFiles: readonly SchemaFileInfo[],\n): Promise<Location[]> => {\n const typeNameLen = typeName.length;\n const dummyLoc = { start: 0, end: typeNameLen, startToken: null, endToken: null, source: null };\n const namedTypeNode = {\n kind: Kind.NAMED_TYPE,\n name: { kind: Kind.NAME, value: typeName, loc: dummyLoc },\n loc: dummyLoc,\n } as unknown as NamedTypeNode;\n\n const objectTypeInfos = buildObjectTypeInfos(schemaFiles);\n try {\n const result = await getDefinitionQueryResultForNamedType(\"\", namedTypeNode, objectTypeInfos);\n return result.definitions.map(\n (def): Location => ({\n uri: def.path ?? \"\",\n range: {\n start: { line: def.position.line, character: def.position.character },\n end: {\n line: def.range?.end?.line ?? def.position.line,\n character: def.range?.end?.character ?? def.position.character,\n },\n },\n }),\n );\n } catch {\n return [];\n }\n};\n","/**\n * Document symbol handler: provides outline view for GraphQL templates.\n * @module\n */\n\nimport { getOutline } from \"graphql-language-service\";\nimport { type DocumentSymbol, SymbolKind } from \"vscode-languageserver-types\";\nimport { computeHeaderLen, reconstructGraphql } from \"../document-manager\";\nimport { preprocessFragmentArgs } from \"../fragment-args-preprocessor\";\nimport { computeLineOffsets, createPositionMapper, offsetToPosition, positionToOffset } from \"../position-mapping\";\nimport type { ExtractedTemplate } from \"../types\";\n\nexport type HandleDocumentSymbolInput = {\n readonly templates: readonly ExtractedTemplate[];\n readonly tsSource: string;\n};\n\nconst KIND_MAP: Record<string, SymbolKind> = {\n OperationDefinition: SymbolKind.Function,\n FragmentDefinition: SymbolKind.Class,\n Field: SymbolKind.Field,\n FragmentSpread: SymbolKind.Constant,\n InlineFragment: SymbolKind.Struct,\n EnumValueDefinition: SymbolKind.EnumMember,\n InputValueDefinition: SymbolKind.Property,\n FieldDefinition: SymbolKind.Field,\n ObjectTypeDefinition: SymbolKind.Class,\n InputObjectTypeDefinition: SymbolKind.Class,\n InterfaceTypeDefinition: SymbolKind.Interface,\n EnumTypeDefinition: SymbolKind.Enum,\n};\n\ntype OutlineTree = {\n readonly representativeName?: string;\n readonly tokenizedText?: ReadonlyArray<{ readonly value: string }>;\n readonly kind: string;\n readonly startPosition: { readonly line: number; readonly character: number };\n readonly endPosition?: { readonly line: number; readonly character: number };\n readonly children: readonly OutlineTree[];\n};\n\nconst getSymbolName = (tree: OutlineTree): string => {\n if (tree.representativeName) {\n return tree.representativeName;\n }\n if (tree.tokenizedText) {\n return tree.tokenizedText.map((t) => t.value).join(\"\");\n }\n return tree.kind;\n};\n\ntype PositionConverter = (pos: { line: number; character: number }) => { line: number; character: number };\n\nconst convertTree = (\n tree: OutlineTree,\n toContentPos: PositionConverter,\n mapper: ReturnType<typeof createPositionMapper>,\n): DocumentSymbol | null => {\n const name = getSymbolName(tree);\n const kind = KIND_MAP[tree.kind] ?? SymbolKind.Variable;\n\n const startTs = mapper.graphqlToTs(toContentPos(tree.startPosition));\n const endTs = tree.endPosition ? mapper.graphqlToTs(toContentPos(tree.endPosition)) : startTs;\n\n const range = {\n start: { line: startTs.line, character: startTs.character },\n end: { line: endTs.line, character: endTs.character },\n };\n\n const children: DocumentSymbol[] = [];\n for (const child of tree.children) {\n const converted = convertTree(child, toContentPos, mapper);\n if (converted) {\n children.push(converted);\n }\n }\n\n return {\n name,\n kind,\n range,\n selectionRange: range,\n children: children.length > 0 ? children : undefined,\n };\n};\n\n/** Handle a documentSymbol request for all GraphQL templates in a document. */\nexport const handleDocumentSymbol = (input: HandleDocumentSymbolInput): DocumentSymbol[] => {\n const { templates, tsSource } = input;\n const symbols: DocumentSymbol[] = [];\n\n for (const template of templates) {\n const reconstructed = reconstructGraphql(template);\n const headerLen = computeHeaderLen(template, reconstructed);\n const { preprocessed } = preprocessFragmentArgs(reconstructed);\n const outline = getOutline(preprocessed);\n if (!outline) {\n continue;\n }\n\n const mapper = createPositionMapper({\n tsSource,\n contentStartOffset: template.contentRange.start,\n graphqlContent: template.content,\n });\n\n // Convert position from reconstructed source to template content\n const reconstructedLineOffsets = computeLineOffsets(preprocessed);\n const contentLineOffsets = computeLineOffsets(template.content);\n const toContentPos: PositionConverter = (pos) => {\n const offset = positionToOffset(reconstructedLineOffsets, pos);\n const contentOffset = Math.max(0, offset - headerLen);\n return offsetToPosition(contentLineOffsets, contentOffset);\n };\n\n for (const tree of outline.outlineTrees as unknown as OutlineTree[]) {\n const symbol = convertTree(tree, toContentPos, mapper);\n if (symbol) {\n // Experimental: add detail for skill consumption\n if (template.kind === \"fragment\" && template.typeName) {\n symbol.detail = `on ${template.typeName}`;\n } else if (template.kind !== \"fragment\") {\n symbol.detail = template.kind;\n }\n symbols.push(symbol);\n }\n }\n }\n\n return symbols;\n};\n","/**\n * Completion handler for callback builder field tree nodes.\n * Provides field and union member type completions based on the typed field tree.\n * @module\n */\n\nimport type { GraphQLSchema } from \"graphql\";\nimport { GraphQLUnionType, getNamedType, isObjectType } from \"graphql\";\nimport type { CompletionItem } from \"vscode-languageserver-types\";\nimport { CompletionItemKind } from \"vscode-languageserver-types\";\nimport type { TypedFieldTree } from \"../field-tree-resolver\";\nimport { findNodeAtOffset } from \"../field-tree-resolver\";\nimport type { Position } from \"../position-mapping\";\n\nexport type HandleFieldTreeCompletionInput = {\n readonly fieldTree: TypedFieldTree;\n readonly schema: GraphQLSchema;\n readonly tsSource: string;\n readonly tsPosition: Position;\n /** Character offset in the TS source file. */\n readonly offset: number;\n};\n\n/** Handle a completion request for a callback builder field tree node. */\nexport const handleFieldTreeCompletion = (input: HandleFieldTreeCompletionInput): CompletionItem[] => {\n const { fieldTree, schema, tsSource, offset } = input;\n const result = findNodeAtOffset(fieldTree, offset);\n\n if (!result) return [];\n\n if (result.kind === \"field\") {\n const { node } = result;\n // Get the current prefix the user has typed (text between fieldNameSpan.start and cursor offset)\n const prefix = tsSource.slice(node.fieldNameSpan.start, offset);\n\n // Get fields from the parent type\n const parentType = schema.getType(node.parentTypeName);\n if (!parentType || !isObjectType(parentType)) return [];\n\n const fields = parentType.getFields();\n const items: CompletionItem[] = [];\n for (const [name, field] of Object.entries(fields)) {\n if (!name.startsWith(prefix)) continue;\n const namedType = getNamedType(field.type);\n items.push({\n label: name,\n kind: CompletionItemKind.Field,\n detail: namedType?.name,\n });\n }\n return items;\n }\n\n if (result.kind === \"unionMember\") {\n const { parentNode } = result;\n // Get union members\n const fieldType = parentNode.fieldTypeName ? schema.getType(parentNode.fieldTypeName) : null;\n if (!fieldType || !(fieldType instanceof GraphQLUnionType)) return [];\n\n const prefix = tsSource.slice(result.branch.typeNameSpan.start, offset);\n return fieldType\n .getTypes()\n .filter((member) => member.name.startsWith(prefix))\n .map((member) => ({\n label: member.name,\n kind: CompletionItemKind.Class,\n detail: `member of ${parentNode.fieldTypeName}`,\n }));\n }\n\n return [];\n};\n","/**\n * Definition handler: provides go-to-definition for callback builder field tree nodes.\n * @module\n */\n\nimport type { GraphQLSchema, NamedTypeNode } from \"graphql\";\nimport { Kind } from \"graphql\";\nimport { getDefinitionQueryResultForField, getDefinitionQueryResultForNamedType } from \"graphql-language-service\";\nimport type { Location } from \"vscode-languageserver-types\";\nimport type { TypedFieldTree } from \"../field-tree-resolver\";\nimport { findNodeAtOffset } from \"../field-tree-resolver\";\nimport type { Position } from \"../position-mapping\";\nimport type { SchemaFileInfo } from \"../schema-resolver\";\nimport { buildObjectTypeInfos } from \"./_utils\";\n\nexport type HandleFieldTreeDefinitionInput = {\n readonly fieldTree: TypedFieldTree;\n readonly schema: GraphQLSchema;\n readonly tsSource: string;\n readonly tsPosition: Position;\n readonly offset: number;\n readonly schemaFiles: readonly SchemaFileInfo[];\n};\n\n/** Handle a definition request for a callback builder field tree. */\nexport const handleFieldTreeDefinition = async (input: HandleFieldTreeDefinitionInput): Promise<Location[]> => {\n const { fieldTree, offset, schemaFiles } = input;\n const result = findNodeAtOffset(fieldTree, offset);\n if (!result) return [];\n\n const objectTypeInfos = buildObjectTypeInfos(schemaFiles);\n\n if (result.kind === \"field\") {\n const { node } = result;\n try {\n const defResult = await getDefinitionQueryResultForField(node.fieldName, node.parentTypeName, objectTypeInfos);\n return defResult.definitions.map(\n (def): Location => ({\n uri: def.path ?? \"\",\n range: {\n start: { line: def.position.line, character: def.position.character },\n end: {\n line: def.range?.end?.line ?? def.position.line,\n character: def.range?.end?.character ?? def.position.character,\n },\n },\n }),\n );\n } catch {\n return [];\n }\n }\n\n if (result.kind === \"unionMember\") {\n // graphql-language-service requires loc.start/end on the NamedTypeNode for queryRange.\n // We supply a minimal stub since we only use def.position/def.range from the result.\n const typeNameLen = result.branch.typeName.length;\n const dummyLoc = { start: 0, end: typeNameLen, startToken: null, endToken: null, source: null };\n const namedTypeNode = {\n kind: Kind.NAMED_TYPE,\n name: { kind: Kind.NAME, value: result.branch.typeName, loc: dummyLoc },\n loc: dummyLoc,\n } as unknown as NamedTypeNode;\n try {\n const defResult = await getDefinitionQueryResultForNamedType(\"\", namedTypeNode, objectTypeInfos);\n return defResult.definitions.map(\n (def): Location => ({\n uri: def.path ?? \"\",\n range: {\n start: { line: def.position.line, character: def.position.character },\n end: {\n line: def.range?.end?.line ?? def.position.line,\n character: def.range?.end?.character ?? def.position.character,\n },\n },\n }),\n );\n } catch {\n return [];\n }\n }\n\n return [];\n};\n","/**\n * Hover handler for callback builder field tree nodes.\n * Provides field type information on hover.\n * @module\n */\n\nimport type { Hover } from \"vscode-languageserver-types\";\nimport type { TypedFieldTree } from \"../field-tree-resolver\";\nimport { findNodeAtOffset } from \"../field-tree-resolver\";\n\nexport type HandleFieldTreeHoverInput = {\n readonly fieldTree: TypedFieldTree;\n /** Character offset in the TS source file. */\n readonly offset: number;\n};\n\n/** Handle a hover request for a callback builder field tree node. */\nexport const handleFieldTreeHover = (input: HandleFieldTreeHoverInput): Hover | null => {\n const { fieldTree, offset } = input;\n const result = findNodeAtOffset(fieldTree, offset);\n\n if (!result || result.kind !== \"field\") return null;\n\n const { node } = result;\n if (!node.fieldTypeName) return null;\n\n return {\n contents: { kind: \"markdown\", value: `${node.fieldName}: ${node.fieldTypeName}` },\n };\n};\n","/**\n * Formatting handler: format GraphQL content within tagged templates.\n * @module\n */\n\nimport { type FormatGraphqlFn, formatTemplatesInSource } from \"@soda-gql/common/template-extraction\";\nimport { parse as parseGraphql, print as printGraphql } from \"graphql\";\nimport type { TextEdit } from \"vscode-languageserver-types\";\nimport { computeLineOffsets, offsetToPosition } from \"../position-mapping\";\nimport type { ExtractedTemplate } from \"../types\";\n\nexport type { FormatGraphqlFn };\n\nexport type HandleFormattingInput = {\n readonly templates: readonly ExtractedTemplate[];\n readonly tsSource: string;\n readonly formatGraphql?: FormatGraphqlFn;\n};\n\nconst defaultFormatGraphql: FormatGraphqlFn = (source) => {\n const ast = parseGraphql(source, { noLocation: false });\n return printGraphql(ast);\n};\n\n/** Handle a document formatting request for GraphQL templates. */\nexport const handleFormatting = (input: HandleFormattingInput): TextEdit[] => {\n const { templates, tsSource, formatGraphql } = input;\n const format = formatGraphql ?? defaultFormatGraphql;\n const tsLineOffsets = computeLineOffsets(tsSource);\n\n // Delegate to shared pipeline: handles wrap/unwrap, indentUnit, interpolations\n const templateEdits = formatTemplatesInSource(templates, tsSource, format);\n\n return templateEdits.map((edit) => ({\n range: {\n start: offsetToPosition(tsLineOffsets, edit.start),\n end: offsetToPosition(tsLineOffsets, edit.end),\n },\n newText: edit.newText,\n }));\n};\n","/**\n * Hover handler: provides type information on hover in GraphQL templates.\n * @module\n */\n\nimport type { GraphQLSchema } from \"graphql\";\nimport { getHoverInformation } from \"graphql-language-service\";\nimport type { Hover, MarkupContent } from \"vscode-languageserver-types\";\nimport { computeHeaderLen, reconstructGraphql } from \"../document-manager\";\nimport { preprocessFragmentArgs } from \"../fragment-args-preprocessor\";\nimport {\n computeLineOffsets,\n createPositionMapper,\n offsetToPosition,\n type Position,\n positionToOffset,\n toIPosition,\n} from \"../position-mapping\";\nimport type { ExtractedTemplate } from \"../types\";\n\nexport type HandleHoverInput = {\n readonly template: ExtractedTemplate;\n readonly schema: GraphQLSchema;\n readonly tsSource: string;\n /** LSP Position (0-indexed line, 0-indexed character) in the TS file. */\n readonly tsPosition: Position;\n};\n\n/** Handle a hover request for a GraphQL template. */\nexport const handleHover = (input: HandleHoverInput): Hover | null => {\n const { template, schema, tsSource, tsPosition } = input;\n const reconstructed = reconstructGraphql(template);\n const headerLen = computeHeaderLen(template, reconstructed);\n const { preprocessed } = preprocessFragmentArgs(reconstructed);\n\n const mapper = createPositionMapper({\n tsSource,\n contentStartOffset: template.contentRange.start,\n graphqlContent: template.content,\n });\n\n const contentPos = mapper.tsToGraphql(tsPosition);\n if (!contentPos) {\n return null;\n }\n\n // Shift content position to reconstructed position (account for synthesized header)\n const contentLineOffsets = computeLineOffsets(template.content);\n const contentOffset = positionToOffset(contentLineOffsets, contentPos);\n const reconstructedOffset = contentOffset + headerLen;\n const reconstructedLineOffsets = computeLineOffsets(preprocessed);\n const gqlPosition = offsetToPosition(reconstructedLineOffsets, reconstructedOffset);\n\n const hoverInfo = getHoverInformation(schema, preprocessed, toIPosition(gqlPosition), undefined, {\n useMarkdown: true,\n });\n\n // getHoverInformation returns Hover['contents'] which can be string, MarkupContent, or MarkedString[]\n if (!hoverInfo || hoverInfo === \"\" || (Array.isArray(hoverInfo) && hoverInfo.length === 0)) {\n return null;\n }\n\n // Normalize to MarkupContent\n let contents: MarkupContent;\n if (typeof hoverInfo === \"string\") {\n contents = { kind: \"markdown\", value: hoverInfo };\n } else if (Array.isArray(hoverInfo)) {\n const parts = hoverInfo.map((item) => (typeof item === \"string\" ? item : item.value));\n contents = { kind: \"markdown\", value: parts.join(\"\\n\\n\") };\n } else {\n contents = hoverInfo as MarkupContent;\n }\n\n return { contents };\n};\n","/**\n * References handler: find all usages of a fragment across the workspace.\n * @module\n */\n\nimport type { Location } from \"vscode-languageserver-types\";\nimport { preprocessFragmentArgs } from \"../fragment-args-preprocessor\";\nimport { computeLineOffsets, createPositionMapper, type Position, positionToOffset } from \"../position-mapping\";\nimport type { ExtractedTemplate, FragmentSpreadLocation, IndexedFragment } from \"../types\";\n\nimport { computeFragmentDefinitionRanges, computeSpreadLocationRanges, resolveFragmentNameAtOffset } from \"./_utils\";\n\nexport type HandleReferencesInput = {\n readonly template: ExtractedTemplate;\n readonly tsSource: string;\n readonly tsPosition: Position;\n readonly allFragments: readonly IndexedFragment[];\n readonly findSpreadLocations: (fragmentName: string) => readonly FragmentSpreadLocation[];\n};\n\n/** Handle a references request for a GraphQL template. */\nexport const handleReferences = (input: HandleReferencesInput): Location[] => {\n const { template, tsSource, tsPosition, allFragments, findSpreadLocations } = input;\n const { preprocessed } = preprocessFragmentArgs(template.content);\n\n const mapper = createPositionMapper({\n tsSource,\n contentStartOffset: template.contentRange.start,\n graphqlContent: template.content,\n });\n\n const gqlPosition = mapper.tsToGraphql(tsPosition);\n if (!gqlPosition) {\n return [];\n }\n\n const offset = positionToOffset(computeLineOffsets(preprocessed), gqlPosition);\n\n // Determine the fragment name at cursor\n const fragmentName = resolveFragmentNameAtOffset(preprocessed, offset);\n if (!fragmentName) {\n return [];\n }\n\n const locations: Location[] = [];\n\n // Collect fragment definition locations\n for (const r of computeFragmentDefinitionRanges(fragmentName, allFragments)) {\n locations.push({ uri: r.uri, range: r.range });\n }\n\n // Collect fragment spread locations\n for (const r of computeSpreadLocationRanges(findSpreadLocations(fragmentName))) {\n locations.push({ uri: r.uri, range: r.range });\n }\n\n return locations;\n};\n","/**\n * Rename handler: rename fragments across the workspace.\n * @module\n */\n\nimport type { Range, TextEdit, WorkspaceEdit } from \"vscode-languageserver-types\";\nimport { preprocessFragmentArgs } from \"../fragment-args-preprocessor\";\nimport { computeLineOffsets, createPositionMapper, offsetToPosition, type Position, positionToOffset } from \"../position-mapping\";\nimport type { ExtractedTemplate, FragmentSpreadLocation, IndexedFragment } from \"../types\";\nimport {\n computeFragmentDefinitionRanges,\n computeSpreadLocationRanges,\n findFragmentDefinitionAtOffset,\n findFragmentSpreadAtOffset,\n resolveFragmentNameAtOffset,\n} from \"./_utils\";\n\nexport type HandlePrepareRenameInput = {\n readonly template: ExtractedTemplate;\n readonly tsSource: string;\n readonly tsPosition: Position;\n};\n\nexport type HandleRenameInput = {\n readonly template: ExtractedTemplate;\n readonly tsSource: string;\n readonly tsPosition: Position;\n readonly newName: string;\n readonly allFragments: readonly IndexedFragment[];\n readonly findSpreadLocations: (fragmentName: string) => readonly FragmentSpreadLocation[];\n};\n\n/** Validate and return the range of the symbol to be renamed. */\nexport const handlePrepareRename = (input: HandlePrepareRenameInput): { range: Range; placeholder: string } | null => {\n const { template, tsSource, tsPosition } = input;\n const { preprocessed } = preprocessFragmentArgs(template.content);\n\n const mapper = createPositionMapper({\n tsSource,\n contentStartOffset: template.contentRange.start,\n graphqlContent: template.content,\n });\n\n const gqlPosition = mapper.tsToGraphql(tsPosition);\n if (!gqlPosition) {\n return null;\n }\n\n const offset = positionToOffset(computeLineOffsets(preprocessed), gqlPosition);\n\n // Check fragment definition name\n const defResult = findFragmentDefinitionAtOffset(preprocessed, offset);\n if (defResult) {\n const gqlLineOffsets = computeLineOffsets(preprocessed);\n const start = mapper.graphqlToTs(offsetToPosition(gqlLineOffsets, defResult.loc.start));\n const end = mapper.graphqlToTs(offsetToPosition(gqlLineOffsets, defResult.loc.end));\n return { range: { start, end }, placeholder: defResult.name };\n }\n\n // Check fragment spread\n const spread = findFragmentSpreadAtOffset(preprocessed, offset);\n if (spread?.name.value && spread.name.loc) {\n const gqlLineOffsets = computeLineOffsets(preprocessed);\n const start = mapper.graphqlToTs(offsetToPosition(gqlLineOffsets, spread.name.loc.start));\n const end = mapper.graphqlToTs(offsetToPosition(gqlLineOffsets, spread.name.loc.end));\n return { range: { start, end }, placeholder: spread.name.value };\n }\n\n return null;\n};\n\n/** Perform a rename across the workspace. */\nexport const handleRename = (input: HandleRenameInput): WorkspaceEdit | null => {\n const { template, tsSource, tsPosition, newName, allFragments, findSpreadLocations } = input;\n const { preprocessed } = preprocessFragmentArgs(template.content);\n\n const mapper = createPositionMapper({\n tsSource,\n contentStartOffset: template.contentRange.start,\n graphqlContent: template.content,\n });\n\n const gqlPosition = mapper.tsToGraphql(tsPosition);\n if (!gqlPosition) {\n return null;\n }\n\n const offset = positionToOffset(computeLineOffsets(preprocessed), gqlPosition);\n\n // Determine the fragment name at cursor\n const fragmentName = resolveFragmentNameAtOffset(preprocessed, offset);\n if (!fragmentName) {\n return null;\n }\n\n const changes: Record<string, TextEdit[]> = {};\n\n const addEdit = (uri: string, range: Range, text: string): void => {\n if (!changes[uri]) {\n changes[uri] = [];\n }\n changes[uri].push({ range, newText: text });\n };\n\n // Rename fragment definitions\n for (const r of computeFragmentDefinitionRanges(fragmentName, allFragments)) {\n addEdit(r.uri, r.range, newName);\n }\n\n // Rename fragment spreads\n for (const r of computeSpreadLocationRanges(findSpreadLocations(fragmentName))) {\n addEdit(r.uri, r.range, newName);\n }\n\n if (Object.keys(changes).length === 0) {\n return null;\n }\n\n return { changes };\n};\n","/**\n * LSP server: wires all components together via vscode-languageserver.\n * @module\n */\n\nimport { fileURLToPath } from \"node:url\";\nimport { findAllConfigFiles, findConfigFile } from \"@soda-gql/config\";\nimport type { GraphQLSchema } from \"graphql\";\nimport {\n type Connection,\n createConnection,\n DidChangeWatchedFilesNotification,\n FileChangeType,\n type InitializeParams,\n type InitializeResult,\n ProposedFeatures,\n type TextDocumentChangeEvent,\n TextDocumentSyncKind,\n TextDocuments,\n} from \"vscode-languageserver/node\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ConfigContext, ConfigRegistry } from \"./config-registry\";\nimport { createConfigRegistry } from \"./config-registry\";\nimport { collectRawDiagnostics } from \"./diagnostics-collector\";\nimport { lspErrors } from \"./errors\";\nimport { resolveFieldTree, type TypedFieldTree } from \"./field-tree-resolver\";\nimport { handleCodeAction } from \"./handlers/code-action\";\nimport { handleCompletion } from \"./handlers/completion\";\nimport { handleDefinition, resolveTypeNameToSchemaDefinition } from \"./handlers/definition\";\nimport { handleDocumentSymbol } from \"./handlers/document-symbol\";\nimport { handleFieldTreeCompletion } from \"./handlers/field-tree-completion\";\nimport { handleFieldTreeDefinition } from \"./handlers/field-tree-definition\";\nimport { handleFieldTreeHover } from \"./handlers/field-tree-hover\";\nimport { handleFormatting } from \"./handlers/formatting\";\nimport { handleHover } from \"./handlers/hover\";\nimport { handleReferences } from \"./handlers/references\";\nimport { handlePrepareRename, handleRename } from \"./handlers/rename\";\nimport type { SchemaEntry } from \"./schema-resolver\";\nimport type { ExtractedTemplate } from \"./types\";\n\nexport type LspServerOptions = {\n readonly connection?: Connection;\n readonly initializeParams?: InitializeParams;\n};\n\n/** Discriminated union describing what LSP context was resolved at a given position. */\ntype ResolvedPositionContext =\n | {\n kind: \"fieldTree\";\n ctx: ConfigContext;\n tsSource: string;\n offset: number;\n tsPosition: { line: number; character: number };\n typedTree: TypedFieldTree;\n schema: GraphQLSchema;\n schemaEntry: SchemaEntry;\n }\n | {\n kind: \"template\";\n ctx: ConfigContext;\n tsSource: string;\n offset: number;\n tsPosition: { line: number; character: number };\n template: ExtractedTemplate;\n schemaEntry: SchemaEntry | undefined;\n }\n | undefined;\n\n/**\n * Shared 3-phase dispatch: registry/ctx/doc guard → field-tree → template.\n * Used by completion, hover, and definition handlers.\n */\nconst resolvePositionContext = (\n registry: ConfigRegistry | undefined,\n documents: TextDocuments<TextDocument>,\n uri: string,\n position: { line: number; character: number },\n): ResolvedPositionContext => {\n if (!registry) {\n return undefined;\n }\n\n const ctx = registry.resolveForUri(uri);\n if (!ctx) {\n return undefined;\n }\n\n const doc = documents.get(uri);\n if (!doc) {\n return undefined;\n }\n\n const tsSource = doc.getText();\n const offset = positionToOffset(tsSource, position);\n const tsPosition = { line: position.line, character: position.character };\n\n // Field tree dispatch: callback builder field selection\n const untypedTree = ctx.documentManager.findFieldTreeAtOffset(uri, offset);\n if (untypedTree) {\n const schemaEntry = ctx.schemaResolver.getSchema(untypedTree.schemaName);\n if (schemaEntry) {\n const typedTree = resolveFieldTree(untypedTree, schemaEntry.schema);\n if (typedTree) {\n return { kind: \"fieldTree\", ctx, tsSource, offset, tsPosition, typedTree, schema: schemaEntry.schema, schemaEntry };\n }\n }\n }\n\n // Template dispatch: tagged templates and callback-variables\n const template = ctx.documentManager.findTemplateAtOffset(uri, offset);\n if (!template) {\n return undefined;\n }\n\n const schemaEntry = ctx.schemaResolver.getSchema(template.schemaName);\n return { kind: \"template\", ctx, tsSource, offset, tsPosition, template, schemaEntry };\n};\n\n/** Server capabilities shared between direct and proxy initialization. */\nconst serverCapabilities = {\n textDocumentSync: TextDocumentSyncKind.Full,\n hoverProvider: true,\n documentSymbolProvider: true,\n definitionProvider: true,\n referencesProvider: true,\n renameProvider: { prepareProvider: true },\n documentFormattingProvider: true,\n completionProvider: {\n triggerCharacters: [\"{\", \"(\", \":\", \"@\", \"$\", \" \", \"\\n\", \".\", '\"'],\n },\n codeActionProvider: {\n codeActionKinds: [\"refactor.extract\"],\n },\n} satisfies InitializeResult[\"capabilities\"];\n\n/** Initialize the LSP server from InitializeParams. Used by both direct and proxy modes. */\nconst initializeFromParams = (\n params: InitializeParams,\n connection: Connection,\n): { result: InitializeResult; registry: ConfigRegistry | undefined } => {\n const roots = resolveWorkspaceRoots(params);\n if (roots.length === 0) {\n connection.window.showErrorMessage(\"soda-gql LSP: no workspace root provided\");\n return { result: { capabilities: {} }, registry: undefined };\n }\n\n const configPaths = discoverConfigs(roots);\n if (configPaths.length === 0) {\n connection.window.showErrorMessage(\"soda-gql LSP: no config file found\");\n return { result: { capabilities: {} }, registry: undefined };\n }\n\n const registryResult = createConfigRegistry(configPaths);\n if (registryResult.isErr()) {\n connection.window.showErrorMessage(`soda-gql LSP: ${registryResult.error.message}`);\n return { result: { capabilities: {} }, registry: undefined };\n }\n\n return {\n result: { capabilities: serverCapabilities },\n registry: registryResult.value,\n };\n};\n\nexport const createLspServer = (options?: LspServerOptions) => {\n const connection = options?.connection ?? createConnection(ProposedFeatures.all);\n const documents = new TextDocuments(TextDocument);\n\n let registry: ConfigRegistry | undefined;\n const swcNotification: SwcNotificationState = { shown: false };\n\n const publishDiagnosticsForDocument = (uri: string) => {\n if (!registry) {\n return;\n }\n\n const ctx = registry.resolveForUri(uri);\n if (!ctx) {\n connection.sendDiagnostics({ uri, diagnostics: [] });\n return;\n }\n\n const state = ctx.documentManager.get(uri);\n if (!state) {\n connection.sendDiagnostics({ uri, diagnostics: [] });\n return;\n }\n\n const diagnostics = collectRawDiagnostics(state, ctx);\n connection.sendDiagnostics({ uri, diagnostics: [...diagnostics] });\n };\n\n const publishDiagnosticsForAllOpen = () => {\n for (const doc of documents.all()) {\n publishDiagnosticsForDocument(doc.uri);\n }\n };\n\n let initializeResult: InitializeResult | undefined;\n\n if (options?.initializeParams) {\n const init = initializeFromParams(options.initializeParams, connection);\n registry = init.registry;\n initializeResult = init.result;\n } else {\n connection.onInitialize((params): InitializeResult => {\n const init = initializeFromParams(params, connection);\n registry = init.registry;\n return init.result;\n });\n }\n\n connection.onInitialized(() => {\n // Register for file watcher on .graphql schema files and config files\n connection.client.register(DidChangeWatchedFilesNotification.type, {\n watchers: [{ globPattern: \"**/*.graphql\" }, { globPattern: \"**/soda-gql.config.*\" }],\n });\n });\n\n documents.onDidChangeContent((change: TextDocumentChangeEvent<TextDocument>) => {\n if (!registry) {\n return;\n }\n const ctx = registry.resolveForUri(change.document.uri);\n if (!ctx) {\n return;\n }\n const state = ctx.documentManager.update(change.document.uri, change.document.version, change.document.getText());\n checkSwcUnavailable(state.swcUnavailable, swcNotification, (msg) => connection.window.showErrorMessage(msg));\n publishDiagnosticsForDocument(change.document.uri);\n });\n\n documents.onDidClose((change: TextDocumentChangeEvent<TextDocument>) => {\n if (!registry) {\n return;\n }\n const ctx = registry.resolveForUri(change.document.uri);\n if (ctx) {\n ctx.documentManager.remove(change.document.uri);\n }\n connection.sendDiagnostics({ uri: change.document.uri, diagnostics: [] });\n });\n\n connection.onCompletion((params) => {\n const resolved = resolvePositionContext(registry, documents, params.textDocument.uri, params.position);\n\n if (!resolved) {\n return [];\n }\n\n if (resolved.kind === \"fieldTree\") {\n return handleFieldTreeCompletion({\n fieldTree: resolved.typedTree,\n schema: resolved.schema,\n tsSource: resolved.tsSource,\n tsPosition: resolved.tsPosition,\n offset: resolved.offset,\n });\n }\n\n // resolved.kind === \"template\"\n if (!resolved.schemaEntry) {\n return [];\n }\n\n const externalFragments = resolved.ctx.documentManager\n .getExternalFragments(params.textDocument.uri, resolved.template.schemaName)\n .map((f) => f.definition);\n\n return handleCompletion({\n template: resolved.template,\n schema: resolved.schemaEntry.schema,\n tsSource: resolved.tsSource,\n tsPosition: resolved.tsPosition,\n externalFragments,\n });\n });\n\n connection.onHover((params) => {\n const resolved = resolvePositionContext(registry, documents, params.textDocument.uri, params.position);\n\n if (!resolved) {\n return null;\n }\n\n if (resolved.kind === \"fieldTree\") {\n return handleFieldTreeHover({ fieldTree: resolved.typedTree, offset: resolved.offset });\n }\n\n // resolved.kind === \"template\"\n if (!resolved.schemaEntry) {\n return null;\n }\n\n return handleHover({\n template: resolved.template,\n schema: resolved.schemaEntry.schema,\n tsSource: resolved.tsSource,\n tsPosition: resolved.tsPosition,\n });\n });\n\n connection.onDefinition(async (params) => {\n const resolved = resolvePositionContext(registry, documents, params.textDocument.uri, params.position);\n\n if (!resolved) {\n // resolvePositionContext returns undefined when no field tree or template found.\n // For definition, also try fragment type name navigation as a fallback.\n if (!registry) {\n return [];\n }\n const ctx = registry.resolveForUri(params.textDocument.uri);\n if (!ctx) {\n return [];\n }\n const doc = documents.get(params.textDocument.uri);\n if (!doc) {\n return [];\n }\n const offset = positionToOffset(doc.getText(), params.position);\n // Try fragment type name navigation (typeNameSpan is outside contentRange)\n const typeNameTemplate = ctx.documentManager.findTemplateByTypeNameOffset(params.textDocument.uri, offset);\n if (typeNameTemplate?.typeName) {\n const typeNameEntry = ctx.schemaResolver.getSchema(typeNameTemplate.schemaName);\n if (typeNameEntry?.files) {\n return resolveTypeNameToSchemaDefinition(typeNameTemplate.typeName, typeNameEntry.files);\n }\n }\n return [];\n }\n\n if (resolved.kind === \"fieldTree\") {\n if (!resolved.schemaEntry.files) {\n return [];\n }\n return handleFieldTreeDefinition({\n fieldTree: resolved.typedTree,\n schema: resolved.schema,\n tsSource: resolved.tsSource,\n tsPosition: resolved.tsPosition,\n offset: resolved.offset,\n schemaFiles: resolved.schemaEntry.files,\n });\n }\n\n // resolved.kind === \"template\"\n const externalFragments = resolved.ctx.documentManager.getExternalFragments(\n params.textDocument.uri,\n resolved.template.schemaName,\n );\n\n return handleDefinition({\n template: resolved.template,\n tsSource: resolved.tsSource,\n tsPosition: resolved.tsPosition,\n externalFragments,\n schema: resolved.schemaEntry?.schema,\n schemaFiles: resolved.schemaEntry?.files,\n });\n });\n\n connection.onReferences((params) => {\n if (!registry) {\n return [];\n }\n\n const ctx = registry.resolveForUri(params.textDocument.uri);\n if (!ctx) {\n return [];\n }\n\n const doc = documents.get(params.textDocument.uri);\n if (!doc) {\n return [];\n }\n\n const template = ctx.documentManager.findTemplateAtOffset(\n params.textDocument.uri,\n positionToOffset(doc.getText(), params.position),\n );\n\n if (!template) {\n return [];\n }\n\n return handleReferences({\n template,\n tsSource: doc.getText(),\n tsPosition: { line: params.position.line, character: params.position.character },\n allFragments: ctx.documentManager.getAllFragments(template.schemaName),\n findSpreadLocations: (name) => ctx.documentManager.findFragmentSpreadLocations(name, template.schemaName),\n });\n });\n\n connection.onPrepareRename((params) => {\n if (!registry) {\n return null;\n }\n\n const ctx = registry.resolveForUri(params.textDocument.uri);\n if (!ctx) {\n return null;\n }\n\n const doc = documents.get(params.textDocument.uri);\n if (!doc) {\n return null;\n }\n\n const template = ctx.documentManager.findTemplateAtOffset(\n params.textDocument.uri,\n positionToOffset(doc.getText(), params.position),\n );\n\n if (!template) {\n return null;\n }\n\n return handlePrepareRename({\n template,\n tsSource: doc.getText(),\n tsPosition: { line: params.position.line, character: params.position.character },\n });\n });\n\n connection.onRenameRequest((params) => {\n if (!registry) {\n return null;\n }\n\n const ctx = registry.resolveForUri(params.textDocument.uri);\n if (!ctx) {\n return null;\n }\n\n const doc = documents.get(params.textDocument.uri);\n if (!doc) {\n return null;\n }\n\n const template = ctx.documentManager.findTemplateAtOffset(\n params.textDocument.uri,\n positionToOffset(doc.getText(), params.position),\n );\n\n if (!template) {\n return null;\n }\n\n return handleRename({\n template,\n tsSource: doc.getText(),\n tsPosition: { line: params.position.line, character: params.position.character },\n newName: params.newName,\n allFragments: ctx.documentManager.getAllFragments(template.schemaName),\n findSpreadLocations: (name) => ctx.documentManager.findFragmentSpreadLocations(name, template.schemaName),\n });\n });\n\n connection.onDocumentSymbol((params) => {\n if (!registry) {\n return [];\n }\n\n const ctx = registry.resolveForUri(params.textDocument.uri);\n if (!ctx) {\n return [];\n }\n\n const state = ctx.documentManager.get(params.textDocument.uri);\n if (!state) {\n return [];\n }\n\n return handleDocumentSymbol({\n templates: state.templates,\n tsSource: state.source,\n });\n });\n\n connection.onDocumentFormatting((params) => {\n if (!registry) {\n return [];\n }\n\n const ctx = registry.resolveForUri(params.textDocument.uri);\n if (!ctx) {\n return [];\n }\n\n const state = ctx.documentManager.get(params.textDocument.uri);\n if (!state) {\n return [];\n }\n\n return handleFormatting({\n templates: state.templates,\n tsSource: state.source,\n });\n });\n\n connection.onCodeAction((params) => {\n if (!registry) {\n return [];\n }\n\n const ctx = registry.resolveForUri(params.textDocument.uri);\n if (!ctx) {\n return [];\n }\n\n const doc = documents.get(params.textDocument.uri);\n if (!doc) {\n return [];\n }\n\n const template = ctx.documentManager.findTemplateAtOffset(\n params.textDocument.uri,\n positionToOffset(doc.getText(), params.range.start),\n );\n\n if (!template) {\n return [];\n }\n\n const entry = ctx.schemaResolver.getSchema(template.schemaName);\n if (!entry) {\n return [];\n }\n\n return handleCodeAction({\n template,\n schema: entry.schema,\n tsSource: doc.getText(),\n uri: params.textDocument.uri,\n selectionRange: {\n start: { line: params.range.start.line, character: params.range.start.character },\n end: { line: params.range.end.line, character: params.range.end.character },\n },\n });\n });\n\n connection.onDidChangeWatchedFiles((_params) => {\n if (!registry) {\n return;\n }\n\n // Check if any .graphql files changed\n const graphqlChanged = _params.changes.some(\n (change) =>\n change.uri.endsWith(\".graphql\") && (change.type === FileChangeType.Changed || change.type === FileChangeType.Created),\n );\n\n if (graphqlChanged) {\n const result = registry.reloadAllSchemas();\n publishDiagnosticsForAllOpen();\n if (result.isErr()) {\n for (const error of result.error) {\n connection.window.showErrorMessage(`soda-gql LSP: schema reload failed: ${error.message}`);\n }\n }\n }\n\n // Notify user to restart when config file changes\n const configChanged = _params.changes.some(\n (change) =>\n /soda-gql\\.config\\.[cm]?[jt]s$/.test(change.uri) &&\n (change.type === FileChangeType.Changed || change.type === FileChangeType.Created),\n );\n if (configChanged) {\n connection.window.showInformationMessage(\"soda-gql: config file changed. Restart the language server to apply.\");\n }\n });\n\n documents.listen(connection);\n\n return {\n start: () => {\n connection.listen();\n },\n initializeResult,\n };\n};\n\n/** One-time SWC unavailable notification state. */\nexport type SwcNotificationState = { shown: boolean };\n\n/** Check if SWC is unavailable and show a one-time error notification. */\nexport const checkSwcUnavailable = (\n swcUnavailable: boolean | undefined,\n state: SwcNotificationState,\n showError: (message: string) => void,\n): void => {\n if (swcUnavailable && !state.shown) {\n state.shown = true;\n showError(`soda-gql LSP: ${lspErrors.swcResolutionFailed().message}`);\n }\n};\n\n/** Extract workspace root paths from LSP initialize params. */\nconst resolveWorkspaceRoots = (params: InitializeParams): string[] => {\n if (params.workspaceFolders && params.workspaceFolders.length > 0) {\n return params.workspaceFolders.map((f) => (f.uri.startsWith(\"file://\") ? fileURLToPath(f.uri) : f.uri));\n }\n const rootUri = params.rootUri ?? params.rootPath;\n if (rootUri) {\n return [rootUri.startsWith(\"file://\") ? fileURLToPath(rootUri) : rootUri];\n }\n return [];\n};\n\n/** Discover config files across multiple workspace roots (deduplicated). */\nconst discoverConfigs = (roots: string[]): string[] => {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const root of roots) {\n const fromRoot = findAllConfigFiles(root);\n if (fromRoot.length > 0) {\n for (const p of fromRoot) {\n if (!seen.has(p)) {\n seen.add(p);\n result.push(p);\n }\n }\n } else {\n // Per-root fallback: walk up from this root if findAllConfigFiles found nothing\n const single = findConfigFile(root);\n if (single && !seen.has(single)) {\n seen.add(single);\n result.push(single);\n }\n }\n }\n return result;\n};\n\n/** Convert LSP Position to byte offset in source text. */\nconst positionToOffset = (source: string, position: { line: number; character: number }): number => {\n let line = 0;\n let offset = 0;\n while (line < position.line && offset < source.length) {\n if (source.charCodeAt(offset) === 10) {\n line++;\n }\n offset++;\n }\n return offset + position.character;\n};\n"],"x_google_ignoreList":[5],"mappings":"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"}