diff --git a/.vscodeignore b/.vscodeignore index 7507e99d..c4e16b01 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -11,4 +11,8 @@ tslint.json .travis.yml gulpfile.js *.vsix -.github/** \ No newline at end of file +.github/** +*.log +webpack.config.js +node_modules/** +vendor/** \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index b0fa492e..5352efbe 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -9,6 +9,7 @@ const runSequence = require('run-sequence'); const del = require('del'); const fs = require("fs"); +const fsp = require('fs-plus'); const path = require("path"); const childProcess = require("child_process"); @@ -43,6 +44,23 @@ gulp.task("html-webpack", (done) => { }); }); +gulp.task("node_modules-webpack", (done) => { + const config = require("./webpack.config.js"); + config.context = `${__dirname}`; + return webpack(config, (err, stats) => { + const statsJson = stats.toJson(); + if (err || (statsJson.errors && statsJson.errors.length)) { + statsJson.errors.forEach(webpackError => { + gutil.log(gutil.colors.red(`Error (webpack): ${webpackError}`)); + }); + + throw new gutil.PluginError('webpack', JSON.stringify(err || statsJson.errors)); + } + gutil.log('[webpack]', stats.toString()); + done(); + }); +}); + gulp.task("ts-compile", () => { const tsProject = ts.createProject("./tsconfig.json"); return tsProject.src() @@ -78,6 +96,11 @@ gulp.task("genAikey", (done) => { } }); +gulp.task("copyVendor", (done) => { + fsp.copySync('vendor', 'out/vendor'); + done(); +}); + gulp.task("test", (done) => { function removeExtensionDependencies() { const packageJson = JSON.parse(fs.readFileSync("package.json")); @@ -123,7 +146,7 @@ gulp.task("test", (done) => { }); gulp.task("build", (done) => { - return runSequence("clean", "ts-compile", "html-webpack", done); + return runSequence("clean", "ts-compile", "html-webpack", "node_modules-webpack", "copyVendor", done); }); gulp.task("build_without_view", (done) => { diff --git a/package-lock.json b/package-lock.json index 837c1003..fe745d9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4788,6 +4788,11 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, + "impor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/impor/-/impor-0.1.1.tgz", + "integrity": "sha512-gHt1rhOlf5Oogcux/GnROQ7k0KvfgUIXXxaAHHnboyp7lisEM+iEhLjZj6LhYYa0EPmAlsAX3k/OGPH90RcuvA==" + }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", diff --git a/package.json b/package.json index 08c42db3..968685bb 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-arduino", "displayName": "Arduino", "description": "Arduino for Visual Studio Code", - "version": "0.2.27", + "version": "0.2.28", "publisher": "vsciot-vscode", "aiKey": "83dd2c27-6594-41d3-85a9-bdb22070eb42", "preview": true, @@ -575,6 +575,7 @@ "express": "^4.14.1", "glob": "^7.1.1", "iconv-lite": "^0.4.18", + "impor": "^0.1.1", "properties": "^1.2.1", "uuid": "^3.0.1", "vscode-extension-telemetry": "0.0.18", diff --git a/src/debug/debuggerManager.ts b/src/debug/debuggerManager.ts index beeda6e8..776f4e92 100644 --- a/src/debug/debuggerManager.ts +++ b/src/debug/debuggerManager.ts @@ -43,7 +43,7 @@ export class DebuggerManager { } } } - this._usbDetector = require("../../../vendor/node-usb-native").detector; + this._usbDetector = require("../../vendor/node-usb-native").detector; this._debugServerPath = platform.findFile(platform.getExecutableFileName("openocd"), path.join(this._arduinoSettings.packagePath, "packages")); if (!util.fileExistsSync(this._debugServerPath)) { diff --git a/src/extension.ts b/src/extension.ts index 8347e873..57eae256 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,17 +1,19 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +const impor = require("impor")(__dirname); + import * as fs from "fs"; import * as path from "path"; -import * as Uuid from "uuid/v4"; +const uuidModule = impor("uuid/v4") as typeof import ("uuid/v4"); import * as vscode from "vscode"; import * as constants from "./common/constants"; - -import { ArduinoContentProvider } from "./arduino/arduinoContentProvider"; +const arduinoContentProviderModule = + impor("./arduino/arduinoContentProvider") as typeof import ("./arduino/arduinoContentProvider"); import { IBoard } from "./arduino/package"; import { VscodeSettings } from "./arduino/vscodeSettings"; -import ArduinoActivator from "./arduinoActivator"; -import ArduinoContext from "./arduinoContext"; +const arduinoActivatorModule = impor("./arduinoActivator") as typeof import ("./arduinoActivator"); +const arduinoContextModule = impor("./arduinoContext") as typeof import ("./arduinoContext"); import { ARDUINO_CONFIG_FILE, ARDUINO_MANAGER_PROTOCOL, ARDUINO_MODE, BOARD_CONFIG_URI, BOARD_MANAGER_URI, EXAMPLES_URI, LIBRARY_MANAGER_URI, @@ -19,19 +21,20 @@ import { import { validateArduinoPath } from "./common/platform"; import * as util from "./common/util"; import { ArduinoWorkspace } from "./common/workspace"; -import { ArduinoDebugConfigurationProvider } from "./debug/configurationProvider"; +const arduinoDebugConfigurationProviderModule = impor("./debug/configurationProvider") as typeof import ("./debug/configurationProvider"); import { DeviceContext } from "./deviceContext"; -import { CompletionProvider } from "./langService/completionProvider"; +const completionProviderModule = impor("./langService/completionProvider") as typeof import ("./langService/completionProvider"); import * as Logger from "./logger/logger"; -import { NSAT } from "./nsat"; +const nsatModule = + impor("./nsat") as typeof import ("./nsat"); import { SerialMonitor } from "./serialmonitor/serialMonitor"; -import { UsbDetector } from "./serialmonitor/usbDetector"; +const usbDetectorModule = impor("./serialmonitor/usbDetector") as typeof import ("./serialmonitor/usbDetector"); const status: any = {}; export async function activate(context: vscode.ExtensionContext) { Logger.configure(context); - const activeGuid = Uuid().replace(/-/g, ""); + const activeGuid = uuidModule().replace(/-/g, ""); Logger.traceUserData("start-activate-extension", { correlationId: activeGuid }); // Show a warning message if the working file is not under the workspace folder. // People should know the extension might not work appropriately, they should look for the doc to get started. @@ -49,11 +52,8 @@ export async function activate(context: vscode.ExtensionContext) { deviceContext.extensionPath = context.extensionPath; context.subscriptions.push(deviceContext); - const arduinoManagerProvider = new ArduinoContentProvider(context.extensionPath); - context.subscriptions.push(vscode.workspace.registerTextDocumentContentProvider(ARDUINO_MANAGER_PROTOCOL, arduinoManagerProvider)); - const commandExecution = async (command: string, commandBody: (...args: any[]) => any, args: any, getUserData?: () => any) => { - const guid = Uuid().replace(/\-/g, ""); + const guid = uuidModule().replace(/\-/g, ""); Logger.traceUserData(`start-command-` + command, { correlationId: guid }); const timer1 = new Logger.Timer(); let telemetryResult; @@ -77,20 +77,20 @@ export async function activate(context: vscode.ExtensionContext) { duration: timer1.end(), }); - NSAT.takeSurvey(context); + nsatModule.NSAT.takeSurvey(context); }; const registerArduinoCommand = (command: string, commandBody: (...args: any[]) => any, getUserData?: () => any): number => { return context.subscriptions.push(vscode.commands.registerCommand(command, async (...args: any[]) => { - if (!ArduinoContext.initialized) { - await ArduinoActivator.activate(); + if (!arduinoContextModule.default.initialized) { + await arduinoActivatorModule.default.activate(); } if (!SerialMonitor.getInstance().initialized) { SerialMonitor.getInstance().initialize(); } - const arduinoPath = ArduinoContext.arduinoApp.settings.arduinoPath; - const commandPath = ArduinoContext.arduinoApp.settings.commandPath; + const arduinoPath = arduinoContextModule.default.arduinoApp.settings.arduinoPath; + const commandPath = arduinoContextModule.default.arduinoApp.settings.commandPath; if (!arduinoPath || !validateArduinoPath(arduinoPath)) { // Pop up vscode User Settings page when cannot resolve arduino path. Logger.notifyUserError("InvalidArduinoPath", new Error(constants.messages.INVALID_ARDUINO_PATH)); vscode.commands.executeCommand("workbench.action.openGlobalSettings"); @@ -111,62 +111,6 @@ export async function activate(context: vscode.ExtensionContext) { })); }; - registerArduinoCommand("arduino.showBoardManager", async () => { - const panel = vscode.window.createWebviewPanel("arduinoBoardManager", "Arduino Board Manager", vscode.ViewColumn.Two, { - enableScripts: true, - retainContextWhenHidden: true, - }); - panel.webview.html = await arduinoManagerProvider.provideTextDocumentContent(BOARD_MANAGER_URI); - }); - - registerArduinoCommand("arduino.showLibraryManager", async () => { - const panel = vscode.window.createWebviewPanel("arduinoLibraryManager", "Arduino Library Manager", vscode.ViewColumn.Two, { - enableScripts: true, - retainContextWhenHidden: true, - }); - panel.webview.html = await arduinoManagerProvider.provideTextDocumentContent(LIBRARY_MANAGER_URI); - }); - - registerArduinoCommand("arduino.showBoardConfig", async () => { - const panel = vscode.window.createWebviewPanel("arduinoBoardConfiguration", "Arduino Board Configuration", vscode.ViewColumn.Two, { - enableScripts: true, - retainContextWhenHidden: true, - }); - panel.webview.html = await arduinoManagerProvider.provideTextDocumentContent(BOARD_CONFIG_URI); - }); - - registerArduinoCommand("arduino.showExamples", async (forceRefresh: boolean = false) => { - vscode.commands.executeCommand("setContext", "vscode-arduino:showExampleExplorer", true); - if (forceRefresh) { - vscode.commands.executeCommand("arduino.reloadExample"); - } - - const panel = vscode.window.createWebviewPanel("arduinoExamples", "Arduino Examples", vscode.ViewColumn.Two, { - enableScripts: true, - retainContextWhenHidden: true, - }); - panel.webview.html = await arduinoManagerProvider.provideTextDocumentContent(EXAMPLES_URI); - }); - - // change board type - registerArduinoCommand("arduino.changeBoardType", async () => { - try { - await ArduinoContext.boardManager.changeBoardType(); - } catch (exception) { - Logger.error(exception.message); - } - arduinoManagerProvider.update(LIBRARY_MANAGER_URI); - arduinoManagerProvider.update(EXAMPLES_URI); - }, () => { - return { board: ArduinoContext.boardManager.currentBoard.name }; - }); - - registerArduinoCommand("arduino.reloadExample", () => { - arduinoManagerProvider.update(EXAMPLES_URI); - }, () => { - return { board: (ArduinoContext.boardManager.currentBoard === null) ? null : ArduinoContext.boardManager.currentBoard.name }; - }); - registerArduinoCommand("arduino.initialize", async () => await deviceContext.initialize()); registerArduinoCommand("arduino.verify", async () => { @@ -177,14 +121,17 @@ export async function activate(context: vscode.ExtensionContext) { location: vscode.ProgressLocation.Window, title: "Arduino: Verifying...", }, async () => { - await ArduinoContext.arduinoApp.verify(); + await arduinoContextModule.default.arduinoApp.verify(); }); } catch (ex) { } delete status.compile; } }, () => { - return { board: (ArduinoContext.boardManager.currentBoard === null) ? null : ArduinoContext.boardManager.currentBoard.name }; + return { + board: (arduinoContextModule.default.boardManager.currentBoard === null) ? null : + arduinoContextModule.default.boardManager.currentBoard.name, + }; }); registerArduinoCommand("arduino.upload", async () => { @@ -195,14 +142,14 @@ export async function activate(context: vscode.ExtensionContext) { location: vscode.ProgressLocation.Window, title: "Arduino: Uploading...", }, async () => { - await ArduinoContext.arduinoApp.upload(); + await arduinoContextModule.default.arduinoApp.upload(); }); } catch (ex) { } delete status.compile; } }, () => { - return { board: ArduinoContext.boardManager.currentBoard.name }; + return { board: arduinoContextModule.default.boardManager.currentBoard.name }; }); registerArduinoCommand("arduino.setSketchFile", async () => { @@ -230,34 +177,37 @@ export async function activate(context: vscode.ExtensionContext) { if (!status.compile) { status.compile = "upload"; try { - await ArduinoContext.arduinoApp.uploadUsingProgrammer(); + await arduinoContextModule.default.arduinoApp.uploadUsingProgrammer(); } catch (ex) { } delete status.compile; } }, () => { - return { board: ArduinoContext.boardManager.currentBoard.name }; + return { board: arduinoContextModule.default.boardManager.currentBoard.name }; }); registerArduinoCommand("arduino.selectProgrammer", async () => { if (!status.compile) { status.compile = "upload"; try { - await ArduinoContext.arduinoApp.programmerManager.selectProgrammer(); + await arduinoContextModule.default.arduinoApp.programmerManager.selectProgrammer(); } catch (ex) { } delete status.compile; } }, () => { - return { board: (ArduinoContext.boardManager.currentBoard === null) ? null : ArduinoContext.boardManager.currentBoard.name }; + return { + board: (arduinoContextModule.default.boardManager.currentBoard === null) ? null : + arduinoContextModule.default.boardManager.currentBoard.name, + }; }); - registerArduinoCommand("arduino.addLibPath", (path) => ArduinoContext.arduinoApp.addLibPath(path)); - registerArduinoCommand("arduino.openExample", (path) => ArduinoContext.arduinoApp.openExample(path)); - registerArduinoCommand("arduino.loadPackages", async () => await ArduinoContext.boardManager.loadPackages(true)); + registerArduinoCommand("arduino.addLibPath", (path) => arduinoContextModule.default.arduinoApp.addLibPath(path)); + registerArduinoCommand("arduino.openExample", (path) => arduinoContextModule.default.arduinoApp.openExample(path)); + registerArduinoCommand("arduino.loadPackages", async () => await arduinoContextModule.default.boardManager.loadPackages(true)); registerArduinoCommand("arduino.installBoard", async (packageName, arch, version: string = "") => { - let installed = false; - const installedBoards = ArduinoContext.boardManager.installedBoards; + let installed = false; + const installedBoards = arduinoContextModule.default.boardManager.installedBoards; installedBoards.forEach((board: IBoard, key: string) => { let _packageName: string; if (board.platform.package && board.platform.package.name) { @@ -267,15 +217,15 @@ export async function activate(context: vscode.ExtensionContext) { } if (packageName === _packageName && - arch === board.platform.architecture && - (!version || version === board.platform.installedVersion)) { + arch === board.platform.architecture && + (!version || version === board.platform.installedVersion)) { installed = true; } }); if (!installed) { - await ArduinoContext.boardManager.loadPackages(true); - await ArduinoContext.arduinoApp.installBoard(packageName, arch, version); + await arduinoContextModule.default.boardManager.loadPackages(true); + await arduinoContextModule.default.arduinoApp.installBoard(packageName, arch, version); } return; }); @@ -290,26 +240,24 @@ export async function activate(context: vscode.ExtensionContext) { registerNonArduinoCommand("arduino.sendMessageToSerialPort", () => serialMonitor.sendMessageToSerialPort()); registerNonArduinoCommand("arduino.closeSerialMonitor", (port, showWarning = true) => serialMonitor.closeSerialMonitor(port, showWarning)); - const completionProvider = new CompletionProvider(); + const completionProvider = new completionProviderModule.CompletionProvider(); context.subscriptions.push(vscode.languages.registerCompletionItemProvider(ARDUINO_MODE, completionProvider, "<", '"', ".")); - context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("arduino", new ArduinoDebugConfigurationProvider())); - - UsbDetector.getInstance().initialize(context.extensionPath); - UsbDetector.getInstance().startListening(); + context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("arduino", new + arduinoDebugConfigurationProviderModule.ArduinoDebugConfigurationProvider())); if (ArduinoWorkspace.rootPath && ( util.fileExistsSync(path.join(ArduinoWorkspace.rootPath, ARDUINO_CONFIG_FILE)) || (openEditor && openEditor.document.fileName.endsWith(".ino")))) { (async () => { - if (!ArduinoContext.initialized) { - await ArduinoActivator.activate(); + if (!arduinoContextModule.default.initialized) { + await arduinoActivatorModule.default.activate(); } if (!SerialMonitor.getInstance().initialized) { SerialMonitor.getInstance().initialize(); } - ArduinoContext.boardManager.updateStatusBar(true); - ArduinoContext.arduinoApp.tryToUpdateIncludePaths(); + arduinoContextModule.default.boardManager.updateStatusBar(true); + arduinoContextModule.default.arduinoApp.tryToUpdateIncludePaths(); vscode.commands.executeCommand("setContext", "vscode-arduino:showExampleExplorer", true); })(); } @@ -319,13 +267,13 @@ export async function activate(context: vscode.ExtensionContext) { && path.basename(path.dirname(activeEditor.document.fileName)) === ".vscode") || activeEditor.document.fileName.endsWith(".ino") )) { - if (!ArduinoContext.initialized) { - await ArduinoActivator.activate(); + if (!arduinoContextModule.default.initialized) { + await arduinoActivatorModule.default.activate(); } if (!SerialMonitor.getInstance().initialized) { SerialMonitor.getInstance().initialize(); } - ArduinoContext.boardManager.updateStatusBar(true); + arduinoContextModule.default.boardManager.updateStatusBar(true); vscode.commands.executeCommand("setContext", "vscode-arduino:showExampleExplorer", true); } }); @@ -356,11 +304,74 @@ export async function activate(context: vscode.ExtensionContext) { }); } Logger.traceUserData("end-activate-extension", { correlationId: activeGuid }); + + setTimeout(() => { + const arduinoManagerProvider = new arduinoContentProviderModule.ArduinoContentProvider(context.extensionPath); + context.subscriptions.push(vscode.workspace.registerTextDocumentContentProvider(ARDUINO_MANAGER_PROTOCOL, arduinoManagerProvider)); + registerArduinoCommand("arduino.showBoardManager", async () => { + const panel = vscode.window.createWebviewPanel("arduinoBoardManager", "Arduino Board Manager", vscode.ViewColumn.Two, { + enableScripts: true, + retainContextWhenHidden: true, + }); + panel.webview.html = await arduinoManagerProvider.provideTextDocumentContent(BOARD_MANAGER_URI); + }); + registerArduinoCommand("arduino.showLibraryManager", async () => { + const panel = vscode.window.createWebviewPanel("arduinoLibraryManager", "Arduino Library Manager", vscode.ViewColumn.Two, { + enableScripts: true, + retainContextWhenHidden: true, + }); + panel.webview.html = await arduinoManagerProvider.provideTextDocumentContent(LIBRARY_MANAGER_URI); + }); + registerArduinoCommand("arduino.showBoardConfig", async () => { + const panel = vscode.window.createWebviewPanel("arduinoBoardConfiguration", "Arduino Board Configuration", vscode.ViewColumn.Two, { + enableScripts: true, + retainContextWhenHidden: true, + }); + panel.webview.html = await arduinoManagerProvider.provideTextDocumentContent(BOARD_CONFIG_URI); + }); + registerArduinoCommand("arduino.showExamples", async (forceRefresh: boolean = false) => { + vscode.commands.executeCommand("setContext", "vscode-arduino:showExampleExplorer", true); + if (forceRefresh) { + vscode.commands.executeCommand("arduino.reloadExample"); + } + const panel = vscode.window.createWebviewPanel("arduinoExamples", "Arduino Examples", vscode.ViewColumn.Two, { + enableScripts: true, + retainContextWhenHidden: true, + }); + panel.webview.html = await arduinoManagerProvider.provideTextDocumentContent(EXAMPLES_URI); + }); + // change board type + registerArduinoCommand("arduino.changeBoardType", async () => { + try { + await arduinoContextModule.default.boardManager.changeBoardType(); + } catch (exception) { + Logger.error(exception.message); + } + arduinoManagerProvider.update(LIBRARY_MANAGER_URI); + arduinoManagerProvider.update(EXAMPLES_URI); + }, () => { + return { board: arduinoContextModule.default.boardManager.currentBoard.name }; + }); + registerArduinoCommand("arduino.reloadExample", () => { + arduinoManagerProvider.update(EXAMPLES_URI); + }, () => { + return { + board: (arduinoContextModule.default.boardManager.currentBoard === null) ? null : + arduinoContextModule.default.boardManager.currentBoard.name, + }; + }); + }, 100); + + setTimeout(() => { + // delay to detect usb + usbDetectorModule.UsbDetector.getInstance().initialize(context.extensionPath); + usbDetectorModule.UsbDetector.getInstance().startListening(); + }, 200); } export async function deactivate() { const monitor = SerialMonitor.getInstance(); await monitor.closeSerialMonitor(null, false); - UsbDetector.getInstance().stopListening(); + usbDetectorModule.UsbDetector.getInstance().stopListening(); Logger.traceUserData("deactivate-extension"); } diff --git a/src/serialmonitor/serialportctrl.ts b/src/serialmonitor/serialportctrl.ts index cc282773..a989f641 100644 --- a/src/serialmonitor/serialportctrl.ts +++ b/src/serialmonitor/serialportctrl.ts @@ -22,7 +22,7 @@ export enum SerialPortEnding { export class SerialPortCtrl { public static get serialport(): any { if (!SerialPortCtrl._serialport) { - SerialPortCtrl._serialport = require("../../../vendor/node-usb-native").SerialPort; + SerialPortCtrl._serialport = require("../../vendor/node-usb-native").SerialPort; } return SerialPortCtrl._serialport; } diff --git a/src/serialmonitor/usbDetector.ts b/src/serialmonitor/usbDetector.ts index 6f12ca5f..14d1b515 100644 --- a/src/serialmonitor/usbDetector.ts +++ b/src/serialmonitor/usbDetector.ts @@ -45,7 +45,7 @@ export class UsbDetector { if (os.platform() === "linux" || !enableUSBDetection) { return; } - this._usbDetector = require("../../../vendor/node-usb-native").detector; + this._usbDetector = require("../../vendor/node-usb-native").detector; if (!this._usbDetector) { return; diff --git a/test/extension.test.ts b/test/extension.test.ts index 1309bbdc..b1ff1ee2 100644 --- a/test/extension.test.ts +++ b/test/extension.test.ts @@ -69,7 +69,7 @@ suite("Arduino: Extension Tests", () => { // When running test on osx, the vscode instance is hanging there after tests finished and cause mocha timeout. // As a workaround, closing usb-detection process manually would make test window exit normally. if (os.platform() !== "linux") { - const usbDector = require("../../vendor/node-usb-native").detector; + const usbDector = require("../../out/vendor/node-usb-native").detector; usbDector.stopMonitoring(); } }); diff --git a/tslint.json b/tslint.json index 61652cf7..71defba5 100644 --- a/tslint.json +++ b/tslint.json @@ -1,6 +1,7 @@ { "extends": "tslint:latest", "rules": { + "no-var-requires": false, "variable-name": [ true, "allow-leading-underscore" diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..d6b24e30 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,64 @@ +'use strict'; + +const path = require('path'); +const cp = require('child_process'); +const fs = require('fs-plus'); + +function getEntry() { + const entry = {}; + const npmListRes = cp.execSync('npm list -only prod -json', { + encoding: 'utf8' + }); + const mod = JSON.parse(npmListRes); + const unbundledModule = ['impor', 'uuid']; + + for (const mod of unbundledModule) { + const p = 'node_modules/' + mod; + fs.copySync(p, 'out/node_modules/' + mod); + } + + const list = getDependeciesFromNpm(mod); + const moduleList = list.filter((value, index, self) => { + return self.indexOf(value) === index && unbundledModule.indexOf(value) === -1 && !/^@types\//.test(value); + }); + + for (const mod of moduleList) { + entry[mod] = './node_modules/' + mod; + } + + return entry; +} + +function getDependeciesFromNpm(mod) { + let list = []; + const deps = mod.dependencies; + if (!deps) { + return list; + } + for (const m of Object.keys(deps)) { + list.push(m); + list = list.concat(getDependeciesFromNpm(deps[m])); + } + return list; +} + +/**@type {import('webpack').Configuration}*/ +const config = { + target: 'node', + + entry: getEntry(), + output: { + path: path.resolve(__dirname, 'out/node_modules'), + filename: '[name].js', + libraryTarget: "commonjs2", + devtoolModuleFilenameTemplate: "../[resource-path]", + }, + externals: { + vscode: "commonjs vscode" + }, + resolve: { + extensions: ['.js', '.json'] + } +} + +module.exports = config; \ No newline at end of file