diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 8f628fe..0000000 --- a/.eslintrc +++ /dev/null @@ -1,26 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "parserOptions": { - "jsx": true, - "useJSXTextNode": true, - "ecmaVersion": 2018, - "sourceType": "module", - "project": "./tsconfig.json" - }, - "plugins": [ - "@typescript-eslint", - "roblox-ts", - "prettier" - ], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:roblox-ts/recommended", - "plugin:prettier/recommended" - ], - "rules": { - "prettier/prettier": "warn", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-unsafe-declaration-merging": "off" - } -} diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 6313b56..0000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 142e5dc..35c0019 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,16 +7,16 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - with: - run_install: true - uses: CompeyDev/setup-rokit@v0.1.2 - - name: Install Wally dependencies - run: pnpm wally + - name: Install dependencies + run: sh bin/install.sh - name: Check code quality - run: pnpm check + run: sh bin/check.sh + + - name: Run tests + run: sh bin/test.sh - name: Build models - run: pnpm build + run: sh bin/build.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cd05b2e..5bdee21 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,11 +9,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v4 - uses: CompeyDev/setup-rokit@v0.1.2 - name: Build models - run: pnpm build + run: sh bin/build.sh - name: Upload release assets uses: AButler/upload-release-assets@v3.0 diff --git a/.gitignore b/.gitignore index 5701a11..f1dcc5c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,9 @@ /.vscode -/node_modules /build -/modules/DevPackages -/packages/**/node_modules +/roblox_packages /packages/**/wally.lock -/packages/**/README.md -/packages/**/LICENSE.md /sourcemap.json *.tsbuildinfo -*.tgz *.rbxm .DS_Store roblox.d.luau diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 537ac33..0000000 --- a/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "printWidth": 120, - "tabWidth": 4, - "trailingComma": "all", - "useTabs": true -} diff --git a/README.md b/README.md index 8ea132b..f832d4d 100644 --- a/README.md +++ b/README.md @@ -24,13 +24,13 @@ See an example of Charm's features in [this example repository](https://github.c ## šŸ€ Features -- āš›ļø **Manage state with _atoms_.** Decompose state into independent containers called _atoms_, as opposed to combining them into a single store. +- āš›ļø **Manage state with _atoms_.** Decompose state into independent containers called _atoms_, as opposed to combining them into a single store. -- šŸ’Ŗ **Minimal, yet powerful.** Less boilerplate — write simple functions to read from and write to state. +- šŸ’Ŗ **Minimal, yet powerful.** Less boilerplate — write simple functions to read from and write to state. -- šŸ”¬ **Immediate updates.** Listeners run asynchronously by default, avoiding the cascading effects of deferred updates and improving responsiveness. +- šŸ”¬ **Immediate updates.** Listeners run asynchronously by default, avoiding the cascading effects of deferred updates and improving responsiveness. -- šŸ¦„ **Like magic.** Selector functions can be subscribed to as-is — with implicit dependency tracking, atoms are captured and memoized for you. +- šŸ¦„ **Like magic.** Selector functions can be subscribed to as-is — with implicit dependency tracking, atoms are captured and memoized for you. --- @@ -59,12 +59,12 @@ Charm provides a debug mode to help you identify potential bugs in your project. Enabling `__DEV__` adds a few helpful features: -- Better error handling for selectors, subscriptions, and batched functions: +- Better error handling for selectors, subscriptions, and batched functions: - - Errors provide the function's name and line number. - - Yielding in certain functions will throw an error. + - Errors provide the function's name and line number. + - Yielding in certain functions will throw an error. -- Server state is validated for [remote event limitations](https://create.roblox.com/docs/scripting/events/remote#argument-limitations) before being passed to the client. +- Server state is validated for [remote event limitations](https://create.roblox.com/docs/scripting/events/remote#argument-limitations) before being passed to the client. Enabling debug mode in unit tests, storybooks, and other development environments can help you catch potential issues early. However, remember to turn off debug mode in production to avoid the performance overhead. @@ -85,11 +85,11 @@ local todosAtom: Atom<{ string }> = atom({}) #### Parameters -- `state`: The value to assign to the atom initially. +- `state`: The value to assign to the atom initially. -- **optional** `options`: An object that configures the behavior of this atom. +- **optional** `options`: An object that configures the behavior of this atom. - - **optional** `equals`: An equality function to determine whether the state has changed. By default, strict equality (`==`) is used. + - **optional** `equals`: An equality function to determine whether the state has changed. By default, strict equality (`==`) is used. #### Returns @@ -144,9 +144,9 @@ nameAtom("Jane") --> "JANE" #### Parameters -- `callback`: The function to subscribe to. This may be an atom or a selector function that depends on an atom. +- `callback`: The function to subscribe to. This may be an atom or a selector function that depends on an atom. -- `listener`: The listener is called when the result of the callback changes. It receives the new state and the previous state as arguments. +- `listener`: The listener is called when the result of the callback changes. It receives the new state and the previous state as arguments. #### Returns @@ -173,7 +173,7 @@ Because `effect` implicitly tracks all atoms read within the callback, it might #### Parameters -- `callback`: The function to track for state changes. The callback will run once to retrieve its dependencies, and then again whenever they change. +- `callback`: The function to track for state changes. The callback will run once to retrieve its dependencies, and then again whenever they change. #### Returns @@ -181,14 +181,14 @@ Because `effect` implicitly tracks all atoms read within the callback, it might #### Caveats -- **If your effect should disconnect itself, use the `cleanup` argument.** Because effects run immediately, your effect may run before a `cleanup` function is returned. To disconnect an effect from the inside, use the argument passed to your effect instead: - ```lua - effect(function(cleanup) - if condition() then - cleanup() - end - end) - ``` +- **If your effect should disconnect itself, use the `cleanup` argument.** Because effects run immediately, your effect may run before a `cleanup` function is returned. To disconnect an effect from the inside, use the argument passed to your effect instead: + ```lua + effect(function(cleanup) + if condition() then + cleanup() + end + end) + ``` --- @@ -213,9 +213,9 @@ This function is also useful for optimizing `effect` calls that depend on multip #### Parameters -- `callback`: A function that returns a new value depending on one or more atoms. +- `callback`: A function that returns a new value depending on one or more atoms. -- **optional** [`options`](#parameters): An object that configures the behavior of this atom. +- **optional** [`options`](#parameters): An object that configures the behavior of this atom. #### Returns @@ -243,9 +243,9 @@ end) #### Parameters -- `callback`: An atom or selector function that returns a dictionary or an array of values. When a key is added to the state, the factory will be called with the new key and its initial value. +- `callback`: An atom or selector function that returns a dictionary or an array of values. When a key is added to the state, the factory will be called with the new key and its initial value. -- `factory`: A function that will be called whenever a key is added or removed from the atom's state. The callback will receive the key and the entry's initial value as arguments, and may return a cleanup function. +- `factory`: A function that will be called whenever a key is added or removed from the atom's state. The callback will receive the key and the entry's initial value as arguments, and may return a cleanup function. #### Returns @@ -266,13 +266,13 @@ end) #### Parameters -- `callback`: The function whose result you want to map over. This can be an atom or a selector function that reads from atoms. +- `callback`: The function whose result you want to map over. This can be an atom or a selector function that reads from atoms. -- `mapper`: The mapper is called for each key in your state. Given the current value and key, it should return a new corresponding value and key: +- `mapper`: The mapper is called for each key in your state. Given the current value and key, it should return a new corresponding value and key: - 1. Return a single value to map the table's original key to a new value. - 2. Return two values, the first being the value and the second being the key, to update both keys and values. - 3. Return `nil` for the value to remove the key from the resulting table. + 1. Return a single value to map the table's original key to a new value. + 2. Return two values, the first being the value and the second being the key, to update both keys and values. + 3. Return `nil` for the value to remove the key from the resulting table. #### Returns @@ -296,9 +296,9 @@ end) #### Parameters -- `value`: Any value. If the value is a function, `peek` will call it without tracking dependencies and return the result. +- `value`: Any value. If the value is a function, `peek` will call it without tracking dependencies and return the result. -- **optional** `...args`: Additional arguments to pass to the value if it is a function. +- **optional** `...args`: Additional arguments to pass to the value if it is a function. #### Returns @@ -322,7 +322,7 @@ end) #### Parameters -- `callback`: A function that updates atoms. Listeners will only be notified once all changes have been applied. +- `callback`: A function that updates atoms. Listeners will only be notified once all changes have been applied. #### Returns @@ -372,9 +372,9 @@ end, { props.filter }) #### Parameters -- `callback`: An atom or selector function that depends on an atom. +- `callback`: An atom or selector function that depends on an atom. -- **optional** `dependencies`: An array of outside values that the selector depends on. If the dependencies change, the subscription is re-created and the component re-renders with the new state. +- **optional** `dependencies`: An array of outside values that the selector depends on. If the dependencies change, the subscription is re-created and the component re-renders with the new state. #### Returns @@ -416,7 +416,7 @@ end #### Parameters -- `callback`: An atom or selector function that depends on an atom. +- `callback`: An atom or selector function that depends on an atom. #### Returns @@ -475,15 +475,15 @@ end) #### Parameters -- `options`: An object to configure sync behavior. +- `options`: An object to configure sync behavior. - - `atoms`: A dictionary of the atoms to sync. The keys should match the keys on the client. + - `atoms`: A dictionary of the atoms to sync. The keys should match the keys on the client. - - **optional** `interval`: The interval at which to batch state updates to clients. Defaults to `0`, meaning updates are batched every frame. + - **optional** `interval`: The interval at which to batch state updates to clients. Defaults to `0`, meaning updates are batched every frame. - - **optional** `preserveHistory`: Whether to sync an exhaustive history of changes made to the atoms since the last sync event. If `true`, the server sends multiple payloads instead of one. Defaults to `false` for performance. + - **optional** `preserveHistory`: Whether to sync an exhaustive history of changes made to the atoms since the last sync event. If `true`, the server sends multiple payloads instead of one. Defaults to `false` for performance. - - **optional** `autoSerialize`: Whether to apply validation and workarounds to certain [remote argument limitations](https://create.roblox.com/docs/scripting/events/remote#table-indexing). Defaults to `true`, but you should set it to `false` if you serialize remote arguments (i.e. if you use [ByteNet](https://github.com/ffrostfall/ByteNet) or [Zap](https://github.com/red-blox/zap)). + - **optional** `autoSerialize`: Whether to apply validation and workarounds to certain [remote argument limitations](https://create.roblox.com/docs/scripting/events/remote#table-indexing). Defaults to `true`, but you should set it to `false` if you serialize remote arguments (i.e. if you use [ByteNet](https://github.com/ffrostfall/ByteNet) or [Zap](https://github.com/red-blox/zap)). > [!NOTE] > Charm sends table updates in the form of partial tables, so arrays will contain `nil` values, which has undefined behavior in remotes without serialization. @@ -494,17 +494,17 @@ end) `server` returns an object with the following methods: -- `syncer:connect(callback)`: Registers a callback to send state updates to clients. The callback will receive the player and the payload(s) to send, and should fire a remote event. The payload is read-only, so any changes should be applied to a copy of the payload. +- `syncer:connect(callback)`: Registers a callback to send state updates to clients. The callback will receive the player and the payload(s) to send, and should fire a remote event. The payload is read-only, so any changes should be applied to a copy of the payload. -- `syncer:hydrate(player)`: Sends the player a full state update for all synced atoms. +- `syncer:hydrate(player)`: Sends the player a full state update for all synced atoms. #### Caveats -- **Do not use values that cannot be sent over remotes** in your shared atoms. This includes functions, threads, and non-string keys in dictionaries. [Read more about argument limitations in remotes.](https://create.roblox.com/docs/scripting/events/remote#argument-limitations) +- **Do not use values that cannot be sent over remotes** in your shared atoms. This includes functions, threads, and non-string keys in dictionaries. [Read more about argument limitations in remotes.](https://create.roblox.com/docs/scripting/events/remote#argument-limitations) -- **By default, Charm omits the individual changes made to atoms** between sync events (i.e. a `counterAtom` set to `1` and then `2` will only send the final state of `2`). If you need to preserve a history of changes, set `preserveHistory` to `true`. +- **By default, Charm omits the individual changes made to atoms** between sync events (i.e. a `counterAtom` set to `1` and then `2` will only send the final state of `2`). If you need to preserve a history of changes, set `preserveHistory` to `true`. -- **Charm does not handle network communication.** Use remote events or a network library to send sync payloads - and remember to set `autoSerialize` accordingly! +- **Charm does not handle network communication.** Use remote events or a network library to send sync payloads - and remember to set `autoSerialize` accordingly! --- @@ -531,21 +531,21 @@ remotes.requestState:fire() #### Parameters -- `options`: An object to configure sync behavior. +- `options`: An object to configure sync behavior. - - `atoms`: A dictionary of the atoms to sync. The keys should match the keys on the server. + - `atoms`: A dictionary of the atoms to sync. The keys should match the keys on the server. - - **optional** `ignoreUnhydrated`: Whether to ignore state updates before setting the initial state. Defaults to `true`. + - **optional** `ignoreUnhydrated`: Whether to ignore state updates before setting the initial state. Defaults to `true`. #### Returns `client` returns an object with the following methods: -- `syncer:sync(...payloads)` applies a state update from the server. +- `syncer:sync(...payloads)` applies a state update from the server. #### Caveats -- **Charm does not handle network communication.** Use remote events or a network library to receive sync payloads. This includes requesting the initial state, which is implemented via `requestState` in the example above. +- **Charm does not handle network communication.** Use remote events or a network library to receive sync payloads. This includes requesting the initial state, which is implemented via `requestState` in the example above. --- @@ -572,7 +572,7 @@ end) #### Parameters -- `value`: Any value. If the value is `None`, `isNone` will return `true`. +- `value`: Any value. If the value is `None`, `isNone` will return `true`. #### Returns diff --git a/bin/build.sh b/bin/build.sh index 547e4e7..be6fdf7 100644 --- a/bin/build.sh +++ b/bin/build.sh @@ -1,5 +1,5 @@ mkdir build rojo build packages/charm -o build/charm.rbxm rojo build packages/charm-sync -o build/charm-sync.rbxm -rojo build packages/react -o build/react-charm.rbxm -rojo build packages/vide -o build/vide-charm.rbxm +rojo build packages/react-charm -o build/react-charm.rbxm +rojo build packages/vide-charm -o build/vide-charm.rbxm diff --git a/bin/check.sh b/bin/check.sh index 31abbe9..7aec81b 100644 --- a/bin/check.sh +++ b/bin/check.sh @@ -6,13 +6,11 @@ luau-lsp analyze \ --defs=bin/roblox.d.luau \ --flag:LuauFixIndexerSubtypingOrdering=true \ --sourcemap=sourcemap.json \ - --ignore="**/_Index/**" \ + --ignore="roblox_packages/**" \ packages tests selene packages tests stylua --check packages tests -eslint packages - rm bin/roblox.d.luau diff --git a/bin/install.sh b/bin/install.sh index 53ccca2..ba622eb 100644 --- a/bin/install.sh +++ b/bin/install.sh @@ -1,4 +1,2 @@ -cd modules -wally install -cd .. +pesde install rojo sourcemap --output sourcemap.json diff --git a/default.project.json b/default.project.json index a43197e..cbd3b70 100644 --- a/default.project.json +++ b/default.project.json @@ -4,27 +4,17 @@ "$className": "DataModel", "ReplicatedStorage": { "$className": "ReplicatedStorage", - "DevPackages": { - "$path": "modules/DevPackages", - "Charm": { - "$path": "packages/charm" - }, - "CharmSync": { - "$path": "packages/charm-sync" - }, - "ReactCharm": { - "$path": "packages/react" - }, - "VideCharm": { - "$path": "packages/vide" - } + "Packages": { + "$path": "roblox_packages", + "Charm": { "$path": "packages/charm" }, + "CharmSync": { "$path": "packages/charm-sync" }, + "ReactCharm": { "$path": "packages/react-charm" }, + "VideCharm": { "$path": "packages/vide-charm" } } }, "ServerScriptService": { "$className": "ServerScriptService", - "Tests": { - "$path": "tests" - } + "Tests": { "$path": "tests" } } } } diff --git a/modules/wally.lock b/modules/wally.lock deleted file mode 100644 index 7294d77..0000000 --- a/modules/wally.lock +++ /dev/null @@ -1,103 +0,0 @@ -# This file is automatically @generated by Wally. -# It is not intended for manual editing. -registry = "test" - -[[package]] -name = "centau/vide" -version = "0.3.1" -dependencies = [] - -[[package]] -name = "jsdotlua/boolean" -version = "1.2.7" -dependencies = [["number", "jsdotlua/number@1.2.7"]] - -[[package]] -name = "jsdotlua/collections" -version = "1.2.7" -dependencies = [["es7-types", "jsdotlua/es7-types@1.2.7"], ["instance-of", "jsdotlua/instance-of@1.2.7"]] - -[[package]] -name = "jsdotlua/console" -version = "1.2.7" -dependencies = [["collections", "jsdotlua/collections@1.2.7"]] - -[[package]] -name = "jsdotlua/es7-types" -version = "1.2.7" -dependencies = [] - -[[package]] -name = "jsdotlua/instance-of" -version = "1.2.7" -dependencies = [] - -[[package]] -name = "jsdotlua/luau-polyfill" -version = "1.2.7" -dependencies = [["boolean", "jsdotlua/boolean@1.2.7"], ["collections", "jsdotlua/collections@1.2.7"], ["console", "jsdotlua/console@1.2.7"], ["es7-types", "jsdotlua/es7-types@1.2.7"], ["instance-of", "jsdotlua/instance-of@1.2.7"], ["math", "jsdotlua/math@1.2.7"], ["number", "jsdotlua/number@1.2.7"], ["string", "jsdotlua/string@1.2.7"], ["symbol-luau", "jsdotlua/symbol-luau@1.0.1"], ["timers", "jsdotlua/timers@1.2.7"]] - -[[package]] -name = "jsdotlua/math" -version = "1.2.7" -dependencies = [] - -[[package]] -name = "jsdotlua/number" -version = "1.2.7" -dependencies = [] - -[[package]] -name = "jsdotlua/promise" -version = "3.5.2" -dependencies = [] - -[[package]] -name = "jsdotlua/react" -version = "17.2.1" -dependencies = [["luau-polyfill", "jsdotlua/luau-polyfill@1.2.7"], ["shared", "jsdotlua/shared@17.2.1"]] - -[[package]] -name = "jsdotlua/react-reconciler" -version = "17.2.1" -dependencies = [["luau-polyfill", "jsdotlua/luau-polyfill@1.2.7"], ["promise", "jsdotlua/promise@3.5.2"], ["react", "jsdotlua/react@17.2.1"], ["scheduler", "jsdotlua/scheduler@17.2.1"], ["shared", "jsdotlua/shared@17.2.1"]] - -[[package]] -name = "jsdotlua/react-roblox" -version = "17.2.1" -dependencies = [["luau-polyfill", "jsdotlua/luau-polyfill@1.2.7"], ["react", "jsdotlua/react@17.2.1"], ["react-reconciler", "jsdotlua/react-reconciler@17.2.1"], ["scheduler", "jsdotlua/scheduler@17.2.1"], ["shared", "jsdotlua/shared@17.2.1"]] - -[[package]] -name = "jsdotlua/scheduler" -version = "17.2.1" -dependencies = [["luau-polyfill", "jsdotlua/luau-polyfill@1.2.7"], ["shared", "jsdotlua/shared@17.2.1"]] - -[[package]] -name = "jsdotlua/shared" -version = "17.2.1" -dependencies = [["luau-polyfill", "jsdotlua/luau-polyfill@1.2.7"]] - -[[package]] -name = "jsdotlua/string" -version = "1.2.7" -dependencies = [["es7-types", "jsdotlua/es7-types@1.2.7"], ["number", "jsdotlua/number@1.2.7"]] - -[[package]] -name = "jsdotlua/symbol-luau" -version = "1.0.1" -dependencies = [] - -[[package]] -name = "jsdotlua/timers" -version = "1.2.7" -dependencies = [["collections", "jsdotlua/collections@1.2.7"]] - -[[package]] -name = "littensy/charm" -version = "0.1.0" -dependencies = [["React", "jsdotlua/react@17.2.1"], ["ReactRoblox", "jsdotlua/react-roblox@17.2.1"], ["TestEZ", "roblox/testez@0.4.1"], ["Vide", "centau/vide@0.3.1"]] - -[[package]] -name = "roblox/testez" -version = "0.4.1" -dependencies = [] diff --git a/modules/wally.toml b/modules/wally.toml deleted file mode 100644 index 0c18cdc..0000000 --- a/modules/wally.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "littensy/charm" -version = "0.1.0" -registry = "https://github.com/UpliftGames/wally-index" -realm = "shared" - -[dev-dependencies] -React = "jsdotlua/react@17.2.0" -ReactRoblox = "jsdotlua/react-roblox@17.2.0" -Vide = "centau/vide@0.3.1" diff --git a/package.json b/package.json deleted file mode 100644 index 3fbcdf4..0000000 --- a/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "private": true, - "scripts": { - "build": "sh bin/build.sh", - "check": "sh bin/check.sh", - "wally": "sh bin/install.sh", - "publish:npm": "pnpm publish -r --access public", - "publish:wally": "pnpm -r --workspace-concurrency 1 publish:wally" - }, - "devDependencies": { - "@rbxts/compiler-types": "3.0.0-types.0", - "@rbxts/types": "^1.0.811", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-roblox-ts": "^0.0.36", - "prettier": "^3.3.3", - "roblox-ts": "^3.0.0", - "typescript": "~5.5.4" - }, - "packageManager": "pnpm@10.10.0" -} diff --git a/packages/charm-sync/package.json b/packages/charm-sync/package.json deleted file mode 100644 index 5256c2d..0000000 --- a/packages/charm-sync/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "@rbxts/charm-sync", - "version": "0.3.0", - "description": "Sync server state with clients using Charm", - "repository": "littensy/charm", - "license": "MIT", - "main": "src/init.luau", - "types": "src/index.d.ts", - "scripts": { - "prepare": "cp ../../LICENSE.md . && cp ../../README.md .", - "publish:wally": "wally publish" - }, - "peerDependencies": { - "@rbxts/charm": "workspace:*" - } -} diff --git a/packages/charm-sync/src/client.luau b/packages/charm-sync/src/client.luau index b09b870..8dec492 100644 --- a/packages/charm-sync/src/client.luau +++ b/packages/charm-sync/src/client.luau @@ -1,6 +1,7 @@ local Charm = require(script.Parent.Parent.Charm) local patch = require(script.Parent.patch) local types = require(script.Parent.types) + type AtomMap = types.AtomMap type SyncPayload = types.SyncPayload diff --git a/packages/charm-sync/src/flatten.luau b/packages/charm-sync/src/flatten.luau index 9c8d012..42a93eb 100644 --- a/packages/charm-sync/src/flatten.luau +++ b/packages/charm-sync/src/flatten.luau @@ -1,4 +1,5 @@ local types = require(script.Parent.types) + type AtomMap = types.AtomMap type NestedAtomMap = { diff --git a/packages/charm-sync/src/index.d.ts b/packages/charm-sync/src/index.d.ts deleted file mode 100644 index 52ff658..0000000 --- a/packages/charm-sync/src/index.d.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { Atom, Selector } from "@rbxts/charm"; - -export = CharmSync; -export as namespace CharmSync; - -type Cleanup = () => void; - -type Key = string | number | symbol; - -declare namespace CharmSync { - type AtomMap = Record>; - - type SelectorMap = Record>; - - /** - * @deprecated Use `SelectorMap` instead. - */ - type MoleculeMap = SelectorMap; - - /** - * Infers the type of the return values produced by a map of functions. - */ - type StateOfMap = { - readonly [P in keyof T]: T[P] extends Selector ? State : never; - }; - - /** - * Represents the removal of a value from the state. - */ - interface None { - readonly __none: "__none"; - } - - type MaybeNone = undefined extends T ? None : never; - - /** - * Creates a `ClientSyncer` object that receives patches from the server and - * applies them to the local state. - * - * @client - * @param options The atoms to synchronize with the server. - * @returns A `ClientSyncer` object. - */ - function client(options: ClientOptions): ClientSyncer; - - /** - * Creates a `ServerSyncer` object that sends patches to the client and - * hydrates the client's state. - * - * @server - * @param options The atoms to synchronize with the client. - * @returns A `ServerSyncer` object. - */ - function server( - options: ServerOptions, - ): ServerSyncer; - - /** - * Checks whether a value is `None`. If `true`, the value is scheduled to be - * removed from the state when the patch is applied. - * - * @param value The value to check. - * @returns `true` if the value is `None`, otherwise `false`. - */ - function isNone(value: unknown): value is None; - - interface NestedAtomMap { - readonly [key: string]: NestedAtomMap | Atom; - } - - type AppendPath = undefined extends Path - ? Name - : Name extends string - ? Path extends string - ? `${Path}/${Name}` - : never - : never; - - type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; - - type IntersectValues = UnionToIntersection<{ readonly [K in keyof T]: T[K] }[keyof T]>; - - type FlattenNestedAtoms = IntersectValues<{ - readonly [Name in keyof Atoms as AppendPath]: Atoms[Name] extends Atom - ? { readonly [K in AppendPath]: Atoms[Name] } - : Atoms[Name] extends NestedAtomMap - ? FlattenNestedAtoms> - : never; - }>; - - /** - * Flattens a nested atom map into a single object with slash-separated - * keys. Useful for recursively collecting atoms returned by modules. - * - * @param atoms The nested atom map to flatten. - * @return A flattened atom map. - */ - function flatten(atoms: Atoms): FlattenNestedAtoms; - - type DataTypes = { - [P in keyof CheckableTypes as P extends keyof CheckablePrimitives ? never : P]: CheckableTypes[P]; - }; - - /** - * A type that should not be made partial in patches. - */ - type DataType = DataTypes[keyof DataTypes]; - - /** - * A partial patch that can be applied to the state to update it. Represents - * the difference between the current state and the next state. - * - * If a value was removed, it is replaced with `None`. This can be checked - * using the `sync.isNone` function. - */ - type SyncPatch = MaybeNone | State extends - | ReadonlyMap - | Map - ? ReadonlyMap | None> - : State extends Set | ReadonlySet - ? ReadonlyMap - : State extends readonly (infer T)[] - ? Serialize extends true - ? ReadonlyMap | None> - : readonly (SyncPatch | None | undefined)[] - : State extends DataType - ? State - : State extends object - ? { readonly [P in keyof State]?: SyncPatch } - : State; - - /** - * A payload that can be sent from the server to the client to synchronize - * state between the two. - */ - type SyncPayload = - | { readonly type: "init"; readonly data: StateOfMap } - | { readonly type: "patch"; readonly data: SyncPatch, Serialize> }; - - interface ClientOptions { - /** - * The atoms to synchronize with the server. - */ - atoms: Atoms; - /** - * Whether to ignore patches sent before the client has been hydrated. - * Defaults to `true`. - */ - ignoreUnhydrated?: boolean; - } - - interface ServerOptions { - /** - * The atoms to synchronize with the client. - */ - atoms: Selectors; - /** - * The interval at which to send patches to the client, in seconds. - * Defaults to `0` (patches are sent up to once per frame). Set to a - * negative value to disable automatic syncing. - */ - interval?: number; - /** - * Whether the history of state changes since the client's last update - * should be preserved. This is useful for values that change multiple times - * per frame, where each individual change is important. Defaults to `false`. - * - * If `true`, the broadcaster will send a list of payloads to the client - * instead of a single payload. The client will apply each payload in order - * to reconstruct the state's changes over time. - */ - preserveHistory?: boolean; - /** - * When `true`, Charm will apply validation and serialize unsafe arrays - * to address remote event argument limitations. Defaults to `true`. - * - * This option should be disabled if your network library uses a custom - * serialization method (i.e. Zap, ByteNet) to prevent interference. - */ - autoSerialize?: Serialize; - } - - interface ClientSyncer { - /** - * Applies a patch or initializes the state of the atoms with the given - * payload from the server. - * - * @param payloads The patches or hydration payloads to apply. - */ - sync(...payloads: SyncPayload[]): void; - } - - interface ServerSyncer { - /** - * Sets up a subscription to each atom that schedules a patch to be sent to - * the client whenever the state changes. When a change occurs, the `callback` - * is called with the player and the payloads to send. - * - * Note that a `payload` object should not be mutated. If you need to modify - * a payload, apply the changes to a copy of the object. - * - * @param callback The function to call when the state changes. - * @returns A cleanup function that unsubscribes all listeners. - */ - connect(callback: (player: Player, ...payloads: SyncPayload[]) => void): Cleanup; - /** - * Hydrates the client's state with the server's state. This should be - * called when a player joins the game and requires the server's state. - * - * @param player The player to hydrate. - */ - hydrate(player: Player): void; - } -} diff --git a/packages/charm-sync/src/init.luau b/packages/charm-sync/src/init.luau index 5fc9171..a3e8fb2 100644 --- a/packages/charm-sync/src/init.luau +++ b/packages/charm-sync/src/init.luau @@ -3,6 +3,7 @@ local flatten = require(script.flatten) local patch = require(script.patch) local server = require(script.server) local types = require(script.types) +local validate = require(script.validate) export type SyncPayload = types.SyncPayload @@ -14,5 +15,7 @@ return { client = client, server = server, flatten = flatten, + validate = validate, + patch = patch, isNone = patch.isNone, } diff --git a/packages/charm-sync/src/server.luau b/packages/charm-sync/src/server.luau index f2c336e..afb646e 100644 --- a/packages/charm-sync/src/server.luau +++ b/packages/charm-sync/src/server.luau @@ -4,6 +4,7 @@ local Charm = require(script.Parent.Parent.Charm) local interval = require(script.Parent.interval) local patch = require(script.Parent.patch) local types = require(script.Parent.types) + type AtomMap = types.AtomMap type SyncPayload = types.SyncPayload diff --git a/packages/charm-sync/src/types.luau b/packages/charm-sync/src/types.luau index 641f744..7942c80 100644 --- a/packages/charm-sync/src/types.luau +++ b/packages/charm-sync/src/types.luau @@ -1,4 +1,5 @@ local Charm = require(script.Parent.Parent.Charm) + type Atom = Charm.Atom --[=[ diff --git a/packages/charm-sync/wally.toml b/packages/charm-sync/wally.toml index f1a78f0..0507407 100644 --- a/packages/charm-sync/wally.toml +++ b/packages/charm-sync/wally.toml @@ -5,4 +5,4 @@ registry = "https://github.com/UpliftGames/wally-index" realm = "shared" [dependencies] -charm = "littensy/charm@^0.10" +Charm = "littensy/charm@^0.10" diff --git a/packages/charm/package.json b/packages/charm/package.json deleted file mode 100644 index ea40fa6..0000000 --- a/packages/charm/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@rbxts/charm", - "version": "0.10.0", - "description": "An atomic state management library for Roblox", - "repository": "littensy/charm", - "license": "MIT", - "main": "src/init.luau", - "types": "src/index.d.ts", - "scripts": { - "prepare": "cp ../../LICENSE.md . && cp ../../README.md .", - "publish:wally": "wally publish" - } -} diff --git a/packages/charm/src/index.d.ts b/packages/charm/src/index.d.ts deleted file mode 100644 index 6244d62..0000000 --- a/packages/charm/src/index.d.ts +++ /dev/null @@ -1,165 +0,0 @@ -export = Charm; -export as namespace Charm; - -type Dispose = () => void; - -declare namespace Charm { - /** - * A primitive state container that can be read from or written to. When - * the state changes, all subscribers are notified. - * - * @param state The next state or a function that produces the next state. - * @returns The current state. - */ - interface Atom { - (): State; - (nextState: State | ((prevState: State) => State)): State; - } - - /** - * A function that depends on one or more atoms and produces a value. Can be - * used to derive state from atoms. - * - * @returns The current state. - */ - type Selector = () => State; - - /** - * Infers the type of the state produced by the given function. - */ - type StateOf = T extends () => infer State ? State : never; - - interface AtomOptions { - /** - * A function that determines whether the state has changed. By default, - * a strict equality check (`===`) is used. - */ - equals?: (prev: State, next: State) => boolean; - } - - /** - * Creates a new atom with the given state. - * - * @param state The initial state. - * @param options Optional configuration. - * @returns A new atom. - */ - function atom(state: State, options?: AtomOptions): Atom; - - // Overload for no arguments - function atom(state?: State, options?: AtomOptions): Atom; - - /** - * Creates a read-only atom that derives its state from one or more atoms. - * Used to avoid unnecessary recomputations if multiple listeners depend on - * the same atoms. - * - * @param callback The function that produces the state. - * @returns A new read-only atom. - */ - function computed(callback: (prevResult?: State) => State): () => State; - - /** - * Subscribes to changes in the given atom or selector. The callback is - * called with the current state and the previous state only after a change - * occurs. - * - * @param callback The atom or selector to subscribe to. - * @param listener The function to call when the state changes. - * @returns A function that unsubscribes the callback. - */ - function subscribe(callback: () => State, listener: (state: State, prevState: State) => void): Dispose; - - /** - * Subscribes to changes in the given atom or selector. The callback is - * called with the current state and the previous state immediately after - * subscribing, and again when a change occurs. - * - * @param callback The atom or selector to subscribe to. - * @param listener The function to call when the state changes. - * @returns A function that unsubscribes the callback. - */ - function listen( - callback: () => State, - listener: (state: State, prevState: State, dispose: Dispose) => void, - ): Dispose; - - /** - * Runs the given callback immediately and whenever any atom it depends on - * changes. Returns a cleanup function that unsubscribes the callback. - * - * @param callback The function to run. - * @returns A function that unsubscribes the callback. - */ - function effect(callback: (dispose: Dispose) => Dispose | void): Dispose; - - /** - * Runs the given function and schedules listeners to be notified only once - * after the function has completed. Useful for batching multiple changes. - * - * @param callback The function to run. - */ - function batched(callback: () => void): void; - - /** - * Returns the result of the function without subscribing to changes. - * - * @param callback The atom or selector to get the state of. - * @param args Arguments to pass to the function. - * @returns The current state. - */ - function untracked(callback: (...args: Args) => State, ...args: Args): State; - - /** - * Creates an instance of `factory` for each item in the atom's state, and - * cleans up the instance when the item is removed. Returns a cleanup function - * that unsubscribes all instances. - * - * @param callback The atom or selector to observe. - * @param factory The function that tracks the lifecycle of each item. - * @returns A function that unsubscribes all instances. - */ - function observe( - callback: () => readonly Item[], - factory: (item: Item, index: number) => Dispose | void, - ): Dispose; - - function observe( - callback: () => Map | ReadonlyMap, - factory: (item: Item, key: Key) => Dispose | void, - ): Dispose; - - function observe( - callback: () => { readonly [P in Key]: Item }, - factory: (item: Item, key: Key) => Dispose | void, - ): Dispose; - - /** - * Maps each entry in the atom's state to a new key-value pair. If the `mapper` - * function returns `undefined`, the entry is omitted from the resulting map. - * When the atom changes, the `mapper` only runs for the changed entries. - * - * @param callback The atom or selector to map. - * @param mapper The function that maps each entry. - * @returns A new atom with the mapped state. - */ - function mapped( - callback: () => readonly V0[], - mapper: (value: V0, index: number) => LuaTuple<[value: V1 | undefined, key: K1]>, - ): () => ReadonlyMap; - - function mapped( - callback: () => readonly V0[], - mapper: (value: V0, index: number) => V1, - ): () => readonly V1[]; - - function mapped( - callback: () => Map | ReadonlyMap, - mapper: (value: V0, key: K0) => LuaTuple<[value: V1 | undefined, key: K1]> | V1, - ): () => ReadonlyMap; - - function mapped( - callback: () => { readonly [P in K0]: V0 }, - mapper: (value: V0, key: K0) => LuaTuple<[value: V1 | undefined, key: K1]> | V1, - ): () => ReadonlyMap; -} diff --git a/packages/charm/src/lib.luau b/packages/charm/src/lib.luau index 7ab5101..96e1746 100644 --- a/packages/charm/src/lib.luau +++ b/packages/charm/src/lib.luau @@ -6,6 +6,7 @@ local effectScope = require("./effectScope") local listen = require("./listen") local mapped = require("./mapped") local observe = require("./observe") +local signals = require("./signals") local subscribe = require("./subscribe") local types = require("./types") local untracked = require("./untracked") @@ -25,4 +26,5 @@ return { observe = observe, subscribe = subscribe, untracked = untracked, + signals = signals, } diff --git a/packages/react/default.project.json b/packages/react-charm/default.project.json similarity index 100% rename from packages/react/default.project.json rename to packages/react-charm/default.project.json diff --git a/packages/react/src/init.luau b/packages/react-charm/src/init.luau similarity index 91% rename from packages/react/src/init.luau rename to packages/react-charm/src/init.luau index dda3c33..13159bf 100644 --- a/packages/react/src/init.luau +++ b/packages/react-charm/src/init.luau @@ -19,7 +19,7 @@ local useState = React.useState @param dependencies An array of values that the subscription depends on. @return The current state. ]=] -local function useAtom(callback: Charm.Selector, dependencies: { any }?): State +local function useAtom(callback: () -> State, dependencies: { any }?): State local state, setState = useState(callback) useEffect(function() diff --git a/packages/react/wally.toml b/packages/react-charm/wally.toml similarity index 85% rename from packages/react/wally.toml rename to packages/react-charm/wally.toml index 91073ad..6fd29e7 100644 --- a/packages/react/wally.toml +++ b/packages/react-charm/wally.toml @@ -5,5 +5,5 @@ registry = "https://github.com/UpliftGames/wally-index" realm = "shared" [dependencies] -charm = "littensy/charm@^0.10" +Charm = "littensy/charm@^0.10" React = "jsdotlua/react@^17" diff --git a/packages/react/package.json b/packages/react/package.json deleted file mode 100644 index df178aa..0000000 --- a/packages/react/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "@rbxts/react-charm", - "version": "0.3.0", - "description": "React bindings for Charm", - "repository": "littensy/charm", - "license": "MIT", - "main": "src/init.luau", - "types": "src/index.d.ts", - "scripts": { - "prepare": "cp ../../LICENSE.md . && cp ../../README.md .", - "publish:wally": "wally publish" - }, - "peerDependencies": { - "@rbxts/charm": "workspace:*", - "@rbxts/react": "*" - } -} diff --git a/packages/react/src/index.d.ts b/packages/react/src/index.d.ts deleted file mode 100644 index d35c092..0000000 --- a/packages/react/src/index.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * A hook that subscribes to changes in the given atom or selector. The - * component is re-rendered whenever the state changes. - * - * If the `dependencies` array is provided, the subscription to the atom or - * selector is re-created whenever the dependencies change. Otherwise, the - * subscription is created once when the component is mounted. - * - * @param callback The atom or selector to subscribe to. - * @param dependencies An array of values that the subscription depends on. - * @returns The current state. - */ -export function useAtom(callback: () => State, dependencies?: unknown[]): State; diff --git a/packages/vide/default.project.json b/packages/vide-charm/default.project.json similarity index 100% rename from packages/vide/default.project.json rename to packages/vide-charm/default.project.json diff --git a/packages/vide/src/init.luau b/packages/vide-charm/src/init.luau similarity index 100% rename from packages/vide/src/init.luau rename to packages/vide-charm/src/init.luau diff --git a/packages/vide/wally.toml b/packages/vide-charm/wally.toml similarity index 84% rename from packages/vide/wally.toml rename to packages/vide-charm/wally.toml index de0f253..ed47be6 100644 --- a/packages/vide/wally.toml +++ b/packages/vide-charm/wally.toml @@ -5,5 +5,5 @@ registry = "https://github.com/UpliftGames/wally-index" realm = "shared" [dependencies] -charm = "littensy/charm@^0.10" +Charm = "littensy/charm@^0.10" Vide = "centau/vide@^0.3" diff --git a/packages/vide/package.json b/packages/vide/package.json deleted file mode 100644 index adfcef4..0000000 --- a/packages/vide/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "@rbxts/vide-charm", - "version": "0.3.0", - "description": "Vide bindings for Charm", - "repository": "littensy/charm", - "license": "MIT", - "main": "src/init.luau", - "types": "src/index.d.ts", - "scripts": { - "prepare": "cp ../../LICENSE.md . && cp ../../README.md .", - "publish:wally": "wally publish" - }, - "peerDependencies": { - "@rbxts/charm": "workspace:*", - "@rbxts/vide": "*" - } -} diff --git a/packages/vide/src/index.d.ts b/packages/vide/src/index.d.ts deleted file mode 100644 index 2d51266..0000000 --- a/packages/vide/src/index.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Subscribes to the state of an atom and returns a Vide source. - * - * @param callback The atom or selector to subscribe to. - * @returns The reactive source. - */ -export function useAtom(callback: () => T): () => T; diff --git a/pesde.lock b/pesde.lock new file mode 100644 index 0000000..e27fd50 --- /dev/null +++ b/pesde.lock @@ -0,0 +1,195 @@ +# This file is automatically @generated by pesde. +# It is not intended for manual editing. +format = 2 +name = "littensy/charm" +version = "0.1.0" +target = "roblox" + +[graph."wally#centau/vide@0.3.1 roblox"] +direct = ["Vide", { wally = "wally#centau/vide", version = "^0.3.1", index = "default" }, "standard"] + +[graph."wally#centau/vide@0.3.1 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/boolean@1.2.7 roblox".dependencies] +number = ["wally#jsdotlua/number@1.2.7 roblox", "standard"] + +[graph."wally#jsdotlua/boolean@1.2.7 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/boolean@1.2.7 roblox".pkg_ref.dependencies] +number = [{ wally = "wally#jsdotlua/number", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] + +[graph."wally#jsdotlua/collections@1.2.7 roblox".dependencies] +es7-types = ["wally#jsdotlua/es7-types@1.2.7 roblox", "standard"] +instance-of = ["wally#jsdotlua/instance-of@1.2.7 roblox", "standard"] + +[graph."wally#jsdotlua/collections@1.2.7 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/collections@1.2.7 roblox".pkg_ref.dependencies] +es7-types = [{ wally = "wally#jsdotlua/es7-types", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +instance-of = [{ wally = "wally#jsdotlua/instance-of", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] + +[graph."wally#jsdotlua/console@1.2.7 roblox".dependencies] +collections = ["wally#jsdotlua/collections@1.2.7 roblox", "standard"] + +[graph."wally#jsdotlua/console@1.2.7 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/console@1.2.7 roblox".pkg_ref.dependencies] +collections = [{ wally = "wally#jsdotlua/collections", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] + +[graph."wally#jsdotlua/es7-types@1.2.7 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/instance-of@1.2.7 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/luau-polyfill@1.2.7 roblox".dependencies] +boolean = ["wally#jsdotlua/boolean@1.2.7 roblox", "standard"] +collections = ["wally#jsdotlua/collections@1.2.7 roblox", "standard"] +console = ["wally#jsdotlua/console@1.2.7 roblox", "standard"] +es7-types = ["wally#jsdotlua/es7-types@1.2.7 roblox", "standard"] +instance-of = ["wally#jsdotlua/instance-of@1.2.7 roblox", "standard"] +math = ["wally#jsdotlua/math@1.2.7 roblox", "standard"] +number = ["wally#jsdotlua/number@1.2.7 roblox", "standard"] +string = ["wally#jsdotlua/string@1.2.7 roblox", "standard"] +symbol-luau = ["wally#jsdotlua/symbol-luau@1.0.1 roblox", "standard"] +timers = ["wally#jsdotlua/timers@1.2.7 roblox", "standard"] + +[graph."wally#jsdotlua/luau-polyfill@1.2.7 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/luau-polyfill@1.2.7 roblox".pkg_ref.dependencies] +boolean = [{ wally = "wally#jsdotlua/boolean", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +collections = [{ wally = "wally#jsdotlua/collections", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +console = [{ wally = "wally#jsdotlua/console", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +es7-types = [{ wally = "wally#jsdotlua/es7-types", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +instance-of = [{ wally = "wally#jsdotlua/instance-of", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +math = [{ wally = "wally#jsdotlua/math", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +number = [{ wally = "wally#jsdotlua/number", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +string = [{ wally = "wally#jsdotlua/string", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +symbol-luau = [{ wally = "wally#jsdotlua/symbol-luau", version = ">=1.0.0, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +timers = [{ wally = "wally#jsdotlua/timers", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] + +[graph."wally#jsdotlua/math@1.2.7 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/number@1.2.7 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/promise@3.5.2 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/react@17.2.1 roblox"] +direct = ["React", { wally = "wally#jsdotlua/react", version = "^17.2.1", index = "default" }, "standard"] + +[graph."wally#jsdotlua/react@17.2.1 roblox".dependencies] +luau-polyfill = ["wally#jsdotlua/luau-polyfill@1.2.7 roblox", "standard"] +shared = ["wally#jsdotlua/shared@17.2.1 roblox", "standard"] + +[graph."wally#jsdotlua/react@17.2.1 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/react@17.2.1 roblox".pkg_ref.dependencies] +luau-polyfill = [{ wally = "wally#jsdotlua/luau-polyfill", version = ">=1.2.6, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +shared = [{ wally = "wally#jsdotlua/shared", version = ">=17.2.1, <18.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] + +[graph."wally#jsdotlua/react-reconciler@17.2.1 roblox".dependencies] +luau-polyfill = ["wally#jsdotlua/luau-polyfill@1.2.7 roblox", "standard"] +promise = ["wally#jsdotlua/promise@3.5.2 roblox", "standard"] +react = ["wally#jsdotlua/react@17.2.1 roblox", "standard"] +scheduler = ["wally#jsdotlua/scheduler@17.2.1 roblox", "standard"] +shared = ["wally#jsdotlua/shared@17.2.1 roblox", "standard"] + +[graph."wally#jsdotlua/react-reconciler@17.2.1 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/react-reconciler@17.2.1 roblox".pkg_ref.dependencies] +luau-polyfill = [{ wally = "wally#jsdotlua/luau-polyfill", version = ">=1.2.6, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +promise = [{ wally = "wally#jsdotlua/promise", version = ">=3.5.0, <4.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +react = [{ wally = "wally#jsdotlua/react", version = ">=17.2.1, <18.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +scheduler = [{ wally = "wally#jsdotlua/scheduler", version = ">=17.2.1, <18.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +shared = [{ wally = "wally#jsdotlua/shared", version = ">=17.2.1, <18.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] + +[graph."wally#jsdotlua/react-roblox@17.2.1 roblox"] +direct = ["ReactRoblox", { wally = "wally#jsdotlua/react-roblox", version = "^17.2.1", index = "default" }, "standard"] + +[graph."wally#jsdotlua/react-roblox@17.2.1 roblox".dependencies] +luau-polyfill = ["wally#jsdotlua/luau-polyfill@1.2.7 roblox", "standard"] +react = ["wally#jsdotlua/react@17.2.1 roblox", "standard"] +react-reconciler = ["wally#jsdotlua/react-reconciler@17.2.1 roblox", "standard"] +scheduler = ["wally#jsdotlua/scheduler@17.2.1 roblox", "standard"] +shared = ["wally#jsdotlua/shared@17.2.1 roblox", "standard"] + +[graph."wally#jsdotlua/react-roblox@17.2.1 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/react-roblox@17.2.1 roblox".pkg_ref.dependencies] +luau-polyfill = [{ wally = "wally#jsdotlua/luau-polyfill", version = ">=1.2.6, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +react = [{ wally = "wally#jsdotlua/react", version = ">=17.2.1, <18.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +react-reconciler = [{ wally = "wally#jsdotlua/react-reconciler", version = ">=17.2.1, <18.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +scheduler = [{ wally = "wally#jsdotlua/scheduler", version = ">=17.2.1, <18.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +shared = [{ wally = "wally#jsdotlua/shared", version = ">=17.2.1, <18.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] + +[graph."wally#jsdotlua/scheduler@17.2.1 roblox".dependencies] +luau-polyfill = ["wally#jsdotlua/luau-polyfill@1.2.7 roblox", "standard"] +shared = ["wally#jsdotlua/shared@17.2.1 roblox", "standard"] + +[graph."wally#jsdotlua/scheduler@17.2.1 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/scheduler@17.2.1 roblox".pkg_ref.dependencies] +luau-polyfill = [{ wally = "wally#jsdotlua/luau-polyfill", version = ">=1.2.6, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +shared = [{ wally = "wally#jsdotlua/shared", version = ">=17.2.1, <18.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] + +[graph."wally#jsdotlua/shared@17.2.1 roblox".dependencies] +luau-polyfill = ["wally#jsdotlua/luau-polyfill@1.2.7 roblox", "standard"] + +[graph."wally#jsdotlua/shared@17.2.1 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/shared@17.2.1 roblox".pkg_ref.dependencies] +luau-polyfill = [{ wally = "wally#jsdotlua/luau-polyfill", version = ">=1.2.6, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] + +[graph."wally#jsdotlua/string@1.2.7 roblox".dependencies] +es7-types = ["wally#jsdotlua/es7-types@1.2.7 roblox", "standard"] +number = ["wally#jsdotlua/number@1.2.7 roblox", "standard"] + +[graph."wally#jsdotlua/string@1.2.7 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/string@1.2.7 roblox".pkg_ref.dependencies] +es7-types = [{ wally = "wally#jsdotlua/es7-types", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] +number = [{ wally = "wally#jsdotlua/number", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] + +[graph."wally#jsdotlua/symbol-luau@1.0.1 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/timers@1.2.7 roblox".dependencies] +collections = ["wally#jsdotlua/collections@1.2.7 roblox", "standard"] + +[graph."wally#jsdotlua/timers@1.2.7 roblox".pkg_ref] +ref_ty = "wally" +index_url = "https://github.com/UpliftGames/wally-index" + +[graph."wally#jsdotlua/timers@1.2.7 roblox".pkg_ref.dependencies] +collections = [{ wally = "wally#jsdotlua/collections", version = ">=1.2.7, <2.0.0", index = "https://github.com/UpliftGames/wally-index" }, "standard"] diff --git a/pesde.toml b/pesde.toml new file mode 100644 index 0000000..22657f1 --- /dev/null +++ b/pesde.toml @@ -0,0 +1,17 @@ +name = "littensy/charm" +version = "0.1.0" +license = "MIT" + +[target] +environment = "roblox" + +[indices] +default = "https://github.com/pesde-pkg/index" + +[wally_indices] +default = "https://github.com/UpliftGames/wally-index" + +[dependencies] +React = { wally = "jsdotlua/react", version = "^17.2.1" } +ReactRoblox = { wally = "jsdotlua/react-roblox", version = "^17.2.1" } +Vide = { wally = "centau/vide", version = "^0.3.1" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 90e0e73..0000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,1656 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - devDependencies: - '@rbxts/compiler-types': - specifier: 3.0.0-types.0 - version: 3.0.0-types.0 - '@rbxts/types': - specifier: ^1.0.811 - version: 1.0.811 - '@typescript-eslint/eslint-plugin': - specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.5.4) - eslint: - specifier: ^8.57.1 - version: 8.57.1 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.1) - eslint-plugin-prettier: - specifier: ^5.2.1 - version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) - eslint-plugin-roblox-ts: - specifier: ^0.0.36 - version: 0.0.36(eslint@8.57.1) - prettier: - specifier: ^3.3.3 - version: 3.3.3 - roblox-ts: - specifier: ^3.0.0 - version: 3.0.0 - typescript: - specifier: ~5.5.4 - version: 5.5.4 - - packages/charm: {} - - packages/charm-sync: - dependencies: - '@rbxts/charm': - specifier: workspace:* - version: link:../charm - - packages/react: - dependencies: - '@rbxts/charm': - specifier: workspace:* - version: link:../charm - '@rbxts/react': - specifier: '*' - version: 17.2.3 - - packages/vide: - dependencies: - '@rbxts/charm': - specifier: workspace:* - version: link:../charm - '@rbxts/vide': - specifier: '*' - version: 0.5.3 - -packages: - - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.11.1': - resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@rbxts/compiler-types@3.0.0-types.0': - resolution: {integrity: sha512-VGOHJPoL7+56NTatMGqQj3K7xWuzEV+aP4QD5vZiHu+bcff3kiTmtoadaF6NkJrmwfFAvbsd4Dg764ZjWNceag==} - - '@rbxts/react-vendor@17.2.3': - resolution: {integrity: sha512-dWCiVelvTK6h920geaFH/OQ5zoWHyhyqyfH51hKx2/iVZ6OiiyNVJ5UqEIkJMG4HsJ8JnkTORizV3+MtQ41BtA==} - - '@rbxts/react@17.2.3': - resolution: {integrity: sha512-IoOB8e2W8MxT0MKWFf0Ls0vT61ImYL6ctHQgz5+oazma6z8bqFtJjgPxOuy6jmMSuyfBe7rYp/muou0kIjZT+Q==} - - '@rbxts/types@1.0.811': - resolution: {integrity: sha512-MPhs5lxzxvDqie34Y9FzJ1R+k+33jjrkj03agX2y2WzBKyGmO0rD/kPuUaKXQgEiACXuk36C5FxUTYgkKJPbvA==} - - '@rbxts/vide@0.5.3': - resolution: {integrity: sha512-evaZbBRZzaqU8ibddTMaomb30pmW5OhWTT7ba1PLSA/iGBCid0eOF6BX1o0ArKPyMFnNj6pMM2yMTQzL5b9cIA==} - - '@roblox-ts/luau-ast@2.0.0': - resolution: {integrity: sha512-cmMi093IdwBOLVxwuordhM8AmtbyTIyRpsTbB0D/JauidW4SXsQRQowSwWjHo4QP0DRJBXvOIlxtqEQi50uNzQ==} - - '@roblox-ts/path-translator@1.1.0': - resolution: {integrity: sha512-D0akTmnNYqBw+ZIek5JxocT3BjmbgGOuOy0x1nIIxHBPNLGCpzseToY8jyYs/0mlvnN2xnSP/k8Tv+jvGOQSwQ==} - - '@roblox-ts/rojo-resolver@1.1.0': - resolution: {integrity: sha512-QmvVryu1EeME+3QUoG5j/gHGJoJUaffCgZ92mhlG7cJSd1uyhgpY4CNWriZAwZJYkTlzd5Htkpn+18yDFbOFXA==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/node@20.16.11': - resolution: {integrity: sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==} - - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/experimental-utils@5.62.0': - resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-plugin-prettier@5.2.1: - resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - - eslint-plugin-roblox-ts@0.0.36: - resolution: {integrity: sha512-vlbgfHY1heWSyDunVX3gIOamCy28KqrJlDkmuDOyYVBo8uLqdvbFkbWkdGxn59Vky1m6pFcvZGU6TObfmwm5Pg==} - engines: {node: '>=0.10.0'} - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-uri@3.0.2: - resolution: {integrity: sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} - engines: {node: '>=14'} - hasBin: true - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - roblox-ts@3.0.0: - resolution: {integrity: sha512-hwAC2frIFlLJOtHd6F+5opMEhBgfAMK9z5l1mP+bykLBbMO5cn1q5lIwhhXbeh9Pq07rlhF8uGHlmeRLPd/3AA==} - hasBin: true - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} - engines: {node: ^14.18.0 || >=16.0.0} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} - engines: {node: '>=14.17'} - hasBin: true - - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.11.1': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.3.7 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.1': {} - - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - - '@pkgr/core@0.1.1': {} - - '@rbxts/compiler-types@3.0.0-types.0': {} - - '@rbxts/react-vendor@17.2.3': {} - - '@rbxts/react@17.2.3': - dependencies: - '@rbxts/react-vendor': 17.2.3 - - '@rbxts/types@1.0.811': {} - - '@rbxts/vide@0.5.3': {} - - '@roblox-ts/luau-ast@2.0.0': {} - - '@roblox-ts/path-translator@1.1.0': - dependencies: - ajv: 8.17.1 - fs-extra: 11.2.0 - - '@roblox-ts/rojo-resolver@1.1.0': - dependencies: - ajv: 8.17.1 - fs-extra: 11.2.0 - - '@types/json-schema@7.0.15': {} - - '@types/node@20.16.11': - dependencies: - undici-types: 6.19.8 - - '@types/semver@7.5.8': {} - - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.5.4) - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.7 - eslint: 8.57.1 - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - - '@typescript-eslint/scope-manager@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.4) - debug: 4.3.7 - eslint: 8.57.1 - ts-api-utils: 1.3.0(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@5.62.0': {} - - '@typescript-eslint/types@7.18.0': {} - - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4)': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.7 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.7 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) - eslint: 8.57.1 - eslint-scope: 5.1.1 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.2.0': {} - - acorn-jsx@5.3.2(acorn@8.12.1): - dependencies: - acorn: 8.12.1 - - acorn@8.12.1: {} - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.2 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - array-union@2.1.0: {} - - balanced-match@1.0.2: {} - - binary-extensions@2.3.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - callsites@3.1.0: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - concat-map@0.0.1: {} - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - debug@4.3.7: - dependencies: - ms: 2.1.3 - - deep-is@0.1.4: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - emoji-regex@8.0.0: {} - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eslint-config-prettier@9.1.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3): - dependencies: - eslint: 8.57.1 - prettier: 3.3.3 - prettier-linter-helpers: 1.0.0 - synckit: 0.9.2 - optionalDependencies: - eslint-config-prettier: 9.1.0(eslint@8.57.1) - - eslint-plugin-roblox-ts@0.0.36(eslint@8.57.1): - dependencies: - '@types/node': 20.16.11 - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.5.4) - typescript: 5.5.4 - transitivePeerDependencies: - - eslint - - supports-color - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.11.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.7 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@9.6.1: - dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 3.4.3 - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@4.3.0: {} - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - - fast-deep-equal@3.1.3: {} - - fast-diff@1.3.0: {} - - fast-glob@3.3.2: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-uri@3.0.2: {} - - fastq@1.17.1: - dependencies: - reusify: 1.0.4 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@3.2.0: - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - - flatted@3.3.1: {} - - fs-extra@11.2.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - get-caller-file@2.0.5: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - graceful-fs@4.2.11: {} - - graphemer@1.4.0: {} - - has-flag@4.0.0: {} - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - ignore@5.3.2: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-core-module@2.15.1: - dependencies: - hasown: 2.0.2 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-path-inside@3.0.3: {} - - isexe@2.0.0: {} - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-buffer@3.0.1: {} - - json-schema-traverse@0.4.1: {} - - json-schema-traverse@1.0.0: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - kleur@4.1.5: {} - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.merge@4.6.2: {} - - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 - - ms@2.1.3: {} - - natural-compare@1.4.0: {} - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-type@4.0.0: {} - - picomatch@2.3.1: {} - - prelude-ls@1.2.1: {} - - prettier-linter-helpers@1.0.0: - dependencies: - fast-diff: 1.3.0 - - prettier@3.3.3: {} - - punycode@2.3.1: {} - - queue-microtask@1.2.3: {} - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - require-directory@2.1.1: {} - - require-from-string@2.0.2: {} - - resolve-from@4.0.0: {} - - resolve@1.22.8: - dependencies: - is-core-module: 2.15.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - reusify@1.0.4: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - roblox-ts@3.0.0: - dependencies: - '@roblox-ts/luau-ast': 2.0.0 - '@roblox-ts/path-translator': 1.1.0 - '@roblox-ts/rojo-resolver': 1.1.0 - chokidar: 3.6.0 - fs-extra: 11.2.0 - kleur: 4.1.5 - resolve: 1.22.8 - typescript: 5.5.3 - yargs: 17.7.2 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - semver@7.6.3: {} - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - slash@3.0.0: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-json-comments@3.1.1: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - synckit@0.9.2: - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.7.0 - - text-table@0.2.0: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - ts-api-utils@1.3.0(typescript@5.5.4): - dependencies: - typescript: 5.5.4 - - tslib@1.14.1: {} - - tslib@2.7.0: {} - - tsutils@3.21.0(typescript@5.5.4): - dependencies: - tslib: 1.14.1 - typescript: 5.5.4 - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-fest@0.20.2: {} - - typescript@5.5.3: {} - - typescript@5.5.4: {} - - undici-types@6.19.8: {} - - universalify@2.0.1: {} - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - word-wrap@1.2.5: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - y18n@5.0.8: {} - - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index 924b55f..0000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,2 +0,0 @@ -packages: - - packages/* diff --git a/rokit.toml b/rokit.toml index f6f9bb3..4be8a9f 100644 --- a/rokit.toml +++ b/rokit.toml @@ -6,8 +6,8 @@ [tools] wally = "UpliftGames/wally@0.3.2" rojo = "rojo-rbx/rojo@7.5.1" -wally-package-types = "JohnnyMorganz/wally-package-types@1.4.2" stylua = "johnnymorganz/stylua@2.1.0" selene = "Kampfkarren/selene@0.28.0" luau-lsp = "johnnymorganz/luau-lsp@1.44.1" lute = "luau-lang/lute@0.1.0-nightly.20250503" +pesde = "daimond113/pesde@0.7.0-rc.1+registry.0.2.3-rc.1" diff --git a/tests/benchmarks/effect.bench.luau b/tests/benchmarks/effect.bench.luau index fcbc85e..10d0643 100644 --- a/tests/benchmarks/effect.bench.luau +++ b/tests/benchmarks/effect.bench.luau @@ -1,6 +1,6 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") -local Charm = require(ReplicatedStorage.DevPackages.Charm) +local Charm = require(ReplicatedStorage.Packages.Charm) local computed = Charm.computed local effect = Charm.effect diff --git a/tests/benchmarks/patch.bench.luau b/tests/benchmarks/patch.bench.luau index 6ea53f6..e353acd 100644 --- a/tests/benchmarks/patch.bench.luau +++ b/tests/benchmarks/patch.bench.luau @@ -1,6 +1,8 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") -local patch = require(ReplicatedStorage.DevPackages.CharmSync.patch) +local CharmSync = require(ReplicatedStorage.Packages.CharmSync) + +local patch = CharmSync.patch local USERS = 1000 diff --git a/tests/benchmarks/propagate.bench.luau b/tests/benchmarks/propagate.bench.luau index 7f66876..b81dec7 100644 --- a/tests/benchmarks/propagate.bench.luau +++ b/tests/benchmarks/propagate.bench.luau @@ -1,7 +1,8 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") -local Charm = require(ReplicatedStorage.DevPackages.Charm) -local signals = require(ReplicatedStorage.DevPackages.Charm.signals) +local Charm = require(ReplicatedStorage.Packages.Charm) + +local signals = Charm.signals local function propagate( signal: (T) -> (T?) -> T, diff --git a/tests/benchmarks/propagate.luau b/tests/benchmarks/propagate.luau index d05bc12..ee56eeb 100644 --- a/tests/benchmarks/propagate.luau +++ b/tests/benchmarks/propagate.luau @@ -1,14 +1,12 @@ -local Charm = require("../../packages/charm/src/lib") +local Charm = require("../charm") local atom = Charm.atom local computed = Charm.computed local effect = Charm.effect -local signals = require("../../packages/charm/src/signals") - -local signal = signals.signal -local computedSignal = signals.computed -local effectSignal = signals.effect +local signal = Charm.signals.signal +local computedSignal = Charm.signals.computed +local effectSignal = Charm.signals.effect local w = 10 local h = 10 diff --git a/tests/sync/client.spec.luau b/tests/charm-sync/client.spec.luau similarity index 94% rename from tests/sync/client.spec.luau rename to tests/charm-sync/client.spec.luau index a4c9352..62dd4f6 100644 --- a/tests/sync/client.spec.luau +++ b/tests/charm-sync/client.spec.luau @@ -1,8 +1,8 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") local ServerScriptService = game:GetService("ServerScriptService") -local Charm = require(ReplicatedStorage.DevPackages.Charm) -local CharmSync = require(ReplicatedStorage.DevPackages.CharmSync) +local Charm = require(ReplicatedStorage.Packages.Charm) +local CharmSync = require(ReplicatedStorage.Packages.CharmSync) local suite = require(ServerScriptService.Tests.suite) local atom = Charm.atom diff --git a/tests/sync/flatten.spec.luau b/tests/charm-sync/flatten.spec.luau similarity index 82% rename from tests/sync/flatten.spec.luau rename to tests/charm-sync/flatten.spec.luau index 94533db..727e035 100644 --- a/tests/sync/flatten.spec.luau +++ b/tests/charm-sync/flatten.spec.luau @@ -1,8 +1,8 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") local ServerScriptService = game:GetService("ServerScriptService") -local Charm = require(ReplicatedStorage.DevPackages.Charm) -local CharmSync = require(ReplicatedStorage.DevPackages.CharmSync) +local Charm = require(ReplicatedStorage.Packages.Charm) +local CharmSync = require(ReplicatedStorage.Packages.CharmSync) local suite = require(ServerScriptService.Tests.suite) local atom = Charm.atom diff --git a/tests/sync/patch.spec.luau b/tests/charm-sync/patch.spec.luau similarity index 94% rename from tests/sync/patch.spec.luau rename to tests/charm-sync/patch.spec.luau index 56205c2..9622b7b 100644 --- a/tests/sync/patch.spec.luau +++ b/tests/charm-sync/patch.spec.luau @@ -1,10 +1,10 @@ local HttpService = game:GetService("HttpService") local ReplicatedStorage = game:GetService("ReplicatedStorage") -local ServerScriptService = game:GetService("ServerScriptService") -local patch = require(ReplicatedStorage.DevPackages.CharmSync.patch) -local suite = require(ServerScriptService.Tests.suite) +local CharmSync = require(ReplicatedStorage.Packages.CharmSync) +local suite = require("../suite") +local patch = CharmSync.patch local test = suite.test local function serdes(value: { [any]: any }) @@ -124,7 +124,6 @@ test("optionally validates state", function() end) assert(success) - assert(success) end) return {} diff --git a/tests/sync/server.spec.luau b/tests/charm-sync/server.spec.luau similarity index 91% rename from tests/sync/server.spec.luau rename to tests/charm-sync/server.spec.luau index 6a7aefa..a6457c9 100644 --- a/tests/sync/server.spec.luau +++ b/tests/charm-sync/server.spec.luau @@ -1,15 +1,15 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") local ServerScriptService = game:GetService("ServerScriptService") -local Charm = require(ReplicatedStorage.DevPackages.Charm) -local CharmSync = require(ReplicatedStorage.DevPackages.CharmSync) -local patch = require(ReplicatedStorage.DevPackages.CharmSync.patch) +local Charm = require(ReplicatedStorage.Packages.Charm) +local CharmSync = require(ReplicatedStorage.Packages.CharmSync) local suite = require(ServerScriptService.Tests.suite) type SyncPayload = CharmSync.SyncPayload local atom = Charm.atom local server = CharmSync.server +local patch = CharmSync.patch local test = suite.test local target: Player = {} :: any @@ -98,3 +98,5 @@ test("preserves history", function() disconnect() end) + +return {} diff --git a/tests/sync/spec.luau b/tests/charm-sync/spec.luau similarity index 100% rename from tests/sync/spec.luau rename to tests/charm-sync/spec.luau diff --git a/tests/sync/validate.spec.luau b/tests/charm-sync/validate.spec.luau similarity index 87% rename from tests/sync/validate.spec.luau rename to tests/charm-sync/validate.spec.luau index 067dc30..87b048a 100644 --- a/tests/sync/validate.spec.luau +++ b/tests/charm-sync/validate.spec.luau @@ -1,11 +1,12 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") local ServerScriptService = game:GetService("ServerScriptService") -local Charm = require(ReplicatedStorage.DevPackages.Charm) +local Charm = require(ReplicatedStorage.Packages.Charm) +local CharmSync = require(ReplicatedStorage.Packages.CharmSync) local suite = require(ServerScriptService.Tests.suite) -local validate = require(ReplicatedStorage.DevPackages.CharmSync.validate) local atom = Charm.atom +local validate = CharmSync.validate local test = suite.test test("validates inputs", function() @@ -33,3 +34,5 @@ test("validates inputs", function() end end end) + +return {} diff --git a/tests/charm.luau b/tests/charm.luau new file mode 100644 index 0000000..aedbca8 --- /dev/null +++ b/tests/charm.luau @@ -0,0 +1,3 @@ +return if game + then require(game:GetService("ReplicatedStorage").Packages.Charm) + else require("../packages/charm/src/lib") diff --git a/tests/react/spec.luau b/tests/react-charm/spec.luau similarity index 100% rename from tests/react/spec.luau rename to tests/react-charm/spec.luau diff --git a/tests/react/useAtom.spec.luau b/tests/react-charm/useAtom.spec.luau similarity index 83% rename from tests/react/useAtom.spec.luau rename to tests/react-charm/useAtom.spec.luau index 4e725e5..4e01cd0 100644 --- a/tests/react/useAtom.spec.luau +++ b/tests/react-charm/useAtom.spec.luau @@ -1,9 +1,9 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") local ServerScriptService = game:GetService("ServerScriptService") -local Charm = require(ReplicatedStorage.DevPackages.Charm) -local ReactCharm = require(ReplicatedStorage.DevPackages.ReactCharm) -local renderHook = require(script.Parent.Parent.utils.renderHook) +local Charm = require(ReplicatedStorage.Packages.Charm) +local ReactCharm = require(ReplicatedStorage.Packages.ReactCharm) +local renderHook = require(ServerScriptService.Tests.utils.renderHook) local suite = require(ServerScriptService.Tests.suite) local atom = Charm.atom @@ -46,3 +46,5 @@ test("tracks dependencies", function() state(1) assert(hook.result == 1) end) + +return {} diff --git a/tests/signals/computed.spec.luau b/tests/signals/computed.spec.luau index 9cff908..a1e435b 100644 --- a/tests/signals/computed.spec.luau +++ b/tests/signals/computed.spec.luau @@ -1,5 +1,5 @@ local test = require("../suite").test -local signals = require("../../packages/charm/src/signals") +local signals = require("../charm").signals local computed = signals.computed local signal = signals.signal diff --git a/tests/signals/effect.spec.luau b/tests/signals/effect.spec.luau index dd8d9df..87aeda5 100644 --- a/tests/signals/effect.spec.luau +++ b/tests/signals/effect.spec.luau @@ -1,5 +1,5 @@ local test = require("../suite").test -local signals = require("../../packages/charm/src/signals") +local signals = require("../charm").signals local computed = signals.computed local effect = signals.effect diff --git a/tests/signals/effectScope.spec.luau b/tests/signals/effectScope.spec.luau index d958993..83dc2cd 100644 --- a/tests/signals/effectScope.spec.luau +++ b/tests/signals/effectScope.spec.luau @@ -1,5 +1,5 @@ local test = require("../suite").test -local signals = require("../../packages/charm/src/signals") +local signals = require("../charm").signals local effect = signals.effect local effectScope = signals.effectScope diff --git a/tests/signals/issue_48.spec.luau b/tests/signals/issue_48.spec.luau index 8899f97..3ecf720 100644 --- a/tests/signals/issue_48.spec.luau +++ b/tests/signals/issue_48.spec.luau @@ -1,5 +1,5 @@ local test = require("../suite").test -local signals = require("../../packages/charm/src/signals") +local signals = require("../charm").signals local computed = signals.computed local effect = signals.effect diff --git a/tests/signals/topology.spec.luau b/tests/signals/topology.spec.luau index d61f92b..227ff47 100644 --- a/tests/signals/topology.spec.luau +++ b/tests/signals/topology.spec.luau @@ -1,4 +1,4 @@ -local signals = require("../../packages/charm/src/signals") +local signals = require("../charm").signals local suite = require("../suite") local test = suite.test diff --git a/tests/signals/untrack.spec.luau b/tests/signals/untrack.spec.luau index c35c1f1..8ff46ba 100644 --- a/tests/signals/untrack.spec.luau +++ b/tests/signals/untrack.spec.luau @@ -1,5 +1,5 @@ local test = require("../suite").test -local signals = require("../../packages/charm/src/signals") +local signals = require("../charm").signals local computed = signals.computed local pauseTracking = signals.pauseTracking diff --git a/tests/spec.server.luau b/tests/spec.server.luau index 109d845..efb9162 100644 --- a/tests/spec.server.luau +++ b/tests/spec.server.luau @@ -12,9 +12,10 @@ end test("signals") if game then - test("sync") - test("react") - test("vide") + _G.__DEV__ = true + test("charm-sync") + test("react-charm") + test("vide-charm") end finish() diff --git a/tests/suite.luau b/tests/suite.luau index 71429c4..9ac76f3 100644 --- a/tests/suite.luau +++ b/tests/suite.luau @@ -44,13 +44,13 @@ local function describe(name: string, callback: () -> ()) end local function finish() - print(`\nšŸ”µ {tests - #errors} / {tests} tests passed\n`) + local output = { `\nšŸ”µ {tests - #errors} / {tests} tests passed\n` } for _, result in results do - print(result) + table.insert(output, result) end - print() + print(table.concat(output, "\n") .. "\n") if #errors > 0 then error(`{#errors} test(s) failed:\n{table.concat(errors, "\n")}\n`) diff --git a/tests/utils/renderHook.luau b/tests/utils/renderHook.luau index 0d2d19f..b4f7ac0 100644 --- a/tests/utils/renderHook.luau +++ b/tests/utils/renderHook.luau @@ -2,8 +2,8 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") _G.__ROACT_17_MOCK_SCHEDULER__ = true -local React = require(ReplicatedStorage.DevPackages.React) -local ReactRoblox = require(ReplicatedStorage.DevPackages.ReactRoblox) +local React = require(ReplicatedStorage.Packages.React) +local ReactRoblox = require(ReplicatedStorage.Packages.ReactRoblox) type RenderedHook = { result: Result, diff --git a/tests/vide/spec.luau b/tests/vide-charm/spec.luau similarity index 100% rename from tests/vide/spec.luau rename to tests/vide-charm/spec.luau diff --git a/tests/vide/useAtom.spec.luau b/tests/vide-charm/useAtom.spec.luau similarity index 80% rename from tests/vide/useAtom.spec.luau rename to tests/vide-charm/useAtom.spec.luau index 9572f33..7231b85 100644 --- a/tests/vide/useAtom.spec.luau +++ b/tests/vide-charm/useAtom.spec.luau @@ -1,9 +1,9 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") local ServerScriptService = game:GetService("ServerScriptService") -local Charm = require(ReplicatedStorage.DevPackages.Charm) -local Vide = require(ReplicatedStorage.DevPackages.Vide) -local VideCharm = require(ReplicatedStorage.DevPackages.VideCharm) +local Charm = require(ReplicatedStorage.Packages.Charm) +local Vide = require(ReplicatedStorage.Packages.Vide) +local VideCharm = require(ReplicatedStorage.Packages.VideCharm) local suite = require(ServerScriptService.Tests.suite) local atom = Charm.atom diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index b255ab8..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - // required - "allowSyntheticDefaultImports": true, - "downlevelIteration": true, - "jsx": "react", - "jsxFactory": "React.createElement", - "jsxFragmentFactory": "React.Fragment", - "module": "commonjs", - "moduleResolution": "Node", - "noLib": true, - "resolveJsonModule": true, - "experimentalDecorators": true, - "forceConsistentCasingInFileNames": true, - "moduleDetection": "force", - "strict": true, - "target": "ESNext", - "typeRoots": ["node_modules/@rbxts"], - - // configurable - "rootDir": "src", - "outDir": "out", - "incremental": true, - "tsBuildInfoFile": "out/tsconfig.tsbuildinfo", - "declaration": true - } -}