@graphql-tools/import 6.4.1

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.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ Check API Reference for more information about this package;
2
+ https://www.graphql-tools.com/docs/api/modules/import
3
+
4
+ You can also learn more about GraphQL Import in this chapter;
5
+ https://www.graphql-tools.com/docs/schema-loading#using-import-expression
package/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { DefinitionNode, DocumentNode } from 'graphql';
2
+ export declare type VisitedFilesMap = Map<string, Map<string, Set<DefinitionNode>>>;
3
+ export declare function processImport(filePath: string, cwd?: string, predefinedImports?: Record<string, string>, visitedFiles?: VisitedFilesMap): DocumentNode;
4
+ export declare function parseImportLine(importLine: string): {
5
+ imports: string[];
6
+ from: string;
7
+ };
package/index.js ADDED
@@ -0,0 +1,560 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
+
7
+ const graphql = require('graphql');
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+ const resolveFrom = _interopDefault(require('resolve-from'));
11
+ const process = require('process');
12
+
13
+ /* eslint-disable no-unused-expressions */
14
+ const builtinTypes = ['String', 'Float', 'Int', 'Boolean', 'ID', 'Upload'];
15
+ const builtinDirectives = [
16
+ 'deprecated',
17
+ 'skip',
18
+ 'include',
19
+ 'cacheControl',
20
+ 'key',
21
+ 'external',
22
+ 'requires',
23
+ 'provides',
24
+ 'connection',
25
+ 'client',
26
+ 'specifiedBy',
27
+ ];
28
+ const IMPORT_FROM_REGEX = /^import\s+(\*|(.*))\s+from\s+('|")(.*)('|");?$/;
29
+ const IMPORT_DEFAULT_REGEX = /^import\s+('|")(.*)('|");?$/;
30
+ function processImport(filePath, cwd = process.cwd(), predefinedImports = {}, visitedFiles = new Map()) {
31
+ const set = visitFile(filePath, path.join(cwd + '/root.graphql'), visitedFiles, predefinedImports);
32
+ const definitionStrSet = new Set();
33
+ let definitionsStr = '';
34
+ if (set != null) {
35
+ for (const defs of set.values()) {
36
+ for (const def of defs) {
37
+ const defStr = graphql.print(def);
38
+ if (!definitionStrSet.has(defStr)) {
39
+ definitionStrSet.add(defStr);
40
+ definitionsStr += defStr + '\n';
41
+ }
42
+ }
43
+ }
44
+ }
45
+ return (definitionsStr === null || definitionsStr === void 0 ? void 0 : definitionsStr.length)
46
+ ? graphql.parse(new graphql.Source(definitionsStr, filePath))
47
+ : {
48
+ kind: graphql.Kind.DOCUMENT,
49
+ definitions: [],
50
+ };
51
+ }
52
+ function visitFile(filePath, cwd, visitedFiles, predefinedImports) {
53
+ var _a;
54
+ if (!path.isAbsolute(filePath) && !(filePath in predefinedImports)) {
55
+ filePath = resolveFilePath(cwd, filePath);
56
+ }
57
+ if (!visitedFiles.has(filePath)) {
58
+ const fileContent = filePath in predefinedImports ? predefinedImports[filePath] : fs.readFileSync(filePath, 'utf8');
59
+ const importLines = [];
60
+ let otherLines = '';
61
+ for (const line of fileContent.split('\n')) {
62
+ const trimmedLine = line.trim();
63
+ if (trimmedLine.startsWith('#import ') || trimmedLine.startsWith('# import ')) {
64
+ importLines.push(trimmedLine);
65
+ }
66
+ else if (trimmedLine) {
67
+ otherLines += line + '\n';
68
+ }
69
+ }
70
+ const definitionsByName = new Map();
71
+ const dependenciesByDefinitionName = new Map();
72
+ if (otherLines) {
73
+ const fileDefinitionMap = new Map();
74
+ // To prevent circular dependency
75
+ visitedFiles.set(filePath, fileDefinitionMap);
76
+ const document = graphql.parse(new graphql.Source(otherLines, filePath), {
77
+ noLocation: true,
78
+ });
79
+ for (const definition of document.definitions) {
80
+ if ('name' in definition || definition.kind === graphql.Kind.SCHEMA_DEFINITION) {
81
+ const definitionName = 'name' in definition && definition.name ? definition.name.value : 'schema';
82
+ if (!definitionsByName.has(definitionName)) {
83
+ definitionsByName.set(definitionName, new Set());
84
+ }
85
+ const definitionsSet = definitionsByName.get(definitionName);
86
+ definitionsSet === null || definitionsSet === void 0 ? void 0 : definitionsSet.add(definition);
87
+ let dependencySet = dependenciesByDefinitionName.get(definitionName);
88
+ if (!dependencySet) {
89
+ dependencySet = new Set();
90
+ dependenciesByDefinitionName.set(definitionName, dependencySet);
91
+ }
92
+ switch (definition.kind) {
93
+ case graphql.Kind.OPERATION_DEFINITION:
94
+ visitOperationDefinitionNode(definition, dependencySet);
95
+ break;
96
+ case graphql.Kind.FRAGMENT_DEFINITION:
97
+ visitFragmentDefinitionNode(definition, dependencySet);
98
+ break;
99
+ case graphql.Kind.OBJECT_TYPE_DEFINITION:
100
+ visitObjectTypeDefinitionNode(definition, dependencySet, dependenciesByDefinitionName);
101
+ break;
102
+ case graphql.Kind.INTERFACE_TYPE_DEFINITION:
103
+ visitInterfaceTypeDefinitionNode(definition, dependencySet, dependenciesByDefinitionName);
104
+ break;
105
+ case graphql.Kind.UNION_TYPE_DEFINITION:
106
+ visitUnionTypeDefinitionNode(definition, dependencySet);
107
+ break;
108
+ case graphql.Kind.ENUM_TYPE_DEFINITION:
109
+ visitEnumTypeDefinitionNode(definition, dependencySet);
110
+ break;
111
+ case graphql.Kind.INPUT_OBJECT_TYPE_DEFINITION:
112
+ visitInputObjectTypeDefinitionNode(definition, dependencySet);
113
+ break;
114
+ case graphql.Kind.DIRECTIVE_DEFINITION:
115
+ visitDirectiveDefinitionNode(definition, dependencySet);
116
+ break;
117
+ case graphql.Kind.SCALAR_TYPE_DEFINITION:
118
+ visitScalarDefinitionNode(definition, dependencySet);
119
+ break;
120
+ case graphql.Kind.SCHEMA_DEFINITION:
121
+ visitSchemaDefinitionNode(definition, dependencySet);
122
+ break;
123
+ case graphql.Kind.OBJECT_TYPE_EXTENSION:
124
+ visitObjectTypeExtensionNode(definition, dependencySet, dependenciesByDefinitionName);
125
+ break;
126
+ case graphql.Kind.INTERFACE_TYPE_EXTENSION:
127
+ visitInterfaceTypeExtensionNode(definition, dependencySet, dependenciesByDefinitionName);
128
+ break;
129
+ case graphql.Kind.UNION_TYPE_EXTENSION:
130
+ visitUnionTypeExtensionNode(definition, dependencySet);
131
+ break;
132
+ case graphql.Kind.ENUM_TYPE_EXTENSION:
133
+ visitEnumTypeExtensionNode(definition, dependencySet);
134
+ break;
135
+ case graphql.Kind.INPUT_OBJECT_TYPE_EXTENSION:
136
+ visitInputObjectTypeExtensionNode(definition, dependencySet);
137
+ break;
138
+ case graphql.Kind.SCALAR_TYPE_EXTENSION:
139
+ visitScalarExtensionNode(definition, dependencySet);
140
+ break;
141
+ }
142
+ if ('fields' in definition && definition.fields) {
143
+ for (const field of definition.fields) {
144
+ const definitionName = definition.name.value + '.' + field.name.value;
145
+ if (!definitionsByName.has(definitionName)) {
146
+ definitionsByName.set(definitionName, new Set());
147
+ }
148
+ (_a = definitionsByName.get(definitionName)) === null || _a === void 0 ? void 0 : _a.add({
149
+ ...definition,
150
+ fields: [field],
151
+ });
152
+ let dependencySet = dependenciesByDefinitionName.get(definitionName);
153
+ if (!dependencySet) {
154
+ dependencySet = new Set();
155
+ dependenciesByDefinitionName.set(definitionName, dependencySet);
156
+ }
157
+ switch (field.kind) {
158
+ case graphql.Kind.FIELD_DEFINITION:
159
+ visitFieldDefinitionNode(field, dependencySet);
160
+ break;
161
+ case graphql.Kind.INPUT_VALUE_DEFINITION:
162
+ visitInputValueDefinitionNode(field, dependencySet);
163
+ break;
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+ for (const [definitionName, definitions] of definitionsByName) {
170
+ let definitionsWithDependencies = fileDefinitionMap.get(definitionName);
171
+ if (definitionsWithDependencies == null) {
172
+ definitionsWithDependencies = new Set();
173
+ fileDefinitionMap.set(definitionName, definitionsWithDependencies);
174
+ }
175
+ for (const definition of definitions) {
176
+ definitionsWithDependencies.add(definition);
177
+ }
178
+ const dependenciesOfDefinition = dependenciesByDefinitionName.get(definitionName);
179
+ if (dependenciesOfDefinition) {
180
+ for (const dependencyName of dependenciesOfDefinition) {
181
+ const dependencyDefinitions = definitionsByName.get(dependencyName);
182
+ if (dependencyDefinitions != null) {
183
+ for (const dependencyDefinition of dependencyDefinitions) {
184
+ definitionsWithDependencies.add(dependencyDefinition);
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }
191
+ const potentialTransitiveDefinitionsMap = new Map();
192
+ const allImportedDefinitionsMap = new Map();
193
+ for (const line of importLines) {
194
+ const { imports, from } = parseImportLine(line.replace('#', '').trim());
195
+ const importFileDefinitionMap = visitFile(from, filePath, visitedFiles, predefinedImports);
196
+ if (importFileDefinitionMap != null) {
197
+ const buildFullDefinitionMap = (dependenciesMap) => {
198
+ for (const [importedDefinitionName, importedDefinitions] of importFileDefinitionMap) {
199
+ const [importedDefinitionTypeName] = importedDefinitionName.split('.');
200
+ if (!dependenciesMap.has(importedDefinitionTypeName)) {
201
+ dependenciesMap.set(importedDefinitionTypeName, new Set());
202
+ }
203
+ const allImportedDefinitions = dependenciesMap.get(importedDefinitionTypeName);
204
+ if (allImportedDefinitions) {
205
+ for (const importedDefinition of importedDefinitions) {
206
+ allImportedDefinitions.add(importedDefinition);
207
+ }
208
+ }
209
+ }
210
+ };
211
+ buildFullDefinitionMap(potentialTransitiveDefinitionsMap);
212
+ if (imports.includes('*')) {
213
+ buildFullDefinitionMap(allImportedDefinitionsMap);
214
+ }
215
+ else {
216
+ for (let importedDefinitionName of imports) {
217
+ if (importedDefinitionName.endsWith('.*')) {
218
+ // Adding whole type means the same thing with adding every single field
219
+ importedDefinitionName = importedDefinitionName.replace('.*', '');
220
+ }
221
+ const [importedDefinitionTypeName] = importedDefinitionName.split('.');
222
+ if (!allImportedDefinitionsMap.has(importedDefinitionTypeName)) {
223
+ allImportedDefinitionsMap.set(importedDefinitionTypeName, new Set());
224
+ }
225
+ const allImportedDefinitions = allImportedDefinitionsMap.get(importedDefinitionTypeName);
226
+ const importedDefinitions = importFileDefinitionMap.get(importedDefinitionName);
227
+ if (!importedDefinitions) {
228
+ throw new Error(`${importedDefinitionName} is not exported by ${from} imported by ${filePath}`);
229
+ }
230
+ if (allImportedDefinitions != null) {
231
+ for (const importedDefinition of importedDefinitions) {
232
+ allImportedDefinitions.add(importedDefinition);
233
+ }
234
+ }
235
+ }
236
+ }
237
+ }
238
+ }
239
+ if (!otherLines) {
240
+ visitedFiles.set(filePath, allImportedDefinitionsMap);
241
+ }
242
+ else {
243
+ const fileDefinitionMap = visitedFiles.get(filePath);
244
+ if (fileDefinitionMap) {
245
+ const addDefinition = (definition, definitionName, definitionSet) => {
246
+ if (!definitionSet.has(definition)) {
247
+ definitionSet.add(definition);
248
+ // Regenerate field exports if some fields are imported after visitor
249
+ if ('fields' in definition && definition.fields) {
250
+ for (const field of definition.fields) {
251
+ const fieldName = field.name.value;
252
+ const fieldDefinitionName = definition.name.value + '.' + fieldName;
253
+ const allImportedDefinitions = allImportedDefinitionsMap.get(definitionName);
254
+ allImportedDefinitions === null || allImportedDefinitions === void 0 ? void 0 : allImportedDefinitions.forEach(importedDefinition => {
255
+ if (!fileDefinitionMap.has(fieldDefinitionName)) {
256
+ fileDefinitionMap.set(fieldDefinitionName, new Set());
257
+ }
258
+ const definitionsWithDeps = fileDefinitionMap.get(fieldDefinitionName);
259
+ if (definitionsWithDeps) {
260
+ addDefinition(importedDefinition, fieldDefinitionName, definitionsWithDeps);
261
+ }
262
+ });
263
+ const newDependencySet = new Set();
264
+ switch (field.kind) {
265
+ case graphql.Kind.FIELD_DEFINITION:
266
+ visitFieldDefinitionNode(field, newDependencySet);
267
+ break;
268
+ case graphql.Kind.INPUT_VALUE_DEFINITION:
269
+ visitInputValueDefinitionNode(field, newDependencySet);
270
+ break;
271
+ }
272
+ newDependencySet.forEach(dependencyName => {
273
+ const definitionsInCurrentFile = fileDefinitionMap.get(dependencyName);
274
+ definitionsInCurrentFile === null || definitionsInCurrentFile === void 0 ? void 0 : definitionsInCurrentFile.forEach(def => addDefinition(def, definitionName, definitionSet));
275
+ const definitionsFromImports = allImportedDefinitionsMap.get(dependencyName);
276
+ definitionsFromImports === null || definitionsFromImports === void 0 ? void 0 : definitionsFromImports.forEach(def => addDefinition(def, definitionName, definitionSet));
277
+ const transitiveDependencies = potentialTransitiveDefinitionsMap.get(dependencyName);
278
+ transitiveDependencies === null || transitiveDependencies === void 0 ? void 0 : transitiveDependencies.forEach(def => addDefinition(def, definitionName, definitionSet));
279
+ });
280
+ }
281
+ }
282
+ }
283
+ };
284
+ for (const [definitionName] of definitionsByName) {
285
+ const definitionsWithDependencies = fileDefinitionMap.get(definitionName);
286
+ if (definitionsWithDependencies) {
287
+ const allImportedDefinitions = allImportedDefinitionsMap.get(definitionName);
288
+ allImportedDefinitions === null || allImportedDefinitions === void 0 ? void 0 : allImportedDefinitions.forEach(importedDefinition => {
289
+ addDefinition(importedDefinition, definitionName, definitionsWithDependencies);
290
+ });
291
+ const dependenciesOfDefinition = dependenciesByDefinitionName.get(definitionName);
292
+ if (dependenciesOfDefinition) {
293
+ for (const dependencyName of dependenciesOfDefinition) {
294
+ // If that dependency cannot be found both in imports and this file, throw an error
295
+ if (!allImportedDefinitionsMap.has(dependencyName) && !definitionsByName.has(dependencyName)) {
296
+ throw new Error(`Couldn't find type ${dependencyName} in any of the schemas.`);
297
+ }
298
+ const dependencyDefinitionsFromImports = allImportedDefinitionsMap.get(dependencyName);
299
+ dependencyDefinitionsFromImports === null || dependencyDefinitionsFromImports === void 0 ? void 0 : dependencyDefinitionsFromImports.forEach(dependencyDefinition => {
300
+ addDefinition(dependencyDefinition, definitionName, definitionsWithDependencies);
301
+ });
302
+ }
303
+ }
304
+ }
305
+ }
306
+ }
307
+ }
308
+ }
309
+ return visitedFiles.get(filePath);
310
+ }
311
+ function parseImportLine(importLine) {
312
+ let regexMatch = importLine.match(IMPORT_FROM_REGEX);
313
+ if (regexMatch != null) {
314
+ // Apply regex to import line
315
+ // Extract matches into named variables
316
+ const [, wildcard, importsString, , from] = regexMatch;
317
+ if (from) {
318
+ // Extract imported types
319
+ const imports = wildcard === '*' ? ['*'] : importsString.split(',').map(d => d.trim());
320
+ // Return information about the import line
321
+ return { imports, from };
322
+ }
323
+ }
324
+ regexMatch = importLine.match(IMPORT_DEFAULT_REGEX);
325
+ if (regexMatch != null) {
326
+ const [, , from] = regexMatch;
327
+ if (from) {
328
+ return { imports: ['*'], from };
329
+ }
330
+ }
331
+ throw new Error(`
332
+ Import statement is not valid:
333
+ > ${importLine}
334
+ If you want to have comments starting with '# import', please use ''' instead!
335
+ You can only have 'import' statements in the following pattern;
336
+ # import [Type].[Field] from [File]
337
+ `);
338
+ }
339
+ function resolveFilePath(filePath, importFrom) {
340
+ const dirName = path.dirname(filePath);
341
+ try {
342
+ const fullPath = path.join(dirName, importFrom);
343
+ return fs.realpathSync(fullPath);
344
+ }
345
+ catch (e) {
346
+ if (e.code === 'ENOENT') {
347
+ return resolveFrom(dirName, importFrom);
348
+ }
349
+ throw e;
350
+ }
351
+ }
352
+ function visitOperationDefinitionNode(node, dependencySet) {
353
+ var _a;
354
+ if ((_a = node.name) === null || _a === void 0 ? void 0 : _a.value) {
355
+ dependencySet.add(node.name.value);
356
+ }
357
+ node.selectionSet.selections.forEach(selectionNode => visitSelectionNode(selectionNode, dependencySet));
358
+ }
359
+ function visitSelectionNode(node, dependencySet) {
360
+ switch (node.kind) {
361
+ case graphql.Kind.FIELD:
362
+ visitFieldNode(node, dependencySet);
363
+ break;
364
+ case graphql.Kind.FRAGMENT_SPREAD:
365
+ visitFragmentSpreadNode(node, dependencySet);
366
+ break;
367
+ case graphql.Kind.INLINE_FRAGMENT:
368
+ visitInlineFragmentNode(node, dependencySet);
369
+ break;
370
+ }
371
+ }
372
+ function visitFieldNode(node, dependencySet) {
373
+ var _a;
374
+ (_a = node.selectionSet) === null || _a === void 0 ? void 0 : _a.selections.forEach(selectionNode => visitSelectionNode(selectionNode, dependencySet));
375
+ }
376
+ function visitFragmentSpreadNode(node, dependencySet) {
377
+ dependencySet.add(node.name.value);
378
+ }
379
+ function visitInlineFragmentNode(node, dependencySet) {
380
+ node.selectionSet.selections.forEach(selectionNode => visitSelectionNode(selectionNode, dependencySet));
381
+ }
382
+ function visitFragmentDefinitionNode(node, dependencySet) {
383
+ dependencySet.add(node.name.value);
384
+ node.selectionSet.selections.forEach(selectionNode => visitSelectionNode(selectionNode, dependencySet));
385
+ }
386
+ function visitObjectTypeDefinitionNode(node, dependencySet, dependenciesByDefinitionName) {
387
+ var _a, _b, _c;
388
+ const typeName = node.name.value;
389
+ dependencySet.add(typeName);
390
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
391
+ (_b = node.fields) === null || _b === void 0 ? void 0 : _b.forEach(fieldDefinitionNode => visitFieldDefinitionNode(fieldDefinitionNode, dependencySet));
392
+ (_c = node.interfaces) === null || _c === void 0 ? void 0 : _c.forEach(namedTypeNode => {
393
+ visitNamedTypeNode(namedTypeNode, dependencySet);
394
+ const interfaceName = namedTypeNode.name.value;
395
+ let set = dependenciesByDefinitionName.get(interfaceName);
396
+ // interface should be dependent to the type as well
397
+ if (set == null) {
398
+ set = new Set();
399
+ dependenciesByDefinitionName.set(interfaceName, set);
400
+ }
401
+ set.add(typeName);
402
+ });
403
+ }
404
+ function visitDirectiveNode(node, dependencySet) {
405
+ const directiveName = node.name.value;
406
+ if (!builtinDirectives.includes(directiveName)) {
407
+ dependencySet.add(node.name.value);
408
+ }
409
+ }
410
+ function visitFieldDefinitionNode(node, dependencySet, dependenciesByDefinitionName) {
411
+ var _a, _b;
412
+ (_a = node.arguments) === null || _a === void 0 ? void 0 : _a.forEach(inputValueDefinitionNode => visitInputValueDefinitionNode(inputValueDefinitionNode, dependencySet));
413
+ (_b = node.directives) === null || _b === void 0 ? void 0 : _b.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
414
+ visitTypeNode(node.type, dependencySet);
415
+ }
416
+ function visitTypeNode(node, dependencySet, dependenciesByDefinitionName) {
417
+ switch (node.kind) {
418
+ case graphql.Kind.LIST_TYPE:
419
+ visitListTypeNode(node, dependencySet);
420
+ break;
421
+ case graphql.Kind.NON_NULL_TYPE:
422
+ visitNonNullTypeNode(node, dependencySet);
423
+ break;
424
+ case graphql.Kind.NAMED_TYPE:
425
+ visitNamedTypeNode(node, dependencySet);
426
+ break;
427
+ }
428
+ }
429
+ function visitListTypeNode(node, dependencySet, dependenciesByDefinitionName) {
430
+ visitTypeNode(node.type, dependencySet);
431
+ }
432
+ function visitNonNullTypeNode(node, dependencySet, dependenciesByDefinitionName) {
433
+ visitTypeNode(node.type, dependencySet);
434
+ }
435
+ function visitNamedTypeNode(node, dependencySet) {
436
+ const namedTypeName = node.name.value;
437
+ if (!builtinTypes.includes(namedTypeName)) {
438
+ dependencySet.add(node.name.value);
439
+ }
440
+ }
441
+ function visitInputValueDefinitionNode(node, dependencySet, dependenciesByDefinitionName) {
442
+ var _a;
443
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
444
+ visitTypeNode(node.type, dependencySet);
445
+ }
446
+ function visitInterfaceTypeDefinitionNode(node, dependencySet, dependenciesByDefinitionName) {
447
+ var _a, _b, _c;
448
+ const typeName = node.name.value;
449
+ dependencySet.add(typeName);
450
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
451
+ (_b = node.fields) === null || _b === void 0 ? void 0 : _b.forEach(fieldDefinitionNode => visitFieldDefinitionNode(fieldDefinitionNode, dependencySet));
452
+ (_c = node.interfaces) === null || _c === void 0 ? void 0 : _c.forEach((namedTypeNode) => {
453
+ visitNamedTypeNode(namedTypeNode, dependencySet);
454
+ const interfaceName = namedTypeNode.name.value;
455
+ let set = dependenciesByDefinitionName.get(interfaceName);
456
+ // interface should be dependent to the type as well
457
+ if (set == null) {
458
+ set = new Set();
459
+ dependenciesByDefinitionName.set(interfaceName, set);
460
+ }
461
+ set.add(typeName);
462
+ });
463
+ }
464
+ function visitUnionTypeDefinitionNode(node, dependencySet) {
465
+ var _a, _b;
466
+ dependencySet.add(node.name.value);
467
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
468
+ (_b = node.types) === null || _b === void 0 ? void 0 : _b.forEach(namedTypeNode => visitNamedTypeNode(namedTypeNode, dependencySet));
469
+ }
470
+ function visitEnumTypeDefinitionNode(node, dependencySet) {
471
+ var _a;
472
+ dependencySet.add(node.name.value);
473
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
474
+ }
475
+ function visitInputObjectTypeDefinitionNode(node, dependencySet, dependenciesByDefinitionName) {
476
+ var _a, _b;
477
+ dependencySet.add(node.name.value);
478
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
479
+ (_b = node.fields) === null || _b === void 0 ? void 0 : _b.forEach(inputValueDefinitionNode => visitInputValueDefinitionNode(inputValueDefinitionNode, dependencySet));
480
+ }
481
+ function visitDirectiveDefinitionNode(node, dependencySet, dependenciesByDefinitionName) {
482
+ var _a;
483
+ dependencySet.add(node.name.value);
484
+ (_a = node.arguments) === null || _a === void 0 ? void 0 : _a.forEach(inputValueDefinitionNode => visitInputValueDefinitionNode(inputValueDefinitionNode, dependencySet));
485
+ }
486
+ function visitObjectTypeExtensionNode(node, dependencySet, dependenciesByDefinitionName) {
487
+ var _a, _b, _c;
488
+ const typeName = node.name.value;
489
+ dependencySet.add(typeName);
490
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
491
+ (_b = node.fields) === null || _b === void 0 ? void 0 : _b.forEach(fieldDefinitionNode => visitFieldDefinitionNode(fieldDefinitionNode, dependencySet));
492
+ (_c = node.interfaces) === null || _c === void 0 ? void 0 : _c.forEach(namedTypeNode => {
493
+ visitNamedTypeNode(namedTypeNode, dependencySet);
494
+ const interfaceName = namedTypeNode.name.value;
495
+ let set = dependenciesByDefinitionName.get(interfaceName);
496
+ // interface should be dependent to the type as well
497
+ if (set == null) {
498
+ set = new Set();
499
+ dependenciesByDefinitionName.set(interfaceName, set);
500
+ }
501
+ set.add(typeName);
502
+ });
503
+ }
504
+ function visitInterfaceTypeExtensionNode(node, dependencySet, dependenciesByDefinitionName) {
505
+ var _a, _b, _c;
506
+ const typeName = node.name.value;
507
+ dependencySet.add(typeName);
508
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
509
+ (_b = node.fields) === null || _b === void 0 ? void 0 : _b.forEach(fieldDefinitionNode => visitFieldDefinitionNode(fieldDefinitionNode, dependencySet));
510
+ (_c = node.interfaces) === null || _c === void 0 ? void 0 : _c.forEach((namedTypeNode) => {
511
+ visitNamedTypeNode(namedTypeNode, dependencySet);
512
+ const interfaceName = namedTypeNode.name.value;
513
+ let set = dependenciesByDefinitionName.get(interfaceName);
514
+ // interface should be dependent to the type as well
515
+ if (set == null) {
516
+ set = new Set();
517
+ dependenciesByDefinitionName.set(interfaceName, set);
518
+ }
519
+ set.add(typeName);
520
+ });
521
+ }
522
+ function visitUnionTypeExtensionNode(node, dependencySet) {
523
+ var _a, _b;
524
+ dependencySet.add(node.name.value);
525
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
526
+ (_b = node.types) === null || _b === void 0 ? void 0 : _b.forEach(namedTypeNode => visitNamedTypeNode(namedTypeNode, dependencySet));
527
+ }
528
+ function visitEnumTypeExtensionNode(node, dependencySet) {
529
+ var _a;
530
+ dependencySet.add(node.name.value);
531
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
532
+ }
533
+ function visitInputObjectTypeExtensionNode(node, dependencySet, dependenciesByDefinitionName) {
534
+ var _a, _b;
535
+ dependencySet.add(node.name.value);
536
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
537
+ (_b = node.fields) === null || _b === void 0 ? void 0 : _b.forEach(inputValueDefinitionNode => visitInputValueDefinitionNode(inputValueDefinitionNode, dependencySet));
538
+ }
539
+ function visitSchemaDefinitionNode(node, dependencySet) {
540
+ var _a;
541
+ dependencySet.add('schema');
542
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
543
+ node.operationTypes.forEach(operationTypeDefinitionNode => visitOperationTypeDefinitionNode(operationTypeDefinitionNode, dependencySet));
544
+ }
545
+ function visitScalarDefinitionNode(node, dependencySet) {
546
+ var _a;
547
+ dependencySet.add(node.name.value);
548
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
549
+ }
550
+ function visitScalarExtensionNode(node, dependencySet) {
551
+ var _a;
552
+ dependencySet.add(node.name.value);
553
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
554
+ }
555
+ function visitOperationTypeDefinitionNode(node, dependencySet) {
556
+ visitNamedTypeNode(node.type, dependencySet);
557
+ }
558
+
559
+ exports.parseImportLine = parseImportLine;
560
+ exports.processImport = processImport;
package/index.mjs ADDED
@@ -0,0 +1,553 @@
1
+ import { print, parse, Source, Kind } from 'graphql';
2
+ import { readFileSync, realpathSync } from 'fs';
3
+ import { join, isAbsolute, dirname } from 'path';
4
+ import resolveFrom from 'resolve-from';
5
+ import { cwd } from 'process';
6
+
7
+ /* eslint-disable no-unused-expressions */
8
+ const builtinTypes = ['String', 'Float', 'Int', 'Boolean', 'ID', 'Upload'];
9
+ const builtinDirectives = [
10
+ 'deprecated',
11
+ 'skip',
12
+ 'include',
13
+ 'cacheControl',
14
+ 'key',
15
+ 'external',
16
+ 'requires',
17
+ 'provides',
18
+ 'connection',
19
+ 'client',
20
+ 'specifiedBy',
21
+ ];
22
+ const IMPORT_FROM_REGEX = /^import\s+(\*|(.*))\s+from\s+('|")(.*)('|");?$/;
23
+ const IMPORT_DEFAULT_REGEX = /^import\s+('|")(.*)('|");?$/;
24
+ function processImport(filePath, cwd$1 = cwd(), predefinedImports = {}, visitedFiles = new Map()) {
25
+ const set = visitFile(filePath, join(cwd$1 + '/root.graphql'), visitedFiles, predefinedImports);
26
+ const definitionStrSet = new Set();
27
+ let definitionsStr = '';
28
+ if (set != null) {
29
+ for (const defs of set.values()) {
30
+ for (const def of defs) {
31
+ const defStr = print(def);
32
+ if (!definitionStrSet.has(defStr)) {
33
+ definitionStrSet.add(defStr);
34
+ definitionsStr += defStr + '\n';
35
+ }
36
+ }
37
+ }
38
+ }
39
+ return (definitionsStr === null || definitionsStr === void 0 ? void 0 : definitionsStr.length)
40
+ ? parse(new Source(definitionsStr, filePath))
41
+ : {
42
+ kind: Kind.DOCUMENT,
43
+ definitions: [],
44
+ };
45
+ }
46
+ function visitFile(filePath, cwd, visitedFiles, predefinedImports) {
47
+ var _a;
48
+ if (!isAbsolute(filePath) && !(filePath in predefinedImports)) {
49
+ filePath = resolveFilePath(cwd, filePath);
50
+ }
51
+ if (!visitedFiles.has(filePath)) {
52
+ const fileContent = filePath in predefinedImports ? predefinedImports[filePath] : readFileSync(filePath, 'utf8');
53
+ const importLines = [];
54
+ let otherLines = '';
55
+ for (const line of fileContent.split('\n')) {
56
+ const trimmedLine = line.trim();
57
+ if (trimmedLine.startsWith('#import ') || trimmedLine.startsWith('# import ')) {
58
+ importLines.push(trimmedLine);
59
+ }
60
+ else if (trimmedLine) {
61
+ otherLines += line + '\n';
62
+ }
63
+ }
64
+ const definitionsByName = new Map();
65
+ const dependenciesByDefinitionName = new Map();
66
+ if (otherLines) {
67
+ const fileDefinitionMap = new Map();
68
+ // To prevent circular dependency
69
+ visitedFiles.set(filePath, fileDefinitionMap);
70
+ const document = parse(new Source(otherLines, filePath), {
71
+ noLocation: true,
72
+ });
73
+ for (const definition of document.definitions) {
74
+ if ('name' in definition || definition.kind === Kind.SCHEMA_DEFINITION) {
75
+ const definitionName = 'name' in definition && definition.name ? definition.name.value : 'schema';
76
+ if (!definitionsByName.has(definitionName)) {
77
+ definitionsByName.set(definitionName, new Set());
78
+ }
79
+ const definitionsSet = definitionsByName.get(definitionName);
80
+ definitionsSet === null || definitionsSet === void 0 ? void 0 : definitionsSet.add(definition);
81
+ let dependencySet = dependenciesByDefinitionName.get(definitionName);
82
+ if (!dependencySet) {
83
+ dependencySet = new Set();
84
+ dependenciesByDefinitionName.set(definitionName, dependencySet);
85
+ }
86
+ switch (definition.kind) {
87
+ case Kind.OPERATION_DEFINITION:
88
+ visitOperationDefinitionNode(definition, dependencySet);
89
+ break;
90
+ case Kind.FRAGMENT_DEFINITION:
91
+ visitFragmentDefinitionNode(definition, dependencySet);
92
+ break;
93
+ case Kind.OBJECT_TYPE_DEFINITION:
94
+ visitObjectTypeDefinitionNode(definition, dependencySet, dependenciesByDefinitionName);
95
+ break;
96
+ case Kind.INTERFACE_TYPE_DEFINITION:
97
+ visitInterfaceTypeDefinitionNode(definition, dependencySet, dependenciesByDefinitionName);
98
+ break;
99
+ case Kind.UNION_TYPE_DEFINITION:
100
+ visitUnionTypeDefinitionNode(definition, dependencySet);
101
+ break;
102
+ case Kind.ENUM_TYPE_DEFINITION:
103
+ visitEnumTypeDefinitionNode(definition, dependencySet);
104
+ break;
105
+ case Kind.INPUT_OBJECT_TYPE_DEFINITION:
106
+ visitInputObjectTypeDefinitionNode(definition, dependencySet);
107
+ break;
108
+ case Kind.DIRECTIVE_DEFINITION:
109
+ visitDirectiveDefinitionNode(definition, dependencySet);
110
+ break;
111
+ case Kind.SCALAR_TYPE_DEFINITION:
112
+ visitScalarDefinitionNode(definition, dependencySet);
113
+ break;
114
+ case Kind.SCHEMA_DEFINITION:
115
+ visitSchemaDefinitionNode(definition, dependencySet);
116
+ break;
117
+ case Kind.OBJECT_TYPE_EXTENSION:
118
+ visitObjectTypeExtensionNode(definition, dependencySet, dependenciesByDefinitionName);
119
+ break;
120
+ case Kind.INTERFACE_TYPE_EXTENSION:
121
+ visitInterfaceTypeExtensionNode(definition, dependencySet, dependenciesByDefinitionName);
122
+ break;
123
+ case Kind.UNION_TYPE_EXTENSION:
124
+ visitUnionTypeExtensionNode(definition, dependencySet);
125
+ break;
126
+ case Kind.ENUM_TYPE_EXTENSION:
127
+ visitEnumTypeExtensionNode(definition, dependencySet);
128
+ break;
129
+ case Kind.INPUT_OBJECT_TYPE_EXTENSION:
130
+ visitInputObjectTypeExtensionNode(definition, dependencySet);
131
+ break;
132
+ case Kind.SCALAR_TYPE_EXTENSION:
133
+ visitScalarExtensionNode(definition, dependencySet);
134
+ break;
135
+ }
136
+ if ('fields' in definition && definition.fields) {
137
+ for (const field of definition.fields) {
138
+ const definitionName = definition.name.value + '.' + field.name.value;
139
+ if (!definitionsByName.has(definitionName)) {
140
+ definitionsByName.set(definitionName, new Set());
141
+ }
142
+ (_a = definitionsByName.get(definitionName)) === null || _a === void 0 ? void 0 : _a.add({
143
+ ...definition,
144
+ fields: [field],
145
+ });
146
+ let dependencySet = dependenciesByDefinitionName.get(definitionName);
147
+ if (!dependencySet) {
148
+ dependencySet = new Set();
149
+ dependenciesByDefinitionName.set(definitionName, dependencySet);
150
+ }
151
+ switch (field.kind) {
152
+ case Kind.FIELD_DEFINITION:
153
+ visitFieldDefinitionNode(field, dependencySet);
154
+ break;
155
+ case Kind.INPUT_VALUE_DEFINITION:
156
+ visitInputValueDefinitionNode(field, dependencySet);
157
+ break;
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+ for (const [definitionName, definitions] of definitionsByName) {
164
+ let definitionsWithDependencies = fileDefinitionMap.get(definitionName);
165
+ if (definitionsWithDependencies == null) {
166
+ definitionsWithDependencies = new Set();
167
+ fileDefinitionMap.set(definitionName, definitionsWithDependencies);
168
+ }
169
+ for (const definition of definitions) {
170
+ definitionsWithDependencies.add(definition);
171
+ }
172
+ const dependenciesOfDefinition = dependenciesByDefinitionName.get(definitionName);
173
+ if (dependenciesOfDefinition) {
174
+ for (const dependencyName of dependenciesOfDefinition) {
175
+ const dependencyDefinitions = definitionsByName.get(dependencyName);
176
+ if (dependencyDefinitions != null) {
177
+ for (const dependencyDefinition of dependencyDefinitions) {
178
+ definitionsWithDependencies.add(dependencyDefinition);
179
+ }
180
+ }
181
+ }
182
+ }
183
+ }
184
+ }
185
+ const potentialTransitiveDefinitionsMap = new Map();
186
+ const allImportedDefinitionsMap = new Map();
187
+ for (const line of importLines) {
188
+ const { imports, from } = parseImportLine(line.replace('#', '').trim());
189
+ const importFileDefinitionMap = visitFile(from, filePath, visitedFiles, predefinedImports);
190
+ if (importFileDefinitionMap != null) {
191
+ const buildFullDefinitionMap = (dependenciesMap) => {
192
+ for (const [importedDefinitionName, importedDefinitions] of importFileDefinitionMap) {
193
+ const [importedDefinitionTypeName] = importedDefinitionName.split('.');
194
+ if (!dependenciesMap.has(importedDefinitionTypeName)) {
195
+ dependenciesMap.set(importedDefinitionTypeName, new Set());
196
+ }
197
+ const allImportedDefinitions = dependenciesMap.get(importedDefinitionTypeName);
198
+ if (allImportedDefinitions) {
199
+ for (const importedDefinition of importedDefinitions) {
200
+ allImportedDefinitions.add(importedDefinition);
201
+ }
202
+ }
203
+ }
204
+ };
205
+ buildFullDefinitionMap(potentialTransitiveDefinitionsMap);
206
+ if (imports.includes('*')) {
207
+ buildFullDefinitionMap(allImportedDefinitionsMap);
208
+ }
209
+ else {
210
+ for (let importedDefinitionName of imports) {
211
+ if (importedDefinitionName.endsWith('.*')) {
212
+ // Adding whole type means the same thing with adding every single field
213
+ importedDefinitionName = importedDefinitionName.replace('.*', '');
214
+ }
215
+ const [importedDefinitionTypeName] = importedDefinitionName.split('.');
216
+ if (!allImportedDefinitionsMap.has(importedDefinitionTypeName)) {
217
+ allImportedDefinitionsMap.set(importedDefinitionTypeName, new Set());
218
+ }
219
+ const allImportedDefinitions = allImportedDefinitionsMap.get(importedDefinitionTypeName);
220
+ const importedDefinitions = importFileDefinitionMap.get(importedDefinitionName);
221
+ if (!importedDefinitions) {
222
+ throw new Error(`${importedDefinitionName} is not exported by ${from} imported by ${filePath}`);
223
+ }
224
+ if (allImportedDefinitions != null) {
225
+ for (const importedDefinition of importedDefinitions) {
226
+ allImportedDefinitions.add(importedDefinition);
227
+ }
228
+ }
229
+ }
230
+ }
231
+ }
232
+ }
233
+ if (!otherLines) {
234
+ visitedFiles.set(filePath, allImportedDefinitionsMap);
235
+ }
236
+ else {
237
+ const fileDefinitionMap = visitedFiles.get(filePath);
238
+ if (fileDefinitionMap) {
239
+ const addDefinition = (definition, definitionName, definitionSet) => {
240
+ if (!definitionSet.has(definition)) {
241
+ definitionSet.add(definition);
242
+ // Regenerate field exports if some fields are imported after visitor
243
+ if ('fields' in definition && definition.fields) {
244
+ for (const field of definition.fields) {
245
+ const fieldName = field.name.value;
246
+ const fieldDefinitionName = definition.name.value + '.' + fieldName;
247
+ const allImportedDefinitions = allImportedDefinitionsMap.get(definitionName);
248
+ allImportedDefinitions === null || allImportedDefinitions === void 0 ? void 0 : allImportedDefinitions.forEach(importedDefinition => {
249
+ if (!fileDefinitionMap.has(fieldDefinitionName)) {
250
+ fileDefinitionMap.set(fieldDefinitionName, new Set());
251
+ }
252
+ const definitionsWithDeps = fileDefinitionMap.get(fieldDefinitionName);
253
+ if (definitionsWithDeps) {
254
+ addDefinition(importedDefinition, fieldDefinitionName, definitionsWithDeps);
255
+ }
256
+ });
257
+ const newDependencySet = new Set();
258
+ switch (field.kind) {
259
+ case Kind.FIELD_DEFINITION:
260
+ visitFieldDefinitionNode(field, newDependencySet);
261
+ break;
262
+ case Kind.INPUT_VALUE_DEFINITION:
263
+ visitInputValueDefinitionNode(field, newDependencySet);
264
+ break;
265
+ }
266
+ newDependencySet.forEach(dependencyName => {
267
+ const definitionsInCurrentFile = fileDefinitionMap.get(dependencyName);
268
+ definitionsInCurrentFile === null || definitionsInCurrentFile === void 0 ? void 0 : definitionsInCurrentFile.forEach(def => addDefinition(def, definitionName, definitionSet));
269
+ const definitionsFromImports = allImportedDefinitionsMap.get(dependencyName);
270
+ definitionsFromImports === null || definitionsFromImports === void 0 ? void 0 : definitionsFromImports.forEach(def => addDefinition(def, definitionName, definitionSet));
271
+ const transitiveDependencies = potentialTransitiveDefinitionsMap.get(dependencyName);
272
+ transitiveDependencies === null || transitiveDependencies === void 0 ? void 0 : transitiveDependencies.forEach(def => addDefinition(def, definitionName, definitionSet));
273
+ });
274
+ }
275
+ }
276
+ }
277
+ };
278
+ for (const [definitionName] of definitionsByName) {
279
+ const definitionsWithDependencies = fileDefinitionMap.get(definitionName);
280
+ if (definitionsWithDependencies) {
281
+ const allImportedDefinitions = allImportedDefinitionsMap.get(definitionName);
282
+ allImportedDefinitions === null || allImportedDefinitions === void 0 ? void 0 : allImportedDefinitions.forEach(importedDefinition => {
283
+ addDefinition(importedDefinition, definitionName, definitionsWithDependencies);
284
+ });
285
+ const dependenciesOfDefinition = dependenciesByDefinitionName.get(definitionName);
286
+ if (dependenciesOfDefinition) {
287
+ for (const dependencyName of dependenciesOfDefinition) {
288
+ // If that dependency cannot be found both in imports and this file, throw an error
289
+ if (!allImportedDefinitionsMap.has(dependencyName) && !definitionsByName.has(dependencyName)) {
290
+ throw new Error(`Couldn't find type ${dependencyName} in any of the schemas.`);
291
+ }
292
+ const dependencyDefinitionsFromImports = allImportedDefinitionsMap.get(dependencyName);
293
+ dependencyDefinitionsFromImports === null || dependencyDefinitionsFromImports === void 0 ? void 0 : dependencyDefinitionsFromImports.forEach(dependencyDefinition => {
294
+ addDefinition(dependencyDefinition, definitionName, definitionsWithDependencies);
295
+ });
296
+ }
297
+ }
298
+ }
299
+ }
300
+ }
301
+ }
302
+ }
303
+ return visitedFiles.get(filePath);
304
+ }
305
+ function parseImportLine(importLine) {
306
+ let regexMatch = importLine.match(IMPORT_FROM_REGEX);
307
+ if (regexMatch != null) {
308
+ // Apply regex to import line
309
+ // Extract matches into named variables
310
+ const [, wildcard, importsString, , from] = regexMatch;
311
+ if (from) {
312
+ // Extract imported types
313
+ const imports = wildcard === '*' ? ['*'] : importsString.split(',').map(d => d.trim());
314
+ // Return information about the import line
315
+ return { imports, from };
316
+ }
317
+ }
318
+ regexMatch = importLine.match(IMPORT_DEFAULT_REGEX);
319
+ if (regexMatch != null) {
320
+ const [, , from] = regexMatch;
321
+ if (from) {
322
+ return { imports: ['*'], from };
323
+ }
324
+ }
325
+ throw new Error(`
326
+ Import statement is not valid:
327
+ > ${importLine}
328
+ If you want to have comments starting with '# import', please use ''' instead!
329
+ You can only have 'import' statements in the following pattern;
330
+ # import [Type].[Field] from [File]
331
+ `);
332
+ }
333
+ function resolveFilePath(filePath, importFrom) {
334
+ const dirName = dirname(filePath);
335
+ try {
336
+ const fullPath = join(dirName, importFrom);
337
+ return realpathSync(fullPath);
338
+ }
339
+ catch (e) {
340
+ if (e.code === 'ENOENT') {
341
+ return resolveFrom(dirName, importFrom);
342
+ }
343
+ throw e;
344
+ }
345
+ }
346
+ function visitOperationDefinitionNode(node, dependencySet) {
347
+ var _a;
348
+ if ((_a = node.name) === null || _a === void 0 ? void 0 : _a.value) {
349
+ dependencySet.add(node.name.value);
350
+ }
351
+ node.selectionSet.selections.forEach(selectionNode => visitSelectionNode(selectionNode, dependencySet));
352
+ }
353
+ function visitSelectionNode(node, dependencySet) {
354
+ switch (node.kind) {
355
+ case Kind.FIELD:
356
+ visitFieldNode(node, dependencySet);
357
+ break;
358
+ case Kind.FRAGMENT_SPREAD:
359
+ visitFragmentSpreadNode(node, dependencySet);
360
+ break;
361
+ case Kind.INLINE_FRAGMENT:
362
+ visitInlineFragmentNode(node, dependencySet);
363
+ break;
364
+ }
365
+ }
366
+ function visitFieldNode(node, dependencySet) {
367
+ var _a;
368
+ (_a = node.selectionSet) === null || _a === void 0 ? void 0 : _a.selections.forEach(selectionNode => visitSelectionNode(selectionNode, dependencySet));
369
+ }
370
+ function visitFragmentSpreadNode(node, dependencySet) {
371
+ dependencySet.add(node.name.value);
372
+ }
373
+ function visitInlineFragmentNode(node, dependencySet) {
374
+ node.selectionSet.selections.forEach(selectionNode => visitSelectionNode(selectionNode, dependencySet));
375
+ }
376
+ function visitFragmentDefinitionNode(node, dependencySet) {
377
+ dependencySet.add(node.name.value);
378
+ node.selectionSet.selections.forEach(selectionNode => visitSelectionNode(selectionNode, dependencySet));
379
+ }
380
+ function visitObjectTypeDefinitionNode(node, dependencySet, dependenciesByDefinitionName) {
381
+ var _a, _b, _c;
382
+ const typeName = node.name.value;
383
+ dependencySet.add(typeName);
384
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
385
+ (_b = node.fields) === null || _b === void 0 ? void 0 : _b.forEach(fieldDefinitionNode => visitFieldDefinitionNode(fieldDefinitionNode, dependencySet));
386
+ (_c = node.interfaces) === null || _c === void 0 ? void 0 : _c.forEach(namedTypeNode => {
387
+ visitNamedTypeNode(namedTypeNode, dependencySet);
388
+ const interfaceName = namedTypeNode.name.value;
389
+ let set = dependenciesByDefinitionName.get(interfaceName);
390
+ // interface should be dependent to the type as well
391
+ if (set == null) {
392
+ set = new Set();
393
+ dependenciesByDefinitionName.set(interfaceName, set);
394
+ }
395
+ set.add(typeName);
396
+ });
397
+ }
398
+ function visitDirectiveNode(node, dependencySet) {
399
+ const directiveName = node.name.value;
400
+ if (!builtinDirectives.includes(directiveName)) {
401
+ dependencySet.add(node.name.value);
402
+ }
403
+ }
404
+ function visitFieldDefinitionNode(node, dependencySet, dependenciesByDefinitionName) {
405
+ var _a, _b;
406
+ (_a = node.arguments) === null || _a === void 0 ? void 0 : _a.forEach(inputValueDefinitionNode => visitInputValueDefinitionNode(inputValueDefinitionNode, dependencySet));
407
+ (_b = node.directives) === null || _b === void 0 ? void 0 : _b.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
408
+ visitTypeNode(node.type, dependencySet);
409
+ }
410
+ function visitTypeNode(node, dependencySet, dependenciesByDefinitionName) {
411
+ switch (node.kind) {
412
+ case Kind.LIST_TYPE:
413
+ visitListTypeNode(node, dependencySet);
414
+ break;
415
+ case Kind.NON_NULL_TYPE:
416
+ visitNonNullTypeNode(node, dependencySet);
417
+ break;
418
+ case Kind.NAMED_TYPE:
419
+ visitNamedTypeNode(node, dependencySet);
420
+ break;
421
+ }
422
+ }
423
+ function visitListTypeNode(node, dependencySet, dependenciesByDefinitionName) {
424
+ visitTypeNode(node.type, dependencySet);
425
+ }
426
+ function visitNonNullTypeNode(node, dependencySet, dependenciesByDefinitionName) {
427
+ visitTypeNode(node.type, dependencySet);
428
+ }
429
+ function visitNamedTypeNode(node, dependencySet) {
430
+ const namedTypeName = node.name.value;
431
+ if (!builtinTypes.includes(namedTypeName)) {
432
+ dependencySet.add(node.name.value);
433
+ }
434
+ }
435
+ function visitInputValueDefinitionNode(node, dependencySet, dependenciesByDefinitionName) {
436
+ var _a;
437
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
438
+ visitTypeNode(node.type, dependencySet);
439
+ }
440
+ function visitInterfaceTypeDefinitionNode(node, dependencySet, dependenciesByDefinitionName) {
441
+ var _a, _b, _c;
442
+ const typeName = node.name.value;
443
+ dependencySet.add(typeName);
444
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
445
+ (_b = node.fields) === null || _b === void 0 ? void 0 : _b.forEach(fieldDefinitionNode => visitFieldDefinitionNode(fieldDefinitionNode, dependencySet));
446
+ (_c = node.interfaces) === null || _c === void 0 ? void 0 : _c.forEach((namedTypeNode) => {
447
+ visitNamedTypeNode(namedTypeNode, dependencySet);
448
+ const interfaceName = namedTypeNode.name.value;
449
+ let set = dependenciesByDefinitionName.get(interfaceName);
450
+ // interface should be dependent to the type as well
451
+ if (set == null) {
452
+ set = new Set();
453
+ dependenciesByDefinitionName.set(interfaceName, set);
454
+ }
455
+ set.add(typeName);
456
+ });
457
+ }
458
+ function visitUnionTypeDefinitionNode(node, dependencySet) {
459
+ var _a, _b;
460
+ dependencySet.add(node.name.value);
461
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
462
+ (_b = node.types) === null || _b === void 0 ? void 0 : _b.forEach(namedTypeNode => visitNamedTypeNode(namedTypeNode, dependencySet));
463
+ }
464
+ function visitEnumTypeDefinitionNode(node, dependencySet) {
465
+ var _a;
466
+ dependencySet.add(node.name.value);
467
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
468
+ }
469
+ function visitInputObjectTypeDefinitionNode(node, dependencySet, dependenciesByDefinitionName) {
470
+ var _a, _b;
471
+ dependencySet.add(node.name.value);
472
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
473
+ (_b = node.fields) === null || _b === void 0 ? void 0 : _b.forEach(inputValueDefinitionNode => visitInputValueDefinitionNode(inputValueDefinitionNode, dependencySet));
474
+ }
475
+ function visitDirectiveDefinitionNode(node, dependencySet, dependenciesByDefinitionName) {
476
+ var _a;
477
+ dependencySet.add(node.name.value);
478
+ (_a = node.arguments) === null || _a === void 0 ? void 0 : _a.forEach(inputValueDefinitionNode => visitInputValueDefinitionNode(inputValueDefinitionNode, dependencySet));
479
+ }
480
+ function visitObjectTypeExtensionNode(node, dependencySet, dependenciesByDefinitionName) {
481
+ var _a, _b, _c;
482
+ const typeName = node.name.value;
483
+ dependencySet.add(typeName);
484
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
485
+ (_b = node.fields) === null || _b === void 0 ? void 0 : _b.forEach(fieldDefinitionNode => visitFieldDefinitionNode(fieldDefinitionNode, dependencySet));
486
+ (_c = node.interfaces) === null || _c === void 0 ? void 0 : _c.forEach(namedTypeNode => {
487
+ visitNamedTypeNode(namedTypeNode, dependencySet);
488
+ const interfaceName = namedTypeNode.name.value;
489
+ let set = dependenciesByDefinitionName.get(interfaceName);
490
+ // interface should be dependent to the type as well
491
+ if (set == null) {
492
+ set = new Set();
493
+ dependenciesByDefinitionName.set(interfaceName, set);
494
+ }
495
+ set.add(typeName);
496
+ });
497
+ }
498
+ function visitInterfaceTypeExtensionNode(node, dependencySet, dependenciesByDefinitionName) {
499
+ var _a, _b, _c;
500
+ const typeName = node.name.value;
501
+ dependencySet.add(typeName);
502
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
503
+ (_b = node.fields) === null || _b === void 0 ? void 0 : _b.forEach(fieldDefinitionNode => visitFieldDefinitionNode(fieldDefinitionNode, dependencySet));
504
+ (_c = node.interfaces) === null || _c === void 0 ? void 0 : _c.forEach((namedTypeNode) => {
505
+ visitNamedTypeNode(namedTypeNode, dependencySet);
506
+ const interfaceName = namedTypeNode.name.value;
507
+ let set = dependenciesByDefinitionName.get(interfaceName);
508
+ // interface should be dependent to the type as well
509
+ if (set == null) {
510
+ set = new Set();
511
+ dependenciesByDefinitionName.set(interfaceName, set);
512
+ }
513
+ set.add(typeName);
514
+ });
515
+ }
516
+ function visitUnionTypeExtensionNode(node, dependencySet) {
517
+ var _a, _b;
518
+ dependencySet.add(node.name.value);
519
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
520
+ (_b = node.types) === null || _b === void 0 ? void 0 : _b.forEach(namedTypeNode => visitNamedTypeNode(namedTypeNode, dependencySet));
521
+ }
522
+ function visitEnumTypeExtensionNode(node, dependencySet) {
523
+ var _a;
524
+ dependencySet.add(node.name.value);
525
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
526
+ }
527
+ function visitInputObjectTypeExtensionNode(node, dependencySet, dependenciesByDefinitionName) {
528
+ var _a, _b;
529
+ dependencySet.add(node.name.value);
530
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
531
+ (_b = node.fields) === null || _b === void 0 ? void 0 : _b.forEach(inputValueDefinitionNode => visitInputValueDefinitionNode(inputValueDefinitionNode, dependencySet));
532
+ }
533
+ function visitSchemaDefinitionNode(node, dependencySet) {
534
+ var _a;
535
+ dependencySet.add('schema');
536
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
537
+ node.operationTypes.forEach(operationTypeDefinitionNode => visitOperationTypeDefinitionNode(operationTypeDefinitionNode, dependencySet));
538
+ }
539
+ function visitScalarDefinitionNode(node, dependencySet) {
540
+ var _a;
541
+ dependencySet.add(node.name.value);
542
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
543
+ }
544
+ function visitScalarExtensionNode(node, dependencySet) {
545
+ var _a;
546
+ dependencySet.add(node.name.value);
547
+ (_a = node.directives) === null || _a === void 0 ? void 0 : _a.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
548
+ }
549
+ function visitOperationTypeDefinitionNode(node, dependencySet) {
550
+ visitNamedTypeNode(node.type, dependencySet);
551
+ }
552
+
553
+ export { parseImportLine, processImport };
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@graphql-tools/import",
3
+ "version": "6.4.1",
4
+ "description": "A set of utils for faster development of GraphQL tools",
5
+ "sideEffects": false,
6
+ "peerDependencies": {
7
+ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
8
+ },
9
+ "dependencies": {
10
+ "resolve-from": "5.0.0",
11
+ "tslib": "~2.3.0"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "ardatan/graphql-tools",
16
+ "directory": "packages/import"
17
+ },
18
+ "author": "Dotan Simha <dotansimha@gmail.com>",
19
+ "license": "MIT",
20
+ "main": "index.js",
21
+ "module": "index.mjs",
22
+ "typings": "index.d.ts",
23
+ "typescript": {
24
+ "definition": "index.d.ts"
25
+ },
26
+ "exports": {
27
+ ".": {
28
+ "require": "./index.js",
29
+ "import": "./index.mjs"
30
+ },
31
+ "./*": {
32
+ "require": "./*.js",
33
+ "import": "./*.mjs"
34
+ }
35
+ }
36
+ }