Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
@preact-signals/utils
Advanced tools
@preact-signals/utils
@preact-signals/utils
is a standard library for Preact Signals, designed to provide essential utilities for comfortable and streamlined usage. This package includes several features to enhance the flexibility and maintainability of Preact Signal-based projects.
Ensure that one of the preact signals runtimes is installed:
@preact/signals
for preact
, requiring an additional step.@preact/signals-react
for react
.@preact/signals
additional step:Resolve @preact/signals-react
as @preact/signals
. For guidance, see resolve react
as preact
and follow a similar process with signals. Additionally, dedupe preact
.
@preact/signals-react
additional step:You should turn off React.StrictMode to resources work properly
import preact from "@preact/preset-vite";
import { defineConfig } from "vite";
export default defineConfig({
plugins: [preact()],
resolve: {
dedupe: ["preact"],
alias: [
{ find: "react", replacement: "preact/compat" },
{ find: "react-dom/test-utils", replacement: "preact/test-utils" },
{ find: "react-dom", replacement: "preact/compat" },
{ find: "react/jsx-runtime", replacement: "preact/jsx-runtime" },
{ find: "@preact/signals-react", replacement: "@preact/signals" },
],
},
});
Fetch @preact-signals/utils
via your preferred package manager:
# Using npm
npm install @preact-signals/utils
# Using yarn
yarn add @preact-signals/utils
# Using pnpm
pnpm add @preact-signals/utils
Library consist from many entries:
@preact-signals/utils
for library agnostic utils@preact-signals/utils/components
for reactive components@preact-signals/utils/hooks
for reactive hooks@preact-signals/utils/hocs
provides hocs wrappers that bring reactivity to your components@preact-signals/utils
Uncached
/$
The Uncached
type functions similarly to a Preact signal, essentially wrapping a function that can be passed into props or JSX. You can create it using the $
function.
const sig = signal(1);
<div>{$(() => sig.value * 10)}</div>;
reaction
The reaction
function allows responding to changes tracked within a dependent function. It is useful for managing side-effects or synchronizing non-reactive parts of your code.
reaction
is enhanced version of this:
const reaction = (deps, fn) =>
effect(() => {
const value = deps();
untracked(() => fn(value));
});
const sig = signal(1);
const sig2 = signal(2);
// reaction(deps, effect, options?: {memoize: boolean})
const dispose = reaction(
() => sig.value,
(value) => {
// you can read signals here without tracking
if (sig2.value * 10 === value) {
sig2.value = value;
}
}
);
// will only reexecute reaction if deps result actually changed
reaction(
() => {
sig.value;
return sig2.value;
},
() => {
console.log("reacted");
return () => {
console.log("reaction disposed");
};
},
{
memoize: true,
}
);
accessor
/setter
These functions act as wrapper creators for signals, offering a convenient way to separate reading and writing responsibilities.
resource
The resource
type binds a signal to a promise, including Preact Signals' reactivity. It can be retried, rejected, or resolved, offering a streamlined way to manage asynchronous operations.
const [resource, { refetch }] = createResource({
fetcher: async () => {
const response = await fetch("https://example.com");
return response.json();
},
});
return <Show when={resource}>{(result) => <div>{result()}</div>}</Show>;
createFlatStore
This function offers a simple store implementation, converting key values into signals on demand.
const [store, setStore] = createFlatStore({
a: 1,
b: 2,
// computeds will be created from getters
get c() {
return this.a + this.b;
},
});
const c = computed(() => store.a + store.b); // 3
store.a = 2;
store.b = 3;
console.log(store.c); // 5
console.log(c.value); // 5
// will be auto bached
setStore({ a: 3, b: 4 });
console.log(c.value); // 7
createFlatStoreOfSignals
This function wraps provided signals and value to flat store. You can pass computed's too and it will be readonly field
const [store, setStore] = createFlatStoreOfSignals({
a: 1,
b: 2,
c: signal(10),
d: computed(() => 10),
// computeds will be created from getters
get e() {
return this.a + this.b;
},
});
// ok
setStore({
a: 10,
b: 11,
c: 12,
});
setStore({
// type error and throws
e: 10,
d: 10,
});
@preact-signals/utils/hooks
: Hooks for SignalsThis entry provides hooks designed to work with signals, enhancing reactivity and composability in your components.
// execute function run only once, and you can access other signals inside without tracking
const a = useInitSignal(() => new Set());
// uses first provided clojure, so it can be jit
const b = useComputedOnce(() => a.value.size);
useSignalEffectOnce(() => a.value.size);
// create flat store from provided value
const [store, setStore] = useFlatStore(() => ({
a: 1,
b: 2,
}));
const [store2, setStore2] = useFlatStoreOfSignals(() => ({
a: 1,
b: signal(10),
}));
// create resource from provided fetcher
const [resource, { refetch }] = useResource({
fetcher: async () => {
const response = await fetch("https://example.com");
return response.json();
},
});
@preact-signals/utils/components
: Reactive ComponentsThis section includes components like Show
, Switch
, Match
, For
, allowing you to scope reactivity within your JSX. These components aid in writing more declarative and readable code.
All of this component works with reactive unit, which is Signal or Accessor callback
import { Show, For } from "@preact-signals/utils/components";
<Show fallback={<p>Loading...</p>} when={() => arr.value}>
{(data) => (
<ul>
<For each={data} keyExtractor={(item) => item.id}>
{(item) => <li>{renderItem(item)}</li>}
</For>
</ul>
)}
</Show>;
import { Switch, Match } from "@preact-signals/utils/components";
<Switch fallback={<p>Not found</p>}>
<Match when={() => route.value === "home"}>
<Home />
</Match>
<Match when={() => route.value === "about"}>
<About />
</Match>
<Match when={() => route.value === "users"}>
<Users />
</Match>
</Switch>;
@preact-signals/utils/hocs
: High Order Components (HOCs)HOCs in this entry allow you to inject signals or uncached
instances into props, aiding in the creation of reusable and composable logic across various components.
Examples:
const View$ = withSignalProps(View);
const Text$ = withSignalProps(Text);
const a = signal(10);
const b = signal(5);
<View$ hitSlop={useComputed(() => a.value + b.value)} />;
<View$ hitSlop={$(() => a.value + b.value)} />;
reactifyLite
Makes you component truly reactive. Your props are will be use getter to signals under the hood. So you can safely pass it into effect or reactive component like Show
or Switch
without worries about tracking.
const Comp = (props: ReactiveProps<{ a: number }>) => (
<Show when={() => props.a > 10}>{(v) => v + 10}</Show>
);
const B = reactifyLite(Comp);
<B a={$(() => a.value + b.value)} />;
// JSX transform idea. this is just idea, not implemented
// use `$$` to pass props like in SolidJS
<C a$$={a.value + b.value} />;
@preact-signals/utils
is licensed under the MIT License, and you're free to use, modify, and distribute it under the terms outlined in the LICENSE file.
FAQs
Utils for @preact/signals
The npm package @preact-signals/utils receives a total of 205 weekly downloads. As such, @preact-signals/utils popularity was classified as not popular.
We found that @preact-signals/utils demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.