@neo4j-cypher/react-codemirror 2.0.0-next.4 → 2.0.0-next.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/CHANGELOG.md +370 -0
  2. package/README.md +3 -2
  3. package/dist/src/CypherEditor.d.ts +245 -0
  4. package/dist/src/CypherEditor.js +513 -0
  5. package/dist/src/CypherEditor.js.map +1 -0
  6. package/dist/src/CypherEditor.test.js +162 -0
  7. package/dist/src/CypherEditor.test.js.map +1 -0
  8. package/dist/src/constants.d.ts +1 -0
  9. package/dist/src/constants.js +2 -0
  10. package/dist/src/constants.js.map +1 -0
  11. package/dist/src/diffView.d.ts +13 -0
  12. package/dist/src/diffView.js +11 -0
  13. package/dist/src/diffView.js.map +1 -0
  14. package/dist/src/e2e_tests/autoCompletion.spec.js +334 -0
  15. package/dist/src/e2e_tests/autoCompletion.spec.js.map +1 -0
  16. package/dist/src/e2e_tests/configuration.spec.js +83 -0
  17. package/dist/src/e2e_tests/configuration.spec.js.map +1 -0
  18. package/dist/src/e2e_tests/debounce.spec.js +66 -0
  19. package/dist/src/e2e_tests/debounce.spec.js.map +1 -0
  20. package/dist/{types/e2e_tests/e2e-utils.d.ts → src/e2e_tests/e2eUtils.d.ts} +2 -0
  21. package/dist/src/e2e_tests/e2eUtils.js +79 -0
  22. package/dist/src/e2e_tests/e2eUtils.js.map +1 -0
  23. package/dist/src/e2e_tests/extraKeybindings.spec.js +43 -0
  24. package/dist/src/e2e_tests/extraKeybindings.spec.js.map +1 -0
  25. package/dist/src/e2e_tests/historyNavigation.spec.js +227 -0
  26. package/dist/src/e2e_tests/historyNavigation.spec.js.map +1 -0
  27. package/dist/src/e2e_tests/performanceTest.spec.d.ts +6 -0
  28. package/dist/src/e2e_tests/performanceTest.spec.js +97 -0
  29. package/dist/src/e2e_tests/performanceTest.spec.js.map +1 -0
  30. package/dist/src/e2e_tests/sanityChecks.spec.js +64 -0
  31. package/dist/src/e2e_tests/sanityChecks.spec.js.map +1 -0
  32. package/dist/src/e2e_tests/signatureHelp.spec.js +226 -0
  33. package/dist/src/e2e_tests/signatureHelp.spec.js.map +1 -0
  34. package/dist/src/e2e_tests/snippets.spec.js +14 -0
  35. package/dist/src/e2e_tests/snippets.spec.js.map +1 -0
  36. package/dist/src/e2e_tests/syntaxHighlighting.spec.d.ts +1 -0
  37. package/dist/src/e2e_tests/syntaxHighlighting.spec.js +90 -0
  38. package/dist/src/e2e_tests/syntaxHighlighting.spec.js.map +1 -0
  39. package/dist/src/e2e_tests/syntaxValidation.spec.d.ts +1 -0
  40. package/dist/src/e2e_tests/syntaxValidation.spec.js +129 -0
  41. package/dist/src/e2e_tests/syntaxValidation.spec.js.map +1 -0
  42. package/dist/src/editorActions.d.ts +17 -0
  43. package/dist/src/editorActions.js +259 -0
  44. package/dist/src/editorActions.js.map +1 -0
  45. package/dist/{types/history-navigation.d.ts → src/historyNavigation.d.ts} +1 -1
  46. package/dist/src/historyNavigation.js +163 -0
  47. package/dist/src/historyNavigation.js.map +1 -0
  48. package/dist/src/hostCallbacks.d.ts +9 -0
  49. package/dist/src/hostCallbacks.js +2 -0
  50. package/dist/src/hostCallbacks.js.map +1 -0
  51. package/dist/{types → src}/icons.d.ts +1 -1
  52. package/dist/src/icons.js +62 -0
  53. package/dist/src/icons.js.map +1 -0
  54. package/dist/src/index.d.ts +6 -0
  55. package/dist/src/index.js +5 -0
  56. package/dist/src/index.js.map +1 -0
  57. package/dist/src/inlinePanel.d.ts +27 -0
  58. package/dist/src/inlinePanel.js +86 -0
  59. package/dist/src/inlinePanel.js.map +1 -0
  60. package/dist/src/lang-cypher/autocomplete.d.ts +6 -0
  61. package/dist/src/lang-cypher/autocomplete.js +116 -0
  62. package/dist/src/lang-cypher/autocomplete.js.map +1 -0
  63. package/dist/{types → src}/lang-cypher/constants.d.ts +15 -2
  64. package/dist/src/lang-cypher/constants.js +74 -0
  65. package/dist/src/lang-cypher/constants.js.map +1 -0
  66. package/dist/src/lang-cypher/contants.test.d.ts +1 -0
  67. package/dist/src/lang-cypher/contants.test.js +103 -0
  68. package/dist/src/lang-cypher/contants.test.js.map +1 -0
  69. package/dist/{types/lang-cypher/create-cypher-theme.d.ts → src/lang-cypher/createCypherTheme.d.ts} +14 -3
  70. package/dist/src/lang-cypher/createCypherTheme.js +202 -0
  71. package/dist/src/lang-cypher/createCypherTheme.js.map +1 -0
  72. package/dist/src/lang-cypher/langCypher.d.ts +15 -0
  73. package/dist/src/lang-cypher/langCypher.js +23 -0
  74. package/dist/src/lang-cypher/langCypher.js.map +1 -0
  75. package/dist/src/lang-cypher/lintWorker.mjs +2039 -0
  76. package/dist/src/lang-cypher/parser-adapter.d.ts +21 -0
  77. package/dist/src/lang-cypher/parser-adapter.js +115 -0
  78. package/dist/src/lang-cypher/parser-adapter.js.map +1 -0
  79. package/dist/src/lang-cypher/prism-global.d.ts +1 -0
  80. package/dist/src/lang-cypher/prism-global.js +7 -0
  81. package/dist/src/lang-cypher/prism-global.js.map +1 -0
  82. package/dist/src/lang-cypher/signatureHelp.d.ts +4 -0
  83. package/dist/src/lang-cypher/signatureHelp.js +108 -0
  84. package/dist/src/lang-cypher/signatureHelp.js.map +1 -0
  85. package/dist/src/lang-cypher/syntaxValidation.d.ts +4 -0
  86. package/dist/src/lang-cypher/syntaxValidation.js +65 -0
  87. package/dist/src/lang-cypher/syntaxValidation.js.map +1 -0
  88. package/dist/src/lang-cypher/themeIcons.js +22 -0
  89. package/dist/src/lang-cypher/themeIcons.js.map +1 -0
  90. package/dist/src/lang-cypher/utils.d.ts +2 -0
  91. package/dist/src/lang-cypher/utils.js +10 -0
  92. package/dist/src/lang-cypher/utils.js.map +1 -0
  93. package/dist/src/ndlTokensCopy.d.ts +570 -0
  94. package/dist/src/ndlTokensCopy.js +571 -0
  95. package/dist/src/ndlTokensCopy.js.map +1 -0
  96. package/dist/src/ndlTokensCopy.test.d.ts +1 -0
  97. package/dist/src/ndlTokensCopy.test.js +12 -0
  98. package/dist/src/ndlTokensCopy.test.js.map +1 -0
  99. package/dist/src/neo4jSetup.d.ts +6 -0
  100. package/dist/src/neo4jSetup.js +120 -0
  101. package/dist/src/neo4jSetup.js.map +1 -0
  102. package/dist/src/richClipboardCopier.d.ts +4 -0
  103. package/dist/src/richClipboardCopier.js +78 -0
  104. package/dist/src/richClipboardCopier.js.map +1 -0
  105. package/dist/src/richClipboardCopier.test.d.ts +1 -0
  106. package/dist/src/richClipboardCopier.test.js +53 -0
  107. package/dist/src/richClipboardCopier.test.js.map +1 -0
  108. package/dist/src/themes.d.ts +5 -0
  109. package/dist/src/themes.js +107 -0
  110. package/dist/src/themes.js.map +1 -0
  111. package/dist/tsconfig.tsbuildinfo +1 -0
  112. package/package.json +64 -62
  113. package/src/CypherEditor.test.tsx +211 -0
  114. package/src/CypherEditor.tsx +586 -59
  115. package/src/constants.ts +1 -0
  116. package/src/diffView.ts +24 -0
  117. package/src/e2e_tests/autoCompletion.spec.tsx +576 -0
  118. package/src/e2e_tests/configuration.spec.tsx +111 -0
  119. package/src/e2e_tests/debounce.spec.tsx +102 -0
  120. package/src/e2e_tests/{e2e-utils.ts → e2eUtils.ts} +41 -3
  121. package/src/e2e_tests/{extra-keybindings.spec.tsx → extraKeybindings.spec.tsx} +1 -3
  122. package/src/e2e_tests/{history-navigation.spec.tsx → historyNavigation.spec.tsx} +138 -19
  123. package/src/e2e_tests/performanceTest.spec.tsx +163 -0
  124. package/src/e2e_tests/{sanity-checks.spec.tsx → sanityChecks.spec.tsx} +28 -20
  125. package/src/e2e_tests/signatureHelp.spec.tsx +442 -0
  126. package/src/e2e_tests/snippets.spec.tsx +19 -0
  127. package/src/e2e_tests/{syntax-highlighting.spec.tsx → syntaxHighlighting.spec.tsx} +26 -24
  128. package/src/e2e_tests/syntaxValidation.spec.tsx +252 -0
  129. package/src/editorActions.ts +334 -0
  130. package/src/{history-navigation.ts → historyNavigation.ts} +6 -4
  131. package/src/hostCallbacks.ts +9 -0
  132. package/src/icons.ts +3 -0
  133. package/src/index.ts +4 -2
  134. package/src/inlinePanel.ts +140 -0
  135. package/src/lang-cypher/autocomplete.ts +96 -19
  136. package/src/lang-cypher/constants.ts +35 -2
  137. package/src/lang-cypher/contants.test.ts +7 -3
  138. package/src/lang-cypher/{create-cypher-theme.ts → createCypherTheme.ts} +97 -33
  139. package/src/lang-cypher/langCypher.ts +44 -0
  140. package/src/lang-cypher/lintWorker.mjs +2039 -0
  141. package/src/lang-cypher/parser-adapter.ts +146 -0
  142. package/src/lang-cypher/prism-global.ts +7 -0
  143. package/src/lang-cypher/signatureHelp.ts +154 -0
  144. package/src/lang-cypher/syntaxValidation.ts +81 -0
  145. package/src/lang-cypher/utils.ts +9 -0
  146. package/src/{ndl-tokens-copy.test.ts → ndlTokensCopy.test.ts} +2 -1
  147. package/src/ndlTokensCopy.ts +570 -0
  148. package/src/{neo4j-setup.tsx → neo4jSetup.tsx} +79 -18
  149. package/src/richClipboardCopier.test.ts +67 -0
  150. package/src/richClipboardCopier.ts +99 -0
  151. package/src/themes.ts +63 -71
  152. package/src/viteEnv.d.ts +1 -0
  153. package/dist/cjs/index.cjs +0 -1441
  154. package/dist/cjs/index.cjs.map +0 -7
  155. package/dist/esm/index.mjs +0 -1464
  156. package/dist/esm/index.mjs.map +0 -7
  157. package/dist/types/CypherEditor.d.ts +0 -113
  158. package/dist/types/e2e_tests/mock-data.d.ts +0 -3779
  159. package/dist/types/index.d.ts +0 -4
  160. package/dist/types/lang-cypher/ParserAdapter.d.ts +0 -14
  161. package/dist/types/lang-cypher/autocomplete.d.ts +0 -3
  162. package/dist/types/lang-cypher/lang-cypher.d.ts +0 -7
  163. package/dist/types/lang-cypher/syntax-validation.d.ts +0 -3
  164. package/dist/types/ndl-tokens-copy.d.ts +0 -379
  165. package/dist/types/neo4j-setup.d.ts +0 -2
  166. package/dist/types/themes.d.ts +0 -11
  167. package/dist/types/tsconfig.tsbuildinfo +0 -1
  168. package/src/e2e_tests/auto-completion.spec.tsx +0 -232
  169. package/src/e2e_tests/mock-data.ts +0 -4310
  170. package/src/e2e_tests/performance-test.spec.tsx +0 -71
  171. package/src/e2e_tests/syntax-validation.spec.tsx +0 -156
  172. package/src/lang-cypher/ParserAdapter.ts +0 -92
  173. package/src/lang-cypher/lang-cypher.ts +0 -32
  174. package/src/lang-cypher/syntax-validation.ts +0 -24
  175. package/src/ndl-tokens-copy.ts +0 -379
  176. /package/dist/{types/e2e_tests/auto-completion.spec.d.ts → src/CypherEditor.test.d.ts} +0 -0
  177. /package/dist/{types/e2e_tests/extra-keybindings.spec.d.ts → src/e2e_tests/autoCompletion.spec.d.ts} +0 -0
  178. /package/dist/{types/e2e_tests/history-navigation.spec.d.ts → src/e2e_tests/configuration.spec.d.ts} +0 -0
  179. /package/dist/{types/e2e_tests/performance-test.spec.d.ts → src/e2e_tests/debounce.spec.d.ts} +0 -0
  180. /package/dist/{types/e2e_tests/sanity-checks.spec.d.ts → src/e2e_tests/extraKeybindings.spec.d.ts} +0 -0
  181. /package/dist/{types/e2e_tests/syntax-highlighting.spec.d.ts → src/e2e_tests/historyNavigation.spec.d.ts} +0 -0
  182. /package/dist/{types/e2e_tests/syntax-validation.spec.d.ts → src/e2e_tests/sanityChecks.spec.d.ts} +0 -0
  183. /package/dist/{types/lang-cypher/contants.test.d.ts → src/e2e_tests/signatureHelp.spec.d.ts} +0 -0
  184. /package/dist/{types/ndl-tokens-copy.test.d.ts → src/e2e_tests/snippets.spec.d.ts} +0 -0
  185. /package/dist/{types/lang-cypher/theme-icons.d.ts → src/lang-cypher/themeIcons.d.ts} +0 -0
  186. /package/src/lang-cypher/{theme-icons.ts → themeIcons.ts} +0 -0
