diff --git a/README.md b/README.md
index cc0f306..a60d210 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,9 @@
-
-

+
+

+
Zircon (Beta)
A clean, sleek, runtime debugging console for Roblox
+
+

@@ -66,7 +69,7 @@ ZirconServer.Registry.RegisterFunction(
message,
context.GetExecutor()
)),
- [ZirconServer.Registry.User]
+ [ZirconServer.Registry.GetGroups("User")]
)
```
diff --git a/example/server/index.server.ts b/example/server/index.server.ts
index 62f0861..eef0998 100644
--- a/example/server/index.server.ts
+++ b/example/server/index.server.ts
@@ -1,6 +1,6 @@
import Log, { Logger } from "@rbxts/log";
import { Workspace } from "@rbxts/services";
-import Zircon, { ZirconServer } from "@zircon";
+import Zircon, { ZirconConfigurationBuilder, ZirconServer } from "@zircon";
import ZirconPrint from "BuiltIn/Print";
import { ZirconEnumBuilder } from "Class/ZirconEnumBuilder";
import { ZirconFunctionBuilder } from "Class/ZirconFunctionBuilder";
@@ -14,21 +14,12 @@ Log.SetLogger(
.Create(),
);
-enum ExistingEnumType {
- EnumA,
- EnumB,
-}
-
const TestEnum = ZirconServer.Registry.RegisterEnumFromArray(
"TestEnum",
["Value1", "Value2"],
- [ZirconServer.Registry.User],
+ ZirconServer.Registry.GetGroups("User"),
);
-const ExistingEnum = ZirconServer.Registry.RegisterEnum(new ZirconEnumBuilder("test").FromEnum(ExistingEnumType), [
- ZirconServer.Registry.User,
-]);
-
ZirconServer.Registry.RegisterFunction(
new ZirconFunctionBuilder("kill")
.AddArgument("player?")
@@ -38,67 +29,7 @@ ZirconServer.Registry.RegisterFunction(
target.Character?.BreakJoints();
Log.Info("Killed {target}", target);
}),
- [ZirconServer.Registry.User],
-);
-
-ZirconServer.Registry.RegisterFunction(
- new ZirconFunctionBuilder("test_enum").AddArgument(TestEnum).Bind((context, value) => {
- value.Match({
- Value2: () => {
- Log.Info("Got given enum item 2 (member)");
- },
- Value1: () => {
- Log.Info("Got given enum item 1 (member)");
- },
- });
- TestEnum.Match(value, {
- Value1: () => {
- Log.Info("Got given enum item 1 (parent)");
- },
- Value2: () => {
- Log.Info("Got given enum item 2 (parent)");
- },
- });
- }),
- [ZirconServer.Registry.User],
-);
-
-ZirconServer.Registry.RegisterFunction(
- new ZirconFunctionBuilder("test_enum2").AddArgument(ExistingEnum.GetMemberType()).Bind((context, value) => {
- Log.Info("Got {NumberValue} ({StringValue})", ExistingEnumType[value.GetName()], value.GetName());
- }),
- [ZirconServer.Registry.User],
-);
-
-ZirconServer.Registry.RegisterFunction(
- new ZirconFunctionBuilder("print_message")
- .AddArgument("string")
- .Bind((context, message) => Log.Info("Zircon says {Message} from {Player}", message, context.GetExecutor())),
- [ZirconServer.Registry.User],
-);
-
-ZirconServer.Registry.RegisterNamespace(
- new ZirconNamespaceBuilder("example")
- .AddFunction(
- new ZirconFunctionBuilder("print").Bind((context, ...args) => {
- Log.Info("[Example print] " + args.map((a) => tostring(a)).join(" "));
- }),
- )
- .AddFunction(
- new ZirconFunctionBuilder("test").Bind((context) => {
- Log.Info("Test!");
- }),
- )
- .AddFunction(ZirconPrint)
- .Build(),
- [ZirconServer.Registry.User],
-);
-
-ZirconServer.Registry.RegisterFunction(
- new ZirconFunctionBuilder("print").Bind((context, ...args) => {
- Log.Info(args.map((a) => tostring(a)).join(" "));
- }),
- [ZirconServer.Registry.User],
+ ZirconServer.Registry.GetGroups("User"),
);
class Example {
@@ -129,10 +60,60 @@ Promise.delay(5).then(() => {
Log.Fatal("Fatal message here");
});
-// game.GetService("Players").PlayerAdded.Connect((player) => {
-// ZirconServer.Registry.AddPlayerToGroups(player, ["creator"]);
-// });
-
-// for (const player of game.GetService("Players").GetPlayers()) {
-// Zircon.Server.Registry.AddPlayerToGroups(player, ["creator"]);
-// }
+ZirconServer.Registry.Init(
+ new ZirconConfigurationBuilder()
+ .CreateDefaultCreatorGroup()
+ .CreateDefaultUserGroup()
+ .AddFunction(
+ new ZirconFunctionBuilder("print").Bind((context, ...args) => {
+ Log.Info(args.map((a) => tostring(a)).join(" "));
+ }),
+ ["User"],
+ )
+ .AddNamespace(
+ new ZirconNamespaceBuilder("example")
+ .AddFunction(
+ new ZirconFunctionBuilder("print").Bind((context, ...args) => {
+ Log.Info("[Example print] " + args.map((a) => tostring(a)).join(" "));
+ }),
+ )
+ .AddFunction(
+ new ZirconFunctionBuilder("test").Bind((context) => {
+ Log.Info("Test!");
+ }),
+ )
+ .AddFunction(ZirconPrint)
+ .Build(),
+ ["User"],
+ )
+ .AddFunction(
+ new ZirconFunctionBuilder("print_message")
+ .AddArgument("string")
+ .Bind((context, message) =>
+ Log.Info("Zircon says {Message} from {Player}", message, context.GetExecutor()),
+ ),
+ ["User"],
+ )
+ .AddFunction(
+ new ZirconFunctionBuilder("test_enum").AddArgument(TestEnum).Bind((context, value) => {
+ value.Match({
+ Value2: () => {
+ Log.Info("Got given enum item 2 (member)");
+ },
+ Value1: () => {
+ Log.Info("Got given enum item 1 (member)");
+ },
+ });
+ TestEnum.Match(value, {
+ Value1: () => {
+ Log.Info("Got given enum item 1 (parent)");
+ },
+ Value2: () => {
+ Log.Info("Got given enum item 2 (parent)");
+ },
+ });
+ }),
+ ["User"],
+ )
+ .Build(),
+);
diff --git a/package-lock.json b/package-lock.json
index dd7faed..fb5f0e3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,19 +1,19 @@
{
"name": "@rbxts/zircon",
- "version": "0.11.0-beta.0",
+ "version": "0.13.0-beta.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@rbxts/zircon",
- "version": "0.11.0-beta.0",
- "license": "ISC",
+ "version": "0.13.0-beta.0",
+ "license": "MIT",
"dependencies": {
"@rbxts/flipper": "^2.0.1",
"@rbxts/log": "0.5.0-beta.1",
"@rbxts/maid": "^1.0.0-ts.1",
"@rbxts/message-templates": "^0.3.2",
- "@rbxts/net": "^2.1.4",
+ "@rbxts/net": "^3.0.0-alpha.0",
"@rbxts/roact": "1.4.0-ts.2",
"@rbxts/roact-rodux": "0.2.2-ts.5",
"@rbxts/rodux": "3.0.0-ts.3",
@@ -26,7 +26,7 @@
"@rbxts/zirconium": "^1.0.3"
},
"devDependencies": {
- "@rbxts/compiler-types": "1.2.3-types.1",
+ "@rbxts/compiler-types": "1.2.7-types.1",
"@rbxts/types": "^1.0.537",
"@typescript-eslint/eslint-plugin": "^4.4.1",
"@typescript-eslint/parser": "^4.4.1",
@@ -37,11 +37,11 @@
"eslint-plugin-prettier": "^3.1.4",
"eslint-plugin-roblox-ts": "0.0.24",
"prettier": "^2.1.2",
- "rbxts-transform-debug": "1.0.0-rc.1",
- "rbxts-transform-env": "1.0.0-rc.0",
+ "rbxts-transform-debug": "1.0.0-ts4.4",
+ "rbxts-transform-env": "1.0.0-ts4.4",
"rbxts-transformer-services": "^1.0.0",
- "roblox-ts": "^1.1.1",
- "typescript": "=4.3.5"
+ "roblox-ts": "^1.2.7",
+ "typescript": "=4.4.4"
}
},
"node_modules/@babel/code-frame": {
@@ -150,9 +150,9 @@
}
},
"node_modules/@rbxts/compiler-types": {
- "version": "1.2.3-types.1",
- "resolved": "https://registry.npmjs.org/@rbxts/compiler-types/-/compiler-types-1.2.3-types.1.tgz",
- "integrity": "sha512-SXXIBazyJ7N6d2xcy471/kqZZpCv7EDOWrRJ45jcv3g00VQaZwYl4Elr10woqRloIblQanwJ7yUqGXAsWv7iuQ==",
+ "version": "1.2.7-types.1",
+ "resolved": "https://registry.npmjs.org/@rbxts/compiler-types/-/compiler-types-1.2.7-types.1.tgz",
+ "integrity": "sha512-zr3QIJDgLN2dyPYSy4QwDRiZDm8BwQeUE8tsglPDgbVLJonaK7+PAqb1hoqZJ3ReQdZUElSKru9yAfI1Z0MOug==",
"dev": true
},
"node_modules/@rbxts/flipper": {
@@ -179,9 +179,9 @@
"integrity": "sha512-79onYskH3pgrBT73Zs+biQ31vAVvupKQaxGNWGjyGsxwNhO2YaN/qkut0bvOshaGa+ZzqAXApRVrN8ifIMPiMQ=="
},
"node_modules/@rbxts/net": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@rbxts/net/-/net-2.1.4.tgz",
- "integrity": "sha512-9tgWD3batonF5Yal53+0br8h/god/8xD4QVCX+ir5+yotGq6RkxqpUvfnjs1AEVQBvFQ5fkLlbfPJ/4Ip/B/ww=="
+ "version": "3.0.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@rbxts/net/-/net-3.0.0-alpha.0.tgz",
+ "integrity": "sha512-QwDBHNpBbWJEEUKpF7pseuUk8xXZT+VFZ4kikEsby2HHu0W4DGZzDnpTq4UIfkiI1jtFZFAqW04NJdvv5P4m0w=="
},
"node_modules/@rbxts/roact": {
"version": "1.4.0-ts.2",
@@ -476,9 +476,9 @@
}
},
"node_modules/ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
@@ -536,15 +536,6 @@
"node": ">=4"
}
},
- "node_modules/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
"node_modules/balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@@ -680,24 +671,24 @@
}
},
"node_modules/chokidar": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
- "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+ "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
"dev": true,
"dependencies": {
- "anymatch": "~3.1.1",
+ "anymatch": "~3.1.2",
"braces": "~3.0.2",
- "glob-parent": "~5.1.0",
+ "glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
- "readdirp": "~3.5.0"
+ "readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"optionalDependencies": {
- "fsevents": "~2.3.1"
+ "fsevents": "~2.3.2"
}
},
"node_modules/cliui": {
@@ -1359,18 +1350,17 @@
"dev": true
},
"node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
+ "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
"dev": true,
"dependencies": {
- "at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=12"
}
},
"node_modules/fs.realpath": {
@@ -1456,9 +1446,9 @@
}
},
"node_modules/glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.1"
@@ -1503,9 +1493,9 @@
}
},
"node_modules/graceful-fs": {
- "version": "4.2.6",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
- "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
+ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
"dev": true
},
"node_modules/has": {
@@ -1768,6 +1758,18 @@
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
"dev": true
},
+ "node_modules/lookpath": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/lookpath/-/lookpath-1.2.2.tgz",
+ "integrity": "sha512-k2Gmn8iV6qdME3ztZC2spubmQISimFOPLuQKiPaLcVdRz0IpdxrNClVepMlyTJlhodm/zG/VfbkWERm3kUIh+Q==",
+ "dev": true,
+ "bin": {
+ "lookpath": "bin/lookpath.js"
+ },
+ "engines": {
+ "npm": ">=6.13.4"
+ }
+ },
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -2128,28 +2130,28 @@
}
},
"node_modules/rbxts-transform-debug": {
- "version": "1.0.0-rc.1",
- "resolved": "https://registry.npmjs.org/rbxts-transform-debug/-/rbxts-transform-debug-1.0.0-rc.1.tgz",
- "integrity": "sha512-b+iRejvRlLX0axchSw9lHQ4TF6m1JPpY55UoncAJPtViUnbdShAvxb3WWdbc2oO9/DqLnfxd7jPHSdabQmz27w==",
+ "version": "1.0.0-ts4.4",
+ "resolved": "https://registry.npmjs.org/rbxts-transform-debug/-/rbxts-transform-debug-1.0.0-ts4.4.tgz",
+ "integrity": "sha512-45b5Jq0n5iZ/iCvq/5MGKYzxvDpvKw6fBRI/uQ2W4HumH1cNRwcqpUdXe46CnXm0Q47bJY7FxVlgOdZlV2qafg==",
"dev": true,
"dependencies": {
"chalk": "^4.1.0",
"colors": "^1.4.0",
"dotenv": "^8.2.0",
"execa": "^5.1.1",
- "typescript": "=4.3.5"
+ "typescript": "=4.4.4"
}
},
"node_modules/rbxts-transform-env": {
- "version": "1.0.0-rc.0",
- "resolved": "https://registry.npmjs.org/rbxts-transform-env/-/rbxts-transform-env-1.0.0-rc.0.tgz",
- "integrity": "sha512-EkGQZGcoXKxxL6N3TFT5m3tHmY8xwjVcCP+Zyvt9NrGOWSBtHMoP79m82Y4lvAORzAgC3nWsb7pl1kAndY/wEg==",
+ "version": "1.0.0-ts4.4",
+ "resolved": "https://registry.npmjs.org/rbxts-transform-env/-/rbxts-transform-env-1.0.0-ts4.4.tgz",
+ "integrity": "sha512-7u2DZcoaVgBC1zz8bVtx1iEh/ijwMBGPgsBRxc6qV4j/swklIX4r7JE2rEk4wYRST1Imcx250BX1HEx3HyObWw==",
"dev": true,
"dependencies": {
"chalk": "^4.1.1",
"colors": "^1.4.0",
"dotenv": "^8.2.0",
- "typescript": "=4.3.5"
+ "typescript": "=4.4.4"
}
},
"node_modules/rbxts-transformer-services": {
@@ -2177,9 +2179,9 @@
}
},
"node_modules/readdirp": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
- "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"dependencies": {
"picomatch": "^2.2.1"
@@ -2225,12 +2227,12 @@
"dev": true
},
"node_modules/resolve": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
- "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
"dev": true,
"dependencies": {
- "is-core-module": "^2.1.0",
+ "is-core-module": "^2.2.0",
"path-parse": "^1.0.6"
},
"funding": {
@@ -2269,29 +2271,29 @@
}
},
"node_modules/roblox-ts": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/roblox-ts/-/roblox-ts-1.1.1.tgz",
- "integrity": "sha512-oA4eQ7DoP3arhJGYPDHeaZWq8E+KNJkp1HfNwgep2/XsdnuBQXEdsLt3F2U/lInbc2NeU/3r480NNAiGYi2FZQ==",
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/roblox-ts/-/roblox-ts-1.2.7.tgz",
+ "integrity": "sha512-wxwMfdWwN1RwWj3ZrKYGXHqc3eZ1SvLoZ9RkphM7ClJrNfahrCfCnUJUuAXQ0fIBktbAKAUPBPqjEBl6yNfDZw==",
"dev": true,
"dependencies": {
- "ajv": "^8.0.1",
- "byots": "^4.1.0-dev.20201102.16.32",
- "chokidar": "^3.4.3",
- "fs-extra": "^9.0.1",
- "kleur": "^4.1.3",
- "prompts": "^2.4.0",
- "resolve": "^1.19.0",
- "typescript": "=4.2.3",
- "yargs": "^16.2.0"
+ "ajv": "^8.6.3",
+ "chokidar": "^3.5.2",
+ "fs-extra": "^10.0.0",
+ "kleur": "^4.1.4",
+ "lookpath": "^1.2.2",
+ "prompts": "^2.4.1",
+ "resolve": "^1.20.0",
+ "typescript": "=4.4.4",
+ "yargs": "^17.2.0"
},
"bin": {
"rbxtsc": "out/CLI/cli.js"
}
},
"node_modules/roblox-ts/node_modules/ajv": {
- "version": "8.0.5",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.0.5.tgz",
- "integrity": "sha512-RkiLa/AeJx7+9OvniQ/qeWu0w74A8DiPPBclQ6ji3ZQkv5KamO+QGpqmi7O4JIw3rHGUXZ6CoP9tsAkn3gyazg==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
+ "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
"dev": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
@@ -2370,32 +2372,19 @@
"dev": true
},
"node_modules/roblox-ts/node_modules/string-width": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
- "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
+ "strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
- "node_modules/roblox-ts/node_modules/typescript": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
- "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
"node_modules/roblox-ts/node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -2423,30 +2412,30 @@
}
},
"node_modules/roblox-ts/node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "version": "17.3.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz",
+ "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==",
"dev": true,
"dependencies": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
- "string-width": "^4.2.0",
+ "string-width": "^4.2.3",
"y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
+ "yargs-parser": "^21.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=12"
}
},
"node_modules/roblox-ts/node_modules/yargs-parser": {
- "version": "20.2.7",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz",
- "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==",
+ "version": "21.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz",
+ "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==",
"dev": true,
"engines": {
- "node": ">=10"
+ "node": ">=12"
}
},
"node_modules/run-parallel": {
@@ -2621,12 +2610,12 @@
}
},
"node_modules/strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"dependencies": {
- "ansi-regex": "^5.0.0"
+ "ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
@@ -2750,9 +2739,9 @@
}
},
"node_modules/typescript": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz",
- "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==",
+ "version": "4.4.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
+ "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
@@ -3007,9 +2996,9 @@
}
},
"@rbxts/compiler-types": {
- "version": "1.2.3-types.1",
- "resolved": "https://registry.npmjs.org/@rbxts/compiler-types/-/compiler-types-1.2.3-types.1.tgz",
- "integrity": "sha512-SXXIBazyJ7N6d2xcy471/kqZZpCv7EDOWrRJ45jcv3g00VQaZwYl4Elr10woqRloIblQanwJ7yUqGXAsWv7iuQ==",
+ "version": "1.2.7-types.1",
+ "resolved": "https://registry.npmjs.org/@rbxts/compiler-types/-/compiler-types-1.2.7-types.1.tgz",
+ "integrity": "sha512-zr3QIJDgLN2dyPYSy4QwDRiZDm8BwQeUE8tsglPDgbVLJonaK7+PAqb1hoqZJ3ReQdZUElSKru9yAfI1Z0MOug==",
"dev": true
},
"@rbxts/flipper": {
@@ -3036,9 +3025,9 @@
"integrity": "sha512-79onYskH3pgrBT73Zs+biQ31vAVvupKQaxGNWGjyGsxwNhO2YaN/qkut0bvOshaGa+ZzqAXApRVrN8ifIMPiMQ=="
},
"@rbxts/net": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@rbxts/net/-/net-2.1.4.tgz",
- "integrity": "sha512-9tgWD3batonF5Yal53+0br8h/god/8xD4QVCX+ir5+yotGq6RkxqpUvfnjs1AEVQBvFQ5fkLlbfPJ/4Ip/B/ww=="
+ "version": "3.0.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@rbxts/net/-/net-3.0.0-alpha.0.tgz",
+ "integrity": "sha512-QwDBHNpBbWJEEUKpF7pseuUk8xXZT+VFZ4kikEsby2HHu0W4DGZzDnpTq4UIfkiI1jtFZFAqW04NJdvv5P4m0w=="
},
"@rbxts/roact": {
"version": "1.4.0-ts.2",
@@ -3237,9 +3226,9 @@
"dev": true
},
"ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"ansi-styles": {
@@ -3282,12 +3271,6 @@
"integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
"dev": true
},
- "at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true
- },
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@@ -3390,19 +3373,19 @@
}
},
"chokidar": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
- "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+ "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
"dev": true,
"requires": {
- "anymatch": "~3.1.1",
+ "anymatch": "~3.1.2",
"braces": "~3.0.2",
- "fsevents": "~2.3.1",
- "glob-parent": "~5.1.0",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
- "readdirp": "~3.5.0"
+ "readdirp": "~3.6.0"
}
},
"cliui": {
@@ -3912,12 +3895,11 @@
"dev": true
},
"fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
+ "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
"dev": true,
"requires": {
- "at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
@@ -3981,9 +3963,9 @@
}
},
"glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
@@ -4013,9 +3995,9 @@
}
},
"graceful-fs": {
- "version": "4.2.6",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
- "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
+ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
"dev": true
},
"has": {
@@ -4222,6 +4204,12 @@
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
"dev": true
},
+ "lookpath": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/lookpath/-/lookpath-1.2.2.tgz",
+ "integrity": "sha512-k2Gmn8iV6qdME3ztZC2spubmQISimFOPLuQKiPaLcVdRz0IpdxrNClVepMlyTJlhodm/zG/VfbkWERm3kUIh+Q==",
+ "dev": true
+ },
"merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -4490,28 +4478,28 @@
"dev": true
},
"rbxts-transform-debug": {
- "version": "1.0.0-rc.1",
- "resolved": "https://registry.npmjs.org/rbxts-transform-debug/-/rbxts-transform-debug-1.0.0-rc.1.tgz",
- "integrity": "sha512-b+iRejvRlLX0axchSw9lHQ4TF6m1JPpY55UoncAJPtViUnbdShAvxb3WWdbc2oO9/DqLnfxd7jPHSdabQmz27w==",
+ "version": "1.0.0-ts4.4",
+ "resolved": "https://registry.npmjs.org/rbxts-transform-debug/-/rbxts-transform-debug-1.0.0-ts4.4.tgz",
+ "integrity": "sha512-45b5Jq0n5iZ/iCvq/5MGKYzxvDpvKw6fBRI/uQ2W4HumH1cNRwcqpUdXe46CnXm0Q47bJY7FxVlgOdZlV2qafg==",
"dev": true,
"requires": {
"chalk": "^4.1.0",
"colors": "^1.4.0",
"dotenv": "^8.2.0",
"execa": "^5.1.1",
- "typescript": "=4.3.5"
+ "typescript": "=4.4.4"
}
},
"rbxts-transform-env": {
- "version": "1.0.0-rc.0",
- "resolved": "https://registry.npmjs.org/rbxts-transform-env/-/rbxts-transform-env-1.0.0-rc.0.tgz",
- "integrity": "sha512-EkGQZGcoXKxxL6N3TFT5m3tHmY8xwjVcCP+Zyvt9NrGOWSBtHMoP79m82Y4lvAORzAgC3nWsb7pl1kAndY/wEg==",
+ "version": "1.0.0-ts4.4",
+ "resolved": "https://registry.npmjs.org/rbxts-transform-env/-/rbxts-transform-env-1.0.0-ts4.4.tgz",
+ "integrity": "sha512-7u2DZcoaVgBC1zz8bVtx1iEh/ijwMBGPgsBRxc6qV4j/swklIX4r7JE2rEk4wYRST1Imcx250BX1HEx3HyObWw==",
"dev": true,
"requires": {
"chalk": "^4.1.1",
"colors": "^1.4.0",
"dotenv": "^8.2.0",
- "typescript": "=4.3.5"
+ "typescript": "=4.4.4"
}
},
"rbxts-transformer-services": {
@@ -4536,9 +4524,9 @@
}
},
"readdirp": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
- "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"requires": {
"picomatch": "^2.2.1"
@@ -4569,12 +4557,12 @@
"dev": true
},
"resolve": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
- "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
"dev": true,
"requires": {
- "is-core-module": "^2.1.0",
+ "is-core-module": "^2.2.0",
"path-parse": "^1.0.6"
}
},
@@ -4600,26 +4588,26 @@
}
},
"roblox-ts": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/roblox-ts/-/roblox-ts-1.1.1.tgz",
- "integrity": "sha512-oA4eQ7DoP3arhJGYPDHeaZWq8E+KNJkp1HfNwgep2/XsdnuBQXEdsLt3F2U/lInbc2NeU/3r480NNAiGYi2FZQ==",
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/roblox-ts/-/roblox-ts-1.2.7.tgz",
+ "integrity": "sha512-wxwMfdWwN1RwWj3ZrKYGXHqc3eZ1SvLoZ9RkphM7ClJrNfahrCfCnUJUuAXQ0fIBktbAKAUPBPqjEBl6yNfDZw==",
"dev": true,
"requires": {
- "ajv": "^8.0.1",
- "byots": "^4.1.0-dev.20201102.16.32",
- "chokidar": "^3.4.3",
- "fs-extra": "^9.0.1",
- "kleur": "^4.1.3",
- "prompts": "^2.4.0",
- "resolve": "^1.19.0",
- "typescript": "=4.2.3",
- "yargs": "^16.2.0"
+ "ajv": "^8.6.3",
+ "chokidar": "^3.5.2",
+ "fs-extra": "^10.0.0",
+ "kleur": "^4.1.4",
+ "lookpath": "^1.2.2",
+ "prompts": "^2.4.1",
+ "resolve": "^1.20.0",
+ "typescript": "=4.4.4",
+ "yargs": "^17.2.0"
},
"dependencies": {
"ajv": {
- "version": "8.0.5",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.0.5.tgz",
- "integrity": "sha512-RkiLa/AeJx7+9OvniQ/qeWu0w74A8DiPPBclQ6ji3ZQkv5KamO+QGpqmi7O4JIw3rHGUXZ6CoP9tsAkn3gyazg==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz",
+ "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
@@ -4682,22 +4670,16 @@
"dev": true
},
"string-width": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
- "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
+ "strip-ansi": "^6.0.1"
}
},
- "typescript": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
- "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
- "dev": true
- },
"wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -4716,24 +4698,24 @@
"dev": true
},
"yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "version": "17.3.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz",
+ "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==",
"dev": true,
"requires": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
- "string-width": "^4.2.0",
+ "string-width": "^4.2.3",
"y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
+ "yargs-parser": "^21.0.0"
}
},
"yargs-parser": {
- "version": "20.2.7",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz",
- "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==",
+ "version": "21.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz",
+ "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==",
"dev": true
}
}
@@ -4882,12 +4864,12 @@
}
},
"strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"requires": {
- "ansi-regex": "^5.0.0"
+ "ansi-regex": "^5.0.1"
}
},
"strip-final-newline": {
@@ -4975,9 +4957,9 @@
"dev": true
},
"typescript": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz",
- "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==",
+ "version": "4.4.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
+ "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
"dev": true
},
"universalify": {
diff --git a/package.json b/package.json
index ff86a2c..3cb80dc 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@rbxts/zircon",
- "version": "0.12.3-beta.0",
+ "version": "0.20.0-beta.0",
"description": "",
"main": "out/init.lua",
"scripts": {
@@ -12,7 +12,11 @@
"watch:example": "cross-env NODE_ENV=development rbxtsc -w --type=game -p ./example -i ./include",
"serve:example": "rojo serve ./example/default.project.json --port 34567"
},
- "keywords": ["Runtime scripting", "Roblox", "Debugging"],
+ "keywords": [
+ "Runtime scripting",
+ "Roblox",
+ "Debugging"
+ ],
"author": "Vorlias",
"license": "MIT",
"publishConfig": {
@@ -20,7 +24,7 @@
},
"types": "out/index.d.ts",
"devDependencies": {
- "@rbxts/compiler-types": "1.2.3-types.1",
+ "@rbxts/compiler-types": "1.2.7-types.1",
"@rbxts/types": "^1.0.537",
"@typescript-eslint/eslint-plugin": "^4.4.1",
"@typescript-eslint/parser": "^4.4.1",
@@ -31,18 +35,18 @@
"eslint-plugin-prettier": "^3.1.4",
"eslint-plugin-roblox-ts": "0.0.24",
"prettier": "^2.1.2",
- "rbxts-transform-debug": "1.0.0-rc.1",
- "rbxts-transform-env": "1.0.0-rc.0",
+ "rbxts-transform-debug": "1.0.0-ts4.4",
+ "rbxts-transform-env": "1.0.0-ts4.4",
"rbxts-transformer-services": "^1.0.0",
- "roblox-ts": "^1.2.3",
- "typescript": "=4.3.5"
+ "roblox-ts": "^1.2.7",
+ "typescript": "=4.4.4"
},
"dependencies": {
"@rbxts/flipper": "^2.0.1",
"@rbxts/log": "0.5.0-beta.1",
"@rbxts/maid": "^1.0.0-ts.1",
"@rbxts/message-templates": "^0.3.2",
- "@rbxts/net": "^2.1.4",
+ "@rbxts/net": "^3.0.0-alpha.0",
"@rbxts/roact": "1.4.0-ts.2",
"@rbxts/roact-rodux": "0.2.2-ts.5",
"@rbxts/rodux": "3.0.0-ts.3",
diff --git a/src/Class/ZirconConfigurationBuilder.ts b/src/Class/ZirconConfigurationBuilder.ts
new file mode 100644
index 0000000..c3de4d3
--- /dev/null
+++ b/src/Class/ZirconConfigurationBuilder.ts
@@ -0,0 +1,86 @@
+import { NamespaceBuilder } from "@rbxts/net/out/definitions/NamespaceBuilder";
+import ZirconFunction, { ZrTypeCheck } from "Server/Class/ZirconFunction";
+import { ZirconPermissions } from "Server/Class/ZirconGroup";
+import { ZirconEnum } from "./ZirconEnum";
+import { ZirconGroupBuilder, ZirconGroupConfiguration } from "./ZirconGroupBuilder";
+import { ZirconNamespace } from "./ZirconNamespace";
+import { ZirconNamespaceBuilder } from "./ZirconNamespaceBuilder";
+
+export interface ZirconConfiguration {
+ readonly Groups: readonly ZirconGroupConfiguration[];
+ readonly Registry: readonly [
+ type: ZirconNamespace | ZirconEnum
| ZirconFunction,
+ groups: readonly string[],
+ ][];
+}
+
+export class ZirconConfigurationBuilder {
+ public configuration: Writable = {
+ Groups: [],
+ Registry: [],
+ };
+
+ public constructor() {}
+
+ /**
+ * Creates a group, given the specified configuration
+ * @param rank The rank. This is used for group priority
+ * @param id The id of the group to create
+ * @param cb The configuration
+ */
+ public CreateGroup(rank: number, id: string, cb: (group: ZirconGroupBuilder) => ZirconGroupBuilder) {
+ const group = new ZirconGroupBuilder(this, rank, id);
+ cb(group).Add();
+ return this;
+ }
+
+ /**
+ * Creates a default `creator` group. This will refer to either the game creator, or group creator.
+ * @returns
+ */
+ public CreateDefaultCreatorGroup() {
+ return new ZirconGroupBuilder(this, 255, "creator")
+ .BindToCreator()
+ .SetPermissions({
+ CanAccessFullZirconEditor: true,
+ CanExecuteZirconiumScripts: true,
+ CanRecieveServerLogMessages: true,
+ })
+ .Add();
+ }
+
+ /**
+ * Creates a default `user` group, this refers to _anyone_ and shouldn't be used for more sensitive things.
+ * @returns
+ */
+ public CreateDefaultUserGroup() {
+ return new ZirconGroupBuilder(this, 1, "user").BindToEveryone().Add();
+ }
+
+ public CreateNamespace(name: string, cb: (namespace: ZirconNamespaceBuilder) => ZirconNamespaceBuilder) {
+ return this;
+ }
+
+ public AddNamespace(namespace: ZirconNamespace, groups: readonly string[]) {
+ this.configuration.Registry = [...this.configuration.Registry, [namespace, groups]];
+ return this;
+ }
+
+ public AddEnum(enumType: ZirconEnum, groups: readonly string[]) {
+ this.configuration.Registry = [...this.configuration.Registry, [enumType, groups]];
+ return this;
+ }
+
+ public AddFunction(
+ functionType: ZirconFunction,
+ groups: readonly string[],
+ ) {
+ this.configuration.Registry = [...this.configuration.Registry, [functionType, groups]];
+ return this;
+ }
+
+ /** @internal */
+ public Build(): ZirconConfiguration {
+ return this.configuration;
+ }
+}
diff --git a/src/Class/ZirconGroupBuilder.ts b/src/Class/ZirconGroupBuilder.ts
new file mode 100644
index 0000000..828e305
--- /dev/null
+++ b/src/Class/ZirconGroupBuilder.ts
@@ -0,0 +1,100 @@
+import { ZirconPermissions } from "Server/Class/ZirconGroup";
+import { ZirconConfigurationBuilder } from "./ZirconConfigurationBuilder";
+
+export interface ZirconGroupLink {
+ readonly GroupId: number;
+ readonly GroupRoleOrRank: string | number;
+}
+
+export enum ZirconBindingType {
+ Creator = 1 << 0,
+ Group = 1 << 1,
+ UserIds = 1 << 2,
+ Everyone = 1 << 30,
+}
+
+export interface ZirconGroupConfiguration {
+ readonly Id: string;
+ readonly Rank: number;
+ readonly Permissions: ZirconPermissions;
+ readonly BindType: ZirconBindingType;
+ readonly Groups: readonly ZirconGroupLink[];
+ readonly UserIds: number[];
+}
+
+export class ZirconGroupBuilder {
+ public permissions: ZirconPermissions = {
+ CanAccessFullZirconEditor: false,
+ CanExecuteZirconiumScripts: false,
+ CanRecieveServerLogMessages: false,
+ };
+
+ public groupLink = new Array();
+ public userIds = new Array();
+ public bindType: ZirconBindingType = 0;
+
+ public constructor(private parent: ZirconConfigurationBuilder, private rank: number, private id: string) {}
+
+ public SetPermission(key: K, value: ZirconPermissions[K]) {
+ this.permissions[key] = value;
+ return this;
+ }
+
+ public SetPermissions(permissions: Partial) {
+ this.permissions = { ...this.permissions, ...permissions };
+ return this;
+ }
+
+ public BindToGroupRole(groupId: number, groupRole: string) {
+ this.groupLink.push({
+ GroupId: groupId,
+ GroupRoleOrRank: groupRole,
+ });
+ return this;
+ }
+
+ public BindToUserIds(userIds: readonly number[]) {
+ this.bindType |= ZirconBindingType.UserIds;
+ for (const userId of userIds) {
+ this.userIds.push(userId);
+ }
+ return this;
+ }
+
+ public BindToEveryone() {
+ this.bindType |= ZirconBindingType.Everyone;
+ return this;
+ }
+
+ public BindToCreator() {
+ this.bindType |= ZirconBindingType.Creator;
+ return this;
+ }
+
+ public BindToGroupRank(groupId: number, groupRank: number) {
+ this.bindType |= ZirconBindingType.Group;
+ this.groupLink.push({
+ GroupId: groupId,
+ GroupRoleOrRank: groupRank,
+ });
+ return this;
+ }
+
+ /** @internal */
+ public Add() {
+ const { configuration } = this.parent;
+ configuration.Groups = [
+ ...configuration.Groups,
+ {
+ Id: this.id,
+ Rank: this.rank,
+ UserIds: this.userIds,
+ BindType: this.bindType,
+ Permissions: this.permissions,
+ Groups: this.groupLink,
+ },
+ ];
+
+ return this.parent;
+ }
+}
diff --git a/src/RemoteId.d.ts b/src/RemoteId.d.ts
index b6d3044..5cd8eac 100644
--- a/src/RemoteId.d.ts
+++ b/src/RemoteId.d.ts
@@ -4,4 +4,5 @@ export const enum RemoteId {
DispatchToServer = "ZrSiO4/DispatchToServer",
GetPlayerPermissions = "ZrSiO4/GetPlayerPermissions",
GetServerLogMessages = "ZrSOi4/GetServerLogMessages",
+ PlayerGroupsUpdated = "ZrSOi4/PlayerGroupsUpdated",
}
diff --git a/src/Server/Class/ZirconFunction.ts b/src/Server/Class/ZirconFunction.ts
index 27fbff1..b9e0385 100644
--- a/src/Server/Class/ZirconFunction.ts
+++ b/src/Server/Class/ZirconFunction.ts
@@ -4,7 +4,7 @@ import ZrLuauFunction from "@rbxts/zirconium/out/Data/LuauFunction";
import ZrObject from "@rbxts/zirconium/out/Data/Object";
import ZrUndefined from "@rbxts/zirconium/out/Data/Undefined";
-type ZrTypeCheck = (value: ZrValue | ZrUndefined) => value is ZrValue | ZrUndefined;
+export type ZrTypeCheck = (value: ZrValue | ZrUndefined) => value is ZrValue | ZrUndefined;
type ZrInferValue = T extends (value: unknown) => value is infer A ? A : never;
type InferArguments = { readonly [P in keyof T]: ZrInferValue };
diff --git a/src/Server/Class/ZirconGroup.ts b/src/Server/Class/ZirconGroup.ts
index a179e62..041821b 100644
--- a/src/Server/Class/ZirconGroup.ts
+++ b/src/Server/Class/ZirconGroup.ts
@@ -1,3 +1,4 @@
+import { RunService } from "@rbxts/services";
import ZrContext from "@rbxts/zirconium/out/Data/Context";
import { ZrValue } from "@rbxts/zirconium/out/Data/Locals";
import ZrLuauFunction from "@rbxts/zirconium/out/Data/LuauFunction";
@@ -5,6 +6,7 @@ import ZrUndefined from "@rbxts/zirconium/out/Data/Undefined";
import { ZrObjectUserdata } from "@rbxts/zirconium/out/Data/Userdata";
import { ZirconEnum } from "Class/ZirconEnum";
import { ZirconFunction } from "Class/ZirconFunction";
+import { ZirconBindingType, ZirconGroupConfiguration } from "Class/ZirconGroupBuilder";
import { ZirconNamespace } from "Class/ZirconNamespace";
export interface ZirconRobloxGroupBinding {
@@ -12,11 +14,6 @@ export interface ZirconRobloxGroupBinding {
GroupRank: number;
}
-export interface ZirconGroupConfiguration {
- readonly Permissions: ZirconPermissions;
- readonly BoundToGroup?: ZirconRobloxGroupBinding;
-}
-
export type ZirconPermissionSet = Set;
export type ReadonlyZirconPermissionSet = ReadonlySet;
@@ -74,6 +71,44 @@ export default class ZirconUserGroup {
return this.configuration;
}
+ public CanJoinGroup(player: Player) {
+ const group = this.configuration;
+ let canJoinGroup = false;
+
+ if ((group.BindType & ZirconBindingType.Group) !== 0) {
+ const matchesGroup = group.Groups;
+ for (const group of matchesGroup) {
+ if (typeIs(group.GroupRoleOrRank, "string")) {
+ canJoinGroup ||= player.GetRoleInGroup(group.GroupId) === group.GroupRoleOrRank;
+ } else {
+ canJoinGroup ||= player.GetRankInGroup(group.GroupId) === group.GroupRoleOrRank;
+ }
+ }
+ }
+
+ if ((group.BindType & ZirconBindingType.UserIds) !== 0) {
+ canJoinGroup ||= group.UserIds.includes(player.UserId);
+ }
+
+ if ((group.BindType & ZirconBindingType.Everyone) !== 0) {
+ canJoinGroup = true;
+ }
+
+ if ((group.BindType & ZirconBindingType.Creator) !== 0) {
+ if (RunService.IsStudio()) {
+ canJoinGroup = true;
+ }
+
+ if (game.CreatorType === Enum.CreatorType.Group) {
+ canJoinGroup ||= player.GetRankInGroup(game.CreatorId) >= 255;
+ } else {
+ canJoinGroup ||= game.CreatorId === player.UserId;
+ }
+ }
+
+ return canJoinGroup;
+ }
+
public GetName() {
return this.name;
}
diff --git a/src/Server/index.ts b/src/Server/index.ts
index 9a7ed61..7351fc3 100644
--- a/src/Server/index.ts
+++ b/src/Server/index.ts
@@ -9,7 +9,7 @@ import { Token } from "@rbxts/zirconium/out/Ast/Tokens/Tokens";
import { Node } from "@rbxts/zirconium/out/Ast/Nodes/NodeTypes";
import { $dbg } from "rbxts-transform-debug";
import { ZirconLogLevel } from "../Client/Types";
-import { ReadonlyZirconPermissionSet, ZirconGroupConfiguration } from "./Class/ZirconGroup";
+import { ReadonlyZirconPermissionSet } from "./Class/ZirconGroup";
const IsServer = RunService.IsServer();
namespace ZirconServer {
diff --git a/src/Services/RegistryService.ts b/src/Services/RegistryService.ts
index 1771aff..73365c7 100644
--- a/src/Services/RegistryService.ts
+++ b/src/Services/RegistryService.ts
@@ -7,6 +7,8 @@ import ZrPlayerScriptContext from "@rbxts/zirconium/out/Runtime/PlayerScriptCont
import { ZirconFunction } from "Class/ZirconFunction";
import { ZirconNamespace } from "Class/ZirconNamespace";
import { ZirconEnum } from "Class/ZirconEnum";
+import { ZirconConfiguration } from "Class/ZirconConfigurationBuilder";
+import { ZirconBindingType } from "Class/ZirconGroupBuilder";
export namespace ZirconRegistryService {
const contexts = new Map>();
@@ -54,7 +56,7 @@ export namespace ZirconRegistryService {
* @param func The function to register
* @param groups The groups
*/
- export function RegisterFunction(func: ZirconFunction, groups: ZirconUserGroup[] = [Creator]) {
+ export function RegisterFunction(func: ZirconFunction, groups: ZirconUserGroup[]) {
for (const group of groups) {
group.RegisterFunction(func);
}
@@ -65,23 +67,23 @@ export namespace ZirconRegistryService {
* @param namespace The namespace
* @param groups The groups to register it to
*/
- export function RegisterNamespace(namespace: ZirconNamespace, groups: ZirconUserGroup[] = [Creator]) {
+ export function RegisterNamespace(namespace: ZirconNamespace, groups: ZirconUserGroup[]) {
for (const group of groups) {
group.RegisterNamespace(namespace);
}
}
+ export function GetGroups(...groupIds: string[]) {
+ return groupIds.mapFiltered((groupId) => groups.get(groupId.lower()));
+ }
+
/**
* Registers an enum from an array of strings
* @param name The name of the enum
* @param values The values of the enum
* @param groups The groups this enum applies to
*/
- export function RegisterEnumFromArray(
- name: string,
- values: K[],
- groups: ZirconUserGroup[] = [Creator],
- ) {
+ export function RegisterEnumFromArray(name: string, values: K[], groups: ZirconUserGroup[]) {
return RegisterEnum(new ZirconEnum(name, values), groups);
}
@@ -91,64 +93,13 @@ export namespace ZirconRegistryService {
* @param groups The groups to register the enum to
* @returns The enum
*/
- export function RegisterEnum(enumType: ZirconEnum, groups: ZirconUserGroup[] = [Creator]) {
+ export function RegisterEnum(enumType: ZirconEnum, groups: ZirconUserGroup[]) {
for (const group of groups) {
group.RegisterEnum(enumType);
}
return enumType;
}
- /**
- * Registers a group to Zircon, which is used for the permissions of Zircon command execution as well as different zircon tools
- * @param rankInt The rank integer - a number between 0 and 255. Higher number is a higher priority group.
- * @param name The name of the group. Case insensitive.
- * @param permissions The zircon permissions of this group
- */
- export function RegisterGroup(rankInt: number, name: string, permissions: Partial) {
- assert(rankInt >= 0 && rankInt <= 255, "rankInt should be between 0 - 255");
- const group = new ZirconUserGroup(rankInt, name, {
- Permissions: {
- CanRecieveServerLogMessages: false,
- CanExecuteZirconiumScripts: false,
- CanAccessFullZirconEditor: false,
- ...permissions,
- },
- });
- groups.set(name.lower(), group);
- return group;
- }
-
- /**
- * Registers a group to Zircon, which is used for the permissions of Zircon command execution as well as different zircon tools.
- * This function automatically binds this group to a roblox group rank
- * @param groupId The group's id
- * @param rankInt The rank integer - a number between 0 and 255. Higher number is a higher priority group. This should be the same as the roblox group rank.
- * @param name The name of the group. Case insensitive.
- * @param permissions The zircon permissions of this group
- */
- export function RegisterGroupToRobloxGroup(
- groupId: number,
- rankInt: number,
- name: string,
- permissions: Partial,
- ) {
- assert(rankInt >= 0 && rankInt <= 255, "rankInt should be between 0 - 255");
- const group = new ZirconUserGroup(rankInt, name, {
- BoundToGroup: {
- GroupId: groupId,
- GroupRank: rankInt,
- },
- Permissions: {
- CanRecieveServerLogMessages: false,
- CanExecuteZirconiumScripts: false,
- CanAccessFullZirconEditor: false,
- ...permissions,
- },
- });
- groups.set(name.lower(), group);
- return group;
- }
-
/**
* Gets the highest player group for this player
*/
@@ -163,7 +114,7 @@ export namespace ZirconRegistryService {
* @param player The player to add to the groups
* @param targetGroups The groups to add the player to
*/
- export function AddPlayerToGroups(player: Player, targetGroups: Array) {
+ function AddPlayerToGroups(player: Player, targetGroups: Array) {
const playerGroups = playerGroupMap.get(player) ?? [];
for (const groupOrId of targetGroups) {
const group = typeIs(groupOrId, "string") ? groups.get(groupOrId) : groupOrId;
@@ -235,63 +186,57 @@ export namespace ZirconRegistryService {
}
/**
- * The default `user` group. All players are a member of this group by default.
- */
- export const User = RegisterGroup(1, "user", {});
-
- /**
- * The default `creator` group. The group or place owner is added to this group by default.
- *
- * This group has _all_ permissions, you should use `administrator` if you want to add other people with high permissions.
- */
- export const Creator = RegisterGroup(255, "creator", {
- CanRecieveServerLogMessages: true,
- CanExecuteZirconiumScripts: true,
- CanAccessFullZirconEditor: true,
- });
-
- /**
- * The default `administrator` group. If this is a group place,
- * it will add anyone with a rank higher than 250 to this group.
+ * Initializes Zircon on the server with the given configuration
*
- * This group has high permissions, so be careful about adding anyone else to it unless you explicitly trust them.
+ * This needs to be done for Zircon to run.
+ * @param configuration
*/
- export const Administrator = RegisterGroup(250, "administrator", {
- CanRecieveServerLogMessages: true,
- CanExecuteZirconiumScripts: true,
- CanAccessFullZirconEditor: true,
- });
+ export function Init(configuration: ZirconConfiguration) {
+ const configurationGroups = configuration.Groups;
+ for (const group of configurationGroups) {
+ const userGroup = new ZirconUserGroup(group.Rank, group.Id, group);
+ groups.set(group.Id.lower(), userGroup);
+ }
- function getPlayerDefaultGroups(player: Player) {
- const groups = [User];
- if (game.CreatorType === Enum.CreatorType.Group) {
- if (player.GetRankInGroup(game.CreatorId) >= 255) {
- groups.push(Creator);
+ for (const [typeId, typeGroups] of configuration.Registry) {
+ if (typeId instanceof ZirconFunction) {
+ RegisterFunction(typeId, GetGroups(...typeGroups));
+ } else if (typeId instanceof ZirconEnum) {
+ RegisterEnum(typeId, GetGroups(...typeGroups));
+ } else if (typeId instanceof ZirconNamespace) {
+ RegisterNamespace(typeId, GetGroups(...typeGroups));
}
- } else if (game.CreatorType === Enum.CreatorType.User && game.CreatorId === player.UserId) {
- groups.push(Creator);
}
- if (RunService.IsStudio()) {
- groups.push(Administrator);
- }
+ Players.PlayerAdded.Connect((player) => {
+ permissionGroupCache.clear();
- return groups;
- }
+ const groupsToJoin = new Array();
+ for (const [, group] of groups) {
+ if (group.CanJoinGroup(player)) {
+ groupsToJoin.push(group);
+ }
+ }
- Players.PlayerAdded.Connect((player) => {
- permissionGroupCache.clear();
- AddPlayerToGroups(player, getPlayerDefaultGroups(player));
- });
+ AddPlayerToGroups(player, groupsToJoin);
+ });
- Players.PlayerRemoving.Connect((player) => {
- permissionGroupCache.clear();
- contexts.delete(player);
- playerGroupMap.delete(player);
- });
+ Players.PlayerRemoving.Connect((player) => {
+ permissionGroupCache.clear();
+ contexts.delete(player);
+ playerGroupMap.delete(player);
+ });
- for (const player of Players.GetPlayers()) {
- AddPlayerToGroups(player, getPlayerDefaultGroups(player));
+ for (const player of Players.GetPlayers()) {
+ const groupsToJoin = new Array();
+ for (const [, group] of groups) {
+ if (group.CanJoinGroup(player)) {
+ groupsToJoin.push(group);
+ }
+ }
+
+ AddPlayerToGroups(player, groupsToJoin);
+ }
}
}
diff --git a/src/Shared/Remotes.ts b/src/Shared/Remotes.ts
index 95bc7bf..5750d3f 100644
--- a/src/Shared/Remotes.ts
+++ b/src/Shared/Remotes.ts
@@ -80,7 +80,7 @@ export interface ZirconStructuredLogOutput {
export type ZirconStandardOutput = ZirconExecutionOutput | ZirconLogOutput | ZirconStructuredLogOutput;
export type ZirconErrorOutput = ZirconiumRuntimeErrorMessage | ZirconiumParserErrorMessage | ZirconLogErrorOutput;
-const Remotes = Net.Definitions.Create({
+const Remotes = Net.CreateDefinitions({
[RemoteId.StandardOutput]: Net.Definitions.ServerToClientEvent<[output: ZirconStandardOutput]>(),
[RemoteId.StandardError]: Net.Definitions.ServerToClientEvent<[output: ZirconErrorOutput]>(),
[RemoteId.DispatchToServer]: Net.Definitions.ClientToServerEvent<[message: string]>([
@@ -94,5 +94,6 @@ const Remotes = Net.Definitions.Create({
[RemoteId.GetServerLogMessages]: Net.Definitions.ServerAsyncFunction<
() => Array
>([createPermissionMiddleware("CanRecieveServerLogMessages")]),
+ [RemoteId.PlayerGroupsUpdated]: Net.Definitions.ServerToClientEvent(),
});
export default Remotes;
diff --git a/src/index.ts b/src/index.ts
index 04636e3..e02cc10 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -4,6 +4,7 @@ import { Logging } from "Log";
export { ZirconNamespaceBuilder } from "Class/ZirconNamespaceBuilder";
export { ZirconFunctionBuilder } from "Class/ZirconFunctionBuilder";
export { ZirconEnumBuilder } from "Class/ZirconEnumBuilder";
+export { ZirconConfigurationBuilder } from "Class/ZirconConfigurationBuilder";
export { default as ZirconServer } from "./Server";
export { default as ZirconClient } from "./Client";