@liveblocks/redux 1.1.2 → 1.1.4-internal1

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,90 @@
1
+ import { JsonObject, BaseUserMeta, Client, User, Status } from '@liveblocks/client';
2
+ import { LegacyConnectionStatus } from '@liveblocks/core';
3
+ import { StoreEnhancer } from 'redux';
4
+
5
+ declare type Mapping<T> = {
6
+ [K in keyof T]?: boolean;
7
+ };
8
+ declare type LiveblocksContext<TPresence extends JsonObject, TUserMeta extends BaseUserMeta> = {
9
+ /**
10
+ * Other users in the room. Empty no room is currently synced
11
+ */
12
+ readonly others: readonly User<TPresence, TUserMeta>[];
13
+ /**
14
+ * Whether or not the room storage is currently loading
15
+ */
16
+ readonly isStorageLoading: boolean;
17
+ /**
18
+ * Legacy connection status of the room.
19
+ *
20
+ * @deprecated This API will be removed in a future version of Liveblocks.
21
+ * Prefer using the newer `.status` property.
22
+ *
23
+ * We recommend making the following changes if you use these APIs:
24
+ *
25
+ * OLD STATUSES NEW STATUSES
26
+ * closed --> initial
27
+ * authenticating --> connecting
28
+ * connecting --> connecting
29
+ * open --> connected
30
+ * unavailable --> reconnecting
31
+ * failed --> disconnected
32
+ */
33
+ readonly connection: LegacyConnectionStatus;
34
+ /**
35
+ * Connection status of the room.
36
+ */
37
+ readonly status: Status;
38
+ };
39
+ /**
40
+ * @deprecated Please rename to WithLiveblocks<...>
41
+ */
42
+ declare type LiveblocksState<TState, TPresence extends JsonObject, TUserMeta extends BaseUserMeta> = WithLiveblocks<TState, TPresence, TUserMeta>;
43
+ /**
44
+ * Adds the `liveblocks` property to your custom Redux state.
45
+ */
46
+ declare type WithLiveblocks<TState, TPresence extends JsonObject, TUserMeta extends BaseUserMeta> = TState & {
47
+ readonly liveblocks: LiveblocksContext<TPresence, TUserMeta>;
48
+ };
49
+ /**
50
+ * Actions used to interact with Liveblocks
51
+ */
52
+ declare const actions: {
53
+ /**
54
+ * Enters a room and starts sync it with Redux state
55
+ * @param roomId The id of the room
56
+ */
57
+ enterRoom: typeof enterRoom;
58
+ /**
59
+ * Leaves a room and stops sync it with Redux state.
60
+ * @param roomId The id of the room
61
+ */
62
+ leaveRoom: typeof leaveRoom;
63
+ };
64
+ declare function enterRoom(roomId: string): {
65
+ type: string;
66
+ roomId: string;
67
+ };
68
+ declare function leaveRoom(roomId: string): {
69
+ type: string;
70
+ roomId: string;
71
+ };
72
+ /**
73
+ * Redux store enhancer that will make the `liveblocks` key available on your
74
+ * Redux store.
75
+ */
76
+ declare const liveblocksEnhancer: <TState>(options: {
77
+ client: Client;
78
+ storageMapping?: Mapping<TState> | undefined;
79
+ presenceMapping?: Mapping<TState> | undefined;
80
+ }) => StoreEnhancer;
81
+ /**
82
+ * @deprecated Renamed to `liveblocksEnhancer`.
83
+ */
84
+ declare const enhancer: <TState>(options: {
85
+ client: Client;
86
+ storageMapping?: Mapping<TState> | undefined;
87
+ presenceMapping?: Mapping<TState> | undefined;
88
+ }) => StoreEnhancer;
89
+
90
+ export { LiveblocksState, Mapping, WithLiveblocks, actions, enhancer, liveblocksEnhancer };
package/dist/index.js CHANGED
@@ -1,24 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var __defProp = Object.defineProperty;
2
- var __defProps = Object.defineProperties;
3
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
- var __spreadValues = (a, b) => {
9
- for (var prop in b || (b = {}))
10
- if (__hasOwnProp.call(b, prop))
11
- __defNormalProp(a, prop, b[prop]);
12
- if (__getOwnPropSymbols)
13
- for (var prop of __getOwnPropSymbols(b)) {
14
- if (__propIsEnum.call(b, prop))
15
- __defNormalProp(a, prop, b[prop]);
16
- }
17
- return a;
18
- };
19
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
-
21
- // src/index.ts
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/index.ts
22
2
 
23
3
 
24
4
 
@@ -86,33 +66,45 @@ var internalEnhancer = (options) => {
86
66
  const newReducer = (state, action) => {
87
67
  switch (action.type) {
88
68
  case ACTION_TYPES.PATCH_REDUX_STATE:
89
- return __spreadValues(__spreadValues({}, state), action.state);
69
+ return {
70
+ ...state,
71
+ ...action.state
72
+ };
90
73
  case ACTION_TYPES.INIT_STORAGE:
91
- return __spreadProps(__spreadValues(__spreadValues({}, state), action.state), {
92
- liveblocks: __spreadProps(__spreadValues({}, state.liveblocks), {
74
+ return {
75
+ ...state,
76
+ ...action.state,
77
+ liveblocks: {
78
+ ...state.liveblocks,
93
79
  isStorageLoading: false
94
- })
95
- });
80
+ }
81
+ };
96
82
  case ACTION_TYPES.START_LOADING_STORAGE:
97
- return __spreadProps(__spreadValues({}, state), {
98
- liveblocks: __spreadProps(__spreadValues({}, state.liveblocks), {
83
+ return {
84
+ ...state,
85
+ liveblocks: {
86
+ ...state.liveblocks,
99
87
  isStorageLoading: true
100
- })
101
- });
88
+ }
89
+ };
102
90
  case ACTION_TYPES.UPDATE_CONNECTION: {
103
- return __spreadProps(__spreadValues({}, state), {
104
- liveblocks: __spreadProps(__spreadValues({}, state.liveblocks), {
91
+ return {
92
+ ...state,
93
+ liveblocks: {
94
+ ...state.liveblocks,
105
95
  connection: action.connection,
106
96
  status: action.status
107
- })
108
- });
97
+ }
98
+ };
109
99
  }
110
100
  case ACTION_TYPES.UPDATE_OTHERS: {
111
- return __spreadProps(__spreadValues({}, state), {
112
- liveblocks: __spreadProps(__spreadValues({}, state.liveblocks), {
101
+ return {
102
+ ...state,
103
+ liveblocks: {
104
+ ...state.liveblocks,
113
105
  others: action.others
114
- })
115
- });
106
+ }
107
+ };
116
108
  }
117
109
  default: {
118
110
  const newState = reducer(state, action);
@@ -132,14 +124,15 @@ var internalEnhancer = (options) => {
132
124
  isPatching = false;
133
125
  }
134
126
  if (newState.liveblocks == null) {
135
- return __spreadProps(__spreadValues({}, newState), {
127
+ return {
128
+ ...newState,
136
129
  liveblocks: {
137
130
  others: [],
138
131
  isStorageLoading: false,
139
132
  connection: "closed",
140
133
  status: "initial"
141
134
  }
142
- });
135
+ };
143
136
  }
144
137
  return newState;
145
138
  }
@@ -242,9 +235,10 @@ var internalEnhancer = (options) => {
242
235
  store.dispatch(action);
243
236
  }
244
237
  }
245
- return __spreadProps(__spreadValues({}, store), {
238
+ return {
239
+ ...store,
246
240
  dispatch: newDispatch
247
- });
241
+ };
248
242
  };
249
243
  };
