open-index/open-npm huggingface dataset:
npm package: @rbxts/berry-bin
Description: <div align="center">
Author: berry-blossom
Latest version: 1.0.3

<div align="center">

<h1>Berry <strike>(get it?)</strike> Awesome Bin</h1>
Portable & light cleanup utility for Roblox.

<h2>Install</h2>

<h3>Luau</h3>

[Copy It!](src/init.lua)

<h3>roblox-ts</h3>

`npm i @rbxts/berry-bin`

</div>
npm package: @rbxts/better-gizmos
Description: Visual debug library for Roblox.
Author: Ivan Leontev
Latest version: 0.0.4

# rbx-better-gizmos

The source code of constructing handles was taken from: https://www.npmjs.com/package/@rbxts/gizmo

## Usage

The `draw` method call always returns a new Instance from the currently configured properties of the gizmo.

Global instance usage:
```ts
const output = Gizmo.point.draw(Vector3.zero)

// some time later
output.Destroy()
```

Constructing new instances that inherit properties from the global one:
```ts
const gizmo = new Gizmo()

const output = gizmo.point.draw(Vector3.zero)

// some time later
output.Destroy()
gizmo.destroy()
```

Note that you cannot destroy the global instance of the Gizmo.

## Repeated usage

Usually you only want to render the latest version of the gizmo.

For this you have to do the following:
```ts
const arrow = Gizmo.arrow.default()

SomeEvent.Connect(() => {
    Gizmo.arrow.assign(arrow, Vector3.zero, Vector3.zero.add(Vector3.one))
})

// when you no longer need to render arrow
arrow.Destroy()
```
npm package: @rbxts/better-janitor
Description: A stack-based Janitor implementation for Roblox platform.
Author: Ivan Leontev
Latest version: 0.4.0

# Overview

A stack-based Janitor implementation written in Luau for the Roblox platform with a TypeScript support.

## Basic usage

