@eccenca/gui-elements 24.0.1 → 24.1.0-rc.0

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 (53) hide show
  1. package/CHANGELOG.md +7 -5
  2. package/dist/cjs/cmem/react-flow/StickyNoteModal/StickyNoteModal.js +3 -3
  3. package/dist/cjs/cmem/react-flow/StickyNoteModal/StickyNoteModal.js.map +1 -1
  4. package/dist/cjs/components/AutoSuggestion/ExtendedCodeEditor.js +3 -3
  5. package/dist/cjs/components/AutoSuggestion/ExtendedCodeEditor.js.map +1 -1
  6. package/dist/cjs/extensions/codemirror/CodeMirror.js +58 -6
  7. package/dist/cjs/extensions/codemirror/CodeMirror.js.map +1 -1
  8. package/dist/cjs/extensions/codemirror/debouncedLinter.js +18 -0
  9. package/dist/cjs/extensions/codemirror/debouncedLinter.js.map +1 -0
  10. package/dist/cjs/extensions/codemirror/hooks/useCodemirrorModeExtension.hooks.js +9 -18
  11. package/dist/cjs/extensions/codemirror/hooks/useCodemirrorModeExtension.hooks.js.map +1 -1
  12. package/dist/cjs/extensions/codemirror/linters/jsLinter.js +36 -0
  13. package/dist/cjs/extensions/codemirror/linters/jsLinter.js.map +1 -0
  14. package/dist/cjs/extensions/codemirror/linters/turtleLinter.js +81 -0
  15. package/dist/cjs/extensions/codemirror/linters/turtleLinter.js.map +1 -0
  16. package/dist/cjs/extensions/codemirror/types.js +3 -0
  17. package/dist/cjs/extensions/codemirror/types.js.map +1 -0
  18. package/dist/esm/cmem/react-flow/StickyNoteModal/StickyNoteModal.js +4 -4
  19. package/dist/esm/cmem/react-flow/StickyNoteModal/StickyNoteModal.js.map +1 -1
  20. package/dist/esm/components/AutoSuggestion/ExtendedCodeEditor.js +14 -3
  21. package/dist/esm/components/AutoSuggestion/ExtendedCodeEditor.js.map +1 -1
  22. package/dist/esm/extensions/codemirror/CodeMirror.js +58 -7
  23. package/dist/esm/extensions/codemirror/CodeMirror.js.map +1 -1
  24. package/dist/esm/extensions/codemirror/debouncedLinter.js +15 -0
  25. package/dist/esm/extensions/codemirror/debouncedLinter.js.map +1 -0
  26. package/dist/esm/extensions/codemirror/hooks/useCodemirrorModeExtension.hooks.js +6 -15
  27. package/dist/esm/extensions/codemirror/hooks/useCodemirrorModeExtension.hooks.js.map +1 -1
  28. package/dist/esm/extensions/codemirror/linters/jsLinter.js +32 -0
  29. package/dist/esm/extensions/codemirror/linters/jsLinter.js.map +1 -0
  30. package/dist/esm/extensions/codemirror/linters/turtleLinter.js +77 -0
  31. package/dist/esm/extensions/codemirror/linters/turtleLinter.js.map +1 -0
  32. package/dist/esm/extensions/codemirror/types.js +2 -0
  33. package/dist/esm/extensions/codemirror/types.js.map +1 -0
  34. package/dist/types/cmem/react-flow/StickyNoteModal/StickyNoteModal.d.ts +5 -1
  35. package/dist/types/components/AutoSuggestion/ExtendedCodeEditor.d.ts +11 -6
  36. package/dist/types/extensions/codemirror/CodeMirror.d.ts +23 -5
  37. package/dist/types/extensions/codemirror/debouncedLinter.d.ts +4 -0
  38. package/dist/types/extensions/codemirror/hooks/useCodemirrorModeExtension.hooks.d.ts +3 -5
  39. package/dist/types/extensions/codemirror/linters/jsLinter.d.ts +5 -0
  40. package/dist/types/extensions/codemirror/linters/turtleLinter.d.ts +5 -0
  41. package/dist/types/extensions/codemirror/types.d.ts +5 -0
  42. package/package.json +6 -5
  43. package/src/cmem/react-flow/StickyNoteModal/StickyNoteModal.tsx +16 -2
  44. package/src/components/AutoSuggestion/ExtendedCodeEditor.tsx +29 -6
  45. package/src/components/TextField/stories/TextField.stories.tsx +2 -1
  46. package/src/extensions/codemirror/CodeMirror.stories.tsx +30 -0
  47. package/src/extensions/codemirror/CodeMirror.tsx +86 -9
  48. package/src/extensions/codemirror/_codemirror.scss +96 -0
  49. package/src/extensions/codemirror/debouncedLinter.ts +26 -0
  50. package/src/extensions/codemirror/hooks/useCodemirrorModeExtension.hooks.ts +6 -16
  51. package/src/extensions/codemirror/linters/jsLinter.ts +38 -0
  52. package/src/extensions/codemirror/linters/turtleLinter.ts +102 -0
  53. package/src/extensions/codemirror/types.ts +7 -0
