@neo4j-cypher/react-codemirror 1.0.4 → 2.0.0-canary-a1ed8f3

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 (127) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/LICENSE.md +201 -0
  3. package/README.md +29 -27
  4. package/dist/CypherEditor.d.ts +153 -0
  5. package/dist/CypherEditor.js +242 -0
  6. package/dist/CypherEditor.js.map +1 -0
  7. package/dist/e2e_tests/autoCompletion.spec.d.ts +1 -0
  8. package/dist/e2e_tests/autoCompletion.spec.js +133 -0
  9. package/dist/e2e_tests/autoCompletion.spec.js.map +1 -0
  10. package/dist/e2e_tests/configuration.spec.d.ts +1 -0
  11. package/dist/e2e_tests/configuration.spec.js +73 -0
  12. package/dist/e2e_tests/configuration.spec.js.map +1 -0
  13. package/dist/e2e_tests/e2eUtils.d.ts +12 -0
  14. package/dist/e2e_tests/e2eUtils.js +60 -0
  15. package/dist/e2e_tests/e2eUtils.js.map +1 -0
  16. package/dist/e2e_tests/extraKeybindings.spec.d.ts +1 -0
  17. package/dist/e2e_tests/extraKeybindings.spec.js +44 -0
  18. package/dist/e2e_tests/extraKeybindings.spec.js.map +1 -0
  19. package/dist/e2e_tests/historyNavigation.spec.d.ts +1 -0
  20. package/dist/e2e_tests/historyNavigation.spec.js +136 -0
  21. package/dist/e2e_tests/historyNavigation.spec.js.map +1 -0
  22. package/dist/e2e_tests/performanceTest.spec.d.ts +6 -0
  23. package/dist/e2e_tests/performanceTest.spec.js +96 -0
  24. package/dist/e2e_tests/performanceTest.spec.js.map +1 -0
  25. package/dist/e2e_tests/sanityChecks.spec.d.ts +1 -0
  26. package/dist/e2e_tests/sanityChecks.spec.js +56 -0
  27. package/dist/e2e_tests/sanityChecks.spec.js.map +1 -0
  28. package/dist/e2e_tests/signatureHelp.spec.d.ts +1 -0
  29. package/dist/e2e_tests/signatureHelp.spec.js +152 -0
  30. package/dist/e2e_tests/signatureHelp.spec.js.map +1 -0
  31. package/dist/e2e_tests/snippets.spec.d.ts +1 -0
  32. package/dist/e2e_tests/snippets.spec.js +63 -0
  33. package/dist/e2e_tests/snippets.spec.js.map +1 -0
  34. package/dist/e2e_tests/syntaxHighlighting.spec.d.ts +1 -0
  35. package/dist/e2e_tests/syntaxHighlighting.spec.js +91 -0
  36. package/dist/e2e_tests/syntaxHighlighting.spec.js.map +1 -0
  37. package/dist/e2e_tests/syntaxValidation.spec.d.ts +1 -0
  38. package/dist/e2e_tests/syntaxValidation.spec.js +79 -0
  39. package/dist/e2e_tests/syntaxValidation.spec.js.map +1 -0
  40. package/dist/historyNavigation.d.ts +7 -0
  41. package/dist/historyNavigation.js +163 -0
  42. package/dist/historyNavigation.js.map +1 -0
  43. package/dist/icons.d.ts +2 -0
  44. package/dist/icons.js +62 -0
  45. package/dist/icons.js.map +1 -0
  46. package/dist/index.d.ts +4 -0
  47. package/dist/index.js +5 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/lang-cypher/autocomplete.d.ts +3 -0
  50. package/dist/lang-cypher/autocomplete.js +62 -0
  51. package/dist/lang-cypher/autocomplete.js.map +1 -0
  52. package/dist/lang-cypher/constants.d.ts +40 -0
  53. package/dist/lang-cypher/constants.js +65 -0
  54. package/dist/lang-cypher/constants.js.map +1 -0
  55. package/dist/lang-cypher/contants.test.d.ts +1 -0
  56. package/dist/lang-cypher/contants.test.js +102 -0
  57. package/dist/lang-cypher/contants.test.js.map +1 -0
  58. package/dist/lang-cypher/createCypherTheme.d.ts +26 -0
  59. package/dist/lang-cypher/createCypherTheme.js +172 -0
  60. package/dist/lang-cypher/createCypherTheme.js.map +1 -0
  61. package/dist/lang-cypher/langCypher.d.ts +9 -0
  62. package/dist/lang-cypher/langCypher.js +24 -0
  63. package/dist/lang-cypher/langCypher.js.map +1 -0
  64. package/dist/lang-cypher/lintWorker.d.ts +8 -0
  65. package/dist/lang-cypher/lintWorker.js +4 -0
  66. package/dist/lang-cypher/lintWorker.js.map +1 -0
  67. package/dist/lang-cypher/parser-adapter.d.ts +19 -0
  68. package/dist/lang-cypher/parser-adapter.js +113 -0
  69. package/dist/lang-cypher/parser-adapter.js.map +1 -0
  70. package/dist/lang-cypher/signatureHelp.d.ts +4 -0
  71. package/dist/lang-cypher/signatureHelp.js +93 -0
  72. package/dist/lang-cypher/signatureHelp.js.map +1 -0
  73. package/dist/lang-cypher/syntaxValidation.d.ts +5 -0
  74. package/dist/lang-cypher/syntaxValidation.js +71 -0
  75. package/dist/lang-cypher/syntaxValidation.js.map +1 -0
  76. package/dist/lang-cypher/themeIcons.d.ts +7 -0
  77. package/dist/lang-cypher/themeIcons.js +22 -0
  78. package/dist/lang-cypher/themeIcons.js.map +1 -0
  79. package/dist/ndlTokensCopy.d.ts +379 -0
  80. package/dist/ndlTokensCopy.js +380 -0
  81. package/dist/ndlTokensCopy.js.map +1 -0
  82. package/dist/ndlTokensCopy.test.d.ts +1 -0
  83. package/dist/ndlTokensCopy.test.js +11 -0
  84. package/dist/ndlTokensCopy.test.js.map +1 -0
  85. package/dist/neo4jSetup.d.ts +2 -0
  86. package/dist/neo4jSetup.js +120 -0
  87. package/dist/neo4jSetup.js.map +1 -0
  88. package/dist/themes.d.ts +11 -0
  89. package/dist/themes.js +114 -0
  90. package/dist/themes.js.map +1 -0
  91. package/dist/tsconfig.tsbuildinfo +1 -0
  92. package/package.json +60 -37
  93. package/src/CypherEditor.tsx +461 -0
  94. package/src/e2e_tests/autoCompletion.spec.tsx +236 -0
  95. package/src/e2e_tests/configuration.spec.tsx +97 -0
  96. package/src/e2e_tests/e2eUtils.ts +85 -0
  97. package/src/e2e_tests/extraKeybindings.spec.tsx +57 -0
  98. package/src/e2e_tests/historyNavigation.spec.tsx +196 -0
  99. package/src/e2e_tests/performanceTest.spec.tsx +158 -0
  100. package/src/e2e_tests/sanityChecks.spec.tsx +78 -0
  101. package/src/e2e_tests/signatureHelp.spec.tsx +309 -0
  102. package/src/e2e_tests/snippets.spec.tsx +94 -0
  103. package/src/e2e_tests/syntaxHighlighting.spec.tsx +198 -0
  104. package/src/e2e_tests/syntaxValidation.spec.tsx +156 -0
  105. package/src/historyNavigation.ts +191 -0
  106. package/src/icons.ts +90 -0
  107. package/src/index.ts +4 -0
  108. package/src/lang-cypher/autocomplete.ts +81 -0
  109. package/src/lang-cypher/constants.ts +84 -0
  110. package/src/lang-cypher/contants.test.ts +104 -0
  111. package/src/lang-cypher/createCypherTheme.ts +240 -0
  112. package/src/lang-cypher/langCypher.ts +41 -0
  113. package/src/lang-cypher/lintWorker.ts +14 -0
  114. package/src/lang-cypher/parser-adapter.ts +145 -0
  115. package/src/lang-cypher/signatureHelp.ts +131 -0
  116. package/src/lang-cypher/syntaxValidation.ts +99 -0
  117. package/src/lang-cypher/themeIcons.ts +27 -0
  118. package/src/ndlTokensCopy.test.ts +11 -0
  119. package/src/ndlTokensCopy.ts +379 -0
  120. package/src/neo4jSetup.tsx +179 -0
  121. package/src/themes.ts +132 -0
  122. package/es/CypherEditor.js +0 -262
  123. package/es/react-codemirror.js +0 -1
  124. package/lib/CypherEditor.js +0 -272
  125. package/lib/react-codemirror.js +0 -13
  126. package/src/CypherEditor.d.ts +0 -310
  127. package/src/react-codemirror.d.ts +0 -18
