From b4cc94f369ca4508f85a717763521d35f46f2a51 Mon Sep 17 00:00:00 2001 From: marked Date: Tue, 12 Nov 2024 17:31:07 +0100 Subject: [PATCH] packaging: Add pesde support, feat: Add searching and clearing to ref + Added pesde support + Added `.search()` to `ref` and made `ref()` (`.set_ref()`) & `.search()` return a clearer which removes the reference + Bumped to 0.1.6 --- .github/workflows/release.yml | 8 ++++++- .lune/dist.luau | 15 +++++++++++++ .zed/settings.json | 4 ++-- lib/command_buffer.luau | 2 +- lib/handle.luau | 2 +- lib/init.luau | 2 +- lib/ref.luau | 42 +++++++++++++++++++++++++++++++---- lib/replicator.luau | 2 +- lib/spawner_type.luau | 2 +- lib/world.luau | 2 +- pesde.toml | 17 ++++++++++++++ rokit.toml | 1 + test/tests.luau | 23 ++++++++++++++++++- wally.toml | 2 +- 14 files changed, 109 insertions(+), 15 deletions(-) create mode 100644 pesde.toml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index efe52ea..02b87f9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -69,5 +69,11 @@ jobs: - name: Wally Login run: wally login --token ${{ secrets.WALLY_AUTH_TOKEN }} - - name: Publish + - name: Wally Publish run: wally publish + + - name: Pesde Login + run: pesde auth login --token "Bearer ${{ secrets.WALLY_AUTH_TOKEN }}" + + - name: Pesde Publish + run: pesde publish diff --git a/.lune/dist.luau b/.lune/dist.luau index 77e901d..b6ba7f2 100644 --- a/.lune/dist.luau +++ b/.lune/dist.luau @@ -1,6 +1,21 @@ --!strict +local fs = require("@lune/fs") local spawn = require("util/spawn") spawn.start("rojo sourcemap dev.project.json -o sourcemap.json") spawn.start("lune run install-packages") spawn.start("darklua process --config .darklua.json lib/ dist/", { env = { ROBLOX_DEV = "false" } }) + +for _, path in fs.readDir("dist") do + path = `dist/{path}` + if not fs.isFile(path) then + continue + end + + print("found working file") + + local file = fs.readFile(path) + local new_contents = + string.gsub(file, `require%("%.%./jecs"%)`, `require(script.Parent.Parent:FindFirstChild('jecs'))`) + fs.writeFile(path, new_contents) +end diff --git a/.zed/settings.json b/.zed/settings.json index f815196..6482f28 100644 --- a/.zed/settings.json +++ b/.zed/settings.json @@ -21,8 +21,8 @@ "mode": "relativeToFile", "fileAliases": { "@jecs_utils": "lib", - "@jecs": "Packages/jecs", - "@testkit": "test/testkit" + "@testkit": "test/testkit", + "@jecs": "Packages/jecs" }, "directoryAliases": { "@lune": ".lune/.lune-defs/" diff --git a/lib/command_buffer.luau b/lib/command_buffer.luau index 60aff53..08ccd52 100644 --- a/lib/command_buffer.luau +++ b/lib/command_buffer.luau @@ -1,6 +1,6 @@ --!strict --!optimize 2 -local jecs = require("@jecs") +local jecs = require("../jecs") type entity = jecs.Entity type id = jecs.Id diff --git a/lib/handle.luau b/lib/handle.luau index b57f4cb..d4ee535 100644 --- a/lib/handle.luau +++ b/lib/handle.luau @@ -1,6 +1,6 @@ --!strict --!optimize 2 -local jecs = require("@jecs") +local jecs = require("../jecs") type entity = jecs.Entity type id = entity | jecs.Pair diff --git a/lib/init.luau b/lib/init.luau index 0d2a98d..8bcbb66 100644 --- a/lib/init.luau +++ b/lib/init.luau @@ -1,6 +1,6 @@ --!strict --!optimize 2 -local jecs = require("@jecs") +local jecs = require("../jecs") local WORLD = require("./world") diff --git a/lib/ref.luau b/lib/ref.luau index 7adfb71..7975dca 100644 --- a/lib/ref.luau +++ b/lib/ref.luau @@ -1,17 +1,23 @@ --!strict --!optimize 2 local handle = require("./handle") -local jecs = require("@jecs") +local jecs = require("../jecs") local WORLD = require("./world").get local refs: { [jecs.World]: { [any]: jecs.Entity } } = {} +local function serve_clearer(key: any, world: jecs.World): () -> () + return function() + refs[world][key] = nil + end +end + --- Gets an entity the given key references to. --- If the key is nil, an entirely new entity is created and returned. --- If the key doesn't reference an entity, a new entity is made for it to reference and returned. --- @param key any --- @return handle -local function ref(key: any): handle.handle +local function ref(key: any): (handle.handle, () -> ()?) local world = WORLD() if not key then return handle(world:entity()) @@ -27,7 +33,35 @@ local function ref(key: any): handle.handle refs[world][key] = entity end - return handle(entity) + return handle(entity), serve_clearer(key, world) end -return ref +-- For the `__call`` metamethod +local function __call(_, key: any): (handle.handle, () -> ()?) + return ref(key) +end + +local function search(key: any): (handle.handle?, () -> ()?) + local world = WORLD() + if not key then + return nil + end + local entity = refs[world][key] + + if not entity then + return nil + end + + return handle(entity), serve_clearer(key, world) +end + +local metatable = { + __call = __call, + __index = { + search = search, + set_ref = ref, + }, +} + +local REF = setmetatable({}, metatable) :: typeof(ref) & typeof(metatable.__index) +return REF diff --git a/lib/replicator.luau b/lib/replicator.luau index 9e47e4c..d65e88f 100644 --- a/lib/replicator.luau +++ b/lib/replicator.luau @@ -1,6 +1,6 @@ --!strict --!optimize 2 -local jecs = require("@jecs") +local jecs = require("../jecs") type entity = jecs.Entity type i53 = number diff --git a/lib/spawner_type.luau b/lib/spawner_type.luau index cad1c59..3c9e5a3 100644 --- a/lib/spawner_type.luau +++ b/lib/spawner_type.luau @@ -1,5 +1,5 @@ --!strict -local jecs = require("@jecs") +local jecs = require("../jecs") type entity = jecs.Entity type id = jecs.Id diff --git a/lib/world.luau b/lib/world.luau index 75f4acd..3e7a183 100644 --- a/lib/world.luau +++ b/lib/world.luau @@ -1,6 +1,6 @@ --!strict --!optimize 2 -local jecs = require("@jecs") +local jecs = require("../jecs") local WORLD: jecs.World diff --git a/pesde.toml b/pesde.toml new file mode 100644 index 0000000..28f60c2 --- /dev/null +++ b/pesde.toml @@ -0,0 +1,17 @@ +name = "mark_marks/jecs_utils" +version = "0.1.6" +description = "A set of utilities for jecs" +authors = ["marked/Mark-Marks"] +repository = "https://github.com/mark-marks/jecs-utils" +license = "MIT" + +include = ["src", "src/**", "LICENSE", "pesde.toml", "README.md"] + +[target] +environment = "luau" + +[indices] +default = "https://github.com/daimond113/pesde-index" + +[dependencies] +jecs = { repo = "https://git.devmarked.win/marked/jecs-pesde", rev = "main" } diff --git a/rokit.toml b/rokit.toml index a514cad..9f1de54 100644 --- a/rokit.toml +++ b/rokit.toml @@ -12,3 +12,4 @@ luau-lsp = "johnnymorganz/luau-lsp@1.32.4" stylua = "johnnymorganz/stylua@0.20.0" wally-package-types = "johnnymorganz/wally-package-types@1.3.2" darklua = "seaofvoices/darklua@0.13.1" +pesde = "daimond113/pesde@0.5.0-rc.8" diff --git a/test/tests.luau b/test/tests.luau index a6b23cd..3ea84b9 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -10,6 +10,7 @@ local collect = jecs_utils.collect local handle = jecs_utils.handle local replicator = jecs_utils.replicator local ref = jecs_utils.ref +local ref_search = ref.search local command_buffer = jecs_utils.command_buffer local spawner = jecs_utils.spawner @@ -104,7 +105,7 @@ TEST("jecs_utils.handle()", function() end) TEST("jecs_utils.ref()", function() - do CASE "ref(abc) == ref(abc)" + do CASE "set_ref" local world = jecs.World.new() jecs_utils.initialize(world) @@ -112,6 +113,26 @@ TEST("jecs_utils.ref()", function() local b: number = ref(1234):id() CHECK(a == b) end + + do CASE "search" + local world = jecs.World.new() + jecs_utils.initialize(world) + + local a: number = ref(1234):id() + local b = ref_search(1234) + assert(b) -- give me the type refinements... + CHECK(a == b:id() :: number) + end + + do CASE "clearer" + local world = jecs.World.new() + jecs_utils.initialize(world) + + local a, a_clear = ref(1234); + (a_clear :: any)() + local b = ref(1234) + CHECK(b:id() :: number ~= a:id() :: number) + end end) TEST("jecs_utils.replicator()", function() diff --git a/wally.toml b/wally.toml index 8839d50..a8f4a38 100644 --- a/wally.toml +++ b/wally.toml @@ -1,6 +1,6 @@ [package] name = "mark-marks/jecs-utils" -version = "0.1.5" +version = "0.1.6" registry = "https://github.com/UpliftGames/wally-index" realm = "shared" license = "MIT"