I want to create a library using Typescript. This library can be used inside Node and browser environments, so the configuration supplies support for both
( tsconfig.json )
{
"compilerOptions": {
"baseUrl": ".",
"declaration": true,
"esModuleInterop": true,
"lib": [ "esnext", "dom" ],
"module": "commonjs",
"outDir": "dist",
"resolveJsonModule": true,
"strict": true,
"target": "es2019",
},
"include": [
"./**/*.ts"
],
"exclude": [
"./dist"
]
}
I'm using esbuild as a bundler. The package.json contains
{
"name": "my-lib",
"version": "1.0.0",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"scripts": {
"build": "tsc && esbuild ./dist/index.js --bundle --minify --sourcemap --outfile=./bundle/index.js"
},
"dependencies": {
"esbuild": "0.14.36"
},
"devDependencies": {
"typescript": "4.6.3"
}
}
The library makes use of some "private" helper functions, I'm using the following sample code
import { TextEncoder } from 'util';
const encodeInput = function (input: string): Uint8Array {
const textEncoder = new TextEncoder();
return textEncoder.encode(input);
}
Running the build script command throws an esbuild error telling me that this only works for Node environments, not in the browser, which makes sense because
- this class comes from the
util
package https://nodejs.org/api/util.html#class-utiltextencoder - this class does not require any imports inside browser environments https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder
How can I make sure this library works in "both" worlds?