Compare commits

...

12 Commits

Author SHA1 Message Date
7bf8b60716 📝 Add Developement Setup steps.
Some checks failed
CI / Lint (push) Failing after 1m34s
2025-12-13 17:29:36 +01:00
8a77b150a8 Fix discord badge.
Some checks failed
CI / Lint (push) Failing after 20s
2025-12-11 08:36:09 +00:00
5068bc162d 😴 Rename README to README.md
Some checks failed
CI / Lint (push) Failing after 20s
2025-12-10 23:13:46 +00:00
ee7ec290ba 🪄 Add readme
Some checks failed
CI / Lint (push) Failing after 21s
2025-12-10 23:12:45 +00:00
5f005609b8 🪛 fix prettier ignore.
Some checks failed
CI / Lint (push) Failing after 26s
2025-12-10 21:38:19 +00:00
a4a3fc0382 😭 fix lint.yml
Some checks failed
CI / Lint (push) Failing after 40s
2025-12-10 21:49:06 +01:00
909c9d99d5 🪛 Fix lint CI.
Some checks failed
CI / Lint (push) Failing after 15s
2025-12-10 21:42:20 +01:00
4c2b3141d7 🔨 Prepare Auto dev experience.
Some checks failed
CI / Lint (push) Failing after 5m24s
2025-12-10 21:25:56 +01:00
78423da39e 📝 Apply prettier and eslint on files. 2025-12-10 21:21:42 +01:00
1562e5394d Config prettier and eslint 2025-12-10 21:19:37 +01:00
cfa902a343 📊 Add scoreboard and played time. 2025-12-10 16:48:53 +01:00
549c504712 📦Remove t new-new + update depencies. 2025-12-10 16:47:06 +01:00
32 changed files with 557 additions and 452 deletions

View File

@@ -1,15 +1,15 @@
{
"generator": "dense",
"rules": [
"remove_comments",
"remove_spaces",
"compute_expression",
"convert_luau_number",
"group_local_assignment",
"remove_empty_do",
"remove_function_call_parens",
"remove_nil_declaration",
"remove_unused_if_branch",
"remove_unused_variable"
]
}
"generator": "dense",
"rules": [
"remove_comments",
"remove_spaces",
"compute_expression",
"convert_luau_number",
"group_local_assignment",
"remove_empty_do",
"remove_function_call_parens",
"remove_nil_declaration",
"remove_unused_if_branch",
"remove_unused_variable"
]
}

22
.gitea/workflows/lint.yml Normal file
View File

@@ -0,0 +1,22 @@
name: CI
on: [push]
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v5
- uses: pnpm/action-setup@v4
with:
version: 10
cache: true
- name: Install node
uses: actions/setup-node@v6
with:
node-version: latest
cache: "pnpm"
- run: pnpm install
- run: pnpm prettier . --check
- run: pnpm eslint .

2
.prettierignore Normal file
View File

@@ -0,0 +1,2 @@
pnpm-lock.yaml
.pnpm-store/

View File

@@ -3,4 +3,4 @@
"tabWidth": 4,
"trailingComma": "all",
"useTabs": true
}
}

View File

@@ -1,6 +1,3 @@
{
"recommendations": [
"roblox-ts.vscode-roblox-ts",
"dbaeumer.vscode-eslint"
]
}
"recommendations": ["roblox-ts.vscode-roblox-ts", "dbaeumer.vscode-eslint"]
}

View File

@@ -17,4 +17,4 @@
"files.associations": {
"*.luau": "lua"
}
}
}

21
README.md Normal file
View File

@@ -0,0 +1,21 @@
# 🥀 Aconit
Aconit is an asymmetric horror game that is available on Roblox. The project is open source, so you can contribute to help develop it.
[![Gitea Last Commit](https://img.shields.io/gitea/last-commit/revocation/aconit?gitea_url=https%3A%2F%2Fazur84.servehttp.com)]() [![Discord](https://img.shields.io/discord/1352754862831439974?logo=discord)](https://discord.gg/QpAUUTJm3h) [![Favorites](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgames.roblox.com%2Fv1%2Fgames%2F8513843510%2Ffavorites%2Fcount&query=%24.favoritesCount&label=%E2%AD%90%20Roblox%20Favorites&color=yellow)](roblox.com/games/76850012177914/Aconit) [![roblox-ts](https://img.shields.io/badge/dynamic/yaml?url=https%3A%2F%2Fazur84.servehttp.com%2FRevocation%2FAconit%2Fraw%2Fbranch%2Fmaster%2Fpnpm-lock.yaml&query=%24.importers%5B%22.%22%5D.devDependencies.roblox-ts.version&logo=roblox&label=roblox-ts&labelColor=ff0000&color=grey)](https://roblox-ts.com) [![flamework](https://img.shields.io/badge/dynamic/yaml?url=https%3A%2F%2Fazur84.servehttp.com%2FRevocation%2FAconit%2Fraw%2Fbranch%2Fmaster%2Fpnpm-lock.yaml&query=%24.importers%5B%22.%22%5D.dependencies%5B%22%40flamework%2Fcore%22%5D.version&label=flamework&labelColor=FF7139&color=grey)](https://flamework.fireboltofdeath.dev/)
## 🪛 Developement Setup
I am describing this for people who have never used Node.js before. If you are already familiar with it, you may find it repetitive.
This project is based on roblox-ts and flamework.
### 🪢 Node.js and pnpm
First of all you need to install [node.js](https://pnpm.io/) and [pnpm](https://pnpm.io/).
Node.js is used for building the project, and pnpm is the package manager.
### 📦 Depencies installation
For install all depencies simply run ``pnpm install``.
### 📝 Developement help
Don't hesitate to check [roblox-ts](https://roblox-ts.com) and [flamework](https://flamework.fireboltofdeath.dev/) docs or send a message on our [discord server](https://discord.gg/QpAUUTJm3h).
### 🔨 Builds
Builds are automatic with gitea actions.

59
build.project.json Normal file
View File

@@ -0,0 +1,59 @@
{
"name": "roblox-ts-game",
"globIgnorePaths": ["**/package.json", "**/tsconfig.json"],
"tree": {
"$className": "DataModel",
"ServerScriptService": {
"$className": "ServerScriptService",
"TS": {
"$path": "out/server"
}
},
"ReplicatedStorage": {
"$className": "ReplicatedStorage",
"rbxts_include": {
"$path": "include",
"node_modules": {
"$className": "Folder",
"@rbxts": {
"$path": "node_modules/@rbxts"
},
"@flamework": {
"$path": "node_modules/@flamework"
}
}
},
"TS": {
"$path": "out/shared"
}
},
"StarterPlayer": {
"$className": "StarterPlayer",
"StarterPlayerScripts": {
"$className": "StarterPlayerScripts",
"TS": {
"$path": "out/client"
}
}
},
"Workspace": {
"$className": "Workspace",
"$properties": {
"FilteringEnabled": true
}
},
"HttpService": {
"$className": "HttpService",
"$properties": {
"HttpEnabled": true
}
},
"SoundService": {
"$className": "SoundService",
"$properties": {
"RespectFilteringEnabled": true
}
},
"$path": "map.rbxlx"
}
}

View File

@@ -1,9 +1,6 @@
{
"name": "roblox-ts-game",
"globIgnorePaths": [
"**/package.json",
"**/tsconfig.json"
],
"globIgnorePaths": ["**/package.json", "**/tsconfig.json"],
"tree": {
"$className": "DataModel",
"ServerScriptService": {
@@ -58,4 +55,4 @@
}
}
}
}
}

View File

@@ -1,54 +1,25 @@
import { defineConfig, globalIgnores } from "eslint/config";
import typescriptEslint from "@typescript-eslint/eslint-plugin";
// import robloxTs from "eslint-plugin-roblox-ts";
import prettier from "eslint-plugin-prettier";
import tsParser from "@typescript-eslint/parser";
import path from "node:path";
import { fileURLToPath } from "node:url";
// @ts-check
import js from "@eslint/js";
import { FlatCompat } from "@eslint/eslintrc";
import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended";
import roblox from "eslint-plugin-roblox-ts";
import { defineConfig } from "eslint/config";
import ts from "typescript-eslint";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all,
});
export default defineConfig([
globalIgnores(["out"]),
export default defineConfig(
js.configs.recommended,
ts.configs.recommended,
roblox.configs.recommended,
eslintPluginPrettierRecommended,
{
extends: compat.extends(
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"plugin:roblox-ts/recommended-legacy",
"plugin:prettier/recommended",
),
plugins: {
"@typescript-eslint": typescriptEslint,
// "roblox-ts": robloxTs,
prettier,
},
languageOptions: {
parser: tsParser,
ecmaVersion: 2018,
sourceType: "module",
parserOptions: {
jsx: true,
useJSXTextNode: true,
project: "./tsconfig.json",
},
},
rules: {
"prettier/prettier": "warn",
"@typescript-eslint/no-unused-vars": ["error", {
"varsIgnorePattern": "^[A-Z].*(Service|Controller|Component)$"
}]
"@typescript-eslint/no-unused-vars": [
"error",
{
varsIgnorePattern: "^[A-Z].*(Service|Controller|Component)$",
},
],
"@typescript-eslint/no-empty-object-type": "off",
},
},
]);
);

