@multitapio/multitap 0.0.9 → 0.0.10
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/lib.js +57 -6
- package/dist/react/hooks/useQuery.d.ts +13 -2
- package/dist/react/hooks/useQuery.d.ts.map +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/types/session.d.ts +11 -0
- package/dist/react/types/session.d.ts.map +1 -1
- package/dist/types/react/hooks/useQuery.d.ts +13 -2
- package/dist/types/react/hooks/useQuery.d.ts.map +1 -1
- package/dist/types/react/index.d.ts +1 -1
- package/dist/types/react/index.d.ts.map +1 -1
- package/dist/types/react/types/session.d.ts +11 -0
- package/dist/types/react/types/session.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/lib.js
CHANGED
|
@@ -8317,6 +8317,27 @@ function useFrame(callback, renderPriority) {
|
|
|
8317
8317
|
// src/react/hooks/useQuery.ts
|
|
8318
8318
|
import { useState as useState2, useCallback as useCallback2 } from "react";
|
|
8319
8319
|
import { createStore as createStore2, useStore } from "zustand";
|
|
8320
|
+
function shallowEqual(a, b) {
|
|
8321
|
+
if (a === b) return true;
|
|
8322
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
8323
|
+
if (a.length !== b.length) return false;
|
|
8324
|
+
for (let i = 0; i < a.length; i++) {
|
|
8325
|
+
if (a[i] !== b[i]) return false;
|
|
8326
|
+
}
|
|
8327
|
+
return true;
|
|
8328
|
+
}
|
|
8329
|
+
return false;
|
|
8330
|
+
}
|
|
8331
|
+
function createSelectorStore(initial) {
|
|
8332
|
+
return createStore2((set, get) => ({
|
|
8333
|
+
result: initial,
|
|
8334
|
+
update: (newResult) => {
|
|
8335
|
+
if (!shallowEqual(get().result, newResult)) {
|
|
8336
|
+
set({ result: newResult });
|
|
8337
|
+
}
|
|
8338
|
+
}
|
|
8339
|
+
}));
|
|
8340
|
+
}
|
|
8320
8341
|
function createEntityStore() {
|
|
8321
8342
|
return createStore2((set, get) => ({
|
|
8322
8343
|
entities: [],
|
|
@@ -8346,13 +8367,20 @@ function createEntityStore() {
|
|
|
8346
8367
|
}
|
|
8347
8368
|
}));
|
|
8348
8369
|
}
|
|
8349
|
-
function useQuery(include, exclude) {
|
|
8370
|
+
function useQuery(include, exclude, selector) {
|
|
8350
8371
|
const { schema } = useSession();
|
|
8351
8372
|
const [entityStore] = useState2(createEntityStore);
|
|
8373
|
+
const [selectorStore] = useState2(
|
|
8374
|
+
() => selector ? createSelectorStore([]) : null
|
|
8375
|
+
);
|
|
8352
8376
|
const entities = useStore(entityStore, (state) => state.entities);
|
|
8377
|
+
const selectorResult = useStore(
|
|
8378
|
+
selectorStore ?? entityStore,
|
|
8379
|
+
(state) => "result" in state ? state.result : null
|
|
8380
|
+
);
|
|
8353
8381
|
useFrame(
|
|
8354
8382
|
useCallback2(
|
|
8355
|
-
({ state }) => {
|
|
8383
|
+
({ state, players }) => {
|
|
8356
8384
|
const stateBuffer = new Uint8Array(
|
|
8357
8385
|
state.buffer,
|
|
8358
8386
|
state.byteOffset,
|
|
@@ -8361,19 +8389,34 @@ function useQuery(include, exclude) {
|
|
|
8361
8389
|
const queryResults = query(schema, stateBuffer, include, exclude);
|
|
8362
8390
|
const entityState = entityStore.getState();
|
|
8363
8391
|
entityState.updateEntities(queryResults);
|
|
8392
|
+
if (selector && selectorStore) {
|
|
8393
|
+
const currentEntities = entityStore.getState().entities;
|
|
8394
|
+
const result = selector(currentEntities, { state, players });
|
|
8395
|
+
selectorStore.getState().update(result);
|
|
8396
|
+
}
|
|
8364
8397
|
},
|
|
8365
|
-
[schema, include, exclude, entityStore]
|
|
8398
|
+
[schema, include, exclude, entityStore, selector, selectorStore]
|
|
8366
8399
|
)
|
|
8367
8400
|
);
|
|
8401
|
+
if (selector) {
|
|
8402
|
+
return selectorResult;
|
|
8403
|
+
}
|
|
8368
8404
|
return entities;
|
|
8369
8405
|
}
|
|
8370
|
-
function useQueryMask(includeMask, excludeMask) {
|
|
8406
|
+
function useQueryMask(includeMask, excludeMask, selector) {
|
|
8371
8407
|
const { schema } = useSession();
|
|
8372
8408
|
const [entityStore] = useState2(createEntityStore);
|
|
8409
|
+
const [selectorStore] = useState2(
|
|
8410
|
+
() => selector ? createSelectorStore([]) : null
|
|
8411
|
+
);
|
|
8373
8412
|
const entities = useStore(entityStore, (state) => state.entities);
|
|
8413
|
+
const selectorResult = useStore(
|
|
8414
|
+
selectorStore ?? entityStore,
|
|
8415
|
+
(state) => "result" in state ? state.result : null
|
|
8416
|
+
);
|
|
8374
8417
|
useFrame(
|
|
8375
8418
|
useCallback2(
|
|
8376
|
-
({ state }) => {
|
|
8419
|
+
({ state, players }) => {
|
|
8377
8420
|
const stateBuffer = new Uint8Array(
|
|
8378
8421
|
state.buffer,
|
|
8379
8422
|
state.byteOffset,
|
|
@@ -8382,10 +8425,18 @@ function useQueryMask(includeMask, excludeMask) {
|
|
|
8382
8425
|
const queryResults = queryByMask(schema, stateBuffer, includeMask, excludeMask);
|
|
8383
8426
|
const entityState = entityStore.getState();
|
|
8384
8427
|
entityState.updateEntities(queryResults);
|
|
8428
|
+
if (selector && selectorStore) {
|
|
8429
|
+
const currentEntities = entityStore.getState().entities;
|
|
8430
|
+
const result = selector(currentEntities, { state, players });
|
|
8431
|
+
selectorStore.getState().update(result);
|
|
8432
|
+
}
|
|
8385
8433
|
},
|
|
8386
|
-
[schema, includeMask, excludeMask, entityStore]
|
|
8434
|
+
[schema, includeMask, excludeMask, entityStore, selector, selectorStore]
|
|
8387
8435
|
)
|
|
8388
8436
|
);
|
|
8437
|
+
if (selector) {
|
|
8438
|
+
return selectorResult;
|
|
8439
|
+
}
|
|
8389
8440
|
return entities;
|
|
8390
8441
|
}
|
|
8391
8442
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { QuerySelector } from '../types/session';
|
|
1
2
|
import { type EntityRef } from '../../state';
|
|
2
3
|
/**
|
|
3
4
|
* useQuery hook that returns entities matching component requirements
|
|
@@ -9,11 +10,16 @@ import { type EntityRef } from '../../state';
|
|
|
9
10
|
* // Find entities with Position but NOT RespawnTimer
|
|
10
11
|
* const activeShips = useQuery(['Position', 'Ship'], ['RespawnTimer']);
|
|
11
12
|
*
|
|
13
|
+
* // With selector to transform results
|
|
14
|
+
* const shipCount = useQuery(['Position', 'Ship'], undefined, (entities) => entities.length);
|
|
15
|
+
*
|
|
12
16
|
* @param include - Component names that entities must have
|
|
13
17
|
* @param exclude - Optional component names that entities must NOT have
|
|
14
|
-
* @
|
|
18
|
+
* @param selector - Optional selector function to transform results
|
|
19
|
+
* @returns Array of EntityRef matching the query, or selector result if provided
|
|
15
20
|
*/
|
|
16
21
|
export declare function useQuery(include: string[], exclude?: string[]): EntityRef[];
|
|
22
|
+
export declare function useQuery<T>(include: string[], exclude: string[] | undefined, selector: QuerySelector<T>): T;
|
|
17
23
|
/**
|
|
18
24
|
* useQueryMask hook that returns entities matching pre-computed bitmasks.
|
|
19
25
|
*
|
|
@@ -33,9 +39,14 @@ export declare function useQuery(include: string[], exclude?: string[]): EntityR
|
|
|
33
39
|
* return ships.map(entity => <Ship key={entity} entity={entity} />);
|
|
34
40
|
* }
|
|
35
41
|
*
|
|
42
|
+
* // With selector
|
|
43
|
+
* const shipCount = useQueryMask(SHIPS_MASK, undefined, (entities) => entities.length);
|
|
44
|
+
*
|
|
36
45
|
* @param includeMask - Bigint bitmask of components that must be present
|
|
37
46
|
* @param excludeMask - Optional bigint bitmask of components that must NOT be present
|
|
38
|
-
* @
|
|
47
|
+
* @param selector - Optional selector function to transform results
|
|
48
|
+
* @returns Array of EntityRef matching the query, or selector result if provided
|
|
39
49
|
*/
|
|
40
50
|
export declare function useQueryMask(includeMask: bigint, excludeMask?: bigint): EntityRef[];
|
|
51
|
+
export declare function useQueryMask<T>(includeMask: bigint, excludeMask: bigint | undefined, selector: QuerySelector<T>): T;
|
|
41
52
|
//# sourceMappingURL=useQuery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/useQuery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/useQuery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAA;AAyEhE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAA;AAC5E,wBAAgB,QAAQ,CAAC,CAAC,EACxB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAC7B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACzB,CAAC,CAAA;AAsDJ;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAA;AACpF,wBAAgB,YAAY,CAAC,CAAC,EAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACzB,CAAC,CAAA"}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
export { SessionProvider, SessionContext, useSessionContext } from './providers';
|
|
5
5
|
export { useSession, useFrame, useQuery, useQueryMask, usePlayers, useCurrentPlayer, useEvent } from './hooks';
|
|
6
6
|
export type { CapturedEvent, UseEventOptions } from './hooks';
|
|
7
|
-
export type { Player, PlayerStore, EntityStore, SessionContextValue, SessionProviderProps, ReactSessionInterface, ReactCreateSession, UseSessionRenderCallback, } from './types/session';
|
|
7
|
+
export type { Player, PlayerStore, EntityStore, SessionContextValue, SessionProviderProps, ReactSessionInterface, ReactCreateSession, UseSessionRenderCallback, QuerySelector, QuerySelectorContext, } from './types/session';
|
|
8
8
|
export { Player as UnicamPlayer, Player as PlayerController } from './Player';
|
|
9
9
|
export { Crosshair } from './Crosshair';
|
|
10
10
|
export type { PlayerProps, PlayerHandle, PlayerIntent, ViewType, Vector3Like, QuaternionLike, InterpolationMode, } from './types';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGhF,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC9G,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAG7D,YAAY,EACV,MAAM,EACN,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGhF,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC9G,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAG7D,YAAY,EACV,MAAM,EACN,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,wBAAwB,EACxB,aAAa,EACb,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAQxB,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAG7E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGvC,YAAY,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,cAAc,EACd,iBAAiB,GAClB,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAGvC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAGrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAC5C,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAGpF,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,aAAa,EACb,OAAO,GACR,MAAM,SAAS,CAAA;AAChB,YAAY,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA"}
|
|
@@ -20,6 +20,17 @@ export type EntityStore = {
|
|
|
20
20
|
entities: EntityRef[];
|
|
21
21
|
updateEntities: (incoming: Generator<EntityRef>) => void;
|
|
22
22
|
};
|
|
23
|
+
/**
|
|
24
|
+
* Context passed to query selectors
|
|
25
|
+
*/
|
|
26
|
+
export type QuerySelectorContext = {
|
|
27
|
+
state: DataView;
|
|
28
|
+
players: Player[];
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Selector function for transforming query results
|
|
32
|
+
*/
|
|
33
|
+
export type QuerySelector<T> = (entities: EntityRef[], context: QuerySelectorContext) => T;
|
|
23
34
|
/**
|
|
24
35
|
* Zustand store for tracking session players
|
|
25
36
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/react/types/session.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/react/types/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { QuerySelector } from '../types/session';
|
|
1
2
|
import { type EntityRef } from '../../state';
|
|
2
3
|
/**
|
|
3
4
|
* useQuery hook that returns entities matching component requirements
|
|
@@ -9,11 +10,16 @@ import { type EntityRef } from '../../state';
|
|
|
9
10
|
* // Find entities with Position but NOT RespawnTimer
|
|
10
11
|
* const activeShips = useQuery(['Position', 'Ship'], ['RespawnTimer']);
|
|
11
12
|
*
|
|
13
|
+
* // With selector to transform results
|
|
14
|
+
* const shipCount = useQuery(['Position', 'Ship'], undefined, (entities) => entities.length);
|
|
15
|
+
*
|
|
12
16
|
* @param include - Component names that entities must have
|
|
13
17
|
* @param exclude - Optional component names that entities must NOT have
|
|
14
|
-
* @
|
|
18
|
+
* @param selector - Optional selector function to transform results
|
|
19
|
+
* @returns Array of EntityRef matching the query, or selector result if provided
|
|
15
20
|
*/
|
|
16
21
|
export declare function useQuery(include: string[], exclude?: string[]): EntityRef[];
|
|
22
|
+
export declare function useQuery<T>(include: string[], exclude: string[] | undefined, selector: QuerySelector<T>): T;
|
|
17
23
|
/**
|
|
18
24
|
* useQueryMask hook that returns entities matching pre-computed bitmasks.
|
|
19
25
|
*
|
|
@@ -33,9 +39,14 @@ export declare function useQuery(include: string[], exclude?: string[]): EntityR
|
|
|
33
39
|
* return ships.map(entity => <Ship key={entity} entity={entity} />);
|
|
34
40
|
* }
|
|
35
41
|
*
|
|
42
|
+
* // With selector
|
|
43
|
+
* const shipCount = useQueryMask(SHIPS_MASK, undefined, (entities) => entities.length);
|
|
44
|
+
*
|
|
36
45
|
* @param includeMask - Bigint bitmask of components that must be present
|
|
37
46
|
* @param excludeMask - Optional bigint bitmask of components that must NOT be present
|
|
38
|
-
* @
|
|
47
|
+
* @param selector - Optional selector function to transform results
|
|
48
|
+
* @returns Array of EntityRef matching the query, or selector result if provided
|
|
39
49
|
*/
|
|
40
50
|
export declare function useQueryMask(includeMask: bigint, excludeMask?: bigint): EntityRef[];
|
|
51
|
+
export declare function useQueryMask<T>(includeMask: bigint, excludeMask: bigint | undefined, selector: QuerySelector<T>): T;
|
|
41
52
|
//# sourceMappingURL=useQuery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/useQuery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../../../src/react/hooks/useQuery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAA;AAyEhE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAA;AAC5E,wBAAgB,QAAQ,CAAC,CAAC,EACxB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAC7B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACzB,CAAC,CAAA;AAsDJ;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAA;AACpF,wBAAgB,YAAY,CAAC,CAAC,EAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACzB,CAAC,CAAA"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
export { SessionProvider, SessionContext, useSessionContext } from './providers';
|
|
5
5
|
export { useSession, useFrame, useQuery, useQueryMask, usePlayers, useCurrentPlayer, useEvent } from './hooks';
|
|
6
6
|
export type { CapturedEvent, UseEventOptions } from './hooks';
|
|
7
|
-
export type { Player, PlayerStore, EntityStore, SessionContextValue, SessionProviderProps, ReactSessionInterface, ReactCreateSession, UseSessionRenderCallback, } from './types/session';
|
|
7
|
+
export type { Player, PlayerStore, EntityStore, SessionContextValue, SessionProviderProps, ReactSessionInterface, ReactCreateSession, UseSessionRenderCallback, QuerySelector, QuerySelectorContext, } from './types/session';
|
|
8
8
|
export { Player as UnicamPlayer, Player as PlayerController } from './Player';
|
|
9
9
|
export { Crosshair } from './Crosshair';
|
|
10
10
|
export type { PlayerProps, PlayerHandle, PlayerIntent, ViewType, Vector3Like, QuaternionLike, InterpolationMode, } from './types';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGhF,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC9G,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAG7D,YAAY,EACV,MAAM,EACN,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGhF,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC9G,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAG7D,YAAY,EACV,MAAM,EACN,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,wBAAwB,EACxB,aAAa,EACb,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAQxB,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAG7E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGvC,YAAY,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,cAAc,EACd,iBAAiB,GAClB,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAGvC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAGrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAC5C,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAGpF,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,aAAa,EACb,OAAO,GACR,MAAM,SAAS,CAAA;AAChB,YAAY,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA"}
|
|
@@ -20,6 +20,17 @@ export type EntityStore = {
|
|
|
20
20
|
entities: EntityRef[];
|
|
21
21
|
updateEntities: (incoming: Generator<EntityRef>) => void;
|
|
22
22
|
};
|
|
23
|
+
/**
|
|
24
|
+
* Context passed to query selectors
|
|
25
|
+
*/
|
|
26
|
+
export type QuerySelectorContext = {
|
|
27
|
+
state: DataView;
|
|
28
|
+
players: Player[];
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Selector function for transforming query results
|
|
32
|
+
*/
|
|
33
|
+
export type QuerySelector<T> = (entities: EntityRef[], context: QuerySelectorContext) => T;
|
|
23
34
|
/**
|
|
24
35
|
* Zustand store for tracking session players
|
|
25
36
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/react/types/session.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/react/types/session.ts"],"names":[],"mappings":"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"}
|