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

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 (181) hide show
  1. package/CHANGELOG.md +350 -0
  2. package/README.md +3 -2
  3. package/dist/src/CypherEditor.d.ts +243 -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 +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/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 +335 -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 +227 -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 +194 -0
  44. package/dist/src/editorActions.js.map +1 -0
  45. package/dist/src/historyNavigation.js +163 -0
  46. package/dist/src/historyNavigation.js.map +1 -0
  47. package/dist/src/hostCallbacks.d.ts +9 -0
  48. package/dist/src/hostCallbacks.js +2 -0
  49. package/dist/src/hostCallbacks.js.map +1 -0
  50. package/dist/{types → src}/icons.d.ts +1 -1
  51. package/dist/src/icons.js +62 -0
  52. package/dist/src/icons.js.map +1 -0
  53. package/dist/src/index.d.ts +6 -0
  54. package/dist/src/index.js +5 -0
  55. package/dist/src/index.js.map +1 -0
  56. package/dist/src/inlinePanel.d.ts +27 -0
  57. package/dist/src/inlinePanel.js +86 -0
  58. package/dist/src/inlinePanel.js.map +1 -0
  59. package/dist/src/lang-cypher/autocomplete.d.ts +6 -0
  60. package/dist/src/lang-cypher/autocomplete.js +116 -0
  61. package/dist/src/lang-cypher/autocomplete.js.map +1 -0
  62. package/dist/{types → src}/lang-cypher/constants.d.ts +13 -0
  63. package/dist/src/lang-cypher/constants.js +74 -0
  64. package/dist/src/lang-cypher/constants.js.map +1 -0
  65. package/dist/src/lang-cypher/contants.test.d.ts +1 -0
  66. package/dist/src/lang-cypher/contants.test.js +103 -0
  67. package/dist/src/lang-cypher/contants.test.js.map +1 -0
  68. package/dist/{types/lang-cypher/create-cypher-theme.d.ts → src/lang-cypher/createCypherTheme.d.ts} +12 -1
  69. package/dist/src/lang-cypher/createCypherTheme.js +202 -0
  70. package/dist/src/lang-cypher/createCypherTheme.js.map +1 -0
  71. package/dist/src/lang-cypher/langCypher.d.ts +14 -0
  72. package/dist/src/lang-cypher/langCypher.js +23 -0
  73. package/dist/src/lang-cypher/langCypher.js.map +1 -0
  74. package/dist/src/lang-cypher/lintWorker.mjs +2035 -0
  75. package/dist/src/lang-cypher/parser-adapter.d.ts +19 -0
  76. package/dist/src/lang-cypher/parser-adapter.js +112 -0
  77. package/dist/src/lang-cypher/parser-adapter.js.map +1 -0
  78. package/dist/src/lang-cypher/signatureHelp.d.ts +4 -0
  79. package/dist/src/lang-cypher/signatureHelp.js +108 -0
  80. package/dist/src/lang-cypher/signatureHelp.js.map +1 -0
  81. package/dist/{types/lang-cypher/syntax-validation.d.ts → src/lang-cypher/syntaxValidation.d.ts} +2 -1
  82. package/dist/src/lang-cypher/syntaxValidation.js +60 -0
  83. package/dist/src/lang-cypher/syntaxValidation.js.map +1 -0
  84. package/dist/src/lang-cypher/themeIcons.js +22 -0
  85. package/dist/src/lang-cypher/themeIcons.js.map +1 -0
  86. package/dist/src/lang-cypher/utils.d.ts +2 -0
  87. package/dist/src/lang-cypher/utils.js +10 -0
  88. package/dist/src/lang-cypher/utils.js.map +1 -0
  89. package/dist/src/ndlTokensCopy.d.ts +570 -0
  90. package/dist/src/ndlTokensCopy.js +571 -0
  91. package/dist/src/ndlTokensCopy.js.map +1 -0
  92. package/dist/src/ndlTokensCopy.test.d.ts +1 -0
  93. package/dist/src/ndlTokensCopy.test.js +12 -0
  94. package/dist/src/ndlTokensCopy.test.js.map +1 -0
  95. package/dist/src/neo4jSetup.d.ts +6 -0
  96. package/dist/src/neo4jSetup.js +120 -0
  97. package/dist/src/neo4jSetup.js.map +1 -0
  98. package/dist/src/richClipboardCopier.d.ts +4 -0
  99. package/dist/src/richClipboardCopier.js +78 -0
  100. package/dist/src/richClipboardCopier.js.map +1 -0
  101. package/dist/src/richClipboardCopier.test.d.ts +1 -0
  102. package/dist/src/richClipboardCopier.test.js +53 -0
  103. package/dist/src/richClipboardCopier.test.js.map +1 -0
  104. package/dist/src/themes.d.ts +5 -0
  105. package/dist/src/themes.js +107 -0
  106. package/dist/src/themes.js.map +1 -0
  107. package/dist/tsconfig.tsbuildinfo +1 -0
  108. package/package.json +62 -62
  109. package/src/CypherEditor.test.tsx +203 -0
  110. package/src/CypherEditor.tsx +584 -48
  111. package/src/constants.ts +1 -0
  112. package/src/diffView.ts +24 -0
  113. package/src/e2e_tests/autoCompletion.spec.tsx +577 -0
  114. package/src/e2e_tests/configuration.spec.tsx +111 -0
  115. package/src/e2e_tests/debounce.spec.tsx +102 -0
  116. package/src/e2e_tests/{e2e-utils.ts → e2eUtils.ts} +41 -3
  117. package/src/e2e_tests/{extra-keybindings.spec.tsx → extraKeybindings.spec.tsx} +1 -3
  118. package/src/e2e_tests/{history-navigation.spec.tsx → historyNavigation.spec.tsx} +137 -18
  119. package/src/e2e_tests/performanceTest.spec.tsx +163 -0
  120. package/src/e2e_tests/{sanity-checks.spec.tsx → sanityChecks.spec.tsx} +28 -20
  121. package/src/e2e_tests/signatureHelp.spec.tsx +443 -0
  122. package/src/e2e_tests/snippets.spec.tsx +19 -0
  123. package/src/e2e_tests/{syntax-highlighting.spec.tsx → syntaxHighlighting.spec.tsx} +26 -24
  124. package/src/e2e_tests/syntaxValidation.spec.tsx +252 -0
  125. package/src/editorActions.ts +253 -0
  126. package/src/{history-navigation.ts → historyNavigation.ts} +1 -1
  127. package/src/hostCallbacks.ts +9 -0
  128. package/src/icons.ts +3 -0
  129. package/src/index.ts +4 -2
  130. package/src/inlinePanel.ts +140 -0
  131. package/src/lang-cypher/autocomplete.ts +98 -18
  132. package/src/lang-cypher/constants.ts +32 -0
  133. package/src/lang-cypher/contants.test.ts +7 -3
  134. package/src/lang-cypher/{create-cypher-theme.ts → createCypherTheme.ts} +85 -23
  135. package/src/lang-cypher/langCypher.ts +46 -0
  136. package/src/lang-cypher/lintWorker.mjs +2035 -0
  137. package/src/lang-cypher/parser-adapter.ts +145 -0
  138. package/src/lang-cypher/signatureHelp.ts +154 -0
  139. package/src/lang-cypher/syntaxValidation.ts +76 -0
  140. package/src/lang-cypher/utils.ts +9 -0
  141. package/src/{ndl-tokens-copy.test.ts → ndlTokensCopy.test.ts} +2 -1
  142. package/src/ndlTokensCopy.ts +570 -0
  143. package/src/{neo4j-setup.tsx → neo4jSetup.tsx} +78 -17
  144. package/src/richClipboardCopier.test.ts +65 -0
  145. package/src/richClipboardCopier.ts +99 -0
  146. package/src/themes.ts +61 -69
  147. package/src/viteEnv.d.ts +1 -0
  148. package/dist/cjs/index.cjs +0 -1441
  149. package/dist/cjs/index.cjs.map +0 -7
  150. package/dist/esm/index.mjs +0 -1464
  151. package/dist/esm/index.mjs.map +0 -7
  152. package/dist/types/CypherEditor.d.ts +0 -113
  153. package/dist/types/e2e_tests/mock-data.d.ts +0 -3779
  154. package/dist/types/index.d.ts +0 -4
  155. package/dist/types/lang-cypher/ParserAdapter.d.ts +0 -14
  156. package/dist/types/lang-cypher/autocomplete.d.ts +0 -3
  157. package/dist/types/lang-cypher/lang-cypher.d.ts +0 -7
  158. package/dist/types/ndl-tokens-copy.d.ts +0 -379
  159. package/dist/types/neo4j-setup.d.ts +0 -2
  160. package/dist/types/themes.d.ts +0 -11
  161. package/dist/types/tsconfig.tsbuildinfo +0 -1
  162. package/src/e2e_tests/auto-completion.spec.tsx +0 -232
  163. package/src/e2e_tests/mock-data.ts +0 -4310
  164. package/src/e2e_tests/performance-test.spec.tsx +0 -71
  165. package/src/e2e_tests/syntax-validation.spec.tsx +0 -156
  166. package/src/lang-cypher/ParserAdapter.ts +0 -92
  167. package/src/lang-cypher/lang-cypher.ts +0 -32
  168. package/src/lang-cypher/syntax-validation.ts +0 -24
  169. package/src/ndl-tokens-copy.ts +0 -379
  170. /package/dist/{types/e2e_tests/auto-completion.spec.d.ts → src/CypherEditor.test.d.ts} +0 -0
  171. /package/dist/{types/e2e_tests/extra-keybindings.spec.d.ts → src/e2e_tests/autoCompletion.spec.d.ts} +0 -0
  172. /package/dist/{types/e2e_tests/history-navigation.spec.d.ts → src/e2e_tests/configuration.spec.d.ts} +0 -0
  173. /package/dist/{types/e2e_tests/performance-test.spec.d.ts → src/e2e_tests/debounce.spec.d.ts} +0 -0
  174. /package/dist/{types/e2e_tests/sanity-checks.spec.d.ts → src/e2e_tests/extraKeybindings.spec.d.ts} +0 -0
  175. /package/dist/{types/e2e_tests/syntax-highlighting.spec.d.ts → src/e2e_tests/historyNavigation.spec.d.ts} +0 -0
  176. /package/dist/{types/e2e_tests/syntax-validation.spec.d.ts → src/e2e_tests/sanityChecks.spec.d.ts} +0 -0
  177. /package/dist/{types/lang-cypher/contants.test.d.ts → src/e2e_tests/signatureHelp.spec.d.ts} +0 -0
  178. /package/dist/{types/ndl-tokens-copy.test.d.ts → src/e2e_tests/snippets.spec.d.ts} +0 -0
  179. /package/dist/{types/history-navigation.d.ts → src/historyNavigation.d.ts} +0 -0
  180. /package/dist/{types/lang-cypher/theme-icons.d.ts → src/lang-cypher/themeIcons.d.ts} +0 -0
  181. /package/src/lang-cypher/{theme-icons.ts → themeIcons.ts} +0 -0
