@lopatnov/make-iterable
Version:
A TypeScript library that converts objects, functions, and their prototypes into Array-like iterable entities. Supports ES Modules, CommonJS, and UMD.
177 lines (123 loc) • 4.81 kB
Markdown
# @lopatnov/make-iterable
> A TypeScript library that converts objects, functions, and their prototypes into Array-like iterable entities.
> Apply it to a class prototype and every instance becomes iterable automatically.
[](https://www.npmjs.com/package/@lopatnov/make-iterable)
[](https://www.npmjs.com/package/@lopatnov/make-iterable)
[](https://github.com/lopatnov/make-iterable/blob/master/LICENSE)
[](https://github.com/lopatnov/make-iterable/issues)
[](https://github.com/lopatnov/make-iterable/stargazers)
---
## Table of Contents
- [Installation](#installation)
- [Usage](#usage)
- [API](#api)
- [Examples](#examples)
- [Demo](#demo)
- [Contributing](#contributing)
- [Built With](#built-with)
- [License](#license)
---
## Installation
```shell
npm install @lopatnov/make-iterable
```
**Browser (CDN):**
```html
<script src="//lopatnov.github.io/make-iterable/dist/make-iterable.umd.min.js"></script>
```
---
## Usage
### ES Modules
```typescript
import makeIterable from "@lopatnov/make-iterable";
```
### CommonJS
```javascript
const makeIterable = require("@lopatnov/make-iterable");
```
### Browser / UMD
```html
<script src="make-iterable.umd.min.js"></script>
<script>
// available as window.makeIterable
var x = makeIterable({});
</script>
```
---
## API
```typescript
function makeIterable<T>(value: T): T & Array<any>;
```
Converts `value` to an Array-like iterable object **in place** and returns it. The original object reference is preserved — `value === makeIterable(value)`.
The function attaches all `Array.prototype` methods (`push`, `pop`, `splice`, `slice`, `indexOf`, `map`, `filter`, `forEach`, etc.) and implements `Symbol.iterator`, enabling `for...of` loops and the spread operator.
**Throws** `Error` when `value` is `undefined`, `null`, a `boolean`, a `number`, or a `string`.
---
## Examples
### Make an Object Iterable and Array-Like
```typescript
const x = { hello: "world" };
const iterableX = makeIterable(x);
iterableX.push(10); // [10]
iterableX.push(20); // [10, 20]
iterableX.push(30); // [10, 20, 30]
iterableX.push(40); // [10, 20, 30, 40]
iterableX.pop(); // [10, 20, 30]
for (const index in x) {
console.log(`Index [${index}] = ${x[index]}`);
// "Index [0] = 10"
// "Index [1] = 20"
// "Index [2] = 30"
// "Index [hello] = world"
}
for (const value of x) {
console.log(value); // 10, 20, 30
}
console.log(x === iterableX); // true
console.log(iterableX.indexOf(30)); // 2
console.log([...iterableX]); // [10, 20, 30]
console.log(iterableX.hello); // "world"
```
### Make a Class Iterable via Prototype
```typescript
class Simple {
constructor(public message: string) {}
}
makeIterable(Simple.prototype);
const z = new Simple("Length is not enumerable now") as Simple & any[];
z.push([1, 2], [3, 4], [5, 6]);
for (const index in z) {
console.log(`z[${index}]=${z[index]}`);
// "z[0]=1,2"
// "z[1]=3,4"
// "z[2]=5,6"
// "z[message]=Length is not enumerable now"
}
```
### Make a Function Iterable
```typescript
const fn = function () {};
const iterableFn = makeIterable(fn);
iterableFn.push(1, 2, 3, 4, 5);
console.log(iterableFn.indexOf(3)); // 2
console.log([...iterableFn]); // [1, 2, 3, 4, 5]
```
---
## Demo
- [RunKit demo](https://runkit.com/lopatnov/make-iterable-demo-1.3.1)
- [Interactive playground](https://npm.runkit.com/@lopatnov/make-iterable)
---
## Contributing
Contributions are welcome! Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request.
- Bug reports → [open an issue](https://github.com/lopatnov/make-iterable/issues)
- Questions → [Discussions](https://github.com/lopatnov/make-iterable/discussions)
- Found it useful? A [star on GitHub](https://github.com/lopatnov/make-iterable) helps others discover the project
---
## Built With
- [TypeScript](https://www.typescriptlang.org/) — strict typing throughout
- [Rollup](https://rollupjs.org/) — bundled to ESM, CJS, and UMD formats
- [Node.js Test Runner](https://nodejs.org/api/test.html) — built-in test runner, zero dependencies
- [OXLint](https://oxc.rs/docs/guide/usage/linter.html) — fast JavaScript/TypeScript linter
- [oxfmt](https://github.com/nicolo-ribaudo/oxfmt) — code formatter
---
## License
[Apache-2.0](https://github.com/lopatnov/make-iterable/blob/master/LICENSE) © 2019–2026 [Oleksandr Lopatnov](https://github.com/lopatnov) · [LinkedIn](https://www.linkedin.com/in/lopatnov/)