{"id":22310220,"url":"https://github.com/unjs/undio","last_synced_at":"2025-06-10T22:41:56.763Z","repository":{"id":229851085,"uuid":"777846540","full_name":"unjs/undio","owner":"unjs","description":"⇔ Conventionally and Safely convert between various JavaScript data types","archived":false,"fork":false,"pushed_at":"2025-06-06T22:25:10.000Z","size":252,"stargazers_count":239,"open_issues_count":8,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-06T23:26:32.477Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/unjs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-03-26T15:59:45.000Z","updated_at":"2025-05-28T02:14:53.000Z","dependencies_parsed_at":"2024-05-13T01:25:15.692Z","dependency_job_id":"ce989813-cd94-4121-a6b0-ca1122936cb3","html_url":"https://github.com/unjs/undio","commit_stats":null,"previous_names":["unjs/undio"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unjs%2Fundio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unjs%2Fundio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unjs%2Fundio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unjs%2Fundio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/unjs","download_url":"https://codeload.github.com/unjs/undio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unjs%2Fundio/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259165995,"owners_count":22815544,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-03T21:01:04.031Z","updated_at":"2025-06-10T22:41:56.749Z","avatar_url":"https://github.com/unjs.png","language":"TypeScript","readme":"# ⇔ undio\n\n\u003c!-- automd:badges color=yellow bundlejs codecov --\u003e\n\n[![npm version](https://img.shields.io/npm/v/undio?color=yellow)](https://npmjs.com/package/undio)\n[![npm downloads](https://img.shields.io/npm/dm/undio?color=yellow)](https://npm.chart.dev/undio)\n[![bundle size](https://img.shields.io/bundlejs/size/undio?color=yellow)](https://bundlejs.com/?q=undio)\n[![codecov](https://img.shields.io/codecov/c/gh/unjs/undio?color=yellow)](https://codecov.io/gh/unjs/undio)\n\n\u003c!-- /automd --\u003e\n\n⇔ Conventionally and safely convert between various JavaScript data types.\n\n## ✅ Features\n\n- Type-safe usage\n- Runtime-type safety assertion\n- Auto type detection and conversion\n- Tree-shakable and compact build\n- Leverage runtime native performance ([+Bun stream utils](https://bun.sh/docs/api/utils#bun-readablestreamto))\n\n## 👍 Supported Types\n\n- [ArrayBuffer][ArrayBuffer]\n- [Base64][Base64]\n- [Blob][Blob]\n- [DataView][DataView]\n- [Number Array][Number Array]\n- [ReadableStream][ReadableStream]\n- [NodeStream][NodeStream]\n- [Response][Response]\n- [Text][Text]\n- [Uint8Array][Uint8Array]\n\n## Usage\n\nInstall package:\n\n\u003c!-- automd:pm-install --\u003e\n\n```sh\n# ✨ Auto-detect\nnpx nypm install undio\n\n# npm\nnpm install undio\n\n# yarn\nyarn add undio\n\n# pnpm\npnpm install undio\n\n# bun\nbun install undio\n\n# deno\ndeno install undio\n```\n\n\u003c!-- /automd --\u003e\n\nImport:\n\n\u003c!-- automd:jsimport cjs cdn imports=\"\" --\u003e\n\n**ESM** (Node.js, Bun, Deno)\n\n```js\nimport {} from \"undio\";\n```\n\n**CommonJS** (Legacy Node.js)\n\n```js\nconst {} = require(\"undio\");\n```\n\n**CDN** (Deno, Bun and Browsers)\n\n```js\nimport {} from \"https://esm.sh/undio\";\n```\n\n\u003c!-- /automd --\u003e\n\n## Auto Convert\n\nUndio automatically detects the input type and uses the proper method to convert it to the expected type.\n\n**Example:**\n\n```ts\nimport { detectType, toText, toReadableStream } from \"undio\";\n\n// Convert any supported type (auto-detected)\nconst string = await toText(value);\nconst stream = await toReadableStream(value);\n\n// \"ArrayBuffer\" | \"Blob\"| \"DataView\" | \"NumberArray\" | \"ReadableStream\" | \"String\" | \"Uint8Array\";\nconst type = detectType(value);\n```\n\n\u003e [!NOTE]\n\u003e Because of stream support, the return type can be a promise. Always make sure to use an `await` before them.\n\n\u003e [!NOTE]\n\u003e Alternatively you can use low-level `*To*(value)` utils to explicitly convert from one type to another. See [all utils](#all-utils) section.\n\n## Runtime type checking\n\nYou can use `is*(input)` and `assert*(input)` utils to validate input type.\n\n\u003e [!NOTE]\n\u003e All conversion utilities use assertions for runtime type safety by default, so you don't need to manually do this.\n\n**Example:**\n\n```ts\nimport { isReadableStream, assertArrayBuffer } from \"undio\";\n\nif (isReadableStream(value)) {\n  /* do something */\n}\n\nassertArrayBuffer(value); // Throws an error if value is not ArrayBuffer\n// do something\n```\n\n## All utils\n\n\u003cdetails\u003e\n\n\u003csummary\u003eSee all utils\u003c/summary\u003e\n\n\u003c!-- automd:jsdocs src=\"./src/index.ts\" --\u003e\n\n## Array Buffer\n\n### `arrayBufferToBase64(arrayBuffer, base64Options)`\n\nConvert from [ArrayBuffer][ArrayBuffer] to [Base64][Base64]\n\n### `arrayBufferToBlob(arrayBuffer, options?)`\n\nConvert from [ArrayBuffer][ArrayBuffer] to [Blob][Blob]\n\n### `arrayBufferToDataView(arrayBuffer)`\n\nConvert from [ArrayBuffer][ArrayBuffer] to [DataView][DataView]\n\n### `arrayBufferToNumberArray(arrayBuffer)`\n\nConvert from [ArrayBuffer][ArrayBuffer] to [Number Array][Number Array]\n\n### `arrayBufferToReadableStream(arrayBuffer)`\n\nConvert from [ArrayBuffer][ArrayBuffer] to [ReadableStream][ReadableStream]\n\n### `arrayBufferToResponse(arrayBuffer, init?)`\n\nConvert from [ArrayBuffer][ArrayBuffer] to [Response][Response]\n\n### `arrayBufferToText(arrayBuffer)`\n\nConvert from [ArrayBuffer][ArrayBuffer] to [Text][Text]\n\n### `arrayBufferToUint8Array(arrayBuffer)`\n\nConvert from [ArrayBuffer][ArrayBuffer] to [Uint8Array][Uint8Array]\n\n### `assertArrayBuffer(input)`\n\nAssert that input is an instance of [ArrayBuffer][ArrayBuffer] or throw a `TypeError`.\n\n### `isArrayBuffer(input)`\n\nTest if input is an instance of [ArrayBuffer][ArrayBuffer] and return `true` or `false`.\n\n### `toArrayBuffer(input)`\n\nConvert from any value to [ArrayBuffer][ArrayBuffer]\n\n## Base64\n\n### `assertBase64(input, opts?)`\n\nAssert if input matches the [Base64][Base64] data URL (data:[\u003cmediatype\u003e][;base64],\u003cdata\u003e) or throw a `TypeError`.\n\n### `base64ToArrayBuffer(string, base64Options?)`\n\nConvert from [Base64][Base64] to [ArrayBuffer][ArrayBuffer]\n\n### `base64ToBlob(string, opts?)`\n\nConvert from [Base64][Base64] to [Blob][Blob]\n\n### `base64ToDataView(string, base64Options?)`\n\nConvert from [Base64][Base64] to [DataView][DataView]\n\n### `base64ToNumberArray(string, base64Options?)`\n\nConvert from [Base64][Base64] to [Number Array][Number Array]\n\n### `base64ToReadableStream(string, base64Options?)`\n\nConvert from [Base64][Base64] to [ReadableStream][ReadableStream]\n\n### `base64ToResponse(string)`\n\nConvert from [Base64][Base64] to [Response][Response]\n\n### `base64ToText(string, opts?)`\n\nConvert from [Base64][Base64] to [Text][Text]\n\n### `base64ToUint8Array(string, base64Options?)`\n\nConvert from [Base64][Base64] to [Uint8Array][Uint8Array]\n\n### `isBase64DataURL(input)`\n\nTest if input matches the [Base64][Base64] data URL (data:[\u003cmediatype\u003e][;base64],\u003cdata\u003e) and return `true` or `false`.\n\n### `toBase64(input)`\n\nConvert from any value to [Base64][Base64]\n\n## Blob\n\n### `assertBlob(input)`\n\nAssert that input is an instance of [Blob][Blob] or throw a `TypeError`.\n\n### `blobToArrayBuffer(blob)`\n\nConvert from [Blob][Blob] to [ArrayBuffer][ArrayBuffer]\n\n### `blobToBase64(blob, base64Options)`\n\nConvert from [Blob][Blob] to [Base64][Base64]\n\n### `blobToDataView(blob)`\n\nConvert from [Blob][Blob] to [DataView][DataView]\n\n### `blobToNumberArray(blob)`\n\nConvert from [Blob][Blob] to [Number Array][Number Array]\n\n### `blobToReadableStream(blob)`\n\nConvert from [Blob][Blob] to [ReadableStream][ReadableStream]\n\n### `blobToResponse(blob, init?)`\n\nConvert from [Blob][Blob] to [Response][Response]\n\n### `blobToText(blob)`\n\nConvert from [Blob][Blob] to [Text][Text]\n\n### `blobToUint8Array(blob)`\n\nConvert from [Blob][Blob] to [Uint8Array][Uint8Array]\n\n### `isBlob(input)`\n\nTest if input is an instance of [Blob][Blob] and return `true` or `false`.\n\n### `toBlob(input)`\n\nConvert from any value to [Blob][Blob]\n\n## Data View\n\n### `assertDataView(input)`\n\nAssert that input is an instance of [DataView][DataView] or throw a `TypeError`.\n\n### `dataViewToArrayBuffer(dataView)`\n\nConvert from [DataView][DataView] to [ArrayBuffer][ArrayBuffer]\n\n### `dataViewToBase64(dataView, base64Options?)`\n\nConvert from [DataView][DataView] to [Base64][Base64]\n\n### `dataViewToBlob(dataView, options?)`\n\nConvert from [DataView][DataView] to [Blob][Blob]\n\n### `dataViewToNumberArray(dataView)`\n\nConvert from [DataView][DataView] to [Number Array][Number Array]\n\n### `dataViewToReadableStream(dataView)`\n\nConvert from [DataView][DataView] to [ReadableStream][ReadableStream]\n\n### `dataViewToResponse(dataView, init?)`\n\nConvert from [DataView][DataView] to [Response][Response]\n\n### `dataViewToText(dataView)`\n\nConvert from [DataView][DataView] to [Text][Text]\n\n### `dataViewToUint8Array(dataView)`\n\nConvert from [DataView][DataView] to [Uint8Array][Uint8Array]\n\n### `isDataView(input)`\n\nTest if input is an instance of [DataView][DataView] and return `true` or `false`.\n\n### `toDataView(input)`\n\nConvert from any value to [DataView][DataView]\n\n## Node Stream\n\n### `assertNodeStream(input)`\n\nAssert that input is an instance of [NodeStream][NodeStream] or throw a `TypeError`.\n\n### `isNodeStream(input)`\n\nTest if input is an instance of [NodeStream][NodeStream] and return `true` or `false`.\n\n### `nodeStreamToArrayBuffer(input)`\n\nConvert from [NodeStream][NodeStream] to [ArrayBuffer][ArrayBuffer]\n\n### `nodeStreamToBase64(input, base64Options?)`\n\nConvert from [NodeStream][NodeStream] to [Base64][Base64]\n\n### `nodeStreamToBlob(input, options?)`\n\nConvert from [NodeStream][NodeStream] to [Blob][Blob]\n\n### `nodeStreamToDataView(input)`\n\nConvert from [NodeStream][NodeStream] to [DataView][DataView]\n\n### `nodeStreamToNumberArray(input)`\n\nConvert from [NodeStream][NodeStream] to [Number Array][Number Array]\n\n### `nodeStreamToReadableStream(input)`\n\nConvert from [NodeStream][NodeStream] to [ReadableStream][ReadableStream]\n\n### `nodeStreamToResponse(input, init?)`\n\nConvert from [NodeStream][NodeStream] to [Response][Response]\n\n### `nodeStreamToText(input)`\n\nConvert from [NodeStream][NodeStream] to [Text][Text]\n\n### `nodeStreamToUint8Array(input)`\n\nConvert from [NodeStream][NodeStream] to [Uint8Array][Uint8Array]\n\n## Number Array\n\n### `assertNumberArray(input)`\n\nAssert that input is an instance of [Number Array][Number Array] or throw a `TypeError`.\n\n### `isNumberArray(input)`\n\nTest if input is an instance of [Number Array][Number Array] and return `true` or `false`.\n\n### `numberArrayToArrayBuffer(numberArray)`\n\nConvert from [Number Array][Number Array] to [ArrayBuffer][ArrayBuffer]\n\n### `numberArrayToBase64(numberArray, base64Options?)`\n\nConvert from [Number Array][Number Array] to [Base64][Base64]\n\n### `numberArrayToBlob(numberArray, options?)`\n\nConvert from [Number Array][Number Array] to [Blob][Blob]\n\n### `numberArrayToDataView(numberArray)`\n\nConvert from [Number Array][Number Array] to [DataView][DataView]\n\n### `numberArrayToReadableStream(numberArray)`\n\nConvert from [Number Array][Number Array] to [ReadableStream][ReadableStream]\n\n### `numberArrayToText(numberArray)`\n\nConvert from [Number Array][Number Array] to [Text][Text]\n\n### `numberArrayToUint8Array(numberArray)`\n\nConvert from [Number Array][Number Array] to [Uint8Array][Uint8Array]\n\n### `toNumberArray(input)`\n\nConvert from any value to [Number Array][Number Array]\n\n## Readable Stream\n\n### `assertReadableStream(input)`\n\nAssert that input is an instance of [ReadableStream][ReadableStream] or throw a `TypeError`.\n\n### `isReadableStream(input)`\n\nTest if input is an instance of [ReadableStream][ReadableStream] and return `true` or `false`.\n\n### `readableStreamToArrayBuffer(readableStream)`\n\nConvert from [ReadableStream][ReadableStream] to [ArrayBuffer][ArrayBuffer]\n\n### `readableStreamToBase64(readableStream, base64Options?)`\n\nConvert from [ReadableStream][ReadableStream] to [Base64][Base64]\n\n### `readableStreamToBlob(readableStream, options?)`\n\nConvert from [ReadableStream][ReadableStream] to [Blob][Blob]\n\n### `readableStreamToDataView(readableStream)`\n\nConvert from [ReadableStream][ReadableStream] to [DataView][DataView]\n\n### `readableStreamToNumberArray(readableStream)`\n\nConvert from [ReadableStream][ReadableStream] to [Number Array][Number Array]\n\n### `readableStreamToText(readableStream)`\n\nConvert from [ReadableStream][ReadableStream] to [Text][Text]\n\n### `readableStreamToUint8Array(readableStream)`\n\nConvert from [ReadableStream][ReadableStream] to [Uint8Array][Uint8Array]\n\n### `toReadableStream(input)`\n\nConvert from any value to [ReadableStream][ReadableStream]\n\n### `toResponse(input)`\n\nConvert from any value to [Response][Response]\n\n## Response\n\n### `assertResponse(input)`\n\nAssert that input is an instance of [Response][Response] or throw a `TypeError`.\n\n### `isResponse(input)`\n\nTest if input is an instance of [Response][Response] and return `true` or `false`.\n\n### `responseToArrayBuffer(response)`\n\nConvert from [Response][Response] to [ArrayBuffer][ArrayBuffer]\n\n### `responseToBase64(response, base64Options?)`\n\nConvert from [Response][Response] to [Base64][Base64]\n\n### `responseToBlob(response)`\n\nConvert from [Response][Response] to [Blob][Blob]\n\n### `responseToDataView(response)`\n\nConvert from [Response][Response] to [DataView][DataView]\n\n### `responseToNumberArray(response)`\n\nConvert from [Response][Response] to [Number Array][Number Array]\n\n### `responseToReadableStream(response)`\n\nConvert from [Response][Response] to [ReadableStream]ReadableStream]\n\n### `responseToText(response)`\n\nConvert from [Response][Response] to [Text][Text]\n\n### `responseToUint8Array(response)`\n\nConvert from [Response][Response] to [Uint8Array][Uint8Array]\n\n## String\n\n### `toText(input)`\n\nConvert from any value to [Text][Text]\n\n## Text\n\n### `assertText(input)`\n\nAssert that input is an instance of [Text][Text] or throw a `TypeError`.\n\n### `isText(input)`\n\nTest if input is an instance of [Text][Text] and return `true` or `false`.\n\n### `textToArrayBuffer(string)`\n\nConvert from [Text][Text] to [ArrayBuffer][ArrayBuffer]\n\n### `textToBase64(string, opts?)`\n\nConvert from [Text][Text] to [Base64][Base64]\n\n### `textToBlob(string, options?)`\n\nConvert from [Text][Text] to [Blob][Blob]\n\n### `textToDataView(string)`\n\nConvert from [Text][Text] to [DataView][DataView]\n\n### `textToNumberArray(string)`\n\nConvert from [Text][Text] to [Number Array][Number Array]\n\n### `textToReadableStream(string)`\n\nConvert from [Text][Text] to [ReadableStream][ReadableStream]\n\n### `textToUint8Array(string)`\n\nConvert from [Text][Text] to [Uint8Array][Uint8Array]\n\n## Uint8 Array\n\n### `assertUint8Array(input)`\n\nAssert that input is an instance of [Uint8Array][Uint8Array] or throw a `TypeError`.\n\n### `isUint8Array(input)`\n\nTest if input is an instance of [Uint8Array][Uint8Array] and return `true` or `false`.\n\n### `toUint8Array(input)`\n\nConvert from any value to [Uint8Array][Uint8Array]\n\n### `uint8ArrayToArrayBuffer(uint8Array)`\n\nConvert from [Uint8Array][Uint8Array] to [ArrayBuffer][ArrayBuffer]\n\n### `uint8ArrayToBase64(uint8Array, base64Options?)`\n\nConvert from [Uint8Array][Uint8Array] to [Base64][Base64]\n\n### `uint8ArrayToBlob(uint8Array, options?)`\n\nConvert from [Uint8Array][Uint8Array] to [Blob][Blob]\n\n### `uint8ArrayToDataView(uint8Array)`\n\nConvert from [Uint8Array][Uint8Array] to [DataView][DataView]\n\n### `uint8ArrayToNumberArray(uint8Array)`\n\nConvert from [Uint8Array][Uint8Array] to [Number Array][Number Array]\n\n### `uint8ArrayToReadableStream(uint8Array)`\n\nConvert from [Uint8Array][Uint8Array] to [ReadableStream][ReadableStream]\n\n### `uint8ArrayToResponse(uint8Array, init?)`\n\nConvert from [Uint8Array][Uint8Array] to [Response][Response]\n\n### `uint8ArrayToText(uint8Array)`\n\nConvert from [Uint8Array][Uint8Array] to [Text][Text]\n\n### `convertTo(toType, input, fromType?)`\n\nConvert from any value to any supported data type\n\n### `detectType(input)`\n\n### `numberArrayToResponse(numberArray, init?)`\n\nConvert from [Number Array][Number Array] to [Response][Response]\n\n### `readableStreamToResponse(readableStream, init?)`\n\nConvert from [ReadableStream][ReadableStream] to [Response][Response]\n\n### `textToResponse(string, init?)`\n\n\u003c!-- /automd --\u003e\n\n\u003c/details\u003e\n\n## Development\n\n\u003cdetails\u003e\n\n\u003csummary\u003elocal development\u003c/summary\u003e\n\n- Clone this repository\n- Install the latest LTS version of [Node.js](https://nodejs.org/en/)\n- Enable [Corepack](https://github.com/nodejs/corepack) using `corepack enable`\n- Install dependencies using `pnpm install`\n- Run interactive tests using `pnpm dev`\n\n\u003c/details\u003e\n\n## License\n\n\u003c!-- automd:contributors license=MIT --\u003e\n\nPublished under the [MIT](https://github.com/unjs/undio/blob/main/LICENSE) license.\nMade by [community](https://github.com/unjs/undio/graphs/contributors) 💛\n\u003cbr\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/unjs/undio/graphs/contributors\"\u003e\n\u003cimg src=\"https://contrib.rocks/image?repo=unjs/undio\" /\u003e\n\u003c/a\u003e\n\n\u003c!-- /automd --\u003e\n\n\u003c!-- automd:with-automd --\u003e\n\n---\n\n_🤖 auto updated with [automd](https://automd.unjs.io)_\n\n\u003c!-- /automd --\u003e\n\n[ArrayBuffer]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer\n[Base64]: https://developer.mozilla.org/en-US/docs/Glossary/Base64\n[Blob]: https://developer.mozilla.org/en-US/docs/Web/API/Blob\n[DataView]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView\n[Number Array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\n[ReadableStream]: https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream\n[Response]: https://developer.mozilla.org/en-US/docs/Web/API/Response\n[Text]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String\n[Uint8Array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array\n[NodeStream]: https://nodejs.org/api/stream.html#readable-streams\n","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funjs%2Fundio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funjs%2Fundio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funjs%2Fundio/lists"}