@vaadin/hilla-react-signals 24.5.0-alpha5 → 24.5.0-alpha7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,38 @@
1
+ import type { ConnectClient } from '@vaadin/hilla-frontend';
2
+ import { NumberSignal, type ValueSignal } from './Signals.js';
3
+ import { type StateEvent } from './types.js';
4
+ /**
5
+ * A generic class that represents a signal channel
6
+ * that can be used to communicate with a server-side
7
+ * signal instance.
8
+ *
9
+ * The signal channel is responsible for subscribing to
10
+ * the server-side signal and updating the local signal
11
+ * based on the received events.
12
+ *
13
+ * @typeParam T - The type of the signal value.
14
+ * @typeParam S - The type of the signal instance.
15
+ */
16
+ declare abstract class SignalChannel<T, S extends ValueSignal<T>> {
17
+ #private;
18
+ constructor(signalProviderServiceMethod: string, connectClient: ConnectClient);
19
+ publish(event: StateEvent): Promise<boolean>;
20
+ /**
21
+ * Returns the signal instance to be used in components.
22
+ */
23
+ get signal(): S;
24
+ /**
25
+ * Returns the id of the signal channel.
26
+ */
27
+ get id(): string;
28
+ abstract createInternalSignal(publish: (event: StateEvent) => Promise<boolean>, initialValue?: T): S;
29
+ }
30
+ /**
31
+ * A signal channel that is used to communicate with a
32
+ * server-side signal instance that holds a number value.
33
+ */
34
+ export declare class NumberSignalChannel extends SignalChannel<number, NumberSignal> {
35
+ createInternalSignal(publish: (event: StateEvent) => Promise<boolean>, initialValue?: number): NumberSignal;
36
+ }
37
+ export {};
38
+ //# sourceMappingURL=EventChannel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventChannel.d.ts","sourceRoot":"","sources":["src/EventChannel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAoB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhF,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,YAAY,CAAC;AAY7D;;;;;;;;;;;GAWG;AACH,uBAAe,aAAa,CAAC,CAAC,EAAE,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC;;gBAO1C,2BAA2B,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa;IA8BvE,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlD;;OAEG;IACH,IAAI,MAAM,IAAI,CAAC,CAEd;IAED;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,QAAQ,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC;CACrG;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC;IACjE,oBAAoB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY;CAGrH"}
@@ -0,0 +1,55 @@
1
+ import { NumberSignal, setInternalValue } from "./Signals.js";
2
+ import SignalsHandler from "./SignalsHandler";
3
+ import { StateEventType } from "./types.js";
4
+ class SignalChannel {
5
+ #channelDescriptor;
6
+ #signalsHandler;
7
+ #id;
8
+ #internalSignal;
9
+ constructor(signalProviderServiceMethod, connectClient) {
10
+ this.#id = crypto.randomUUID();
11
+ this.#signalsHandler = new SignalsHandler(connectClient);
12
+ this.#channelDescriptor = {
13
+ signalProviderEndpointMethod: signalProviderServiceMethod,
14
+ subscribe: (signalProviderEndpointMethod, signalId) => this.#signalsHandler.subscribe(signalProviderEndpointMethod, signalId),
15
+ publish: async (signalId, event) => this.#signalsHandler.update(signalId, event)
16
+ };
17
+ this.#internalSignal = this.createInternalSignal(async (event) => this.publish(event));
18
+ this.#connect();
19
+ }
20
+ #connect() {
21
+ this.#channelDescriptor.subscribe(this.#channelDescriptor.signalProviderEndpointMethod, this.#id).onNext((stateEvent) => {
22
+ this.#updateSignals(stateEvent);
23
+ });
24
+ }
25
+ #updateSignals(stateEvent) {
26
+ if (stateEvent.type === StateEventType.SNAPSHOT) {
27
+ setInternalValue(this.#internalSignal, stateEvent.value);
28
+ }
29
+ }
30
+ async publish(event) {
31
+ await this.#channelDescriptor.publish(this.#id, event);
32
+ return true;
33
+ }
34
+ /**
35
+ * Returns the signal instance to be used in components.
36
+ */
37
+ get signal() {
38
+ return this.#internalSignal;
39
+ }
40
+ /**
41
+ * Returns the id of the signal channel.
42
+ */
43
+ get id() {
44
+ return this.#id;
45
+ }
46
+ }
47
+ class NumberSignalChannel extends SignalChannel {
48
+ createInternalSignal(publish, initialValue) {
49
+ return new NumberSignal(publish, initialValue);
50
+ }
51
+ }
52
+ export {
53
+ NumberSignalChannel
54
+ };
55
+ //# sourceMappingURL=EventChannel.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["src/EventChannel.ts"],
4
+ "sourcesContent": ["import type { ConnectClient, Subscription } from '@vaadin/hilla-frontend';\nimport { NumberSignal, setInternalValue, type ValueSignal } from './Signals.js';\nimport SignalsHandler from './SignalsHandler';\nimport { type StateEvent, StateEventType } from './types.js';\n\n/**\n * The type that describes the needed information to\n * subscribe and publish to a server-side signal instance.\n */\ntype SignalChannelDescriptor<T> = Readonly<{\n signalProviderEndpointMethod: string;\n subscribe(signalProviderEndpointMethod: string, clientSignalId: string): Subscription<T>;\n publish(clientSignalId: string, event: T): Promise<void>;\n}>;\n\n/**\n * A generic class that represents a signal channel\n * that can be used to communicate with a server-side\n * signal instance.\n *\n * The signal channel is responsible for subscribing to\n * the server-side signal and updating the local signal\n * based on the received events.\n *\n * @typeParam T - The type of the signal value.\n * @typeParam S - The type of the signal instance.\n */\nabstract class SignalChannel<T, S extends ValueSignal<T>> {\n readonly #channelDescriptor: SignalChannelDescriptor<StateEvent>;\n readonly #signalsHandler: SignalsHandler;\n readonly #id: string;\n\n readonly #internalSignal: S;\n\n constructor(signalProviderServiceMethod: string, connectClient: ConnectClient) {\n this.#id = crypto.randomUUID();\n this.#signalsHandler = new SignalsHandler(connectClient);\n this.#channelDescriptor = {\n signalProviderEndpointMethod: signalProviderServiceMethod,\n subscribe: (signalProviderEndpointMethod: string, signalId: string) =>\n this.#signalsHandler.subscribe(signalProviderEndpointMethod, signalId),\n publish: async (signalId: string, event: StateEvent) => this.#signalsHandler.update(signalId, event),\n };\n\n this.#internalSignal = this.createInternalSignal(async (event: StateEvent) => this.publish(event));\n\n this.#connect();\n }\n\n #connect() {\n this.#channelDescriptor\n .subscribe(this.#channelDescriptor.signalProviderEndpointMethod, this.#id)\n .onNext((stateEvent) => {\n // Update signals based on the new value from the event:\n this.#updateSignals(stateEvent);\n });\n }\n\n #updateSignals(stateEvent: StateEvent): void {\n if (stateEvent.type === StateEventType.SNAPSHOT) {\n setInternalValue(this.#internalSignal, stateEvent.value);\n }\n }\n\n async publish(event: StateEvent): Promise<boolean> {\n await this.#channelDescriptor.publish(this.#id, event);\n return true;\n }\n\n /**\n * Returns the signal instance to be used in components.\n */\n get signal(): S {\n return this.#internalSignal;\n }\n\n /**\n * Returns the id of the signal channel.\n */\n get id(): string {\n return this.#id;\n }\n\n abstract createInternalSignal(publish: (event: StateEvent) => Promise<boolean>, initialValue?: T): S;\n}\n\n/**\n * A signal channel that is used to communicate with a\n * server-side signal instance that holds a number value.\n */\nexport class NumberSignalChannel extends SignalChannel<number, NumberSignal> {\n override createInternalSignal(publish: (event: StateEvent) => Promise<boolean>, initialValue?: number): NumberSignal {\n return new NumberSignal(publish, initialValue);\n }\n}\n"],
5
+ "mappings": "AACA,SAAS,cAAc,wBAA0C;AACjE,OAAO,oBAAoB;AAC3B,SAA0B,sBAAsB;AAwBhD,MAAe,cAA2C;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EAET,YAAY,6BAAqC,eAA8B;AAC7E,SAAK,MAAM,OAAO,WAAW;AAC7B,SAAK,kBAAkB,IAAI,eAAe,aAAa;AACvD,SAAK,qBAAqB;AAAA,MACxB,8BAA8B;AAAA,MAC9B,WAAW,CAAC,8BAAsC,aAChD,KAAK,gBAAgB,UAAU,8BAA8B,QAAQ;AAAA,MACvE,SAAS,OAAO,UAAkB,UAAsB,KAAK,gBAAgB,OAAO,UAAU,KAAK;AAAA,IACrG;AAEA,SAAK,kBAAkB,KAAK,qBAAqB,OAAO,UAAsB,KAAK,QAAQ,KAAK,CAAC;AAEjG,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,WAAW;AACT,SAAK,mBACF,UAAU,KAAK,mBAAmB,8BAA8B,KAAK,GAAG,EACxE,OAAO,CAAC,eAAe;AAEtB,WAAK,eAAe,UAAU;AAAA,IAChC,CAAC;AAAA,EACL;AAAA,EAEA,eAAe,YAA8B;AAC3C,QAAI,WAAW,SAAS,eAAe,UAAU;AAC/C,uBAAiB,KAAK,iBAAiB,WAAW,KAAK;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,OAAqC;AACjD,UAAM,KAAK,mBAAmB,QAAQ,KAAK,KAAK,KAAK;AACrD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAY;AACd,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,KAAa;AACf,WAAO,KAAK;AAAA,EACd;AAGF;AAMO,MAAM,4BAA4B,cAAoC;AAAA,EAClE,qBAAqB,SAAkD,cAAqC;AACnH,WAAO,IAAI,aAAa,SAAS,YAAY;AAAA,EAC/C;AACF;",
6
+ "names": []
7
+ }
package/Signals.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ import { Signal } from './core.js';
2
+ import { type StateEvent } from './types';
3
+ export declare let setInternalValue: <T>(signal: ValueSignal<T>, value: T) => void;
4
+ /**
5
+ * A signal that holds a value. The underlying
6
+ * value of this signal is stored and updated as a
7
+ * shared value on the server.
8
+ *
9
+ * @internal
10
+ */
11
+ export declare abstract class ValueSignal<T> extends Signal<T> {
12
+ #private;
13
+ /**
14
+ * Creates a new ValueSignal instance.
15
+ * @param publish - The function that publishes the
16
+ * value of the signal to the server.
17
+ * @param value - The initial value of the signal
18
+ * @defaultValue undefined
19
+ */
20
+ constructor(publish: (event: StateEvent) => Promise<boolean>, value?: T);
21
+ /**
22
+ * Returns the value of the signal.
23
+ */
24
+ get value(): T;
25
+ /**
26
+ * Publishes the new value to the server.
27
+ * Note that this method is not setting
28
+ * the signal's value.
29
+ *
30
+ * @param value - The new value of the signal
31
+ * to be published to the server.
32
+ */
33
+ set value(value: T);
34
+ }
35
+ /**
36
+ * A signal that holds a number value. The underlying
37
+ * value of this signal is stored and updated as a
38
+ * shared value on the server.
39
+ *
40
+ * After obtaining the NumberSignal instance from
41
+ * a server-side service that returns one, the value
42
+ * can be updated using the `value` property,
43
+ * and it can be read with or without the
44
+ * `value` property (similar to a normal signal):
45
+ *
46
+ * @example
47
+ * ```tsx
48
+ * const counter = CounterService.counter();
49
+ *
50
+ * return (
51
+ * <Button onClick={() => counter++)}>
52
+ * Click count: { counter }
53
+ * </Button>
54
+ * <Button onClick={() => counter.value = 0}>Reset</Button>
55
+ * );
56
+ * ```
57
+ */
58
+ export declare class NumberSignal extends ValueSignal<number> {
59
+ }
60
+ //# sourceMappingURL=Signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Signals.d.ts","sourceRoot":"","sources":["src/Signals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,SAAS,CAAC;AAG1D,eAAO,IAAI,gBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAE3E;;;;;;GAMG;AACH,8BAAsB,WAAW,CAAC,CAAC,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;;IAOpD;;;;;;OAMG;gBACS,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;IAKvE;;OAEG;IACH,IAAa,KAAK,IAAI,CAAC,CAEtB;IAED;;;;;;;OAOG;IACH,IAAa,KAAK,CAAC,KAAK,EAAE,CAAC,EAQ1B;CAUF;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,YAAa,SAAQ,WAAW,CAAC,MAAM,CAAC;CAAG"}
package/Signals.js ADDED
@@ -0,0 +1,57 @@
1
+ import { Signal } from "./core.js";
2
+ import { StateEventType } from "./types";
3
+ let setInternalValue;
4
+ class ValueSignal extends Signal {
5
+ static {
6
+ setInternalValue = (signal, value) => signal.#setInternalValue(value);
7
+ }
8
+ #publish;
9
+ /**
10
+ * Creates a new ValueSignal instance.
11
+ * @param publish - The function that publishes the
12
+ * value of the signal to the server.
13
+ * @param value - The initial value of the signal
14
+ * @defaultValue undefined
15
+ */
16
+ constructor(publish, value) {
17
+ super(value);
18
+ this.#publish = publish;
19
+ }
20
+ /**
21
+ * Returns the value of the signal.
22
+ */
23
+ get value() {
24
+ return super.value;
25
+ }
26
+ /**
27
+ * Publishes the new value to the server.
28
+ * Note that this method is not setting
29
+ * the signal's value.
30
+ *
31
+ * @param value - The new value of the signal
32
+ * to be published to the server.
33
+ */
34
+ set value(value) {
35
+ const id = crypto.randomUUID();
36
+ this.#setInternalValue(value);
37
+ this.#publish({ id, type: StateEventType.SET, value }).catch((error) => {
38
+ throw error;
39
+ });
40
+ }
41
+ /**
42
+ * Sets the value of the signal.
43
+ * @param value - The new value of the signal.
44
+ * @internal
45
+ */
46
+ #setInternalValue(value) {
47
+ super.value = value;
48
+ }
49
+ }
50
+ class NumberSignal extends ValueSignal {
51
+ }
52
+ export {
53
+ NumberSignal,
54
+ ValueSignal,
55
+ setInternalValue
56
+ };
57
+ //# sourceMappingURL=Signals.js.map
package/Signals.js.map ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["src/Signals.ts"],
4
+ "sourcesContent": ["import { Signal } from './core.js';\nimport { type StateEvent, StateEventType } from './types';\n\n// eslint-disable-next-line import/no-mutable-exports\nexport let setInternalValue: <T>(signal: ValueSignal<T>, value: T) => void;\n\n/**\n * A signal that holds a value. The underlying\n * value of this signal is stored and updated as a\n * shared value on the server.\n *\n * @internal\n */\nexport abstract class ValueSignal<T> extends Signal<T> {\n static {\n setInternalValue = (signal: ValueSignal<unknown>, value: unknown): void => signal.#setInternalValue(value);\n }\n\n readonly #publish: (event: StateEvent) => Promise<boolean>;\n\n /**\n * Creates a new ValueSignal instance.\n * @param publish - The function that publishes the\n * value of the signal to the server.\n * @param value - The initial value of the signal\n * @defaultValue undefined\n */\n constructor(publish: (event: StateEvent) => Promise<boolean>, value?: T) {\n super(value);\n this.#publish = publish;\n }\n\n /**\n * Returns the value of the signal.\n */\n override get value(): T {\n return super.value;\n }\n\n /**\n * Publishes the new value to the server.\n * Note that this method is not setting\n * the signal's value.\n *\n * @param value - The new value of the signal\n * to be published to the server.\n */\n override set value(value: T) {\n const id = crypto.randomUUID();\n // set the local value to be used for latency compensation and offline support:\n this.#setInternalValue(value);\n // publish the update to the server:\n this.#publish({ id, type: StateEventType.SET, value }).catch((error) => {\n throw error;\n });\n }\n\n /**\n * Sets the value of the signal.\n * @param value - The new value of the signal.\n * @internal\n */\n #setInternalValue(value: T): void {\n super.value = value;\n }\n}\n\n/**\n * A signal that holds a number value. The underlying\n * value of this signal is stored and updated as a\n * shared value on the server.\n *\n * After obtaining the NumberSignal instance from\n * a server-side service that returns one, the value\n * can be updated using the `value` property,\n * and it can be read with or without the\n * `value` property (similar to a normal signal):\n *\n * @example\n * ```tsx\n * const counter = CounterService.counter();\n *\n * return (\n * <Button onClick={() => counter++)}>\n * Click count: { counter }\n * </Button>\n * <Button onClick={() => counter.value = 0}>Reset</Button>\n * );\n * ```\n */\nexport class NumberSignal extends ValueSignal<number> {}\n"],
5
+ "mappings": "AAAA,SAAS,cAAc;AACvB,SAA0B,sBAAsB;AAGzC,IAAI;AASJ,MAAe,oBAAuB,OAAU;AAAA,EACrD,OAAO;AACL,uBAAmB,CAAC,QAA8B,UAAyB,OAAO,kBAAkB,KAAK;AAAA,EAC3G;AAAA,EAES;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAST,YAAY,SAAkD,OAAW;AACvE,UAAM,KAAK;AACX,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAa,QAAW;AACtB,WAAO,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAa,MAAM,OAAU;AAC3B,UAAM,KAAK,OAAO,WAAW;AAE7B,SAAK,kBAAkB,KAAK;AAE5B,SAAK,SAAS,EAAE,IAAI,MAAM,eAAe,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,UAAU;AACtE,YAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,OAAgB;AAChC,UAAM,QAAQ;AAAA,EAChB;AACF;AAyBO,MAAM,qBAAqB,YAAoB;AAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,15 @@
1
+ import type { ConnectClient, EndpointRequestInit, Subscription } from '@vaadin/hilla-frontend';
2
+ import type { StateEvent } from './types';
3
+ /**
4
+ * SignalsHandler is a helper class for handling the
5
+ * communication of the full-stack signal instances
6
+ * and their server-side counterparts they are
7
+ * subscribed and publish their updates to.
8
+ */
9
+ export default class SignalsHandler {
10
+ #private;
11
+ constructor(client: ConnectClient);
12
+ subscribe(signalProviderEndpointMethod: string, clientSignalId: string): Subscription<StateEvent>;
13
+ update(clientSignalId: string, event: StateEvent, init?: EndpointRequestInit): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=SignalsHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignalsHandler.d.ts","sourceRoot":"","sources":["src/SignalsHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;;gBAGrB,MAAM,EAAE,aAAa;IAIjC,SAAS,CAAC,4BAA4B,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC;IAI3F,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAGnG"}
@@ -0,0 +1,16 @@
1
+ class SignalsHandler {
2
+ #client;
3
+ constructor(client) {
4
+ this.#client = client;
5
+ }
6
+ subscribe(signalProviderEndpointMethod, clientSignalId) {
7
+ return this.#client.subscribe("SignalsHandler", "subscribe", { signalProviderEndpointMethod, clientSignalId });
8
+ }
9
+ async update(clientSignalId, event, init) {
10
+ return this.#client.call("SignalsHandler", "update", { clientSignalId, event }, init);
11
+ }
12
+ }
13
+ export {
14
+ SignalsHandler as default
15
+ };
16
+ //# sourceMappingURL=SignalsHandler.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["src/SignalsHandler.ts"],
4
+ "sourcesContent": ["import type { ConnectClient, EndpointRequestInit, Subscription } from '@vaadin/hilla-frontend';\nimport type { StateEvent } from './types';\n\n/**\n * SignalsHandler is a helper class for handling the\n * communication of the full-stack signal instances\n * and their server-side counterparts they are\n * subscribed and publish their updates to.\n */\nexport default class SignalsHandler {\n readonly #client: ConnectClient;\n\n constructor(client: ConnectClient) {\n this.#client = client;\n }\n\n subscribe(signalProviderEndpointMethod: string, clientSignalId: string): Subscription<StateEvent> {\n return this.#client.subscribe('SignalsHandler', 'subscribe', { signalProviderEndpointMethod, clientSignalId });\n }\n\n async update(clientSignalId: string, event: StateEvent, init?: EndpointRequestInit): Promise<void> {\n return this.#client.call('SignalsHandler', 'update', { clientSignalId, event }, init);\n }\n}\n"],
5
+ "mappings": "AASA,MAAO,eAA6B;AAAA,EACzB;AAAA,EAET,YAAY,QAAuB;AACjC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,8BAAsC,gBAAkD;AAChG,WAAO,KAAK,QAAQ,UAAU,kBAAkB,aAAa,EAAE,8BAA8B,eAAe,CAAC;AAAA,EAC/G;AAAA,EAEA,MAAM,OAAO,gBAAwB,OAAmB,MAA2C;AACjG,WAAO,KAAK,QAAQ,KAAK,kBAAkB,UAAU,EAAE,gBAAgB,MAAM,GAAG,IAAI;AAAA,EACtF;AACF;",
6
+ "names": []
7
+ }
package/core.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from '@preact/signals-react';
2
+ //# sourceMappingURL=core.d.ts.map
package/core.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"AAKA,cAAc,uBAAuB,CAAC"}
package/core.js ADDED
@@ -0,0 +1,4 @@
1
+ import { installAutoSignalTracking } from "@preact/signals-react/runtime";
2
+ installAutoSignalTracking();
3
+ export * from "@preact/signals-react";
4
+ //# sourceMappingURL=core.js.map
package/core.js.map ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["src/core.ts"],
4
+ "sourcesContent": ["import { installAutoSignalTracking } from '@preact/signals-react/runtime';\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-call\ninstallAutoSignalTracking();\n\nexport * from '@preact/signals-react';\n"],
5
+ "mappings": "AAAA,SAAS,iCAAiC;AAG1C,0BAA0B;AAE1B,cAAc;",
6
+ "names": []
7
+ }
package/index.d.ts CHANGED
@@ -1,2 +1,5 @@
1
- export * from '@preact/signals-react';
1
+ export * from './core.js';
2
+ export { NumberSignalChannel } from './EventChannel.js';
3
+ export { NumberSignal, ValueSignal } from './Signals.js';
4
+ export * from './types.js';
2
5
  //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACzD,cAAc,YAAY,CAAC"}
