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+ 'use strict' ;
6+
7+ import * as path from 'path' ;
8+ import * as fs from 'fs' ;
9+ import * as vscode from 'vscode' ;
10+
11+ type AutoDetect = 'on' | 'off' ;
12+ let taskProvider : vscode . Disposable | undefined ;
13+
14+ export function activate ( _context : vscode . ExtensionContext ) : void {
15+ let workspaceRoot = vscode . workspace . rootPath ;
16+ if ( ! workspaceRoot ) {
17+ return ;
18+ }
19+
20+ function onConfigurationChanged ( ) {
21+ let autoDetect = vscode . workspace . getConfiguration ( 'npm' ) . get < AutoDetect > ( 'autoDetect' ) ;
22+ if ( taskProvider && autoDetect === 'off' ) {
23+ taskProvider . dispose ( ) ;
24+ taskProvider = undefined ;
25+ } else if ( ! taskProvider && autoDetect === 'on' ) {
26+ taskProvider = vscode . workspace . registerTaskProvider ( {
27+ provideTasks : ( ) => {
28+ return getNpmScriptsAsTasks ( ) ;
29+ }
30+ } ) ;
31+ }
32+ }
33+ vscode . workspace . onDidChangeConfiguration ( onConfigurationChanged ) ;
34+ onConfigurationChanged ( ) ;
35+ }
36+
37+ export function deactivate ( ) : void {
38+ if ( taskProvider ) {
39+ taskProvider . dispose ( ) ;
40+ }
41+ }
42+
43+ async function exists ( file : string ) : Promise < boolean > {
44+ return new Promise < boolean > ( ( resolve , _reject ) => {
45+ fs . exists ( file , ( value ) => {
46+ resolve ( value ) ;
47+ } ) ;
48+ } ) ;
49+ }
50+
51+ async function readFile ( file : string ) : Promise < string > {
52+ return new Promise < string > ( ( resolve , reject ) => {
53+ fs . readFile ( file , ( err , data ) => {
54+ if ( err ) {
55+ reject ( err ) ;
56+ }
57+ resolve ( data . toString ( ) ) ;
58+ } ) ;
59+ } ) ;
60+ }
61+
62+ async function getNpmScriptsAsTasks ( ) : Promise < vscode . Task [ ] > {
63+ let workspaceRoot = vscode . workspace . rootPath ;
64+ let emptyTasks : vscode . Task [ ] = [ ] ;
65+
66+ if ( ! workspaceRoot ) {
67+ return emptyTasks ;
68+ }
69+
70+ let packageJson = path . join ( workspaceRoot , 'package.json' ) ;
71+ if ( ! await exists ( packageJson ) ) {
72+ return emptyTasks ;
73+ }
74+
75+ try {
76+ var contents = await readFile ( packageJson ) ;
77+ var json = JSON . parse ( contents ) ;
78+ if ( ! json . scripts ) {
79+ return Promise . resolve ( emptyTasks ) ;
80+ }
81+
82+ const result : vscode . Task [ ] = [ ] ;
83+ Object . keys ( json . scripts ) . forEach ( each => {
84+ const task = new vscode . ShellTask ( `npm: run ${ each } ` , `npm run ${ each } ` ) ;
85+ const lowerCaseTaskName = each . toLowerCase ( ) ;
86+ if ( lowerCaseTaskName === 'build' ) {
87+ task . group = vscode . TaskGroup . Build ;
88+ } else if ( lowerCaseTaskName === 'test' ) {
89+ task . group = vscode . TaskGroup . Test ;
90+ }
91+ result . push ( task ) ;
92+ } ) ;
93+ return Promise . resolve ( result ) ;
94+ } catch ( e ) {
95+ return Promise . resolve ( emptyTasks ) ;
96+ }
97+ }
0 commit comments