From 02947cc391c8f990585ad9e26033682a6d868adb Mon Sep 17 00:00:00 2001 From: Azur Date: Sun, 26 Oct 2025 22:05:57 +0100 Subject: [PATCH] Migrate to flamework + strating rewrite ragdoll. --- .gitignore | 1 + .vscode/settings.json | 7 +- default.project.json | 5 +- eslint.config.mjs | 3 + package-lock.json | 992 ++++++++++++++++++++++++-------- package.json | 11 +- src/client/main.client.ts | 30 +- src/client/networking.ts | 3 + src/server/command.server.ts | 54 +- src/server/decoration.server.ts | 23 +- src/server/gameplay.server.ts | 114 ++-- src/server/main.server.ts | 14 - src/server/networking.ts | 3 + src/shared/character/builder.ts | 11 + src/shared/gameplay.ts | 7 - src/shared/networking.ts | 11 + src/shared/ragdoll.ts | 140 ++++- src/shared/replicated.ts | 5 - src/shared/utils/restorarray.ts | 6 + tsconfig.json | 28 +- 20 files changed, 1068 insertions(+), 400 deletions(-) create mode 100644 src/client/networking.ts delete mode 100644 src/server/main.server.ts create mode 100644 src/server/networking.ts create mode 100644 src/shared/character/builder.ts delete mode 100644 src/shared/gameplay.ts create mode 100644 src/shared/networking.ts delete mode 100644 src/shared/replicated.ts create mode 100644 src/shared/utils/restorarray.ts diff --git a/.gitignore b/.gitignore index bb3e43c..9a9eba0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /out /include *.tsbuildinfo +flamework.build \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 480840b..5dfb1c8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,5 +11,10 @@ }, "eslint.run": "onType", "eslint.format.enable": true, - "eslint.useFlatConfig": false + "eslint.useFlatConfig": false, + "files.autoSave": "onWindowChange", + "editor.formatOnSave": true, + "files.associations": { + "*.luau": "lua" + } } \ No newline at end of file diff --git a/default.project.json b/default.project.json index 28601d8..0376311 100644 --- a/default.project.json +++ b/default.project.json @@ -20,6 +20,9 @@ "$className": "Folder", "@rbxts": { "$path": "node_modules/@rbxts" + }, + "@flamework": { + "$path": "node_modules/@flamework" } } }, @@ -55,4 +58,4 @@ } } } -} +} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs index 03d5aab..50a2098 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -46,6 +46,9 @@ export default defineConfig([ rules: { "prettier/prettier": "warn", + "@typescript-eslint/no-unused-vars": ["error", { + "varsIgnorePattern": "^[A-Z].*(Service|Controller|Component)$" + }] }, }, ]); diff --git a/package-lock.json b/package-lock.json index aee0c8a..6147690 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,14 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "-": "^0.0.1" + "@flamework/components": "^1.3.2", + "@flamework/core": "^1.3.2", + "@flamework/networking": "^1.3.2" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.37.0", "@rbxts/compiler-types": "^3.0.0-types.0", - "@rbxts/net": "^3.0.10", "@rbxts/services": "^1.5.5", "@rbxts/signal": "^1.1.1", "@rbxts/types": "^1.0.882", @@ -26,17 +27,13 @@ "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", "roblox-ts": "^3.0.0", - "typescript": "^5.9.2" + "typescript": "~5.5.3" } }, - "node_modules/-": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/-/-/--0.0.1.tgz", - "integrity": "sha512-3HfneK3DGAm05fpyj20sT3apkNcvPpCuccOThOPdzz8sY7GgQGe0l93XH9bt+YzibcTIgUAIMoyVJI740RtgyQ==", - "license": "UNLICENSED" - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", @@ -57,9 +54,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -67,13 +64,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -81,44 +78,23 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz", + "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -152,44 +128,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/js": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", - "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", + "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", "dev": true, "license": "MIT", "engines": { @@ -200,9 +142,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -210,19 +152,74 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.16.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@flamework/components": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@flamework/components/-/components-1.3.2.tgz", + "integrity": "sha512-u9a8vwrCiXpG2LXihogsEb5DzDOSTJwxBON6XdQyQmobm0lPOQzRjtwvWRB83wMLtJPjzIs6T2L1Ce00yXw+WA==", + "license": "ISC", + "dependencies": { + "@rbxts/maid": "^1.0.0-ts.1", + "@rbxts/services": "^1.1.5", + "@rbxts/signal": "^1.0.3", + "@rbxts/t": "^2.1.4" + }, + "peerDependencies": { + "@flamework/core": "*" + } + }, + "node_modules/@flamework/core": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@flamework/core/-/core-1.3.2.tgz", + "integrity": "sha512-4/tY5plivbvr4vvwRtxzuym7Nl5eDHM3RAR2nZHuuNz31h2S2CIrCoGHjkod0I6qPpfs4eUw2TiIrvVN8iC8JQ==", + "license": "ISC", + "dependencies": { + "@rbxts/maid": "^1.0.0-ts.1", + "@rbxts/object-utils": "^1.0.4", + "@rbxts/services": "^1.1.4", + "@rbxts/signal": "^1.0.3", + "@rbxts/t": "^3.2.1" + } + }, + "node_modules/@flamework/core/node_modules/@rbxts/t": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@rbxts/t/-/t-3.2.1.tgz", + "integrity": "sha512-/fnf2QSx+TI3HSJ6QW2ikvGQk0mlx/63UXo60pLAKGqbxXiAuTJh88bpKpHw6aCzfFLJAwrVIcgCUOokLMPcag==", + "license": "ISC" + }, + "node_modules/@flamework/networking": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@flamework/networking/-/networking-1.3.2.tgz", + "integrity": "sha512-ImIOe3PDiUjYZBElZOWCDtPmDXwxG0z8syerKRYWHkTWHc9cchRdh6213xoguRDRhmZZ0MVJsIVZ/pCiNq5IYg==", + "license": "ISC", + "dependencies": { + "@rbxts/object-utils": "^1.0.4", + "@rbxts/services": "^1.1.5", + "@rbxts/signal": "^1.0.3", + "@rbxts/t": "^3.1.0" + }, + "peerDependencies": { + "@flamework/core": "*" + } + }, + "node_modules/@flamework/networking/node_modules/@rbxts/t": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@rbxts/t/-/t-3.2.1.tgz", + "integrity": "sha512-/fnf2QSx+TI3HSJ6QW2ikvGQk0mlx/63UXo60pLAKGqbxXiAuTJh88bpKpHw6aCzfFLJAwrVIcgCUOokLMPcag==", + "license": "ISC" + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -333,31 +330,40 @@ "dev": true, "license": "MIT" }, - "node_modules/@rbxts/net": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@rbxts/net/-/net-3.0.10.tgz", - "integrity": "sha512-R+0tKn4/+nmHIVbYgfZsuGq1jxYU5AcKuhyOlSYyzzODTIyJ2QhkyFGjvPSAvEhD+CzeTGKciQt4oy25CWI1oA==", - "dev": true, - "license": "MIT" + "node_modules/@rbxts/maid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rbxts/maid/-/maid-1.1.0.tgz", + "integrity": "sha512-bVWXZ0p2M3OJzPzvN5fY0T4s37ezUMY7EX31Xspp7Ds4C/K9yE4MHMRXjtlNvsYVPmoc5tdhAbpZY02Veix5lg==", + "license": "ISC" + }, + "node_modules/@rbxts/object-utils": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@rbxts/object-utils/-/object-utils-1.0.4.tgz", + "integrity": "sha512-dLLhf022ipV+9i910sOE7kl9losKHoon0WgeerHqVMQA5EYsLUsVT2AxhJuhk8MiDn5oJ2GiFofE/LadY9TpJQ==", + "license": "ISC" }, "node_modules/@rbxts/services": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@rbxts/services/-/services-1.5.5.tgz", - "integrity": "sha512-Hu7QH2ecefS60zpakKG3T2vgABydoOJqpSG7nXr59wFAbPk/cA+OcsntYPHUWyHAat0VFGZ5jNZLTLdiqfssvg==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@rbxts/services/-/services-1.6.0.tgz", + "integrity": "sha512-YH02E1/tGHeMXB0Mam8qPdAZa2fjQWdylEscSL4Zn0RIaQeByYImA2qUsXM3nBdhcyKHDwltzSznDKyCGfFEWA==", "license": "ISC" }, "node_modules/@rbxts/signal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@rbxts/signal/-/signal-1.1.1.tgz", "integrity": "sha512-WX+ONE+ld4pG9PvRkR8OgDld9NpaV1RfXyUIw+Q2oXP/5rehkYzvt20NWtrLAP3NhMc5inYInLd+hnufey6nFw==", - "dev": true, + "license": "ISC" + }, + "node_modules/@rbxts/t": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@rbxts/t/-/t-2.2.1.tgz", + "integrity": "sha512-MoFLHRQdm1tpAviAVxgkQj/ktxtnGBund2HXQj5xRqgYUWuC3kYuLkctuxXiJHUd1o1JzfU/HvVHtZfpqp61tg==", "license": "ISC" }, "node_modules/@rbxts/types": { - "version": "1.0.882", - "resolved": "https://registry.npmjs.org/@rbxts/types/-/types-1.0.882.tgz", - "integrity": "sha512-MTjOCCB2pSG/aaVwHoT1wmsFN7cOl/uiV11cHUX93Mko90kkoe6ZUsqDq0iKjygb2AHT/w6vjvNQYy7NxChLEw==", + "version": "1.0.887", + "resolved": "https://registry.npmjs.org/@rbxts/types/-/types-1.0.887.tgz", + "integrity": "sha512-vhp4vIKEfl1TaBcKxBxU5dTFsVNqLkvefoF9pw/Epb+Jk9T+0g4SFQQtBdCu3UdZcBGK/PWk/IJeEyoRNDMkSw==", "dev": true, "license": "MIT" }, @@ -396,6 +402,21 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@roblox-ts/path-translator/node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/@roblox-ts/path-translator/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -431,6 +452,21 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@roblox-ts/rojo-resolver/node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/@roblox-ts/rojo-resolver/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -453,17 +489,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.0.tgz", - "integrity": "sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz", + "integrity": "sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/type-utils": "8.44.0", - "@typescript-eslint/utils": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/type-utils": "8.46.2", + "@typescript-eslint/utils": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -477,22 +513,32 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.44.0", + "@typescript-eslint/parser": "^8.46.2", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/@typescript-eslint/parser": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.0.tgz", - "integrity": "sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz", + "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", "debug": "^4.3.4" }, "engines": { @@ -508,14 +554,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.0.tgz", - "integrity": "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", + "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.44.0", - "@typescript-eslint/types": "^8.44.0", + "@typescript-eslint/tsconfig-utils": "^8.46.2", + "@typescript-eslint/types": "^8.46.2", "debug": "^4.3.4" }, "engines": { @@ -530,14 +576,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz", - "integrity": "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", + "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0" + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -548,9 +594,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz", - "integrity": "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", + "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", "dev": true, "license": "MIT", "engines": { @@ -565,15 +611,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.0.tgz", - "integrity": "sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz", + "integrity": "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0", - "@typescript-eslint/utils": "8.44.0", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/utils": "8.46.2", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -590,9 +636,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz", - "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", + "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", "dev": true, "license": "MIT", "engines": { @@ -604,16 +650,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz", - "integrity": "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", + "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.44.0", - "@typescript-eslint/tsconfig-utils": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/project-service": "8.46.2", + "@typescript-eslint/tsconfig-utils": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -632,17 +678,43 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.0.tgz", - "integrity": "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", + "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0" + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -657,13 +729,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz", - "integrity": "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", + "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/types": "8.46.2", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -795,13 +867,14 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -995,25 +1068,24 @@ } }, "node_modules/eslint": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", - "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", + "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.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.36.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.38.0", + "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", @@ -1121,6 +1193,212 @@ "typescript": ">=5.2.0" } }, + "node_modules/eslint-plugin-roblox-ts/node_modules/@typescript-eslint/project-service": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.0.tgz", + "integrity": "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.44.0", + "@typescript-eslint/types": "^8.44.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-roblox-ts/node_modules/@typescript-eslint/scope-manager": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz", + "integrity": "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-roblox-ts/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz", + "integrity": "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-roblox-ts/node_modules/@typescript-eslint/type-utils": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.0.tgz", + "integrity": "sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0", + "@typescript-eslint/utils": "8.44.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-roblox-ts/node_modules/@typescript-eslint/types": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz", + "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-roblox-ts/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz", + "integrity": "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.44.0", + "@typescript-eslint/tsconfig-utils": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/visitor-keys": "8.44.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-roblox-ts/node_modules/@typescript-eslint/utils": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.0.tgz", + "integrity": "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.44.0", + "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/typescript-estree": "8.44.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/eslint-plugin-roblox-ts/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz", + "integrity": "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.44.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-roblox-ts/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-roblox-ts/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-roblox-ts/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", @@ -1151,30 +1429,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/js": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", - "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", @@ -1188,29 +1442,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -1438,9 +1669,9 @@ "license": "ISC" }, "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1449,9 +1680,16 @@ "universalify": "^2.0.0" }, "engines": { - "node": ">=14.14" + "node": ">=12" } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1487,6 +1725,25 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -1500,6 +1757,32 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -1537,6 +1820,13 @@ "node": ">=8" } }, + "node_modules/hashids": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hashids/-/hashids-2.3.0.tgz", + "integrity": "sha512-ljM73TE/avEhNnazxaj0Dw3BbEUuLC5yYCQ9RSkSUcT4ZSU6ZebdKCIBJ+xT/DnSYW36E9k82GH1Q6MydSIosQ==", + "dev": true, + "license": "MIT" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -1550,10 +1840,23 @@ "node": ">= 0.4" } }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -1770,6 +2073,19 @@ "dev": true, "license": "MIT" }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -1795,19 +2111,26 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" } }, "node_modules/ms": { @@ -1824,6 +2147,22 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -1924,6 +2263,40 @@ "dev": true, "license": "MIT" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2007,6 +2380,60 @@ ], "license": "MIT" }, + "node_modules/rbxts-transformer-flamework": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rbxts-transformer-flamework/-/rbxts-transformer-flamework-1.3.2.tgz", + "integrity": "sha512-FKAT7+jAmoa2/MZNqZnjZfpSKypNO1+IzRGdHQAjGsKzH8J58Zcbb0fCA/Dydwb4LiPVVYlfgoItrxOCWRh3rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@roblox-ts/rojo-resolver": "^1.0.2", + "ajv": "^8.6.3", + "chalk": "^4.1.2", + "fs-extra": "^10.0.0", + "glob": "9.3", + "hashids": "^2.2.8", + "normalize-package-data": "^3.0.3", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/rbxts-transformer-flamework/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/rbxts-transformer-flamework/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/rbxts-transformer-instances": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rbxts-transformer-instances/-/rbxts-transformer-instances-1.0.1.tgz", + "integrity": "sha512-7h2h/NrJXKl4gPJ9fr1nwn/DGuYeo+6MYH6flcH3xXh1j5MHtRtBcKyqF2octq6XB8xtmDJYyptK2Uwim2+TcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "typescript": "^5.5.3" + } + }, "node_modules/rbxts-transformer-services": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/rbxts-transformer-services/-/rbxts-transformer-services-1.1.1.tgz", @@ -2051,13 +2478,13 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -2113,6 +2540,21 @@ "rbxtsc": "out/CLI/cli.js" } }, + "node_modules/roblox-ts/node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/roblox-ts/node_modules/typescript": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", @@ -2152,9 +2594,9 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -2187,6 +2629,42 @@ "node": ">=8" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -2310,9 +2788,9 @@ } }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2343,6 +2821,27 @@ "punycode": "^2.1.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2397,6 +2896,13 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index bfa1d0b..b616048 100644 --- a/package.json +++ b/package.json @@ -9,14 +9,13 @@ "lint": "eslint" }, "keywords": [], - "author": "", + "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/net": "^3.0.10", "@rbxts/services": "^1.5.5", "@rbxts/signal": "^1.1.1", "@rbxts/types": "^1.0.882", @@ -27,11 +26,15 @@ "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", "roblox-ts": "^3.0.0", - "typescript": "^5.9.2" + "typescript": "~5.5.3" }, "dependencies": { - "-": "^0.0.1" + "@flamework/components": "^1.3.2", + "@flamework/core": "^1.3.2", + "@flamework/networking": "^1.3.2" } } diff --git a/src/client/main.client.ts b/src/client/main.client.ts index 2ad99b6..6e38d71 100644 --- a/src/client/main.client.ts +++ b/src/client/main.client.ts @@ -1,16 +1,20 @@ -import { Players, UserInputService } from "@rbxts/services"; -import Gameplay_Remotes from "shared/gameplay"; +import { UserInputService } from "@rbxts/services"; +import { GameplayClientEvents } from "./networking"; +import { Controller, OnStart } from "@flamework/core"; -const sprint = Gameplay_Remotes.Client.Get("Sprint"); +@Controller() +class GameplayController implements OnStart { + onStart(): void { + UserInputService.InputBegan.Connect((input) => { + if (input.KeyCode === Enum.KeyCode.LeftShift) { + GameplayClientEvents.sprint(true); + } + }); -UserInputService.InputBegan.Connect((input) => { - if (input.KeyCode === Enum.KeyCode.LeftShift) { - sprint.SendToServer(true); + UserInputService.InputEnded.Connect((input) => { + if (input.KeyCode === Enum.KeyCode.LeftShift) { + GameplayClientEvents.sprint(false); + } + }); } -}); - -UserInputService.InputEnded.Connect((input) => { - if (input.KeyCode === Enum.KeyCode.LeftShift) { - sprint.SendToServer(false); - } -}); +} diff --git a/src/client/networking.ts b/src/client/networking.ts new file mode 100644 index 0000000..3408ea8 --- /dev/null +++ b/src/client/networking.ts @@ -0,0 +1,3 @@ +import { GameplayEvents } from "shared/networking"; + +export const GameplayClientEvents = GameplayEvents.createClient({}); diff --git a/src/server/command.server.ts b/src/server/command.server.ts index a8016b7..10854e9 100644 --- a/src/server/command.server.ts +++ b/src/server/command.server.ts @@ -1,29 +1,35 @@ +import { OnInit, OnStart, Service } from "@flamework/core"; import { Players, TextChatService } from "@rbxts/services"; import { makeRagdoll, stopRagdoll, takeNetworkOwner } from "shared/ragdoll"; -const ragdollCommand = new Instance("TextChatCommand"); -ragdollCommand.Parent = TextChatService.WaitForChild("TextChatCommands"); -ragdollCommand.PrimaryAlias = "/ragdoll"; -ragdollCommand.Triggered.Connect((TextSource) => { - const player = Players.GetPlayerByUserId(TextSource.UserId); +/** + * Setup Chat Command + */ +@Service() +class CommandsService implements OnStart { + onStart(): void { + const ragdollCommand = new TextChatCommand(); + ragdollCommand.Parent = TextChatService.WaitForChild("TextChatCommands"); + ragdollCommand.PrimaryAlias = "/ragdoll"; + ragdollCommand.Triggered.Connect((TextSource) => { + const player = Players.GetPlayerByUserId(TextSource.UserId); + makeRagdoll(player!.Character!); + }); - makeRagdoll(player!.Character!); -}); + const unragdollCommand = new TextChatCommand(); + unragdollCommand.Parent = TextChatService.WaitForChild("TextChatCommands"); + unragdollCommand.PrimaryAlias = "/unragdoll"; + unragdollCommand.Triggered.Connect((TextSource) => { + const player = Players.GetPlayerByUserId(TextSource.UserId); + stopRagdoll(player!.Character!); + }); -const unragdollCommand = new Instance("TextChatCommand"); -unragdollCommand.Parent = TextChatService.WaitForChild("TextChatCommands"); -unragdollCommand.PrimaryAlias = "/unragdoll"; -unragdollCommand.Triggered.Connect((TextSource) => { - const player = Players.GetPlayerByUserId(TextSource.UserId); - - stopRagdoll(player!.Character!); -}); - -const takeownerCommand = new Instance("TextChatCommand"); -takeownerCommand.Parent = TextChatService.WaitForChild("TextChatCommands"); -takeownerCommand.PrimaryAlias = "/takeowner"; -takeownerCommand.Triggered.Connect((TextSource) => { - const player = Players.GetPlayerByUserId(TextSource.UserId); - - takeNetworkOwner(player!.Character!); -}); + const takeownerCommand = new TextChatCommand(); + takeownerCommand.Parent = TextChatService.WaitForChild("TextChatCommands"); + takeownerCommand.PrimaryAlias = "/takeowner"; + takeownerCommand.Triggered.Connect((TextSource) => { + const player = Players.GetPlayerByUserId(TextSource.UserId); + takeNetworkOwner(player!.Character!); + }); + } +} diff --git a/src/server/decoration.server.ts b/src/server/decoration.server.ts index 5f7f4b4..29fce38 100644 --- a/src/server/decoration.server.ts +++ b/src/server/decoration.server.ts @@ -1,12 +1,21 @@ +import { OnStart, Service } from "@flamework/core"; import { ReplicatedStorage } from "@rbxts/services"; import { randomDecorationPlace } from "shared/build"; -const flowers = ReplicatedStorage.FindFirstChild("Decoration")?.FindFirstChild("FlowerTypes")?.GetChildren(); -if (flowers) { - randomDecorationPlace("Build_Flower", flowers as Model[]); -} +/** Place Decorator on map. */ +@Service() +class DecoratorService implements OnStart { + onStart(): void { + //#region Castle + const flowers = ReplicatedStorage.FindFirstChild("Decoration")?.FindFirstChild("FlowerTypes")?.GetChildren(); + if (flowers) { + randomDecorationPlace("Build_Flower", flowers as Model[]); + } -const rocks = ReplicatedStorage.FindFirstChild("Decoration")?.FindFirstChild("RockTypes")?.GetChildren(); -if (rocks) { - randomDecorationPlace("Build_Gravel", rocks as Model[]); + const rocks = ReplicatedStorage.FindFirstChild("Decoration")?.FindFirstChild("RockTypes")?.GetChildren(); + if (rocks) { + randomDecorationPlace("Build_Gravel", rocks as Model[]); + } + //#endregion + } } diff --git a/src/server/gameplay.server.ts b/src/server/gameplay.server.ts index a27da18..ee397e3 100644 --- a/src/server/gameplay.server.ts +++ b/src/server/gameplay.server.ts @@ -1,62 +1,74 @@ import { Players } from "@rbxts/services"; -import Gameplay_Remotes from "shared/gameplay"; +import { GameplayServerEvents } from "./networking"; +import { OnStart, Service } from "@flamework/core"; +import { getRagdollEvent, makeRagdoll, prepareRagdoll, stopRagdoll, waitMotionLess } from "shared/ragdoll"; -const sprint = Gameplay_Remotes.Server.Get("Sprint"); +/** + * Service related to Gameplay. + * - Contains Script related to Sprinting, Ragdoll, etc. + */ +@Service() +class GameplayService implements OnStart { + // Sprint config. + private base_sprint_speed = 16; + private sprint_speed = 1.5; + private is_running = new Map(); -const RunAnim = new Instance("Animation"); -RunAnim.AnimationId = "rbxassetid://88297455683117"; -const base_sprint_speed = 16; -const sprint_speed = 1.5; -const runanim = new Map(); -const isrunning = new Map(); + onStart(): void { + // Handle Animation. + const RunAnim = new Animation(); + RunAnim.AnimationId = "rbxassetid://88297455683117"; -Players.PlayerAdded.Connect((player) => { - let runningConn: RBXScriptConnection; + Players.PlayerAdded.Connect((player) => { + let running_connection: RBXScriptConnection; - player.CharacterAdded.Connect((character) => { - const humanoid = character.FindFirstChildWhichIsA("Humanoid"); - if (humanoid) { - const animator = humanoid.FindFirstChildOfClass("Animator"); - const anim = animator!.LoadAnimation(RunAnim); - anim.Priority = Enum.AnimationPriority.Action; - runanim.set(player.UserId, anim); + player.CharacterAdded.Connect((character) => { + prepareRagdoll(character); + getRagdollEvent(character).Connect(() => { + makeRagdoll(character); + waitMotionLess(character, 0.1).Wait(); + stopRagdoll(character); + }); - runningConn = humanoid.Running.Connect((speed) => { - if (isrunning.get(player.UserId)) { - if (speed > 2) { - if (!anim.IsPlaying) anim.Play(0.2); - } else { - if (anim.IsPlaying) anim?.Stop(0.2); - } - } else if (anim?.IsPlaying) { - anim?.Stop(1); + const humanoid = character.FindFirstChildWhichIsA("Humanoid"); + if (humanoid) { + // Setup the animation. + const animator = humanoid.WaitForChild("Animator") as Animator; + const animation_track = animator.LoadAnimation(RunAnim); + animation_track.Priority = Enum.AnimationPriority.Action; + + // Change the animation when the running speed change. + running_connection = humanoid.Running.Connect((speed) => { + if (this.is_running.get(player.UserId)) { + if (speed > 2) { + if (!animation_track.IsPlaying) animation_track.Play(0.2); + } else { + if (animation_track.IsPlaying) animation_track?.Stop(0.2); + } + } else if (animation_track?.IsPlaying) { + animation_track?.Stop(1); + } + }); } }); - } - }); + // Clean up the connection when the character died. + player.CharacterRemoving.Once(() => running_connection.Disconnect()); + }); - player.CharacterRemoving.Once(() => runningConn.Disconnect()); -}); - -sprint.Connect((player, enabled) => { - const character = player.Character; - isrunning.set(player.UserId, enabled); - if (character) { - const humanoid = character.FindFirstChildOfClass("Humanoid"); - if (humanoid) { - if (enabled) { - humanoid.WalkSpeed = base_sprint_speed * sprint_speed; - // if (humanoid.GetStateEnabled(Enum.HumanoidStateType.Running)) { - // const anim = runanim.get(player.UserId); - // anim?.Play(0.2); - // } - } else { - humanoid.WalkSpeed = base_sprint_speed; - // if (humanoid.GetStateEnabled(Enum.HumanoidStateType.Running)) { - // const anim = runanim.get(player.UserId); - // anim?.Stop(1); - // } + // Change the sprint state with networking + GameplayServerEvents.sprint.connect((player, enabled) => { + const character = player.Character; + this.is_running.set(player.UserId, enabled); + if (character) { + const humanoid = character.FindFirstChildOfClass("Humanoid"); + if (humanoid) { + if (enabled) { + humanoid.WalkSpeed = this.base_sprint_speed * this.sprint_speed; + } else { + humanoid.WalkSpeed = this.base_sprint_speed; + } + } } - } + }); } -}); +} diff --git a/src/server/main.server.ts b/src/server/main.server.ts deleted file mode 100644 index 5ca91c9..0000000 --- a/src/server/main.server.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Players } from "@rbxts/services"; -import { makeRagdoll, stopRagdoll, waitMotionLess } from "shared/ragdoll"; - -Players.PlayerAdded.Connect((player) => { - player.CharacterAdded.Connect((character) => { - const humanoid = character.FindFirstChildOfClass("Humanoid"); - if (!humanoid) return; - humanoid.FreeFalling.Connect(() => { - makeRagdoll(character); - waitMotionLess(character, 0.1).Wait(); - stopRagdoll(character); - }); - }); -}); diff --git a/src/server/networking.ts b/src/server/networking.ts new file mode 100644 index 0000000..2eecf1e --- /dev/null +++ b/src/server/networking.ts @@ -0,0 +1,3 @@ +import { GameplayEvents } from "shared/networking"; + +export const GameplayServerEvents = GameplayEvents.createServer({}); diff --git a/src/shared/character/builder.ts b/src/shared/character/builder.ts new file mode 100644 index 0000000..8290998 --- /dev/null +++ b/src/shared/character/builder.ts @@ -0,0 +1,11 @@ +class AbilityBuilder { + constructor() {} +} + +class PasiveBuilder { + constructor() {} +} + +class CharacterBuilder { + constructor() {} +} diff --git a/src/shared/gameplay.ts b/src/shared/gameplay.ts deleted file mode 100644 index 7402376..0000000 --- a/src/shared/gameplay.ts +++ /dev/null @@ -1,7 +0,0 @@ -import Net from "@rbxts/net"; - -const Gameplay_Remotes = Net.Definitions.Create({ - Sprint: Net.Definitions.ClientToServerEvent<[enabled: boolean]>(), -}); - -export default Gameplay_Remotes; diff --git a/src/shared/networking.ts b/src/shared/networking.ts new file mode 100644 index 0000000..0b57104 --- /dev/null +++ b/src/shared/networking.ts @@ -0,0 +1,11 @@ +import { Networking } from "@flamework/networking"; + +const { createEvent, createFunction } = Networking; + +interface GameplayClient { + sprint(enabled: boolean): void; +} + +interface GameplayServer {} + +export const GameplayEvents = createEvent(); diff --git a/src/shared/ragdoll.ts b/src/shared/ragdoll.ts index 2035dd4..73d5772 100644 --- a/src/shared/ragdoll.ts +++ b/src/shared/ragdoll.ts @@ -1,5 +1,50 @@ +import { RunService } from "@rbxts/services"; import Signal from "@rbxts/signal"; +class RagdollHandler { + private character: Model; + private humanoid: Humanoid; + constructor(character: Model) { + this.character = character; + this.humanoid = character.FindFirstAncestorOfClass("Humanoid")!; + } + + prepareRagdoll() { + const children = this.character.GetDescendants(); + children.forEach((motor) => { + if (motor.IsA("Motor6D")) { + const ballsocketconstraint = new BallSocketConstraint(), + attachment0 = new Attachment(), + attachment1 = new Attachment(); + + attachment0.CFrame = motor.C0; + attachment0.Parent = motor.Part0; + attachment0.AddTag("Ragdoll"); + attachment0.Name = motor.Name; + + attachment1.CFrame = motor.C1; + attachment1.Parent = motor.Part1; + attachment1.AddTag("Ragdoll"); + attachment1.Name = motor.Name; + + ballsocketconstraint.Attachment0 = attachment0; + ballsocketconstraint.Attachment1 = attachment1; + ballsocketconstraint.Parent = motor.Parent; + ballsocketconstraint.AddTag("Ragdoll"); + ballsocketconstraint.Enabled = false; + + if (motor.Name === "Left Hip") { + attachment0.CFrame = attachment0.CFrame.add(new Vector3(0.5, 0, 0)); + attachment1.CFrame = attachment1.CFrame.add(new Vector3(0.5, 0, 0)); + } else if (motor.Name === "Right Hip") { + attachment0.CFrame = attachment0.CFrame.sub(new Vector3(0.5, 0, 0)); + attachment1.CFrame = attachment1.CFrame.sub(new Vector3(0.5, 0, 0)); + } + } + }); + } +} + /** * Takes the Network Ownership of a player's character. * @param character The character of a player. @@ -28,36 +73,57 @@ export function releaseNetworkOwnership(character: Model) { }); } +export function prepareRagdoll(character: Model) { + const children = character.GetDescendants(); + const humanoid = character.FindFirstChildOfClass("Humanoid")!; + humanoid.RequiresNeck = false; + children.forEach((motor) => { + if (motor.IsA("Motor6D")) { + const ballsocketconstraint = new BallSocketConstraint(), + attachment0 = new Attachment(), + attachment1 = new Attachment(); + + attachment0.CFrame = motor.C0; + attachment0.Parent = motor.Part0; + attachment0.AddTag("Ragdoll"); + attachment0.Name = motor.Name; + + attachment1.CFrame = motor.C1; + attachment1.Parent = motor.Part1; + attachment1.AddTag("Ragdoll"); + attachment1.Name = motor.Name; + + ballsocketconstraint.Attachment0 = attachment0; + ballsocketconstraint.Attachment1 = attachment1; + ballsocketconstraint.Parent = motor.Parent; + ballsocketconstraint.AddTag("Ragdoll"); + ballsocketconstraint.Enabled = false; + + if (motor.Name === "Left Hip") { + attachment0.CFrame = attachment0.CFrame.add(new Vector3(0.5, 0, 0)); + attachment1.CFrame = attachment1.CFrame.add(new Vector3(0.5, 0, 0)); + } else if (motor.Name === "Right Hip") { + attachment0.CFrame = attachment0.CFrame.sub(new Vector3(0.5, 0, 0)); + attachment1.CFrame = attachment1.CFrame.sub(new Vector3(0.5, 0, 0)); + } + } + }); +} + /** * Makes the player's character Ragdoll by creating attachments for each part of the R6 Model. * @param character The character of a player. */ export function makeRagdoll(character: Model) { takeNetworkOwner(character); - const children = character.GetDescendants(); const humanoid = character.FindFirstChildOfClass("Humanoid")!; - humanoid.RequiresNeck = false; humanoid.ChangeState(Enum.HumanoidStateType.Physics); - children.forEach((motor) => { - if (motor.IsA("Motor6D")) { - const ballsocketconstraint = new Instance("BallSocketConstraint"), - attachment0 = new Instance("Attachment"), - attachment1 = new Instance("Attachment"); - - attachment0.CFrame = motor.C0; - attachment0.Parent = motor.Part0; - attachment0.AddTag("Ragdoll"); - - attachment1.CFrame = motor.C1; - attachment1.Parent = motor.Part1; - attachment1.AddTag("Ragdoll"); - - ballsocketconstraint.Attachment0 = attachment0; - ballsocketconstraint.Attachment1 = attachment1; - ballsocketconstraint.Parent = motor.Parent; - ballsocketconstraint.AddTag("Ragdoll"); - - motor.Enabled = false; + character.GetDescendants().forEach((des) => { + if (des.HasTag("Ragdoll") && des.IsA("BallSocketConstraint")) { + des.Enabled = true; + } + if (des.IsA("Motor6D")) { + des.Enabled = false; } }); takeNetworkOwner(character); @@ -66,8 +132,8 @@ export function makeRagdoll(character: Model) { export function stopRagdoll(character: Model) { releaseNetworkOwnership(character); character.GetDescendants().forEach((des) => { - if (des.HasTag("Ragdoll")) { - des.Destroy(); + if (des.HasTag("Ragdoll") && des.IsA("BallSocketConstraint")) { + des.Enabled = false; } if (des.IsA("Motor6D")) { des.Enabled = true; @@ -95,4 +161,28 @@ export function waitMotionLess(character: Model, threshold: number) { signal.Fire(); }); return signal; -} \ No newline at end of file +} + +export function getRagdollEvent(character: Model) { + const humanoid = character.FindFirstChildOfClass("Humanoid"); + const root = character.WaitForChild("HumanoidRootPart") as Part; + if (!humanoid) throw "nya UwU eat my paw."; + const event = new Signal(); + let fired = false; + let beatEvent: RBXScriptConnection; + humanoid.FreeFalling.Connect((active) => { + if (active) { + beatEvent = RunService.Heartbeat.Connect(() => { + if (root.AssemblyLinearVelocity.Y < -38 && !fired) { + event.Fire(); + fired = true; + } + }); + } else { + beatEvent.Disconnect(); + fired = false; + } + }); + + return event; +} diff --git a/src/shared/replicated.ts b/src/shared/replicated.ts deleted file mode 100644 index e5478b6..0000000 --- a/src/shared/replicated.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Net from "@rbxts/net"; -const Remotes = Net.Definitions.Create({ - SendAttack: Net.Definitions.ClientToServerEvent<[attackId: number]>(), -}); -export default Remotes; diff --git a/src/shared/utils/restorarray.ts b/src/shared/utils/restorarray.ts new file mode 100644 index 0000000..393f9e8 --- /dev/null +++ b/src/shared/utils/restorarray.ts @@ -0,0 +1,6 @@ +export type RestOrArray = Type[] | [Type[]]; + +export function normalizeArray(arr: RestOrArray): ItemType[] { + if (typeIs(arr[0], "table")) return [...arr[0]]; + return arr as ItemType[]; +} diff --git a/tsconfig.json b/tsconfig.json index 0e5ea41..a0c642d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,13 +15,31 @@ "moduleDetection": "force", "strict": true, "target": "ESNext", - "typeRoots": ["node_modules/@rbxts"], - + "typeRoots": [ + "node_modules/@rbxts", + "node_modules/@flamework" + ], // configurable "rootDir": "src", "outDir": "out", "baseUrl": "src", "incremental": true, - "tsBuildInfoFile": "out/tsconfig.tsbuildinfo" - } -} + "tsBuildInfoFile": "out/tsconfig.tsbuildinfo", + "plugins": [ + { + "transform": "rbxts-transformer-flamework", + "obfuscation": true + }, + { + "transform": "rbxts-transformer-instances" + }, + { + "transform": "rbxts-transformer-services" + } + ] + }, + "include": [ + "src/**/*", + "node_modules/rbxts-transformer-instances" + ] +} \ No newline at end of file