package/index.js CHANGED
@@ -1,2 +1,10 @@
1
- export * from "@preact/signals-react";
1
+ export * from "./core.js";
2
+ import { NumberSignalChannel } from "./EventChannel.js";
3
+ import { NumberSignal, ValueSignal } from "./Signals.js";
4
+ export * from "./types.js";
5
+ export {
6
+ NumberSignal,
7
+ NumberSignalChannel,
8
+ ValueSignal
9
+ };
2
10
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["src/index.ts"],
4
- "sourcesContent": ["export * from '@preact/signals-react';\n"],
5
- "mappings": "AAAA,cAAc;",
4
+ "sourcesContent": ["// eslint-disable-next-line import/export\nexport * from './core.js';\nexport { NumberSignalChannel } from './EventChannel.js';\nexport { NumberSignal, ValueSignal } from './Signals.js';\nexport * from './types.js';\n"],
5
+ "mappings": "AACA,cAAc;AACd,SAAS,2BAA2B;AACpC,SAAS,cAAc,mBAAmB;AAC1C,cAAc;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/hilla-react-signals",
3
- "version": "24.5.0-alpha5",
3
+ "version": "24.5.0-alpha7",
4
4
  "description": "Signals for Hilla React",
5
5
  "main": "index.js",
6
6
  "module": "index.js",