@@ -0,0 +1,513 @@
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 { createInlinePanelController, } from './inlinePanel';
6
+ import { createDiffExtension } from './diffView';
7
+ import { createEditorActionsController, } from './editorActions';
8
+ import { formatQuery, CypherLanguageService, } from '@neo4j-cypher/language-support';
9
+ import debounce from 'lodash.debounce';
10
+ import { Component, createRef } from 'react';
11
+ import { createPortal } from 'react-dom';
12
+ import { DEBOUNCE_TIME } from './constants';
13
+ import { replaceHistory, replMode as historyNavigation, } from './historyNavigation';
14
+ import { cypher } from './lang-cypher/langCypher';
15
+ import { cleanupWorkers } from './lang-cypher/syntaxValidation';
16
+ import { basicNeo4jSetup } from './neo4jSetup';
17
+ import { getThemeExtension } from './themes';
18
+ import { richClipboardCopier } from './richClipboardCopier';
19
+ import workerpool from 'workerpool';
20
+ /**
21
+ * Normalize CRLF line endings to LF, which is what CodeMirror expects.
22
+ * CodeMirror collapses `\r\n` into a single line break, so a raw `value`
23
+ * string with CRLF endings is longer than the resulting document. Normalizing
24
+ * up front keeps the document length in sync with the value length used for
25
+ * cursor placement, and avoids "Selection points outside of document" errors.
26
+ * https://codemirror.net/docs/ref/#state.EditorState^lineSeparator
27
+ */
28
+ function normalizeLineEndings(value) {
29
+ return value.replace(/\r\n/g, '\n');
30
+ }
31
+ const format = (view) => {
32
+ try {
33
+ const doc = view.state.doc.toString();
34
+ const { formattedQuery, newCursorPos } = formatQuery(doc, {
35
+ cursorPosition: view.state.selection.main.anchor,
36
+ });
37
+ view.dispatch({
38
+ changes: {
39
+ from: 0,
40
+ to: doc.length,
41
+ insert: formattedQuery,
42
+ },
43
+ selection: { anchor: newCursorPos },
44
+ });
45
+ }
46
+ catch {
47
+ // Formatting failed, likely because of a syntax error
48
+ }
49
+ };
50
+ const executeKeybinding = (onExecute, newLineOnEnter, flush) => {
51
+ const keybindings = {
52
+ 'Shift-Enter': {
53
+ key: 'Shift-Enter',
54
+ run: insertNewline,
55
+ },
56
+ 'Ctrl-Enter': {
57
+ key: 'Ctrl-Enter',
58
+ run: () => true,
59
+ },
60
+ Enter: {
61
+ key: 'Enter',
62
+ run: insertNewline,
63
+ },
64
+ };
65
+ if (onExecute) {
66
+ keybindings['Ctrl-Enter'] = {
67
+ key: 'Ctrl-Enter',
68
+ mac: 'Mod-Enter',
69
+ preventDefault: true,
70
+ run: (view) => {
71
+ const doc = view.state.doc.toString();
72
+ if (doc.trim() !== '') {
73
+ flush?.();
74
+ onExecute(doc);
75
+ }
76
+ return true;
77
+ },
78
+ };
79
+ if (!newLineOnEnter) {
80
+ keybindings['Enter'] = {
81
+ key: 'Enter',
82
+ preventDefault: true,
83
+ run: (view) => {
84
+ const doc = view.state.doc.toString();
85
+ if (doc.includes('\n')) {
86
+ // Returning false means the event will mark the event
87
+ // as not handled and the default behavior will be executed
88
+ return false;
89
+ }
90
+ if (doc.trim() !== '') {
91
+ flush?.();
92
+ onExecute(doc);
93
+ }
94
+ return true;
95
+ },
96
+ };
97
+ }
98
+ }
99
+ return Object.values(keybindings);
100
+ };
101
+ const themeCompartment = new Compartment();
102
+ const keyBindingCompartment = new Compartment();
103
+ const lineNumbersCompartment = new Compartment();
104
+ const readOnlyCompartment = new Compartment();
105
+ const placeholderCompartment = new Compartment();
106
+ const domEventHandlerCompartment = new Compartment();
107
+ const diffCompartment = new Compartment();
108
+ const formatLineNumber = (prompt) => (a, state) => {
109
+ if (state.doc.lines === 1 && prompt !== undefined) {
110
+ return prompt;
111
+ }
112
+ return a.toString();
113
+ };
114
+ const ExternalEdit = Annotation.define();
115
+ const WorkerURL = new URL('./lang-cypher/lintWorker.mjs', import.meta.url)
116
+ .pathname;
117
+ class CodemirrorSymbolFetcher {
118
+ constructor(languageService) {
119
+ this.languageService = languageService;
120
+ }
121
+ languageService;
122
+ processing = false;
123
+ nextJob;
124
+ symbolTablePool = workerpool.pool(WorkerURL, {
125
+ minWorkers: 1,
126
+ workerOpts: { type: 'module' },
127
+ workerTerminateTimeout: 2000,
128
+ });
129
+ queueSymbolJob(query, schema) {
130
+ this.nextJob = { query, schema };
131
+ if (!this.processing) {
132
+ void this.processJobQueue();
133
+ }
134
+ }
135
+ terminate() {
136
+ this.nextJob = undefined;
137
+ void this.symbolTablePool.terminate();
138
+ }
139
+ async processJobQueue() {
140
+ this.processing = true;
141
+ while (this.nextJob) {
142
+ try {
143
+ const query = this.nextJob.query;
144
+ const dbSchema = this.nextJob.schema;
145
+ this.nextJob = undefined;
146
+ const proxyWorker = (await this.symbolTablePool.proxy());
147
+ const result = await proxyWorker.lintCypherQuery(query, dbSchema);
148
+ if (result.symbolTables) {
149
+ this.languageService.setSymbolsInfo({
150
+ query,
151
+ symbolTables: result.symbolTables,
152
+ });
153
+ }
154
+ }
155
+ catch (err) {
156
+ //eslint-disable-next-line
157
+ console.log('Symbol table calculation failed ' + String(err));
158
+ }
159
+ }
160
+ this.processing = false;
161
+ }
162
+ }
163
+ export class CypherEditor extends Component {
164
+ /**
165
+ * The symbol fetcher object used to fetch the current symbol table on document changes
166
+ */
167
+ symbolFetcher;
168
+ /**
169
+ * The codemirror editor container.
170
+ */
171
+ editorContainer = createRef();
172
+ /**
173
+ * The codemirror editor state.
174
+ */
175
+ editorState = createRef();
176
+ /**
177
+ * The codemirror editor view.
178
+ */
179
+ editorView = createRef();
180
+ schemaRef = createRef();
181
+ inlinePanelController = null;
182
+ editorActionsController = null;
183
+ state = {
184
+ editorActionsContainer: null,
185
+ };
186
+ editorActionsCallbacks = {
187
+ onMount: (container) => this.setState({ editorActionsContainer: container }),
188
+ onUnmount: () => this.setState({ editorActionsContainer: null }),
189
+ };
190
+ /**
191
+ * Format Cypher query
192
+ */
193
+ format() {
194
+ format(this.editorView.current);
195
+ }
196
+ /**
197
+ * Focus the editor
198
+ */
199
+ focus() {
200
+ this.editorView.current?.focus();
201
+ }
202
+ /**
203
+ * Move the cursor to the supplied position.
204
+ * For example, to move the cursor to the end of the editor, use `value.length`
205
+ */
206
+ updateCursorPosition(position) {
207
+ const view = this.editorView.current;
208
+ if (!view) {
209
+ return;
210
+ }
211
+ // Clamp to the doc length; `position` may come from a raw value longer than
212
+ // the doc (e.g. CRLF endings), which would throw "Selection points outside
213
+ // of document".
214
+ const clamped = Math.max(0, Math.min(position, view.state.doc.length));
215
+ view.dispatch({
216
+ selection: { anchor: clamped, head: clamped },
217
+ });
218
+ }
219
+ /**
220
+ * Externally set the editor value and focus the editor.
221
+ */
222
+ setValueAndFocus(value = '') {
223
+ const currentCmValue = this.editorView.current.state?.doc.toString() ?? '';
224
+ const normalizedValue = normalizeLineEndings(value);
225
+ this.editorView.current.dispatch({
226
+ changes: {
227
+ from: 0,
228
+ to: currentCmValue.length,
229
+ insert: normalizedValue,
230
+ },
231
+ selection: {
232
+ anchor: normalizedValue.length,
233
+ head: normalizedValue.length,
234
+ },
235
+ });
236
+ this.editorView.current?.focus();
237
+ }
238
+ static defaultProps = {
239
+ lint: true,
240
+ schema: {},
241
+ overrideThemeBackgroundColor: false,
242
+ lineWrap: false,
243
+ showSignatureTooltipBelow: true,
244
+ extraKeybindings: [],
245
+ history: [],
246
+ theme: 'light',
247
+ lineNumbers: true,
248
+ newLineOnEnter: false,
249
+ moveFocusOnTab: false,
250
+ };
251
+ debouncedOnChange = this.props.onChange
252
+ ? debounce(((value, viewUpdate) => {
253
+ this.props.onChange(value, viewUpdate);
254
+ }), DEBOUNCE_TIME)
255
+ : undefined;
256
+ componentDidMount() {
257
+ const { theme, extraKeybindings, lineWrap, overrideThemeBackgroundColor, schema, lint, showSignatureTooltipBelow, featureFlags, onExecute, newLineOnEnter, } = this.props;
258
+ this.schemaRef.current = {
259
+ languageService: new CypherLanguageService(),
260
+ schema,
261
+ lint,
262
+ showSignatureTooltipBelow,
263
+ featureFlags: {
264
+ consoleCommands: true,
265
+ ...featureFlags,
266
+ },
267
+ useLightVersion: false,
268
+ setUseLightVersion: (newVal) => {
269
+ if (this.schemaRef.current !== undefined) {
270
+ this.schemaRef.current.useLightVersion = newVal;
271
+ }
272
+ },
273
+ };
274
+ this.symbolFetcher = new CodemirrorSymbolFetcher(this.schemaRef.current.languageService);
275
+ const themeExtension = getThemeExtension(theme, overrideThemeBackgroundColor);
276
+ this.inlinePanelController = createInlinePanelController();
277
+ this.editorActionsController = createEditorActionsController();
278
+ const changeListener = this.debouncedOnChange
279
+ ? [
280
+ EditorView.updateListener.of((upt) => {
281
+ if (upt.docChanged) {
282
+ this.symbolFetcher.queueSymbolJob(upt.state.doc.toString(), this.schemaRef.current.schema);
283
+ }
284
+ const wasUserEdit = !upt.transactions.some((tr) => tr.annotation(ExternalEdit));
285
+ if (upt.docChanged && wasUserEdit) {
286
+ const doc = upt.state.doc;
287
+ const value = doc.toString();
288
+ this.debouncedOnChange(value, upt);
289
+ }
290
+ }),
291
+ ]
292
+ : [];
293
+ this.editorState.current = EditorState.create({
294
+ extensions: [
295
+ keyBindingCompartment.of(keymap.of([
296
+ ...executeKeybinding(onExecute, newLineOnEnter, () => this.debouncedOnChange?.flush()),
297
+ ...extraKeybindings,
298
+ ])),
299
+ richClipboardCopier,
300
+ historyNavigation(this.props),
301
+ basicNeo4jSetup(this.props),
302
+ themeCompartment.of(themeExtension),
303
+ changeListener,
304
+ cypher(this.schemaRef.current),
305
+ lineWrap ? EditorView.lineWrapping : [],
306
+ lineNumbersCompartment.of(this.props.lineNumbers
307
+ ? lineNumbers({ formatNumber: formatLineNumber(this.props.prompt) })
308
+ : []),
309
+ readOnlyCompartment.of(EditorState.readOnly.of(this.props.readonly)),
310
+ placeholderCompartment.of(this.props.placeholder ? placeholder(this.props.placeholder) : []),
311
+ domEventHandlerCompartment.of(this.props.domEventHandlers
312
+ ? EditorView.domEventHandlers(this.props.domEventHandlers)
313
+ : []),
314
+ this.props.ariaLabel
315
+ ? EditorView.contentAttributes.of({
316
+ 'aria-label': this.props.ariaLabel,
317
+ })
318
+ : [],
319
+ !this.props.moveFocusOnTab
320
+ ? EditorView.contentAttributes.of({
321
+ 'aria-description': 'Press Escape to leave the editor and continue tabbing through the page',
322
+ })
323
+ : [],
324
+ this.inlinePanelController.extension,
325
+ diffCompartment.of(this.props.diff ? createDiffExtension(this.props.diff) : []),
326
+ this.editorActionsController.extension,
327
+ ],
328
+ doc: normalizeLineEndings(this.props.value ?? ''),
329
+ });
330
+ this.editorView.current = new EditorView({
331
+ state: this.editorState.current,
332
+ parent: this.editorContainer.current,
333
+ });
334
+ if (this.props.autofocus) {
335
+ this.focus();
336
+ if (this.props.value) {
337
+ this.updateCursorPosition(this.props.value.length);
338
+ }
339
+ }
340
+ else if (this.props.offset) {
341
+ this.updateCursorPosition(this.props.offset);
342
+ }
343
+ if (this.props.inlinePanel) {
344
+ this.openInlinePanel(this.props.inlinePanel);
345
+ }
346
+ if (this.props.editorActions != null) {
347
+ this.setEditorActions(true);
348
+ }
349
+ }
350
+ setEditorActions(active) {
351
+ const view = this.editorView.current;
352
+ const controller = this.editorActionsController;
353
+ if (!view || !controller) {
354
+ return;
355
+ }
356
+ view.dispatch({
357
+ effects: controller.set(active ? this.editorActionsCallbacks : null),
358
+ });
359
+ }
360
+ openInlinePanel(props) {
361
+ const view = this.editorView.current;
362
+ const controller = this.inlinePanelController;
363
+ if (!view || !controller) {
364
+ return;
365
+ }
366
+ const pos = Math.max(0, Math.min(props.pos, view.state.doc.length));
367
+ const line = view.state.doc.lineAt(pos);
368
+ controller.updateCallbacks({
369
+ onMount: props.onMount,
370
+ onUnmount: props.onUnmount,
371
+ });
372
+ view.dispatch({
373
+ effects: controller.show({
374
+ pos: props.placement === 'below' ? line.to : line.from,
375
+ placement: props.placement,
376
+ onMount: props.onMount,
377
+ onUnmount: props.onUnmount,
378
+ }),
379
+ });
380
+ }
381
+ updateInlinePanel(props) {
382
+ this.inlinePanelController?.updateCallbacks({
383
+ onMount: props.onMount,
384
+ onUnmount: props.onUnmount,
385
+ });
386
+ }
387
+ closeInlinePanel() {
388
+ const view = this.editorView.current;
389
+ const controller = this.inlinePanelController;
390
+ if (!view || !controller) {
391
+ return;
392
+ }
393
+ view.dispatch({ effects: controller.hide() });
394
+ }
395
+ componentDidUpdate(prevProps) {
396
+ if (!this.editorView.current) {
397
+ return;
398
+ }
399
+ // Handle externally set value
400
+ const currentCmValue = this.editorView.current.state?.doc.toString() ?? '';
401
+ if (this.props.value !== undefined && // If the component becomes uncontolled, we just leave the value as is
402
+ this.props.value !== prevProps.value && // The value prop has changed, we need to update the editor
403
+ this.props.value !== currentCmValue // No need to dispatch an update if the value is the same
404
+ ) {
405
+ this.editorView.current.dispatch({
406
+ changes: {
407
+ from: 0,
408
+ to: currentCmValue.length,
409
+ insert: normalizeLineEndings(this.props.value ?? ''),
410
+ },
411
+ annotations: [ExternalEdit.of(true)],
412
+ });
413
+ }
414
+ // Handle theme change
415
+ const didChangeTheme = prevProps.theme !== this.props.theme ||
416
+ prevProps.overrideThemeBackgroundColor !==
417
+ this.props.overrideThemeBackgroundColor;
418
+ if (didChangeTheme) {
419
+ this.editorView.current.dispatch({
420
+ effects: themeCompartment.reconfigure(getThemeExtension(this.props.theme, this.props.overrideThemeBackgroundColor)),
421
+ });
422
+ }
423
+ if (prevProps.lineNumbers !== this.props.lineNumbers ||
424
+ prevProps.prompt !== this.props.prompt) {
425
+ this.editorView.current.dispatch({
426
+ effects: lineNumbersCompartment.reconfigure(this.props.lineNumbers
427
+ ? lineNumbers({ formatNumber: formatLineNumber(this.props.prompt) })
428
+ : []),
429
+ });
430
+ }
431
+ if (prevProps.readonly !== this.props.readonly) {
432
+ this.editorView.current.dispatch({
433
+ effects: readOnlyCompartment.reconfigure(EditorState.readOnly.of(this.props.readonly)),
434
+ });
435
+ }
436
+ if (prevProps.placeholder !== this.props.placeholder) {
437
+ this.editorView.current.dispatch({
438
+ effects: placeholderCompartment.reconfigure(this.props.placeholder ? placeholder(this.props.placeholder) : []),
439
+ });
440
+ }
441
+ if (prevProps.extraKeybindings !== this.props.extraKeybindings ||
442
+ prevProps.onExecute !== this.props.onExecute) {
443
+ this.editorView.current.dispatch({
444
+ effects: keyBindingCompartment.reconfigure(keymap.of([
445
+ ...executeKeybinding(this.props.onExecute, this.props.newLineOnEnter, () => this.debouncedOnChange?.flush()),
446
+ ...this.props.extraKeybindings,
447
+ ])),
448
+ });
449
+ }
450
+ const prevPanel = prevProps.inlinePanel;
451
+ const nextPanel = this.props.inlinePanel;
452
+ if (prevPanel !== nextPanel) {
453
+ if (!nextPanel) {
454
+ this.closeInlinePanel();
455
+ }
456
+ else if (!prevPanel ||
457
+ prevPanel.pos !== nextPanel.pos ||
458
+ prevPanel.placement !== nextPanel.placement) {
459
+ this.openInlinePanel(nextPanel);
460
+ }
461
+ else {
462
+ this.updateInlinePanel(nextPanel);
463
+ }
464
+ }
465
+ if (prevProps.diff?.original !== this.props.diff?.original) {
466
+ this.editorView.current.dispatch({
467
+ effects: diffCompartment.reconfigure(this.props.diff ? createDiffExtension(this.props.diff) : []),
468
+ });
469
+ }
470
+ const hadActions = prevProps.editorActions != null;
471
+ const hasActions = this.props.editorActions != null;
472
+ if (hadActions !== hasActions) {
473
+ this.setEditorActions(hasActions);
474
+ }
475
+ if (prevProps.domEventHandlers !== this.props.domEventHandlers) {
476
+ this.editorView.current.dispatch({
477
+ effects: domEventHandlerCompartment.reconfigure(this.props.domEventHandlers
478
+ ? EditorView.domEventHandlers(this.props.domEventHandlers)
479
+ : []),
480
+ });
481
+ }
482
+ // This component rerenders on every keystroke and comparing the
483
+ // full lists of editor strings on every render could be expensive.
484
+ const didChangeHistoryEstimate = prevProps.history?.length !== this.props.history?.length ||
485
+ prevProps.history?.[0] !== this.props.history?.[0];
486
+ if (didChangeHistoryEstimate) {
487
+ this.editorView.current.dispatch({
488
+ effects: replaceHistory.of(this.props.history ?? []),
489
+ });
490
+ }
491
+ /*
492
+ The cypher configuration is a mutable object that is passed to the cypher language extension.
493
+ Much like how the schema based completions work in the official sql language extension.
494
+ https://github.com/codemirror/lang-sql/blob/4b7b2564dff7cdb1a15f8ccd08142f2cc8a0006f/src/sql.ts#L178C17-L178C18
495
+ */
496
+ this.schemaRef.current.schema = this.props.schema;
497
+ this.schemaRef.current.lint = this.props.lint;
498
+ this.schemaRef.current.featureFlags = this.props.featureFlags;
499
+ }
500
+ componentWillUnmount() {
501
+ this.editorView.current?.destroy();
502
+ this.symbolFetcher?.terminate();
503
+ cleanupWorkers();
504
+ }
505
+ render() {
506
+ const { className, theme } = this.props;
507
+ const themeClass = typeof theme === 'string' ? `cm-theme-${theme}` : 'cm-theme';
508
+ const { editorActionsContainer } = this.state;
509
+ return (_jsx("div", { ref: this.editorContainer, className: `${themeClass}${className ? ` ${className}` : ''}`, children: editorActionsContainer &&
510
+ createPortal(this.props.editorActions, editorActionsContainer) }));
511
+ }
512
+ }
513
+ //# sourceMappingURL=CypherEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CypherEditor.js","sourceRoot":"","sources":["../../src/CypherEditor.tsx"],"names":[],"mappings":"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"}