Skip to content
forked from unjs/unenv

🕊️ Convert javaScript code to be runtime agnostic

License

Notifications You must be signed in to change notification settings

AaronDewes/unenv

 
 

Repository files navigation

unenv

unenv is a framework agnostic system that allows converting JavaScript code to be platform agnostic and working in any environment including Browsers, Workers, Node.js or pure JavaScript runtime.

Install

# Using npm
npm i -D unenv

# Using yarn
yarn add --dev unenv

# Using pnpm
pnpm add -D unenv

Usage

Using env utility and built-in presets (and nodeless), unenv will provide an abstract configuration that can be used in building pipelines (rollup.js, webpack, etc.).

import { env, node, nodeless } from "unenv";

const { alias, inject, polyfill, external } = env(...presets);

Presets

node

Suitable to convert universal libraries working in Node.js. (preset)

  • Add supports for global fetch API
  • Set Node.js built-ins as externals

nodeless

Using this preset, we can convert a code that is depending on Node.js to work anywhere else.

Built-in Node.js modules

unenv provides a replacement for all Node.js built-ins for cross-platform compatiblity.

Module Status Source
node:assert Mocked -
node:async_hooks Polyfilled unenv/node/async_hooks
node:buffer Polyfilled unenv/node/buffer
node:child_process Mocked -
node:cluster Mocked -
node:console Mocked -
node:constants Mocked -
node:crypto Polyfilled unenv/node/crypto
node:dgram Mocked -
node:diagnostics_channel Mocked -
node:dns Mocked -
node:domain Mocked -
node:events Polyfilled unenv/node/events
node:fs Polyfilled unenv/node/fs
node:fs/promises Polyfilled unenv/node/fs/promises
node:http2 Mocked -
node:http Polyfilled unenv/node/http
node:https Mocked -
node:inspector Mocked -
node:module Mocked -
node:net Polyfilled unenv/node/net
node:os Mocked -
node:path Polyfilled unenv/node/path
node:perf_hooks Mocked -
node:process Polyfilled unenv/node/process
node:punycode Mocked -
node:querystring Mocked -
node:readline Mocked -
node:repl Mocked -
node:stream Polyfilled unenv/node/stream
node:stream/consumers Mocked unenv/node/stream/consumers
node:stream/promises Mocked unenv/node/stream/promises
node:stream/web Native unenv/node/stream/web
node:string_decoder Mocked -
node:sys Mocked -
node:timers Mocked -
node:timers/promises Mocked -
node:tls Mocked -
node:trace_events Mocked -
node:tty Mocked -
node:url Polyfilled unenv/node/url
node:util Polyfilled unenv/node/util
node:util/types Polyfilled unenv/node/util/types
node:v8 Mocked -
node:vm Mocked -
node:wasi Mocked -
node:worker_threads Mocked -
node:zlib Mocked -

npm packages

unenv provides a replacement for common npm packages for cross platform compatibility.

Package Status Source
npm/consola Use native console unenv/runtime/npm/consola
npm/cross-fetch Use native fetch unenv/runtime/npm/cross-fetch
npm/debug Mocked with console.debug unenv/runtime/npm/debug
npm/fsevents Mocked unenv/runtime/npm/fsevents
npm/inherits Inlined unenv/runtime/npm/inherits
npm/mime-db Minimized unenv/runtime/npm/mime-db
npm/mime Minimized unenv/runtime/npm/mime
npm/node-fetch Use native fetch unenv/runtime/npm/node-fetch
npm/whatwg-url Use native URL unenv/runtime/npm/whatwg-url

Auto-mocking proxy

import MockProxy from "unenv/runtime/mock/proxy";

console.log(MockProxy().foo.bar()[0]);

Above package doesn't work outside of Node.js and neither we need any platform specific logic! When aliasing os to mock/proxy-cjs, it will be auto mocked using a Proxy Object which can be recursively traversed like an Object, called like a Function, Iterated like an Array, or instantiated like a Class.

We use this proxy for auto mocking unimplemented internals. Imagine a package does this:

const os = require("os");
if (os.platform() === "windows") {
  /* do some fix */
}
module.exports = () => "Hello world";

By aliasing os to unenv/runtime/mock/proxy-cjs, code will be compatible with other platforms.

Other polyfills

Please check ./src/runtime to discover other polyfills.

License

MIT

About

🕊️ Convert javaScript code to be runtime agnostic

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • TypeScript 100.0%