@@ -21,8 +21,11 @@
21
21
  "build:esbuild": "tsx ../../../scripts/build.ts",
22
22
  "build:dts": "tsc --isolatedModules -p tsconfig.build.json",
23
23
  "build:copy": "cd src && copyfiles **/*.d.ts ..",
24
- "lint": "eslint src",
25
- "lint:fix": "eslint src --fix",
24
+ "lint": "eslint src test",
25
+ "lint:fix": "eslint src test --fix",
26
+ "test": "karma start ../../../karma.config.cjs --port 9881",
27
+ "test:coverage": "npm run test -- --coverage",
28
+ "test:watch": "npm run test -- --watch",
26
29
  "typecheck": "tsc --noEmit"
27
30
  },
28
31
  "exports": {
@@ -43,7 +46,8 @@
43
46
  "access": "public"
44
47
  },
45
48
  "dependencies": {
46
- "@preact/signals-react": "^2.0.0"
49
+ "@preact/signals-react": "^2.0.0",
50
+ "@vaadin/hilla-frontend": "24.5.0-alpha7"
47
51
  },
48
52
  "peerDependencies": {
49
53
  "react": "^18",
@@ -51,10 +55,24 @@
51
55
  },
52
56
  "devDependencies": {
53
57
  "@esm-bundle/chai": "^4.3.4-fix.0",
58
+ "@testing-library/dom": "^10.2.0",
59
+ "@testing-library/react": "^16.0.0",
60
+ "@testing-library/user-event": "^14.5.2",
61
+ "@types/chai": "^4.3.6",
62
+ "@types/chai-as-promised": "^7.1.6",
63
+ "@types/chai-dom": "^1.11.1",
64
+ "@types/mocha": "^10.0.2",
54
65
  "@types/react": "^18.2.23",
55
66
  "@types/sinon": "^10.0.17",
67
+ "@types/sinon-chai": "^3.2.10",
56
68
  "@types/validator": "^13.11.2",
57
- "react-router-dom": "^6.16.0",
69
+ "chai-as-promised": "^7.1.1",
70
+ "chai-dom": "^1.11.0",
71
+ "chai-like": "^1.1.1",
72
+ "karma": "^6.4.3",
73
+ "karma-viewport": "^1.0.9",
74
+ "sinon": "^16.0.0",
75
+ "sinon-chai": "^3.7.0",
58
76
  "typescript": "5.5.2"
59
77
  }
