UNPKG

@lit-protocol/esbuild-plugin-polyfill-node

Version:

ESBuild plugin for polyfilling Node.js builtins for edge and Deno

139 lines (111 loc) 4.33 kB
# esbuild-plugin-polyfill-node **LOOKING FOR MAINTAINERS:** Due to time constraints, I am not able to maintain this package anymore. You can contact me via email, Twitter, or Discord. All on my profile. [ESBuild](https://esbuild.github.io/) plugin to polyfill Node.js built-ins and globals, geared towards edge environments and Deno (including Deno Deploy). It consists of two plugins: `polyfillNode`, which should work for most cases, and `polyfillNodeForDeno` which targets Deno and Deno Deploy specifically. ## Installation ```sh npm install esbuild-plugin-polyfill-node ``` ## `polyfillNode` ### Usage ```js import { build } from "esbuild"; import { polyfillNode } from "esbuild-plugin-polyfill-node"; build({ entryPoints: ["src/index.js"], bundle: true, outfile: "dist/bundle.js", plugins: [ polyfillNode({ // Options (optional) }), ], }); ``` ### Options - `globals.buffer`: Whether to inject the `Buffer` global. Disable it to prevent code like `if (typeof Buffer !== "undefined")` from pulling in the (quite large) `buffer-es6` polyfill. Default: `true`. - `globals.process`: Whether to inject the `process` global. Disable it to prevent `process.env.NODE_ENV` from pulling in the `process-es6` polyfill. You can use the `define` option to replace `process.env.NODE_ENV` instead. Default: `true`. - `polyfills`: Polyfills to inject. It's an object where the keys are the names of the polyfills and the values are `false`, `true`, or `"empty"`. `false` disables the polyfill, `true` enables it, and `"empty"` injects an empty polyfill. ### Implemented polyfills Polyfills are provided by the [`@jspm/core`](https://github.com/jspm/jspm-core/) package. - `_stream_duplex` - `_stream_passthrough` - `_stream_readable` - `_stream_transform` - `_stream_writable` - `assert` - `assert/strict` - `async_hooks` - `buffer` - `child_process` - `cluster` - `console` - `constants` - `crypto` - `dgram` - `diagnostics_channel` - `dns` - `domain` - `events` - `fs` - `fs/promises` - `http` - `http2` - `https` - `module` - `net` - `os` - `path` - `perf_hooks` - `process` - `punycode` - `querystring` - `readline` - `repl` - `stream` - `string_decoder` - `sys` - `timers` - `timers/promises` - `tls` - `tty` - `url` - `util` - `v8` - `vm` - `wasi` - `worker_threads` - `zlib` ¹ All except `crypto` and `fs` polyfills are on by default. `crypto` and `fs` have to be explicitly enabled. Otherwise, they will be replaced with empty stubs. ### Globals - `global` (aliased to `globalThis`) - `__dirname` (always `"/"`) - `__filename` (always `"/index.js"`) - `process` (imports the `process` module) - `Buffer` (imports the `buffer` module) - `navigator` (shim, not included by default) You can control which globals are injected using the `globals` option. ## `polyfillNodeForDeno` This plugin uses Deno's [`std/node`](https://deno.land/std@0.177.0/node) library to polyfill Node builtins and globals. Note that the `std/node` library has been removed from Deno in version 0.178.0 because now Deno has builtin support for Node builtin modules (e.g. `node:fs`). This plugin is still useful for deploying to Deno Deploy, which doesn't support them yet. ### Usage ```js import { build } from "esbuild"; import { polyfillNodeForDeno } from "esbuild-plugin-polyfill-node"; build({ entryPoints: ["src/index.js"], bundle: true, outfile: "dist/bundle.js", plugins: [ polyfillNodeForDeno({ // Options (optional) }), ], }); ``` ### Options - `stdVersion`: Version of the Deno standard library to use. Default: `"0.177.0"`. - `globals`: Whether to inject global polyfills (`process`, `Buffer`, `setImmediate`, `clearImmediate`, `__dirname`, and `__filename`). Default: `true`. - `polyfills`: Polyfills to inject. It's an object where the keys are the names of the polyfills and the values are `false`, `true`, `"npm"` or `"empty"`. `false` disables the polyfill, `true` enables it (default where exists), `"npm"` injects a polyfill from the NPM (default for `"domain"`, `"punycode"`, `"vm"`, and `"zlib"`), and `"empty"` injects an empty polyfill (default for [missing polyfills](#empty-stubs)). ## Credits - [Fatih Aygün](https://github.com/cyco130), under the [MIT license](./LICENSE) - Loosely based on [rollup-plugin-polyfill-node](https://github.com/FredKSchott/rollup-plugin-polyfill-node)