diff --git a/bin/build.sh b/bin/build.sh index 547e4e7..6db8152 100644 --- a/bin/build.sh +++ b/bin/build.sh @@ -1,5 +1,14 @@ mkdir build -rojo build packages/charm -o build/charm.rbxm -rojo build packages/charm-sync -o build/charm-sync.rbxm -rojo build packages/react -o build/react-charm.rbxm -rojo build packages/vide -o build/vide-charm.rbxm + +build() { + cat > packages/default.project.json <(callback: Charm.Selector, dependencies: { any }?): State - local state, setState = React.useState(callback) - - React.useEffect(function() - setState(callback()) - return Charm.subscribe(callback, setState) - end, dependencies or {}) - - return state -end - -return { - useAtom = useAtom, -} +return require(script.src) diff --git a/packages/react/package.json b/packages/react/package.json index 04c8c1f..41a83f7 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -4,8 +4,8 @@ "description": "React bindings for Charm", "repository": "littensy/charm", "license": "MIT", - "main": "src/init.luau", - "types": "src/index.d.ts", + "main": "init.luau", + "types": "index.d.ts", "scripts": { "prepare": "cp ../../LICENSE.md . && cp ../../README.md .", "publish:wally": "wally publish" diff --git a/packages/react/src/init.luau b/packages/react/src/init.luau new file mode 100644 index 0000000..fe15dee --- /dev/null +++ b/packages/react/src/init.luau @@ -0,0 +1,31 @@ +local Charm = require(script.Parent.Parent.charm) +local React = if script.Parent.Parent:FindFirstChild("React") + then require(script.Parent.Parent.React) + else require((script.Parent.Parent :: any).react) :: never + +--[=[ + A hook that subscribes to changes in the given atom or selector. The + component is re-rendered whenever the state changes. + + If the `dependencies` array is provided, the subscription to the atom or + selector is re-created whenever the dependencies change. Otherwise, the + subscription is created once when the component is mounted. + + @param callback The atom or selector to subscribe to. + @param dependencies An array of values that the subscription depends on. + @return The current state. +]=] +local function useAtom(callback: Charm.Selector, dependencies: { any }?): State + local state, setState = React.useState(callback) + + React.useEffect(function() + setState(callback()) + return Charm.subscribe(callback, setState) + end, dependencies or {}) + + return state +end + +return { + useAtom = useAtom, +} diff --git a/packages/react/wally.toml b/packages/react/wally.toml index 0aa6ded..bd379d8 100644 --- a/packages/react/wally.toml +++ b/packages/react/wally.toml @@ -3,7 +3,8 @@ name = "littensy/react-charm" version = "0.2.0" registry = "https://github.com/UpliftGames/wally-index" realm = "shared" -exclude = ["package.json"] +exclude = ["package.json", "node_modules"] +include = ["LICENSE.md"] [dependencies] charm = "littensy/charm@^0.9" diff --git a/packages/vide/init.luau b/packages/vide/init.luau index abd97fe..0aab139 100644 --- a/packages/vide/init.luau +++ b/packages/vide/init.luau @@ -1,25 +1 @@ -local Charm = require(script.Parent.charm) -local Vide = if script.Parent:FindFirstChild("Vide") - then require(script.Parent.Vide) - else require((script.Parent :: any).vide.src) :: never - ---[=[ - Subscribes to the state of an atom and returns a Vide source. - - @param callback The atom or selector to subscribe to. - @return The reactive source. -]=] -local function useAtom(callback: () -> State): () -> State - local state = Vide.source(callback()) - local unsubscribe = Charm.subscribe(callback, function(value) - task.spawn(state :: (State) -> State, value) - end) - - Vide.cleanup(unsubscribe) - - return state -end - -return { - useAtom = useAtom, -} +return require(script.src) diff --git a/packages/vide/package.json b/packages/vide/package.json index bf0b559..7ffe63c 100644 --- a/packages/vide/package.json +++ b/packages/vide/package.json @@ -4,8 +4,8 @@ "description": "Vide bindings for Charm", "repository": "littensy/charm", "license": "MIT", - "main": "src/init.luau", - "types": "src/index.d.ts", + "main": "init.luau", + "types": "index.d.ts", "scripts": { "prepare": "cp ../../LICENSE.md . && cp ../../README.md .", "publish:wally": "wally publish" diff --git a/packages/vide/src/init.luau b/packages/vide/src/init.luau new file mode 100644 index 0000000..5f2df7b --- /dev/null +++ b/packages/vide/src/init.luau @@ -0,0 +1,25 @@ +local Charm = require(script.Parent.Parent.charm) +local Vide = if script.Parent.Parent:FindFirstChild("Vide") + then require(script.Parent.Parent.Vide) + else require((script.Parent.Parent :: any).vide.src) :: never + +--[=[ + Subscribes to the state of an atom and returns a Vide source. + + @param callback The atom or selector to subscribe to. + @return The reactive source. +]=] +local function useAtom(callback: () -> State): () -> State + local state = Vide.source(callback()) + local unsubscribe = Charm.subscribe(callback, function(value) + task.spawn(state :: (State) -> State, value) + end) + + Vide.cleanup(unsubscribe) + + return state +end + +return { + useAtom = useAtom, +} diff --git a/packages/vide/wally.toml b/packages/vide/wally.toml index b7c6b07..642ab3c 100644 --- a/packages/vide/wally.toml +++ b/packages/vide/wally.toml @@ -3,7 +3,8 @@ name = "littensy/vide-charm" version = "0.2.0" registry = "https://github.com/UpliftGames/wally-index" realm = "shared" -exclude = ["package.json"] +exclude = ["package.json", "node_modules"] +include = ["LICENSE.md"] [dependencies] charm = "littensy/charm@^0.9"