```ts
const janitor = new Janitor()
	.addFn(() => {
		warn("third");
	})
	.addFn(() => {
		warn("second");
	})
	.addFn(() => {
		warn("first after connection was cleaned up");
	})
	.addConnection(
		game.DescendantAdded.Connect(() => {
			// some code
		})
	);

task.delay(1, () => {
    janitor.destroy()
    // or
    janitor.cleanup()
    // for further cleanup tasks
})
```
npm package: @rbxts/better-react-components
Description: ![NPM Downloads](https://img.shields.io/npm/dm/%40rbxts%2Fbetter-react-components?style=for-the-badge) ![NPM Version](https://img.shields.io/npm/v/%40rbxts%2Fbetter-react-components?style=for-the-badge)
Latest version: 2.9.1

# Better React Components

![NPM Downloads](https://img.shields.io/npm/dm/%40rbxts%2Fbetter-react-components?style=for-the-badge)
![NPM Version](https://img.shields.io/npm/v/%40rbxts%2Fbetter-react-components?style=for-the-badge)

Roblox's ui elements, with builtin modifiers

Also see **[introduction](docs/1_Introduction.md)**

## Example

![Comperance](docs/better-react-components-is-based.png)

<details>
    <summary>better-react-components code</summary>

    ```
    <Frame
        position={new UDim2(.5, 0, .5, 0)}
        size={new UDim2(.5, 0, .5, 0)}

        anchorPoint={AnchorPoints.Middle}
        cornerRadius={8}
        padding={4}
    >
        <GridLayout
            cellSize={new UDim2(.25, 0, .25, 0)}
            cellPadding={new UDim2(0, 4, 0, 4)}
            cellAspectRatio={1}
        />

        <DummyElement />
        <Button
            textColor={"#64FEE7"}
            text="Hello world!"
        />
        <Text
            background={"#64FEE7"}
            text="Hello there!"
            font={Enum.Font.Arial}
        />
    </Frame>;
    ```
</details>


## Support

### TODO

- [ ] Upgrade ESLint to `9.*.*` version
- [ ] Better documentation

### Components

- [X] Frame
- [X] ScrollableFrame
- [X] Button
- [ ] ImageButton
- [X] Image
- [X] Text
- [X] TextBox
- [X] CanvasGroup

### Modifiers

- [X] UIAspectRatioConstraint
- [X] UICorner
- [X] UIGradient
- [X] UIGridLayout [(see GridLayout)](src/components/GridLayout.tsx)
- [X] UIListLayout [(see ListLayout)](src/components/ListLayout.tsx)
- [X] UIFlexLayout [(see ListLayout)](src/components/ListLayout.tsx)
- [X] UIPadding
- [ ] UIPageLayout
- [X] UIScale
- [X] UISizeConstraint
- [X] UIStroke
- [ ] UITableLayout
- [X] UITextSizeConstraint

### Custom Modifiers

- ~~[ ] FlowLayout [(view)](https://devforum.roblox.com/t/flow-flexbox-layout-for-lua/2614394)~~ (Removed due release of flex features to ListLayout. [Devforum](https://devforum.roblox.com/t/flex-features-for-uilistlayout-client-release/3096190) )
npm package: @rbxts/better-variant
Description: Upstream of the variant library for Roblox.
Author: Ivan Leontev
Latest version: 0.0.9

# rbx-variant

Upstream of the variant library for Roblox.

Current version is synced with: https://github.com/paarthenon/variant/tree/3.0

There could be some deviations to the behavior related to Roblox platform, such as "unpack" function being named "unload" and etc.
npm package: @rbxts/bezier
Description: Simple package to calculate points on bezier curves
Author: Dionysusnu
Latest version: 0.2.0

# Bezier Curve
Easily calculate points on a bezier curve!
Typescript 4+ due to Variadic Tuple Types.
## Example
```ts
import BezierCurve from "@rbxts/bezier";

const curve = new BezierCurve([
	new Vector3(0, 0, 0),
	new Vector3(100, 0, 0),
	new Vector3(100, 0, 100),
	new Vector3(0, 0, 100),
]);

const base = new Instance("Part");
base.Size = new Vector3(100, 1, 100);
base.Position = new Vector3(50, -1, 50);
base.Parent = game.Workspace;

for (let i = 0; i <= 100; i++) {
	const part = new Instance("Part");
	part.Position = curve.calculate(i / 100);
	part.Size = new Vector3(1, 1, 1);
	part.BrickColor = new BrickColor("Really red");
	part.Parent = game.Workspace;
}
```
npm package: @rbxts/bezierpath
Description: BezierPath is an easy to use bezier spline module, designed to be used for TD games and general paths while being optimized for large scale uses.
Author: omrezkeypie
Latest version: 2.0.5

(This is the Roblox TS version of this module, any issues or bugs that aren't to do with the type definitions should go to the original repository, not this fork)

# ABOUT
BezierPath is an easy to use bezier spline module, designed to be used for TD games and general paths while being optimizied for large scale uses.

__NOTE__: BezierPath is NOT a traditional bezier spline. it behaves more like a linear spline that curves around each point.

BezierPath can be installed using Wally:
```
BezierPath = "omrezkeypie/bezierpath@2.0.3"
```

To view the API and usage, go [here](https://github.com/omrezkeypie/BezierPath/wiki/API)

## Example

A code snippet showing how to set up and use BezierPath.
```ts
import BezierPath from "@rbxts/bezierpath"

const Positions = [
    new Vector3(0,10,0),
    new Vector3(10,0,0),
    new Vector3(10,10,10)
]
const NewPath = new BezierPath(Positions,3)
const Part = new Instance("Part",workspace)
Part.Size = new Vector3(1,1,1)
Part.Anchored = true

for (const t = 0 of $range(1,1/100)) {
    Part.CFrame = NewPath.CalculateUniformCFrame(t)
    task.wait(0.1)
}
```
A short video showing BezierPath.



https://github.com/omrezkeypie/BezierPath/assets/104690138/5e3fe18a-c8d3-4f0d-a475-55a3bfca6793
npm package: @rbxts/bin
Description: Manages things to be cleaned up later
Author: osyrisrblx
Latest version: 1.4.0

# `@rbxts/bin`

A super simple alternative to Maid.

### `Bin.Item`
```TS
type Bin.Item =
	(() => unknown) // any function
	| RBXScriptConnection // an event connection
	| { destroy(): void } // object with destroy() or Destroy()
	| { Destroy(): void }; // i.e. Roblox Instances!
```

### `Bin.add`
```TS
public add<T extends Bin.Item>(item: T): T;
```

Adds the item into the Bin, will return the item you passed in.

The returned value is useful for instances:
```TS
const part = this.bin.add(new Instance("Part"));
this.bin.add(part.Touched.Connect(() => print("Touched!")));

// later..

// both `part` and the connection are cleaned up!
this.bin.destroy();
```

### `Bin.destroy`
```TS
public destroy(): void;
```
Destroys all items currently in the Bin:
- Functions will be called
- RBXScriptConnections will be disconnected
- Objects will be `.destroy()`-ed

### `Bin.isEmpty`
```TS
public isEmpty(): boolean;
```
Checks whether the Bin is empty.
npm package: @rbxts/bind
Description: Utilities for binding functions to RBXScriptSignals (or similar) with a simple decorator, similar to @rbxts/proton's @Lifecycle decorator.
Author: typechecked
Latest version: 1.1.4

# @rbxts/bind
Utilities for binding functions to RBXScriptSignals (or similar) with a simple decorator, similar to @rbxts/proton's @Lifecycle decorator.

```ts
import { BindMethod, Bind } from "@rbxts/bind"
import { RunService } from "@rbxts/services"

export class WorldGeneration {
    @BindMethod(RunService.Heartbeat)
    public OnHeartbeat(DeltaTime: number) {
        // ...
    }

    constructor() {
        Bind.Activate(this)
    }
}
```
npm package: @rbxts/binder
Description: Typings for Quenty's Binder module
Author: memothelemo
Latest version: 6.0.0-ts.3

## @rbxts/binder

Typings for Quenty's Binder (a Nevermore module)

## Installation

**NPM**:
`npm i @rbxts/binder`

**Yarn**:
`yarn add @rbxts/binder`

## Usage

```ts
import Binder from "@rbxts/binder";

class Disco {
	constructor(public readonly instance: Instance) {
		assert(classIs(instance, "Part"), "Invalid argument #1, Part expected");
	}

	Update() {
		this.instance.BrickColor = BrickColor.random();
	}

	Destroy() {}
}

const discoBinder = new Binder("Disco", Disco);
discoBinder.Start();

// have some party!
game.GetService("RunService").Heartbeat.Connect(() => {
	for (const object of discoBinder.GetAll()) {
		object.Update();
	}
});
```

## Differences from the Luau version of Binder

### Creating Binder from a function or object

It is the same thing as you normally do in Binder from Luau.

**Function**
```ts
const binder = new Binder("Bird", (inst) => {
    print("Wow, a new bird!", inst);
    return {
        Destroy() {
     	    print("Uh oh, the bird is gone!");
        },
    };
});

binder.Start();
```

**Object**
```ts
// Create method is required
const binder = new Binder("Hello", {
    Create(instance: Instance) {
        print("Wow a new bird!", instance);
        return {
            Destroy() {
                print("Uh oh, the bird is gone!");
            },
        };
    },
});
```

### Creating Binder from class prototype

When creating Binder base class, make sure the first parameter
of the constructor function must be `Instance` type otherwise it will
result a type mismatch error.

**Example**:
```ts
class DummyBinder {
	constructor(instance: Instance) {
		print(`${instance.GetFullName()} spawned!`);
	}
}
```

## Destroying component

You may want to make either `Destroy` method either in `lowercase` or `PascalCase`
so that Binder can call it and automatically call the method.
npm package: @rbxts/bitbuffer
Description: A binary stream module for packing binary data. roblox-ts typings for bitbuffer by Dekkonot.
Author: Dekkonot
Latest version: 1.1.1-ts.1

# BitBuffer

TS typings for Dekkonot's BitBuffer implementation.

- [**BitBuffer repository**](https://github.com/dekkonot/bitbuffer)
- [**BitBuffer documentation**](https://dekkonot.github.io/bitbuffer)
- [**This package's repository**](https://github.com/tacheometry/rbxts-bitbuffer)

## Installation

[![NPM](https://nodei.co/npm/@rbxts/bitbuffer.png)](https://npmjs.org/package/@rbxts/bitbuffer)

Run `npm i @rbxts/bitbuffer` in your project directory.

## Usage

```ts
import BitBuffer from "@rbxts/bitbuffer";

const buffer = BitBuffer();
buffer.writeBits(1, 0);
```

---

To contribute to BitBuffer, please file Pull Requests and Issues in [its GitHub repository](https://github.com/dekkonot/bitbuffer), and not in the repository of this package. The types here will reflect the most recent release of the Luau code.
npm package: @rbxts/bitbuffer2
Description: Typings for rstk's BitBuffer module
Author: rstk
Latest version: 1.0.0-ts.0

# BitBuffer
Typings for [rstk](https://github.com/rstk)'s [BitBuffer](https://github.com/rstk/BitBuffer) module.

## Installation
```bash
npm i @rbxts/bitbuffer2
```

## Usage
```ts
import BitBuffer from "@rbxts/bitbuffer2";

class PlayerData {
        public Money: number;

        public Experience: number;

        public AverageFps: number;

        public CustomName: string;

        public constructor(serialized?: string) {
                const buffer = BitBuffer.FromBase91(serialized);

                this.Money = buffer.ReadUInt(32);
                this.Experience = buffer.ReadUInt(16);
                this.AverageFps = buffer.ReadFloat32();
		this.CustomName = buffer.ReadString();
        }

        public Serialize() {
                const buffer = new BitBuffer();

                buffer.WriteUInt(32, this.Money);
                buffer.WriteUInt(16, this.Experience);
                buffer.WriteFloat32(this.AverageFps);
                buffer.WriteString(this.CustomName);

                return buffer.ToBase91();
        }
}

export = PlayerData;
```
npm package: @rbxts/bloxstrap-rpc-sdk
Description: Bloxstrap RPC SDK library
Author: pizzaboxer
Latest version: 1.1.0

# <img src="https://github.com/pizzaboxer/bloxstrap/raw/main/Images/Bloxstrap.png" width="48"/> BloxstrapRPC SDK
[![License](https://img.shields.io/github/license/bloxstraplabs/bloxstrap-rpc-sdk)](https://github.com/bloxstraplabs/bloxstrap-rpc-sdk/blob/main/LICENSE)
[![Version](https://img.shields.io/github/v/release/bloxstraplabs/bloxstrap-rpc-sdk?color=7a39fb)](https://github.com/bloxstraplabs/bloxstrap-rpc-sdk/releases/latest)

 Take advantage of Bloxstrap's features from inside your game with BloxstrapRPC.

The SDK can be obtained from the following places:
- [Roblox Creator Store](https://create.roblox.com/marketplace/asset/14278970228/BloxstrapRPC-SDK)
- [npm (roblox-ts)](https://www.npmjs.com/package/@rbxts/bloxstrap-rpc-sdk)
- [GitHub Releases](https://github.com/bloxstraplabs/bloxstrap-rpc-sdk/releases/latest)

Documentation on details and usage about BloxstrapRPC and the SDK [is available here](https://github.com/pizzaboxer/bloxstrap/wiki/Integrating-Bloxstrap-functionality-into-your-game).

Special thanks:
- [@EpixScripts](https://github.com/EpixScripts) for helping with the development of BloxstrapRPC itself along with the SDK module.
- [@tacheometry](https://github.com/tacheometry) for initializing a Rojo/roblox-ts setup and handing it off to be used officially.
npm package: @rbxts/brand
Description: Source was taken from: https://github.com/kourge/ts-brand for the purpose of it working with roblox TypeScript compiler.
Author: Ivan Leontev
Latest version: 0.0.3

# rbx-brand

Source was taken from: https://github.com/kourge/ts-brand for the purpose of it working with roblox TypeScript compiler.
npm package: @rbxts/builders
Description: Gives builder APIs to common parameter objects on Roblox
Latest version: 1.0.2

# Builders
Simple library for easily constructing roblox data types using the builder pattern.

Also abstracts it so you don't have to remember if a data type is an instance or not as well. (Because the inconsistency is baffling.)

## Supported Roblox Data Types
- ### OverlapParams (`OverlapParamsBuilder`)
- ### DockWidgetPluginGuiInfo (`DockWidgetPluginGuiInfoBuilder`)
- ### RaycastParams (`RaycastParamsBuilder`)
- ### TeleportOptions (`TeleportOptionsBuilder`)
- ### TweenInfo (`TweenInfoBuilder`)
npm package: @rbxts/bytenet
Description: ---
Author: @rbxts
Latest version: 0.4.3-tsprev4

<div align="center">
  
  <img align="center" src="./docs/assets/bytenetLogo.png" width=100 height=100></img>

# ByteNet

## Simple, buffer-based networking.

[GitHub](https://github.com/ffrostflame/ByteNet) | [Documentation](https://ffrostflame.github.io/ByteNet/)

</div>

ByteNet is an networking library which takes your Luau data, and serializes it into buffers. On the other end, ByteNet deserializes your data, and then feeds it back to your Luau code. You don't need to worry about type validation, optimization, packet structure, etc. ByteNet does all the hard parts for you! Strictly typed with an incredibly basic API that explains itself, ByteNet makes networking simple, easy, and quick. There's very few concepts you need to grasp in order to use ByteNet; it has an incredibly minimalistic & simplistic, yet powerful API.

## Installation

You can install ByteNet on Wally, or through the latest release's `.rbxm` file.

## Performance

ByteNet performs incredibly well compared to non-buffer based libraries like BridgeNet2. This is because ByteNet has a **custom serializer** that takes your Luau data and transforms it into a buffer, sending that and deserializing it on the other side.

## Further contact

You can contact me directly under the ByteNet thread in the [Roblox OSS Server](https://discord.gg/5KjV64PA3d).

Further documentation [here](https://ffrostflame.github.io/ByteNet/).

## License

This project is under the MIT license! so, it's open source.
npm package: @rbxts/bytenet-fixed
Description: <div align="center">
Latest version: 1.1.4

<div align="center">
  
  <img align="center" src="./docs/assets/bytenetLogo.png" width=100 height=100></img>

# ByteNet

## Simple, buffer-based networking.

[GitHub](https://github.com/ffrostfall/ByteNet) | [Documentation](https://ffrostfall.github.io/ByteNet/)

</div>

ByteNet is an networking library which takes your Luau data, and serializes it into buffers. On the other end, ByteNet deserializes your data, and then feeds it back to your Luau code. You don't need to worry about type validation, optimization, packet structure, etc. ByteNet does all the hard parts for you! Strictly typed with an incredibly basic API that explains itself, ByteNet makes networking simple, easy, and quick. There's very few concepts you need to grasp in order to use ByteNet; it has an incredibly minimalistic & simplistic, yet powerful API.

## Installation

You can install ByteNet on Wally, or through the latest release's `.rbxm` file.

## Performance

ByteNet performs incredibly well compared to non-buffer based libraries like BridgeNet2. This is because ByteNet has a **custom serializer** that takes your Luau data and transforms it into a buffer, sending that and deserializing it on the other side.

## Further contact

You can contact me directly under the ByteNet thread in the [Roblox OSS Server](https://discord.gg/5KjV64PA3d).

Further documentation [here](https://ffrostfall.github.io/ByteNet/).

## License

This project is under the MIT license! so, it's open source
npm package: @rbxts/callback-pool
Description: Includes a ``CallbackPool`` class, than, when drained, will execute all functions currently in it's pool and then remove them from the pool.
Author: typechecked
Latest version: 1.0.0

# Callback Pool
Includes a ``CallbackPool`` class, than, when drained, will execute all functions currently in it's pool and then remove them from the pool.

```ts
import { CallbackPool } from "@rbxts/callback-pool"

const MyPool = new CallbackPool([
    () => {
        print("First function ran!")
    },
    () => {
        print("Second function ran!")
    }
])

/*
    Expected output:
        - First function ran!
        - Second function ran!
*/
MyPool.Drain()

MyPool.Add(() => {
    print("Third function ran!")
}).Add(() => {
    print("Fourth function ran!")
})

/*
    Expected output:
        - Third function ran!
        - Fourth function ran!
*/
MyPool.Drain()
```
npm package: @rbxts/cargo-semver
Description: A parser and evaluator for Cargo's flavor of Semantic Versioning
Author: Tim7775
Latest version: 1.0.21

## About
The goal of this library is to replicate the exact behavior of the Rust crate [`semver`](https://crates.io/crates/semver) (currently `v1.0.21`) used by [Cargo](https://github.com/rust-lang/cargo) (and [Wally](https://github.com/UpliftGames/wally), [Foreman](https://github.com/Roblox/foreman) and [Rokit](https://github.com/rojo-rbx/rokit)). It succeeds in this with only minor deviations that should only ever present themselves when dealing with hostile user input.

#### Deviations from Cargo's semver:
1. Identifiers ([Prerelease](https://tim7775.github.io/luau-cargo-semver/api/Prerelease) and [BuildMetadata](https://tim7775.github.io/luau-cargo-semver/api/BuildMetadata)) have a maximum length of 512 characters (Note: This should be more than enough for all use cases. For context, npm has a limit of 256 characters for the complete semver string).
2. Major, minor and patch version numbers overflow at LUAU_MAX_PRECISE_INT (2^53 - 1) instead of u64::MAX (2^63 - 1) (Note: Numbers in identifiers do not have this limitation, they get compared with arbitrary-precision).

## Example
```ts
import Semver from "@rbxts/cargo-semver";

const req = ">=1.2.3, <1.8.0";

// Check whether this requirement matches version 1.2.3-alpha.1 (no)
assert(!Semver.matches("1.2.3-alpha.1", req), "assertion failed!");

// Check whether it matches 1.3.0 (yes it does)
assert(Semver.matches("1.3.0", req), "assertion failed!");

// Compare versions
assert(Semver.cmp("1.3.0", "!=", "1.3.0+build"), "assertion failed!");
assert(Semver.cmpPrecedence("1.3.0", "==", "1.3.0+build"), "assertion failed!");

// Sort versions array
const versions = [ "3.1.2", "1.0.0", "1.0.0-rc.1", "1.0.0-rc.2", "0.3.0-alpha", "0.3.0-beta" ];
table.sort(versions, function(a, b) {
	return Semver.cmp(a, "<", b);
})
print(versions);
```
npm package: @rbxts/catmull-rom-spline
Description: The module that makes it easy to create [Catmull-Rom Splines](https://www.cs.cmu.edu/~fp/courses/graphics/asst5/catmullRom.pdf) on Roblox.
Author: Sasial
Latest version: 1.0.0

# Catmull-Rom-Spline-Module
The module that makes it easy to create [Catmull-Rom Splines](https://www.cs.cmu.edu/~fp/courses/graphics/asst5/catmullRom.pdf) on Roblox.

## Usage
The Catmull-Rom Spline constructor takes in 2 arguments:
1. `points` a table consisting of numbers, Vector2s, or Vector3s and/or BaseParts.
2. `tension` [optional]: a number, usually in [0, 1] that visually changes the curve made. If left as nil, tension will default to 0.5.
```lua
CatmullRomSpline.new(points: {number} | {Vector2} | {Vector3 | BasePart}, tension: number?)
```

## API
```lua
CatmullRomSplineObject:ChangeTension(tension: number)
```
npm package: @rbxts/catppuccin-roact
Description: Roact hooks and context for catppuccin.
Author: Theo Last - Finchasaurus
Latest version: 1.0.1


# Catppuccin Roact

Roact hooks and context to use with the catppuccin theme.
## Usage/Examples

``` tsx
import Roact from "@rbxts/roact";
import { useTheme } from "path-to/ThemeContext";

export default function Example() {
	const theme = useTheme();
	return <frame BackgroundColor3={theme.Theme.Base} Size={UDim2.fromScale(1, 1)} />;
}
```
npm package: @rbxts/ccdik-controller
Description: Alternate inverse kinematics method for Roblox Motor6D rigs. roblox-ts typings for datlass's CCDIK Controller.
Author: tacheometry
Latest version: 1.0.1-ts3

<h1 align="center">CCDIK Controller</h1>
<div align="center">
Cyclic Coordinate Descent Inverse Kinematics Controller
</div>

-   **[DevForum post](https://devforum.roblox.com/t/ccdikcontroller-alternate-inverse-kinematics-method-for-motor6d-rigs/968275)**
-   **[Documentation](https://datlass.github.io/Rbx-CCDIK/)**
-   **[This package's repository](https://github.com/tacheometry/rbxts-ccdik-controller)**

<h2>Installation</h2>

[![NPM](https://nodei.co/npm/@rbxts/ccdik-controller.png)](https://npmjs.org/package/@rbxts/ccdik-controller)

Run `npm i @rbxts/ccdik-controller` in your project directory.

<h2>Usage</h2>

```ts
import CCDIKController, { ConstraintsValue } from "@rbxts/ccdik-controller";

// optional constraints parameter
const constraints = new Map<Motor6D, ConstraintsValue>();
constraints.set(new Instance("Motor6D"), {
	ConstraintType: "Hinge",
	LowerAngle: 5,
	UpperAngle: 10,
	AxisAttachment: "foo",
	JointAttachment: "baz",
});
const ikController = new CCDIKController([motor1, motor2, motor3], constraints);

ikController.CCDIKIterateUntil(new Vector3(5, 5, 5));
```

---

If you would like to contribute to CCDIK Controller, please file Pull Requests and Issues in [its GitHub repository](https://github.com/datlass/Rbx-CCDIK), and not in the repository of this package.
npm package: @rbxts/centurion-ui
Description: Terminal UI for the Centurion command framework
Author: paradoxuum
Latest version: 1.0.8

<div align="center">
  <a href="https://centurion.paradoxum.dev/" target="_blank">
    <img src="https://raw.githubusercontent.com/paradoxuum/centurion/main/docs/src/assets/logo.webp" width="150" />
  </a>

  <h1>Centurion - UI</h1>

  <p>
    <strong>A flexible and extensible command framework for roblox-ts</strong>
  </p>

  This package contains Centurion's user interface. To use it, you must
  also install [@rbxts/centurion](https://www.npmjs.com/package/@rbxts/centurion).

  [![CI status][ci-badge]][ci-url]
  [![npm latest version][npm-latest-badge]][npm-latest-url]
  [![npm dev version][npm-next-badge]][npm-next-url]

  [npm-latest-badge]: https://img.shields.io/npm/v/%40rbxts%2Fcenturion?logo=npm&label=latest&color=green
  [npm-latest-url]: https://www.npmjs.com/package/@rbxts/centurion/v/latest
  [npm-next-badge]: https://img.shields.io/npm/v/%40rbxts%2Fcenturion%2Fnext?logo=npm&label=next
  [npm-next-url]: https://www.npmjs.com/package/@rbxts/centurion/v/next
  [ci-badge]: https://github.com/paradoxuum/centurion/actions/workflows/ci.yml/badge.svg?branch=main
  [ci-url]: https://github.com/paradoxuum/centurion/actions/workflows/ci.yml

  <a href="https://centurion.paradoxum.dev/">📖 Documentation</a>
</div>

<img src="https://raw.githubusercontent.com/paradoxuum/centurion/main/public/banner.png" />
npm package: @rbxts/chain
Description: Generic chain of command / middleware thingy implementation for roblox-ts.
Latest version: 1.0.1

# Chain

A super simple chain of command pattern implementation. This is often used in HTTP request validation, which can be translated to Roblox to validate things on the client and server. It doesn't have to be used for validation though, it can be used in any scenario where you need to execute one thing after another, and you want that system to be modular.

## Example

A simple example.

```ts
interface HitValidationInfo {
	hitterRig: CharacterRigR15;
	targetRig: CharacterRigR15;
}

const chain = new Chain<HitValidationInfo>();

class DistanceValidator implements Link<HitValidationInfo> {
	public constructor(private thresholdStuds: number) {}

	public handle(data: HitValidationInfo, session: ChainSession) {
		const hitterPos = data.hitterRig.HumanoidRootPart.Position;
		const targetPos = data.targetRig.HumanoidRootPart.Position;
		const mag = hitterPos.sub(targetPos).Magnitude;
		if (mag > this.thresholdStuds) session.cancel();
	}
}

// A 'link' can be a function or class
chain.addLink(new DistanceValidator(8), () => {
	print("This will only print out if the first link doesn't cancel the session!");
});

const result = chain.startSession({ ... });
if (result.wasCancelled()) print("Oh no!")
```