2018-08-17 13:56:57 +00:00
/ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Copyright ( c ) Microsoft Corporation . All rights reserved .
* Licensed under the MIT License . See License . txt in the project root for license information .
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- * /
2018-08-21 14:39:52 +00:00
//@ts-check
/** @typedef {import('webpack').Configuration} WebpackConfig **/
2018-08-17 13:56:57 +00:00
'use strict' ;
const path = require ( 'path' ) ;
2019-07-10 07:38:05 +00:00
const fs = require ( 'fs' ) ;
2018-08-20 13:23:56 +00:00
const merge = require ( 'merge-options' ) ;
2018-08-24 14:37:10 +00:00
const CopyWebpackPlugin = require ( 'copy-webpack-plugin' ) ;
2019-07-10 07:38:05 +00:00
const { NLSBundlePlugin } = require ( 'vscode-nls-dev/lib/webpack-bundler' ) ;
2022-07-14 18:55:38 +00:00
const { DefinePlugin , optimize } = require ( 'webpack' ) ;
2018-08-21 14:39:52 +00:00
2022-11-29 22:20:23 +00:00
const tsLoaderOptions = {
compilerOptions : {
'sourceMap' : true ,
} ,
onlyCompileBundledFiles : true ,
} ;
2023-04-03 14:10:40 +00:00
function withNodeDefaults ( /**@type WebpackConfig & { context: string }*/ extConfig ) {
2022-06-08 15:49:21 +00:00
const defaultConfig = {
2018-08-17 13:56:57 +00:00
mode : 'none' , // this leaves the source code as close as possible to the original (when packaging we set this to 'production')
target : 'node' , // extensions run in a node context
2018-09-03 10:32:48 +00:00
node : {
_ _dirname : false // leave the __dirname-behaviour intact
} ,
2018-08-17 13:56:57 +00:00
resolve : {
2018-09-13 09:48:06 +00:00
mainFields : [ 'module' , 'main' ] ,
2018-08-20 10:18:30 +00:00
extensions : [ '.ts' , '.js' ] // support ts-files and js-files
2018-08-17 13:56:57 +00:00
} ,
module : {
2018-08-20 10:18:30 +00:00
rules : [ {
test : /\.ts$/ ,
exclude : /node_modules/ ,
use : [ {
// vscode-nls-dev loader:
// * rewrite nls-calls
2018-08-24 14:37:10 +00:00
loader : 'vscode-nls-dev/lib/webpack-loader' ,
options : {
base : path . join ( extConfig . context , 'src' )
}
2018-08-20 10:18:30 +00:00
} , {
// configure TypeScript loader:
// * enable sources maps for end-to-end source maps
loader : 'ts-loader' ,
2022-11-29 22:20:23 +00:00
options : tsLoaderOptions
2022-11-15 00:34:04 +00:00
} , {
2022-11-15 00:45:30 +00:00
loader : path . resolve ( _ _dirname , 'mangle-loader.js' ) ,
2022-11-15 00:34:04 +00:00
options : {
configFile : path . join ( extConfig . context , 'tsconfig.json' )
} ,
} , ]
2018-08-20 10:18:30 +00:00
} ]
2018-08-17 13:56:57 +00:00
} ,
2018-08-20 13:23:56 +00:00
externals : {
2021-03-23 01:30:56 +00:00
'vscode' : 'commonjs vscode' , // ignored because it doesn't exist,
'applicationinsights-native-metrics' : 'commonjs applicationinsights-native-metrics' , // ignored because we don't ship native module
2023-08-24 19:53:41 +00:00
'@azure/functions-core' : 'commonjs azure/functions-core' , // optioinal dependency of appinsights that we don't use
2022-11-09 02:58:28 +00:00
'@opentelemetry/tracing' : 'commonjs @opentelemetry/tracing' , // ignored because we don't ship this module
'@opentelemetry/instrumentation' : 'commonjs @opentelemetry/instrumentation' , // ignored because we don't ship this module
'@azure/opentelemetry-instrumentation-azure-sdk' : 'commonjs @azure/opentelemetry-instrumentation-azure-sdk' , // ignored because we don't ship this module
2018-08-20 13:23:56 +00:00
} ,
2018-08-17 13:56:57 +00:00
output : {
// all output goes into `dist`.
// packaging depends on that and this must always be like it
filename : '[name].js' ,
2018-08-20 13:23:56 +00:00
path : path . join ( extConfig . context , 'dist' ) ,
2019-12-31 08:53:57 +00:00
libraryTarget : 'commonjs' ,
2018-08-17 13:56:57 +00:00
} ,
// yes, really source maps
2018-08-24 14:37:10 +00:00
devtool : 'source-map' ,
2021-07-09 09:55:21 +00:00
plugins : nodePlugins ( extConfig . context ) ,
2018-08-21 08:27:03 +00:00
} ;
2018-08-20 13:23:56 +00:00
return merge ( defaultConfig , extConfig ) ;
2020-07-21 05:46:09 +00:00
}
2020-06-25 21:21:56 +00:00
2022-08-08 16:11:16 +00:00
/ * *
*
* @ param { string } context
* /
2021-07-09 09:55:21 +00:00
function nodePlugins ( context ) {
2021-07-08 19:41:03 +00:00
// Need to find the top-most `package.json` file
const folderName = path . relative ( _ _dirname , context ) . split ( /[\\\/]/ ) [ 0 ] ;
const pkgPath = path . join ( _ _dirname , folderName , 'package.json' ) ;
const pkg = JSON . parse ( fs . readFileSync ( pkgPath , 'utf8' ) ) ;
const id = ` ${ pkg . publisher } . ${ pkg . name } ` ;
return [
new CopyWebpackPlugin ( {
patterns : [
{ from : 'src' , to : '.' , globOptions : { ignore : [ '**/test/**' , '**/*.ts' ] } , noErrorOnMissing : true }
]
} ) ,
new NLSBundlePlugin ( id )
] ;
}
2021-07-23 00:00:09 +00:00
/ * *
* @ typedef { {
* configFile ? : string
* } } AdditionalBrowserConfig
* /
2021-07-08 19:41:03 +00:00
2023-04-03 14:10:40 +00:00
function withBrowserDefaults ( /**@type WebpackConfig & { context: string }*/ extConfig , /** @type AdditionalBrowserConfig */ additionalOptions = { } ) {
2020-06-25 21:21:56 +00:00
/** @type WebpackConfig */
2022-06-08 15:49:21 +00:00
const defaultConfig = {
2020-06-25 21:21:56 +00:00
mode : 'none' , // this leaves the source code as close as possible to the original (when packaging we set this to 'production')
target : 'webworker' , // extensions run in a webworker context
resolve : {
2021-07-26 17:44:43 +00:00
mainFields : [ 'browser' , 'module' , 'main' ] ,
2020-06-25 21:21:56 +00:00
extensions : [ '.ts' , '.js' ] , // support ts-files and js-files
2021-07-08 19:41:03 +00:00
fallback : {
'path' : require . resolve ( 'path-browserify' ) ,
'util' : require . resolve ( 'util' )
2020-06-25 21:21:56 +00:00
}
} ,
module : {
rules : [ {
test : /\.ts$/ ,
exclude : /node_modules/ ,
2022-08-09 16:30:23 +00:00
use : [
{
// configure TypeScript loader:
// * enable sources maps for end-to-end source maps
loader : 'ts-loader' ,
options : {
2022-11-29 22:20:23 +00:00
... tsLoaderOptions ,
2022-11-15 00:45:30 +00:00
... ( additionalOptions ? { } : { configFile : additionalOptions . configFile } ) ,
2022-08-09 16:30:23 +00:00
}
2022-11-15 00:34:04 +00:00
} ,
{
2022-11-15 00:45:30 +00:00
loader : path . resolve ( _ _dirname , 'mangle-loader.js' ) ,
2022-11-15 00:34:04 +00:00
options : {
configFile : path . join ( extConfig . context , additionalOptions ? . configFile ? ? 'tsconfig.json' )
} ,
} ,
]
2020-06-25 21:21:56 +00:00
} ]
} ,
externals : {
2021-03-23 01:30:56 +00:00
'vscode' : 'commonjs vscode' , // ignored because it doesn't exist,
'applicationinsights-native-metrics' : 'commonjs applicationinsights-native-metrics' , // ignored because we don't ship native module
2023-08-24 19:53:41 +00:00
'@azure/functions-core' : 'commonjs azure/functions-core' , // optioinal dependency of appinsights that we don't use
2022-11-09 02:58:28 +00:00
'@opentelemetry/tracing' : 'commonjs @opentelemetry/tracing' , // ignored because we don't ship this module
'@opentelemetry/instrumentation' : 'commonjs @opentelemetry/instrumentation' , // ignored because we don't ship this module
'@azure/opentelemetry-instrumentation-azure-sdk' : 'commonjs @azure/opentelemetry-instrumentation-azure-sdk' , // ignored because we don't ship this module
2020-06-25 21:21:56 +00:00
} ,
performance : {
hints : false
} ,
output : {
// all output goes into `dist`.
// packaging depends on that and this must always be like it
filename : '[name].js' ,
path : path . join ( extConfig . context , 'dist' , 'browser' ) ,
libraryTarget : 'commonjs' ,
} ,
// yes, really source maps
devtool : 'source-map' ,
2022-08-08 16:11:16 +00:00
plugins : browserPlugins ( extConfig . context )
2020-06-25 21:21:56 +00:00
} ;
return merge ( defaultConfig , extConfig ) ;
2020-07-21 05:46:09 +00:00
}
2020-06-25 21:21:56 +00:00
2022-08-08 16:11:16 +00:00
/ * *
*
* @ param { string } context
* /
function browserPlugins ( context ) {
// Need to find the top-most `package.json` file
2022-08-09 16:30:23 +00:00
// const folderName = path.relative(__dirname, context).split(/[\\\/]/)[0];
// const pkgPath = path.join(__dirname, folderName, 'package.json');
// const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
// const id = `${pkg.publisher}.${pkg.name}`;
2022-08-08 16:11:16 +00:00
return [
new optimize . LimitChunkCountPlugin ( {
maxChunks : 1
} ) ,
new CopyWebpackPlugin ( {
patterns : [
{ from : 'src' , to : '.' , globOptions : { ignore : [ '**/test/**' , '**/*.ts' ] } , noErrorOnMissing : true }
]
} ) ,
new DefinePlugin ( {
'process.platform' : JSON . stringify ( 'web' ) ,
'process.env' : JSON . stringify ( { } ) ,
'process.env.BROWSER_ENV' : JSON . stringify ( 'true' )
} ) ,
2022-08-09 16:30:23 +00:00
// TODO: bring this back once vscode-nls-dev supports browser
// new NLSBundlePlugin(id)
2022-08-08 16:11:16 +00:00
] ;
}
2020-06-25 21:21:56 +00:00
module . exports = withNodeDefaults ;
module . exports . node = withNodeDefaults ;
module . exports . browser = withBrowserDefaults ;
2021-07-09 09:55:21 +00:00
module . exports . nodePlugins = nodePlugins ;
module . exports . browserPlugins = browserPlugins ;
2020-06-25 21:21:56 +00:00