BIN
map.rbxl Normal file

Binary file not shown.

View File

@@ -1,47 +1,45 @@
{
"name": "aconit",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build": "rbxtsc",
"watch": "rbxtsc -w",
"lint": "eslint",
"production": "darklua minify out out"
},
"keywords": [],
"author": "Aconit team",
"license": "ISC",
"type": "commonjs",
"devDependencies": {
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "^9.37.0",
"@rbxts/compiler-types": "^3.0.0-types.0",
"@rbxts/services": "^1.5.5",
"@rbxts/signal": "^1.1.1",
"@rbxts/t": "^3.2.1",
"@rbxts/types": "^1.0.882",
"@typescript-eslint/eslint-plugin": "^8.44.0",
"@typescript-eslint/parser": "^8.44.0",
"eslint": "^9.36.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-roblox-ts": "^1.2.1",
"prettier": "^3.6.2",
"rbxts-transformer-flamework": "^1.3.2",
"rbxts-transformer-instances": "^1.0.1",
"rbxts-transformer-services": "^1.1.1",
"rbxts-transformer-t-new-new": "^0.2.0",
"roblox-ts": "^3.0.0",
"typescript": "~5.5.3"
},
"dependencies": {
"@flamework/components": "^1.3.2",
"@flamework/core": "^1.3.2",
"@flamework/networking": "^1.3.2",
"@rbxts/object-utils": "^1.0.4",
"@rbxts/pretty-react-hooks": "^0.6.4",
"@rbxts/react": "^17.2.3",
"@rbxts/react-roblox": "^17.2.3"
}
}
"name": "aconit",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build": "rbxtsc",
"watch": "rbxtsc -w",
"lint": "eslint",
"prettier": "prettier",
"production": "darklua minify out out"
},
"keywords": [],
"author": "Aconit team",
"license": "ISC",
"type": "commonjs",
"devDependencies": {
"@eslint/js": "^9.39.1",
"@rbxts/compiler-types": "3.0.0-types.0",
"@rbxts/services": "^1.6.0",
"@rbxts/signal": "^1.1.1",
"@rbxts/t": "^3.2.1",
"@rbxts/types": "^1.0.896",
"eslint": "^9.39.1",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-roblox-ts": "^1.3.0",
"prettier": "^3.7.4",
"rbxts-transformer-flamework": "^1.3.2",
"rbxts-transformer-instances": "^1.0.1",
"rbxts-transformer-services": "^1.1.1",
"roblox-ts": "^3.0.0",
"typescript": "~5.5.4",
"typescript-eslint": "^8.49.0"
},
"dependencies": {
"@flamework/components": "^1.3.2",
"@flamework/core": "^1.3.2",
"@flamework/networking": "^1.3.2",
"@rbxts/object-utils": "^1.0.4",
"@rbxts/pretty-react-hooks": "^0.6.4",
"@rbxts/react": "^17.2.3",
"@rbxts/react-roblox": "^17.2.3"
}
}

501
pnpm-lock.yaml generated
View File