@@ -0,0 +1,242 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Annotation, Compartment, EditorState, } from '@codemirror/state';
3
+ import { EditorView, keymap, lineNumbers, placeholder, } from '@codemirror/view';
4
+ import debounce from 'lodash.debounce';
5
+ import { Component, createRef } from 'react';
6
+ import { replaceHistory, replMode as historyNavigation, } from './historyNavigation';
7
+ import { cypher } from './lang-cypher/langCypher';
8
+ import { cleanupWorkers } from './lang-cypher/syntaxValidation';
9
+ import { basicNeo4jSetup } from './neo4jSetup';
10
+ import { getThemeExtension } from './themes';
11
+ const executeKeybinding = (onExecute) => onExecute
12
+ ? [
13
+ {
14
+ key: 'Ctrl-Enter',
15
+ mac: 'Mod-Enter',
16
+ preventDefault: true,
17
+ run: (view) => {
18
+ const doc = view.state.doc.toString();
19
+ if (doc.trim() !== '') {
20
+ onExecute(doc);
21
+ }
22
+ return true;
23
+ },
24
+ },
25
+ ]
26
+ : [];
27
+ const themeCompartment = new Compartment();
28
+ const keyBindingCompartment = new Compartment();
29
+ const lineNumbersCompartment = new Compartment();
30
+ const readOnlyCompartment = new Compartment();
31
+ const placeholderCompartment = new Compartment();
32
+ const domEventHandlerCompartment = new Compartment();
33
+ const formatLineNumber = (prompt) => (a, state) => {
34
+ if (state.doc.lines === 1 && prompt !== undefined) {
35
+ return prompt;
36
+ }
37
+ return a.toString();
38
+ };
39
+ const ExternalEdit = Annotation.define();
40
+ export class CypherEditor extends Component {
41
+ /**
42
+ * The codemirror editor container.
43
+ */
44
+ editorContainer = createRef();
45
+ /**
46
+ * The codemirror editor state.
47
+ */
48
+ editorState = createRef();
49
+ /**
50
+ * The codemirror editor view.
51
+ */
52
+ editorView = createRef();
53
+ schemaRef = createRef();
54
+ /**
55
+ * Focus the editor
56
+ */
57
+ focus() {
58
+ this.editorView.current?.focus();
59
+ }
60
+ /**
61
+ * Move the cursor to the supplied position.
62
+ * For example, to move the cursor to the end of the editor, use `value.length`
63
+ */
64
+ updateCursorPosition(position) {
65
+ this.editorView.current?.dispatch({
66
+ selection: { anchor: position, head: position },
67
+ });
68
+ }
69
+ /**
70
+ * Externally set the editor value and focus the editor.
71
+ */
72
+ setValueAndFocus(value = '') {
73
+ const currentCmValue = this.editorView.current.state?.doc.toString() ?? '';
74
+ this.editorView.current.dispatch({
75
+ changes: {
76
+ from: 0,
77
+ to: currentCmValue.length,
78
+ insert: value,
79
+ },
80
+ selection: { anchor: value.length, head: value.length },
81
+ });
82
+ this.editorView.current?.focus();
83
+ }
84
+ static defaultProps = {
85
+ lint: true,
86
+ schema: {},
87
+ overrideThemeBackgroundColor: false,
88
+ lineWrap: false,
89
+ extraKeybindings: [],
90
+ history: [],
91
+ theme: 'light',
92
+ lineNumbers: true,
93
+ };
94
+ debouncedOnChange = this.props.onChange
95
+ ? debounce(this.props.onChange, 200)
96
+ : undefined;
97
+ componentDidMount() {
98
+ const { theme, extraKeybindings, lineWrap, overrideThemeBackgroundColor, schema, lint, onExecute, } = this.props;
99
+ this.schemaRef.current = {
100
+ schema,
101
+ lint,
102
+ useLightVersion: false,
103
+ setUseLightVersion: (newVal) => {
104
+ if (this.schemaRef.current !== undefined) {
105
+ this.schemaRef.current.useLightVersion = newVal;
106
+ }
107
+ },
108
+ };
109
+ const themeExtension = getThemeExtension(theme, overrideThemeBackgroundColor);
110
+ const changeListener = this.debouncedOnChange
111
+ ? [
112
+ EditorView.updateListener.of((upt) => {
113
+ const wasUserEdit = !upt.transactions.some((tr) => tr.annotation(ExternalEdit));
114
+ if (upt.docChanged && wasUserEdit) {
115
+ const doc = upt.state.doc;
116
+ const value = doc.toString();
117
+ this.debouncedOnChange(value, upt);
118
+ }
119
+ }),
120
+ ]
121
+ : [];
122
+ this.editorState.current = EditorState.create({
123
+ extensions: [
124
+ keyBindingCompartment.of(keymap.of([...executeKeybinding(onExecute), ...extraKeybindings])),
125
+ historyNavigation(this.props),
126
+ basicNeo4jSetup(),
127
+ themeCompartment.of(themeExtension),
128
+ changeListener,
129
+ cypher(this.schemaRef.current),
130
+ lineWrap ? EditorView.lineWrapping : [],
131
+ lineNumbersCompartment.of(this.props.lineNumbers
132
+ ? lineNumbers({ formatNumber: formatLineNumber(this.props.prompt) })
133
+ : []),
134
+ readOnlyCompartment.of(EditorState.readOnly.of(this.props.readonly)),
135
+ placeholderCompartment.of(this.props.placeholder ? placeholder(this.props.placeholder) : []),
136
+ domEventHandlerCompartment.of(this.props.domEventHandlers
137
+ ? EditorView.domEventHandlers(this.props.domEventHandlers)
138
+ : []),
139
+ ],
140
+ doc: this.props.value,
141
+ });
142
+ this.editorView.current = new EditorView({
143
+ state: this.editorState.current,
144
+ parent: this.editorContainer.current,
145
+ });
146
+ if (this.props.autofocus) {
147
+ this.focus();
148
+ if (this.props.value) {
149
+ this.updateCursorPosition(this.props.value.length);
150
+ }
151
+ }
152
+ else if (this.props.offset) {
153
+ this.updateCursorPosition(this.props.offset);
154
+ }
155
+ }
156
+ componentDidUpdate(prevProps) {
157
+ if (!this.editorView.current) {
158
+ return;
159
+ }
160
+ // Handle externally set value
161
+ const currentCmValue = this.editorView.current.state?.doc.toString() ?? '';
162
+ if (this.props.value !== undefined && currentCmValue !== this.props.value) {
163
+ this.editorView.current.dispatch({
164
+ changes: {
165
+ from: 0,
166
+ to: currentCmValue.length,
167
+ insert: this.props.value ?? '',
168
+ },
169
+ annotations: [ExternalEdit.of(true)],
170
+ });
171
+ }
172
+ // Handle theme change
173
+ const didChangeTheme = prevProps.theme !== this.props.theme ||
174
+ prevProps.overrideThemeBackgroundColor !==
175
+ this.props.overrideThemeBackgroundColor;
176
+ if (didChangeTheme) {
177
+ this.editorView.current.dispatch({
178
+ effects: themeCompartment.reconfigure(getThemeExtension(this.props.theme, this.props.overrideThemeBackgroundColor)),
179
+ });
180
+ }
181
+ if (prevProps.lineNumbers !== this.props.lineNumbers ||
182
+ prevProps.prompt !== this.props.prompt) {
183
+ this.editorView.current.dispatch({
184
+ effects: lineNumbersCompartment.reconfigure(this.props.lineNumbers
185
+ ? lineNumbers({ formatNumber: formatLineNumber(this.props.prompt) })
186
+ : []),
187
+ });
188
+ }
189
+ if (prevProps.readonly !== this.props.readonly) {
190
+ this.editorView.current.dispatch({
191
+ effects: readOnlyCompartment.reconfigure(EditorState.readOnly.of(this.props.readonly)),
192
+ });
193
+ }
194
+ if (prevProps.placeholder !== this.props.placeholder) {
195
+ this.editorView.current.dispatch({
196
+ effects: placeholderCompartment.reconfigure(this.props.placeholder ? placeholder(this.props.placeholder) : []),
197
+ });
198
+ }
199
+ if (prevProps.extraKeybindings !== this.props.extraKeybindings ||
200
+ prevProps.onExecute !== this.props.onExecute) {
201
+ this.editorView.current.dispatch({
202
+ effects: keyBindingCompartment.reconfigure(keymap.of([
203
+ ...executeKeybinding(this.props.onExecute),
204
+ ...this.props.extraKeybindings,
205
+ ])),
206
+ });
207
+ }
208
+ if (prevProps.domEventHandlers !== this.props.domEventHandlers) {
209
+ this.editorView.current.dispatch({
210
+ effects: domEventHandlerCompartment.reconfigure(this.props.domEventHandlers
211
+ ? EditorView.domEventHandlers(this.props.domEventHandlers)
212
+ : []),
213
+ });
214
+ }
215
+ // This component rerenders on every keystroke and comparing the
216
+ // full lists of editor strings on every render could be expensive.
217
+ const didChangeHistoryEstimate = prevProps.history?.length !== this.props.history?.length ||
218
+ prevProps.history?.[0] !== this.props.history?.[0];
219
+ if (didChangeHistoryEstimate) {
220
+ this.editorView.current.dispatch({
221
+ effects: replaceHistory.of(this.props.history ?? []),
222
+ });
223
+ }
224
+ /*
225
+ The cypher configuration is a mutable object that is passed to the cypher language extension.
226
+ Much like how the schema based completions work in the official sql language extension.
227
+ https://github.com/codemirror/lang-sql/blob/4b7b2564dff7cdb1a15f8ccd08142f2cc8a0006f/src/sql.ts#L178C17-L178C18
228
+ */
229
+ this.schemaRef.current.schema = this.props.schema;
230
+ this.schemaRef.current.lint = this.props.lint;
231
+ }
232
+ componentWillUnmount() {
233
+ this.editorView.current?.destroy();
234
+ cleanupWorkers();
235
+ }
236
+ render() {
237
+ const { className, theme } = this.props;
238
+ const themeClass = typeof theme === 'string' ? `cm-theme-${theme}` : 'cm-theme';
239
+ return (_jsx("div", { ref: this.editorContainer, className: `${themeClass}${className ? ` ${className}` : ''}` }));
240
+ }
241
+ }
242
+ //# 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 @@
1
+ export {};
@@ -0,0 +1,133 @@
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.use({ viewport: { width: 500, height: 500 } });
6
+ test('hello world end 2 end test', async ({ mount }) => {
7
+ const component = await mount(_jsx(CypherEditor, { value: "hello world" }));
8
+ await expect(component).toContainText('hello world');
9
+ await component.update(_jsx(CypherEditor, { value: "RETURN 123" }));
10
+ await expect(component).toContainText('RETURN 123');
11
+ });
12
+ test('can complete in the middle of statement', async ({ mount, page }) => {
13
+ const component = await mount(_jsx(CypherEditor, { value: `MATCH ()
14
+ WHER true
15
+ RETURN n;` }));
16
+ // Move into the statement and trigger autocompletion
17
+ const textField = page.getByRole('textbox');
18
+ await textField.focus();
19
+ await textField.press('ArrowDown');
20
+ await textField.press('ArrowRight');
21
+ await textField.press('ArrowRight');
22
+ await textField.press('ArrowRight');
23
+ await textField.press('ArrowRight');
24
+ await textField.press('Control+ ');
25
+ await expect(page.locator('.cm-tooltip-autocomplete')).toBeVisible();
26
+ await page.locator('.cm-tooltip-autocomplete').getByText('WHERE').click();
27
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
28
+ await expect(component).toContainText('WHERE true');
29
+ });
30
+ test('get completions when typing and can accept completions with tab', async ({ mount, page, }) => {
31
+ const component = await mount(_jsx(CypherEditor, {}));
32
+ const textField = page.getByRole('textbox');
33
+ await textField.fill('RETU');
34
+ await expect(page.locator('.cm-tooltip-autocomplete').getByText('RETURN')).toBeVisible();
35
+ // We need to wait for the editor to realise there is a completion open
36
+ // so that it does not just indent with tab key
37
+ await page.waitForTimeout(500);
38
+ await textField.press('Tab');
39
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
40
+ await expect(component).toContainText('RETURN');
41
+ });
42
+ test('can complete labels', async ({ mount, page }) => {
43
+ const component = await mount(_jsx(CypherEditor, { schema: {
44
+ labels: ['Pokemon'],
45
+ } }));
46
+ const textField = page.getByRole('textbox');
47
+ await textField.fill('MATCH (n :P');
48
+ await page.locator('.cm-tooltip-autocomplete').getByText('Pokemon').click();
49
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
50
+ await expect(component).toContainText('MATCH (n :Pokemon');
51
+ });
52
+ test('can update dbschema', async ({ mount, page }) => {
53
+ const component = await mount(_jsx(CypherEditor, { schema: {
54
+ labels: ['Pokemon'],
55
+ } }));
56
+ const textField = page.getByRole('textbox');
57
+ await textField.fill('MATCH (n :');
58
+ await expect(page.locator('.cm-tooltip-autocomplete').getByText('Pokemon')).toBeVisible();
59
+ await textField.press('Escape');
60
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
61
+ await component.update(_jsx(CypherEditor, { schema: {
62
+ labels: ['Pokemon', 'Digimon'],
63
+ } }));
64
+ await textField.press('Control+ ');
65
+ await expect(page.locator('.cm-tooltip-autocomplete').getByText('Pokemon')).toBeVisible();
66
+ await expect(page.locator('.cm-tooltip-autocomplete').getByText('Digimon')).toBeVisible();
67
+ });
68
+ test('can complete rel types', async ({ page, mount }) => {
69
+ const component = await mount(_jsx(CypherEditor, { schema: {
70
+ relationshipTypes: ['KNOWS'],
71
+ } }));
72
+ const textField = page.getByRole('textbox');
73
+ await textField.fill('MATCH (n)-[:');
74
+ await page.locator('.cm-tooltip-autocomplete').getByText('KNOWS').click();
75
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
76
+ await expect(component).toContainText('MATCH (n)-[:KNOWS');
77
+ });
78
+ test('can complete functions', async ({ page, mount }) => {
79
+ const component = await mount(_jsx(CypherEditor, { schema: {
80
+ functions: {
81
+ function123: {
82
+ ...testData.emptyFunction,
83
+ name: 'function123',
84
+ },
85
+ },
86
+ } }));
87
+ const textField = page.getByRole('textbox');
88
+ await textField.fill('RETURN func');
89
+ await page
90
+ .locator('.cm-tooltip-autocomplete')
91
+ .getByText('function123')
92
+ .click();
93
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
94
+ await expect(component).toContainText('RETURN function123');
95
+ });
96
+ test('can complete procedures', async ({ page, mount }) => {
97
+ const component = await mount(_jsx(CypherEditor, { schema: {
98
+ procedures: {
99
+ 'db.ping': { ...testData.emptyProcedure, name: 'db.ping' },
100
+ },
101
+ } }));
102
+ const textField = page.getByRole('textbox');
103
+ await textField.fill('CALL d');
104
+ await page.locator('.cm-tooltip-autocomplete').getByText('db.ping').click();
105
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
106
+ await expect(component).toContainText('CALL db.ping');
107
+ });
108
+ test('can complete parameters', async ({ page, mount }) => {
109
+ const component = await mount(_jsx(CypherEditor, { schema: {
110
+ parameters: { parameter: { type: 'string' } },
111
+ } }));
112
+ const textField = page.getByRole('textbox');
113
+ await textField.fill('RETURN $p');
114
+ await page.locator('.cm-tooltip-autocomplete').getByText('parameter').click();
115
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
116
+ await expect(component).toContainText('RETURN $parameter');
117
+ });
118
+ test('completes allShortestPaths correctly', async ({ page, mount }) => {
119
+ await mount(_jsx(CypherEditor, { schema: {
120
+ parameters: { parameter: { type: 'string' } },
121
+ } }));
122
+ const textField = page.getByRole('textbox');
123
+ // The first query contains errors on purpose so the
124
+ // syntax errors get triggered before the auto-completion
125
+ await textField.fill('MATCH (n) REURN n; MATCH a');
126
+ await page
127
+ .locator('.cm-tooltip-autocomplete')
128
+ .getByText('allShortestPaths')
129
+ .click();
130
+ await expect(page.locator('.cm-tooltip-autocomplete')).not.toBeVisible();
131
+ expect(await textField.textContent()).toEqual('MATCH (n) REURN n; MATCH allShortestPaths');
132
+ });
133
+ //# 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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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,73 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { expect, test } from '@playwright/experimental-ct-react';
3
+ import { CypherEditor } from '../CypherEditor';
4
+ test.use({ viewport: { width: 500, height: 500 } });
5
+ test('prompt shows up', async ({ mount, page }) => {
6
+ const component = await mount(_jsx(CypherEditor, { prompt: "neo4j>" }));
7
+ await expect(component).toContainText('neo4j>');
8
+ await component.update(_jsx(CypherEditor, { prompt: "test>" }));
9
+ await expect(component).toContainText('test>');
10
+ const textField = page.getByRole('textbox');
11
+ await textField.press('a');
12
+ await expect(textField).toHaveText('a');
13
+ });
14
+ test('line numbers can be turned on/off', async ({ mount }) => {
15
+ const component = await mount(_jsx(CypherEditor, { lineNumbers: true }));
16
+ await expect(component).toContainText('1');
17
+ await component.update(_jsx(CypherEditor, { lineNumbers: false }));
18
+ await expect(component).not.toContainText('1');
19
+ });
20
+ test('can configure readonly', async ({ mount, page }) => {
21
+ const component = await mount(_jsx(CypherEditor, { readonly: true }));
22
+ const textField = page.getByRole('textbox');
23
+ await textField.press('a');
24
+ await expect(textField).not.toHaveText('a');
25
+ await component.update(_jsx(CypherEditor, { readonly: false }));
26
+ await textField.press('b');
27
+ await expect(textField).toHaveText('b');
28
+ });
29
+ test('can set placeholder ', async ({ mount, page }) => {
30
+ const component = await mount(_jsx(CypherEditor, { placeholder: "bulbasaur" }));
31
+ const textField = page.getByRole('textbox');
32
+ await expect(textField).toHaveText('bulbasaur');
33
+ await component.update(_jsx(CypherEditor, { placeholder: "venusaur" }));
34
+ await expect(textField).not.toHaveText('bulbasaur');
35
+ await expect(textField).toHaveText('venusaur');
36
+ await textField.fill('abc');
37
+ await expect(textField).not.toHaveText('venusaur');
38
+ await expect(textField).toHaveText('abc');
39
+ });
40
+ test('can set/unset onFocus/onBlur', async ({ mount, page }) => {
41
+ const component = await mount(_jsx(CypherEditor, {}));
42
+ let focusFireCount = 0;
43
+ let blurFireCount = 0;
44
+ const focus = () => {
45
+ focusFireCount += 1;
46
+ };
47
+ const blur = () => {
48
+ blurFireCount += 1;
49
+ };
50
+ await component.update(_jsx(CypherEditor, { domEventHandlers: { blur, focus } }));
51
+ const textField = page.getByRole('textbox');
52
+ await textField.click();
53
+ await expect(textField).toBeFocused();
54
+ // this is to give the events time to fire
55
+ await expect(() => {
56
+ expect(focusFireCount).toBe(1);
57
+ expect(blurFireCount).toBe(0);
58
+ }).toPass();
59
+ await textField.blur();
60
+ await expect(() => {
61
+ expect(focusFireCount).toBe(1);
62
+ expect(blurFireCount).toBe(1);
63
+ }).toPass();
64
+ await component.update(_jsx(CypherEditor, {}));
65
+ await textField.click();
66
+ await expect(textField).toBeFocused();
67
+ await textField.blur();
68
+ await expect(() => {
69
+ expect(focusFireCount).toBe(1);
70
+ expect(blurFireCount).toBe(1);
71
+ }).toPass();
72
+ });
73
+ //# sourceMappingURL=configuration.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configuration.spec.js","sourceRoot":"","sources":["../../src/e2e_tests/configuration.spec.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;AAEpD,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;IAChD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,KAAC,YAAY,IAAC,MAAM,EAAC,QAAQ,GAAG,CAAC,CAAC;IAEhE,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEhD,MAAM,SAAS,CAAC,MAAM,CAAC,KAAC,YAAY,IAAC,MAAM,EAAC,OAAO,GAAG,CAAC,CAAC;IACxD,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE3B,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;IAC5D,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,KAAC,YAAY,IAAC,WAAW,SAAG,CAAC,CAAC;IAE5D,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAE3C,MAAM,SAAS,CAAC,MAAM,CAAC,KAAC,YAAY,IAAC,WAAW,EAAE,KAAK,GAAI,CAAC,CAAC;IAC7D,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wBAAwB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;IACvD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,KAAC,YAAY,IAAC,QAAQ,SAAG,CAAC,CAAC;IAEzD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAE5C,MAAM,SAAS,CAAC,MAAM,CAAC,KAAC,YAAY,IAAC,QAAQ,EAAE,KAAK,GAAI,CAAC,CAAC;IAC1D,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;IACrD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,KAAC,YAAY,IAAC,WAAW,EAAC,WAAW,GAAG,CAAC,CAAC;IAExE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAEhD,MAAM,SAAS,CAAC,MAAM,CAAC,KAAC,YAAY,IAAC,WAAW,EAAC,UAAU,GAAG,CAAC,CAAC;IAChE,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAE/C,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8BAA8B,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;IAC7D,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC;IAEhD,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,cAAc,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,aAAa,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,SAAS,CAAC,MAAM,CAAC,KAAC,YAAY,IAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAI,CAAC,CAAC;IAE5E,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IACxB,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IAEtC,0CAA0C;IAC1C,MAAM,MAAM,CAAC,GAAG,EAAE;QAChB,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAEZ,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IAEvB,MAAM,MAAM,CAAC,GAAG,EAAE;QAChB,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAEZ,MAAM,SAAS,CAAC,MAAM,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC;IACzC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IACxB,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IAEvB,MAAM,MAAM,CAAC,GAAG,EAAE;QAChB,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AACd,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Locator, Page } from 'playwright/test';
2
+ export declare class CypherEditorPage {
3
+ readonly page: Page;
4
+ constructor(page: Page);
5
+ getEditor(): Locator;
6
+ focusEditor(): Promise<void>;
7
+ editorBackgroundIsUnset(): Promise<boolean>;
8
+ getHexColorOfLocator(locator: Locator): Promise<string>;
9
+ checkErrorMessage(queryChunk: string, expectedMsg: string): Promise<void>;
10
+ checkWarningMessage(queryChunk: string, expectedMsg: string): Promise<void>;
11
+ private checkNotificationMessage;
12
+ }
@@ -0,0 +1,60 @@
1
+ import { expect } from '@playwright/experimental-ct-react';
2
+ export class CypherEditorPage {
3
+ page;
4
+ constructor(page) {
5
+ this.page = page;
6
+ }
7
+ getEditor() {
8
+ return this.page.getByRole('textbox');
9
+ }
10
+ async focusEditor() {
11
+ await this.getEditor().focus();
12
+ }
13
+ editorBackgroundIsUnset() {
14
+ return this.page.locator('.cm-editor').evaluate((e) => {
15
+ const browserDefaultBackgroundColor = 'rgba(0, 0, 0, 0)';
16
+ return (window.getComputedStyle(e).getPropertyValue('background-color') ===
17
+ browserDefaultBackgroundColor);
18
+ });
19
+ }
20
+ getHexColorOfLocator(locator) {
21
+ return locator.evaluate((e) => {
22
+ // https://stackoverflow.com/questions/49974145/how-to-convert-rgba-to-hex-color-code-using-javascript
23
+ function RGBAToHexA(rgba, forceRemoveAlpha = false) {
24
+ return ('#' +
25
+ rgba
26
+ .replace(/^rgba?\(|\s+|\)$/g, '')
27
+ .split(',')
28
+ .filter((string, index) => !forceRemoveAlpha || index !== 3)
29
+ .map((string) => parseFloat(string))
30
+ .map((number, index) => index === 3 ? Math.round(number * 255) : number)
31
+ .map((number) => number.toString(16))
32
+ .map((string) => (string.length === 1 ? '0' + string : string))
33
+ .join(''));
34
+ }
35
+ const color = window.getComputedStyle(e).getPropertyValue('color');
36
+ return RGBAToHexA(color);
37
+ });
38
+ }
39
+ async checkErrorMessage(queryChunk, expectedMsg) {
40
+ return this.checkNotificationMessage('error', queryChunk, expectedMsg);
41
+ }
42
+ async checkWarningMessage(queryChunk, expectedMsg) {
43
+ return this.checkNotificationMessage('warning', queryChunk, expectedMsg);
44
+ }
45
+ async checkNotificationMessage(type, queryChunk, expectedMsg) {
46
+ await expect(this.page.locator('.cm-lintRange-' + type).last()).toBeVisible({ timeout: 3000 });
47
+ await this.page.getByText(queryChunk, { exact: true }).hover();
48
+ await expect(this.page.locator('.cm-tooltip-hover').last()).toBeVisible();
49
+ await expect(this.page.getByText(expectedMsg)).toBeVisible();
50
+ /* Return the mouse to the beginning of the query and
51
+ This is because if for example we have an overlay with a
52
+ first interaction that covers the element we want to perform
53
+ the second interaction on, we won't be able to see that second element
54
+ */
55
+ await this.page.mouse.move(0, 0);
56
+ // Make the sure the tooltip closed
57
+ await expect(this.page.locator('.cm-tooltip-hover').last()).not.toBeVisible();
58
+ }
59
+ }
60
+ //# sourceMappingURL=e2eUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2eUtils.js","sourceRoot":"","sources":["../../src/e2e_tests/e2eUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { expect, test } from '@playwright/experimental-ct-react';
3
+ import { CypherEditor } from '../CypherEditor';
4
+ import { CypherEditorPage } from './e2eUtils';
5
+ test.use({ viewport: { width: 500, height: 500 } });
6
+ test('can add extra keybinding statically', async ({ mount, page }) => {
7
+ const editorPage = new CypherEditorPage(page);
8
+ let hasRun = false;
9
+ const component = await mount(_jsx(CypherEditor, { extraKeybindings: [
10
+ {
11
+ key: 'a',
12
+ preventDefault: true,
13
+ run: () => {
14
+ hasRun = true;
15
+ return true;
16
+ },
17
+ },
18
+ ] }));
19
+ await editorPage.getEditor().press('a');
20
+ await expect(component).not.toHaveText('a');
21
+ expect(hasRun).toBe(true);
22
+ });
23
+ test('can add extra keybinding dymanically', async ({ mount, page }) => {
24
+ const editorPage = new CypherEditorPage(page);
25
+ let hasRun = false;
26
+ const component = await mount(_jsx(CypherEditor, {}));
27
+ await editorPage.getEditor().press('a');
28
+ await editorPage.getEditor().press('Escape');
29
+ await expect(component).toContainText('a');
30
+ await component.update(_jsx(CypherEditor, { extraKeybindings: [
31
+ {
32
+ key: 'a',
33
+ preventDefault: true,
34
+ run: () => {
35
+ hasRun = true;
36
+ return true;
37
+ },
38
+ },
39
+ ] }));
40
+ await editorPage.getEditor().press('a');
41
+ await expect(component).not.toContainText('aa');
42
+ expect(hasRun).toBe(true);
43
+ });
44
+ //# sourceMappingURL=extraKeybindings.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraKeybindings.spec.js","sourceRoot":"","sources":["../../src/e2e_tests/extraKeybindings.spec.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;AAEpD,IAAI,CAAC,qCAAqC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;IACpE,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,SAAS,GAAG,MAAM,KAAK,CAC3B,KAAC,YAAY,IACX,gBAAgB,EAAE;YAChB;gBACE,GAAG,EAAE,GAAG;gBACR,cAAc,EAAE,IAAI;gBACpB,GAAG,EAAE,GAAG,EAAE;oBACR,MAAM,GAAG,IAAI,CAAC;oBACd,OAAO,IAAI,CAAC;gBACd,CAAC;aACF;SACF,GACD,CACH,CAAC;IAEF,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAExC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sCAAsC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;IACrE,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC;IAChD,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAE3C,MAAM,SAAS,CAAC,MAAM,CACpB,KAAC,YAAY,IACX,gBAAgB,EAAE;YAChB;gBACE,GAAG,EAAE,GAAG;gBACR,cAAc,EAAE,IAAI;gBACpB,GAAG,EAAE,GAAG,EAAE;oBACR,MAAM,GAAG,IAAI,CAAC;oBACd,OAAO,IAAI,CAAC;gBACd,CAAC;aACF;SACF,GACD,CACH,CAAC;IAEF,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};