1 | import CodeMirror from 'codemirror';
|
2 | import { list, t, onlineParser, opt, p, } from 'graphql-language-service';
|
3 | CodeMirror.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 | });
|
23 | function 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 | }
|
32 | const 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 | };
|
38 | const 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 | };
|
74 | function 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 |
|
\ | No newline at end of file |