Skip to content

Commit 8d964cb

Browse files
committed
Added setting to control visibility of code lens
1 parent 80b08b4 commit 8d964cb

5 files changed

Lines changed: 70 additions & 42 deletions

File tree

extensions/npm/README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ For more information about auto detection of Tasks, see the [documentation](http
1515

1616
### Script Explorer
1717

18-
The Npm Script Explorer shows the npm scripts found in your workspace. The explorer view is enabled by the setting `npm.enableScriptExplorer`.
18+
The Npm Script Explorer shows the npm scripts found in your workspace. The explorer view is enabled by the setting `npm.enableScriptExplorer`. A script can be opened, run, or debug from the explorer.
1919

2020
### Run Scripts from the Editor
2121

22-
The extension provides commands to run the script containing the selection.
22+
The extension provides code lense actions to run or debug a script from the editor.
2323

2424
## Settings
2525

@@ -29,3 +29,5 @@ The extension provides commands to run the script containing the selection.
2929
- `npm.exclude` - Glob patterns for folders that should be excluded from automatic script detection. The pattern is matched against the **absolute path** of the package.json. For example, to exclude all test folders use '**/test/**'.
3030
- `npm.enableScriptExplorer` - Enable an explorer view for npm scripts.
3131
- `npm.scriptExplorerAction` - The default click action: `open` or `run`, the default is `open`.
32+
- `npm.scriptCodeLens.enable` - Enable/disable the code lenses to run a script.
33+

extensions/npm/package.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,6 @@
9494
"command": "npm.runScript",
9595
"when": "false"
9696
},
97-
{
98-
"command": "npm.runScriptFromSource",
99-
"when": "false"
100-
},
10197
{
10298
"command": "npm.debugScript",
10399
"when": "false"
@@ -182,6 +178,12 @@
182178
"scope": "resource",
183179
"description": "%config.npm.runSilent%"
184180
},
181+
"npm.scriptCodeLens.enable": {
182+
"type": "boolean",
183+
"default": true,
184+
"scope": "resource",
185+
"description": "%config.scriptCodeLens.enable%"
186+
},
185187
"npm.packageManager": {
186188
"scope": "resource",
187189
"type": "string",

extensions/npm/src/lenses.ts

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import {
88
ExtensionContext, CodeLensProvider, TextDocument, commands, ProviderResult, CodeLens, CancellationToken,
9-
workspace, tasks, Range, Command
9+
workspace, tasks, Range, Command, Event, EventEmitter
1010
} from 'vscode';
1111
import {
1212
createTask, startDebugging, findAllScriptRanges, extractDebugArgFromScript
@@ -15,46 +15,59 @@ import * as nls from 'vscode-nls';
1515

1616
const localize = nls.loadMessageBundle();
1717

18-
export class NpmLenseProvider implements CodeLensProvider {
18+
export class NpmLensProvider implements CodeLensProvider {
1919
private extensionContext: ExtensionContext;
20+
private _onDidChangeCodeLenses: EventEmitter<void> = new EventEmitter<void>();
21+
readonly onDidChangeCodeLenses: Event<void> = this._onDidChangeCodeLenses.event;
2022

2123
constructor(context: ExtensionContext) {
22-
const subscriptions = context.subscriptions;
2324
this.extensionContext = context;
24-
context.subscriptions.push(commands.registerCommand('npm.runScriptFromLense', this.runScriptFromLense, this));
25-
context.subscriptions.push(commands.registerCommand('npm.debugScriptFromLense', this.debugScriptFromLense, this));
25+
context.subscriptions.push(commands.registerCommand('npm.runScriptFromLens', this.runScriptFromLens, this));
26+
context.subscriptions.push(commands.registerCommand('npm.debugScriptFromLens', this.debugScriptFromLens, this));
2627
}
2728

28-
public provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult<CodeLens[]> {
29+
public provideCodeLenses(document: TextDocument, _token: CancellationToken): ProviderResult<CodeLens[]> {
2930
let result = findAllScriptRanges(document.getText());
31+
let folder = workspace.getWorkspaceFolder(document.uri);
3032
let lenses: CodeLens[] = [];
3133

34+
35+
if (folder && !workspace.getConfiguration('npm', folder.uri).get<string>('scriptCodeLens.enable', 'true')) {
36+
return lenses;
37+
}
38+
3239
result.forEach((value, key) => {
3340
let start = document.positionAt(value[0]);
3441
let end = document.positionAt(value[0] + value[1]);
35-
let lens: CodeLens;
42+
let range = new Range(start, end);
43+
3644
let command: Command = {
37-
command: 'npm.runScriptFromLense',
45+
command: 'npm.runScriptFromLens',
3846
title: localize('run', "Run"),
3947
arguments: [document, key]
4048
};
41-
lens = new CodeLens(new Range(start, end), command);
49+
let lens: CodeLens = new CodeLens(range, command);
4250
lenses.push(lens);
51+
4352
let debugArgs = extractDebugArgFromScript(value[2]);
4453
if (debugArgs) {
4554
command = {
46-
command: 'npm.debugScriptFromLense',
55+
command: 'npm.debugScriptFromLens',
4756
title: localize('debug', "Debug"),
4857
arguments: [document, key, debugArgs[0], debugArgs[1]]
4958
};
50-
lens = new CodeLens(new Range(start, end), command);
59+
lens = new CodeLens(range, command);
5160
lenses.push(lens);
5261
}
5362
});
5463
return lenses;
5564
}
5665

57-
public runScriptFromLense(document: TextDocument, script: string) {
66+
public refresh() {
67+
this._onDidChangeCodeLenses.fire();
68+
}
69+
70+
public runScriptFromLens(document: TextDocument, script: string) {
5871
let uri = document.uri;
5972
let folder = workspace.getWorkspaceFolder(uri);
6073
if (folder) {
@@ -63,7 +76,7 @@ export class NpmLenseProvider implements CodeLensProvider {
6376
}
6477
}
6578

66-
public debugScriptFromLense(document: TextDocument, script: string, protocol: string, port: number) {
79+
public debugScriptFromLens(document: TextDocument, script: string, protocol: string, port: number) {
6780
let uri = document.uri;
6881
let folder = workspace.getWorkspaceFolder(uri);
6982
if (folder) {

extensions/npm/src/main.ts

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,13 @@ import * as vscode from 'vscode';
99

1010
import { addJSONProviders } from './features/jsonContributions';
1111
import { NpmScriptsTreeDataProvider } from './npmView';
12-
import { provideNpmScripts, invalidateScriptsCache } from './tasks';
13-
14-
import { NpmLenseProvider } from './lenses';
15-
16-
let taskProvider: vscode.Disposable | undefined;
12+
import { invalidateScriptsCache, NpmTaskProvider } from './tasks';
13+
import { NpmLensProvider } from './lenses';
1714

1815
export async function activate(context: vscode.ExtensionContext): Promise<void> {
19-
taskProvider = registerTaskProvider(context);
16+
const taskProvider = registerTaskProvider(context);
2017
const treeDataProvider = registerExplorer(context);
21-
registerLenseProvider(context);
18+
const lensProvider = registerLensProvider(context);
2219

2320
configureHttpRequest();
2421
vscode.workspace.onDidChangeConfiguration((e) => {
@@ -34,6 +31,11 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
3431
treeDataProvider.refresh();
3532
}
3633
}
34+
if (e.affectsConfiguration('npm.scriptCodeLens.enable')) {
35+
if (lensProvider) {
36+
lensProvider.refresh();
37+
}
38+
}
3739
});
3840
context.subscriptions.push(addJSONProviders(httpRequest.xhr));
3941
}
@@ -46,15 +48,10 @@ function registerTaskProvider(context: vscode.ExtensionContext): vscode.Disposab
4648
watcher.onDidCreate((_e) => invalidateScriptsCache());
4749
context.subscriptions.push(watcher);
4850

49-
let provider: vscode.TaskProvider = {
50-
provideTasks: async () => {
51-
return provideNpmScripts();
52-
},
53-
resolveTask(_task: vscode.Task): vscode.Task | undefined {
54-
return undefined;
55-
}
56-
};
57-
return vscode.workspace.registerTaskProvider('npm', provider);
51+
let provider: vscode.TaskProvider = new NpmTaskProvider(context);
52+
let disposable = vscode.workspace.registerTaskProvider('npm', provider);
53+
context.subscriptions.push(disposable);
54+
return disposable;
5855
}
5956
return undefined;
6057
}
@@ -69,16 +66,18 @@ function registerExplorer(context: vscode.ExtensionContext): NpmScriptsTreeDataP
6966
return undefined;
7067
}
7168

72-
function registerLenseProvider(context: vscode.ExtensionContext) {
69+
function registerLensProvider(context: vscode.ExtensionContext): NpmLensProvider | undefined {
7370
if (vscode.workspace.workspaceFolders) {
7471
let npmSelector: vscode.DocumentSelector = {
7572
language: 'json',
7673
scheme: 'file',
7774
pattern: '**/package.json'
7875
};
79-
let provider = new NpmLenseProvider(context);
76+
let provider = new NpmLensProvider(context);
8077
context.subscriptions.push(vscode.languages.registerCodeLensProvider(npmSelector, provider));
78+
return provider;
8179
}
80+
return undefined;
8281
}
8382

8483
function configureHttpRequest() {
@@ -87,7 +86,4 @@ function configureHttpRequest() {
8786
}
8887

8988
export function deactivate(): void {
90-
if (taskProvider) {
91-
taskProvider.dispose();
92-
}
9389
}

extensions/npm/src/tasks.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import {
88
TaskDefinition, Task, TaskGroup, WorkspaceFolder, RelativePattern, ShellExecution, Uri, workspace,
9-
DebugConfiguration, debug
9+
DebugConfiguration, debug, TaskProvider, ExtensionContext
1010
} from 'vscode';
1111
import * as path from 'path';
1212
import * as fs from 'fs';
@@ -25,6 +25,22 @@ type AutoDetect = 'on' | 'off';
2525

2626
let cachedTasks: Task[] | undefined = undefined;
2727

28+
export class NpmTaskProvider implements TaskProvider {
29+
private extensionContext: ExtensionContext;
30+
31+
constructor(context: ExtensionContext) {
32+
this.extensionContext = context;
33+
}
34+
35+
public provideTasks() {
36+
return provideNpmScripts();
37+
}
38+
39+
public resolveTask(_task: Task): Task | undefined {
40+
return undefined;
41+
}
42+
}
43+
2844
export function invalidateScriptsCache() {
2945
cachedTasks = undefined;
3046
}
@@ -327,7 +343,6 @@ async function findAllScripts(buffer: string): Promise<StringMap> {
327343

328344
let visitor: JSONVisitor = {
329345
onError(_error: ParseErrorCode, _offset: number, _length: number) {
330-
// TODO: inform user about the parse error
331346
},
332347
onObjectEnd() {
333348
if (inScripts) {

0 commit comments

Comments
 (0)