UNPKG

11 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.print = print;
7
8var _visitor = require("./visitor");
9
10var _blockString = require("./blockString");
11
12/**
13 * Converts an AST into a string, using one set of reasonable
14 * formatting rules.
15 */
16function print(ast) {
17 return (0, _visitor.visit)(ast, {
18 leave: printDocASTReducer
19 });
20} // TODO: provide better type coverage in future
21
22
23var printDocASTReducer = {
24 Name: function Name(node) {
25 return node.value;
26 },
27 Variable: function Variable(node) {
28 return '$' + node.name;
29 },
30 // Document
31 Document: function Document(node) {
32 return join(node.definitions, '\n\n') + '\n';
33 },
34 OperationDefinition: function OperationDefinition(node) {
35 var op = node.operation;
36 var name = node.name;
37 var varDefs = wrap('(', join(node.variableDefinitions, ', '), ')');
38 var directives = join(node.directives, ' ');
39 var selectionSet = node.selectionSet; // Anonymous queries with no directives or variable definitions can use
40 // the query short form.
41
42 return !name && !directives && !varDefs && op === 'query' ? selectionSet : join([op, join([name, varDefs]), directives, selectionSet], ' ');
43 },
44 VariableDefinition: function VariableDefinition(_ref) {
45 var variable = _ref.variable,
46 type = _ref.type,
47 defaultValue = _ref.defaultValue,
48 directives = _ref.directives;
49 return variable + ': ' + type + wrap(' = ', defaultValue) + wrap(' ', join(directives, ' '));
50 },
51 SelectionSet: function SelectionSet(_ref2) {
52 var selections = _ref2.selections;
53 return block(selections);
54 },
55 Field: function Field(_ref3) {
56 var alias = _ref3.alias,
57 name = _ref3.name,
58 args = _ref3.arguments,
59 directives = _ref3.directives,
60 selectionSet = _ref3.selectionSet;
61 return join([wrap('', alias, ': ') + name + wrap('(', join(args, ', '), ')'), join(directives, ' '), selectionSet], ' ');
62 },
63 Argument: function Argument(_ref4) {
64 var name = _ref4.name,
65 value = _ref4.value;
66 return name + ': ' + value;
67 },
68 // Fragments
69 FragmentSpread: function FragmentSpread(_ref5) {
70 var name = _ref5.name,
71 directives = _ref5.directives;
72 return '...' + name + wrap(' ', join(directives, ' '));
73 },
74 InlineFragment: function InlineFragment(_ref6) {
75 var typeCondition = _ref6.typeCondition,
76 directives = _ref6.directives,
77 selectionSet = _ref6.selectionSet;
78 return join(['...', wrap('on ', typeCondition), join(directives, ' '), selectionSet], ' ');
79 },
80 FragmentDefinition: function FragmentDefinition(_ref7) {
81 var name = _ref7.name,
82 typeCondition = _ref7.typeCondition,
83 variableDefinitions = _ref7.variableDefinitions,
84 directives = _ref7.directives,
85 selectionSet = _ref7.selectionSet;
86 return (// Note: fragment variable definitions are experimental and may be changed
87 // or removed in the future.
88 "fragment ".concat(name).concat(wrap('(', join(variableDefinitions, ', '), ')'), " ") + "on ".concat(typeCondition, " ").concat(wrap('', join(directives, ' '), ' ')) + selectionSet
89 );
90 },
91 // Value
92 IntValue: function IntValue(_ref8) {
93 var value = _ref8.value;
94 return value;
95 },
96 FloatValue: function FloatValue(_ref9) {
97 var value = _ref9.value;
98 return value;
99 },
100 StringValue: function StringValue(_ref10, key) {
101 var value = _ref10.value,
102 isBlockString = _ref10.block;
103 return isBlockString ? (0, _blockString.printBlockString)(value, key === 'description' ? '' : ' ') : JSON.stringify(value);
104 },
105 BooleanValue: function BooleanValue(_ref11) {
106 var value = _ref11.value;
107 return value ? 'true' : 'false';
108 },
109 NullValue: function NullValue() {
110 return 'null';
111 },
112 EnumValue: function EnumValue(_ref12) {
113 var value = _ref12.value;
114 return value;
115 },
116 ListValue: function ListValue(_ref13) {
117 var values = _ref13.values;
118 return '[' + join(values, ', ') + ']';
119 },
120 ObjectValue: function ObjectValue(_ref14) {
121 var fields = _ref14.fields;
122 return '{' + join(fields, ', ') + '}';
123 },
124 ObjectField: function ObjectField(_ref15) {
125 var name = _ref15.name,
126 value = _ref15.value;
127 return name + ': ' + value;
128 },
129 // Directive
130 Directive: function Directive(_ref16) {
131 var name = _ref16.name,
132 args = _ref16.arguments;
133 return '@' + name + wrap('(', join(args, ', '), ')');
134 },
135 // Type
136 NamedType: function NamedType(_ref17) {
137 var name = _ref17.name;
138 return name;
139 },
140 ListType: function ListType(_ref18) {
141 var type = _ref18.type;
142 return '[' + type + ']';
143 },
144 NonNullType: function NonNullType(_ref19) {
145 var type = _ref19.type;
146 return type + '!';
147 },
148 // Type System Definitions
149 SchemaDefinition: function SchemaDefinition(_ref20) {
150 var directives = _ref20.directives,
151 operationTypes = _ref20.operationTypes;
152 return join(['schema', join(directives, ' '), block(operationTypes)], ' ');
153 },
154 OperationTypeDefinition: function OperationTypeDefinition(_ref21) {
155 var operation = _ref21.operation,
156 type = _ref21.type;
157 return operation + ': ' + type;
158 },
159 ScalarTypeDefinition: addDescription(function (_ref22) {
160 var name = _ref22.name,
161 directives = _ref22.directives;
162 return join(['scalar', name, join(directives, ' ')], ' ');
163 }),
164 ObjectTypeDefinition: addDescription(function (_ref23) {
165 var name = _ref23.name,
166 interfaces = _ref23.interfaces,
167 directives = _ref23.directives,
168 fields = _ref23.fields;
169 return join(['type', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ');
170 }),
171 FieldDefinition: addDescription(function (_ref24) {
172 var name = _ref24.name,
173 args = _ref24.arguments,
174 type = _ref24.type,
175 directives = _ref24.directives;
176 return name + (hasMultilineItems(args) ? wrap('(\n', indent(join(args, '\n')), '\n)') : wrap('(', join(args, ', '), ')')) + ': ' + type + wrap(' ', join(directives, ' '));
177 }),
178 InputValueDefinition: addDescription(function (_ref25) {
179 var name = _ref25.name,
180 type = _ref25.type,
181 defaultValue = _ref25.defaultValue,
182 directives = _ref25.directives;
183 return join([name + ': ' + type, wrap('= ', defaultValue), join(directives, ' ')], ' ');
184 }),
185 InterfaceTypeDefinition: addDescription(function (_ref26) {
186 var name = _ref26.name,
187 directives = _ref26.directives,
188 fields = _ref26.fields;
189 return join(['interface', name, join(directives, ' '), block(fields)], ' ');
190 }),
191 UnionTypeDefinition: addDescription(function (_ref27) {
192 var name = _ref27.name,
193 directives = _ref27.directives,
194 types = _ref27.types;
195 return join(['union', name, join(directives, ' '), types && types.length !== 0 ? '= ' + join(types, ' | ') : ''], ' ');
196 }),
197 EnumTypeDefinition: addDescription(function (_ref28) {
198 var name = _ref28.name,
199 directives = _ref28.directives,
200 values = _ref28.values;
201 return join(['enum', name, join(directives, ' '), block(values)], ' ');
202 }),
203 EnumValueDefinition: addDescription(function (_ref29) {
204 var name = _ref29.name,
205 directives = _ref29.directives;
206 return join([name, join(directives, ' ')], ' ');
207 }),
208 InputObjectTypeDefinition: addDescription(function (_ref30) {
209 var name = _ref30.name,
210 directives = _ref30.directives,
211 fields = _ref30.fields;
212 return join(['input', name, join(directives, ' '), block(fields)], ' ');
213 }),
214 DirectiveDefinition: addDescription(function (_ref31) {
215 var name = _ref31.name,
216 args = _ref31.arguments,
217 repeatable = _ref31.repeatable,
218 locations = _ref31.locations;
219 return 'directive @' + name + (hasMultilineItems(args) ? wrap('(\n', indent(join(args, '\n')), '\n)') : wrap('(', join(args, ', '), ')')) + (repeatable ? ' repeatable' : '') + ' on ' + join(locations, ' | ');
220 }),
221 SchemaExtension: function SchemaExtension(_ref32) {
222 var directives = _ref32.directives,
223 operationTypes = _ref32.operationTypes;
224 return join(['extend schema', join(directives, ' '), block(operationTypes)], ' ');
225 },
226 ScalarTypeExtension: function ScalarTypeExtension(_ref33) {
227 var name = _ref33.name,
228 directives = _ref33.directives;
229 return join(['extend scalar', name, join(directives, ' ')], ' ');
230 },
231 ObjectTypeExtension: function ObjectTypeExtension(_ref34) {
232 var name = _ref34.name,
233 interfaces = _ref34.interfaces,
234 directives = _ref34.directives,
235 fields = _ref34.fields;
236 return join(['extend type', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ');
237 },
238 InterfaceTypeExtension: function InterfaceTypeExtension(_ref35) {
239 var name = _ref35.name,
240 directives = _ref35.directives,
241 fields = _ref35.fields;
242 return join(['extend interface', name, join(directives, ' '), block(fields)], ' ');
243 },
244 UnionTypeExtension: function UnionTypeExtension(_ref36) {
245 var name = _ref36.name,
246 directives = _ref36.directives,
247 types = _ref36.types;
248 return join(['extend union', name, join(directives, ' '), types && types.length !== 0 ? '= ' + join(types, ' | ') : ''], ' ');
249 },
250 EnumTypeExtension: function EnumTypeExtension(_ref37) {
251 var name = _ref37.name,
252 directives = _ref37.directives,
253 values = _ref37.values;
254 return join(['extend enum', name, join(directives, ' '), block(values)], ' ');
255 },
256 InputObjectTypeExtension: function InputObjectTypeExtension(_ref38) {
257 var name = _ref38.name,
258 directives = _ref38.directives,
259 fields = _ref38.fields;
260 return join(['extend input', name, join(directives, ' '), block(fields)], ' ');
261 }
262};
263
264function addDescription(cb) {
265 return function (node) {
266 return join([node.description, cb(node)], '\n');
267 };
268}
269/**
270 * Given maybeArray, print an empty string if it is null or empty, otherwise
271 * print all items together separated by separator if provided
272 */
273
274
275function join(maybeArray, separator) {
276 return maybeArray ? maybeArray.filter(function (x) {
277 return x;
278 }).join(separator || '') : '';
279}
280/**
281 * Given array, print each item on its own line, wrapped in an
282 * indented "{ }" block.
283 */
284
285
286function block(array) {
287 return array && array.length !== 0 ? '{\n' + indent(join(array, '\n')) + '\n}' : '';
288}
289/**
290 * If maybeString is not null or empty, then wrap with start and end, otherwise
291 * print an empty string.
292 */
293
294
295function wrap(start, maybeString, end) {
296 return maybeString ? start + maybeString + (end || '') : '';
297}
298
299function indent(maybeString) {
300 return maybeString && ' ' + maybeString.replace(/\n/g, '\n ');
301}
302
303function isMultiline(string) {
304 return string.indexOf('\n') !== -1;
305}
306
307function hasMultilineItems(maybeArray) {
308 return maybeArray && maybeArray.some(isMultiline);
309}