UNPKG

7.74 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.extractGraphQLDocuments = exports.GraphQLDocument = void 0;
4const graphql_1 = require("graphql");
5const location_1 = require("graphql/language/location");
6const vscode_languageserver_1 = require("vscode-languageserver");
7const getDiagnostics_1 = require("@apollographql/graphql-language-service-interface/dist/getDiagnostics");
8const source_1 = require("./utilities/source");
9class GraphQLDocument {
10 constructor(source) {
11 this.source = source;
12 this.syntaxErrors = [];
13 try {
14 this.ast = graphql_1.parse(source);
15 }
16 catch (error) {
17 if (maybeCommentedOut(source.body))
18 return;
19 const range = source_1.rangeInContainingDocument(source, getDiagnostics_1.getRange(error.locations[0], source.body));
20 this.syntaxErrors.push({
21 severity: vscode_languageserver_1.DiagnosticSeverity.Error,
22 message: error.message,
23 source: "GraphQL: Syntax",
24 range
25 });
26 }
27 }
28 containsPosition(position) {
29 if (position.line < this.source.locationOffset.line - 1)
30 return false;
31 const end = source_1.positionFromSourceLocation(this.source, location_1.getLocation(this.source, this.source.body.length));
32 return position.line <= end.line;
33 }
34}
35exports.GraphQLDocument = GraphQLDocument;
36function extractGraphQLDocuments(document, tagName = "gql") {
37 switch (document.languageId) {
38 case "graphql":
39 return [
40 new GraphQLDocument(new graphql_1.Source(document.getText(), document.uri))
41 ];
42 case "javascript":
43 case "javascriptreact":
44 case "typescript":
45 case "typescriptreact":
46 case "vue":
47 return extractGraphQLDocumentsFromJSTemplateLiterals(document, tagName);
48 case "python":
49 return extractGraphQLDocumentsFromPythonStrings(document, tagName);
50 case "ruby":
51 return extractGraphQLDocumentsFromRubyStrings(document, tagName);
52 case "dart":
53 return extractGraphQLDocumentsFromDartStrings(document, tagName);
54 case "reason":
55 return extractGraphQLDocumentsFromReasonStrings(document, tagName);
56 case "elixir":
57 return extractGraphQLDocumentsFromElixirStrings(document, tagName);
58 default:
59 return null;
60 }
61}
62exports.extractGraphQLDocuments = extractGraphQLDocuments;
63function extractGraphQLDocumentsFromJSTemplateLiterals(document, tagName) {
64 const text = document.getText();
65 const documents = [];
66 const regExp = new RegExp(`${tagName}\\s*\`([\\s\\S]+?)\``, "gm");
67 let result;
68 while ((result = regExp.exec(text)) !== null) {
69 const contents = replacePlaceholdersWithWhiteSpace(result[1]);
70 const position = document.positionAt(result.index + (tagName.length + 1));
71 const locationOffset = {
72 line: position.line + 1,
73 column: position.character + 1
74 };
75 const source = new graphql_1.Source(contents, document.uri, locationOffset);
76 documents.push(new GraphQLDocument(source));
77 }
78 if (documents.length < 1)
79 return null;
80 return documents;
81}
82function extractGraphQLDocumentsFromPythonStrings(document, tagName) {
83 const text = document.getText();
84 const documents = [];
85 const regExp = new RegExp(`\\b(${tagName}\\s*\\(\\s*[bfru]*("(?:"")?|'(?:'')?))([\\s\\S]+?)\\2\\s*\\)`, "gm");
86 let result;
87 while ((result = regExp.exec(text)) !== null) {
88 const contents = replacePlaceholdersWithWhiteSpace(result[3]);
89 const position = document.positionAt(result.index + result[1].length);
90 const locationOffset = {
91 line: position.line + 1,
92 column: position.character + 1
93 };
94 const source = new graphql_1.Source(contents, document.uri, locationOffset);
95 documents.push(new GraphQLDocument(source));
96 }
97 if (documents.length < 1)
98 return null;
99 return documents;
100}
101function extractGraphQLDocumentsFromRubyStrings(document, tagName) {
102 const text = document.getText();
103 const documents = [];
104 const regExp = new RegExp(`(<<-${tagName})([\\s\\S]+?)${tagName}`, "gm");
105 let result;
106 while ((result = regExp.exec(text)) !== null) {
107 const contents = replacePlaceholdersWithWhiteSpace(result[2]);
108 const position = document.positionAt(result.index + result[1].length);
109 const locationOffset = {
110 line: position.line + 1,
111 column: position.character + 1
112 };
113 const source = new graphql_1.Source(contents, document.uri, locationOffset);
114 documents.push(new GraphQLDocument(source));
115 }
116 if (documents.length < 1)
117 return null;
118 return documents;
119}
120function extractGraphQLDocumentsFromDartStrings(document, tagName) {
121 const text = document.getText();
122 const documents = [];
123 const regExp = new RegExp(`\\b(${tagName}\\(\\s*r?("""|'''))([\\s\\S]+?)\\2\\s*\\)`, "gm");
124 let result;
125 while ((result = regExp.exec(text)) !== null) {
126 const contents = replacePlaceholdersWithWhiteSpace(result[3]);
127 const position = document.positionAt(result.index + result[1].length);
128 const locationOffset = {
129 line: position.line + 1,
130 column: position.character + 1
131 };
132 const source = new graphql_1.Source(contents, document.uri, locationOffset);
133 documents.push(new GraphQLDocument(source));
134 }
135 if (documents.length < 1)
136 return null;
137 return documents;
138}
139function extractGraphQLDocumentsFromReasonStrings(document, tagName) {
140 const text = document.getText();
141 const documents = [];
142 const reasonFileFilter = new RegExp(/(\[%(graphql|relay\.))/g);
143 if (!reasonFileFilter.test(text)) {
144 return documents;
145 }
146 const reasonRegexp = new RegExp(/(?<=\[%(graphql|relay\.\w*)[\s\S]*{\|)[.\s\S]+?(?=\|})/gm);
147 let result;
148 while ((result = reasonRegexp.exec(text)) !== null) {
149 const contents = result[0];
150 const position = document.positionAt(result.index);
151 const locationOffset = {
152 line: position.line + 1,
153 column: position.character + 1
154 };
155 const source = new graphql_1.Source(contents, document.uri, locationOffset);
156 documents.push(new GraphQLDocument(source));
157 }
158 if (documents.length < 1)
159 return null;
160 return documents;
161}
162function extractGraphQLDocumentsFromElixirStrings(document, tagName) {
163 const text = document.getText();
164 const documents = [];
165 const regExp = new RegExp(`\\b(${tagName}\\(\\s*r?("""))([\\s\\S]+?)\\2\\s*\\)`, "gm");
166 let result;
167 while ((result = regExp.exec(text)) !== null) {
168 const contents = replacePlaceholdersWithWhiteSpace(result[3]);
169 const position = document.positionAt(result.index + result[1].length);
170 const locationOffset = {
171 line: position.line + 1,
172 column: position.character + 1
173 };
174 const source = new graphql_1.Source(contents, document.uri, locationOffset);
175 documents.push(new GraphQLDocument(source));
176 }
177 if (documents.length < 1)
178 return null;
179 return documents;
180}
181function replacePlaceholdersWithWhiteSpace(content) {
182 return content.replace(/\$\{([\s\S]+?)\}/gm, match => {
183 return Array(match.length).join(" ");
184 });
185}
186function maybeCommentedOut(content) {
187 return ((content.indexOf("/*") > -1 && content.indexOf("*/") > -1) ||
188 content.split("//").length > 1);
189}
190//# sourceMappingURL=document.js.map
\No newline at end of file