@@ -0,0 +1,102 @@
1
+ import { Diagnostic, linter } from "@codemirror/lint";
2
+ import { EditorView } from "@codemirror/view";
3
+ import { Parser } from "n3";
4
+
5
+ import { debouncedLinter } from "../debouncedLinter";
6
+ import { ExtensionCreator, Linter } from "../types";
7
+
8
+ const parser = new Parser();
9
+
10
+ const EMPTY_RESOURCE = "<>";
11
+
12
+ const getError = (message: string, view: EditorView) => {
13
+ const lineMatch = message.match(/(?<=line )\d{1,}/);
14
+ const valueMatch = message.match(/"([^"]*)"/);
15
+
16
+ const lineNumber = lineMatch ? Number(lineMatch[0]) : 1;
17
+ // the [1] index is used to get the caputre group
18
+ const errorContent = valueMatch && valueMatch[1];
19
+
20
+ const line = view.state.doc.line(lineNumber);
21
+ const position = line.text.search(errorContent ?? /\S/);
22
+
23
+ const from = line.from + position;
24
+ const errorLength = errorContent?.length;
25
+
26
+ return { from, to: errorLength ? from + errorLength : line.to };
27
+ };
28
+
29
+ const getQuadError = (view: EditorView) => {
30
+ const lines = view.state.doc.toJSON();
31
+
32
+ for (let i = 0; i < lines.length; i += 1) {
33
+ const input = lines[i].trim();
34
+
35
+ if (!input) {
36
+ continue;
37
+ }
38
+
39
+ if (input.includes(EMPTY_RESOURCE)) {
40
+ // i + 1 is used here because the codemirror uses 1-indexes
41
+ const line = view.state.doc.line(i + 1);
42
+ const position = line.text.search(EMPTY_RESOURCE);
43
+
44
+ const from = line.from + position;
45
+
46
+ return {
47
+ from,
48
+ to: from + EMPTY_RESOURCE.length,
49
+ };
50
+ }
51
+ }
52
+
53
+ return { from: 0, to: view.state.doc.length };
54
+ };
55
+
56
+ const n3Linter: Linter = (view) => {
57
+ const diagnostics: Array<Diagnostic> = [];
58
+ const value = view.state.doc.toString();
59
+
60
+ try {
61
+ const quads = parser.parse(value);
62
+
63
+ quads.forEach((quad) => {
64
+ if (!quad.subject || !quad.predicate || !quad.object) {
65
+ const { from, to } = getQuadError(view);
66
+
67
+ view.dispatch({
68
+ scrollIntoView: true,
69
+ });
70
+
71
+ diagnostics.push({
72
+ from,
73
+ to,
74
+ severity: "error",
75
+ message: `Invalid RDF quad:\n\nsubject: ${quad.subject}\npredicate: ${quad.predicate}\nobject: ${quad.object}`,
76
+ });
77
+ }
78
+ });
79
+ } catch (error) {
80
+ const { message } = error as Error;
81
+
82
+ const { from, to } = getError(message, view);
83
+
84
+ view.dispatch({
85
+ scrollIntoView: true,
86
+ });
87
+
88
+ diagnostics.push({
89
+ from,
90
+ to,
91
+ severity: "error",
92
+ message: (error as Error).message,
93
+ });
94
+ }
95
+
96
+ return diagnostics;
97
+ };
98
+
99
+ /**
100
+ * Sets up the turtle linter. Documentation: https://codemirror.net/examples/lint/
101
+ */
102
+ export const turtleLinter: ExtensionCreator = () => linter(debouncedLinter(n3Linter));
@@ -0,0 +1,7 @@
1
+ import { Diagnostic } from "@codemirror/lint";
2
+ import { Extension } from "@codemirror/state";
3
+ import { EditorView } from "@codemirror/view";
4
+
5
+ export type Linter = (view: EditorView) => ReadonlyArray<Diagnostic> | Promise<ReadonlyArray<Diagnostic>>;
6
+
7
+ export type ExtensionCreator<T = unknown> = (options?: T) => Extension;