@@ -30,17 +30,14 @@ importers:
specifier: ^17.2.3
version: 17.2.3
devDependencies:
'@eslint/eslintrc':
specifier: ^3.3.1
version: 3.3.1
'@eslint/js':
specifier: ^9.37.0
version: 9.38.0
specifier: ^9.39.1
version: 9.39.1
'@rbxts/compiler-types':
specifier: ^3.0.0-types.0
specifier: 3.0.0-types.0
version: 3.0.0-types.0
'@rbxts/services':
specifier: ^1.5.5
specifier: ^1.6.0
version: 1.6.0
'@rbxts/signal':
specifier: ^1.1.1
@@ -49,29 +46,23 @@ importers:
specifier: ^3.2.1
version: 3.2.1
'@rbxts/types':
specifier: ^1.0.882
version: 1.0.887
'@typescript-eslint/eslint-plugin':
specifier: ^8.44.0
version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.5.4))(eslint@9.38.0)(typescript@5.5.4)
'@typescript-eslint/parser':
specifier: ^8.44.0
version: 8.46.2(eslint@9.38.0)(typescript@5.5.4)
specifier: ^1.0.896
version: 1.0.896
eslint:
specifier: ^9.36.0
version: 9.38.0
specifier: ^9.39.1
version: 9.39.1
eslint-config-prettier:
specifier: ^10.1.8
version: 10.1.8(eslint@9.38.0)
version: 10.1.8(eslint@9.39.1)
eslint-plugin-prettier:
specifier: ^5.5.4
version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint@9.38.0)(prettier@3.6.2)
version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(prettier@3.7.4)
eslint-plugin-roblox-ts:
specifier: ^1.2.1
version: 1.2.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.5.4))(eslint@9.38.0)(typescript@5.5.4)
specifier: ^1.3.0
version: 1.3.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.5.4))(eslint@9.39.1)(typescript@5.5.4)
prettier:
specifier: ^3.6.2
version: 3.6.2
specifier: ^3.7.4
version: 3.7.4
rbxts-transformer-flamework:
specifier: ^1.3.2
version: 1.3.2(typescript@5.5.4)
@@ -81,15 +72,15 @@ importers:
rbxts-transformer-services:
specifier: ^1.1.1
version: 1.1.1(typescript@5.5.4)
rbxts-transformer-t-new-new:
specifier: ^0.2.0
version: 0.2.0
roblox-ts:
specifier: ^3.0.0
version: 3.0.0
typescript:
specifier: ~5.5.3
specifier: ~5.5.4
version: 5.5.4
typescript-eslint:
specifier: ^8.49.0
version: 8.49.0(eslint@9.39.1)(typescript@5.5.4)
packages:
@@ -107,28 +98,28 @@ packages:
resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/config-helpers@0.4.1':
resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==}
'@eslint/config-helpers@0.4.2':
resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/core@0.16.0':
resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==}
'@eslint/core@0.17.0':
resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/eslintrc@3.3.1':
resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
'@eslint/eslintrc@3.3.3':
resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/js@9.38.0':
resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==}
'@eslint/js@9.39.1':
resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.7':
resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/plugin-kit@0.4.0':
resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==}
'@eslint/plugin-kit@0.4.1':
resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@flamework/components@1.3.2':
@@ -218,12 +209,15 @@ packages:
'@rbxts/t@3.2.1':
resolution: {integrity: sha512-/fnf2QSx+TI3HSJ6QW2ikvGQk0mlx/63UXo60pLAKGqbxXiAuTJh88bpKpHw6aCzfFLJAwrVIcgCUOokLMPcag==}
'@rbxts/types@1.0.887':
resolution: {integrity: sha512-vhp4vIKEfl1TaBcKxBxU5dTFsVNqLkvefoF9pw/Epb+Jk9T+0g4SFQQtBdCu3UdZcBGK/PWk/IJeEyoRNDMkSw==}
'@rbxts/types@1.0.896':
resolution: {integrity: sha512-zuw1lpvW8hfnHxUmkoEjJ/NDrfpDjqzKWV1iU18DRoM0VsMleLfUv/t7giN70ST/KnGS6S6ubH8la+JTEl6aRw==}
'@roblox-ts/luau-ast@2.0.0':
resolution: {integrity: sha512-cmMi093IdwBOLVxwuordhM8AmtbyTIyRpsTbB0D/JauidW4SXsQRQowSwWjHo4QP0DRJBXvOIlxtqEQi50uNzQ==}
'@roblox-ts/luau-ast@2.0.1':
resolution: {integrity: sha512-jej2mzRGwhR9wu4woAtgTwqsKADlegZYlQ+M5qVHRojvjoyJVFkLrSbhBKRr8HR+fVW5nCz0qX7kNa0tSpAY+A==}
'@roblox-ts/path-translator@1.1.0':
resolution: {integrity: sha512-D0akTmnNYqBw+ZIek5JxocT3BjmbgGOuOy0x1nIIxHBPNLGCpzseToY8jyYs/0mlvnN2xnSP/k8Tv+jvGOQSwQ==}
@@ -236,107 +230,107 @@ packages:
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@typescript-eslint/eslint-plugin@8.46.2':
resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==}
'@typescript-eslint/eslint-plugin@8.49.0':
resolution: {integrity: sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@typescript-eslint/parser': ^8.46.2
'@typescript-eslint/parser': ^8.49.0
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/parser@8.46.2':
resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==}
'@typescript-eslint/parser@8.49.0':
resolution: {integrity: sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/project-service@8.44.0':
resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==}
'@typescript-eslint/project-service@8.46.4':
resolution: {integrity: sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/project-service@8.46.2':
resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==}
'@typescript-eslint/project-service@8.49.0':
resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/scope-manager@8.44.0':
resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==}
'@typescript-eslint/scope-manager@8.46.4':
resolution: {integrity: sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/scope-manager@8.46.2':
resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==}
'@typescript-eslint/scope-manager@8.49.0':
resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.44.0':
resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==}
'@typescript-eslint/tsconfig-utils@8.46.4':
resolution: {integrity: sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/tsconfig-utils@8.46.2':
resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==}
'@typescript-eslint/tsconfig-utils@8.49.0':
resolution: {integrity: sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/type-utils@8.44.0':
resolution: {integrity: sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==}
'@typescript-eslint/type-utils@8.46.4':
resolution: {integrity: sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/type-utils@8.46.2':
resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==}
'@typescript-eslint/type-utils@8.49.0':
resolution: {integrity: sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/types@8.44.0':
resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==}
'@typescript-eslint/types@8.46.4':
resolution: {integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/types@8.46.2':
resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==}
'@typescript-eslint/types@8.49.0':
resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.44.0':
resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==}
'@typescript-eslint/typescript-estree@8.46.4':
resolution: {integrity: sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/typescript-estree@8.46.2':
resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==}
'@typescript-eslint/typescript-estree@8.49.0':
resolution: {integrity: sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/utils@8.44.0':
resolution: {integrity: sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==}
'@typescript-eslint/utils@8.46.4':
resolution: {integrity: sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/utils@8.46.2':
resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==}
'@typescript-eslint/utils@8.49.0':
resolution: {integrity: sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/visitor-keys@8.44.0':
resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==}
'@typescript-eslint/visitor-keys@8.46.4':
resolution: {integrity: sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/visitor-keys@8.46.2':
resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==}
'@typescript-eslint/visitor-keys@8.49.0':
resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
acorn-jsx@5.3.2:
@@ -460,8 +454,8 @@ packages:
eslint-config-prettier:
optional: true
eslint-plugin-roblox-ts@1.2.1:
resolution: {integrity: sha512-B6PyXsz2urPJIr2TxZBD3qQwCM0FN6lUOoddJTk1AcdRkWSTe1Vc6VuNP593u7Tbq9sStjW2k2iYjI1G5CFNiQ==}
eslint-plugin-roblox-ts@1.3.0:
resolution: {integrity: sha512-J67YmWK1SVWWa5mtWCm+9LnK8uN5Snhe0hwDnCKc93LWDzX4YL37PyFQhhlP+oS5I6eM6ZdLMg3rvJURLQn5cQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=22.5.1}
peerDependencies:
'@typescript-eslint/parser': '>=6.0.0'
@@ -480,8 +474,8 @@ packages:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint@9.38.0:
resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==}
eslint@9.39.1:
resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
peerDependencies:
@@ -510,10 +504,6 @@ packages:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
expand-tilde@2.0.2:
resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==}
engines: {node: '>=0.10.0'}
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -536,6 +526,15 @@ packages:
fastq@1.19.1:
resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
engines: {node: '>=12.0.0'}
peerDependencies:
picomatch: ^3 || ^4
peerDependenciesMeta:
picomatch:
optional: true
file-entry-cache@8.0.0:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
@@ -578,10 +577,6 @@ packages:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
get-installed-path@4.0.8:
resolution: {integrity: sha512-PmANK1xElIHlHH2tXfOoTnSDUjX1X3GvKK6ZyLbUnSCCn1pADwu67eVWttuPzJWrXDDT2MfO6uAaKILOFfitmA==}
engines: {node: '>=6', npm: '>=5', yarn: '>=1'}
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
@@ -594,14 +589,6 @@ packages:
resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==}
engines: {node: '>=16 || 14 >=14.17'}
global-modules@1.0.0:
resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==}
engines: {node: '>=0.10.0'}
global-prefix@1.0.2:
resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==}
engines: {node: '>=0.10.0'}
globals@14.0.0:
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
engines: {node: '>=18'}
@@ -609,9 +596,6 @@ packages:
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'}
@@ -623,10 +607,6 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
homedir-polyfill@1.0.3:
resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==}
engines: {node: '>=0.10.0'}
hosted-git-info@4.1.0:
resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
engines: {node: '>=10'}
@@ -647,9 +627,6 @@ packages:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
ini@1.3.8:
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
@@ -674,15 +651,11 @@ packages:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
is-windows@1.0.2:
resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
engines: {node: '>=0.10.0'}
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
js-yaml@4.1.0:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
js-yaml@4.1.1:
resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
hasBin: true
json-buffer@3.0.1:
@@ -782,10 +755,6 @@ packages:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
parse-passwd@1.0.0:
resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==}
engines: {node: '>=0.10.0'}
path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
@@ -805,6 +774,10 @@ packages:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
picomatch@4.0.3:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'}
prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
@@ -813,8 +786,8 @@ packages:
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
engines: {node: '>=6.0.0'}
prettier@3.6.2:
resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
prettier@3.7.4:
resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==}
engines: {node: '>=14'}
hasBin: true
@@ -838,9 +811,6 @@ packages:
peerDependencies:
typescript: ^5.2.2
rbxts-transformer-t-new-new@0.2.0:
resolution: {integrity: sha512-IS3z/SBv78ft/eDMu46boB5eyl2hBAffVoJzUeIzuVBe6z38mz9L/c7OvCvgEX9QGRZI+LmEJA/mgPR6gH7Bsw==}
readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
@@ -853,10 +823,6 @@ packages:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
resolve-dir@1.0.1:
resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==}
engines: {node: '>=0.10.0'}
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
@@ -926,6 +892,10 @@ packages:
resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==}
engines: {node: ^14.18.0 || >=16.0.0}
tinyglobby@0.2.15:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@@ -940,6 +910,13 @@ packages:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
typescript-eslint@8.49.0:
resolution: {integrity: sha512-zRSVH1WXD0uXczCXw+nsdjGPUdx4dfrs5VQoHnUWmv1U3oNlAKv4FUNdLDhVUg+gYn+a5hUESqch//Rv5wVhrg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
typescript@5.5.3:
resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==}
engines: {node: '>=14.17'}
@@ -964,10 +941,6 @@ packages:
validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
which@1.3.1:
resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
hasBin: true
which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
@@ -1002,9 +975,9 @@ packages:
snapshots:
'@eslint-community/eslint-utils@4.9.0(eslint@9.38.0)':
'@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)':
dependencies:
eslint: 9.38.0
eslint: 9.39.1
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.2': {}
@@ -1017,15 +990,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@eslint/config-helpers@0.4.1':
'@eslint/config-helpers@0.4.2':
dependencies:
'@eslint/core': 0.16.0
'@eslint/core': 0.17.0
'@eslint/core@0.16.0':
'@eslint/core@0.17.0':
dependencies:
'@types/json-schema': 7.0.15
'@eslint/eslintrc@3.3.1':
'@eslint/eslintrc@3.3.3':
dependencies:
ajv: 6.12.6
debug: 4.4.3
@@ -1033,19 +1006,19 @@ snapshots:
globals: 14.0.0
ignore: 5.3.2
import-fresh: 3.3.1
js-yaml: 4.1.0
js-yaml: 4.1.1
minimatch: 3.1.2
strip-json-comments: 3.1.1
transitivePeerDependencies:
- supports-color
'@eslint/js@9.38.0': {}
'@eslint/js@9.39.1': {}
'@eslint/object-schema@2.1.7': {}
'@eslint/plugin-kit@0.4.0':
'@eslint/plugin-kit@0.4.1':
dependencies:
'@eslint/core': 0.16.0
'@eslint/core': 0.17.0
levn: 0.4.1
'@flamework/components@1.3.2(@flamework/core@1.3.2)':
@@ -1136,10 +1109,12 @@ snapshots:
'@rbxts/t@3.2.1': {}
'@rbxts/types@1.0.887': {}
'@rbxts/types@1.0.896': {}
'@roblox-ts/luau-ast@2.0.0': {}
'@roblox-ts/luau-ast@2.0.1': {}
'@roblox-ts/path-translator@1.1.0':
dependencies:
ajv: 8.17.1
@@ -1154,16 +1129,15 @@ snapshots:
'@types/json-schema@7.0.15': {}
'@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.5.4))(eslint@9.38.0)(typescript@5.5.4)':
'@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.5.4))(eslint@9.39.1)(typescript@5.5.4)':
dependencies:
'@eslint-community/regexpp': 4.12.2
'@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.5.4)
'@typescript-eslint/scope-manager': 8.46.2
'@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0)(typescript@5.5.4)
'@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.5.4)
'@typescript-eslint/visitor-keys': 8.46.2
eslint: 9.38.0
graphemer: 1.4.0
'@typescript-eslint/parser': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
'@typescript-eslint/scope-manager': 8.49.0
'@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
'@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
'@typescript-eslint/visitor-keys': 8.49.0
eslint: 9.39.1
ignore: 7.0.5
natural-compare: 1.4.0
ts-api-utils: 2.1.0(typescript@5.5.4)
@@ -1171,88 +1145,88 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.5.4)':
'@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.5.4)':
dependencies:
'@typescript-eslint/scope-manager': 8.46.2
'@typescript-eslint/types': 8.46.2
'@typescript-eslint/typescript-estree': 8.46.2(typescript@5.5.4)
'@typescript-eslint/visitor-keys': 8.46.2
'@typescript-eslint/scope-manager': 8.49.0
'@typescript-eslint/types': 8.49.0
'@typescript-eslint/typescript-estree': 8.49.0(typescript@5.5.4)
'@typescript-eslint/visitor-keys': 8.49.0
debug: 4.4.3
eslint: 9.38.0
eslint: 9.39.1
typescript: 5.5.4
transitivePeerDependencies:
- supports-color
'@typescript-eslint/project-service@8.44.0(typescript@5.5.4)':
'@typescript-eslint/project-service@8.46.4(typescript@5.5.4)':
dependencies:
'@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.5.4)
'@typescript-eslint/types': 8.46.2
'@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.5.4)
'@typescript-eslint/types': 8.49.0
debug: 4.4.3
typescript: 5.5.4
transitivePeerDependencies:
- supports-color
'@typescript-eslint/project-service@8.46.2(typescript@5.5.4)':
'@typescript-eslint/project-service@8.49.0(typescript@5.5.4)':
dependencies:
'@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.5.4)
'@typescript-eslint/types': 8.46.2
'@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.5.4)
'@typescript-eslint/types': 8.49.0
debug: 4.4.3
typescript: 5.5.4
transitivePeerDependencies:
- supports-color
'@typescript-eslint/scope-manager@8.44.0':
'@typescript-eslint/scope-manager@8.46.4':
dependencies:
'@typescript-eslint/types': 8.44.0
'@typescript-eslint/visitor-keys': 8.44.0
'@typescript-eslint/types': 8.46.4
'@typescript-eslint/visitor-keys': 8.46.4
'@typescript-eslint/scope-manager@8.46.2':
'@typescript-eslint/scope-manager@8.49.0':
dependencies:
'@typescript-eslint/types': 8.46.2
'@typescript-eslint/visitor-keys': 8.46.2
'@typescript-eslint/types': 8.49.0
'@typescript-eslint/visitor-keys': 8.49.0
'@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.5.4)':
'@typescript-eslint/tsconfig-utils@8.46.4(typescript@5.5.4)':
dependencies:
typescript: 5.5.4
'@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.5.4)':
'@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.5.4)':
dependencies:
typescript: 5.5.4
'@typescript-eslint/type-utils@8.44.0(eslint@9.38.0)(typescript@5.5.4)':
'@typescript-eslint/type-utils@8.46.4(eslint@9.39.1)(typescript@5.5.4)':
dependencies:
'@typescript-eslint/types': 8.44.0
'@typescript-eslint/typescript-estree': 8.44.0(typescript@5.5.4)
'@typescript-eslint/utils': 8.44.0(eslint@9.38.0)(typescript@5.5.4)
'@typescript-eslint/types': 8.46.4
'@typescript-eslint/typescript-estree': 8.46.4(typescript@5.5.4)
'@typescript-eslint/utils': 8.46.4(eslint@9.39.1)(typescript@5.5.4)
debug: 4.4.3
eslint: 9.38.0
eslint: 9.39.1
ts-api-utils: 2.1.0(typescript@5.5.4)
typescript: 5.5.4
transitivePeerDependencies:
- supports-color
'@typescript-eslint/type-utils@8.46.2(eslint@9.38.0)(typescript@5.5.4)':
'@typescript-eslint/type-utils@8.49.0(eslint@9.39.1)(typescript@5.5.4)':
dependencies:
'@typescript-eslint/types': 8.46.2
'@typescript-eslint/typescript-estree': 8.46.2(typescript@5.5.4)
'@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.5.4)
'@typescript-eslint/types': 8.49.0
'@typescript-eslint/typescript-estree': 8.49.0(typescript@5.5.4)
'@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
debug: 4.4.3
eslint: 9.38.0
eslint: 9.39.1
ts-api-utils: 2.1.0(typescript@5.5.4)
typescript: 5.5.4
transitivePeerDependencies:
- supports-color
'@typescript-eslint/types@8.44.0': {}
'@typescript-eslint/types@8.46.4': {}
'@typescript-eslint/types@8.46.2': {}
'@typescript-eslint/types@8.49.0': {}
'@typescript-eslint/typescript-estree@8.44.0(typescript@5.5.4)':
'@typescript-eslint/typescript-estree@8.46.4(typescript@5.5.4)':
dependencies:
'@typescript-eslint/project-service': 8.44.0(typescript@5.5.4)
'@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.5.4)
'@typescript-eslint/types': 8.44.0
'@typescript-eslint/visitor-keys': 8.44.0
'@typescript-eslint/project-service': 8.46.4(typescript@5.5.4)
'@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.5.4)
'@typescript-eslint/types': 8.46.4
'@typescript-eslint/visitor-keys': 8.46.4
debug: 4.4.3
fast-glob: 3.3.3
is-glob: 4.0.3
@@ -1263,52 +1237,51 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/typescript-estree@8.46.2(typescript@5.5.4)':
'@typescript-eslint/typescript-estree@8.49.0(typescript@5.5.4)':
dependencies:
'@typescript-eslint/project-service': 8.46.2(typescript@5.5.4)
'@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.5.4)
'@typescript-eslint/types': 8.46.2
'@typescript-eslint/visitor-keys': 8.46.2
'@typescript-eslint/project-service': 8.49.0(typescript@5.5.4)
'@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.5.4)
'@typescript-eslint/types': 8.49.0
'@typescript-eslint/visitor-keys': 8.49.0
debug: 4.4.3
fast-glob: 3.3.3
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.7.3
tinyglobby: 0.2.15
ts-api-utils: 2.1.0(typescript@5.5.4)
typescript: 5.5.4
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.44.0(eslint@9.38.0)(typescript@5.5.4)':
'@typescript-eslint/utils@8.46.4(eslint@9.39.1)(typescript@5.5.4)':
dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0)
'@typescript-eslint/scope-manager': 8.44.0
'@typescript-eslint/types': 8.44.0
'@typescript-eslint/typescript-estree': 8.44.0(typescript@5.5.4)
eslint: 9.38.0
'@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
'@typescript-eslint/scope-manager': 8.46.4
'@typescript-eslint/types': 8.46.4
'@typescript-eslint/typescript-estree': 8.46.4(typescript@5.5.4)
eslint: 9.39.1
typescript: 5.5.4
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.46.2(eslint@9.38.0)(typescript@5.5.4)':
'@typescript-eslint/utils@8.49.0(eslint@9.39.1)(typescript@5.5.4)':
dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0)
'@typescript-eslint/scope-manager': 8.46.2
'@typescript-eslint/types': 8.46.2
'@typescript-eslint/typescript-estree': 8.46.2(typescript@5.5.4)
eslint: 9.38.0
'@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
'@typescript-eslint/scope-manager': 8.49.0
'@typescript-eslint/types': 8.49.0
'@typescript-eslint/typescript-estree': 8.49.0(typescript@5.5.4)
eslint: 9.39.1
typescript: 5.5.4
transitivePeerDependencies:
- supports-color
'@typescript-eslint/visitor-keys@8.44.0':
'@typescript-eslint/visitor-keys@8.46.4':
dependencies:
'@typescript-eslint/types': 8.44.0
'@typescript-eslint/types': 8.46.4
eslint-visitor-keys: 4.2.1
'@typescript-eslint/visitor-keys@8.46.2':
'@typescript-eslint/visitor-keys@8.49.0':
dependencies:
'@typescript-eslint/types': 8.46.2
'@typescript-eslint/types': 8.49.0
eslint-visitor-keys: 4.2.1
acorn-jsx@5.3.2(acorn@8.15.0):
@@ -1412,25 +1385,26 @@ snapshots:
escape-string-regexp@4.0.0: {}
eslint-config-prettier@10.1.8(eslint@9.38.0):
eslint-config-prettier@10.1.8(eslint@9.39.1):
dependencies:
eslint: 9.38.0
eslint: 9.39.1
eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint@9.38.0)(prettier@3.6.2):
eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(prettier@3.7.4):
dependencies:
eslint: 9.38.0
prettier: 3.6.2
eslint: 9.39.1
prettier: 3.7.4
prettier-linter-helpers: 1.0.0
synckit: 0.11.11
optionalDependencies:
eslint-config-prettier: 10.1.8(eslint@9.38.0)
eslint-config-prettier: 10.1.8(eslint@9.39.1)
eslint-plugin-roblox-ts@1.2.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.5.4))(eslint@9.38.0)(typescript@5.5.4):
eslint-plugin-roblox-ts@1.3.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.5.4))(eslint@9.39.1)(typescript@5.5.4):
dependencies:
'@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.5.4)
'@typescript-eslint/type-utils': 8.44.0(eslint@9.38.0)(typescript@5.5.4)
'@typescript-eslint/utils': 8.44.0(eslint@9.38.0)(typescript@5.5.4)
eslint: 9.38.0
'@roblox-ts/luau-ast': 2.0.1
'@typescript-eslint/parser': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
'@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1)(typescript@5.5.4)
'@typescript-eslint/utils': 8.46.4(eslint@9.39.1)(typescript@5.5.4)
eslint: 9.39.1
typescript: 5.5.4
transitivePeerDependencies:
- supports-color
@@ -1444,16 +1418,16 @@ snapshots:
eslint-visitor-keys@4.2.1: {}
eslint@9.38.0:
eslint@9.39.1:
dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0)
'@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
'@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.21.1
'@eslint/config-helpers': 0.4.1
'@eslint/core': 0.16.0
'@eslint/eslintrc': 3.3.1
'@eslint/js': 9.38.0
'@eslint/plugin-kit': 0.4.0
'@eslint/config-helpers': 0.4.2
'@eslint/core': 0.17.0
'@eslint/eslintrc': 3.3.3
'@eslint/js': 9.39.1
'@eslint/plugin-kit': 0.4.1
'@humanfs/node': 0.16.7
'@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.3
@@ -1501,10 +1475,6 @@ snapshots:
esutils@2.0.3: {}
expand-tilde@2.0.2:
dependencies:
homedir-polyfill: 1.0.3
fast-deep-equal@3.1.3: {}
fast-diff@1.3.0: {}
@@ -1527,6 +1497,10 @@ snapshots:
dependencies:
reusify: 1.1.0
fdir@6.5.0(picomatch@4.0.3):
optionalDependencies:
picomatch: 4.0.3
file-entry-cache@8.0.0:
dependencies:
flat-cache: 4.0.1
@@ -1568,10 +1542,6 @@ snapshots:
get-caller-file@2.0.5: {}
get-installed-path@4.0.8:
dependencies:
global-modules: 1.0.0
glob-parent@5.1.2:
dependencies:
is-glob: 4.0.3
@@ -1587,26 +1557,10 @@ snapshots:
minipass: 4.2.8
path-scurry: 1.11.1
global-modules@1.0.0:
dependencies:
global-prefix: 1.0.2
is-windows: 1.0.2
resolve-dir: 1.0.1
global-prefix@1.0.2:
dependencies:
expand-tilde: 2.0.2
homedir-polyfill: 1.0.3
ini: 1.3.8
is-windows: 1.0.2
which: 1.3.1
globals@14.0.0: {}
graceful-fs@4.2.11: {}
graphemer@1.4.0: {}
has-flag@4.0.0: {}
hashids@2.3.0: {}
@@ -1615,10 +1569,6 @@ snapshots:
dependencies:
function-bind: 1.1.2
homedir-polyfill@1.0.3:
dependencies:
parse-passwd: 1.0.0
hosted-git-info@4.1.0:
dependencies:
lru-cache: 6.0.0
@@ -1634,8 +1584,6 @@ snapshots:
imurmurhash@0.1.4: {}
ini@1.3.8: {}
is-binary-path@2.1.0:
dependencies:
binary-extensions: 2.3.0
@@ -1654,11 +1602,9 @@ snapshots:
is-number@7.0.0: {}
is-windows@1.0.2: {}
isexe@2.0.0: {}
js-yaml@4.1.0:
js-yaml@4.1.1:
dependencies:
argparse: 2.0.1
@@ -1756,8 +1702,6 @@ snapshots:
dependencies:
callsites: 3.1.0
parse-passwd@1.0.0: {}
path-exists@4.0.0: {}
path-key@3.1.1: {}
@@ -1771,13 +1715,15 @@ snapshots:
picomatch@2.3.1: {}
picomatch@4.0.3: {}
prelude-ls@1.2.1: {}
prettier-linter-helpers@1.0.0:
dependencies:
fast-diff: 1.3.0
prettier@3.6.2: {}
prettier@3.7.4: {}
punycode@2.3.1: {}
@@ -1803,12 +1749,6 @@ snapshots:
dependencies:
typescript: 5.5.4
rbxts-transformer-t-new-new@0.2.0:
dependencies:
'@rbxts/t': 3.2.1
get-installed-path: 4.0.8
typescript: 5.5.4
readdirp@3.6.0:
dependencies:
picomatch: 2.3.1
@@ -1817,11 +1757,6 @@ snapshots:
require-from-string@2.0.2: {}
resolve-dir@1.0.1:
dependencies:
expand-tilde: 2.0.2
global-modules: 1.0.0
resolve-from@4.0.0: {}
resolve@1.22.11:
@@ -1892,6 +1827,11 @@ snapshots:
dependencies:
'@pkgr/core': 0.2.9
tinyglobby@0.2.15:
dependencies:
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
@@ -1904,6 +1844,17 @@ snapshots:
dependencies:
prelude-ls: 1.2.1
typescript-eslint@8.49.0(eslint@9.39.1)(typescript@5.5.4):
dependencies:
'@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.5.4))(eslint@9.39.1)(typescript@5.5.4)
'@typescript-eslint/parser': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
'@typescript-eslint/typescript-estree': 8.49.0(typescript@5.5.4)
'@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.5.4)
eslint: 9.39.1
typescript: 5.5.4
transitivePeerDependencies:
- supports-color
typescript@5.5.3: {}
typescript@5.5.4: {}
@@ -1921,10 +1872,6 @@ snapshots:
spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1
which@1.3.1:
dependencies:
isexe: 2.0.0
which@2.0.2:
dependencies:
isexe: 2.0.0

