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";