2022-06-14 14:37:10 +08:00
/ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Copyright ( c ) Microsoft Corporation . All rights reserved .
* Licensed under the MIT License . See License . txt in the project root for license information .
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- * /
//@ts-check
/** @typedef {import('webpack').Configuration} WebpackConfig **/
'use strict' ;
const path = require ( 'path' ) ;
const fs = require ( 'fs' ) ;
const merge = require ( 'merge-options' ) ;
const CopyWebpackPlugin = require ( 'copy-webpack-plugin' ) ;
const { NLSBundlePlugin } = require ( 'vscode-nls-dev/lib/webpack-bundler' ) ;
2024-04-30 20:57:13 +08:00
const { DefinePlugin , optimize } = require ( 'webpack' ) ;
const tsLoaderOptions = {
compilerOptions : {
'sourceMap' : true ,
} ,
onlyCompileBundledFiles : true ,
} ;
2022-06-14 14:37:10 +08:00
2023-10-25 17:04:51 +08:00
function withNodeDefaults ( /**@type WebpackConfig & { context: string }*/ extConfig ) {
2024-04-30 20:57:13 +08:00
const defaultConfig = {
2022-06-14 14:37:10 +08: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
node : {
_ _dirname : false // leave the __dirname-behaviour intact
} ,
2024-04-30 20:57:13 +08:00
2022-06-14 14:37:10 +08:00
resolve : {
2024-04-30 20:57:13 +08:00
conditionNames : [ 'import' , 'require' , 'node-addons' , 'node' ] ,
2022-06-14 14:37:10 +08:00
mainFields : [ 'module' , 'main' ] ,
extensions : [ '.ts' , '.js' ] // support ts-files and js-files
} ,
module : {
rules : [ {
test : /\.ts$/ ,
exclude : /node_modules/ ,
use : [ {
// vscode-nls-dev loader:
// * rewrite nls-calls
loader : 'vscode-nls-dev/lib/webpack-loader' ,
options : {
base : path . join ( extConfig . context , 'src' )
}
} , {
// configure TypeScript loader:
// * enable sources maps for end-to-end source maps
loader : 'ts-loader' ,
2024-04-30 20:57:13 +08:00
options : tsLoaderOptions
} , {
loader : path . resolve ( _ _dirname , 'mangle-loader.js' ) ,
2022-06-14 14:37:10 +08:00
options : {
2024-04-30 20:57:13 +08:00
configFile : path . join ( extConfig . context , 'tsconfig.json' )
} ,
} , ]
2022-06-14 14:37:10 +08:00
} ]
} ,
externals : {
'vscode' : 'commonjs vscode' , // ignored because it doesn't exist,
'applicationinsights-native-metrics' : 'commonjs applicationinsights-native-metrics' , // ignored because we don't ship native module
2024-04-30 20:57:13 +08:00
'@azure/functions-core' : 'commonjs azure/functions-core' , // optioinal dependency of appinsights that we don't use
'@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
2022-06-14 14:37:10 +08:00
} ,
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' ) ,
libraryTarget : 'commonjs' ,
} ,
// yes, really source maps
devtool : 'source-map' ,
plugins : nodePlugins ( extConfig . context ) ,
} ;
return merge ( defaultConfig , extConfig ) ;
}
2024-04-30 20:57:13 +08:00
/ * *
*
* @ param { string } context
* /
2022-06-14 14:37:10 +08:00
function nodePlugins ( context ) {
// 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 )
] ;
}
/ * *
* @ typedef { {
* configFile ? : string
* } } AdditionalBrowserConfig
* /
2023-10-25 17:04:51 +08:00
function withBrowserDefaults ( /**@type WebpackConfig & { context: string }*/ extConfig , /** @type AdditionalBrowserConfig */ additionalOptions = { } ) {
2022-06-14 14:37:10 +08:00
/** @type WebpackConfig */
2024-04-30 20:57:13 +08:00
const defaultConfig = {
2022-06-14 14:37:10 +08: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 : {
mainFields : [ 'browser' , 'module' , 'main' ] ,
extensions : [ '.ts' , '.js' ] , // support ts-files and js-files
fallback : {
'path' : require . resolve ( 'path-browserify' ) ,
'util' : require . resolve ( 'util' )
}
} ,
module : {
rules : [ {
test : /\.ts$/ ,
exclude : /node_modules/ ,
2024-04-30 20:57:13 +08:00
use : [
{
// configure TypeScript loader:
// * enable sources maps for end-to-end source maps
loader : 'ts-loader' ,
options : {
... tsLoaderOptions ,
... ( additionalOptions ? { } : { configFile : additionalOptions . configFile } ) ,
}
} ,
{
loader : path . resolve ( _ _dirname , 'mangle-loader.js' ) ,
options : {
configFile : path . join ( extConfig . context , additionalOptions ? . configFile ? ? 'tsconfig.json' )
2022-06-14 14:37:10 +08:00
} ,
2024-04-30 20:57:13 +08:00
} ,
]
} , {
test : /\.wasm$/ ,
type : 'asset/inline'
2022-06-14 14:37:10 +08:00
} ]
} ,
externals : {
'vscode' : 'commonjs vscode' , // ignored because it doesn't exist,
'applicationinsights-native-metrics' : 'commonjs applicationinsights-native-metrics' , // ignored because we don't ship native module
2024-04-30 20:57:13 +08:00
'@azure/functions-core' : 'commonjs azure/functions-core' , // optioinal dependency of appinsights that we don't use
'@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
2022-06-14 14:37:10 +08: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' ,
2024-04-30 20:57:13 +08:00
plugins : browserPlugins ( extConfig . context )
2022-06-14 14:37:10 +08:00
} ;
return merge ( defaultConfig , extConfig ) ;
}
2024-04-30 20:57:13 +08:00
/ * *
*
* @ param { string } context
* /
function browserPlugins ( context ) {
// 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 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' )
} ) ,
// TODO: bring this back once vscode-nls-dev supports browser
// new NLSBundlePlugin(id)
] ;
}
2022-06-14 14:37:10 +08:00
module . exports = withNodeDefaults ;
module . exports . node = withNodeDefaults ;
module . exports . browser = withBrowserDefaults ;
module . exports . nodePlugins = nodePlugins ;
module . exports . browserPlugins = browserPlugins ;