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

resolve interpolated parsed fragments (#105)

Changed files
+32
.changeset
packages
graphqlsp
src
+5
.changeset/fresh-grapes-melt.md
···
+
---
+
'@0no-co/graphqlsp': patch
+
---
+
+
Resolve parsed AST nodes being interpolated into an operation
+27
packages/graphqlsp/src/ast/resolve.ts
···
isAsExpression,
isIdentifier,
isNoSubstitutionTemplateLiteral,
+
isObjectLiteralExpression,
isTaggedTemplateExpression,
TaggedTemplateExpression,
} from 'typescript';
+
import { print } from 'graphql';
import ts from 'typescript/lib/tsserverlibrary';
import { findNode } from '.';
import { getSource } from '../ast';
···
},
};
addedCharacters += text.combinedText.length - originalRange.length;
+
return alteredSpan;
+
} else if (
+
parent.initializer &&
+
isAsExpression(parent.initializer) &&
+
isAsExpression(parent.initializer.expression) &&
+
isObjectLiteralExpression(parent.initializer.expression.expression)
+
) {
+
const astObject = JSON.parse(
+
parent.initializer.expression.expression.getText()
+
);
+
const resolvedTemplate = print(astObject);
+
templateText = templateText.replace(
+
'${' + span.expression.escapedText + '}',
+
resolvedTemplate
+
);
+
const alteredSpan = {
+
lines: resolvedTemplate.split('\n').length,
+
identifier: identifierName,
+
original: originalRange,
+
new: {
+
start: originalRange.start + addedCharacters,
+
length: resolvedTemplate.length,
+
},
+
};
+
addedCharacters += resolvedTemplate.length - originalRange.length;
return alteredSpan;
}