1.9.0-rc.2 • Published 5 months ago

@pi0/unenv v1.9.0-rc.2

Weekly downloads
-
License
MIT
Repository
github
Last release
5 months ago

unenv

unenv is a framework-agnostic system that allows converting JavaScript code to be platform agnostic and work in any environment including Browsers, Workers, Node.js, or 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, unenv will provide an abstract configuration that can be used in building pipelines (rollup.js, webpack, etc.).

import { env } from "unenv";

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

Note: You can provide as many presets as you want. unenv will merge them internally and the right-most preset has a higher priority.

node preset

Suitable to convert universal libraries working in Node.js.

  • Add supports for global fetch API
  • Set Node.js built-ins as externals
import { env, nodeless } from "unenv";

const envConfig = env(node, {});

(view node preset source)

nodeless preset

Suitable to transform libraries made for Node.js to run in other JavaScript runtimes.

import { env, nodeless } from "unenv";

const envConfig = env(nodeless, {});

(view nodeless preset source)

deno preset

Note: This preset is experimental and behavior can change!

This preset can be used to extend nodeless to use Deno's Node.js API Compatibility (docs, docs).

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

const envConfig = env(nodeless, deno, {});

(view deno preset source)

Built-in Node.js modules

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

ModuleStatusSource
node:assertMocked-
node:async_hooksPolyfilledunenv/node/async_hooks
node:bufferPolyfilledunenv/node/buffer
node:child_processMocked-
node:clusterMocked-
node:consoleMocked-
node:constantsMocked-
node:cryptoPolyfilledunenv/node/crypto
node:dgramMocked-
node:diagnostics_channelMocked-
node:dnsMocked-
node:domainMocked-
node:eventsPolyfilledunenv/node/events
node:fsPolyfilledunenv/node/fs
node:fs/promisesPolyfilledunenv/node/fs/promises
node:http2Mocked-
node:httpPolyfilledunenv/node/http
node:httpsPolyfilledunenv/node/https
node:inspectorMocked-
node:modulePolyfilledunenv/node/module -
node:netPolyfilledunenv/node/net
node:osMocked-
node:pathPolyfilledunenv/node/path
node:perf_hooksMocked-
node:processPolyfilledunenv/node/process
node:punycodeMocked-
node:querystringMocked-
node:readlineMocked-
node:replMocked-
node:streamPolyfilledunenv/node/stream
node:stream/consumersMockedunenv/node/stream/consumers
node:stream/promisesMockedunenv/node/stream/promises
node:stream/webNativeunenv/node/stream/web
node:string_decoderPolyfilledunenv/node/string_decoder
node:sysMocked-
node:timersMocked-
node:timers/promisesMocked-
node:tlsMocked-
node:trace_eventsMocked-
node:ttyMocked-
node:urlPolyfilledunenv/node/url
node:utilPolyfilledunenv/node/util
node:util/typesPolyfilledunenv/node/util/types
node:v8Mocked-
node:vmMocked-
node:wasiMocked-
node:worker_threadsMocked-
node:zlibMocked-

npm packages

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

PackageStatusSource
npm/consolaUse native consoleunenv/runtime/npm/consola
npm/cross-fetchUse native fetchunenv/runtime/npm/cross-fetch
npm/debugMocked with console.debugunenv/runtime/npm/debug
npm/fseventsMockedunenv/runtime/npm/fsevents
npm/inheritsInlinedunenv/runtime/npm/inherits
npm/mime-dbMinimizedunenv/runtime/npm/mime-db
npm/mimeMinimizedunenv/runtime/npm/mime
npm/node-fetchUse native fetchunenv/runtime/npm/node-fetch
npm/whatwg-urlUse native URLunenv/runtime/npm/whatwg-url

Auto-mocking proxy

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

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

The 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, the code will be compatible with other platforms.

Other polyfills

To discover other polyfills, please check ./src/runtime.

License

MIT