apollo-language-server
Version:
A language server for Apollo GraphQL projects
190 lines • 7.77 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.extractGraphQLDocuments = exports.GraphQLDocument = void 0;
const graphql_1 = require("graphql");
const location_1 = require("graphql/language/location");
const vscode_languageserver_1 = require("vscode-languageserver");
const getDiagnostics_1 = require("@apollographql/graphql-language-service-interface/dist/getDiagnostics");
const source_1 = require("./utilities/source");
class GraphQLDocument {
constructor(source) {
this.source = source;
this.syntaxErrors = [];
try {
this.ast = (0, graphql_1.parse)(source);
}
catch (error) {
if (maybeCommentedOut(source.body))
return;
const range = (0, source_1.rangeInContainingDocument)(source, (0, getDiagnostics_1.getRange)(error.locations[0], source.body));
this.syntaxErrors.push({
severity: vscode_languageserver_1.DiagnosticSeverity.Error,
message: error.message,
source: "GraphQL: Syntax",
range,
});
}
}
containsPosition(position) {
if (position.line < this.source.locationOffset.line - 1)
return false;
const end = (0, source_1.positionFromSourceLocation)(this.source, (0, location_1.getLocation)(this.source, this.source.body.length));
return position.line <= end.line;
}
}
exports.GraphQLDocument = GraphQLDocument;
function extractGraphQLDocuments(document, tagName = "gql") {
switch (document.languageId) {
case "graphql":
return [
new GraphQLDocument(new graphql_1.Source(document.getText(), document.uri)),
];
case "javascript":
case "javascriptreact":
case "typescript":
case "typescriptreact":
case "vue":
return extractGraphQLDocumentsFromJSTemplateLiterals(document, tagName);
case "python":
return extractGraphQLDocumentsFromPythonStrings(document, tagName);
case "ruby":
return extractGraphQLDocumentsFromRubyStrings(document, tagName);
case "dart":
return extractGraphQLDocumentsFromDartStrings(document, tagName);
case "reason":
return extractGraphQLDocumentsFromReasonStrings(document, tagName);
case "elixir":
return extractGraphQLDocumentsFromElixirStrings(document, tagName);
default:
return null;
}
}
exports.extractGraphQLDocuments = extractGraphQLDocuments;
function extractGraphQLDocumentsFromJSTemplateLiterals(document, tagName) {
const text = document.getText();
const documents = [];
const regExp = new RegExp(`${tagName}\\s*\`([\\s\\S]+?)\``, "gm");
let result;
while ((result = regExp.exec(text)) !== null) {
const contents = replacePlaceholdersWithWhiteSpace(result[1]);
const position = document.positionAt(result.index + (tagName.length + 1));
const locationOffset = {
line: position.line + 1,
column: position.character + 1,
};
const source = new graphql_1.Source(contents, document.uri, locationOffset);
documents.push(new GraphQLDocument(source));
}
if (documents.length < 1)
return null;
return documents;
}
function extractGraphQLDocumentsFromPythonStrings(document, tagName) {
const text = document.getText();
const documents = [];
const regExp = new RegExp(`\\b(${tagName}\\s*\\(\\s*[bfru]*("(?:"")?|'(?:'')?))([\\s\\S]+?)\\2\\s*\\)`, "gm");
let result;
while ((result = regExp.exec(text)) !== null) {
const contents = replacePlaceholdersWithWhiteSpace(result[3]);
const position = document.positionAt(result.index + result[1].length);
const locationOffset = {
line: position.line + 1,
column: position.character + 1,
};
const source = new graphql_1.Source(contents, document.uri, locationOffset);
documents.push(new GraphQLDocument(source));
}
if (documents.length < 1)
return null;
return documents;
}
function extractGraphQLDocumentsFromRubyStrings(document, tagName) {
const text = document.getText();
const documents = [];
const regExp = new RegExp(`(<<-${tagName})([\\s\\S]+?)${tagName}`, "gm");
let result;
while ((result = regExp.exec(text)) !== null) {
const contents = replacePlaceholdersWithWhiteSpace(result[2]);
const position = document.positionAt(result.index + result[1].length);
const locationOffset = {
line: position.line + 1,
column: position.character + 1,
};
const source = new graphql_1.Source(contents, document.uri, locationOffset);
documents.push(new GraphQLDocument(source));
}
if (documents.length < 1)
return null;
return documents;
}
function extractGraphQLDocumentsFromDartStrings(document, tagName) {
const text = document.getText();
const documents = [];
const regExp = new RegExp(`\\b(${tagName}\\(\\s*r?("""|'''))([\\s\\S]+?)\\2\\s*\\)`, "gm");
let result;
while ((result = regExp.exec(text)) !== null) {
const contents = replacePlaceholdersWithWhiteSpace(result[3]);
const position = document.positionAt(result.index + result[1].length);
const locationOffset = {
line: position.line + 1,
column: position.character + 1,
};
const source = new graphql_1.Source(contents, document.uri, locationOffset);
documents.push(new GraphQLDocument(source));
}
if (documents.length < 1)
return null;
return documents;
}
function extractGraphQLDocumentsFromReasonStrings(document, tagName) {
const text = document.getText();
const documents = [];
const reasonFileFilter = new RegExp(/(\[%(graphql|relay\.))/g);
if (!reasonFileFilter.test(text)) {
return documents;
}
const reasonRegexp = new RegExp(/(?<=\[%(graphql|relay\.\w*)[\s\S]*{\|)[.\s\S]+?(?=\|})/gm);
let result;
while ((result = reasonRegexp.exec(text)) !== null) {
const contents = result[0];
const position = document.positionAt(result.index);
const locationOffset = {
line: position.line + 1,
column: position.character + 1,
};
const source = new graphql_1.Source(contents, document.uri, locationOffset);
documents.push(new GraphQLDocument(source));
}
if (documents.length < 1)
return null;
return documents;
}
function extractGraphQLDocumentsFromElixirStrings(document, tagName) {
const text = document.getText();
const documents = [];
const regExp = new RegExp(`\\b(${tagName}\\(\\s*r?("""))([\\s\\S]+?)\\2\\s*\\)`, "gm");
let result;
while ((result = regExp.exec(text)) !== null) {
const contents = replacePlaceholdersWithWhiteSpace(result[3]);
const position = document.positionAt(result.index + result[1].length);
const locationOffset = {
line: position.line + 1,
column: position.character + 1,
};
const source = new graphql_1.Source(contents, document.uri, locationOffset);
documents.push(new GraphQLDocument(source));
}
if (documents.length < 1)
return null;
return documents;
}
function replacePlaceholdersWithWhiteSpace(content) {
return content.replace(/\$\{([\s\S]+?)\}/gm, (match) => {
return Array(match.length).join(" ");
});
}
function maybeCommentedOut(content) {
return ((content.indexOf("/*") > -1 && content.indexOf("*/") > -1) ||
content.split("//").length > 1);
}
//# sourceMappingURL=document.js.map
;