From d1071f131f61e11bed041f7159b619678c3416a1 Mon Sep 17 00:00:00 2001 From: euberdeveloper Date: Tue, 11 Jun 2024 22:08:12 +0200 Subject: [PATCH] build: add building with esbuild Signed-off-by: euberdeveloper --- build.mjs | 62 +++++++++++++++++++++++++++++++ package.json | 5 ++- webpack.config.js | 95 ----------------------------------------------- 3 files changed, 66 insertions(+), 96 deletions(-) create mode 100644 build.mjs delete mode 100644 webpack.config.js diff --git a/build.mjs b/build.mjs new file mode 100644 index 0000000..2e2c9f8 --- /dev/null +++ b/build.mjs @@ -0,0 +1,62 @@ +import fs from 'node:fs'; +import { build } from 'esbuild'; +import * as importMap from "esbuild-plugin-import-map"; + +import packageJson from './package.json' assert { type: 'json' }; + +importMap.load({ + imports: { + './index': '../lib/esm/index.esm.js' + } +}); + +function getExternalDependencies(allow = []) { + const deps = packageJson.dependencies ? Object.keys(packageJson.dependencies).filter(dep => !allow.includes(dep)) : []; + const peerDeps = packageJson.peerDependencies ? Object.keys(packageJson.peerDependencies).filter(dep => !allow.includes(dep)) : []; + return [...deps, ...peerDeps]; +} + +async function buildModule() { + const shared = { + platform: 'node', + entryPoints: ['source/lib/index.ts'], + bundle: true, + minify: true, + treeShaking: true, + sourcemap: true + }; + + await build({ + ...shared, + outfile: 'bundled/lib/commonjs/index.js', + format: 'cjs', + external: getExternalDependencies() + }); + + await build({ + ...shared, + outfile: 'bundled/lib/esm/index.esm.js', + format: 'esm', + external: getExternalDependencies() + }); + + await build({ + ...shared, + entryPoints: ['source/bin/index.ts'], + outfile: 'bundled/bin/index.js', + format: 'esm', + external: getExternalDependencies(), + plugins: [importMap.plugin()], + define: { + '__VERSION__': `"${packageJson.version}"` + } + }); +} + +function generateCommonjsPackageJson() { + const packageJsonCommonJs = JSON.stringify({ ...packageJson, type: undefined }, null, 2); + fs.writeFileSync('./bundled/lib/commonjs/package.json', packageJsonCommonJs); +} + +await buildModule(); +generateCommonjsPackageJson(); \ No newline at end of file diff --git a/package.json b/package.json index e7fd0bb..6cd944d 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,10 @@ "pretranspile": "shx rm -rf dist", "transpile": "tsc -p source", "prebundle": "shx rm -rf dist bundled", - "bundle": "webpack", + "bundle:esm": "node build.mjs", + "bundle:dts": "dts-bundle-generator -o bundled/lib/commonjs/index.d.ts --project source/tsconfig.json source/lib/index.ts", + "bundle": "pnpm bundle:esm && pnpm bundle:dts", + "postbundle:dts": "cp bundled/lib/commonjs/index.d.ts bundled/lib/esm/index.d.ts", "script:getr:linux": "node scripts/generate-expected-tests-results linux", "script:getr:mac": "node scripts/generate-expected-tests-results mac", "script:getr:windows": "node scripts/generate-expected-tests-results windows", diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 09e6cdd..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,95 +0,0 @@ -const path = require('path'); -const webpack = require('webpack'); -const nodeExternals = require('webpack-node-externals'); -const { BundleDeclarationsWebpackPlugin } = require('bundle-declarations-webpack-plugin'); - -const libConfig = { - target: 'node', - mode: 'production', - // devtool: 'source-map', - entry: { - index: './source/lib/index.ts' - }, - resolve: { - extensions: ['.ts', '.js'] - }, - module: { - rules: [ - { - test: /\.ts?$/, - include: path.resolve(__dirname, 'source', 'lib'), - use: [ - { - loader: 'ts-loader' - } - ] - } - ] - }, - plugins: [ - new BundleDeclarationsWebpackPlugin({ - entry: "./source/lib/index.ts", - outFile: "./index.d.ts" - }) - ], - externals: [nodeExternals()], - output: { - path: path.resolve(__dirname, 'bundled', 'lib'), - filename: 'index.js', - library: 'dree', - libraryTarget: 'umd', - globalObject: 'this', - umdNamedDefine: true, - } -}; - -const binConfig = { - target: 'node', - mode: 'production', - entry: { - index: './source/bin/index.ts', - }, - resolve: { - extensions: ['.ts', '.js'] - }, - plugins: [ - new webpack.BannerPlugin({ banner: '#!/usr/bin/env node', raw: true }) - ], - module: { - rules: [ - { - test: /\.ts?$/, - include: path.resolve(__dirname, 'source'), - use: [ - { - loader: 'ts-loader' - }, - { - loader: 'shebang-loader' - } - ] - } - ] - }, - externals: [{ - '../lib/index': { - amd: '../lib/index', - root: 'dree', - commonjs: '../lib/index', - commonjs2: '../lib/index' - } - }, nodeExternals()], - output: { - path: path.resolve(__dirname, 'bundled', 'bin'), - filename: 'index.js', - library: 'dree', - libraryTarget: 'umd', - globalObject: 'this', - umdNamedDefine: true, - } -}; - -module.exports = [ - libConfig, - binConfig -];