UNPKG

@vis.gl/dev-tools

Version:

Dev tools for vis.gl frameworks

154 lines 5.38 kB
// / For bundles published to npm import fs from 'fs'; import { join, dirname } from 'path'; import util from 'util'; import { getOcularConfig } from '../helpers/get-ocular-config.js'; import ext from 'esbuild-plugin-external-global'; /** * Get list of dependencies to exclude using esbuild-plugin-external-global * @param externalPackages string[] */ // function getExternalGlobalsAMD(externalPackages) { // const externals = {}; // for (const packageName of externalPackages) { // externals[packageName] = `typeof require === 'function' ? require('${packageName}') : null`; // } // return externals; // } /** * Get list of dependencies to exclude using esbuild-plugin-external-global * @param externalPackages string[] * @param mapping {[pattern: string]: replacement} */ function getExternalGlobalsIIFE(externalPackages, mapping) { const externals = {}; for (const packageName of externalPackages) { for (const key in mapping) { if (packageName.search(key) === 0) { externals[packageName] = mapping[key]; break; } } } return externals; } // esbuild does not support umd format // Work around from https://github.com/evanw/esbuild/issues/819 // Template: https://webpack.js.org/configuration/output/#type-umd function umdWrapper(libName) { return { format: 'iife', globalName: '__exports__', banner: { js: `\ (function webpackUniversalModuleDefinition(root, factory) { if (typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if (typeof define === 'function' && define.amd) define([], factory); ${libName ? `else if (typeof exports === 'object') exports['${libName}'] = factory(); else root['${libName}'] = factory();` : `else { var a = factory(); for (var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; }`}})(globalThis, function () {` }, footer: { js: `\ return __exports__; });` } }; } /** Returns esbuild config for building .cjs bundles */ export async function getCJSExportConfig(opts) { return { entryPoints: [opts.input], outfile: opts.output, bundle: true, format: 'cjs', // Node 16 is out of support, kept for compatibility. Move to 18? target: 'node16', packages: 'external', sourcemap: true, logLevel: 'info' }; } /* eslint-disable max-statements,complexity */ /** Returns esbuild config for building standalone bundles */ export async function getBundleConfig(opts) { // This script must be executed in a submodule's directory const packageRoot = process.cwd(); const packageInfo = JSON.parse(fs.readFileSync(join(packageRoot, 'package.json'), 'utf-8')); const projectRoot = dirname(packageRoot).endsWith('modules') ? join(packageRoot, '../..') : packageRoot; const devMode = opts.env === 'dev'; const ocularConfig = await getOcularConfig({ root: projectRoot, aliasMode: devMode ? 'src' : 'dist' }); opts = { ...ocularConfig.bundle, ...opts }; const { input, output = devMode ? './dist/dist.dev.js' : './dist.min.js', format = 'iife', target = ['esnext'], externals, globalName, debug, sourcemap = false } = opts; let externalPackages = Object.keys(packageInfo.peerDependencies || {}); if (typeof externals === 'string') { externalPackages = externalPackages.concat(externals.split(',')); } else if (Array.isArray(externals)) { externalPackages = externalPackages.concat(externals); } const config = { entryPoints: [input], outfile: output, bundle: true, // @ts-expect-error umd is not supported by esbuild, will be overwritten below format, minify: !devMode, alias: ocularConfig.aliases, platform: 'browser', target, logLevel: 'info', sourcemap, plugins: [] }; if (globalName) { config.globalName = globalName; } let externalGlobals; switch (format) { case 'cjs': case 'esm': // Use esbuild's built-in external functionality config.packages = 'external'; if (externals) { config.external = externals; } break; case 'umd': Object.assign(config, umdWrapper(globalName)); externalGlobals = getExternalGlobalsIIFE(externalPackages, ocularConfig.bundle.globals); break; case 'iife': externalGlobals = getExternalGlobalsIIFE(externalPackages, ocularConfig.bundle.globals); break; default: break; } if (externalGlobals) { config.plugins.unshift(ext.externalGlobalPlugin(externalGlobals)); } if (debug) { const printableConfig = { ...config, plugins: config.plugins.map((item) => { return { name: item.name, options: externalGlobals }; }) }; console.log(util.inspect(printableConfig, { showHidden: false, depth: null, colors: true })); } return config; } //# sourceMappingURL=get-esbuild-config.js.map