Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/eslint.config.js
3274 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
// @ts-check
6
import fs from 'fs';
7
import path from 'path';
8
import tseslint from 'typescript-eslint';
9
10
import stylisticTs from '@stylistic/eslint-plugin-ts';
11
import * as pluginLocal from './.eslint-plugin-local/index.js';
12
import pluginJsdoc from 'eslint-plugin-jsdoc';
13
14
import pluginHeader from 'eslint-plugin-header';
15
pluginHeader.rules.header.meta.schema = false;
16
17
const ignores = fs.readFileSync(path.join(import.meta.dirname, '.eslint-ignore'), 'utf8')
18
.toString()
19
.split(/\r\n|\n/)
20
.filter(line => line && !line.startsWith('#'));
21
22
export default tseslint.config(
23
// Global ignores
24
{
25
ignores: [
26
...ignores,
27
'!**/.eslint-plugin-local/**/*'
28
],
29
},
30
// All files (JS and TS)
31
{
32
languageOptions: {
33
parser: tseslint.parser,
34
},
35
plugins: {
36
'local': pluginLocal,
37
'header': pluginHeader,
38
},
39
rules: {
40
'constructor-super': 'warn',
41
'curly': 'warn',
42
'eqeqeq': 'warn',
43
'prefer-const': [
44
'warn',
45
{
46
'destructuring': 'all'
47
}
48
],
49
'no-buffer-constructor': 'warn',
50
'no-caller': 'warn',
51
'no-case-declarations': 'warn',
52
'no-debugger': 'warn',
53
'no-duplicate-case': 'warn',
54
'no-duplicate-imports': 'warn',
55
'no-eval': 'warn',
56
'no-async-promise-executor': 'warn',
57
'no-extra-semi': 'warn',
58
'no-new-wrappers': 'warn',
59
'no-redeclare': 'off',
60
'no-sparse-arrays': 'warn',
61
'no-throw-literal': 'warn',
62
'no-unsafe-finally': 'warn',
63
'no-unused-labels': 'warn',
64
'no-misleading-character-class': 'warn',
65
'no-restricted-globals': [
66
'warn',
67
'name',
68
'length',
69
'event',
70
'closed',
71
'external',
72
'status',
73
'origin',
74
'orientation',
75
'context'
76
], // non-complete list of globals that are easy to access unintentionally
77
'no-var': 'warn',
78
'semi': 'off',
79
'local/code-translation-remind': 'warn',
80
'local/code-no-native-private': 'warn',
81
'local/code-parameter-properties-must-have-explicit-accessibility': 'warn',
82
'local/code-no-nls-in-standalone-editor': 'warn',
83
'local/code-no-potentially-unsafe-disposables': 'warn',
84
'local/code-no-dangerous-type-assertions': 'warn',
85
'local/code-no-standalone-editor': 'warn',
86
'local/code-no-unexternalized-strings': 'warn',
87
'local/code-must-use-super-dispose': 'warn',
88
'local/code-declare-service-brand': 'warn',
89
'local/code-no-deep-import-of-internal': ['error', { '.*Internal': true, 'searchExtTypesInternal': false }],
90
'local/code-layering': [
91
'warn',
92
{
93
'common': [],
94
'node': [
95
'common'
96
],
97
'browser': [
98
'common'
99
],
100
'electron-browser': [
101
'common',
102
'browser'
103
],
104
'electron-utility': [
105
'common',
106
'node'
107
],
108
'electron-main': [
109
'common',
110
'node',
111
'electron-utility'
112
]
113
}
114
],
115
'header/header': [
116
2,
117
'block',
118
[
119
'---------------------------------------------------------------------------------------------',
120
' * Copyright (c) Microsoft Corporation. All rights reserved.',
121
' * Licensed under the MIT License. See License.txt in the project root for license information.',
122
' *--------------------------------------------------------------------------------------------'
123
]
124
]
125
},
126
},
127
// TS
128
{
129
files: [
130
'**/*.ts',
131
],
132
languageOptions: {
133
parser: tseslint.parser,
134
},
135
plugins: {
136
'@stylistic/ts': stylisticTs,
137
'@typescript-eslint': tseslint.plugin,
138
'local': pluginLocal,
139
'jsdoc': pluginJsdoc,
140
},
141
rules: {
142
'@stylistic/ts/semi': 'warn',
143
'@stylistic/ts/member-delimiter-style': 'warn',
144
'local/code-no-unused-expressions': [
145
'warn',
146
{
147
'allowTernary': true
148
}
149
],
150
'jsdoc/no-types': 'warn',
151
'local/code-no-static-self-ref': 'warn'
152
}
153
},
154
// vscode TS
155
{
156
files: [
157
'src/**/*.ts',
158
],
159
languageOptions: {
160
parser: tseslint.parser,
161
},
162
plugins: {
163
'@typescript-eslint': tseslint.plugin,
164
},
165
rules: {
166
'@typescript-eslint/naming-convention': [
167
'warn',
168
{
169
'selector': 'class',
170
'format': [
171
'PascalCase'
172
]
173
}
174
]
175
}
176
},
177
// Tests
178
{
179
files: [
180
'**/*.test.ts'
181
],
182
languageOptions: {
183
parser: tseslint.parser,
184
},
185
plugins: {
186
'local': pluginLocal,
187
},
188
rules: {
189
'local/code-must-use-super-dispose': 'off',
190
'local/code-no-test-only': 'error',
191
'local/code-no-test-async-suite': 'warn',
192
'local/code-no-unexternalized-strings': 'off',
193
'local/code-must-use-result': [
194
'warn',
195
[
196
{
197
'message': 'Expression must be awaited',
198
'functions': [
199
'assertSnapshot',
200
'assertHeap'
201
]
202
}
203
]
204
]
205
}
206
},
207
// vscode tests specific rules
208
{
209
files: [
210
'src/vs/**/*.test.ts'
211
],
212
languageOptions: {
213
parser: tseslint.parser,
214
},
215
plugins: {
216
'local': pluginLocal,
217
},
218
rules: {
219
'local/code-ensure-no-disposables-leak-in-test': [
220
'warn',
221
{
222
// Files should (only) be removed from the list they adopt the leak detector
223
'exclude': [
224
'src/vs/workbench/services/userActivity/test/browser/domActivityTracker.test.ts',
225
]
226
}
227
]
228
}
229
},
230
// vscode API
231
{
232
files: [
233
'**/vscode.d.ts',
234
'**/vscode.proposed.*.d.ts'
235
],
236
languageOptions: {
237
parser: tseslint.parser,
238
},
239
plugins: {
240
'local': pluginLocal,
241
},
242
rules: {
243
'no-restricted-syntax': [
244
'warn',
245
{
246
'selector': `TSArrayType > TSUnionType`,
247
'message': 'Use Array<...> for arrays of union types.'
248
},
249
],
250
'local/vscode-dts-create-func': 'warn',
251
'local/vscode-dts-literal-or-types': 'warn',
252
'local/vscode-dts-string-type-literals': 'warn',
253
'local/vscode-dts-interface-naming': 'warn',
254
'local/vscode-dts-cancellation': 'warn',
255
'local/vscode-dts-use-export': 'warn',
256
'local/vscode-dts-use-thenable': 'warn',
257
'local/vscode-dts-vscode-in-comments': 'warn',
258
'local/vscode-dts-provider-naming': [
259
'warn',
260
{
261
'allowed': [
262
'FileSystemProvider',
263
'TreeDataProvider',
264
'TestProvider',
265
'CustomEditorProvider',
266
'CustomReadonlyEditorProvider',
267
'TerminalLinkProvider',
268
'AuthenticationProvider',
269
'NotebookContentProvider'
270
]
271
}
272
],
273
'local/vscode-dts-event-naming': [
274
'warn',
275
{
276
'allowed': [
277
'onCancellationRequested',
278
'event'
279
],
280
'verbs': [
281
'accept',
282
'change',
283
'close',
284
'collapse',
285
'create',
286
'delete',
287
'discover',
288
'dispose',
289
'drop',
290
'edit',
291
'end',
292
'execute',
293
'expand',
294
'grant',
295
'hide',
296
'invalidate',
297
'open',
298
'override',
299
'perform',
300
'receive',
301
'register',
302
'remove',
303
'rename',
304
'save',
305
'send',
306
'start',
307
'terminate',
308
'trigger',
309
'unregister',
310
'write'
311
]
312
}
313
]
314
}
315
},
316
// vscode.d.ts
317
{
318
files: [
319
'**/vscode.d.ts'
320
],
321
languageOptions: {
322
parser: tseslint.parser,
323
},
324
rules: {
325
'jsdoc/tag-lines': 'off',
326
'jsdoc/valid-types': 'off',
327
'jsdoc/no-multi-asterisks': [
328
'warn',
329
{
330
'allowWhitespace': true
331
}
332
],
333
'jsdoc/require-jsdoc': [
334
'warn',
335
{
336
'enableFixer': false,
337
'contexts': [
338
'TSInterfaceDeclaration',
339
'TSPropertySignature',
340
'TSMethodSignature',
341
'TSDeclareFunction',
342
'ClassDeclaration',
343
'MethodDefinition',
344
'PropertyDeclaration',
345
'TSEnumDeclaration',
346
'TSEnumMember',
347
'ExportNamedDeclaration'
348
]
349
}
350
],
351
'jsdoc/check-param-names': [
352
'warn',
353
{
354
'enableFixer': false,
355
'checkDestructured': false
356
}
357
],
358
'jsdoc/require-returns': 'warn'
359
}
360
},
361
// common/browser layer
362
{
363
files: [
364
'src/**/{common,browser}/**/*.ts'
365
],
366
languageOptions: {
367
parser: tseslint.parser,
368
},
369
plugins: {
370
'local': pluginLocal,
371
},
372
rules: {
373
'local/code-amd-node-module': 'warn'
374
}
375
},
376
// node/electron layer
377
{
378
files: [
379
'src/*.ts',
380
'src/**/{node,electron-main,electron-utility}/**/*.ts'
381
],
382
languageOptions: {
383
parser: tseslint.parser,
384
},
385
plugins: {
386
'local': pluginLocal,
387
},
388
rules: {
389
'no-restricted-globals': [
390
'warn',
391
'name',
392
'length',
393
'event',
394
'closed',
395
'external',
396
'status',
397
'origin',
398
'orientation',
399
'context',
400
// Below are globals that are unsupported in ESM
401
'__dirname',
402
'__filename',
403
'require'
404
]
405
}
406
},
407
// browser/electron-browser layer
408
{
409
files: [
410
'src/**/{browser,electron-browser}/**/*.ts'
411
],
412
languageOptions: {
413
parser: tseslint.parser,
414
},
415
plugins: {
416
'local': pluginLocal,
417
},
418
rules: {
419
'local/code-no-global-document-listener': 'warn',
420
'no-restricted-syntax': [
421
'warn',
422
{
423
'selector': `NewExpression[callee.object.name='Intl']`,
424
'message': 'Use safeIntl helper instead for safe and lazy use of potentially expensive Intl methods.'
425
},
426
{
427
'selector': `BinaryExpression[operator='instanceof'][right.name='MouseEvent']`,
428
'message': 'Use DOM.isMouseEvent() to support multi-window scenarios.'
429
},
430
{
431
'selector': `BinaryExpression[operator='instanceof'][right.name=/^HTML\\w+/]`,
432
'message': 'Use DOM.isHTMLElement() and related methods to support multi-window scenarios.'
433
},
434
{
435
'selector': `BinaryExpression[operator='instanceof'][right.name=/^SVG\\w+/]`,
436
'message': 'Use DOM.isSVGElement() and related methods to support multi-window scenarios.'
437
},
438
{
439
'selector': `BinaryExpression[operator='instanceof'][right.name='KeyboardEvent']`,
440
'message': 'Use DOM.isKeyboardEvent() to support multi-window scenarios.'
441
},
442
{
443
'selector': `BinaryExpression[operator='instanceof'][right.name='PointerEvent']`,
444
'message': 'Use DOM.isPointerEvent() to support multi-window scenarios.'
445
},
446
{
447
'selector': `BinaryExpression[operator='instanceof'][right.name='DragEvent']`,
448
'message': 'Use DOM.isDragEvent() to support multi-window scenarios.'
449
},
450
{
451
'selector': `MemberExpression[object.name='document'][property.name='activeElement']`,
452
'message': 'Use <targetWindow>.document.activeElement to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
453
},
454
{
455
'selector': `MemberExpression[object.name='document'][property.name='contains']`,
456
'message': 'Use <targetWindow>.document.contains to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
457
},
458
{
459
'selector': `MemberExpression[object.name='document'][property.name='styleSheets']`,
460
'message': 'Use <targetWindow>.document.styleSheets to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
461
},
462
{
463
'selector': `MemberExpression[object.name='document'][property.name='fullscreenElement']`,
464
'message': 'Use <targetWindow>.document.fullscreenElement to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
465
},
466
{
467
'selector': `MemberExpression[object.name='document'][property.name='body']`,
468
'message': 'Use <targetWindow>.document.body to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
469
},
470
{
471
'selector': `MemberExpression[object.name='document'][property.name='addEventListener']`,
472
'message': 'Use <targetWindow>.document.addEventListener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
473
},
474
{
475
'selector': `MemberExpression[object.name='document'][property.name='removeEventListener']`,
476
'message': 'Use <targetWindow>.document.removeEventListener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
477
},
478
{
479
'selector': `MemberExpression[object.name='document'][property.name='hasFocus']`,
480
'message': 'Use <targetWindow>.document.hasFocus to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
481
},
482
{
483
'selector': `MemberExpression[object.name='document'][property.name='head']`,
484
'message': 'Use <targetWindow>.document.head to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
485
},
486
{
487
'selector': `MemberExpression[object.name='document'][property.name='exitFullscreen']`,
488
'message': 'Use <targetWindow>.document.exitFullscreen to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
489
},
490
{
491
'selector': `MemberExpression[object.name='document'][property.name='getElementById']`,
492
'message': 'Use <targetWindow>.document.getElementById to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
493
},
494
{
495
'selector': `MemberExpression[object.name='document'][property.name='getElementsByClassName']`,
496
'message': 'Use <targetWindow>.document.getElementsByClassName to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
497
},
498
{
499
'selector': `MemberExpression[object.name='document'][property.name='getElementsByName']`,
500
'message': 'Use <targetWindow>.document.getElementsByName to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
501
},
502
{
503
'selector': `MemberExpression[object.name='document'][property.name='getElementsByTagName']`,
504
'message': 'Use <targetWindow>.document.getElementsByTagName to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
505
},
506
{
507
'selector': `MemberExpression[object.name='document'][property.name='getElementsByTagNameNS']`,
508
'message': 'Use <targetWindow>.document.getElementsByTagNameNS to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
509
},
510
{
511
'selector': `MemberExpression[object.name='document'][property.name='getSelection']`,
512
'message': 'Use <targetWindow>.document.getSelection to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
513
},
514
{
515
'selector': `MemberExpression[object.name='document'][property.name='open']`,
516
'message': 'Use <targetWindow>.document.open to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
517
},
518
{
519
'selector': `MemberExpression[object.name='document'][property.name='close']`,
520
'message': 'Use <targetWindow>.document.close to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
521
},
522
{
523
'selector': `MemberExpression[object.name='document'][property.name='documentElement']`,
524
'message': 'Use <targetWindow>.document.documentElement to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
525
},
526
{
527
'selector': `MemberExpression[object.name='document'][property.name='visibilityState']`,
528
'message': 'Use <targetWindow>.document.visibilityState to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
529
},
530
{
531
'selector': `MemberExpression[object.name='document'][property.name='querySelector']`,
532
'message': 'Use <targetWindow>.document.querySelector to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
533
},
534
{
535
'selector': `MemberExpression[object.name='document'][property.name='querySelectorAll']`,
536
'message': 'Use <targetWindow>.document.querySelectorAll to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
537
},
538
{
539
'selector': `MemberExpression[object.name='document'][property.name='elementFromPoint']`,
540
'message': 'Use <targetWindow>.document.elementFromPoint to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
541
},
542
{
543
'selector': `MemberExpression[object.name='document'][property.name='elementsFromPoint']`,
544
'message': 'Use <targetWindow>.document.elementsFromPoint to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
545
},
546
{
547
'selector': `MemberExpression[object.name='document'][property.name='onkeydown']`,
548
'message': 'Use <targetWindow>.document.onkeydown to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
549
},
550
{
551
'selector': `MemberExpression[object.name='document'][property.name='onkeyup']`,
552
'message': 'Use <targetWindow>.document.onkeyup to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
553
},
554
{
555
'selector': `MemberExpression[object.name='document'][property.name='onmousedown']`,
556
'message': 'Use <targetWindow>.document.onmousedown to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
557
},
558
{
559
'selector': `MemberExpression[object.name='document'][property.name='onmouseup']`,
560
'message': 'Use <targetWindow>.document.onmouseup to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
561
},
562
{
563
'selector': `MemberExpression[object.name='document'][property.name='execCommand']`,
564
'message': 'Use <targetWindow>.document.execCommand to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
565
}
566
],
567
'no-restricted-globals': [
568
'warn',
569
'name',
570
'length',
571
'event',
572
'closed',
573
'external',
574
'status',
575
'origin',
576
'orientation',
577
'context',
578
{
579
'name': 'setInterval',
580
'message': 'Use <targetWindow>.setInterval to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
581
},
582
{
583
'name': 'clearInterval',
584
'message': 'Use <targetWindow>.clearInterval to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
585
},
586
{
587
'name': 'requestAnimationFrame',
588
'message': 'Use <targetWindow>.requestAnimationFrame to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
589
},
590
{
591
'name': 'cancelAnimationFrame',
592
'message': 'Use <targetWindow>.cancelAnimationFrame to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
593
},
594
{
595
'name': 'requestIdleCallback',
596
'message': 'Use <targetWindow>.requestIdleCallback to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
597
},
598
{
599
'name': 'cancelIdleCallback',
600
'message': 'Use <targetWindow>.cancelIdleCallback to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
601
},
602
{
603
'name': 'window',
604
'message': 'Use <targetWindow> to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
605
},
606
{
607
'name': 'addEventListener',
608
'message': 'Use <targetWindow>.addEventListener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
609
},
610
{
611
'name': 'removeEventListener',
612
'message': 'Use <targetWindow>.removeEventListener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
613
},
614
{
615
'name': 'getComputedStyle',
616
'message': 'Use <targetWindow>.getComputedStyle to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
617
},
618
{
619
'name': 'focus',
620
'message': 'Use <targetWindow>.focus to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
621
},
622
{
623
'name': 'blur',
624
'message': 'Use <targetWindow>.blur to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
625
},
626
{
627
'name': 'close',
628
'message': 'Use <targetWindow>.close to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
629
},
630
{
631
'name': 'dispatchEvent',
632
'message': 'Use <targetWindow>.dispatchEvent to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
633
},
634
{
635
'name': 'getSelection',
636
'message': 'Use <targetWindow>.getSelection to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
637
},
638
{
639
'name': 'matchMedia',
640
'message': 'Use <targetWindow>.matchMedia to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
641
},
642
{
643
'name': 'open',
644
'message': 'Use <targetWindow>.open to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
645
},
646
{
647
'name': 'parent',
648
'message': 'Use <targetWindow>.parent to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
649
},
650
{
651
'name': 'postMessage',
652
'message': 'Use <targetWindow>.postMessage to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
653
},
654
{
655
'name': 'devicePixelRatio',
656
'message': 'Use <targetWindow>.devicePixelRatio to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
657
},
658
{
659
'name': 'frames',
660
'message': 'Use <targetWindow>.frames to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
661
},
662
{
663
'name': 'frameElement',
664
'message': 'Use <targetWindow>.frameElement to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
665
},
666
{
667
'name': 'innerHeight',
668
'message': 'Use <targetWindow>.innerHeight to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
669
},
670
{
671
'name': 'innerWidth',
672
'message': 'Use <targetWindow>.innerWidth to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
673
},
674
{
675
'name': 'outerHeight',
676
'message': 'Use <targetWindow>.outerHeight to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
677
},
678
{
679
'name': 'outerWidth',
680
'message': 'Use <targetWindow>.outerWidth to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
681
},
682
{
683
'name': 'opener',
684
'message': 'Use <targetWindow>.opener to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
685
},
686
{
687
'name': 'origin',
688
'message': 'Use <targetWindow>.origin to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
689
},
690
{
691
'name': 'screen',
692
'message': 'Use <targetWindow>.screen to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
693
},
694
{
695
'name': 'screenLeft',
696
'message': 'Use <targetWindow>.screenLeft to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
697
},
698
{
699
'name': 'screenTop',
700
'message': 'Use <targetWindow>.screenTop to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
701
},
702
{
703
'name': 'screenX',
704
'message': 'Use <targetWindow>.screenX to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
705
},
706
{
707
'name': 'screenY',
708
'message': 'Use <targetWindow>.screenY to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
709
},
710
{
711
'name': 'scrollX',
712
'message': 'Use <targetWindow>.scrollX to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
713
},
714
{
715
'name': 'scrollY',
716
'message': 'Use <targetWindow>.scrollY to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
717
},
718
{
719
'name': 'top',
720
'message': 'Use <targetWindow>.top to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
721
},
722
{
723
'name': 'visualViewport',
724
'message': 'Use <targetWindow>.visualViewport to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.'
725
}
726
]
727
}
728
},
729
// electron-utility layer
730
{
731
files: [
732
'src/**/electron-utility/**/*.ts'
733
],
734
languageOptions: {
735
parser: tseslint.parser,
736
},
737
rules: {
738
'no-restricted-imports': [
739
'warn',
740
{
741
'paths': [
742
{
743
'name': 'electron',
744
'allowImportNames': [
745
'net',
746
'system-preferences',
747
],
748
'message': 'Only net and system-preferences are allowed to be imported from electron'
749
}
750
]
751
}
752
]
753
}
754
},
755
{
756
files: [
757
'src/**/*.ts'
758
],
759
languageOptions: {
760
parser: tseslint.parser,
761
},
762
plugins: {
763
'local': pluginLocal,
764
},
765
rules: {
766
'local/code-import-patterns': [
767
'warn',
768
{
769
// imports that are allowed in all files of layers:
770
// - browser
771
// - electron-browser
772
'when': 'hasBrowser',
773
'allow': []
774
},
775
{
776
// imports that are allowed in all files of layers:
777
// - node
778
// - electron-utility
779
// - electron-main
780
'when': 'hasNode',
781
'allow': [
782
'@parcel/watcher',
783
'@vscode/sqlite3',
784
'@vscode/vscode-languagedetection',
785
'@vscode/ripgrep',
786
'@vscode/iconv-lite-umd',
787
'@vscode/policy-watcher',
788
'@vscode/proxy-agent',
789
'@vscode/spdlog',
790
'@vscode/windows-process-tree',
791
'assert',
792
'child_process',
793
'console',
794
'cookie',
795
'crypto',
796
'dns',
797
'events',
798
'fs',
799
'fs/promises',
800
'http',
801
'https',
802
'minimist',
803
'node:module',
804
'native-keymap',
805
'native-watchdog',
806
'net',
807
'node-pty',
808
'os',
809
// 'path', NOT allowed: use src/vs/base/common/path.ts instead
810
'perf_hooks',
811
'readline',
812
'stream',
813
'string_decoder',
814
'tas-client-umd',
815
'tls',
816
'undici-types',
817
'url',
818
'util',
819
'v8-inspect-profiler',
820
'vscode-regexpp',
821
'vscode-textmate',
822
'worker_threads',
823
'@xterm/addon-clipboard',
824
'@xterm/addon-image',
825
'@xterm/addon-ligatures',
826
'@xterm/addon-search',
827
'@xterm/addon-serialize',
828
'@xterm/addon-unicode11',
829
'@xterm/addon-webgl',
830
'@xterm/headless',
831
'@xterm/xterm',
832
'yauzl',
833
'yazl',
834
'zlib'
835
]
836
},
837
{
838
// imports that are allowed in all files of layers:
839
// - electron-utility
840
// - electron-main
841
'when': 'hasElectron',
842
'allow': [
843
'electron'
844
]
845
},
846
{
847
// imports that are allowed in all /test/ files
848
'when': 'test',
849
'allow': [
850
'assert',
851
'sinon',
852
'sinon-test'
853
]
854
},
855
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
856
// !!! Do not relax these rules !!!
857
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
858
//
859
// A path ending in /~ has a special meaning. It indicates a template position
860
// which will be substituted with one or more layers.
861
//
862
// When /~ is used in the target, the rule will be expanded to 14 distinct rules.
863
// e.g. 'src/vs/base/~' will be expanded to:
864
// - src/vs/base/common
865
// - src/vs/base/worker
866
// - src/vs/base/browser
867
// - src/vs/base/electron-browser
868
// - src/vs/base/node
869
// - src/vs/base/electron-main
870
// - src/vs/base/test/common
871
// - src/vs/base/test/worker
872
// - src/vs/base/test/browser
873
// - src/vs/base/test/electron-browser
874
// - src/vs/base/test/node
875
// - src/vs/base/test/electron-main
876
//
877
// When /~ is used in the restrictions, it will be replaced with the correct
878
// layers that can be used e.g. 'src/vs/base/electron-browser' will be able
879
// to import '{common,browser,electron-sanbox}', etc.
880
//
881
// It is possible to use /~ in the restrictions property even without using it in
882
// the target property by adding a layer property.
883
{
884
'target': 'src/vs/base/~',
885
'restrictions': [
886
'vs/base/~'
887
]
888
},
889
{
890
'target': 'src/vs/base/parts/*/~',
891
'restrictions': [
892
'vs/base/~',
893
'vs/base/parts/*/~'
894
]
895
},
896
{
897
'target': 'src/vs/platform/*/~',
898
'restrictions': [
899
'vs/base/~',
900
'vs/base/parts/*/~',
901
'vs/platform/*/~',
902
'tas-client-umd', // node module allowed even in /common/
903
'@microsoft/1ds-core-js', // node module allowed even in /common/
904
'@microsoft/1ds-post-js', // node module allowed even in /common/
905
'@xterm/headless' // node module allowed even in /common/
906
]
907
},
908
{
909
'target': 'src/vs/editor/~',
910
'restrictions': [
911
'vs/base/~',
912
'vs/base/parts/*/~',
913
'vs/platform/*/~',
914
'vs/editor/~',
915
'@vscode/tree-sitter-wasm' // node module allowed even in /common/
916
]
917
},
918
{
919
'target': 'src/vs/editor/contrib/*/~',
920
'restrictions': [
921
'vs/base/~',
922
'vs/base/parts/*/~',
923
'vs/platform/*/~',
924
'vs/editor/~',
925
'vs/editor/contrib/*/~'
926
]
927
},
928
{
929
'target': 'src/vs/editor/standalone/~',
930
'restrictions': [
931
'vs/base/~',
932
'vs/base/parts/*/~',
933
'vs/platform/*/~',
934
'vs/editor/~',
935
'vs/editor/contrib/*/~',
936
'vs/editor/standalone/~',
937
'@vscode/tree-sitter-wasm' // type import
938
]
939
},
940
{
941
'target': 'src/vs/editor/editor.all.ts',
942
'layer': 'browser',
943
'restrictions': [
944
'vs/base/~',
945
'vs/base/parts/*/~',
946
'vs/platform/*/~',
947
'vs/editor/~',
948
'vs/editor/contrib/*/~'
949
]
950
},
951
{
952
'target': 'src/vs/editor/editor.worker.start.ts',
953
'layer': 'worker',
954
'restrictions': [
955
'vs/base/~',
956
'vs/base/parts/*/~',
957
'vs/platform/*/~',
958
'vs/editor/~'
959
]
960
},
961
{
962
'target': 'src/vs/editor/{editor.api.ts,editor.main.ts}',
963
'layer': 'browser',
964
'restrictions': [
965
'vs/base/~',
966
'vs/base/parts/*/~',
967
'vs/editor/~',
968
'vs/editor/contrib/*/~',
969
'vs/editor/standalone/~',
970
'vs/editor/*'
971
]
972
},
973
{
974
'target': 'src/vs/workbench/~',
975
'restrictions': [
976
'vs/base/~',
977
'vs/base/parts/*/~',
978
'vs/platform/*/~',
979
'vs/editor/~',
980
'vs/editor/contrib/*/~',
981
'vs/workbench/~',
982
'vs/workbench/services/*/~',
983
'assert',
984
{
985
'when': 'test',
986
'pattern': 'vs/workbench/contrib/*/~'
987
} // TODO@layers
988
]
989
},
990
{
991
'target': 'src/vs/workbench/api/~',
992
'restrictions': [
993
'vscode',
994
'vs/base/~',
995
'vs/base/parts/*/~',
996
'vs/platform/*/~',
997
'vs/editor/~',
998
'vs/editor/contrib/*/~',
999
'vs/workbench/api/~',
1000
'vs/workbench/~',
1001
'vs/workbench/services/*/~',
1002
'vs/workbench/contrib/*/~',
1003
'vs/workbench/contrib/terminalContrib/*/~'
1004
]
1005
},
1006
{
1007
'target': 'src/vs/workbench/services/*/~',
1008
'restrictions': [
1009
'vs/base/~',
1010
'vs/base/parts/*/~',
1011
'vs/platform/*/~',
1012
'vs/editor/~',
1013
'vs/editor/contrib/*/~',
1014
'vs/workbench/~',
1015
'vs/workbench/services/*/~',
1016
{
1017
'when': 'test',
1018
'pattern': 'vs/workbench/contrib/*/~'
1019
}, // TODO@layers
1020
'tas-client-umd', // node module allowed even in /common/
1021
'vscode-textmate', // node module allowed even in /common/
1022
'@vscode/vscode-languagedetection', // node module allowed even in /common/
1023
'@vscode/tree-sitter-wasm', // type import
1024
{
1025
'when': 'hasBrowser',
1026
'pattern': '@xterm/xterm'
1027
} // node module allowed even in /browser/
1028
]
1029
},
1030
{
1031
'target': 'src/vs/workbench/contrib/*/~',
1032
'restrictions': [
1033
'vs/base/~',
1034
'vs/base/parts/*/~',
1035
'vs/platform/*/~',
1036
'vs/editor/~',
1037
'vs/editor/contrib/*/~',
1038
'vs/workbench/~',
1039
'vs/workbench/services/*/~',
1040
'vs/workbench/contrib/*/~',
1041
'vs/workbench/contrib/terminal/terminalContribChatExports*',
1042
'vs/workbench/contrib/terminal/terminalContribExports*',
1043
'vscode-notebook-renderer', // Type only import
1044
'@vscode/tree-sitter-wasm', // type import
1045
{
1046
'when': 'hasBrowser',
1047
'pattern': '@xterm/xterm'
1048
}, // node module allowed even in /browser/
1049
{
1050
'when': 'hasBrowser',
1051
'pattern': '@xterm/addon-*'
1052
}, // node module allowed even in /browser/
1053
{
1054
'when': 'hasBrowser',
1055
'pattern': 'vscode-textmate'
1056
} // node module allowed even in /browser/
1057
]
1058
},
1059
{
1060
'target': 'src/vs/workbench/contrib/terminalContrib/*/~',
1061
'restrictions': [
1062
'vs/base/~',
1063
'vs/base/parts/*/~',
1064
'vs/platform/*/~',
1065
'vs/editor/~',
1066
'vs/editor/contrib/*/~',
1067
'vs/workbench/~',
1068
'vs/workbench/services/*/~',
1069
'vs/workbench/contrib/*/~',
1070
// Only allow terminalContrib to import from itself, this works because
1071
// terminalContrib is one extra folder deep
1072
'vs/workbench/contrib/terminalContrib/*/~',
1073
'vscode-notebook-renderer', // Type only import
1074
{
1075
'when': 'hasBrowser',
1076
'pattern': '@xterm/xterm'
1077
}, // node module allowed even in /browser/
1078
{
1079
'when': 'hasBrowser',
1080
'pattern': '@xterm/addon-*'
1081
}, // node module allowed even in /browser/
1082
{
1083
'when': 'hasBrowser',
1084
'pattern': 'vscode-textmate'
1085
}, // node module allowed even in /browser/
1086
'@xterm/headless' // node module allowed even in /common/ and /browser/
1087
]
1088
},
1089
{
1090
'target': 'src/vs/code/~',
1091
'restrictions': [
1092
'vs/base/~',
1093
'vs/base/parts/*/~',
1094
'vs/platform/*/~',
1095
'vs/editor/~',
1096
'vs/editor/contrib/*/~',
1097
'vs/code/~',
1098
{
1099
'when': 'hasBrowser',
1100
'pattern': 'vs/workbench/workbench.web.main.js'
1101
},
1102
{
1103
'when': 'hasBrowser',
1104
'pattern': 'vs/workbench/workbench.web.main.internal.js'
1105
},
1106
{
1107
'when': 'hasBrowser',
1108
'pattern': 'vs/workbench/~'
1109
},
1110
{
1111
'when': 'hasBrowser',
1112
'pattern': 'vs/workbench/services/*/~'
1113
}
1114
]
1115
},
1116
{
1117
'target': 'src/vs/server/~',
1118
'restrictions': [
1119
'vs/base/~',
1120
'vs/base/parts/*/~',
1121
'vs/platform/*/~',
1122
'vs/workbench/~',
1123
'vs/workbench/api/~',
1124
'vs/workbench/services/*/~',
1125
'vs/workbench/contrib/*/~',
1126
'vs/server/~'
1127
]
1128
},
1129
{
1130
'target': 'src/vs/workbench/contrib/terminal/terminal.all.ts',
1131
'layer': 'browser',
1132
'restrictions': [
1133
'vs/workbench/contrib/**'
1134
]
1135
},
1136
{
1137
'target': 'src/vs/workbench/contrib/terminal/terminalContribChatExports.ts',
1138
'layer': 'browser',
1139
'restrictions': [
1140
'vs/workbench/contrib/terminalContrib/*/~'
1141
]
1142
},
1143
{
1144
'target': 'src/vs/workbench/contrib/terminal/terminalContribExports.ts',
1145
'layer': 'browser',
1146
'restrictions': [
1147
'vs/platform/*/~',
1148
'vs/workbench/contrib/terminalContrib/*/~'
1149
]
1150
},
1151
{
1152
'target': 'src/vs/workbench/workbench.common.main.ts',
1153
'layer': 'browser',
1154
'restrictions': [
1155
'vs/base/~',
1156
'vs/base/parts/*/~',
1157
'vs/platform/*/~',
1158
'vs/editor/~',
1159
'vs/editor/contrib/*/~',
1160
'vs/editor/editor.all.js',
1161
'vs/workbench/~',
1162
'vs/workbench/api/~',
1163
'vs/workbench/services/*/~',
1164
'vs/workbench/contrib/*/~',
1165
'vs/workbench/contrib/terminal/terminal.all.js'
1166
]
1167
},
1168
{
1169
'target': 'src/vs/workbench/workbench.web.main.ts',
1170
'layer': 'browser',
1171
'restrictions': [
1172
'vs/base/~',
1173
'vs/base/parts/*/~',
1174
'vs/platform/*/~',
1175
'vs/editor/~',
1176
'vs/editor/contrib/*/~',
1177
'vs/editor/editor.all.js',
1178
'vs/workbench/~',
1179
'vs/workbench/api/~',
1180
'vs/workbench/services/*/~',
1181
'vs/workbench/contrib/*/~',
1182
'vs/workbench/workbench.common.main.js'
1183
]
1184
},
1185
{
1186
'target': 'src/vs/workbench/workbench.web.main.internal.ts',
1187
'layer': 'browser',
1188
'restrictions': [
1189
'vs/base/~',
1190
'vs/base/parts/*/~',
1191
'vs/platform/*/~',
1192
'vs/editor/~',
1193
'vs/editor/contrib/*/~',
1194
'vs/editor/editor.all.js',
1195
'vs/workbench/~',
1196
'vs/workbench/api/~',
1197
'vs/workbench/services/*/~',
1198
'vs/workbench/contrib/*/~',
1199
'vs/workbench/workbench.common.main.js'
1200
]
1201
},
1202
{
1203
'target': 'src/vs/workbench/workbench.desktop.main.ts',
1204
'layer': 'electron-browser',
1205
'restrictions': [
1206
'vs/base/*/~',
1207
'vs/base/parts/*/~',
1208
'vs/platform/*/~',
1209
'vs/editor/~',
1210
'vs/editor/contrib/*/~',
1211
'vs/editor/editor.all.js',
1212
'vs/workbench/~',
1213
'vs/workbench/api/~',
1214
'vs/workbench/services/*/~',
1215
'vs/workbench/contrib/*/~',
1216
'vs/workbench/workbench.common.main.js'
1217
]
1218
},
1219
{
1220
'target': 'src/vs/amdX.ts',
1221
'restrictions': [
1222
'vs/base/common/*'
1223
]
1224
},
1225
{
1226
'target': 'src/vs/{loader.d.ts,monaco.d.ts,nls.ts,nls.messages.ts}',
1227
'restrictions': []
1228
},
1229
{
1230
'target': 'src/vscode-dts/**',
1231
'restrictions': []
1232
},
1233
{
1234
'target': 'src/vs/nls.ts',
1235
'restrictions': [
1236
'vs/*'
1237
]
1238
},
1239
{
1240
'target': 'src/{bootstrap-cli.ts,bootstrap-esm.ts,bootstrap-fork.ts,bootstrap-import.ts,bootstrap-meta.ts,bootstrap-node.ts,bootstrap-server.ts,cli.ts,main.ts,server-cli.ts,server-main.ts}',
1241
'restrictions': [
1242
'vs/**/common/*',
1243
'vs/**/node/*',
1244
'vs/nls.js',
1245
'src/*.js',
1246
'*' // node.js
1247
]
1248
}
1249
]
1250
}
1251
},
1252
{
1253
files: [
1254
'test/**/*.ts'
1255
],
1256
languageOptions: {
1257
parser: tseslint.parser,
1258
},
1259
plugins: {
1260
'local': pluginLocal,
1261
},
1262
rules: {
1263
'local/code-import-patterns': [
1264
'warn',
1265
{
1266
'target': 'test/smoke/**',
1267
'restrictions': [
1268
'test/automation',
1269
'test/smoke/**',
1270
'@vscode/*',
1271
'@parcel/*',
1272
'@playwright/*',
1273
'*' // node modules
1274
]
1275
},
1276
{
1277
'target': 'test/automation/**',
1278
'restrictions': [
1279
'test/automation/**',
1280
'@vscode/*',
1281
'@parcel/*',
1282
'playwright-core/**',
1283
'@playwright/*',
1284
'*' // node modules
1285
]
1286
},
1287
{
1288
'target': 'test/integration/**',
1289
'restrictions': [
1290
'test/integration/**',
1291
'@vscode/*',
1292
'@parcel/*',
1293
'@playwright/*',
1294
'*' // node modules
1295
]
1296
},
1297
{
1298
'target': 'test/monaco/**',
1299
'restrictions': [
1300
'test/monaco/**',
1301
'@vscode/*',
1302
'@parcel/*',
1303
'@playwright/*',
1304
'*' // node modules
1305
]
1306
},
1307
{
1308
'target': 'test/mcp/**',
1309
'restrictions': [
1310
'test/automation',
1311
'test/mcp/**',
1312
'@vscode/*',
1313
'@parcel/*',
1314
'@playwright/*',
1315
'@modelcontextprotocol/sdk/**/*',
1316
'*' // node modules
1317
]
1318
}
1319
]
1320
}
1321
},
1322
{
1323
files: [
1324
'src/vs/workbench/contrib/notebook/browser/view/renderers/*.ts'
1325
],
1326
languageOptions: {
1327
parser: tseslint.parser,
1328
},
1329
plugins: {
1330
'local': pluginLocal,
1331
},
1332
rules: {
1333
'local/code-no-runtime-import': [
1334
'error',
1335
{
1336
'src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts': [
1337
'**/*'
1338
]
1339
}
1340
],
1341
'local/code-limited-top-functions': [
1342
'error',
1343
{
1344
'src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts': [
1345
'webviewPreloads',
1346
'preloadsScriptStr'
1347
]
1348
}
1349
]
1350
}
1351
},
1352
// Terminal
1353
{
1354
files: [
1355
'src/vs/workbench/contrib/terminal/**/*.ts',
1356
'src/vs/workbench/contrib/terminalContrib/**/*.ts',
1357
],
1358
languageOptions: {
1359
parser: tseslint.parser,
1360
},
1361
rules: {
1362
'@typescript-eslint/naming-convention': [
1363
'warn',
1364
// variableLike
1365
{ 'selector': 'variable', 'format': ['camelCase', 'UPPER_CASE', 'PascalCase'] },
1366
{ 'selector': 'variable', 'filter': '^I.+Service$', 'format': ['PascalCase'], 'prefix': ['I'] },
1367
// memberLike
1368
{ 'selector': 'memberLike', 'modifiers': ['private'], 'format': ['camelCase'], 'leadingUnderscore': 'require' },
1369
{ 'selector': 'memberLike', 'modifiers': ['protected'], 'format': ['camelCase'], 'leadingUnderscore': 'require' },
1370
{ 'selector': 'enumMember', 'format': ['PascalCase'] },
1371
// memberLike - Allow enum-like objects to use UPPER_CASE
1372
{ 'selector': 'method', 'modifiers': ['public'], 'format': ['camelCase', 'UPPER_CASE'] },
1373
// typeLike
1374
{ 'selector': 'typeLike', 'format': ['PascalCase'] },
1375
{ 'selector': 'interface', 'format': ['PascalCase'] }
1376
],
1377
'comma-dangle': ['warn', 'only-multiline']
1378
}
1379
},
1380
// markdown-language-features
1381
{
1382
files: [
1383
'extensions/markdown-language-features/**/*.ts',
1384
],
1385
languageOptions: {
1386
parser: tseslint.parser,
1387
},
1388
plugins: {
1389
'@typescript-eslint': tseslint.plugin,
1390
},
1391
rules: {
1392
'@typescript-eslint/naming-convention': [
1393
'warn',
1394
{
1395
'selector': 'default',
1396
'modifiers': ['private'],
1397
'format': null,
1398
'leadingUnderscore': 'require'
1399
},
1400
{
1401
'selector': 'default',
1402
'modifiers': ['public'],
1403
'format': null,
1404
'leadingUnderscore': 'forbid'
1405
}
1406
]
1407
}
1408
},
1409
// Additional extension strictness rules
1410
{
1411
files: [
1412
'extensions/markdown-language-features/**/*.ts',
1413
'extensions/media-preview/**/*.ts',
1414
'extensions/simple-browser/**/*.ts',
1415
'extensions/typescript-language-features/**/*.ts',
1416
],
1417
languageOptions: {
1418
parser: tseslint.parser,
1419
parserOptions: {
1420
project: [
1421
// Markdown
1422
'extensions/markdown-language-features/tsconfig.json',
1423
'extensions/markdown-language-features/notebook/tsconfig.json',
1424
'extensions/markdown-language-features/preview-src/tsconfig.json',
1425
1426
// Media preview
1427
'extensions/media-preview/tsconfig.json',
1428
1429
// Media preview
1430
'extensions/simple-browser/tsconfig.json',
1431
'extensions/simple-browser/preview-src/tsconfig.json',
1432
1433
// TypeScript
1434
'extensions/typescript-language-features/tsconfig.json',
1435
'extensions/typescript-language-features/web/tsconfig.json',
1436
],
1437
}
1438
},
1439
plugins: {
1440
'@typescript-eslint': tseslint.plugin,
1441
},
1442
rules: {
1443
'@typescript-eslint/prefer-optional-chain': 'warn',
1444
'@typescript-eslint/prefer-readonly': 'warn',
1445
'@typescript-eslint/consistent-generic-constructors': ['warn', 'constructor'],
1446
}
1447
},
1448
);
1449
1450