···
import { createHash } from 'crypto';
import * as checks from './ast/checks';
6
-
import { findAllCallExpressions, findNode, getSource } from './ast';
7
+
findAllCallExpressions,
10
+
unrollTadaFragments,
import { resolveTemplate } from './ast/resolve';
8
-
import { parse, print, visit } from '@0no-co/graphql.web';
14
+
FragmentDefinitionNode,
18
+
} from '@0no-co/graphql.web';
···
const hash = generateHashForDocument(
initializer.arguments[0],
127
+
ts.isArrayLiteralExpression(initializer.arguments[1])
128
+
? initializer.arguments[1]
const existingHash = callExpression.arguments[0];
// We assume for now that this is either undefined or an existing string literal
···
export const generateHashForDocument = (
info: ts.server.PluginCreateInfo,
templateLiteral: ts.StringLiteralLike | ts.TaggedTemplateExpression,
159
-
foundFilename: string
172
+
foundFilename: string,
173
+
referencedFragments: ts.ArrayLiteralExpression | undefined
): string | undefined => {
161
-
const externalSource = getSource(info, foundFilename)!;
162
-
const { fragments } = findAllCallExpressions(externalSource, info);
175
+
if (referencedFragments) {
176
+
const fragments: Array<FragmentDefinitionNode> = [];
177
+
unrollTadaFragments(referencedFragments, fragments, info);
178
+
let text = resolveTemplate(
183
+
fragments.forEach(fragmentDefinition => {
184
+
text = `${text}\n\n${print(fragmentDefinition)}`;
186
+
return createHash('sha256').update(print(parse(text))).digest('hex');
188
+
const externalSource = getSource(info, foundFilename)!;
189
+
const { fragments } = findAllCallExpressions(externalSource, info);
191
+
const text = resolveTemplate(
197
+
const parsed = parse(text);
198
+
const spreads = new Set<string>();
200
+
FragmentSpread: node => {
201
+
spreads.add(node.name.value);
164
-
const text = resolveTemplate(
169
-
const parsed = parse(text);
170
-
const spreads = new Set();
172
-
FragmentSpread: node => {
173
-
spreads.add(node.name.value);
205
+
let resolvedText = text;
206
+
const visited = new Set();
207
+
const traversedSpreads = [...spreads];
177
-
let resolvedText = text;
178
-
[...spreads].forEach(spreadName => {
179
-
const fragmentDefinition = fragments.find(x => x.name.value === spreadName);
180
-
if (!fragmentDefinition) {
181
-
info.project.projectService.logger.info(
182
-
`[GraphQLSP] could not find fragment for spread ${spreadName}!`
209
+
let spreadName: string | undefined;
210
+
while ((spreadName = traversedSpreads.shift())) {
211
+
visited.add(spreadName);
212
+
const fragmentDefinition = fragments.find(
213
+
x => x.name.value === spreadName
215
+
if (!fragmentDefinition) {
216
+
info.project.projectService.logger.info(
217
+
`[GraphQLSP] could not find fragment for spread ${spreadName}!`
222
+
visit(fragmentDefinition, {
223
+
FragmentSpread: node => {
224
+
if (!visited.has(node.name.value))
225
+
traversedSpreads.push(node.name.value);
187
-
resolvedText = `${resolvedText}\n\n${print(fragmentDefinition)}`;
229
+
resolvedText = `${resolvedText}\n\n${print(fragmentDefinition)}`;
190
-
return createHash('sha256').update(resolvedText).digest('hex');
232
+
return createHash('sha256').update(print(parse(resolvedText))).digest('hex');
export const getDocumentReferenceFromTypeQuery = (