phaser-hooks 0.2.1 → 0.3.0
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.
- package/dist/hooks/type.d.ts +16 -0
- package/dist/hooks/type.d.ts.map +1 -1
- package/dist/hooks/with-computed-state.d.ts.map +1 -1
- package/dist/hooks/with-computed-state.js +5 -1
- package/dist/hooks/with-computed-state.js.map +1 -1
- package/dist/hooks/with-debounced-state.d.ts.map +1 -1
- package/dist/hooks/with-debounced-state.js +3 -0
- package/dist/hooks/with-debounced-state.js.map +1 -1
- package/dist/hooks/with-global-state.spec.d.ts +2 -0
- package/dist/hooks/with-global-state.spec.d.ts.map +1 -0
- package/dist/hooks/with-global-state.spec.js +158 -0
- package/dist/hooks/with-global-state.spec.js.map +1 -0
- package/dist/hooks/with-local-state.spec.d.ts +2 -0
- package/dist/hooks/with-local-state.spec.d.ts.map +1 -0
- package/dist/hooks/with-local-state.spec.js +155 -0
- package/dist/hooks/with-local-state.spec.js.map +1 -0
- package/dist/hooks/with-state-def.d.ts +32 -5
- package/dist/hooks/with-state-def.d.ts.map +1 -1
- package/dist/hooks/with-state-def.js +288 -104
- package/dist/hooks/with-state-def.js.map +1 -1
- package/dist/hooks/with-undoable-state.d.ts.map +1 -1
- package/dist/hooks/with-undoable-state.js +3 -0
- package/dist/hooks/with-undoable-state.js.map +1 -1
- package/dist/hooks/with-undoable-state.spec.d.ts +2 -0
- package/dist/hooks/with-undoable-state.spec.d.ts.map +1 -0
- package/dist/hooks/with-undoable-state.spec.js +262 -0
- package/dist/hooks/with-undoable-state.spec.js.map +1 -0
- package/dist/test/scene-mock.d.ts +3 -0
- package/dist/test/scene-mock.d.ts.map +1 -0
- package/dist/test/scene-mock.js +13 -0
- package/dist/test/scene-mock.js.map +1 -0
- package/package.json +1 -1
package/dist/hooks/type.d.ts
CHANGED
|
@@ -55,5 +55,21 @@ export type HookState<T> = {
|
|
|
55
55
|
* @param callback Function to call when state changes
|
|
56
56
|
*/
|
|
57
57
|
onChange: (callback: StateChangeCallback<T>) => void;
|
|
58
|
+
/**
|
|
59
|
+
* Registers a callback to be called whenever the state changes
|
|
60
|
+
* @param callback Function to call when state changes
|
|
61
|
+
*/
|
|
62
|
+
on: (event: 'change', callback: () => void) => () => void;
|
|
63
|
+
/**
|
|
64
|
+
* Registers a callback to be called whenever the state changes
|
|
65
|
+
* @param callback Function to call when state changes
|
|
66
|
+
*/
|
|
67
|
+
once: (event: 'change', callback: () => void) => () => void;
|
|
68
|
+
/**
|
|
69
|
+
* Removes an event listener
|
|
70
|
+
* @param event The event to remove
|
|
71
|
+
* @param callback The callback to remove
|
|
72
|
+
*/
|
|
73
|
+
off: (event: 'change', callback: () => void) => void;
|
|
58
74
|
};
|
|
59
75
|
//# sourceMappingURL=type.d.ts.map
|
package/dist/hooks/type.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/hooks/type.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC;AAExE;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACzB;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC,CAAC;IAEb;;;OAGG;IACH,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAExB;;;OAGG;IACH,QAAQ,EAAE,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;CACtD,CAAC"}
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/hooks/type.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC;AAExE;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACzB;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC,CAAC;IAEb;;;OAGG;IACH,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAExB;;;OAGG;IACH,QAAQ,EAAE,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAErD;;;OAGG;IACH,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAE1D;;;OAGG;IACH,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAE5D;;;;OAIG;IACH,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CACtD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-computed-state.d.ts","sourceRoot":"","sources":["../../src/hooks/with-computed-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAG5D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,EAAE,CAAC,EACpC,OAAO,MAAM,CAAC,KAAK,EACnB,KAAK,MAAM,EACX,aAAa,SAAS,CAAC,CAAC,CAAC,EACzB,UAAU,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,KAC5B,SAAS,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"with-computed-state.d.ts","sourceRoot":"","sources":["../../src/hooks/with-computed-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAG5D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,EAAE,CAAC,EACpC,OAAO,MAAM,CAAC,KAAK,EACnB,KAAK,MAAM,EACX,aAAa,SAAS,CAAC,CAAC,CAAC,EACzB,UAAU,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,KAC5B,SAAS,CAAC,CAAC,CAwBb,CAAC"}
|
|
@@ -25,7 +25,8 @@ export const withComputedState = (scene, key, sourceState, selector) => {
|
|
|
25
25
|
const initialValue = selector(sourceState.get());
|
|
26
26
|
const computedState = withLocalState(scene, key, initialValue);
|
|
27
27
|
// Update computed state when source changes
|
|
28
|
-
sourceState.
|
|
28
|
+
sourceState.on('change', () => {
|
|
29
|
+
const newSourceValue = sourceState.get();
|
|
29
30
|
const newComputedValue = selector(newSourceValue);
|
|
30
31
|
computedState.set(newComputedValue);
|
|
31
32
|
});
|
|
@@ -35,6 +36,9 @@ export const withComputedState = (scene, key, sourceState, selector) => {
|
|
|
35
36
|
throw new Error(`[withComputedState] Cannot directly set computed state "${key}". Update the source state instead.`);
|
|
36
37
|
},
|
|
37
38
|
onChange: computedState.onChange,
|
|
39
|
+
on: computedState.on,
|
|
40
|
+
once: computedState.once,
|
|
41
|
+
off: computedState.off,
|
|
38
42
|
};
|
|
39
43
|
};
|
|
40
44
|
//# sourceMappingURL=with-computed-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-computed-state.js","sourceRoot":"","sources":["../../src/hooks/with-computed-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,KAAmB,EACnB,GAAW,EACX,WAAyB,EACzB,QAA6B,EACf,EAAE;IAChB,iCAAiC;IACjC,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,cAAc,CAAI,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;IAElE,4CAA4C;IAC5C,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"with-computed-state.js","sourceRoot":"","sources":["../../src/hooks/with-computed-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,KAAmB,EACnB,GAAW,EACX,WAAyB,EACzB,QAA6B,EACf,EAAE;IAChB,iCAAiC;IACjC,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,cAAc,CAAI,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;IAElE,4CAA4C;IAC5C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC5B,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACzC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;QAClD,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,EAAE,aAAa,CAAC,GAAG;QACtB,GAAG,EAAE,GAAS,EAAE;YACd,MAAM,IAAI,KAAK,CACb,2DAA2D,GAAG,qCAAqC,CACpG,CAAC;QACJ,CAAC;QACD,QAAQ,EAAE,aAAa,CAAC,QAAQ;QAChC,EAAE,EAAE,aAAa,CAAC,EAAE;QACpB,IAAI,EAAE,aAAa,CAAC,IAAI;QACxB,GAAG,EAAE,aAAa,CAAC,GAAG;KACvB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-debounced-state.d.ts","sourceRoot":"","sources":["../../src/hooks/with-debounced-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGxC;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAClC,OAAO,MAAM,CAAC,KAAK,EACnB,KAAK,MAAM,EACX,cAAc,CAAC,EACf,YAAY,MAAM,KACjB,SAAS,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"with-debounced-state.d.ts","sourceRoot":"","sources":["../../src/hooks/with-debounced-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGxC;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAClC,OAAO,MAAM,CAAC,KAAK,EACnB,KAAK,MAAM,EACX,cAAc,CAAC,EACf,YAAY,MAAM,KACjB,SAAS,CAAC,CAAC,CAuBb,CAAC"}
|
|
@@ -34,6 +34,9 @@ export const withDebouncedState = (scene, key, initialValue, debounceMs) => {
|
|
|
34
34
|
get: actualState.get,
|
|
35
35
|
set: debouncedSet,
|
|
36
36
|
onChange: actualState.onChange,
|
|
37
|
+
on: actualState.on,
|
|
38
|
+
once: actualState.once,
|
|
39
|
+
off: actualState.off,
|
|
37
40
|
};
|
|
38
41
|
};
|
|
39
42
|
//# sourceMappingURL=with-debounced-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-debounced-state.js","sourceRoot":"","sources":["../../src/hooks/with-debounced-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAAmB,EACnB,GAAW,EACX,YAAe,EACf,UAAkB,EACJ,EAAE;IAChB,MAAM,WAAW,GAAG,cAAc,CAAI,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;IAChE,IAAI,SAAS,GAAyC,IAAI,CAAC;IAE3D,MAAM,YAAY,GAAG,CAAC,KAAQ,EAAQ,EAAE;QACtC,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;QAED,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACvB,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,GAAG,EAAE,YAAY;QACjB,QAAQ,EAAE,WAAW,CAAC,QAAQ;
|
|
1
|
+
{"version":3,"file":"with-debounced-state.js","sourceRoot":"","sources":["../../src/hooks/with-debounced-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAAmB,EACnB,GAAW,EACX,YAAe,EACf,UAAkB,EACJ,EAAE;IAChB,MAAM,WAAW,GAAG,cAAc,CAAI,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;IAChE,IAAI,SAAS,GAAyC,IAAI,CAAC;IAE3D,MAAM,YAAY,GAAG,CAAC,KAAQ,EAAQ,EAAE;QACtC,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;QAED,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACvB,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,GAAG,EAAE,YAAY;QACjB,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,EAAE,EAAE,WAAW,CAAC,EAAE;QAClB,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,GAAG,EAAE,WAAW,CAAC,GAAG;KACrB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-global-state.spec.d.ts","sourceRoot":"","sources":["../../src/hooks/with-global-state.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/* eslint-disable max-lines-per-function */
|
|
2
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
+
import { buildSceneMock } from '../test/scene-mock';
|
|
4
|
+
import { withGlobalState } from './with-global-state';
|
|
5
|
+
describe('withGlobalState', () => {
|
|
6
|
+
const baseState = {
|
|
7
|
+
life: 100,
|
|
8
|
+
};
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
vi.clearAllMocks();
|
|
11
|
+
});
|
|
12
|
+
describe('validation', () => {
|
|
13
|
+
it('should throw an error if the scene is not provided', () => {
|
|
14
|
+
const scene = null;
|
|
15
|
+
expect(() => withGlobalState(scene, 'test-state', baseState)).toThrow('[withGlobalState] Scene parameter is required');
|
|
16
|
+
});
|
|
17
|
+
it('should throw an error if the registry manager is not provided', () => {
|
|
18
|
+
const scene = buildSceneMock();
|
|
19
|
+
// @ts-expect-error - we want to test the error case
|
|
20
|
+
scene.registry = null;
|
|
21
|
+
expect(() => withGlobalState(scene, 'test-state', baseState)).toThrow('[withStateDef] Scene registry is not available. Ensure the scene is properly initialized.');
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
it('should be defined', () => {
|
|
25
|
+
expect(withGlobalState).toBeDefined();
|
|
26
|
+
});
|
|
27
|
+
describe('initial state definition', () => {
|
|
28
|
+
it('should set initial state value if not provided in first call', () => {
|
|
29
|
+
const scene = buildSceneMock();
|
|
30
|
+
const key = `test-state-${Date.now()}`;
|
|
31
|
+
const initialState = { ...baseState, life: 90 };
|
|
32
|
+
const setSpy = vi.spyOn(scene.registry, 'set');
|
|
33
|
+
withGlobalState(scene, key, initialState);
|
|
34
|
+
// withGlobalState uses scene.registry, not scene.data, for global state
|
|
35
|
+
expect(setSpy).toHaveBeenCalledWith(`phaser-hooks:global:${key}`, initialState);
|
|
36
|
+
setSpy.mockRestore();
|
|
37
|
+
});
|
|
38
|
+
it('should not set state in second call', () => {
|
|
39
|
+
const scene = buildSceneMock();
|
|
40
|
+
const key = `test-state-${Date.now()}`;
|
|
41
|
+
const initialState = { ...baseState, life: 75 };
|
|
42
|
+
const setSpy = vi.spyOn(scene.registry, 'set');
|
|
43
|
+
withGlobalState(scene, key, initialState);
|
|
44
|
+
expect(setSpy).toHaveBeenCalledWith(`phaser-hooks:global:${key}`, initialState);
|
|
45
|
+
// second call should not set state
|
|
46
|
+
const hook = withGlobalState(scene, key, {
|
|
47
|
+
...baseState,
|
|
48
|
+
life: 100,
|
|
49
|
+
});
|
|
50
|
+
expect(setSpy).toHaveBeenCalledTimes(1);
|
|
51
|
+
expect(hook.get()).toEqual(initialState);
|
|
52
|
+
setSpy.mockRestore();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('get/set', () => {
|
|
56
|
+
it('should return the initial state', () => {
|
|
57
|
+
const scene = buildSceneMock();
|
|
58
|
+
const key = `test-state-${Date.now()}`;
|
|
59
|
+
const initialState = { ...baseState, life: 100 };
|
|
60
|
+
const hook = withGlobalState(scene, key, initialState);
|
|
61
|
+
expect(hook.get()).toEqual(initialState);
|
|
62
|
+
});
|
|
63
|
+
it('should return the updated state', () => {
|
|
64
|
+
const scene = buildSceneMock();
|
|
65
|
+
const key = `test-state-${Date.now()}`;
|
|
66
|
+
const initialState = { ...baseState, life: 100 };
|
|
67
|
+
const hook = withGlobalState(scene, key, initialState);
|
|
68
|
+
hook.set({ ...baseState, life: 90 });
|
|
69
|
+
expect(hook.get()).toEqual({ ...baseState, life: 90 });
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('events', () => {
|
|
73
|
+
describe('on', () => {
|
|
74
|
+
it('should register a change listener', () => {
|
|
75
|
+
const scene = buildSceneMock();
|
|
76
|
+
const key = `test-state-${Date.now()}`;
|
|
77
|
+
const initialState = { ...baseState, life: 100 };
|
|
78
|
+
const callback = vi.fn();
|
|
79
|
+
const hook = withGlobalState(scene, key, initialState);
|
|
80
|
+
hook.on('change', callback);
|
|
81
|
+
hook.set({ ...baseState, life: 90 });
|
|
82
|
+
expect(callback).toHaveBeenCalled();
|
|
83
|
+
});
|
|
84
|
+
it('should call multiple listeners', () => {
|
|
85
|
+
const scene = buildSceneMock();
|
|
86
|
+
const key = `test-state-${Date.now()}`;
|
|
87
|
+
const initialState = { ...baseState, life: 100 };
|
|
88
|
+
const callback1 = vi.fn();
|
|
89
|
+
const callback2 = vi.fn();
|
|
90
|
+
const hook = withGlobalState(scene, key, initialState);
|
|
91
|
+
hook.on('change', callback1);
|
|
92
|
+
hook.on('change', callback2);
|
|
93
|
+
hook.set({ ...baseState, life: 90 });
|
|
94
|
+
expect(callback1).toHaveBeenCalled();
|
|
95
|
+
expect(callback2).toHaveBeenCalled();
|
|
96
|
+
});
|
|
97
|
+
it('should not call listener when call unsubscribe returned by .on function', () => {
|
|
98
|
+
const scene = buildSceneMock();
|
|
99
|
+
const key = `test-state-${Date.now()}`;
|
|
100
|
+
const initialState = { ...baseState, life: 100 };
|
|
101
|
+
const callback = vi.fn();
|
|
102
|
+
const hook = withGlobalState(scene, key, initialState);
|
|
103
|
+
const unsubscribe = hook.on('change', callback);
|
|
104
|
+
hook.set({ ...baseState, life: 90 });
|
|
105
|
+
expect(callback).toHaveBeenCalled();
|
|
106
|
+
unsubscribe();
|
|
107
|
+
hook.set({ ...baseState, life: 100 });
|
|
108
|
+
expect(callback).toHaveBeenCalledTimes(1);
|
|
109
|
+
});
|
|
110
|
+
it('should not call listener when add .off method to remove listener', () => {
|
|
111
|
+
const scene = buildSceneMock();
|
|
112
|
+
const key = `test-state-${Date.now()}`;
|
|
113
|
+
const initialState = { ...baseState, life: 100 };
|
|
114
|
+
const callback = vi.fn();
|
|
115
|
+
const hook = withGlobalState(scene, key, initialState);
|
|
116
|
+
hook.on('change', callback);
|
|
117
|
+
hook.off('change', callback);
|
|
118
|
+
hook.set({ ...baseState, life: 90 });
|
|
119
|
+
expect(callback).not.toHaveBeenCalled();
|
|
120
|
+
});
|
|
121
|
+
it('should call listener when call .once method', () => {
|
|
122
|
+
const scene = buildSceneMock();
|
|
123
|
+
const key = `test-state-${Date.now()}`;
|
|
124
|
+
const initialState = { ...baseState, life: 100 };
|
|
125
|
+
const callback = vi.fn();
|
|
126
|
+
const hook = withGlobalState(scene, key, initialState);
|
|
127
|
+
hook.once('change', callback);
|
|
128
|
+
hook.set({ ...baseState, life: 90 });
|
|
129
|
+
expect(callback).toHaveBeenCalled();
|
|
130
|
+
});
|
|
131
|
+
it('should call listener once when call .once method', () => {
|
|
132
|
+
const scene = buildSceneMock();
|
|
133
|
+
const key = `test-state-${Date.now()}`;
|
|
134
|
+
const initialState = { ...baseState, life: 100 };
|
|
135
|
+
const callback = vi.fn();
|
|
136
|
+
const hook = withGlobalState(scene, key, initialState);
|
|
137
|
+
hook.once('change', callback);
|
|
138
|
+
hook.set({ ...baseState, life: 90 });
|
|
139
|
+
expect(callback).toHaveBeenCalled();
|
|
140
|
+
hook.set({ ...baseState, life: 100 });
|
|
141
|
+
expect(callback).toHaveBeenCalledTimes(1);
|
|
142
|
+
});
|
|
143
|
+
it('should not call listener when call unsubscribe returned by .once function', () => {
|
|
144
|
+
const scene = buildSceneMock();
|
|
145
|
+
const key = `test-state-${Date.now()}`;
|
|
146
|
+
const initialState = { ...baseState, life: 100 };
|
|
147
|
+
const callback = vi.fn();
|
|
148
|
+
const hook = withGlobalState(scene, key, initialState);
|
|
149
|
+
const unsubscribe = hook.once('change', callback);
|
|
150
|
+
unsubscribe();
|
|
151
|
+
hook.set({ ...baseState, life: 90 });
|
|
152
|
+
hook.set({ ...baseState, life: 100 });
|
|
153
|
+
expect(callback).not.toHaveBeenCalled();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
//# sourceMappingURL=with-global-state.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-global-state.spec.js","sourceRoot":"","sources":["../../src/hooks/with-global-state.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-local-state.spec.d.ts","sourceRoot":"","sources":["../../src/hooks/with-local-state.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/* eslint-disable max-lines-per-function */
|
|
2
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
+
import { buildSceneMock } from "../test/scene-mock";
|
|
4
|
+
import { withLocalState } from "./with-local-state";
|
|
5
|
+
describe('withLocalState', () => {
|
|
6
|
+
const baseState = {
|
|
7
|
+
life: 100,
|
|
8
|
+
};
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
vi.clearAllMocks();
|
|
11
|
+
});
|
|
12
|
+
describe('validation', () => {
|
|
13
|
+
it('should throw an error if the scene is not provided', () => {
|
|
14
|
+
// @ts-expect-error - we want to test the error case
|
|
15
|
+
expect(() => withLocalState(null, 'test-state', baseState)).toThrow('[withLocalState] Scene parameter is required');
|
|
16
|
+
});
|
|
17
|
+
it('should throw an error if the data manager is not provided', () => {
|
|
18
|
+
const scene = buildSceneMock();
|
|
19
|
+
// @ts-expect-error - we want to test the error case
|
|
20
|
+
scene.data = null;
|
|
21
|
+
expect(() => withLocalState(scene, 'test-state', baseState)).toThrow('[withStateDef] Scene data is not available. Ensure the scene is properly initialized.');
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
it('should be defined', () => {
|
|
25
|
+
expect(withLocalState).toBeDefined();
|
|
26
|
+
});
|
|
27
|
+
describe('initial state definition', () => {
|
|
28
|
+
it('should set initial state value if not provided in first call', () => {
|
|
29
|
+
const scene = buildSceneMock();
|
|
30
|
+
const key = `test-state-${Date.now()}`;
|
|
31
|
+
const initialState = { ...baseState, life: 90 };
|
|
32
|
+
const setSpy = vi.spyOn(scene.data, 'set');
|
|
33
|
+
withLocalState(scene, key, initialState);
|
|
34
|
+
// withLocalState uses scene.data, not scene.registry, for local state
|
|
35
|
+
expect(setSpy).toHaveBeenCalledWith(`phaser-hooks:local:test-scene:${key}`, initialState);
|
|
36
|
+
setSpy.mockRestore();
|
|
37
|
+
});
|
|
38
|
+
it('should not set state in second call', () => {
|
|
39
|
+
const scene = buildSceneMock();
|
|
40
|
+
const key = `test-state-${Date.now()}`;
|
|
41
|
+
const initialState = { ...baseState, life: 75 };
|
|
42
|
+
const setSpy = vi.spyOn(scene.data, 'set');
|
|
43
|
+
withLocalState(scene, key, initialState);
|
|
44
|
+
expect(setSpy).toHaveBeenCalledWith(`phaser-hooks:local:test-scene:${key}`, initialState);
|
|
45
|
+
// second call should not set state
|
|
46
|
+
const hook = withLocalState(scene, key, { ...baseState, life: 100 });
|
|
47
|
+
expect(setSpy).toHaveBeenCalledTimes(1);
|
|
48
|
+
expect(hook.get()).toEqual(initialState);
|
|
49
|
+
setSpy.mockRestore();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('get/set', () => {
|
|
53
|
+
it('should return the initial state', () => {
|
|
54
|
+
const scene = buildSceneMock();
|
|
55
|
+
const key = `test-state-${Date.now()}`;
|
|
56
|
+
const initialState = { ...baseState, life: 100 };
|
|
57
|
+
const hook = withLocalState(scene, key, initialState);
|
|
58
|
+
expect(hook.get()).toEqual(initialState);
|
|
59
|
+
});
|
|
60
|
+
it('should return the updated state', () => {
|
|
61
|
+
const scene = buildSceneMock();
|
|
62
|
+
const key = `test-state-${Date.now()}`;
|
|
63
|
+
const initialState = { ...baseState, life: 100 };
|
|
64
|
+
const hook = withLocalState(scene, key, initialState);
|
|
65
|
+
hook.set({ ...baseState, life: 90 });
|
|
66
|
+
expect(hook.get()).toEqual({ ...baseState, life: 90 });
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('events', () => {
|
|
70
|
+
describe('on', () => {
|
|
71
|
+
it('should register a change listener', () => {
|
|
72
|
+
const scene = buildSceneMock();
|
|
73
|
+
const key = `test-state-${Date.now()}`;
|
|
74
|
+
const initialState = { ...baseState, life: 100 };
|
|
75
|
+
const callback = vi.fn();
|
|
76
|
+
const hook = withLocalState(scene, key, initialState);
|
|
77
|
+
hook.on('change', callback);
|
|
78
|
+
hook.set({ ...baseState, life: 90 });
|
|
79
|
+
expect(callback).toHaveBeenCalled();
|
|
80
|
+
});
|
|
81
|
+
it('should call multiple listeners', () => {
|
|
82
|
+
const scene = buildSceneMock();
|
|
83
|
+
const key = `test-state-${Date.now()}`;
|
|
84
|
+
const initialState = { ...baseState, life: 100 };
|
|
85
|
+
const callback1 = vi.fn();
|
|
86
|
+
const callback2 = vi.fn();
|
|
87
|
+
const hook = withLocalState(scene, key, initialState);
|
|
88
|
+
hook.on('change', callback1);
|
|
89
|
+
hook.on('change', callback2);
|
|
90
|
+
hook.set({ ...baseState, life: 90 });
|
|
91
|
+
expect(callback1).toHaveBeenCalled();
|
|
92
|
+
expect(callback2).toHaveBeenCalled();
|
|
93
|
+
});
|
|
94
|
+
it('should not call listener when call unsubscribe returned by .on function', () => {
|
|
95
|
+
const scene = buildSceneMock();
|
|
96
|
+
const key = `test-state-${Date.now()}`;
|
|
97
|
+
const initialState = { ...baseState, life: 100 };
|
|
98
|
+
const callback = vi.fn();
|
|
99
|
+
const hook = withLocalState(scene, key, initialState);
|
|
100
|
+
const unsubscribe = hook.on('change', callback);
|
|
101
|
+
hook.set({ ...baseState, life: 90 });
|
|
102
|
+
expect(callback).toHaveBeenCalled();
|
|
103
|
+
unsubscribe();
|
|
104
|
+
hook.set({ ...baseState, life: 100 });
|
|
105
|
+
expect(callback).toHaveBeenCalledTimes(1);
|
|
106
|
+
});
|
|
107
|
+
it('should not call listener when add .off method to remove listener', () => {
|
|
108
|
+
const scene = buildSceneMock();
|
|
109
|
+
const key = `test-state-${Date.now()}`;
|
|
110
|
+
const initialState = { ...baseState, life: 100 };
|
|
111
|
+
const callback = vi.fn();
|
|
112
|
+
const hook = withLocalState(scene, key, initialState);
|
|
113
|
+
hook.on('change', callback);
|
|
114
|
+
hook.off('change', callback);
|
|
115
|
+
hook.set({ ...baseState, life: 90 });
|
|
116
|
+
expect(callback).not.toHaveBeenCalled();
|
|
117
|
+
});
|
|
118
|
+
it('should call listener when call .once method', () => {
|
|
119
|
+
const scene = buildSceneMock();
|
|
120
|
+
const key = `test-state-${Date.now()}`;
|
|
121
|
+
const initialState = { ...baseState, life: 100 };
|
|
122
|
+
const callback = vi.fn();
|
|
123
|
+
const hook = withLocalState(scene, key, initialState);
|
|
124
|
+
hook.once('change', callback);
|
|
125
|
+
hook.set({ ...baseState, life: 90 });
|
|
126
|
+
expect(callback).toHaveBeenCalled();
|
|
127
|
+
});
|
|
128
|
+
it('should call listener once when call .once method', () => {
|
|
129
|
+
const scene = buildSceneMock();
|
|
130
|
+
const key = `test-state-${Date.now()}`;
|
|
131
|
+
const initialState = { ...baseState, life: 100 };
|
|
132
|
+
const callback = vi.fn();
|
|
133
|
+
const hook = withLocalState(scene, key, initialState);
|
|
134
|
+
hook.once('change', callback);
|
|
135
|
+
hook.set({ ...baseState, life: 90 });
|
|
136
|
+
expect(callback).toHaveBeenCalled();
|
|
137
|
+
hook.set({ ...baseState, life: 100 });
|
|
138
|
+
expect(callback).toHaveBeenCalledTimes(1);
|
|
139
|
+
});
|
|
140
|
+
it('should not call listener when call unsubscribe returned by .once function', () => {
|
|
141
|
+
const scene = buildSceneMock();
|
|
142
|
+
const key = `test-state-${Date.now()}`;
|
|
143
|
+
const initialState = { ...baseState, life: 100 };
|
|
144
|
+
const callback = vi.fn();
|
|
145
|
+
const hook = withLocalState(scene, key, initialState);
|
|
146
|
+
const unsubscribe = hook.once('change', callback);
|
|
147
|
+
unsubscribe();
|
|
148
|
+
hook.set({ ...baseState, life: 90 });
|
|
149
|
+
hook.set({ ...baseState, life: 100 });
|
|
150
|
+
expect(callback).not.toHaveBeenCalled();
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=with-local-state.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-local-state.spec.js","sourceRoot":"","sources":["../../src/hooks/with-local-state.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,11 @@ import * as Phaser from 'phaser';
|
|
|
2
2
|
import { type HookState } from './type';
|
|
3
3
|
/**
|
|
4
4
|
* Configuration options for state definition
|
|
5
|
+
* @typedef {Object} StateDefOptions
|
|
6
|
+
* @property {boolean} [persistent] Whether to persist state across scene changes. @default true
|
|
7
|
+
* @property {(value: unknown) => boolean | string} [validator] Custom validator function for state values. Returns true if valid, false or error message if invalid.
|
|
8
|
+
* @property {boolean} [debug] Whether to enable debug logging for this state. @default false
|
|
9
|
+
* @property {boolean} [global] Whether to use global state. @default false
|
|
5
10
|
*/
|
|
6
11
|
export type StateDefOptions = {
|
|
7
12
|
/**
|
|
@@ -35,11 +40,11 @@ export type StateDefOptions = {
|
|
|
35
40
|
* for most use cases unless you need specific registry control.
|
|
36
41
|
*
|
|
37
42
|
* @template T The type of the state value
|
|
38
|
-
* @param scene The Phaser scene instance that owns this state
|
|
39
|
-
* @param key Unique identifier for the state in the registry
|
|
40
|
-
* @param initialValue Optional initial value to set if key doesn't exist
|
|
41
|
-
* @param options Optional configuration for state behavior
|
|
42
|
-
* @returns HookState interface for managing the state
|
|
43
|
+
* @param {Phaser.Scene} scene The Phaser scene instance that owns this state
|
|
44
|
+
* @param {string} key Unique identifier for the state in the registry
|
|
45
|
+
* @param {T} [initialValue] Optional initial value to set if key doesn't exist
|
|
46
|
+
* @param {StateDefOptions} [options] Optional configuration for state behavior
|
|
47
|
+
* @returns {HookState<T>} HookState interface for managing the state
|
|
43
48
|
*
|
|
44
49
|
* @throws {Error} When scene or registry is not available
|
|
45
50
|
* @throws {Error} When key is invalid (empty or non-string)
|
|
@@ -74,7 +79,29 @@ export type StateDefOptions = {
|
|
|
74
79
|
* 'initial',
|
|
75
80
|
* { debug: true }
|
|
76
81
|
* );
|
|
82
|
+
*
|
|
83
|
+
* // Listening to changes
|
|
84
|
+
* playerState.on('change', (newValue, oldValue) => {
|
|
85
|
+
* console.log('Player state changed:', newValue, oldValue);
|
|
86
|
+
* });
|
|
87
|
+
*
|
|
88
|
+
* // Listening to changes only once
|
|
89
|
+
* playerState.once('change', (newValue, oldValue) => {
|
|
90
|
+
* console.log('Player state changed once:', newValue, oldValue);
|
|
91
|
+
* });
|
|
92
|
+
*
|
|
93
|
+
* // Removing a listener
|
|
94
|
+
* const unsubscribe = playerState.on('change', callback);
|
|
95
|
+
* unsubscribe(); // Removes the listener
|
|
96
|
+
* playerState.off('change', callback); // Also removes the listener
|
|
77
97
|
* ```
|
|
98
|
+
*
|
|
99
|
+
* @method get Gets the current state value
|
|
100
|
+
* @method set Sets a new state value and triggers change listeners
|
|
101
|
+
* @method on Registers a callback to be called whenever the state changes. Returns an unsubscribe function.
|
|
102
|
+
* @method once Registers a callback to be called once when the state changes. Returns an unsubscribe function.
|
|
103
|
+
* @method off Removes an event listener for the state
|
|
104
|
+
* @method onChange (DEPRECATED) Registers a callback to be called whenever the state changes
|
|
78
105
|
*/
|
|
79
106
|
export declare const withStateDef: <T>(scene: Phaser.Scene, key: string, initialValue?: T, options?: StateDefOptions) => HookState<T>;
|
|
80
107
|
//# sourceMappingURL=with-state-def.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-state-def.d.ts","sourceRoot":"","sources":["../../src/hooks/with-state-def.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"with-state-def.d.ts","sourceRoot":"","sources":["../../src/hooks/with-state-def.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,KAAK,SAAS,EAA4B,MAAM,QAAQ,CAAC;AAElE;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG,MAAM,CAAC;IAEjD;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAqSF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,EAC5B,OAAO,MAAM,CAAC,KAAK,EACnB,KAAK,MAAM,EACX,eAAe,CAAC,EAChB,UAAS,eAAoB,KAC5B,SAAS,CAAC,CAAC,CAiDb,CAAC"}
|