60
78
  }
package/types.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Types of events that can be produced or processed by a signal.
3
+ */
4
+ export declare enum StateEventType {
5
+ SET = "set",
6
+ SNAPSHOT = "snapshot"
7
+ }
8
+ /**
9
+ * Event that describes the state of a signal.
10
+ */
11
+ export type StateEvent = {
12
+ id: string;
13
+ type: StateEventType;
14
+ value: any;
15
+ };
16
+ //# sourceMappingURL=types.d.ts.map
package/types.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,cAAc;IACxB,GAAG,QAAQ;IACX,QAAQ,aAAa;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,GAAG,CAAC;CACZ,CAAC"}
package/types.js ADDED
@@ -0,0 +1,9 @@
1
+ var StateEventType = /* @__PURE__ */ ((StateEventType2) => {
2
+ StateEventType2["SET"] = "set";
3
+ StateEventType2["SNAPSHOT"] = "snapshot";
4
+ return StateEventType2;
5
+ })(StateEventType || {});
6
+ export {
7
+ StateEventType
8
+ };
9
+ //# sourceMappingURL=types.js.map
package/types.js.map ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["src/types.ts"],
4
+ "sourcesContent": ["/**\n * Types of events that can be produced or processed by a signal.\n */\nexport enum StateEventType {\n SET = 'set',\n SNAPSHOT = 'snapshot',\n}\n\n/**\n * Event that describes the state of a signal.\n */\nexport type StateEvent = {\n id: string;\n type: StateEventType;\n value: any;\n};\n"],
5
+ "mappings": "AAGO,IAAK,iBAAL,kBAAKA,oBAAL;AACL,EAAAA,gBAAA,SAAM;AACN,EAAAA,gBAAA,cAAW;AAFD,SAAAA;AAAA,GAAA;",
6
+ "names": ["StateEventType"]
7
+ }