@neo4j-cypher/react-codemirror 2.0.0-next.3 → 2.0.0-next.31

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 (163) hide show
  1. package/CHANGELOG.md +265 -0
  2. package/README.md +3 -2
  3. package/dist/{types → src}/CypherEditor.d.ts +81 -3
  4. package/dist/src/CypherEditor.js +336 -0
  5. package/dist/src/CypherEditor.js.map +1 -0
  6. package/dist/src/CypherEditor.test.js +154 -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/e2e_tests/autoCompletion.spec.js +332 -0
  12. package/dist/src/e2e_tests/autoCompletion.spec.js.map +1 -0
  13. package/dist/src/e2e_tests/configuration.spec.js +83 -0
  14. package/dist/src/e2e_tests/configuration.spec.js.map +1 -0
  15. package/dist/src/e2e_tests/debounce.spec.js +66 -0
  16. package/dist/src/e2e_tests/debounce.spec.js.map +1 -0
  17. package/dist/{types/e2e_tests/e2e-utils.d.ts → src/e2e_tests/e2eUtils.d.ts} +2 -0
  18. package/dist/src/e2e_tests/e2eUtils.js +79 -0
  19. package/dist/src/e2e_tests/e2eUtils.js.map +1 -0
  20. package/dist/src/e2e_tests/extraKeybindings.spec.js +43 -0
  21. package/dist/src/e2e_tests/extraKeybindings.spec.js.map +1 -0
  22. package/dist/src/e2e_tests/historyNavigation.spec.js +227 -0
  23. package/dist/src/e2e_tests/historyNavigation.spec.js.map +1 -0
  24. package/dist/src/e2e_tests/performanceTest.spec.d.ts +6 -0
  25. package/dist/src/e2e_tests/performanceTest.spec.js +97 -0
  26. package/dist/src/e2e_tests/performanceTest.spec.js.map +1 -0
  27. package/dist/src/e2e_tests/sanityChecks.spec.js +53 -0
  28. package/dist/src/e2e_tests/sanityChecks.spec.js.map +1 -0
  29. package/dist/src/e2e_tests/signatureHelp.spec.js +228 -0
  30. package/dist/src/e2e_tests/signatureHelp.spec.js.map +1 -0
  31. package/dist/src/e2e_tests/snippets.spec.js +62 -0
  32. package/dist/src/e2e_tests/snippets.spec.js.map +1 -0
  33. package/dist/src/e2e_tests/syntaxHighlighting.spec.d.ts +1 -0
  34. package/dist/src/e2e_tests/syntaxHighlighting.spec.js +90 -0
  35. package/dist/src/e2e_tests/syntaxHighlighting.spec.js.map +1 -0
  36. package/dist/src/e2e_tests/syntaxValidation.spec.d.ts +1 -0
  37. package/dist/src/e2e_tests/syntaxValidation.spec.js +126 -0
  38. package/dist/src/e2e_tests/syntaxValidation.spec.js.map +1 -0
  39. package/dist/src/historyNavigation.js +163 -0
  40. package/dist/src/historyNavigation.js.map +1 -0
  41. package/dist/{types → src}/icons.d.ts +1 -1
  42. package/dist/src/icons.js +62 -0
  43. package/dist/src/icons.js.map +1 -0
  44. package/dist/src/index.d.ts +4 -0
  45. package/dist/src/index.js +5 -0
  46. package/dist/src/index.js.map +1 -0
  47. package/dist/src/lang-cypher/autocomplete.d.ts +6 -0
  48. package/dist/src/lang-cypher/autocomplete.js +113 -0
  49. package/dist/src/lang-cypher/autocomplete.js.map +1 -0
  50. package/dist/{types → src}/lang-cypher/constants.d.ts +11 -0
  51. package/dist/src/lang-cypher/constants.js +69 -0
  52. package/dist/src/lang-cypher/constants.js.map +1 -0
  53. package/dist/src/lang-cypher/contants.test.d.ts +1 -0
  54. package/dist/src/lang-cypher/contants.test.js +103 -0
  55. package/dist/src/lang-cypher/contants.test.js.map +1 -0
  56. package/dist/src/lang-cypher/createCypherTheme.js +183 -0
  57. package/dist/src/lang-cypher/createCypherTheme.js.map +1 -0
  58. package/dist/src/lang-cypher/langCypher.d.ts +13 -0
  59. package/dist/src/lang-cypher/langCypher.js +23 -0
  60. package/dist/src/lang-cypher/langCypher.js.map +1 -0
  61. package/dist/src/lang-cypher/lintWorker.mjs +2022 -0
  62. package/dist/src/lang-cypher/parser-adapter.d.ts +19 -0
  63. package/dist/src/lang-cypher/parser-adapter.js +113 -0
  64. package/dist/src/lang-cypher/parser-adapter.js.map +1 -0
  65. package/dist/src/lang-cypher/signatureHelp.d.ts +4 -0
  66. package/dist/src/lang-cypher/signatureHelp.js +109 -0
  67. package/dist/src/lang-cypher/signatureHelp.js.map +1 -0
  68. package/dist/{types/lang-cypher/syntax-validation.d.ts → src/lang-cypher/syntaxValidation.d.ts} +2 -1
  69. package/dist/src/lang-cypher/syntaxValidation.js +57 -0
  70. package/dist/src/lang-cypher/syntaxValidation.js.map +1 -0
  71. package/dist/src/lang-cypher/themeIcons.js +22 -0
  72. package/dist/src/lang-cypher/themeIcons.js.map +1 -0
  73. package/dist/src/lang-cypher/utils.d.ts +2 -0
  74. package/dist/src/lang-cypher/utils.js +10 -0
  75. package/dist/src/lang-cypher/utils.js.map +1 -0
  76. package/dist/src/ndlTokensCopy.d.ts +570 -0
  77. package/dist/src/ndlTokensCopy.js +571 -0
  78. package/dist/src/ndlTokensCopy.js.map +1 -0
  79. package/dist/src/ndlTokensCopy.test.d.ts +1 -0
  80. package/dist/src/ndlTokensCopy.test.js +12 -0
  81. package/dist/src/ndlTokensCopy.test.js.map +1 -0
  82. package/dist/src/neo4jSetup.d.ts +6 -0
  83. package/dist/src/neo4jSetup.js +120 -0
  84. package/dist/src/neo4jSetup.js.map +1 -0
  85. package/dist/src/richClipboardCopier.d.ts +4 -0
  86. package/dist/src/richClipboardCopier.js +78 -0
  87. package/dist/src/richClipboardCopier.js.map +1 -0
  88. package/dist/src/richClipboardCopier.test.d.ts +1 -0
  89. package/dist/src/richClipboardCopier.test.js +53 -0
  90. package/dist/src/richClipboardCopier.test.js.map +1 -0
  91. package/dist/{types → src}/themes.d.ts +1 -1
  92. package/dist/src/themes.js +93 -0
  93. package/dist/src/themes.js.map +1 -0
  94. package/dist/tsconfig.tsbuildinfo +1 -0
  95. package/package.json +43 -41
  96. package/src/CypherEditor.test.tsx +204 -0
  97. package/src/CypherEditor.tsx +316 -42
  98. package/src/constants.ts +1 -0
  99. package/src/e2e_tests/autoCompletion.spec.tsx +571 -0
  100. package/src/e2e_tests/configuration.spec.tsx +111 -0
  101. package/src/e2e_tests/debounce.spec.tsx +106 -0
  102. package/src/e2e_tests/{e2e-utils.ts → e2eUtils.ts} +41 -3
  103. package/src/e2e_tests/{extra-keybindings.spec.tsx → extraKeybindings.spec.tsx} +1 -3
  104. package/src/e2e_tests/{history-navigation.spec.tsx → historyNavigation.spec.tsx} +137 -18
  105. package/src/e2e_tests/performanceTest.spec.tsx +163 -0
  106. package/src/e2e_tests/{sanity-checks.spec.tsx → sanityChecks.spec.tsx} +7 -22
  107. package/src/e2e_tests/signatureHelp.spec.tsx +444 -0
  108. package/src/e2e_tests/snippets.spec.tsx +92 -0
  109. package/src/e2e_tests/{syntax-highlighting.spec.tsx → syntaxHighlighting.spec.tsx} +26 -24
  110. package/src/e2e_tests/syntaxValidation.spec.tsx +259 -0
  111. package/src/{history-navigation.ts → historyNavigation.ts} +1 -1
  112. package/src/icons.ts +3 -0
  113. package/src/index.ts +2 -2
  114. package/src/lang-cypher/autocomplete.ts +99 -18
  115. package/src/lang-cypher/constants.ts +27 -0
  116. package/src/lang-cypher/contants.test.ts +6 -2
  117. package/src/lang-cypher/{create-cypher-theme.ts → createCypherTheme.ts} +45 -2
  118. package/src/lang-cypher/langCypher.ts +42 -0
  119. package/src/lang-cypher/lintWorker.mjs +2022 -0
  120. package/src/lang-cypher/parser-adapter.ts +145 -0
  121. package/src/lang-cypher/signatureHelp.ts +151 -0
  122. package/src/lang-cypher/syntaxValidation.ts +72 -0
  123. package/src/lang-cypher/utils.ts +9 -0
  124. package/src/{ndl-tokens-copy.test.ts → ndlTokensCopy.test.ts} +2 -1
  125. package/src/ndlTokensCopy.ts +570 -0
  126. package/src/{neo4j-setup.tsx → neo4jSetup.tsx} +78 -17
  127. package/src/richClipboardCopier.test.ts +65 -0
  128. package/src/richClipboardCopier.ts +99 -0
  129. package/src/themes.ts +45 -70
  130. package/src/viteEnv.d.ts +1 -0
  131. package/dist/cjs/index.cjs +0 -1440
  132. package/dist/cjs/index.cjs.map +0 -7
  133. package/dist/esm/index.mjs +0 -1463
  134. package/dist/esm/index.mjs.map +0 -7
  135. package/dist/types/e2e_tests/mock-data.d.ts +0 -3779
  136. package/dist/types/index.d.ts +0 -4
  137. package/dist/types/lang-cypher/ParserAdapter.d.ts +0 -14
  138. package/dist/types/lang-cypher/autocomplete.d.ts +0 -3
  139. package/dist/types/lang-cypher/lang-cypher.d.ts +0 -7
  140. package/dist/types/ndl-tokens-copy.d.ts +0 -379
  141. package/dist/types/neo4j-setup.d.ts +0 -2
  142. package/dist/types/tsconfig.tsbuildinfo +0 -1
  143. package/src/e2e_tests/auto-completion.spec.tsx +0 -232
  144. package/src/e2e_tests/mock-data.ts +0 -4310
  145. package/src/e2e_tests/performance-test.spec.tsx +0 -71
  146. package/src/e2e_tests/syntax-validation.spec.tsx +0 -156
  147. package/src/lang-cypher/ParserAdapter.ts +0 -92
  148. package/src/lang-cypher/lang-cypher.ts +0 -32
  149. package/src/lang-cypher/syntax-validation.ts +0 -24
  150. package/src/ndl-tokens-copy.ts +0 -379
  151. /package/dist/{types/e2e_tests/auto-completion.spec.d.ts → src/CypherEditor.test.d.ts} +0 -0
  152. /package/dist/{types/e2e_tests/extra-keybindings.spec.d.ts → src/e2e_tests/autoCompletion.spec.d.ts} +0 -0
  153. /package/dist/{types/e2e_tests/history-navigation.spec.d.ts → src/e2e_tests/configuration.spec.d.ts} +0 -0
  154. /package/dist/{types/e2e_tests/performance-test.spec.d.ts → src/e2e_tests/debounce.spec.d.ts} +0 -0
  155. /package/dist/{types/e2e_tests/sanity-checks.spec.d.ts → src/e2e_tests/extraKeybindings.spec.d.ts} +0 -0
  156. /package/dist/{types/e2e_tests/syntax-highlighting.spec.d.ts → src/e2e_tests/historyNavigation.spec.d.ts} +0 -0
  157. /package/dist/{types/e2e_tests/syntax-validation.spec.d.ts → src/e2e_tests/sanityChecks.spec.d.ts} +0 -0
  158. /package/dist/{types/lang-cypher/contants.test.d.ts → src/e2e_tests/signatureHelp.spec.d.ts} +0 -0
  159. /package/dist/{types/ndl-tokens-copy.test.d.ts → src/e2e_tests/snippets.spec.d.ts} +0 -0
  160. /package/dist/{types/history-navigation.d.ts → src/historyNavigation.d.ts} +0 -0
  161. /package/dist/{types/lang-cypher/create-cypher-theme.d.ts → src/lang-cypher/createCypherTheme.d.ts} +0 -0
  162. /package/dist/{types/lang-cypher/theme-icons.d.ts → src/lang-cypher/themeIcons.d.ts} +0 -0
  163. /package/src/lang-cypher/{theme-icons.ts → themeIcons.ts} +0 -0
