{
	"root": true,
	"parser": "@typescript-eslint/parser",
	"parserOptions": {
		"ecmaVersion": 6,
		"sourceType": "module"
	},
	"plugins": [
		"@typescript-eslint",
		"jsdoc",
		"header"
	],
	"rules": {
		"constructor-super": "warn",
		"curly": "warn",
		"eqeqeq": "warn",
		"no-buffer-constructor": "warn",
		"no-caller": "warn",
		"no-case-declarations": "warn",
		"no-debugger": "warn",
		"no-duplicate-case": "warn",
		"no-duplicate-imports": "warn",
		"no-eval": "warn",
		"no-async-promise-executor": "warn",
		"no-extra-semi": "warn",
		"no-new-wrappers": "warn",
		"no-redeclare": "off",
		"no-sparse-arrays": "warn",
		"no-throw-literal": "warn",
		"no-unsafe-finally": "warn",
		"no-unused-labels": "warn",
		"no-restricted-globals": [
			"warn",
			"name",
			"length",
			"event",
			"closed",
			"external",
			"status",
			"origin",
			"orientation",
			"context"
		], // non-complete list of globals that are easy to access unintentionally
		"no-var": "warn",
		"jsdoc/no-types": "warn",
		"semi": "off",
		"@typescript-eslint/semi": "warn",
		"@typescript-eslint/member-delimiter-style": "warn",
		"@typescript-eslint/naming-convention": [
			"warn",
			{
				"selector": "class",
				"format": [
					"PascalCase"
				]
			}
		],
		"code-no-unused-expressions": [
			"warn",
			{
				"allowTernary": true
			}
		],
		"code-translation-remind": "warn",
		"code-no-nls-in-standalone-editor": "warn",
		"code-no-standalone-editor": "warn",
		"code-no-unexternalized-strings": "warn",
		"code-layering": [
			"warn",
			{
				"common": [],
				"node": [
					"common"
				],
				"browser": [
					"common"
				],
				"electron-sandbox": [
					"common",
					"browser"
				],
				"electron-browser": [
					"common",
					"browser",
					"node",
					"electron-sandbox"
				],
				"electron-main": [
					"common",
					"node"
				]
			}
		],
		"header/header": [
			2,
			"block",
			[
				"---------------------------------------------------------------------------------------------",
				" *  Copyright (c) Microsoft Corporation. All rights reserved.",
				" *  Licensed under the MIT License. See License.txt in the project root for license information.",
				" *--------------------------------------------------------------------------------------------"
			]
		]
	},
	"overrides": [
		{
			"files": [
				"*.js"
			],
			"rules": {
				"jsdoc/no-types": "off"
			}
		},
		{
			"files": [
				"**/*.test.ts"
			],
			"rules": {
				"code-no-test-only": "error",
				"code-no-unexternalized-strings": "off"
			}
		},
		{
			"files": [
				"**/vscode.d.ts",
				"**/vscode.proposed.*.d.ts"
			],
			"rules": {
				"vscode-dts-create-func": "warn",
				"vscode-dts-literal-or-types": "warn",
				"vscode-dts-interface-naming": "warn",
				"vscode-dts-cancellation": "warn",
				"vscode-dts-use-thenable": "warn",
				"vscode-dts-region-comments": "warn",
				"vscode-dts-vscode-in-comments": "warn",
				"vscode-dts-provider-naming": [
					"warn",
					{
						"allowed": [
							"FileSystemProvider",
							"TreeDataProvider",
							"TestProvider",
							"CustomEditorProvider",
							"CustomReadonlyEditorProvider",
							"TerminalLinkProvider",
							"AuthenticationProvider",
							"NotebookContentProvider"
						]
					}
				],
				"vscode-dts-event-naming": [
					"warn",
					{
						"allowed": [
							"onCancellationRequested",
							"event"
						],
						"verbs": [
							"accept",
							"change",
							"close",
							"collapse",
							"create",
							"delete",
							"discover",
							"dispose",
							"drop",
							"edit",
							"end",
							"expand",
							"grant",
							"hide",
							"invalidate",
							"open",
							"override",
							"receive",
							"register",
							"remove",
							"rename",
							"save",
							"send",
							"start",
							"terminate",
							"trigger",
							"unregister",
							"write"
						]
					}
				]
			}
		},
		{
			"files": [
				"src/**/*.ts"
			],
			"rules": {
				"code-no-look-behind-regex": "warn",
				"code-import-patterns": [
					"warn",
					{
						// imports that are allowed in all files of layers:
						// - browser
						// - electron-sandbox
						// - electron-browser
						"when": "hasBrowser",
						"allow": [
							"vs/css!./**/*"
						]
					},
					{
						// imports that are allowed in all files of layers:
						// - node
						// - electron-browser
						// - electron-main
						"when": "hasNode",
						"allow": [
							"@microsoft/applicationinsights-web",
							"@parcel/watcher",
							"@vscode/sqlite3",
							"@vscode/vscode-languagedetection",
							"@vscode/ripgrep",
							"@vscode/iconv-lite-umd",
							"applicationinsights",
							"assert",
							"child_process",
							"console",
							"cookie",
							"crypto",
							"electron",
							"events",
							"fs",
							"graceful-fs",
							"http",
							"https",
							"minimist",
							"native-keymap",
							"native-watchdog",
							"net",
							"node-pty",
							"os",
							"path",
							"perf_hooks",
							"spdlog",
							"stream",
							"string_decoder",
							"tas-client-umd",
							"tls",
							"url",
							"util",
							"v8-inspect-profiler",
							"vscode-proxy-agent",
							"vscode-regexpp",
							"vscode-textmate",
							"windows-process-tree",
							"worker_threads",
							"xterm",
							"xterm-addon-search",
							"xterm-addon-serialize",
							"xterm-addon-unicode11",
							"xterm-addon-webgl",
							"xterm-headless",
							"yauzl",
							"yazl",
							"zlib"
						]
					},
					{
						// imports that are allowed in all /test/ files
						"when": "test",
						"allow": [
							"assert",
							"sinon",
							"sinon-test"
						]
					},
					// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
					// !!! Do not relax these rules !!!
					// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
					//
					// A path ending in /~ has a special meaning. It indicates a template position
					// which will be substituted with one or more layers.
					//
					// When /~ is used in the target, the rule will be expanded to 14 distinct rules.
					// e.g. "src/vs/base/~" will be expanded to:
					//  - src/vs/base/common
					//  - src/vs/base/worker
					//  - src/vs/base/browser
					//  - src/vs/base/electron-sandbox
					//  - src/vs/base/node
					//  - src/vs/base/electron-browser
					//  - src/vs/base/electron-main
					//  - src/vs/base/test/common
					//  - src/vs/base/test/worker
					//  - src/vs/base/test/browser
					//  - src/vs/base/test/electron-sandbox
					//  - src/vs/base/test/node
					//  - src/vs/base/test/electron-browser
					//  - src/vs/base/test/electron-main
					//
					// When /~ is used in the restrictions, it will be replaced with the correct
					// layers that can be used e.g. "src/vs/base/electron-sandbox" will be able
					// to import "{common,browser,electron-sanbox}", etc.
					//
					// It is possible to use /~ in the restrictions property even without using it in
					// the target property by adding a layer property.
					{
						"target": "src/vs/base/~",
						"restrictions": [
							"vs/base/~"
						]
					},
					{
						"target": "src/vs/base/parts/*/~",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~"
						]
					},
					{
						"target": "src/vs/platform/*/~",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"tas-client-umd" // node module allowed even in /common/
						]
					},
					{
						"target": "src/vs/editor/~",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~"
						]
					},
					{
						"target": "src/vs/editor/contrib/*/~",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~",
							"vs/editor/contrib/*/~"
						]
					},
					{
						"target": "src/vs/editor/standalone/~",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~",
							"vs/editor/contrib/*/~",
							"vs/editor/standalone/~"
						]
					},
					{
						"target": "src/vs/editor/editor.all.ts",
						"layer": "browser",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~",
							"vs/editor/contrib/*/~"
						]
					},
					{
						"target": "src/vs/editor/editor.worker.ts",
						"layer": "worker",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~"
						]
					},
					{
						"target": "src/vs/editor/{editor.api.ts,editor.main.ts}",
						"layer": "browser",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/editor/~",
							"vs/editor/contrib/*/~",
							"vs/editor/standalone/~",
							"vs/editor/*"
						]
					},
					{
						"target": "src/vs/workbench/~",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~",
							"vs/editor/contrib/*/~",
							"vs/workbench/~",
							"vs/workbench/services/*/~",
							"assert",
							{
								"when": "test",
								"pattern": "vs/workbench/contrib/*/~"
							} // TODO@layers
						]
					},
					{
						"target": "src/vs/workbench/api/~",
						"restrictions": [
							"vscode",
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~",
							"vs/editor/contrib/*/~",
							"vs/workbench/api/~",
							"vs/workbench/~",
							"vs/workbench/services/*/~",
							"vs/workbench/contrib/*/~"
						]
					},
					{
						"target": "src/vs/workbench/services/*/~",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~",
							"vs/editor/contrib/*/~",
							"vs/workbench/~",
							"vs/workbench/services/*/~",
							{
								"when": "test",
								"pattern": "vs/workbench/contrib/*/~"
							}, // TODO@layers
							"tas-client-umd", // node module allowed even in /common/
							"vscode-textmate", // node module allowed even in /common/
							"@vscode/vscode-languagedetection", // node module allowed even in /common/
							"@microsoft/applicationinsights-web" // node module allowed even in /common/
						]
					},
					{
						"target": "src/vs/workbench/contrib/*/~",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~",
							"vs/editor/contrib/*/~",
							"vs/workbench/~",
							"vs/workbench/services/*/~",
							"vs/workbench/contrib/*/~",
							"vscode-notebook-renderer", // Type only import
							{
								"when": "hasBrowser",
								"pattern": "xterm"
							}, // node module allowed even in /browser/
							{
								"when": "hasBrowser",
								"pattern": "xterm-addon-*"
							}, // node module allowed even in /browser/
							{
								"when": "hasBrowser",
								"pattern": "vscode-textmate"
							} // node module allowed even in /browser/
						]
					},
					{
						"target": "src/vs/code/~",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~",
							"vs/editor/contrib/*/~",
							"vs/code/~",
							{
								"when": "hasBrowser",
								"pattern": "vs/workbench/workbench.web.main"
							}
						]
					},
					{
						"target": "src/vs/server/~",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/workbench/~",
							"vs/workbench/api/~",
							"vs/workbench/services/*/~",
							"vs/workbench/contrib/*/~",
							"vs/server/~"
						]
					},
					{
						"target": "src/vs/workbench/workbench.common.main.ts",
						"layer": "browser",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~",
							"vs/editor/contrib/*/~",
							"vs/editor/editor.all",
							"vs/workbench/~",
							"vs/workbench/api/~",
							"vs/workbench/services/*/~",
							"vs/workbench/contrib/*/~"
						]
					},
					{
						"target": "src/vs/workbench/workbench.web.main.ts",
						"layer": "browser",
						"restrictions": [
							"vs/base/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~",
							"vs/editor/contrib/*/~",
							"vs/editor/editor.all",
							"vs/workbench/~",
							"vs/workbench/api/~",
							"vs/workbench/services/*/~",
							"vs/workbench/contrib/*/~",
							"vs/workbench/workbench.common.main"
						]
					},
					{
						"target": "src/vs/workbench/{workbench.sandbox.main.ts,workbench.desktop.sandbox.main.ts}",
						"layer": "electron-sandbox",
						"restrictions": [
							"vs/base/*/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~",
							"vs/editor/contrib/*/~",
							"vs/editor/editor.all",
							"vs/workbench/~",
							"vs/workbench/api/~",
							"vs/workbench/services/*/~",
							"vs/workbench/contrib/*/~",
							"vs/workbench/workbench.common.main",
							"vs/workbench/workbench.sandbox.main"
						]
					},
					{
						"target": "src/vs/workbench/workbench.desktop.main.ts",
						"layer": "electron-browser",
						"restrictions": [
							"vs/base/*/~",
							"vs/base/parts/*/~",
							"vs/platform/*/~",
							"vs/editor/~",
							"vs/editor/contrib/*/~",
							"vs/editor/editor.all",
							"vs/workbench/~",
							"vs/workbench/api/~",
							"vs/workbench/services/*/~",
							"vs/workbench/contrib/*/~",
							"vs/workbench/workbench.common.main",
							"vs/workbench/workbench.sandbox.main"
						]
					},
					{
						"target": "src/vs/workbench/{workbench.desktop.main.nls.js,workbench.web.main.nls.js}",
						"restrictions": []
					},
					{
						"target": "src/vs/{css.d.ts,monaco.d.ts,nls.d.ts,nls.mock.ts}",
						"restrictions": []
					},
					{
						"target": "src/vscode-dts/**",
						"restrictions": []
					},
					{
						"target": "src/{bootstrap-amd.js,bootstrap-fork.js,bootstrap-node.js,bootstrap-window.js,bootstrap.js,cli.js,main.js,server-cli.js,server-main.js}",
						"restrictions": []
					}
				]
			}
		},
		{
			"files": [
				"test/**/*.ts"
			],
			"rules": {
				"code-import-patterns": [
					"warn",
					{
						"target": "test/smoke/**",
						"restrictions": [
							"test/automation",
							"test/smoke/**",
							"@vscode/*",
							"@parcel/*",
							"@playwright/*",
							"*" // node modules
						]
					},
					{
						"target": "test/automation/**",
						"restrictions": [
							"test/automation/**",
							"@vscode/*",
							"@parcel/*",
							"playwright-core/**",
							"@playwright/*",
							"*" // node modules
						]
					},
					{
						"target": "test/integration/**",
						"restrictions": [
							"test/integration/**",
							"@vscode/*",
							"@parcel/*",
							"@playwright/*",
							"*" // node modules
						]
					},
					{
						"target": "test/monaco/**",
						"restrictions": [
							"test/monaco/**",
							"@vscode/*",
							"@parcel/*",
							"@playwright/*",
							"*" // node modules
						]
					}
				]
			}
		}
	]
}
