@harborclient/sdk 1.0.25 → 1.0.26
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.
- package/dist/components/CodeEditor/index.d.ts +6 -1
- package/dist/components/CodeEditor/index.d.ts.map +1 -1
- package/dist/components/CodeEditor/index.js +11 -1
- package/dist/components/CodeEditor/syntaxLinters.d.ts +10 -0
- package/dist/components/CodeEditor/syntaxLinters.d.ts.map +1 -0
- package/dist/components/CodeEditor/syntaxLinters.js +36 -0
- package/package.json +2 -1
|
@@ -174,6 +174,11 @@ export interface Props {
|
|
|
174
174
|
* Called when the user presses Enter on a complete slash command line.
|
|
175
175
|
*/
|
|
176
176
|
onSlashCommand?: (trigger: CodeEditorSlashTrigger) => void;
|
|
177
|
+
/**
|
|
178
|
+
* When true, shows inline syntax-error squiggles for supported languages.
|
|
179
|
+
* Defaults to true.
|
|
180
|
+
*/
|
|
181
|
+
lint?: boolean;
|
|
177
182
|
/**
|
|
178
183
|
* When set, overrides the persisted CodeMirror theme (used by the settings preview).
|
|
179
184
|
*/
|
|
@@ -213,5 +218,5 @@ export interface Props {
|
|
|
213
218
|
* Styling relies on host CSS variables (`--mac-*`, `--font-mono`) and the `.app-no-drag`
|
|
214
219
|
* class defined in HarborClient `styles.css`.
|
|
215
220
|
*/
|
|
216
|
-
export declare function CodeEditor({ value, onChange, language, readOnly, editable, placeholder, placeholderHighlight, minHeight, height, onHeightChange, initialScrollTop, initialSelection, onViewStateChange, className, variables, onEditVariable, completionSource, slashCommands, onSlashCommand, themeOverride, setupOverride, fontSize, id, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedBy }: Props): JSX.Element;
|
|
221
|
+
export declare function CodeEditor({ value, onChange, language, readOnly, editable, placeholder, placeholderHighlight, minHeight, height, onHeightChange, initialScrollTop, initialSelection, onViewStateChange, className, variables, onEditVariable, completionSource, slashCommands, onSlashCommand, lint, themeOverride, setupOverride, fontSize, id, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedBy }: Props): JSX.Element;
|
|
217
222
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CodeEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmC,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA0BlG,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CodeEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmC,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AA0BlG,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAUjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,OAAO,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,MAAM,EAAE,qBAAqB,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,wBAAwB,CAAC;CACrC;AAED,MAAM,WAAW,KAAK;IACpB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnC;;OAEG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAE5C;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;IAE5C;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAEzD;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IAEvB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAE5B;;OAEG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAEpC;;OAEG;IACH,aAAa,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAEzC;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAE3D;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,aAAa,CAAC,EAAE,eAAe,CAAC;IAEhC;;OAEG;IACH,aAAa,CAAC,EAAE,eAAe,CAAC;IAEhC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAE5C;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAyXD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,QAAiB,EACjB,QAAgB,EAChB,QAAQ,EACR,WAAW,EACX,oBAA4B,EAC5B,SAAmB,EACnB,MAAM,EACN,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,SAAc,EACd,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,IAAW,EACX,aAAa,EACb,aAAa,EACb,QAAQ,EACR,EAAE,EACF,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,cAAc,EAAE,WAAW,EAC3B,kBAAkB,EAAE,eAAe,EACpC,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CAwdrB"}
|
|
@@ -14,6 +14,7 @@ import { useCodeEditorConfig } from './config.js';
|
|
|
14
14
|
import { createBuiltInSyntaxHighlighting, createEditorTheme } from './editorChrome.js';
|
|
15
15
|
import { createSlashCommandHighlighter } from './slashCommandHighlighter.js';
|
|
16
16
|
import { createSyntaxHighlightedPlaceholder } from './syntaxHighlightedPlaceholder.js';
|
|
17
|
+
import { createJavascriptSyntaxLinter, createJsonSyntaxLinter } from './syntaxLinters.js';
|
|
17
18
|
import { getCodeEditorThemeExtension } from './themes.js';
|
|
18
19
|
export { CODE_EDITOR_THEME_OPTIONS } from './themes.js';
|
|
19
20
|
/**
|
|
@@ -321,7 +322,7 @@ const RESIZE_GRIP_PX = 16;
|
|
|
321
322
|
* Styling relies on host CSS variables (`--mac-*`, `--font-mono`) and the `.app-no-drag`
|
|
322
323
|
* class defined in HarborClient `styles.css`.
|
|
323
324
|
*/
|
|
324
|
-
export function CodeEditor({ value, onChange, language = 'text', readOnly = false, editable, placeholder, placeholderHighlight = false, minHeight = '144px', height, onHeightChange, initialScrollTop, initialSelection, onViewStateChange, className = '', variables, onEditVariable, completionSource, slashCommands, onSlashCommand, themeOverride, setupOverride, fontSize, id, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedBy }) {
|
|
325
|
+
export function CodeEditor({ value, onChange, language = 'text', readOnly = false, editable, placeholder, placeholderHighlight = false, minHeight = '144px', height, onHeightChange, initialScrollTop, initialSelection, onViewStateChange, className = '', variables, onEditVariable, completionSource, slashCommands, onSlashCommand, lint = true, themeOverride, setupOverride, fontSize, id, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedBy }) {
|
|
325
326
|
const config = useCodeEditorConfig();
|
|
326
327
|
const resolvedTheme = themeOverride ?? config.theme;
|
|
327
328
|
const resolvedSetup = setupOverride ?? (readOnly ? null : config.setup);
|
|
@@ -572,6 +573,14 @@ export function CodeEditor({ value, onChange, language = 'text', readOnly = fals
|
|
|
572
573
|
if (language === 'shell') {
|
|
573
574
|
next.push(StreamLanguage.define(shell));
|
|
574
575
|
}
|
|
576
|
+
if (lint) {
|
|
577
|
+
if (language === 'json') {
|
|
578
|
+
next.push(createJsonSyntaxLinter());
|
|
579
|
+
}
|
|
580
|
+
if (language === 'javascript') {
|
|
581
|
+
next.push(createJavascriptSyntaxLinter());
|
|
582
|
+
}
|
|
583
|
+
}
|
|
575
584
|
if (hasVariables) {
|
|
576
585
|
next.push(variableHighlighter, variableTooltip(getVariables, getOnEditVariable), variableSelectionTooltip(tooltipId, (state) => {
|
|
577
586
|
setSelectionTooltipRef.current(state);
|
|
@@ -607,6 +616,7 @@ export function CodeEditor({ value, onChange, language = 'text', readOnly = fals
|
|
|
607
616
|
resolvedTheme,
|
|
608
617
|
isDark,
|
|
609
618
|
language,
|
|
619
|
+
lint,
|
|
610
620
|
hasVariables,
|
|
611
621
|
hasCompletionSource,
|
|
612
622
|
stableCompletionSource,
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Extension } from '@codemirror/state';
|
|
2
|
+
/**
|
|
3
|
+
* Returns a lint extension that underlines JavaScript syntax errors.
|
|
4
|
+
*/
|
|
5
|
+
export declare function createJavascriptSyntaxLinter(): Extension;
|
|
6
|
+
/**
|
|
7
|
+
* Returns a lint extension that underlines JSON parse errors.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createJsonSyntaxLinter(): Extension;
|
|
10
|
+
//# sourceMappingURL=syntaxLinters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntaxLinters.d.ts","sourceRoot":"","sources":["../../../src/components/CodeEditor/syntaxLinters.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAyBnD;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,SAAS,CAExD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,SAAS,CAElD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsonParseLinter } from '@codemirror/lang-json';
|
|
2
|
+
import { syntaxTree } from '@codemirror/language';
|
|
3
|
+
import { linter } from '@codemirror/lint';
|
|
4
|
+
/**
|
|
5
|
+
* Collects Lezer parse-tree error nodes as CodeMirror diagnostics.
|
|
6
|
+
*
|
|
7
|
+
* @param view - CodeMirror editor view instance.
|
|
8
|
+
*/
|
|
9
|
+
function collectJavascriptSyntaxErrors(view) {
|
|
10
|
+
const diagnostics = [];
|
|
11
|
+
syntaxTree(view.state)
|
|
12
|
+
.cursor()
|
|
13
|
+
.iterate((node) => {
|
|
14
|
+
if (node.type.isError) {
|
|
15
|
+
diagnostics.push({
|
|
16
|
+
from: node.from,
|
|
17
|
+
to: node.to,
|
|
18
|
+
severity: 'error',
|
|
19
|
+
message: 'Syntax error'
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return diagnostics;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Returns a lint extension that underlines JavaScript syntax errors.
|
|
27
|
+
*/
|
|
28
|
+
export function createJavascriptSyntaxLinter() {
|
|
29
|
+
return linter(collectJavascriptSyntaxErrors);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Returns a lint extension that underlines JSON parse errors.
|
|
33
|
+
*/
|
|
34
|
+
export function createJsonSyntaxLinter() {
|
|
35
|
+
return linter(jsonParseLinter());
|
|
36
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@harborclient/sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.26",
|
|
4
4
|
"description": "TypeScript SDK for HarborClient development.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"harborclient",
|
|
@@ -163,6 +163,7 @@
|
|
|
163
163
|
"@codemirror/autocomplete": "^6.20.3",
|
|
164
164
|
"@codemirror/lang-javascript": "^6.2.4",
|
|
165
165
|
"@codemirror/lang-json": "^6.0.2",
|
|
166
|
+
"@codemirror/lint": "^6.9.7",
|
|
166
167
|
"@codemirror/language": "^6.12.3",
|
|
167
168
|
"@codemirror/legacy-modes": "^6.5.3",
|
|
168
169
|
"@codemirror/state": "^6.6.0",
|