@procore/core-scripts
Version:
A CLI to enhance your development experience
202 lines • 7 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.importContainsPackage = importContainsPackage;
exports.setupWebpack = setupWebpack;
const tslib_1 = require("tslib");
const path = tslib_1.__importStar(require("path"));
const webpack_1 = tslib_1.__importDefault(require("webpack"));
const webpack_bundle_analyzer_1 = require("webpack-bundle-analyzer");
const config_1 = require("../../babel/config");
const environment_1 = require("../../environment");
function importContainsPackage(importFrom, packageName) {
return RegExp(`(^${packageName}?(/|$)).*`).test(importFrom);
}
function getExternals(packageJson) {
var _a;
return Object.keys((_a = packageJson === null || packageJson === void 0 ? void 0 : packageJson.peerDependencies) !== null && _a !== void 0 ? _a : {}).map((peerDep) =>
// eslint-disable-next-line consistent-return
(data, callback) => {
var _a;
// peerDependency matches the import path being requested, externalize the peerDep
const request = (_a = data.request) !== null && _a !== void 0 ? _a : '';
if (importContainsPackage(request, peerDep)) {
return callback(null, {
amd: request,
commonjs: request,
commonjs2: request,
});
}
// continue without externalizing the import
callback();
});
}
function setupWebpack(config, opts) {
const buildFolder = opts.workspace.resolve('dist');
const suffix = Buffer.from(opts.workspace.packageJson.name + opts.workspace.packageJson.version)
.toString('base64')
.slice(0, 5);
const externals = getExternals(opts.workspace.packageJson);
const isProduction = opts.env === 'production';
const envVariables = {
NODE_ENV: opts.env,
};
Object.entries({ index: 'index' }).forEach((entry) => {
const name = entry[0];
const filePath = opts.workspace.resolve('src', entry[1]);
config.entry(name).add(filePath);
});
config.merge({
context: opts.workspace.context,
devtool: isProduction ? 'source-map' : 'eval-source-map',
externals,
mode: opts.env,
output: {
filename: '[name].js',
hashFunction: 'xxhash64',
libraryTarget: 'umd',
path: buildFolder,
},
resolve: {
extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'],
fallback: {
assert: 'assert',
buffer: 'buffer',
console: 'console-browserify',
constants: 'constants-browserify',
crypto: 'crypto-browserify',
domain: 'domain-browser',
events: 'events',
http: 'stream-http',
https: 'https-browserify',
os: 'os-browserify/browser',
path: 'path-browserify',
punycode: 'punycode',
process: 'process/browser',
querystring: 'querystring-es3',
stream: 'stream-browserify',
_stream_duplex: 'readable-stream/duplex',
_stream_passthrough: 'readable-stream/passthrough',
_stream_readable: 'readable-stream/readable',
_stream_transform: 'readable-stream/transform',
_stream_writable: 'readable-stream/writable',
string_decoder: 'string_decoder',
sys: 'util',
timers: 'timers-browserify',
tty: 'tty-browserify',
url: 'url',
util: 'util',
vm: 'vm-browserify',
zlib: 'browserify-zlib',
},
},
});
config.when(Boolean(opts.analyze), () => {
config.plugin('bundleAnalyzer').use(webpack_bundle_analyzer_1.BundleAnalyzerPlugin);
});
config
.plugin('injectEnvVariables')
.use(webpack_1.default.DefinePlugin, [(0, environment_1.stringifyEnvironment)(envVariables)]);
config.plugin('javaScriptSourceMap').use(webpack_1.default.SourceMapDevToolPlugin, [
{
append: '\n//# sourceMappingURL=[url]',
exclude: [/node_modules\/*/],
filename: './[file].map',
moduleFilenameTemplate: (info) => {
return path
.relative(buildFolder, info.absoluteResourcePath)
.replace(/\\/g, '/');
},
publicPath: '/',
test: /\.js$/,
},
]);
config.module
.rule('assets')
.test(/\.(eot|svg|ttf|woff|woff2|png)$/)
.use('url')
.loader(require.resolve('url-loader'));
config.module
.rule('javascript')
.test(/\.(js|mjs|jsx|ts|tsx)$/)
.exclude.add(/node_modules/)
.end()
.use('babel')
.loader(require.resolve('babel-loader'))
.options((0, config_1.createConfigForLib)(opts.env))
.end();
config.module
.rule('styles')
.test(/\.s?css$/)
.exclude.add(/node_modules/)
.end()
.use('style')
.loader(require.resolve('style-loader'))
.options({
esModule: false,
})
.end()
.use('css')
.loader(require.resolve('css-loader'))
.options({
esModule: false,
modules: {
localIdentName: isProduction
? `[hash:base64:5]-${suffix}`
: `[local]-${suffix}`,
},
})
.end()
.use('sass')
.loader(require.resolve('sass-loader'));
config.module
.rule('coreCss')
.test(/@procore\/core-css.*\.css$/)
.include.add(/node_modules/)
.end()
.use('style')
.loader(require.resolve('style-loader'))
.end()
.use('css')
.loader(require.resolve('css-loader'))
.options({
modules: {
localIdentName: isProduction
? `[hash:base64:5]-${suffix}`
: `[local]-${suffix}`,
},
});
config.module
.rule('thirdPartyStyles')
.test(/\.css$/)
.include.add(/node_modules/)
.end()
.exclude.add(/core-css/)
.end()
.use('style')
.loader('style-loader')
.end()
.use('css')
.loader('css-loader');
config.module
.rule('compiler')
.test(/core-css(.*)\.scss$/)
.include.add(/node_modules/)
.end()
.use('style')
.loader(require.resolve('style-loader'))
.end()
.use('css')
.loader(require.resolve('css-loader'))
.options({
modules: {
localIdentName: isProduction
? `[hash:base64:5]-${suffix}`
: `[local]-${suffix}`,
},
})
.end()
.use('sass')
.loader(require.resolve('sass-loader'));
return config;
}
//# sourceMappingURL=setupWebpack.js.map
;