@@ -0,0 +1,336 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { insertNewline } from '@codemirror/commands';
3
+ import { Annotation, Compartment, EditorState, } from '@codemirror/state';
4
+ import { EditorView, keymap, lineNumbers, placeholder, } from '@codemirror/view';
5
+ import { formatQuery } from '@neo4j-cypher/language-support';
6
+ import debounce from 'lodash.debounce';
7
+ import { Component, createRef } from 'react';
8
+ import { DEBOUNCE_TIME } from './constants';
9
+ import { replaceHistory, replMode as historyNavigation, } from './historyNavigation';
10
+ import { cypher } from './lang-cypher/langCypher';
11
+ import { cleanupWorkers } from './lang-cypher/syntaxValidation';
12
+ import { basicNeo4jSetup } from './neo4jSetup';
13
+ import { getThemeExtension } from './themes';
14
+ import { richClipboardCopier } from './richClipboardCopier';
15
+ const format = (view) => {
16
+ try {
17
+ const doc = view.state.doc.toString();
18
+ const { formattedQuery, newCursorPos } = formatQuery(doc, {
19
+ cursorPosition: view.state.selection.main.anchor,
20
+ });
21
+ view.dispatch({
22
+ changes: {
23
+ from: 0,
24
+ to: doc.length,
25
+ insert: formattedQuery,
26
+ },
27
+ selection: { anchor: newCursorPos },
28
+ });
29
+ }
30
+ catch (error) {
31
+ // Formatting failed, likely because of a syntax error
32
+ }
33
+ };
34
+ const executeKeybinding = (onExecute, newLineOnEnter, flush) => {
35
+ const keybindings = {
36
+ 'Shift-Enter': {
37
+ key: 'Shift-Enter',
38
+ run: insertNewline,
39
+ },
40
+ 'Ctrl-Enter': {
41
+ key: 'Ctrl-Enter',
42
+ run: () => true,
43
+ },
44
+ Enter: {
45
+ key: 'Enter',
46
+ run: insertNewline,
47
+ },
48
+ };
49
+ if (onExecute) {
50
+ keybindings['Ctrl-Enter'] = {
51
+ key: 'Ctrl-Enter',
52
+ mac: 'Mod-Enter',
53
+ preventDefault: true,
54
+ run: (view) => {
55
+ const doc = view.state.doc.toString();
56
+ if (doc.trim() !== '') {
57
+ flush?.();
58
+ onExecute(doc);
59
+ }
60
+ return true;
61
+ },
62
+ };
63
+ if (!newLineOnEnter) {
64
+ keybindings['Enter'] = {
65
+ key: 'Enter',
66
+ preventDefault: true,
67
+ run: (view) => {
68
+ const doc = view.state.doc.toString();
69
+ if (doc.includes('\n')) {
70
+ // Returning false means the event will mark the event
71
+ // as not handled and the default behavior will be executed
72
+ return false;
73
+ }
74
+ if (doc.trim() !== '') {
75
+ flush?.();
76
+ onExecute(doc);
77
+ }
78
+ return true;
79
+ },
80
+ };
81
+ }
82
+ }
83
+ return Object.values(keybindings);
84
+ };
85
+ const themeCompartment = new Compartment();
86
+ const keyBindingCompartment = new Compartment();
87
+ const lineNumbersCompartment = new Compartment();
88
+ const readOnlyCompartment = new Compartment();
89
+ const placeholderCompartment = new Compartment();
90
+ const domEventHandlerCompartment = new Compartment();
91
+ const formatLineNumber = (prompt) => (a, state) => {
92
+ if (state.doc.lines === 1 && prompt !== undefined) {
93
+ return prompt;
94
+ }
95
+ return a.toString();
96
+ };
97
+ const ExternalEdit = Annotation.define();
98
+ export class CypherEditor extends Component {
99
+ /**
100
+ * The codemirror editor container.
101
+ */
102
+ editorContainer = createRef();
103
+ /**
104
+ * The codemirror editor state.
105
+ */
106
+ editorState = createRef();
107
+ /**
108
+ * The codemirror editor view.
109
+ */
110
+ editorView = createRef();
111
+ schemaRef = createRef();
112
+ /**
113
+ * Format Cypher query
114
+ */
115
+ format() {
116
+ format(this.editorView.current);
117
+ }
118
+ /**
119
+ * Focus the editor
120
+ */
121
+ focus() {
122
+ this.editorView.current?.focus();
123
+ }
124
+ /**
125
+ * Move the cursor to the supplied position.
126
+ * For example, to move the cursor to the end of the editor, use `value.length`
127
+ */
128
+ updateCursorPosition(position) {
129
+ this.editorView.current?.dispatch({
130
+ selection: { anchor: position, head: position },
131
+ });
132
+ }
133
+ /**
134
+ * Externally set the editor value and focus the editor.
135
+ */
136
+ setValueAndFocus(value = '') {
137
+ const currentCmValue = this.editorView.current.state?.doc.toString() ?? '';
138
+ // Normalize line endings to LF that CM expects.
139
+ // Prevents issues with inserted values that contain CRLF line endings.
140
+ // https://codemirror.net/docs/ref/?utm_source=chatgpt.com#state.EditorState^lineSeparator
141
+ const normalizedValue = value.replace(/\r\n/g, '\n');
142
+ this.editorView.current.dispatch({
143
+ changes: {
144
+ from: 0,
145
+ to: currentCmValue.length,
146
+ insert: normalizedValue,
147
+ },
148
+ selection: {
149
+ anchor: normalizedValue.length,
150
+ head: normalizedValue.length,
151
+ },
152
+ });
153
+ this.editorView.current?.focus();
154
+ }
155
+ static defaultProps = {
156
+ lint: true,
157
+ schema: {},
158
+ overrideThemeBackgroundColor: false,
159
+ lineWrap: false,
160
+ showSignatureTooltipBelow: true,
161
+ extraKeybindings: [],
162
+ history: [],
163
+ theme: 'light',
164
+ lineNumbers: true,
165
+ newLineOnEnter: false,
166
+ moveFocusOnTab: false,
167
+ };
168
+ debouncedOnChange = this.props.onChange
169
+ ? debounce(((value, viewUpdate) => {
170
+ this.props.onChange(value, viewUpdate);
171
+ }), DEBOUNCE_TIME)
172
+ : undefined;
173
+ componentDidMount() {
174
+ const { theme, extraKeybindings, lineWrap, overrideThemeBackgroundColor, schema, lint, showSignatureTooltipBelow, featureFlags, onExecute, newLineOnEnter, } = this.props;
175
+ this.schemaRef.current = {
176
+ schema,
177
+ lint,
178
+ showSignatureTooltipBelow,
179
+ featureFlags: {
180
+ consoleCommands: true,
181
+ ...featureFlags,
182
+ },
183
+ useLightVersion: false,
184
+ setUseLightVersion: (newVal) => {
185
+ if (this.schemaRef.current !== undefined) {
186
+ this.schemaRef.current.useLightVersion = newVal;
187
+ }
188
+ },
189
+ };
190
+ const themeExtension = getThemeExtension(theme, overrideThemeBackgroundColor);
191
+ const changeListener = this.debouncedOnChange
192
+ ? [
193
+ EditorView.updateListener.of((upt) => {
194
+ const wasUserEdit = !upt.transactions.some((tr) => tr.annotation(ExternalEdit));
195
+ if (upt.docChanged && wasUserEdit) {
196
+ const doc = upt.state.doc;
197
+ const value = doc.toString();
198
+ this.debouncedOnChange(value, upt);
199
+ }
200
+ }),
201
+ ]
202
+ : [];
203
+ this.editorState.current = EditorState.create({
204
+ extensions: [
205
+ keyBindingCompartment.of(keymap.of([
206
+ ...executeKeybinding(onExecute, newLineOnEnter, () => this.debouncedOnChange?.flush()),
207
+ ...extraKeybindings,
208
+ ])),
209
+ richClipboardCopier,
210
+ historyNavigation(this.props),
211
+ basicNeo4jSetup(this.props),
212
+ themeCompartment.of(themeExtension),
213
+ changeListener,
214
+ cypher(this.schemaRef.current),
215
+ lineWrap ? EditorView.lineWrapping : [],
216
+ lineNumbersCompartment.of(this.props.lineNumbers
217
+ ? lineNumbers({ formatNumber: formatLineNumber(this.props.prompt) })
218
+ : []),
219
+ readOnlyCompartment.of(EditorState.readOnly.of(this.props.readonly)),
220
+ placeholderCompartment.of(this.props.placeholder ? placeholder(this.props.placeholder) : []),
221
+ domEventHandlerCompartment.of(this.props.domEventHandlers
222
+ ? EditorView.domEventHandlers(this.props.domEventHandlers)
223
+ : []),
224
+ this.props.ariaLabel
225
+ ? EditorView.contentAttributes.of({
226
+ 'aria-label': this.props.ariaLabel,
227
+ })
228
+ : [],
229
+ ],
230
+ doc: this.props.value,
231
+ });
232
+ this.editorView.current = new EditorView({
233
+ state: this.editorState.current,
234
+ parent: this.editorContainer.current,
235
+ });
236
+ if (this.props.autofocus) {
237
+ this.focus();
238
+ if (this.props.value) {
239
+ this.updateCursorPosition(this.props.value.length);
240
+ }
241
+ }
242
+ else if (this.props.offset) {
243
+ this.updateCursorPosition(this.props.offset);
244
+ }
245
+ }
246
+ componentDidUpdate(prevProps) {
247
+ if (!this.editorView.current) {
248
+ return;
249
+ }
250
+ // Handle externally set value
251
+ const currentCmValue = this.editorView.current.state?.doc.toString() ?? '';
252
+ if (this.props.value !== undefined && // If the component becomes uncontolled, we just leave the value as is
253
+ this.props.value !== prevProps.value && // The value prop has changed, we need to update the editor
254
+ this.props.value !== currentCmValue // No need to dispatch an update if the value is the same
255
+ ) {
256
+ this.editorView.current.dispatch({
257
+ changes: {
258
+ from: 0,
259
+ to: currentCmValue.length,
260
+ insert: this.props.value ?? '',
261
+ },
262
+ annotations: [ExternalEdit.of(true)],
263
+ });
264
+ }
265
+ // Handle theme change
266
+ const didChangeTheme = prevProps.theme !== this.props.theme ||
267
+ prevProps.overrideThemeBackgroundColor !==
268
+ this.props.overrideThemeBackgroundColor;
269
+ if (didChangeTheme) {
270
+ this.editorView.current.dispatch({
271
+ effects: themeCompartment.reconfigure(getThemeExtension(this.props.theme, this.props.overrideThemeBackgroundColor)),
272
+ });
273
+ }
274
+ if (prevProps.lineNumbers !== this.props.lineNumbers ||
275
+ prevProps.prompt !== this.props.prompt) {
276
+ this.editorView.current.dispatch({
277
+ effects: lineNumbersCompartment.reconfigure(this.props.lineNumbers
278
+ ? lineNumbers({ formatNumber: formatLineNumber(this.props.prompt) })
279
+ : []),
280
+ });
281
+ }
282
+ if (prevProps.readonly !== this.props.readonly) {
283
+ this.editorView.current.dispatch({
284
+ effects: readOnlyCompartment.reconfigure(EditorState.readOnly.of(this.props.readonly)),
285
+ });
286
+ }
287
+ if (prevProps.placeholder !== this.props.placeholder) {
288
+ this.editorView.current.dispatch({
289
+ effects: placeholderCompartment.reconfigure(this.props.placeholder ? placeholder(this.props.placeholder) : []),
290
+ });
291
+ }
292
+ if (prevProps.extraKeybindings !== this.props.extraKeybindings ||
293
+ prevProps.onExecute !== this.props.onExecute) {
294
+ this.editorView.current.dispatch({
295
+ effects: keyBindingCompartment.reconfigure(keymap.of([
296
+ ...executeKeybinding(this.props.onExecute, this.props.newLineOnEnter, () => this.debouncedOnChange?.flush()),
297
+ ...this.props.extraKeybindings,
298
+ ])),
299
+ });
300
+ }
301
+ if (prevProps.domEventHandlers !== this.props.domEventHandlers) {
302
+ this.editorView.current.dispatch({
303
+ effects: domEventHandlerCompartment.reconfigure(this.props.domEventHandlers
304
+ ? EditorView.domEventHandlers(this.props.domEventHandlers)
305
+ : []),
306
+ });
307
+ }
308
+ // This component rerenders on every keystroke and comparing the
309
+ // full lists of editor strings on every render could be expensive.
310
+ const didChangeHistoryEstimate = prevProps.history?.length !== this.props.history?.length ||
311
+ prevProps.history?.[0] !== this.props.history?.[0];
312
+ if (didChangeHistoryEstimate) {
313
+ this.editorView.current.dispatch({
314
+ effects: replaceHistory.of(this.props.history ?? []),
315
+ });
316
+ }
317
+ /*
318
+ The cypher configuration is a mutable object that is passed to the cypher language extension.
319
+ Much like how the schema based completions work in the official sql language extension.
320
+ https://github.com/codemirror/lang-sql/blob/4b7b2564dff7cdb1a15f8ccd08142f2cc8a0006f/src/sql.ts#L178C17-L178C18
321
+ */
322
+ this.schemaRef.current.schema = this.props.schema;
323
+ this.schemaRef.current.lint = this.props.lint;
324
+ this.schemaRef.current.featureFlags = this.props.featureFlags;
325
+ }
326
+ componentWillUnmount() {
327
+ this.editorView.current?.destroy();
328
+ cleanupWorkers();
329
+ }
330
+ render() {
331
+ const { className, theme } = this.props;
332
+ const themeClass = typeof theme === 'string' ? `cm-theme-${theme}` : 'cm-theme';
333
+ return (_jsx("div", { ref: this.editorContainer, className: `${themeClass}${className ? ` ${className}` : ''}` }));
334
+ }
335
+ }
336
+ //# sourceMappingURL=CypherEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CypherEditor.js","sourceRoot":"","sources":["../../src/CypherEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
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.fn().mockReturnValue({
21
+ left: 0,
22
+ top: 0,
23
+ right: 0,
24
+ bottom: 0,
25
+ });
26
+ }
27
+ async function debounce() {
28
+ await new Promise((resolve) => setTimeout(resolve, DEBOUNCE_TIME_WITH_MARGIN));
29
+ }
30
+ function getEditorValue() {
31
+ return ref.current.editorView.current.state.doc.toString();
32
+ }
33
+ function rerender() {
34
+ act(() => {
35
+ root.render(_jsx(CypherEditor, { value: value, onChange: onChange, ref: ref }));
36
+ });
37
+ }
38
+ beforeEach(() => {
39
+ root = createRoot(container);
40
+ act(() => {
41
+ root.render(_jsx(CypherEditor, { value: value, onChange: onChange, ref: ref }));
42
+ });
43
+ mockEditorView(ref.current.editorView.current);
44
+ });
45
+ afterEach(() => {
46
+ act(() => {
47
+ root.unmount();
48
+ });
49
+ value = '';
50
+ vi.clearAllMocks();
51
+ });
52
+ test('editorValue updates props.value after debounce', async () => {
53
+ ref.current.setValueAndFocus('new value');
54
+ expect(onChange).not.toHaveBeenCalled();
55
+ expect(getEditorValue()).toBe('new value');
56
+ expect(value).toBe('');
57
+ await debounce();
58
+ expect(onChange).toHaveBeenCalledOnce();
59
+ expect(getEditorValue()).toBe('new value');
60
+ expect(value).toBe('new value');
61
+ });
62
+ test('editorValue updates should not be applied twice', async () => {
63
+ const dispatch = vi.spyOn(ref.current.editorView.current, 'dispatch');
64
+ ref.current.setValueAndFocus('new value');
65
+ await debounce();
66
+ expect(onChange).toHaveBeenCalledOnce();
67
+ expect(dispatch).toHaveBeenCalledOnce(); // it gets called once for the initial setValueAndFocus
68
+ });
69
+ test('props.value updates editorValue', () => {
70
+ value = 'external value';
71
+ rerender();
72
+ expect(getEditorValue()).toBe('external value');
73
+ expect(value).toBe('external value');
74
+ });
75
+ test('props.value set to undefined preserves editorValue', () => {
76
+ // 1. value is set initially
77
+ value = 'initial';
78
+ rerender();
79
+ // 2. value is set to undefined
80
+ value = undefined;
81
+ rerender();
82
+ expect(onChange).not.toHaveBeenCalled();
83
+ expect(value).toBeUndefined();
84
+ expect(getEditorValue()).toBe('initial');
85
+ });
86
+ // value updates from outside onExecute are overwritten by pending updates
87
+ test.fails('new props.value should cancel onChange', async () => {
88
+ // 1. value is updated internally
89
+ ref.current.setValueAndFocus('update');
90
+ // 2. editor is rerendered with a new value while a value update is still pending
91
+ value = 'new external value';
92
+ rerender();
93
+ await debounce();
94
+ // expect(onChange).not.toHaveBeenCalled();
95
+ expect(getEditorValue()).toBe('new external value');
96
+ expect(value).toBe('new external value');
97
+ });
98
+ // value updates from outside onExecute are overwritten by pending updates
99
+ test.fails('new props.value set to same value should cancel onChange', async () => {
100
+ // 1. value is set initially
101
+ value = 'same value';
102
+ rerender();
103
+ // 2. value is updated internally
104
+ ref.current.setValueAndFocus('update');
105
+ // 3. editor is rerendered with a new value while a value update is still pending
106
+ value = 'same value';
107
+ rerender();
108
+ await debounce();
109
+ // expect(onChange).not.toHaveBeenCalled();
110
+ expect(getEditorValue()).toBe('same value');
111
+ expect(value).toBe('same value');
112
+ });
113
+ test('rerender should not cancel onChange', async () => {
114
+ // 1. value is updated internally
115
+ ref.current.setValueAndFocus('changed');
116
+ // 2. editor is rerendered while a value update is still pending
117
+ rerender();
118
+ await debounce();
119
+ expect(onChange).toHaveBeenCalledOnce();
120
+ expect(getEditorValue()).toBe('changed');
121
+ expect(value).toBe('changed');
122
+ });
123
+ test('rerender with a previous update should not cancel onChange', async () => {
124
+ // 1. value is updated internally
125
+ ref.current.setValueAndFocus('changed');
126
+ await debounce();
127
+ // 2. value is updated internally again
128
+ ref.current.setValueAndFocus('new change');
129
+ // 3. editor is rerendered while a value update is still pending
130
+ rerender();
131
+ await debounce();
132
+ expect(onChange).toHaveBeenCalledTimes(2);
133
+ expect(getEditorValue()).toBe('new change');
134
+ expect(value).toBe('new change');
135
+ });
136
+ test('rerender with prior external update should not cancel onChange', async () => {
137
+ // 1. value is set initially
138
+ ref.current.setValueAndFocus('initial');
139
+ await debounce();
140
+ // 2. value is updated externally
141
+ value = 'external update';
142
+ rerender();
143
+ // 3. value is updated internally
144
+ ref.current.setValueAndFocus('internal update');
145
+ // 4. editor is rerendered while a value update is still pending
146
+ rerender();
147
+ await debounce();
148
+ expect(getEditorValue()).toBe('internal update');
149
+ expect(value).toBe('internal update');
150
+ });
151
+ test('setValueAndFocus should handle CRLF newline characters', () => {
152
+ expect(() => ref.current.setValueAndFocus('new value\r\nnew line')).not.toThrow();
153
+ });
154
+ //# 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,CAAC,CAAC,CAAS,EAAE,EAAE;IACnC,KAAK,GAAG,CAAC,CAAC;IACV,QAAQ,EAAE,CAAC;AACb,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,wBAAwB,GAAG,IAAI,CAAC;AACvC,MAAM,yBAAyB,GAAG,aAAa,GAAG,GAAG,CAAC;AAEtD,uCAAuC;AACvC,SAAS,cAAc,CAAC,UAAsB;IAC5C,UAAU,CAAC,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;QAC/C,IAAI,EAAE,CAAC;QACP,GAAG,EAAE,CAAC;QACN,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;KACV,CAAC,CAAC;AACL,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,0EAA0E;AAC1E,IAAI,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;IAC9D,iCAAiC;IACjC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAEvC,iFAAiF;IACjF,KAAK,GAAG,oBAAoB,CAAC;IAC7B,QAAQ,EAAE,CAAC;IAEX,MAAM,QAAQ,EAAE,CAAC;IAEjB,2CAA2C;IAC3C,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,0EAA0E;AAC1E,IAAI,CAAC,KAAK,CACR,0DAA0D,EAC1D,KAAK,IAAI,EAAE;IACT,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,KAAK,GAAG,YAAY,CAAC;IACrB,QAAQ,EAAE,CAAC;IAEX,MAAM,QAAQ,EAAE,CAAC;IAEjB,2CAA2C;IAC3C,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACnC,CAAC,CACF,CAAC;AAEF,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,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;AACpF,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"}