@@ -0,0 +1,162 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createRef } from 'react';
3
+ import { createRoot } from 'react-dom/client';
4
+ import { act } from 'react-dom/test-utils';
5
+ import { afterEach, beforeEach, expect, test, vi } from 'vitest';
6
+ import { DEBOUNCE_TIME } from './constants';
7
+ import { CypherEditor } from './CypherEditor';
8
+ const container = document.createElement('div');
9
+ let root;
10
+ const ref = createRef();
11
+ let value = '';
12
+ const onChange = vi.fn((v) => {
13
+ value = v;
14
+ rerender();
15
+ });
16
+ global.IS_REACT_ACT_ENVIRONMENT = true;
17
+ const DEBOUNCE_TIME_WITH_MARGIN = DEBOUNCE_TIME + 100;
18
+ /** Avoids crash in test environment */
19
+ function mockEditorView(editorView) {
20
+ editorView.coordsAtPos = vi
21
+ .fn()
22
+ .mockReturnValue({
23
+ left: 0,
24
+ top: 0,
25
+ right: 0,
26
+ bottom: 0,
27
+ });
28
+ }
29
+ async function debounce() {
30
+ await new Promise((resolve) => setTimeout(resolve, DEBOUNCE_TIME_WITH_MARGIN));
31
+ }
32
+ function getEditorValue() {
33
+ return ref.current.editorView.current.state.doc.toString();
34
+ }
35
+ function rerender() {
36
+ act(() => {
37
+ root.render(_jsx(CypherEditor, { value: value, onChange: onChange, ref: ref }));
38
+ });
39
+ }
40
+ beforeEach(() => {
41
+ root = createRoot(container);
42
+ act(() => {
43
+ root.render(_jsx(CypherEditor, { value: value, onChange: onChange, ref: ref }));
44
+ });
45
+ mockEditorView(ref.current.editorView.current);
46
+ });
47
+ afterEach(() => {
48
+ act(() => {
49
+ root.unmount();
50
+ });
51
+ value = '';
52
+ vi.clearAllMocks();
53
+ });
54
+ test('editorValue updates props.value after debounce', async () => {
55
+ ref.current.setValueAndFocus('new value');
56
+ expect(onChange).not.toHaveBeenCalled();
57
+ expect(getEditorValue()).toBe('new value');
58
+ expect(value).toBe('');
59
+ await debounce();
60
+ expect(onChange).toHaveBeenCalledOnce();
61
+ expect(getEditorValue()).toBe('new value');
62
+ expect(value).toBe('new value');
63
+ });
64
+ test('editorValue updates should not be applied twice', async () => {
65
+ const dispatch = vi.spyOn(ref.current.editorView.current, 'dispatch');
66
+ ref.current.setValueAndFocus('new value');
67
+ await debounce();
68
+ expect(onChange).toHaveBeenCalledOnce();
69
+ expect(dispatch).toHaveBeenCalledOnce(); // it gets called once for the initial setValueAndFocus
70
+ });
71
+ test('props.value updates editorValue', () => {
72
+ value = 'external value';
73
+ rerender();
74
+ expect(getEditorValue()).toBe('external value');
75
+ expect(value).toBe('external value');
76
+ });
77
+ test('props.value set to undefined preserves editorValue', () => {
78
+ // 1. value is set initially
79
+ value = 'initial';
80
+ rerender();
81
+ // 2. value is set to undefined
82
+ value = undefined;
83
+ rerender();
84
+ expect(onChange).not.toHaveBeenCalled();
85
+ expect(value).toBeUndefined();
86
+ expect(getEditorValue()).toBe('initial');
87
+ });
88
+ // This test documents unexpected behaviour:
89
+ // value updates (from outside onExecute) are overwritten by pending updates.
90
+ test('new props.value should cancel onChange', async () => {
91
+ // 1. value is updated internally
92
+ ref.current.setValueAndFocus('update');
93
+ // 2. editor is rerendered with a new value while a value update is still pending
94
+ // the update to 'new external value' is overwritten by the pending update to 'update'
95
+ value = 'new external value';
96
+ rerender();
97
+ await debounce();
98
+ // NOTE: These assertions currently check for the WRONG behavior (they are inverted).
99
+ expect(onChange).toHaveBeenCalled();
100
+ expect(getEditorValue()).not.toBe('new external value');
101
+ expect(value).not.toBe('new external value');
102
+ });
103
+ // This test documents unexpected behaviour:
104
+ // value updates (from outside onExecute) are overwritten by pending updates
105
+ test('new props.value set to same value should cancel onChange', async () => {
106
+ // 1. value is set initially
107
+ value = 'same value';
108
+ rerender();
109
+ // 2. value is updated internally
110
+ ref.current.setValueAndFocus('update');
111
+ // 3. editor is rerendered with a new value while a value update is still pending
112
+ // the update to 'same value' is overwritten by the pending update to 'update'
113
+ value = 'same value';
114
+ rerender();
115
+ await debounce();
116
+ // NOTE: These assertions currently check for the WRONG behavior (they are inverted).
117
+ expect(onChange).toHaveBeenCalled();
118
+ expect(getEditorValue()).not.toBe('same value');
119
+ expect(value).not.toBe('same value');
120
+ });
121
+ test('rerender should not cancel onChange', async () => {
122
+ // 1. value is updated internally
123
+ ref.current.setValueAndFocus('changed');
124
+ // 2. editor is rerendered while a value update is still pending
125
+ rerender();
126
+ await debounce();
127
+ expect(onChange).toHaveBeenCalledOnce();
128
+ expect(getEditorValue()).toBe('changed');
129
+ expect(value).toBe('changed');
130
+ });
131
+ test('rerender with a previous update should not cancel onChange', async () => {
132
+ // 1. value is updated internally
133
+ ref.current.setValueAndFocus('changed');
134
+ await debounce();
135
+ // 2. value is updated internally again
136
+ ref.current.setValueAndFocus('new change');
137
+ // 3. editor is rerendered while a value update is still pending
138
+ rerender();
139
+ await debounce();
140
+ expect(onChange).toHaveBeenCalledTimes(2);
141
+ expect(getEditorValue()).toBe('new change');
142
+ expect(value).toBe('new change');
143
+ });
144
+ test('rerender with prior external update should not cancel onChange', async () => {
145
+ // 1. value is set initially
146
+ ref.current.setValueAndFocus('initial');
147
+ await debounce();
148
+ // 2. value is updated externally
149
+ value = 'external update';
150
+ rerender();
151
+ // 3. value is updated internally
152
+ ref.current.setValueAndFocus('internal update');
153
+ // 4. editor is rerendered while a value update is still pending
154
+ rerender();
155
+ await debounce();
156
+ expect(getEditorValue()).toBe('internal update');
157
+ expect(value).toBe('internal update');
158
+ });
159
+ test('setValueAndFocus should handle CRLF newline characters', () => {
160
+ expect(() => ref.current.setValueAndFocus('new value\r\nnew line')).not.toThrow();
161
+ });
162
+ //# sourceMappingURL=CypherEditor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CypherEditor.test.js","sourceRoot":"","sources":["../../src/CypherEditor.test.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAChD,IAAI,IAAmC,CAAC;AAExC,MAAM,GAAG,GAAG,SAAS,EAAgB,CAAC;AACtC,IAAI,KAAK,GAAG,EAAE,CAAC;AACf,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAsB,CAAC,CAAC,EAAE,EAAE;IAChD,KAAK,GAAG,CAAC,CAAC;IACV,QAAQ,EAAE,CAAC;AACb,CAAC,CAAC,CAAC;AAEF,MAAc,CAAC,wBAAwB,GAAG,IAAI,CAAC;AAChD,MAAM,yBAAyB,GAAG,aAAa,GAAG,GAAG,CAAC;AAEtD,uCAAuC;AACvC,SAAS,cAAc,CAAC,UAAsB;IAC5C,UAAU,CAAC,WAAW,GAAG,EAAE;SACxB,EAAE,EAAsE;SACxE,eAAe,CAAC;QACf,IAAI,EAAE,CAAC;QACP,GAAG,EAAE,CAAC;QACN,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;KACV,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5B,UAAU,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAC/C,CAAC;AACJ,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,QAAQ;IACf,GAAG,CAAC,GAAG,EAAE;QACP,IAAI,CAAC,MAAM,CAAC,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAI,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,UAAU,CAAC,GAAG,EAAE;IACd,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAC7B,GAAG,CAAC,GAAG,EAAE;QACP,IAAI,CAAC,MAAM,CAAC,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAI,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IACH,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,GAAG,CAAC,GAAG,EAAE;QACP,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,KAAK,GAAG,EAAE,CAAC;IACX,EAAE,CAAC,aAAa,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;IAChE,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACxC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,MAAM,QAAQ,EAAE,CAAC;IAEjB,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACxC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;IACjE,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAEtE,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,QAAQ,EAAE,CAAC;IAEjB,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,uDAAuD;AAClG,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC3C,KAAK,GAAG,gBAAgB,CAAC;IACzB,QAAQ,EAAE,CAAC;IAEX,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC9D,4BAA4B;IAC5B,KAAK,GAAG,SAAS,CAAC;IAClB,QAAQ,EAAE,CAAC;IAEX,+BAA+B;IAC/B,KAAK,GAAG,SAAS,CAAC;IAClB,QAAQ,EAAE,CAAC;IAEX,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IAC9B,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,4CAA4C;AAC5C,8EAA8E;AAC9E,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;IACxD,iCAAiC;IACjC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAEvC,iFAAiF;IACjF,sFAAsF;IACtF,KAAK,GAAG,oBAAoB,CAAC;IAC7B,QAAQ,EAAE,CAAC;IAEX,MAAM,QAAQ,EAAE,CAAC;IAEjB,qFAAqF;IACrF,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACpC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC;AAEH,4CAA4C;AAC5C,6EAA6E;AAC7E,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;IAC1E,4BAA4B;IAC5B,KAAK,GAAG,YAAY,CAAC;IACrB,QAAQ,EAAE,CAAC;IAEX,iCAAiC;IACjC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAEvC,iFAAiF;IACjF,8EAA8E;IAC9E,KAAK,GAAG,YAAY,CAAC;IACrB,QAAQ,EAAE,CAAC;IAEX,MAAM,QAAQ,EAAE,CAAC;IAEjB,qFAAqF;IACrF,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACpC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;IACrD,iCAAiC;IACjC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAExC,gEAAgE;IAChE,QAAQ,EAAE,CAAC;IAEX,MAAM,QAAQ,EAAE,CAAC;IAEjB,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACxC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;IAC5E,iCAAiC;IACjC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,QAAQ,EAAE,CAAC;IAEjB,uCAAuC;IACvC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAE3C,gEAAgE;IAChE,QAAQ,EAAE,CAAC;IAEX,MAAM,QAAQ,EAAE,CAAC;IAEjB,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;IAChF,4BAA4B;IAC5B,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,QAAQ,EAAE,CAAC;IAEjB,iCAAiC;IACjC,KAAK,GAAG,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,CAAC;IAEX,iCAAiC;IACjC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAEhD,gEAAgE;IAChE,QAAQ,EAAE,CAAC;IAEX,MAAM,QAAQ,EAAE,CAAC;IAEjB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;IAClE,MAAM,CAAC,GAAG,EAAE,CACV,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CACtD,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const DEBOUNCE_TIME = 200;
@@ -0,0 +1,2 @@
1
+ export const DEBOUNCE_TIME = 200;
2
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Extension } from '@codemirror/state';
2
+ /**
3
+ * Props for rendering an inline diff in the editor.
4
+ *
5
+ * The diff is computed between {@link DiffProps.original} and the *current*
6
+ * editor document, so streaming/external updates to the document re-diff
7
+ * automatically against the same original.
8
+ */
9
+ export type DiffProps = {
10
+ /** The baseline document the current editor content is compared against. */
11
+ original: string;
12
+ };
13
+ export declare function createDiffExtension({ original }: DiffProps): Extension;
@@ -0,0 +1,11 @@
1
+ import { unifiedMergeView } from '@codemirror/merge';
2
+ export function createDiffExtension({ original }) {
3
+ return unifiedMergeView({
4
+ original,
5
+ highlightChanges: true,
6
+ syntaxHighlightDeletions: true,
7
+ mergeControls: false,
8
+ gutter: true,
9
+ });
10
+ }
11
+ //# sourceMappingURL=diffView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diffView.js","sourceRoot":"","sources":["../../src/diffView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAerD,MAAM,UAAU,mBAAmB,CAAC,EAAE,QAAQ,EAAa;IACzD,OAAO,gBAAgB,CAAC;QACtB,QAAQ;QACR,gBAAgB,EAAE,IAAI;QACtB,wBAAwB,EAAE,IAAI;QAC9B,aAAa,EAAE,KAAK;QACpB,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,334 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { testData } from '@neo4j-cypher/language-support';
3
+ import { expect, test } from '@playwright/experimental-ct-react';
4
+ import { CypherEditor } from '../CypherEditor';
5
+ test('hello world end 2 end test', async ({ mount }) => {
6
+ const component = await mount(_jsx(CypherEditor, { value: "hello world" }));
7
+ await expect(component).toContainText('hello world');
8
+ await component.update(_jsx(CypherEditor, { value: "RETURN 123" }));
9
+ await expect(component).toContainText('RETURN 123');
10
+ });
11
+ test('can complete in the middle of statement', async ({ mount, page }) => {
12
+ const component = await mount(_jsx(CypherEditor, { value: `MATCH ()
13
+ WHER true
14
+ RETURN n;` }));
15
+ // Move into the statement and trigger autocompletion
16
+ const textField = page.getByRole('textbox');
17
+ await textField.focus();
18
+ await textField.press('ArrowDown');
19
+ await textField.press('ArrowRight');
20
+ await textField.press('ArrowRight');
21
+ await textField.press('ArrowRight');
22
+ await textField.press('ArrowRight');
23
+ await textField.press('Control+ ');
24
+ await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
25
+ await page
26
+ .locator('.cm-tooltip-autocomplete')
27
+ .getByText('WHERE', { exact: true })
28
+ .click();
29
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
30
+ await expect(component).toContainText('WHERE true');
31
+ });
32
+ test('get completions when typing and can accept completions with tab', async ({ mount, page, }) => {
33
+ const component = await mount(_jsx(CypherEditor, {}));
34
+ const textField = page.getByRole('textbox');
35
+ await textField.fill('RETU');
36
+ await expect(page.locator('.cm-tooltip-autocomplete').getByText('RETURN')).toBeVisible();
37
+ // We need to wait for the editor to realise there is a completion open
38
+ // so that it does not just indent with tab key
39
+ await page.waitForTimeout(500);
40
+ await textField.press('Tab');
41
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
42
+ await expect(component).toContainText('RETURN');
43
+ });
44
+ test('get completions when typing in controlled component', async ({ mount, page, }) => {
45
+ let value = '';
46
+ const onChange = (val) => {
47
+ value = val;
48
+ void component.update(_jsx(CypherEditor, { value: val, onChange: onChange }));
49
+ };
50
+ const component = await mount(_jsx(CypherEditor, { value: value, onChange: onChange }));
51
+ const textField = page.getByRole('textbox');
52
+ await textField.fill('RETU');
53
+ await page.waitForTimeout(500); // wait for debounce
54
+ await expect(page.locator('.cm-tooltip-autocomplete').getByText('RETURN')).toBeVisible();
55
+ // We need to wait for the editor to realise there is a completion open
56
+ // so that it does not just indent with tab key
57
+ await page.waitForTimeout(500);
58
+ await textField.press('Tab');
59
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
60
+ await expect(component).toContainText('RETURN');
61
+ });
62
+ test('can complete labels', async ({ mount, page }) => {
63
+ const component = await mount(_jsx(CypherEditor, { schema: {
64
+ labels: ['Pokemon'],
65
+ } }));
66
+ const textField = page.getByRole('textbox');
67
+ await textField.fill('MATCH (n :P');
68
+ await page.locator('.cm-tooltip-autocomplete').getByText('Pokemon').click();
69
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
70
+ await expect(component).toContainText('MATCH (n :Pokemon');
71
+ });
72
+ test('can complete properties with backticks', async ({ mount, page }) => {
73
+ const component = await mount(_jsx(CypherEditor, { schema: {
74
+ propertyKeys: ['foo bar'],
75
+ } }));
76
+ const textField = page.getByRole('textbox');
77
+ await textField.fill('MATCH (n) RETURN n.foo');
78
+ await textField.press('Escape');
79
+ await textField.press('Control+ ');
80
+ await page.locator('.cm-tooltip-autocomplete').getByText('foo bar').click();
81
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
82
+ await expect(component).toContainText('MATCH (n) RETURN n.`foo bar`');
83
+ });
84
+ test('can update dbschema', async ({ mount, page }) => {
85
+ const component = await mount(_jsx(CypherEditor, { schema: {
86
+ labels: ['Pokemon'],
87
+ } }));
88
+ const textField = page.getByRole('textbox');
89
+ await textField.fill('MATCH (n :');
90
+ await expect(page.locator('.cm-tooltip-autocomplete').getByText('Pokemon')).toBeVisible();
91
+ await textField.press('Escape');
92
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
93
+ await component.update(_jsx(CypherEditor, { schema: {
94
+ labels: ['Pokemon', 'Digimon'],
95
+ } }));
96
+ await textField.press('Control+ ');
97
+ await expect(page.locator('.cm-tooltip-autocomplete').getByText('Pokemon')).toBeVisible();
98
+ await expect(page.locator('.cm-tooltip-autocomplete').getByText('Digimon')).toBeVisible();
99
+ });
100
+ test('can complete rel types', async ({ page, mount }) => {
101
+ const component = await mount(_jsx(CypherEditor, { schema: {
102
+ relationshipTypes: ['KNOWS'],
103
+ } }));
104
+ const textField = page.getByRole('textbox');
105
+ await textField.fill('MATCH (n)-[:');
106
+ await page.locator('.cm-tooltip-autocomplete').getByText('KNOWS').click();
107
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
108
+ await expect(component).toContainText('MATCH (n)-[:KNOWS');
109
+ });
110
+ test('can complete YIELD clauses without manual trigger', async ({ page, mount, }) => {
111
+ const component = await mount(_jsx(CypherEditor, { schema: {
112
+ procedures: testData.mockSchema.procedures,
113
+ } }));
114
+ const textField = page.getByRole('textbox');
115
+ await textField.fill('CALL dbms.components() YIELD ');
116
+ await page.locator('.cm-tooltip-autocomplete').getByText('edition').click();
117
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
118
+ await expect(component).toContainText('CALL dbms.components() YIELD edition');
119
+ });
120
+ test('automatic yield trigger is not case sensitive', async ({ page, mount, }) => {
121
+ const component = await mount(_jsx(CypherEditor, { schema: {
122
+ procedures: testData.mockSchema.procedures,
123
+ } }));
124
+ const textField = page.getByRole('textbox');
125
+ await textField.fill('CALL dbms.components() yIeLd ');
126
+ await page.locator('.cm-tooltip-autocomplete').getByText('edition').click();
127
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
128
+ await expect(component).toContainText('CALL dbms.components() yIeLd edition');
129
+ });
130
+ test('can complete functions', async ({ page, mount }) => {
131
+ const component = await mount(_jsx(CypherEditor, { schema: {
132
+ functions: {
133
+ 'CYPHER 5': {
134
+ function123: {
135
+ ...testData.emptyFunction,
136
+ name: 'function123',
137
+ },
138
+ },
139
+ },
140
+ } }));
141
+ const textField = page.getByRole('textbox');
142
+ await textField.fill('RETURN func');
143
+ await page
144
+ .locator('.cm-tooltip-autocomplete')
145
+ .getByText('function123')
146
+ .click();
147
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
148
+ await expect(component).toContainText('RETURN function123');
149
+ });
150
+ test('can complete procedures', async ({ page, mount }) => {
151
+ const component = await mount(_jsx(CypherEditor, { schema: {
152
+ procedures: {
153
+ 'CYPHER 5': {
154
+ 'db.ping': { ...testData.emptyProcedure, name: 'db.ping' },
155
+ },
156
+ },
157
+ } }));
158
+ const textField = page.getByRole('textbox');
159
+ await textField.fill('CALL d');
160
+ await page.locator('.cm-tooltip-autocomplete').getByText('db.ping').click();
161
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
162
+ await expect(component).toContainText('CALL db.ping');
163
+ });
164
+ test('can complete parameters', async ({ page, mount }) => {
165
+ const component = await mount(_jsx(CypherEditor, { schema: {
166
+ parameters: { parameter: { type: 'string' } },
167
+ } }));
168
+ const textField = page.getByRole('textbox');
169
+ await textField.fill('RETURN $p');
170
+ await page.locator('.cm-tooltip-autocomplete').getByText('parameter').click();
171
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
172
+ await expect(component).toContainText('RETURN $parameter');
173
+ });
174
+ test('completes allShortestPaths correctly', async ({ page, mount }) => {
175
+ await mount(_jsx(CypherEditor, { schema: {
176
+ parameters: { parameter: { type: 'string' } },
177
+ } }));
178
+ const textField = page.getByRole('textbox');
179
+ // The first query contains errors on purpose so the
180
+ // syntax errors get triggered before the auto-completion
181
+ await textField.fill('MATCH (n) REURN n; MATCH a');
182
+ await page
183
+ .locator('.cm-tooltip-autocomplete')
184
+ .getByText('allShortestPaths')
185
+ .click();
186
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
187
+ expect(await textField.textContent()).toEqual('MATCH (n) REURN n; MATCH allShortestPaths');
188
+ });
189
+ async function getInfoTooltip(page, methodName) {
190
+ const infoTooltip = page.locator('.cm-completionInfo');
191
+ const firstOption = page.locator('li[aria-selected="true"]');
192
+ let selectedOption = firstOption;
193
+ while (!(await infoTooltip.textContent()).includes(methodName)) {
194
+ await page.keyboard.press('ArrowDown');
195
+ const currentSelected = page.locator('li[aria-selected="true"]');
196
+ expect(currentSelected).not.toBe(selectedOption);
197
+ expect(currentSelected).not.toBe(firstOption);
198
+ selectedOption = currentSelected;
199
+ }
200
+ return infoTooltip;
201
+ }
202
+ test('shows signature help information on auto-completion for procedures', async ({ page, mount, }) => {
203
+ await mount(_jsx(CypherEditor, { schema: testData.mockSchema }));
204
+ const procName = 'apoc.periodic.iterate';
205
+ const procedure = testData.mockSchema.procedures['CYPHER 5'][procName];
206
+ const textField = page.getByRole('textbox');
207
+ await textField.fill('CALL apoc.periodic.');
208
+ await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
209
+ const infoTooltip = await getInfoTooltip(page, procName);
210
+ await expect(infoTooltip).toContainText(procedure.signature);
211
+ await expect(infoTooltip).toContainText(procedure.description);
212
+ });
213
+ test('shows signature help information on auto-completion for functions', async ({ page, mount, }) => {
214
+ await mount(_jsx(CypherEditor, { schema: testData.mockSchema }));
215
+ const fnName = 'apoc.coll.combinations';
216
+ const fn = testData.mockSchema.functions['CYPHER 5'][fnName];
217
+ const textField = page.getByRole('textbox');
218
+ await textField.fill('RETURN apoc.coll.');
219
+ await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
220
+ const infoTooltip = await getInfoTooltip(page, fnName);
221
+ await expect(infoTooltip).toContainText(fn.signature);
222
+ await expect(infoTooltip).toContainText(fn.description);
223
+ });
224
+ test('shows deprecated procedures as strikethrough on auto-completion', async ({ page, mount, }) => {
225
+ const procName = 'apoc.trigger.resume';
226
+ await mount(_jsx(CypherEditor, { schema: {
227
+ procedures: {
228
+ 'CYPHER 5': {
229
+ [procName]: testData.mockSchema.procedures['CYPHER 5'][procName],
230
+ },
231
+ },
232
+ } }));
233
+ const textField = page.getByRole('textbox');
234
+ await textField.fill('CALL apoc.trigger.');
235
+ // We need to assert on the element having the right class
236
+ // and trusting the CSS is making this truly strikethrough
237
+ await expect(page.locator('.cm-deprecated-element')).toBeVisible();
238
+ });
239
+ test('shows deprecated function as strikethrough on auto-completion', async ({ page, mount, }) => {
240
+ const fnName = 'apoc.create.uuid';
241
+ await mount(_jsx(CypherEditor, { schema: {
242
+ functions: {
243
+ 'CYPHER 5': {
244
+ [fnName]: testData.mockSchema.functions['CYPHER 5'][fnName],
245
+ },
246
+ },
247
+ } }));
248
+ const textField = page.getByRole('textbox');
249
+ await textField.fill('RETURN apoc.create.');
250
+ // We need to assert on the element having the right class
251
+ // and trusting the CSS is making this truly strikethrough
252
+ await expect(page.locator('.cm-deprecated-element')).toBeVisible();
253
+ });
254
+ test('does not signature help information on auto-completion if docs and signature are empty', async ({ page, mount, }) => {
255
+ await mount(_jsx(CypherEditor, { schema: testData.mockSchema }));
256
+ const textField = page.getByRole('textbox');
257
+ await textField.fill('C');
258
+ await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
259
+ await expect(page.locator('.cm-completionInfo')).not.toBeVisible();
260
+ });
261
+ test('shows signature help information on auto-completion if description is not empty, signature is', async ({ page, mount, }) => {
262
+ await mount(_jsx(CypherEditor, { schema: {
263
+ procedures: {
264
+ 'CYPHER 5': {
265
+ 'db.ping': {
266
+ ...testData.emptyProcedure,
267
+ description: 'foo',
268
+ signature: '',
269
+ name: 'db.ping',
270
+ },
271
+ },
272
+ },
273
+ } }));
274
+ const textField = page.getByRole('textbox');
275
+ await textField.fill('CALL db.');
276
+ await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
277
+ await expect(page.locator('.cm-completionInfo')).toBeVisible();
278
+ });
279
+ test('shows signature help information on auto-completion if signature is not empty, description is', async ({ page, mount, }) => {
280
+ await mount(_jsx(CypherEditor, { schema: {
281
+ procedures: {
282
+ 'CYPHER 5': {
283
+ 'db.ping': {
284
+ ...testData.emptyProcedure,
285
+ description: '',
286
+ signature: 'foo',
287
+ name: 'db.ping',
288
+ },
289
+ },
290
+ },
291
+ } }));
292
+ const textField = page.getByRole('textbox');
293
+ await textField.fill('CALL db.');
294
+ await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
295
+ await expect(page.locator('.cm-completionInfo')).toBeVisible();
296
+ });
297
+ test('completions depend on the Cypher version', async ({ page, mount }) => {
298
+ await mount(_jsx(CypherEditor, { schema: {
299
+ functions: {
300
+ 'CYPHER 5': {
301
+ cypher5Function: {
302
+ ...testData.emptyFunction,
303
+ name: 'cypher5Function',
304
+ },
305
+ },
306
+ 'CYPHER 25': {
307
+ cypher25Function: {
308
+ ...testData.emptyFunction,
309
+ name: 'cypher25Function',
310
+ },
311
+ },
312
+ },
313
+ } }));
314
+ const textField = page.getByRole('textbox');
315
+ await textField.fill('CYPHER 5 RETURN cypher');
316
+ await expect(page.locator('.cm-tooltip-autocomplete').getByText('cypher5Function')).toBeVisible();
317
+ await textField.fill('CYPHER 25 RETURN cypher');
318
+ await expect(page.locator('.cm-tooltip-autocomplete').getByText('cypher25Function')).toBeVisible();
319
+ });
320
+ test('does not complete properties for non node / relationship variables', async ({ page, mount, }) => {
321
+ await mount(_jsx(CypherEditor, { schema: {
322
+ propertyKeys: ['nodeProperty'],
323
+ } }));
324
+ const textField = page.getByRole('textbox');
325
+ await textField.fill('MATCH (n) RETURN n.');
326
+ await expect(page.locator('.cm-tooltip-autocomplete').getByText('nodeProperty')).toBeVisible();
327
+ await textField.fill('WITH 1 AS x RETURN x.');
328
+ // This could be flaky if the semantic analysis takes too long
329
+ await page.waitForTimeout(500);
330
+ await textField.press('Escape');
331
+ await textField.press('Control+ ');
332
+ await expect(page.locator('.cm-tooltip-autocomplete').getByText('nodeProperty')).not.toBeVisible();
333
+ });
334
+ //# sourceMappingURL=autoCompletion.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoCompletion.spec.js","sourceRoot":"","sources":["../../../src/e2e_tests/autoCompletion.spec.tsx"],"names":[],"mappings":"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"}