250
244
  };
@@ -347,3 +341,4 @@ function validateMapping(mapping, mappingType) {
347
341
 
348
342
 
349
343
  exports.actions = actions; exports.enhancer = enhancer; exports.liveblocksEnhancer = liveblocksEnhancer;
344
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts"],"names":["enhancer","enterRoom","updates","leaveRoom"],"mappings":"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","sourcesContent":["import type {\n BaseUserMeta,\n Client,\n Json,\n JsonObject,\n LiveObject,\n LsonObject,\n Room,\n Status,\n User,\n} from \"@liveblocks/client\";\nimport type { LegacyConnectionStatus } from \"@liveblocks/core\";\nimport {\n legacy_patchImmutableObject,\n lsonToJson,\n patchLiveObjectKey,\n} from \"@liveblocks/core\";\nimport type { StoreEnhancer } from \"redux\";\n\nimport {\n mappingShouldBeAnObject,\n mappingShouldNotHaveTheSameKeys,\n mappingToFunctionIsNotAllowed,\n mappingValueShouldBeABoolean,\n missingClient,\n} from \"./errors\";\n\nexport type Mapping<T> = {\n [K in keyof T]?: boolean;\n};\n\nconst ACTION_TYPES = {\n ENTER: \"@@LIVEBLOCKS/ENTER\",\n LEAVE: \"@@LIVEBLOCKS/LEAVE\",\n START_LOADING_STORAGE: \"@@LIVEBLOCKS/START_LOADING_STORAGE\",\n INIT_STORAGE: \"@@LIVEBLOCKS/INIT_STORAGE\",\n PATCH_REDUX_STATE: \"@@LIVEBLOCKS/PATCH_REDUX_STATE\",\n UPDATE_CONNECTION: \"@@LIVEBLOCKS/UPDATE_CONNECTION\",\n UPDATE_OTHERS: \"@@LIVEBLOCKS/UPDATE_OTHERS\",\n};\n\ntype LiveblocksContext<\n TPresence extends JsonObject,\n TUserMeta extends BaseUserMeta,\n> = {\n /**\n * Other users in the room. Empty no room is currently synced\n */\n readonly others: readonly User<TPresence, TUserMeta>[];\n /**\n * Whether or not the room storage is currently loading\n */\n readonly isStorageLoading: boolean;\n /**\n * Legacy connection status of the room.\n *\n * @deprecated This API will be removed in a future version of Liveblocks.\n * Prefer using the newer `.status` property.\n *\n * We recommend making the following changes if you use these APIs:\n *\n * OLD STATUSES NEW STATUSES\n * closed --> initial\n * authenticating --> connecting\n * connecting --> connecting\n * open --> connected\n * unavailable --> reconnecting\n * failed --> disconnected\n */\n readonly connection: LegacyConnectionStatus;\n /**\n * Connection status of the room.\n */\n readonly status: Status;\n};\n\n/**\n * @deprecated Please rename to WithLiveblocks<...>\n */\nexport type LiveblocksState<\n TState,\n TPresence extends JsonObject,\n TUserMeta extends BaseUserMeta,\n> = WithLiveblocks<TState, TPresence, TUserMeta>;\n\n/**\n * Adds the `liveblocks` property to your custom Redux state.\n */\nexport type WithLiveblocks<\n TState,\n TPresence extends JsonObject,\n TUserMeta extends BaseUserMeta,\n> = TState & { readonly liveblocks: LiveblocksContext<TPresence, TUserMeta> };\n\nconst internalEnhancer = <TState>(options: {\n client: Client;\n storageMapping?: Mapping<TState>;\n presenceMapping?: Mapping<TState>;\n}) => {\n type OpaqueRoom = Room<JsonObject, LsonObject, BaseUserMeta, Json>;\n\n if (process.env.NODE_ENV !== \"production\" && options.client == null) {\n throw missingClient();\n }\n const client = options.client;\n const mapping = validateMapping(\n options.storageMapping || {},\n \"storageMapping\"\n );\n const presenceMapping = validateMapping(\n options.presenceMapping || {},\n \"presenceMapping\"\n );\n if (process.env.NODE_ENV !== \"production\") {\n validateNoDuplicateKeys(mapping, presenceMapping);\n }\n\n return (createStore: any) => {\n return (reducer: any, initialState: any, enhancer: any) => {\n let room: OpaqueRoom | null = null;\n let isPatching: boolean = false;\n let storageRoot: LiveObject<LsonObject> | null = null;\n let unsubscribeCallbacks: Array<() => void> = [];\n\n const newReducer = (state: any, action: any) => {\n switch (action.type) {\n case ACTION_TYPES.PATCH_REDUX_STATE:\n return {\n ...state,\n ...action.state,\n };\n case ACTION_TYPES.INIT_STORAGE:\n return {\n ...state,\n ...action.state,\n liveblocks: {\n ...state.liveblocks,\n isStorageLoading: false,\n },\n };\n case ACTION_TYPES.START_LOADING_STORAGE:\n return {\n ...state,\n liveblocks: {\n ...state.liveblocks,\n isStorageLoading: true,\n },\n };\n case ACTION_TYPES.UPDATE_CONNECTION: {\n return {\n ...state,\n liveblocks: {\n ...state.liveblocks,\n connection: action.connection,\n status: action.status,\n },\n };\n }\n case ACTION_TYPES.UPDATE_OTHERS: {\n return {\n ...state,\n liveblocks: {\n ...state.liveblocks,\n others: action.others,\n },\n };\n }\n default: {\n const newState = reducer(state, action);\n\n if (room) {\n isPatching = true;\n updatePresence(room, state, newState, presenceMapping as any);\n\n room.batch(() => {\n if (storageRoot) {\n patchLiveblocksStorage(\n storageRoot,\n state,\n newState,\n mapping as any\n );\n }\n });\n isPatching = false;\n }\n\n if (newState.liveblocks == null) {\n return {\n ...newState,\n liveblocks: {\n others: [],\n isStorageLoading: false,\n connection: \"closed\",\n status: \"initial\",\n },\n };\n }\n return newState;\n }\n }\n };\n\n const store = createStore(newReducer, initialState, enhancer);\n\n function enterRoom(roomId: string) {\n if (storageRoot) {\n return;\n }\n\n const initialPresence = selectFields(\n store.getState(),\n presenceMapping\n ) as any;\n\n room = client.enter(roomId, { initialPresence });\n\n unsubscribeCallbacks.push(\n room.events.connection.subscribe(() => {\n store.dispatch({\n type: ACTION_TYPES.UPDATE_CONNECTION,\n connection: room!.getConnectionState(),\n status: room!.getStatus(),\n });\n })\n );\n\n unsubscribeCallbacks.push(\n room.events.others.subscribe(({ others }) => {\n store.dispatch({\n type: ACTION_TYPES.UPDATE_OTHERS,\n others,\n });\n })\n );\n\n unsubscribeCallbacks.push(\n room.events.me.subscribe(() => {\n if (isPatching === false) {\n store.dispatch({\n type: ACTION_TYPES.PATCH_REDUX_STATE,\n state: selectFields(room!.getPresence(), presenceMapping),\n });\n }\n })\n );\n\n store.dispatch({\n type: ACTION_TYPES.START_LOADING_STORAGE,\n });\n\n void room.getStorage().then(({ root }) => {\n const updates: any = {};\n\n room!.batch(() => {\n for (const key in mapping) {\n const liveblocksStatePart = root.get(key);\n\n if (liveblocksStatePart == null) {\n updates[key] = store.getState()[key];\n patchLiveObjectKey(root, key, undefined, store.getState()[key]);\n } else {\n updates[key] = lsonToJson(liveblocksStatePart);\n }\n }\n });\n\n store.dispatch({\n type: ACTION_TYPES.INIT_STORAGE,\n state: updates,\n });\n\n storageRoot = root;\n unsubscribeCallbacks.push(\n room!.subscribe(\n root,\n (updates) => {\n if (isPatching === false) {\n store.dispatch({\n type: ACTION_TYPES.PATCH_REDUX_STATE,\n state: patchState(\n store.getState(),\n updates,\n mapping as any\n ),\n });\n }\n },\n { isDeep: true }\n )\n );\n });\n }\n\n function leaveRoom(roomId: string) {\n for (const unsubscribe of unsubscribeCallbacks) {\n unsubscribe();\n }\n\n storageRoot = null;\n room = null;\n isPatching = false;\n unsubscribeCallbacks = [];\n\n client.leave(roomId);\n }\n\n function newDispatch(action: any) {\n if (action.type === ACTION_TYPES.ENTER) {\n enterRoom(action.roomId);\n } else if (action.type === ACTION_TYPES.LEAVE) {\n leaveRoom(action.roomId);\n } else {\n store.dispatch(action);\n }\n }\n\n return {\n ...store,\n dispatch: newDispatch,\n };\n };\n };\n};\n\n/**\n * Actions used to interact with Liveblocks\n */\nexport const actions = {\n /**\n * Enters a room and starts sync it with Redux state\n * @param roomId The id of the room\n */\n enterRoom,\n /**\n * Leaves a room and stops sync it with Redux state.\n * @param roomId The id of the room\n */\n leaveRoom,\n};\n\nfunction enterRoom(roomId: string): {\n type: string;\n roomId: string;\n} {\n return {\n type: ACTION_TYPES.ENTER,\n roomId,\n };\n}\n\nfunction leaveRoom(roomId: string): {\n type: string;\n roomId: string;\n} {\n return {\n type: ACTION_TYPES.LEAVE,\n roomId,\n };\n}\n\n/**\n * Redux store enhancer that will make the `liveblocks` key available on your\n * Redux store.\n */\nexport const liveblocksEnhancer = internalEnhancer as <TState>(options: {\n client: Client;\n storageMapping?: Mapping<TState>;\n presenceMapping?: Mapping<TState>;\n}) => StoreEnhancer;\n\n/**\n * @deprecated Renamed to `liveblocksEnhancer`.\n */\nexport const enhancer = liveblocksEnhancer;\n\nfunction patchLiveblocksStorage<O extends LsonObject, TState>(\n root: LiveObject<O>,\n oldState: TState,\n newState: TState,\n mapping: Mapping<TState>\n) {\n for (const key in mapping) {\n if (\n process.env.NODE_ENV !== \"production\" &&\n typeof newState[key] === \"function\"\n ) {\n throw mappingToFunctionIsNotAllowed(\"value\");\n }\n\n if (oldState[key] !== newState[key]) {\n const oldVal = oldState[key];\n const newVal = newState[key];\n patchLiveObjectKey(root, key, oldVal as any, newVal);\n }\n }\n}\n\nfunction updatePresence<TPresence extends JsonObject>(\n room: Room<TPresence, any, any, any>,\n oldState: TPresence,\n newState: TPresence,\n presenceMapping: Mapping<TPresence>\n) {\n for (const key in presenceMapping) {\n if (typeof newState[key] === \"function\") {\n throw mappingToFunctionIsNotAllowed(\"value\");\n }\n\n if (oldState[key] !== newState[key]) {\n room.updatePresence({ [key]: newState[key] } as TPresence);\n }\n }\n}\n\nfunction isObject(value: any): value is object {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n}\n\nfunction validateNoDuplicateKeys<TState>(\n storageMapping: Mapping<TState>,\n presenceMapping: Mapping<TState>\n) {\n for (const key in storageMapping) {\n if (presenceMapping[key] !== undefined) {\n throw mappingShouldNotHaveTheSameKeys(key);\n }\n }\n}\n\nfunction selectFields<TState>(\n presence: TState,\n mapping: Mapping<TState>\n): /* TODO: Actually, Pick<TState, keyof Mapping<TState>> ? */\nPartial<TState> {\n const partialState = {} as Partial<TState>;\n for (const key in mapping) {\n partialState[key] = presence[key];\n }\n return partialState;\n}\n\nfunction patchState<TState extends JsonObject>(\n state: TState,\n updates: any[], // StorageUpdate\n mapping: Mapping<TState>\n) {\n const partialState: Partial<TState> = {};\n\n for (const key in mapping) {\n partialState[key] = state[key];\n }\n\n const patched = legacy_patchImmutableObject(partialState, updates);\n\n const result: Partial<TState> = {};\n\n for (const key in mapping) {\n result[key] = patched[key];\n }\n\n return result;\n}\n\n/**\n * Remove false keys from mapping and generate to a new object to avoid potential mutation from outside the middleware\n */\nfunction validateMapping<TState>(\n mapping: Mapping<TState>,\n mappingType: \"storageMapping\" | \"presenceMapping\"\n): Mapping<TState> {\n if (process.env.NODE_ENV !== \"production\") {\n if (!isObject(mapping)) {\n throw mappingShouldBeAnObject(mappingType);\n }\n }\n\n const result: Mapping<TState> = {};\n for (const key in mapping) {\n if (\n process.env.NODE_ENV !== \"production\" &&\n typeof mapping[key] !== \"boolean\"\n ) {\n throw mappingValueShouldBeABoolean(mappingType, key);\n }\n\n if (mapping[key] === true) {\n result[key] = true;\n }\n }\n return result;\n}\n","export const ERROR_PREFIX = \"Invalid @liveblocks/redux middleware config.\";\n\nexport function missingClient(): Error {\n return new Error(`${ERROR_PREFIX} client is missing`);\n}\n\nexport function mappingShouldBeAnObject(\n mappingType: \"storageMapping\" | \"presenceMapping\"\n): Error {\n return new Error(\n `${ERROR_PREFIX} ${mappingType} should be an object where the values are boolean.`\n );\n}\n\nexport function mappingValueShouldBeABoolean(\n mappingType: \"storageMapping\" | \"presenceMapping\",\n key: string\n): Error {\n return new Error(\n `${ERROR_PREFIX} ${mappingType}.${key} value should be a boolean`\n );\n}\n\nexport function mappingShouldNotHaveTheSameKeys(key: string): Error {\n return new Error(\n `${ERROR_PREFIX} \"${key}\" is mapped on presenceMapping and storageMapping. A key shouldn't exist on both mapping.`\n );\n}\n\nexport function mappingToFunctionIsNotAllowed(key: string): Error {\n return new Error(\n `${ERROR_PREFIX} mapping.${key} is invalid. Mapping to a function is not allowed.`\n );\n}\n"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,344 @@
1
+ // src/index.ts
2
+ import {
3
+ legacy_patchImmutableObject,
4
+ lsonToJson,
5
+ patchLiveObjectKey
6
+ } from "@liveblocks/core";
7
+
8
+ // src/errors.ts
9
+ var ERROR_PREFIX = "Invalid @liveblocks/redux middleware config.";
10
+ function missingClient() {
11
+ return new Error(`${ERROR_PREFIX} client is missing`);
12
+ }
13
+ function mappingShouldBeAnObject(mappingType) {
14
+ return new Error(
15
+ `${ERROR_PREFIX} ${mappingType} should be an object where the values are boolean.`
16
+ );
17
+ }
18
+ function mappingValueShouldBeABoolean(mappingType, key) {
19
+ return new Error(
20
+ `${ERROR_PREFIX} ${mappingType}.${key} value should be a boolean`
21
+ );
22
+ }
23
+ function mappingShouldNotHaveTheSameKeys(key) {
24
+ return new Error(
25
+ `${ERROR_PREFIX} "${key}" is mapped on presenceMapping and storageMapping. A key shouldn't exist on both mapping.`
26
+ );
27
+ }
28
+ function mappingToFunctionIsNotAllowed(key) {
29
+ return new Error(
30
+ `${ERROR_PREFIX} mapping.${key} is invalid. Mapping to a function is not allowed.`
31
+ );
32
+ }
33
+
34
+ // src/index.ts
35
+ var ACTION_TYPES = {
36
+ ENTER: "@@LIVEBLOCKS/ENTER",
37
+ LEAVE: "@@LIVEBLOCKS/LEAVE",
38
+ START_LOADING_STORAGE: "@@LIVEBLOCKS/START_LOADING_STORAGE",
39
+ INIT_STORAGE: "@@LIVEBLOCKS/INIT_STORAGE",
40
+ PATCH_REDUX_STATE: "@@LIVEBLOCKS/PATCH_REDUX_STATE",
41
+ UPDATE_CONNECTION: "@@LIVEBLOCKS/UPDATE_CONNECTION",
42
+ UPDATE_OTHERS: "@@LIVEBLOCKS/UPDATE_OTHERS"
43
+ };
44
+ var internalEnhancer = (options) => {
45
+ if (process.env.NODE_ENV !== "production" && options.client == null) {
46
+ throw missingClient();
47
+ }
48
+ const client = options.client;
49
+ const mapping = validateMapping(
50
+ options.storageMapping || {},
51
+ "storageMapping"
52
+ );
53
+ const presenceMapping = validateMapping(
54
+ options.presenceMapping || {},
55
+ "presenceMapping"
56
+ );
57
+ if (process.env.NODE_ENV !== "production") {
58
+ validateNoDuplicateKeys(mapping, presenceMapping);
59
+ }
60
+ return (createStore) => {
61
+ return (reducer, initialState, enhancer2) => {
62
+ let room = null;
63
+ let isPatching = false;
64
+ let storageRoot = null;
65
+ let unsubscribeCallbacks = [];
66
+ const newReducer = (state, action) => {
67
+ switch (action.type) {
68
+ case ACTION_TYPES.PATCH_REDUX_STATE:
69
+ return {
70
+ ...state,
71
+ ...action.state
72
+ };
73
+ case ACTION_TYPES.INIT_STORAGE:
74
+ return {
75
+ ...state,
76
+ ...action.state,
77
+ liveblocks: {
78
+ ...state.liveblocks,
79
+ isStorageLoading: false
80
+ }
81
+ };
82
+ case ACTION_TYPES.START_LOADING_STORAGE:
83
+ return {
84
+ ...state,
85
+ liveblocks: {
86
+ ...state.liveblocks,
87
+ isStorageLoading: true
88
+ }
89
+ };
90
+ case ACTION_TYPES.UPDATE_CONNECTION: {
91
+ return {
92
+ ...state,
93
+ liveblocks: {
94
+ ...state.liveblocks,
95
+ connection: action.connection,
96
+ status: action.status
97
+ }
98
+ };
99
+ }
100
+ case ACTION_TYPES.UPDATE_OTHERS: {
101
+ return {
102
+ ...state,
103
+ liveblocks: {
104
+ ...state.liveblocks,
105
+ others: action.others
106
+ }
107
+ };
108
+ }
109
+ default: {
110
+ const newState = reducer(state, action);
111
+ if (room) {
112
+ isPatching = true;
113
+ updatePresence(room, state, newState, presenceMapping);
114
+ room.batch(() => {
115
+ if (storageRoot) {
116
+ patchLiveblocksStorage(
117
+ storageRoot,
118
+ state,
119
+ newState,
120
+ mapping
121
+ );
122
+ }
123
+ });
124
+ isPatching = false;
125
+ }
126
+ if (newState.liveblocks == null) {
127
+ return {
128
+ ...newState,
129
+ liveblocks: {
130
+ others: [],
131
+ isStorageLoading: false,
132
+ connection: "closed",
133
+ status: "initial"
134
+ }
135
+ };
136
+ }
137
+ return newState;
138
+ }
139
+ }
140
+ };
141
+ const store = createStore(newReducer, initialState, enhancer2);
142
+ function enterRoom2(roomId) {
143
+ if (storageRoot) {
144
+ return;
145
+ }
146
+ const initialPresence = selectFields(
147
+ store.getState(),
148
+ presenceMapping
149
+ );
150
+ room = client.enter(roomId, { initialPresence });
151
+ unsubscribeCallbacks.push(
152
+ room.events.connection.subscribe(() => {
153
+ store.dispatch({
154
+ type: ACTION_TYPES.UPDATE_CONNECTION,
155
+ connection: room.getConnectionState(),
156
+ status: room.getStatus()
157
+ });
158
+ })
159
+ );
160
+ unsubscribeCallbacks.push(
161
+ room.events.others.subscribe(({ others }) => {
162
+ store.dispatch({
163
+ type: ACTION_TYPES.UPDATE_OTHERS,
164
+ others
165
+ });
166
+ })
167
+ );
168
+ unsubscribeCallbacks.push(
169
+ room.events.me.subscribe(() => {
170
+ if (isPatching === false) {
171
+ store.dispatch({
172
+ type: ACTION_TYPES.PATCH_REDUX_STATE,
173
+ state: selectFields(room.getPresence(), presenceMapping)
174
+ });
175
+ }
176
+ })
177
+ );
178
+ store.dispatch({
179
+ type: ACTION_TYPES.START_LOADING_STORAGE
180
+ });
181
+ void room.getStorage().then(({ root }) => {
182
+ const updates = {};
183
+ room.batch(() => {
184
+ for (const key in mapping) {
185
+ const liveblocksStatePart = root.get(key);
186
+ if (liveblocksStatePart == null) {
187
+ updates[key] = store.getState()[key];
188
+ patchLiveObjectKey(root, key, void 0, store.getState()[key]);
189
+ } else {
190
+ updates[key] = lsonToJson(liveblocksStatePart);
191
+ }
192
+ }
193
+ });
194
+ store.dispatch({
195
+ type: ACTION_TYPES.INIT_STORAGE,
196
+ state: updates
197
+ });
198
+ storageRoot = root;
199
+ unsubscribeCallbacks.push(
200
+ room.subscribe(
201
+ root,
202
+ (updates2) => {
203
+ if (isPatching === false) {
204
+ store.dispatch({
205
+ type: ACTION_TYPES.PATCH_REDUX_STATE,
206
+ state: patchState(
207
+ store.getState(),
208
+ updates2,
209
+ mapping
210
+ )
211
+ });
212
+ }
213
+ },
214
+ { isDeep: true }
215
+ )
216
+ );
217
+ });
218
+ }
219
+ function leaveRoom2(roomId) {
220
+ for (const unsubscribe of unsubscribeCallbacks) {
221
+ unsubscribe();
222
+ }
223
+ storageRoot = null;
224
+ room = null;
225
+ isPatching = false;
226
+ unsubscribeCallbacks = [];
227
+ client.leave(roomId);
228
+ }
229
+ function newDispatch(action) {
230
+ if (action.type === ACTION_TYPES.ENTER) {
231
+ enterRoom2(action.roomId);
232
+ } else if (action.type === ACTION_TYPES.LEAVE) {
233
+ leaveRoom2(action.roomId);
234
+ } else {
235
+ store.dispatch(action);
236
+ }
237
+ }
238
+ return {
239
+ ...store,
240
+ dispatch: newDispatch
241
+ };
242
+ };
243
+ };
244
+ };
245
+ var actions = {
246
+ /**
247
+ * Enters a room and starts sync it with Redux state
248
+ * @param roomId The id of the room
249
+ */
250
+ enterRoom,
251
+ /**
252
+ * Leaves a room and stops sync it with Redux state.
253
+ * @param roomId The id of the room
254
+ */
255
+ leaveRoom
256
+ };
257
+ function enterRoom(roomId) {
258
+ return {
259
+ type: ACTION_TYPES.ENTER,
260
+ roomId
261
+ };
262
+ }
263
+ function leaveRoom(roomId) {
264
+ return {
265
+ type: ACTION_TYPES.LEAVE,
266
+ roomId
267
+ };
268
+ }
269
+ var liveblocksEnhancer = internalEnhancer;
270
+ var enhancer = liveblocksEnhancer;
271
+ function patchLiveblocksStorage(root, oldState, newState, mapping) {
272
+ for (const key in mapping) {
273
+ if (process.env.NODE_ENV !== "production" && typeof newState[key] === "function") {
274
+ throw mappingToFunctionIsNotAllowed("value");
275
+ }
276
+ if (oldState[key] !== newState[key]) {
277
+ const oldVal = oldState[key];
278
+ const newVal = newState[key];
279
+ patchLiveObjectKey(root, key, oldVal, newVal);
280
+ }
281
+ }
282
+ }
283
+ function updatePresence(room, oldState, newState, presenceMapping) {
284
+ for (const key in presenceMapping) {
285
+ if (typeof newState[key] === "function") {
286
+ throw mappingToFunctionIsNotAllowed("value");
287
+ }
288
+ if (oldState[key] !== newState[key]) {
289
+ room.updatePresence({ [key]: newState[key] });
290
+ }
291
+ }
292
+ }
293
+ function isObject(value) {
294
+ return Object.prototype.toString.call(value) === "[object Object]";
295
+ }
296
+ function validateNoDuplicateKeys(storageMapping, presenceMapping) {
297
+ for (const key in storageMapping) {
298
+ if (presenceMapping[key] !== void 0) {
299
+ throw mappingShouldNotHaveTheSameKeys(key);
300
+ }
301
+ }
302
+ }
303
+ function selectFields(presence, mapping) {
304
+ const partialState = {};
305
+ for (const key in mapping) {
306
+ partialState[key] = presence[key];
307
+ }
308
+ return partialState;
309
+ }
310
+ function patchState(state, updates, mapping) {
311
+ const partialState = {};
312
+ for (const key in mapping) {
313
+ partialState[key] = state[key];
314
+ }
315
+ const patched = legacy_patchImmutableObject(partialState, updates);
316
+ const result = {};
317
+ for (const key in mapping) {
318
+ result[key] = patched[key];
319
+ }
320
+ return result;
321
+ }
322
+ function validateMapping(mapping, mappingType) {
323
+ if (process.env.NODE_ENV !== "production") {
324
+ if (!isObject(mapping)) {
325
+ throw mappingShouldBeAnObject(mappingType);
326
+ }
327
+ }
328
+ const result = {};
329
+ for (const key in mapping) {
330
+ if (process.env.NODE_ENV !== "production" && typeof mapping[key] !== "boolean") {
331
+ throw mappingValueShouldBeABoolean(mappingType, key);
332
+ }
333
+ if (mapping[key] === true) {
334
+ result[key] = true;
335
+ }
336
+ }
337
+ return result;
338
+ }
339
+ export {
340
+ actions,
341
+ enhancer,
342
+ liveblocksEnhancer
343
+ };
344
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts"],"sourcesContent":["import type {\n BaseUserMeta,\n Client,\n Json,\n JsonObject,\n LiveObject,\n LsonObject,\n Room,\n Status,\n User,\n} from \"@liveblocks/client\";\nimport type { LegacyConnectionStatus } from \"@liveblocks/core\";\nimport {\n legacy_patchImmutableObject,\n lsonToJson,\n patchLiveObjectKey,\n} from \"@liveblocks/core\";\nimport type { StoreEnhancer } from \"redux\";\n\nimport {\n mappingShouldBeAnObject,\n mappingShouldNotHaveTheSameKeys,\n mappingToFunctionIsNotAllowed,\n mappingValueShouldBeABoolean,\n missingClient,\n} from \"./errors\";\n\nexport type Mapping<T> = {\n [K in keyof T]?: boolean;\n};\n\nconst ACTION_TYPES = {\n ENTER: \"@@LIVEBLOCKS/ENTER\",\n LEAVE: \"@@LIVEBLOCKS/LEAVE\",\n START_LOADING_STORAGE: \"@@LIVEBLOCKS/START_LOADING_STORAGE\",\n INIT_STORAGE: \"@@LIVEBLOCKS/INIT_STORAGE\",\n PATCH_REDUX_STATE: \"@@LIVEBLOCKS/PATCH_REDUX_STATE\",\n UPDATE_CONNECTION: \"@@LIVEBLOCKS/UPDATE_CONNECTION\",\n UPDATE_OTHERS: \"@@LIVEBLOCKS/UPDATE_OTHERS\",\n};\n\ntype LiveblocksContext<\n TPresence extends JsonObject,\n TUserMeta extends BaseUserMeta,\n> = {\n /**\n * Other users in the room. Empty no room is currently synced\n */\n readonly others: readonly User<TPresence, TUserMeta>[];\n /**\n * Whether or not the room storage is currently loading\n */\n readonly isStorageLoading: boolean;\n /**\n * Legacy connection status of the room.\n *\n * @deprecated This API will be removed in a future version of Liveblocks.\n * Prefer using the newer `.status` property.\n *\n * We recommend making the following changes if you use these APIs:\n *\n * OLD STATUSES NEW STATUSES\n * closed --> initial\n * authenticating --> connecting\n * connecting --> connecting\n * open --> connected\n * unavailable --> reconnecting\n * failed --> disconnected\n */\n readonly connection: LegacyConnectionStatus;\n /**\n * Connection status of the room.\n */\n readonly status: Status;\n};\n\n/**\n * @deprecated Please rename to WithLiveblocks<...>\n */\nexport type LiveblocksState<\n TState,\n TPresence extends JsonObject,\n TUserMeta extends BaseUserMeta,\n> = WithLiveblocks<TState, TPresence, TUserMeta>;\n\n/**\n * Adds the `liveblocks` property to your custom Redux state.\n */\nexport type WithLiveblocks<\n TState,\n TPresence extends JsonObject,\n TUserMeta extends BaseUserMeta,\n> = TState & { readonly liveblocks: LiveblocksContext<TPresence, TUserMeta> };\n\nconst internalEnhancer = <TState>(options: {\n client: Client;\n storageMapping?: Mapping<TState>;\n presenceMapping?: Mapping<TState>;\n}) => {\n type OpaqueRoom = Room<JsonObject, LsonObject, BaseUserMeta, Json>;\n\n if (process.env.NODE_ENV !== \"production\" && options.client == null) {\n throw missingClient();\n }\n const client = options.client;\n const mapping = validateMapping(\n options.storageMapping || {},\n \"storageMapping\"\n );\n const presenceMapping = validateMapping(\n options.presenceMapping || {},\n \"presenceMapping\"\n );\n if (process.env.NODE_ENV !== \"production\") {\n validateNoDuplicateKeys(mapping, presenceMapping);\n }\n\n return (createStore: any) => {\n return (reducer: any, initialState: any, enhancer: any) => {\n let room: OpaqueRoom | null = null;\n let isPatching: boolean = false;\n let storageRoot: LiveObject<LsonObject> | null = null;\n let unsubscribeCallbacks: Array<() => void> = [];\n\n const newReducer = (state: any, action: any) => {\n switch (action.type) {\n case ACTION_TYPES.PATCH_REDUX_STATE:\n return {\n ...state,\n ...action.state,\n };\n case ACTION_TYPES.INIT_STORAGE:\n return {\n ...state,\n ...action.state,\n liveblocks: {\n ...state.liveblocks,\n isStorageLoading: false,\n },\n };\n case ACTION_TYPES.START_LOADING_STORAGE:\n return {\n ...state,\n liveblocks: {\n ...state.liveblocks,\n isStorageLoading: true,\n },\n };\n case ACTION_TYPES.UPDATE_CONNECTION: {\n return {\n ...state,\n liveblocks: {\n ...state.liveblocks,\n connection: action.connection,\n status: action.status,\n },\n };\n }\n case ACTION_TYPES.UPDATE_OTHERS: {\n return {\n ...state,\n liveblocks: {\n ...state.liveblocks,\n others: action.others,\n },\n };\n }\n default: {\n const newState = reducer(state, action);\n\n if (room) {\n isPatching = true;\n updatePresence(room, state, newState, presenceMapping as any);\n\n room.batch(() => {\n if (storageRoot) {\n patchLiveblocksStorage(\n storageRoot,\n state,\n newState,\n mapping as any\n );\n }\n });\n isPatching = false;\n }\n\n if (newState.liveblocks == null) {\n return {\n ...newState,\n liveblocks: {\n others: [],\n isStorageLoading: false,\n connection: \"closed\",\n status: \"initial\",\n },\n };\n }\n return newState;\n }\n }\n };\n\n const store = createStore(newReducer, initialState, enhancer);\n\n function enterRoom(roomId: string) {\n if (storageRoot) {\n return;\n }\n\n const initialPresence = selectFields(\n store.getState(),\n presenceMapping\n ) as any;\n\n room = client.enter(roomId, { initialPresence });\n\n unsubscribeCallbacks.push(\n room.events.connection.subscribe(() => {\n store.dispatch({\n type: ACTION_TYPES.UPDATE_CONNECTION,\n connection: room!.getConnectionState(),\n status: room!.getStatus(),\n });\n })\n );\n\n unsubscribeCallbacks.push(\n room.events.others.subscribe(({ others }) => {\n store.dispatch({\n type: ACTION_TYPES.UPDATE_OTHERS,\n others,\n });\n })\n );\n\n unsubscribeCallbacks.push(\n room.events.me.subscribe(() => {\n if (isPatching === false) {\n store.dispatch({\n type: ACTION_TYPES.PATCH_REDUX_STATE,\n state: selectFields(room!.getPresence(), presenceMapping),\n });\n }\n })\n );\n\n store.dispatch({\n type: ACTION_TYPES.START_LOADING_STORAGE,\n });\n\n void room.getStorage().then(({ root }) => {\n const updates: any = {};\n\n room!.batch(() => {\n for (const key in mapping) {\n const liveblocksStatePart = root.get(key);\n\n if (liveblocksStatePart == null) {\n updates[key] = store.getState()[key];\n patchLiveObjectKey(root, key, undefined, store.getState()[key]);\n } else {\n updates[key] = lsonToJson(liveblocksStatePart);\n }\n }\n });\n\n store.dispatch({\n type: ACTION_TYPES.INIT_STORAGE,\n state: updates,\n });\n\n storageRoot = root;\n unsubscribeCallbacks.push(\n room!.subscribe(\n root,\n (updates) => {\n if (isPatching === false) {\n store.dispatch({\n type: ACTION_TYPES.PATCH_REDUX_STATE,\n state: patchState(\n store.getState(),\n updates,\n mapping as any\n ),\n });\n }\n },\n { isDeep: true }\n )\n );\n });\n }\n\n function leaveRoom(roomId: string) {\n for (const unsubscribe of unsubscribeCallbacks) {\n unsubscribe();\n }\n\n storageRoot = null;\n room = null;\n isPatching = false;\n unsubscribeCallbacks = [];\n\n client.leave(roomId);\n }\n\n function newDispatch(action: any) {\n if (action.type === ACTION_TYPES.ENTER) {\n enterRoom(action.roomId);\n } else if (action.type === ACTION_TYPES.LEAVE) {\n leaveRoom(action.roomId);\n } else {\n store.dispatch(action);\n }\n }\n\n return {\n ...store,\n dispatch: newDispatch,\n };\n };\n };\n};\n\n/**\n * Actions used to interact with Liveblocks\n */\nexport const actions = {\n /**\n * Enters a room and starts sync it with Redux state\n * @param roomId The id of the room\n */\n enterRoom,\n /**\n * Leaves a room and stops sync it with Redux state.\n * @param roomId The id of the room\n */\n leaveRoom,\n};\n\nfunction enterRoom(roomId: string): {\n type: string;\n roomId: string;\n} {\n return {\n type: ACTION_TYPES.ENTER,\n roomId,\n };\n}\n\nfunction leaveRoom(roomId: string): {\n type: string;\n roomId: string;\n} {\n return {\n type: ACTION_TYPES.LEAVE,\n roomId,\n };\n}\n\n/**\n * Redux store enhancer that will make the `liveblocks` key available on your\n * Redux store.\n */\nexport const liveblocksEnhancer = internalEnhancer as <TState>(options: {\n client: Client;\n storageMapping?: Mapping<TState>;\n presenceMapping?: Mapping<TState>;\n}) => StoreEnhancer;\n\n/**\n * @deprecated Renamed to `liveblocksEnhancer`.\n */\nexport const enhancer = liveblocksEnhancer;\n\nfunction patchLiveblocksStorage<O extends LsonObject, TState>(\n root: LiveObject<O>,\n oldState: TState,\n newState: TState,\n mapping: Mapping<TState>\n) {\n for (const key in mapping) {\n if (\n process.env.NODE_ENV !== \"production\" &&\n typeof newState[key] === \"function\"\n ) {\n throw mappingToFunctionIsNotAllowed(\"value\");\n }\n\n if (oldState[key] !== newState[key]) {\n const oldVal = oldState[key];\n const newVal = newState[key];\n patchLiveObjectKey(root, key, oldVal as any, newVal);\n }\n }\n}\n\nfunction updatePresence<TPresence extends JsonObject>(\n room: Room<TPresence, any, any, any>,\n oldState: TPresence,\n newState: TPresence,\n presenceMapping: Mapping<TPresence>\n) {\n for (const key in presenceMapping) {\n if (typeof newState[key] === \"function\") {\n throw mappingToFunctionIsNotAllowed(\"value\");\n }\n\n if (oldState[key] !== newState[key]) {\n room.updatePresence({ [key]: newState[key] } as TPresence);\n }\n }\n}\n\nfunction isObject(value: any): value is object {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n}\n\nfunction validateNoDuplicateKeys<TState>(\n storageMapping: Mapping<TState>,\n presenceMapping: Mapping<TState>\n) {\n for (const key in storageMapping) {\n if (presenceMapping[key] !== undefined) {\n throw mappingShouldNotHaveTheSameKeys(key);\n }\n }\n}\n\nfunction selectFields<TState>(\n presence: TState,\n mapping: Mapping<TState>\n): /* TODO: Actually, Pick<TState, keyof Mapping<TState>> ? */\nPartial<TState> {\n const partialState = {} as Partial<TState>;\n for (const key in mapping) {\n partialState[key] = presence[key];\n }\n return partialState;\n}\n\nfunction patchState<TState extends JsonObject>(\n state: TState,\n updates: any[], // StorageUpdate\n mapping: Mapping<TState>\n) {\n const partialState: Partial<TState> = {};\n\n for (const key in mapping) {\n partialState[key] = state[key];\n }\n\n const patched = legacy_patchImmutableObject(partialState, updates);\n\n const result: Partial<TState> = {};\n\n for (const key in mapping) {\n result[key] = patched[key];\n }\n\n return result;\n}\n\n/**\n * Remove false keys from mapping and generate to a new object to avoid potential mutation from outside the middleware\n */\nfunction validateMapping<TState>(\n mapping: Mapping<TState>,\n mappingType: \"storageMapping\" | \"presenceMapping\"\n): Mapping<TState> {\n if (process.env.NODE_ENV !== \"production\") {\n if (!isObject(mapping)) {\n throw mappingShouldBeAnObject(mappingType);\n }\n }\n\n const result: Mapping<TState> = {};\n for (const key in mapping) {\n if (\n process.env.NODE_ENV !== \"production\" &&\n typeof mapping[key] !== \"boolean\"\n ) {\n throw mappingValueShouldBeABoolean(mappingType, key);\n }\n\n if (mapping[key] === true) {\n result[key] = true;\n }\n }\n return result;\n}\n","export const ERROR_PREFIX = \"Invalid @liveblocks/redux middleware config.\";\n\nexport function missingClient(): Error {\n return new Error(`${ERROR_PREFIX} client is missing`);\n}\n\nexport function mappingShouldBeAnObject(\n mappingType: \"storageMapping\" | \"presenceMapping\"\n): Error {\n return new Error(\n `${ERROR_PREFIX} ${mappingType} should be an object where the values are boolean.`\n );\n}\n\nexport function mappingValueShouldBeABoolean(\n mappingType: \"storageMapping\" | \"presenceMapping\",\n key: string\n): Error {\n return new Error(\n `${ERROR_PREFIX} ${mappingType}.${key} value should be a boolean`\n );\n}\n\nexport function mappingShouldNotHaveTheSameKeys(key: string): Error {\n return new Error(\n `${ERROR_PREFIX} \"${key}\" is mapped on presenceMapping and storageMapping. A key shouldn't exist on both mapping.`\n );\n}\n\nexport function mappingToFunctionIsNotAllowed(key: string): Error {\n return new Error(\n `${ERROR_PREFIX} mapping.${key} is invalid. Mapping to a function is not allowed.`\n );\n}\n"],"mappings":"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","names":["enhancer","enterRoom","updates","leaveRoom"]}
package/package.json CHANGED
@@ -1,10 +1,23 @@
1
1
  {
2
2
  "name": "@liveblocks/redux",
3
- "version": "1.1.2",
3
+ "version": "1.1.4-internal1",
4
4
  "description": "A store enhancer to integrate Liveblocks into Redux stores. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.",
5
5
  "license": "Apache-2.0",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": {
11
+ "types": "./dist/index.d.mts",
12
+ "default": "./dist/index.mjs"
13
+ },
14
+ "require": {
15
+ "types": "./dist/index.d.ts",
16
+ "module": "./dist/index.mjs",
17
+ "default": "./dist/index.js"
18
+ }
19
+ }
20
+ },
8
21
  "files": [
9
22
  "dist/**",
10
23
  "README.md"
@@ -19,8 +32,8 @@
19
32
  "test:watch": "jest --silent --verbose --color=always --watch"
20
33
  },
21
34
  "dependencies": {
22
- "@liveblocks/client": "1.1.2",
23
- "@liveblocks/core": "1.1.2"
35
+ "@liveblocks/client": "1.1.4-internal1",
36
+ "@liveblocks/core": "1.1.4-internal1"
24
37
  },
25
38
  "peerDependencies": {
26
39
  "redux": "^4"