View File

@@ -6,3 +6,4 @@
[tools]
darklua = "seaofvoices/darklua@0.17.2"
rojo = "rojo-rbx/rojo@7.6.1"
rbxcloud = "Sleitnick/rbxcloud@0.17.0"

View File

@@ -3,7 +3,7 @@ import React from "@rbxts/react";
import { StrictMode } from "@rbxts/react";
import { createPortal, createRoot } from "@rbxts/react-roblox";
import { Players, StarterGui } from "@rbxts/services";
import PlayersBoard from "shared/gui/players_board";
import PlayersBoard from "client/gui/players_board";
@Controller()
class GuiController implements OnStart {
@@ -12,7 +12,9 @@ class GuiController implements OnStart {
StarterGui.SetCoreGuiEnabled(Enum.CoreGuiType.Chat, true);
try {
StarterGui.SetCore("ResetButtonCallback", true);
} catch (error) {}
} catch (err) {
error(err);
}
const root = createRoot(new Instance("Folder"));

View File

@@ -1,5 +1,5 @@
import { lerp, useMotion } from "@rbxts/pretty-react-hooks";
import React, { Component, ReactNode, StrictMode, useEffect, useState } from "@rbxts/react";
import { useKeyPress, useMotion } from "@rbxts/pretty-react-hooks";
import React, { useEffect, useState } from "@rbxts/react";
import { Players } from "@rbxts/services";
import Profile from "./profile";
@@ -55,6 +55,9 @@ function PlayerEntry({
export default function PlayersBoard() {
const [players, setPlayers] = useState<Player[]>(Players.GetPlayers());
const [selectedPlayer, setSelectedPlayer] = useState<Player>();
const [activated, setActivated] = useState(true);
const tabPressed = useKeyPress(["Tab"]);
useEffect(() => {
const playerAdded = Players.PlayerAdded.Connect(() => {
setPlayers(Players.GetPlayers());
@@ -68,6 +71,10 @@ export default function PlayersBoard() {
};
}, []);
useEffect(() => {
if (tabPressed) setActivated(!activated);
}, [tabPressed]);
return (
<>
<frame
@@ -75,6 +82,7 @@ export default function PlayersBoard() {
Position={UDim2.fromScale(0.8, 0.1)}
BackgroundColor3={new Color3(0, 0.72, 1)}
BackgroundTransparency={0.7}
Visible={activated}
>
<frame
BorderColor3={new Color3(1, 1, 1)}

View File

@@ -1,25 +1,47 @@
import React, { useEffect, useRef, useState } from "@rbxts/react";
import { LocalizationService, Players } from "@rbxts/services";
import { LocalizationService, Players, RunService } from "@rbxts/services";
import { ProfileClientEvents } from "client/networking";
function TimePlayed({ targetTime }: { targetTime: number }) {
const [time, setTime] = useState();
const [id, setId] = useState<DateTime>();
function TimePlayed({
targetTime,
reeloffset,
timeOrigin,
}: {
targetTime: number;
timeOrigin: number;
reeloffset: number;
}) {
const [time, setTime] = useState<number>(0);
useEffect(() => {
let killed = false;
setId(DateTime.fromUnixTimestamp(targetTime));
task.spawn(() => {
while (true) {
if (killed) return;
}
const connection = RunService.PreRender.Connect(() => {
setTime(targetTime + os.time() - timeOrigin);
});
return () => {
killed = true;
};
return () => connection.Disconnect();
}, [targetTime]);
return (
<textlabel
Text={
targetTime === -1
? "XX:XX:XX"
: DateTime.fromUnixTimestamp(time).FormatUniversalTime(
"HH:mm:ss",
LocalizationService.RobloxLocaleId,
)
}
Size={new UDim2(1, -reeloffset, 0.3, 0)}
BackgroundTransparency={1}
TextScaled={true}
Position={new UDim2(0, reeloffset, 0.45, 0)}
TextColor3={new Color3(0, 0, 0)}
/>
);
}
export default function Profile({ player }: { player: Player }) {
const [userIcon, setUserIcon] = useState<string>();
const [timePlayed, setTimePlayed] = useState<number>(-1);
const [timeOrigin, setTimeOrigin] = useState<number>(-1);
const ref = useRef<ImageLabel>();
useEffect(() => {
const [image] = Players.GetUserThumbnailAsync(
@@ -28,6 +50,12 @@ export default function Profile({ player }: { player: Player }) {
Enum.ThumbnailSize.Size180x180,
);
setUserIcon(image);
if (RunService.IsRunning()) {
ProfileClientEvents.getPlayerStartTime(player.UserId).then((value) => {
setTimePlayed(value[0]);
setTimeOrigin(value[1]);
});
}
}, [player]);
const reeloffset = ref.current?.AbsoluteSize.X ?? 0;
return (
@@ -72,14 +100,7 @@ export default function Profile({ player }: { player: Player }) {
Position={new UDim2(0, reeloffset, 0.25, 0)}
TextColor3={new Color3(0.13, 0.13, 0.13)}
/>
<textlabel
Text={DateTime.fromUnixTimestamp().FormatLocalTime("LTS", LocalizationService.RobloxLocaleId)}
Size={new UDim2(1, -reeloffset, 0.3, 0)}
BackgroundTransparency={1}
TextScaled={true}
Position={new UDim2(0, reeloffset, 0.45, 0)}
TextColor3={new Color3(0, 0, 0)}
/>
<TimePlayed reeloffset={reeloffset} targetTime={timePlayed} timeOrigin={timeOrigin} />
<textlabel
Text={`Lev : ${0}`}
Size={new UDim2(1, -reeloffset, 0.3, 0)}

View File

@@ -1,3 +1,4 @@
import { GameplayEvents } from "shared/networking";
import { GameplayEvents, ProfileEvents } from "shared/networking";
export const GameplayClientEvents = GameplayEvents.createClient({});
export const ProfileClientEvents = ProfileEvents.createClient({});

View File

@@ -20,7 +20,7 @@ export class Doors extends BaseComponent<{}, DoorInstance> implements OnStart {
}
onStart(): void {
const doororigin = this.instance.WorldPivot.Position;
while (task.wait(0.5)) {
while (task.wait(0.5) !== 0) {
let actived = false;
Players.GetPlayers().forEach((player) => {
const character = player.Character;

View File

@@ -9,7 +9,7 @@ interface Attribute {
@Component({
tag: "Random_Decoration",
})
class RandomDecoration extends BaseComponent<Attribute, Part> implements OnStart {
class RandomDecorationComponent extends BaseComponent<Attribute, Part> implements OnStart {
onStart(): void {
const decoration = this.getRandomDecoration(this.attributes.Type);
decoration.Parent = this.instance.Parent;

View File

@@ -1,3 +1,4 @@
import { GameplayEvents } from "shared/networking";
import { GameplayEvents, ProfileEvents } from "shared/networking";
export const GameplayServerEvents = GameplayEvents.createServer({});
export const ProfileServerEvents = ProfileEvents.createServer({});

View File

@@ -15,7 +15,7 @@ class CommandsService implements OnStart {
ragdollCommand.PrimaryAlias = "/ragdoll";
ragdollCommand.Triggered.Connect((TextSource) => {
const player = Players.GetPlayerByUserId(TextSource.UserId);
this.ragdollService.ragdoll(player?.Character!);
this.ragdollService.ragdoll(player!.Character!);
});
const unragdollCommand = new TextChatCommand();
@@ -23,7 +23,7 @@ class CommandsService implements OnStart {
unragdollCommand.PrimaryAlias = "/unragdoll";
unragdollCommand.Triggered.Connect((TextSource) => {
const player = Players.GetPlayerByUserId(TextSource.UserId);
this.ragdollService.ragdoll(player?.Character!);
this.ragdollService.ragdoll(player!.Character!);
});
const takeownerCommand = new TextChatCommand();

View File

@@ -40,7 +40,7 @@ export class RagdollService implements OnPlayerJoined, OnStart {
//#endregion
//#region Private functions.
private getRagdollPhysic(character: Model) {
private getRagdollPhysic(character: Model): [Set<Motor6D>, Set<BallSocketConstraint>] {
const motors = new Set<Motor6D>();
const constraints = new Set<BallSocketConstraint>();
character.GetDescendants().forEach((descendant) => {
@@ -51,7 +51,7 @@ export class RagdollService implements OnPlayerJoined, OnStart {
constraints.add(descendant);
}
});
return $tuple(motors, constraints);
return [motors, constraints];
}
private prepareRagdoll(character: Model) {

View File

@@ -63,7 +63,9 @@ export class SprintService implements OnStart, OnPlayerJoined {
GameplayServerEvents.sprint.connect((player, enabled) => {
if (this.timeout.has(player.UserId) && !this.cant_run.has(player.UserId)) return;
const character = player.Character;
enabled ? this.is_running.add(player.UserId) : this.is_running.delete(player.UserId);
if (enabled) {
this.is_running.add(player.UserId);
} else this.is_running.delete(player.UserId);
if (character) {
const humanoid = character.FindFirstChildOfClass("Humanoid");
if (humanoid) {
@@ -145,6 +147,8 @@ export class SprintService implements OnStart, OnPlayerJoined {
setRunningInterdiction(player: Player, enabled: boolean) {
this.setRunning(player, !enabled);
enabled ? this.cant_run.add(player.UserId) : this.cant_run.delete(player.UserId);
if (enabled) {
this.cant_run.add(player.UserId);
} else this.cant_run.delete(player.UserId);
}
}

View File

@@ -1,23 +1,32 @@
import { Modding, OnStart, Service } from "@flamework/core";
import { Players } from "@rbxts/services";
import { OnPlayerJoined } from "shared/modding/player_events";
import { OnPlayerJoined, OnPlayerQuit } from "shared/modding/player_events";
@Service()
class PlayerJoinService implements OnStart {
onStart() {
const listeners = new Set<OnPlayerJoined>();
const playerJoinListener = new Set<OnPlayerJoined>();
const playerQuitListener = new Set<OnPlayerQuit>();
Modding.onListenerAdded<OnPlayerJoined>((object) => listeners.add(object));
Modding.onListenerRemoved<OnPlayerJoined>((object) => listeners.delete(object));
Modding.onListenerAdded<OnPlayerJoined>((object) => playerJoinListener.add(object));
Modding.onListenerRemoved<OnPlayerJoined>((object) => playerJoinListener.delete(object));
Modding.onListenerAdded<OnPlayerQuit>((object) => playerQuitListener.add(object));
Modding.onListenerRemoved<OnPlayerQuit>((object) => playerQuitListener.delete(object));
Players.PlayerAdded.Connect((player) => {
for (const listener of listeners) {
for (const listener of playerJoinListener) {
task.spawn(() => listener.onPlayerJoined(player));
}
});
Players.PlayerRemoving.Connect((player) => {
for (const listener of playerQuitListener) {
task.spawn(() => listener.onPlayerQuit(player));
}
});
for (const player of Players.GetPlayers()) {
for (const listener of listeners) {
for (const listener of playerJoinListener) {
task.spawn(() => listener.onPlayerJoined(player));
}
}

View File

@@ -0,0 +1,43 @@
import { OnStart, Service } from "@flamework/core";
import { DataStoreService } from "@rbxts/services";
import { t } from "@rbxts/t";
import { ProfileServerEvents } from "server/networking";
import { OnPlayerJoined, OnPlayerQuit } from "shared/modding/player_events";
@Service()
class StatsService implements OnPlayerJoined, OnStart, OnPlayerQuit {
firstJoinStoreCache = new Map<number, [number, number]>();
firstJoinStore!: DataStore;
onStart(): void {
this.firstJoinStore = DataStoreService.GetDataStore("Stats_Players_Played_Time");
ProfileServerEvents.getPlayerStartTime.setCallback((_, playerId) => {
const playedtime = this.getPlayerPlayedTime(playerId);
return playedtime!;
});
}
onPlayerJoined(player: Player): void {
const playerId = tostring(player.UserId);
const [value] = this.firstJoinStore.GetAsync(playerId);
if (!t.optional(t.number)(value)) throw `Bad Data in DataBase for ${player.UserId}`;
if (value === undefined) {
this.firstJoinStore.SetAsync(playerId, 0);
}
this.firstJoinStoreCache.set(player.UserId, [value ?? 0, os.time()]);
}
getPlayerPlayedTime(playerId: number) {
return this.firstJoinStoreCache.get(playerId);
}
onPlayerQuit(player: Player): void {
const [value, time] = this.firstJoinStoreCache.get(player.UserId)!;
const t = value + os.time() - time;
this.firstJoinStore.SetAsync(tostring(player.UserId), t, [player.UserId]);
}
}

View File

@@ -1,6 +1,5 @@
// TODO
import { TupleType } from "typescript";
import { AbilityType } from "./main";
/**

View File

@@ -1,3 +1,7 @@
export interface OnPlayerJoined {
onPlayerJoined(player: Player): void;
onPlayerJoined(player: Player): void;
}
export interface OnPlayerQuit {
onPlayerQuit(player: Player): void;
}

View File

@@ -6,4 +6,11 @@ interface GameplayClient {
interface GameplayServer {}
interface ProfileClient {
getPlayerStartTime(playerId: number): [number, number];
}
interface ProfileServer {}
export const GameplayEvents = Networking.createEvent<GameplayClient, GameplayServer>();
export const ProfileEvents = Networking.createFunction<ProfileClient, ProfileServer>();

View File

@@ -15,10 +15,7 @@
"moduleDetection": "force",
"strict": true,
"target": "ESNext",
"typeRoots": [
"node_modules/@rbxts",
"node_modules/@flamework",
],
"typeRoots": ["node_modules/@rbxts", "node_modules/@flamework"],
// configurable
"rootDir": "src",
"outDir": "out",
@@ -27,22 +24,16 @@
"tsBuildInfoFile": "out/tsconfig.tsbuildinfo",
"plugins": [
{
"transform": "rbxts-transformer-flamework",
"transform": "rbxts-transformer-flamework"
},
{
"transform": "rbxts-transformer-instances"
},
{
"transform": "rbxts-transformer-services"
},
{
"transform": "rbxts-transformer-t-new-new"
}
],
"removeComments": true
},
"include": [
"src/**/*",
"node_modules/rbxts-transformer-instances"
]
}
"include": ["src/**/*", "node_modules/rbxts-transformer-instances"]
}