@@ -19,6 +19,7 @@ import type {
19
19
StreamLanguage as StreamLanguageType ,
20
20
StreamParser as StreamParserType ,
21
21
} from '@codemirror/language' ;
22
+ import type { Diagnostic } from '@codemirror/lint' ;
22
23
import type { Extension } from '@codemirror/state' ;
23
24
import type { EditorView , ViewUpdate } from '@codemirror/view' ;
24
25
import type Owner from '@ember/owner' ;
@@ -31,6 +32,7 @@ export interface HdsCodeEditorSignature {
31
32
ariaDescribedBy ?: string ;
32
33
ariaLabel ?: string ;
33
34
ariaLabelledBy ?: string ;
35
+ isLintingEnabled ?: boolean ;
34
36
language ?: HdsCodeEditorLanguages ;
35
37
value ?: string ;
36
38
onInput ?: ( newVal : string ) => void ;
@@ -249,80 +251,111 @@ export default class HdsCodeEditorModifier extends Modifier<HdsCodeEditorSignatu
249
251
}
250
252
) ;
251
253
252
- private _buildExtensionsTask = task ( { drop : true } , async ( { language } ) => {
253
- const [
254
- {
255
- EditorView,
256
- keymap,
257
- lineNumbers,
258
- highlightActiveLineGutter,
259
- highlightSpecialChars,
260
- highlightActiveLine,
261
- } ,
262
- { defaultKeymap, history, historyKeymap } ,
263
- { bracketMatching, syntaxHighlighting } ,
264
- ] = await Promise . all ( [
265
- import ( '@codemirror/view' ) ,
266
- import ( '@codemirror/commands' ) ,
267
- import ( '@codemirror/language' ) ,
268
- ] ) ;
269
-
270
- const languageExtension = await this . _loadLanguageTask . perform ( language ) ;
271
-
272
- const handleUpdateExtension = EditorView . updateListener . of (
273
- ( update : ViewUpdate ) => {
274
- // toggle a class if the update has/does not have a selection
275
- if ( update . selectionSet ) {
276
- update . view . dom . classList . toggle (
277
- 'cm-hasSelection' ,
278
- ! update . state . selection . main . empty
279
- ) ;
280
- }
254
+ private _buildExtensionsTask = task (
255
+ { drop : true } ,
256
+ async ( { isLintingEnabled, language } ) => {
257
+ const [
258
+ {
259
+ EditorView,
260
+ keymap,
261
+ lineNumbers,
262
+ highlightActiveLineGutter,
263
+ highlightSpecialChars,
264
+ highlightActiveLine,
265
+ } ,
266
+ { defaultKeymap, history, historyKeymap } ,
267
+ { bracketMatching, syntaxHighlighting } ,
268
+ ] = await Promise . all ( [
269
+ import ( '@codemirror/view' ) ,
270
+ import ( '@codemirror/commands' ) ,
271
+ import ( '@codemirror/language' ) ,
272
+ ] ) ;
273
+
274
+ let lintingExtension : Extension | undefined ;
275
+
276
+ if ( isLintingEnabled ) {
277
+ const [ { linter } , { syntaxTree } ] = await Promise . all ( [
278
+ import ( '@codemirror/lint' ) ,
279
+ import ( '@codemirror/language' ) ,
280
+ ] ) ;
281
+
282
+ lintingExtension = linter (
283
+ ( view ) => {
284
+ console . log ( 'Test linter triggered' , view . state . doc . toString ( ) ) ;
285
+ return [ ] ;
286
+ } ,
287
+ { delay : 0 }
288
+ ) ;
289
+ }
290
+
291
+ console . log ( lintingExtension ) ;
292
+
293
+ const languageExtension = await this . _loadLanguageTask . perform ( language ) ;
294
+
295
+ const handleUpdateExtension = EditorView . updateListener . of (
296
+ ( update : ViewUpdate ) => {
297
+ // toggle a class if the update has/does not have a selection
298
+ if ( update . selectionSet ) {
299
+ update . view . dom . classList . toggle (
300
+ 'cm-hasSelection' ,
301
+ ! update . state . selection . main . empty
302
+ ) ;
303
+ }
281
304
282
- // call the onInput callback if the document has changed
283
- if ( ! update . docChanged || this . onInput === undefined ) {
284
- return ;
305
+ // call the onInput callback if the document has changed
306
+ if ( ! update . docChanged || this . onInput === undefined ) {
307
+ return ;
308
+ }
309
+ this . onInput ( update . state . doc . toString ( ) ) ;
285
310
}
286
- this . onInput ( update . state . doc . toString ( ) ) ;
311
+ ) ;
312
+
313
+ let extensions = [
314
+ bracketMatching ( ) ,
315
+ highlightActiveLine ( ) ,
316
+ highlightActiveLineGutter ( ) ,
317
+ highlightSpecialChars ( ) ,
318
+ history ( ) ,
319
+ lineNumbers ( ) ,
320
+ keymap . of ( [ ...defaultKeymap , ...historyKeymap ] ) ,
321
+ // custom extensions
322
+ handleUpdateExtension ,
323
+ // hds dark theme
324
+ hdsDarkTheme ,
325
+ syntaxHighlighting ( hdsDarkHighlightStyle ) ,
326
+ ] ;
327
+
328
+ if ( languageExtension !== undefined ) {
329
+ extensions = [ languageExtension , ...extensions ] ;
287
330
}
288
- ) ;
289
331
290
- let extensions = [
291
- bracketMatching ( ) ,
292
- highlightActiveLine ( ) ,
293
- highlightActiveLineGutter ( ) ,
294
- highlightSpecialChars ( ) ,
295
- history ( ) ,
296
- lineNumbers ( ) ,
297
- keymap . of ( [ ...defaultKeymap , ...historyKeymap ] ) ,
298
- // custom extensions
299
- handleUpdateExtension ,
300
- // hds dark theme
301
- hdsDarkTheme ,
302
- syntaxHighlighting ( hdsDarkHighlightStyle ) ,
303
- ] ;
304
-
305
- if ( languageExtension !== undefined ) {
306
- extensions = [ languageExtension , ...extensions ] ;
307
- }
332
+ if ( lintingExtension !== undefined ) {
333
+ extensions = [ ...extensions , lintingExtension ] ;
334
+ }
308
335
309
- return extensions ;
310
- } ) ;
336
+ return extensions ;
337
+ }
338
+ ) ;
311
339
312
340
private _createEditorTask = task (
313
341
{ drop : true } ,
314
342
async (
315
343
element : HTMLElement ,
316
344
{
345
+ isLintingEnabled,
317
346
language,
318
347
value,
319
- } : Pick < HdsCodeEditorSignature [ 'Args' ] [ 'Named' ] , 'language' | 'value' >
348
+ } : Pick <
349
+ HdsCodeEditorSignature [ 'Args' ] [ 'Named' ] ,
350
+ 'isLintingEnabled' | 'language' | 'value'
351
+ >
320
352
) => {
321
353
try {
322
354
const { EditorState } = await import ( '@codemirror/state' ) ;
323
355
const { EditorView } = await import ( '@codemirror/view' ) ;
324
356
325
357
const extensions = await this . _buildExtensionsTask . perform ( {
358
+ isLintingEnabled,
326
359
language,
327
360
} ) ;
328
361
@@ -359,6 +392,7 @@ export default class HdsCodeEditorModifier extends Modifier<HdsCodeEditorSignatu
359
392
ariaDescribedBy,
360
393
ariaLabel,
361
394
ariaLabelledBy,
395
+ isLintingEnabled,
362
396
language,
363
397
value,
364
398
} = named ;
@@ -369,6 +403,7 @@ export default class HdsCodeEditorModifier extends Modifier<HdsCodeEditorSignatu
369
403
this . element = element ;
370
404
371
405
const editor = await this . _createEditorTask . perform ( element , {
406
+ isLintingEnabled,
372
407
language,
373
408
value,
374
409
} ) ;
@@ -389,6 +424,10 @@ export default class HdsCodeEditorModifier extends Modifier<HdsCodeEditorSignatu
389
424
ariaLabelledBy,
390
425
} ) ;
391
426
427
+ this . editor . dispatch ( {
428
+ changes : { from : 0 , to : 0 , insert : ' ' } ,
429
+ } ) ;
430
+
392
431
onSetup ?.( this . editor ) ;
393
432
}
394
433
) ;
0 commit comments