UNPKG

2.81 kBJavaScriptView Raw
1import CodeMirror from 'codemirror';
2import { list, t, onlineParser, opt, p, } from 'graphql-language-service';
3CodeMirror.defineMode('graphql-variables', config => {
4 const parser = onlineParser({
5 eatWhitespace: stream => stream.eatSpace(),
6 lexRules: LexRules,
7 parseRules: ParseRules,
8 editorConfig: { tabSize: config.tabSize },
9 });
10 return {
11 config,
12 startState: parser.startState,
13 token: parser.token,
14 indent,
15 electricInput: /^\s*[}\]]/,
16 fold: 'brace',
17 closeBrackets: {
18 pairs: '[]{}""',
19 explode: '[]{}',
20 },
21 };
22});
23function indent(state, textAfter) {
24 var _a, _b;
25 const levels = state.levels;
26 const level = !levels || levels.length === 0
27 ? state.indentLevel
28 : levels[levels.length - 1] -
29 (((_a = this.electricInput) === null || _a === void 0 ? void 0 : _a.test(textAfter)) ? 1 : 0);
30 return (level || 0) * (((_b = this.config) === null || _b === void 0 ? void 0 : _b.indentUnit) || 0);
31}
32const LexRules = {
33 Punctuation: /^\[|]|\{|\}|:|,/,
34 Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/,
35 String: /^"(?:[^"\\]|\\(?:"|\/|\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*"?/,
36 Keyword: /^true|false|null/,
37};
38const ParseRules = {
39 Document: [p('{'), list('Variable', opt(p(','))), p('}')],
40 Variable: [namedKey('variable'), p(':'), 'Value'],
41 Value(token) {
42 switch (token.kind) {
43 case 'Number':
44 return 'NumberValue';
45 case 'String':
46 return 'StringValue';
47 case 'Punctuation':
48 switch (token.value) {
49 case '[':
50 return 'ListValue';
51 case '{':
52 return 'ObjectValue';
53 }
54 return null;
55 case 'Keyword':
56 switch (token.value) {
57 case 'true':
58 case 'false':
59 return 'BooleanValue';
60 case 'null':
61 return 'NullValue';
62 }
63 return null;
64 }
65 },
66 NumberValue: [t('Number', 'number')],
67 StringValue: [t('String', 'string')],
68 BooleanValue: [t('Keyword', 'builtin')],
69 NullValue: [t('Keyword', 'keyword')],
70 ListValue: [p('['), list('Value', opt(p(','))), p(']')],
71 ObjectValue: [p('{'), list('ObjectField', opt(p(','))), p('}')],
72 ObjectField: [namedKey('attribute'), p(':'), 'Value'],
73};
74function namedKey(style) {
75 return {
76 style,
77 match: (token) => token.kind === 'String',
78 update(state, token) {
79 state.name = token.value.slice(1, -1);
80 },
81 };
82}
83//# sourceMappingURL=mode.js.map
\No newline at end of file