| /** |
| * Copyright (c) Facebook, Inc. and its affiliates. |
| * |
| * This source code is licensed under the MIT license found in the |
| * LICENSE file in the root directory of this source tree. |
| */ |
| |
| 'use strict'; |
| |
| const path = require('path'); |
| |
| const utils = require('./utils'); |
| const getLoc = utils.getLoc; |
| const isGraphQLTag = utils.isGraphQLTag; |
| const shouldLint = utils.shouldLint; |
| |
| const graphql = require('graphql'); |
| const parse = graphql.parse; |
| const Source = graphql.Source; |
| |
| module.exports = { |
| meta: { |
| docs: { |
| description: 'Validates the syntax of graphql`...` templates.' |
| } |
| }, |
| create(context) { |
| if (!shouldLint(context)) { |
| return {}; |
| } |
| return { |
| TaggedTemplateExpression(node) { |
| if (!isGraphQLTag(node.tag)) { |
| return; |
| } |
| const quasi = node.quasi.quasis[0]; |
| if (node.quasi.quasis.length !== 1) { |
| context.report({ |
| node: node, |
| message: |
| 'graphql tagged templates do not support ${...} substitutions.' |
| }); |
| return; |
| } |
| try { |
| const filename = path.basename(context.getFilename()); |
| const ast = parse(new Source(quasi.value.cooked, filename)); |
| if (ast.definitions.length !== 1) { |
| context.report({ |
| node: node, |
| message: |
| 'graphql tagged templates can only contain a single definition.' |
| }); |
| } else if (!ast.definitions[0].name) { |
| context.report({ |
| message: 'Operations in graphql tags require a name.', |
| loc: getLoc(context, node, ast.definitions[0]) |
| }); |
| } |
| } catch (error) { |
| context.report({ |
| node: node, |
| message: '{{message}}', |
| data: {message: error.message} |
| }); |
| } |
| } |
| }; |
| } |
| }; |