dinocollab-core 2.0.6 → 2.0.7

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.
@@ -1,2 +1,2 @@
1
- import{slicedToArray as r,toConsumableArray as t}from"../_virtual/_rollupPluginBabelHelpers.js";import{useMemo as i,useState as e,useRef as n,useEffect as o,useCallback as a}from"react";import{mfeBridge as u}from"./mfe-bridge.js";import{isBrowser as s}from"./environment.js";import{CART_CHANNELS as c}from"./cart.types.js";function l(a){var l=i((function(){return(null==a?void 0:a.storageKey)||"mfe_cart_items"}),[null==a?void 0:a.storageKey]),f=e([]),g=r(f,2),m=g[0],S=g[1],b=n(!1);return o((function(){if(s()){var r=localStorage.getItem(l);if(r)try{var i=JSON.parse(r);Array.isArray(i)&&(S(i),b.current=!0)}catch(r){console.error("Failed to parse cart from localStorage:",r)}var e=u.subscribe(c.ADD,(function(r){S((function(i){var e=[].concat(t(i),[r]);if(JSON.stringify(e)!==JSON.stringify(i)){if(s()){var n=localStorage.getItem(l);JSON.stringify(e)!==n&&localStorage.setItem(l,JSON.stringify(e))}return e}return i}))})),n=u.subscribe(c.REMOVE,(function(r){S((function(t){var i=t.filter((function(t){return t.ProductId!==r.id}));if(JSON.stringify(i)!==JSON.stringify(t)){if(s()){var e=localStorage.getItem(l);JSON.stringify(i)!==e&&localStorage.setItem(l,JSON.stringify(i))}return i}return t}))})),o=u.subscribe(c.CLEAR,(function(){S([]),s()&&localStorage.removeItem(l)})),a=u.subscribe(c.UPDATE,(function(r){S((function(t){if(JSON.stringify(r)!==JSON.stringify(t)){if(s()){var i=localStorage.getItem(l);JSON.stringify(r)!==i&&localStorage.setItem(l,JSON.stringify(r))}return r}return t}))})),f=u.subscribe(c.INIT_REQUEST,(function(){m.length>0&&u.publish(c.INIT_RESPONSE,m)})),g=u.subscribe(c.INIT_RESPONSE,(function(r){!b.current&&r&&r.length>0&&(S(r),s()&&localStorage.setItem(l,JSON.stringify(r)),b.current=!0)}));return b.current||u.publish(c.INIT_REQUEST,null),function(){e(),n(),o(),a(),f(),g()}}}),[]),{items:m,totalItems:m.length}}function f(){return{addToCart:a((function(r){u.publish(c.ADD,r)}),[]),removeFromCart:a((function(r){u.publish(c.REMOVE,{id:r})}),[]),clearCart:a((function(){u.publish(c.CLEAR,null)}),[]),updateCart:a((function(r){u.publish(c.UPDATE,r)}),[])}}export{f as useMfeCartActions,l as useMfeCartStore};
1
+ import{slicedToArray as r,toConsumableArray as t}from"../_virtual/_rollupPluginBabelHelpers.js";import{useMemo as n,useState as i,useRef as e,useEffect as o,useCallback as u}from"react";import{mfeBridge as a}from"./mfe-bridge.js";import{isBrowser as f}from"./environment.js";import{CART_CHANNELS as c}from"./cart.types.js";function s(u){var s=n((function(){return(null==u?void 0:u.storageKey)||"mfe_cart_items"}),[null==u?void 0:u.storageKey]),l=n((function(){return(null==u?void 0:u.idGetter)||function(r){return r.ProductId}}),[null==u?void 0:u.idGetter]),g=i([]),S=r(g,2),m=S[0],y=S[1],N=e(!1);return o((function(){if(f()){var r=localStorage.getItem(s);if(r)try{var n=JSON.parse(r);Array.isArray(n)&&(y(n),N.current=!0)}catch(r){console.error("Failed to parse cart from localStorage:",r)}var i=a.subscribe(c.ADD,(function(r){y((function(n){var i,e=l(r),o=n.findIndex((function(r){return l(r)===e}));if(o>=0?(i=t(n))[o]=r:i=[].concat(t(n),[r]),JSON.stringify(i)!==JSON.stringify(n)){if(f()){var u=localStorage.getItem(s);JSON.stringify(i)!==u&&localStorage.setItem(s,JSON.stringify(i))}return i}return n}))})),e=a.subscribe(c.REMOVE,(function(r){y((function(t){var n=t.filter((function(t){return l(t)!==r.id}));if(JSON.stringify(n)!==JSON.stringify(t)){if(f()){var i=localStorage.getItem(s);JSON.stringify(n)!==i&&localStorage.setItem(s,JSON.stringify(n))}return n}return t}))})),o=a.subscribe(c.CLEAR,(function(){y([]),f()&&localStorage.removeItem(s)})),u=a.subscribe(c.UPDATE,(function(r){y((function(t){if(JSON.stringify(r)!==JSON.stringify(t)){if(f()){var n=localStorage.getItem(s);JSON.stringify(r)!==n&&localStorage.setItem(s,JSON.stringify(r))}return r}return t}))})),g=a.subscribe(c.INIT_REQUEST,(function(){y((function(r){return r.length>0&&a.publish(c.INIT_RESPONSE,r),r}))})),S=a.subscribe(c.INIT_RESPONSE,(function(r){!N.current&&r&&r.length>0&&y((function(t){if(JSON.stringify(r)!==JSON.stringify(t)){if(f()){var n=localStorage.getItem(s);JSON.stringify(r)!==n&&localStorage.setItem(s,JSON.stringify(r))}return N.current=!0,r}return t}))}));return N.current||a.publish(c.INIT_REQUEST,null),function(){i(),e(),o(),u(),g(),S()}}}),[s,l]),{items:m,totalItems:m.length}}function l(){return{addToCart:u((function(r){a.publish(c.ADD,r)}),[]),removeFromCart:u((function(r){a.publish(c.REMOVE,{id:r})}),[]),clearCart:u((function(){a.publish(c.CLEAR,null)}),[]),updateCart:u((function(r){a.publish(c.UPDATE,r)}),[])}}export{l as useMfeCartActions,s as useMfeCartStore};
2
2
  //# sourceMappingURL=cart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cart.js","sources":["../../src/mfe-shared/cart.tsx"],"sourcesContent":["/**\r\n * cart.tsx - Shared shopping cart system for micro-frontends\r\n *\r\n * This module provides hooks for managing a shared shopping cart across\r\n * multiple micro-frontends. The cart state is synchronized using the\r\n * mfeBridge communication system and persisted in localStorage.\r\n */\r\n\r\nimport { useEffect, useState, useRef, useCallback, useMemo } from 'react'\r\nimport { mfeBridge } from './mfe-bridge'\r\nimport { isBrowser } from './environment'\r\nimport { ICartItem, CART_CHANNELS } from './cart.types'\r\n\r\n/** LocalStorage key for persisting cart items */\r\nconst CART_STORAGE_KEY = 'mfe_cart_items'\r\n\r\nexport interface IMfeCartStoreConfigs {\r\n storageKey: string\r\n}\r\n\r\n/**\r\n * Hook to manage cart state across microFE\r\n * This hook will:\r\n * - Initialize cart from localStorage\r\n * - Listen for cart events (add, remove, clear, update)\r\n * - Provide current cart state\r\n */\r\nexport function useMfeCartStore<O = any, T extends ICartItem<O> = ICartItem<O>>(configs?: IMfeCartStoreConfigs) {\r\n // Use provided storage key or default to CART_STORAGE_KEY\r\n const cartStorageKey = useMemo(() => configs?.storageKey || CART_STORAGE_KEY, [configs?.storageKey])\r\n\r\n // State to hold cart items\r\n const [items, setItems] = useState<T[]>([])\r\n\r\n // Mark as initialized\r\n const initialized = useRef(false)\r\n\r\n useEffect(() => {\r\n // Skip localStorage operations in non-browser environments\r\n if (!isBrowser()) {\r\n return\r\n }\r\n\r\n // Restore from localStorage if available\r\n const storedItems = localStorage.getItem(cartStorageKey)\r\n if (storedItems) {\r\n try {\r\n const parsedItems = JSON.parse(storedItems)\r\n if (Array.isArray(parsedItems)) {\r\n setItems(parsedItems)\r\n initialized.current = true\r\n }\r\n } catch (e) {\r\n console.error('Failed to parse cart from localStorage:', e)\r\n }\r\n }\r\n\r\n // Subscribe to cart events\r\n const unsubAdd = mfeBridge.subscribe(CART_CHANNELS.ADD, (payload: T) => {\r\n setItems((prev) => {\r\n const newItems = [...prev, payload]\r\n if (JSON.stringify(newItems) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(newItems) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(newItems))\r\n }\r\n }\r\n return newItems\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n const unsubRemove = mfeBridge.subscribe(CART_CHANNELS.REMOVE, (payload: { id: string }) => {\r\n setItems((prev) => {\r\n const newItems = prev.filter((item) => item.ProductId !== payload.id)\r\n if (JSON.stringify(newItems) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(newItems) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(newItems))\r\n }\r\n }\r\n return newItems\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n const unsubClear = mfeBridge.subscribe(CART_CHANNELS.CLEAR, () => {\r\n setItems([])\r\n if (isBrowser()) {\r\n localStorage.removeItem(cartStorageKey)\r\n }\r\n })\r\n\r\n const unsubUpdate = mfeBridge.subscribe(CART_CHANNELS.UPDATE, (payload: T[]) => {\r\n setItems((prev) => {\r\n if (JSON.stringify(payload) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(payload) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(payload))\r\n }\r\n }\r\n return payload\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n // Subscribe to init requests from other microFEs\r\n const unsubInitReq = mfeBridge.subscribe(CART_CHANNELS.INIT_REQUEST, () => {\r\n // If state is already available, return it to other microFEs\r\n if (items.length > 0) {\r\n mfeBridge.publish(CART_CHANNELS.INIT_RESPONSE, items)\r\n }\r\n })\r\n\r\n // Subscribe to init responses if state is not available\r\n const unsubInitRes = mfeBridge.subscribe(CART_CHANNELS.INIT_RESPONSE, (payload: T[]) => {\r\n if (!initialized.current && payload && payload.length > 0) {\r\n setItems(payload)\r\n if (isBrowser()) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(payload))\r\n }\r\n initialized.current = true\r\n }\r\n })\r\n\r\n // When mounted, send init request (only if no state from localStorage)\r\n if (!initialized.current) {\r\n mfeBridge.publish(CART_CHANNELS.INIT_REQUEST, null)\r\n }\r\n\r\n return () => {\r\n unsubAdd()\r\n unsubRemove()\r\n unsubClear()\r\n unsubUpdate()\r\n unsubInitReq()\r\n unsubInitRes()\r\n }\r\n }, [])\r\n\r\n return { items, totalItems: items.length }\r\n}\r\n\r\n/**\r\n * Hook to provide cart actions\r\n * This hook will:\r\n * - Only perform actions, not manage state\r\n * - Use mfeEventBridge to communicate with other microFEs\r\n * - Provide add, remove, clear, and update actions\r\n */\r\nexport function useMfeCartActions<O = any, T extends ICartItem<O> = ICartItem<O>>() {\r\n // Add item to cart\r\n const addToCart = useCallback((item: T) => {\r\n mfeBridge.publish(CART_CHANNELS.ADD, item)\r\n }, [])\r\n\r\n // Remove item from cart\r\n const removeFromCart = useCallback((productId: string) => {\r\n mfeBridge.publish(CART_CHANNELS.REMOVE, { id: productId })\r\n }, [])\r\n\r\n // Clear cart\r\n const clearCart = useCallback(() => {\r\n mfeBridge.publish(CART_CHANNELS.CLEAR, null)\r\n }, [])\r\n\r\n // Update entire cart\r\n const updateCart = useCallback((items: T[]) => {\r\n mfeBridge.publish(CART_CHANNELS.UPDATE, items)\r\n }, [])\r\n\r\n return {\r\n addToCart,\r\n removeFromCart,\r\n clearCart,\r\n updateCart\r\n }\r\n}\r\n"],"names":["useMfeCartStore","configs","cartStorageKey","useMemo","storageKey","_useState","useState","_useState2","_slicedToArray","items","setItems","initialized","useRef","useEffect","isBrowser","storedItems","localStorage","getItem","parsedItems","JSON","parse","Array","isArray","current","e","console","error","unsubAdd","mfeBridge","subscribe","CART_CHANNELS","ADD","payload","prev","newItems","concat","_toConsumableArray","stringify","setItem","unsubRemove","REMOVE","filter","item","ProductId","id","unsubClear","CLEAR","removeItem","unsubUpdate","UPDATE","unsubInitReq","INIT_REQUEST","length","publish","INIT_RESPONSE","unsubInitRes","totalItems","useMfeCartActions","addToCart","useCallback","removeFromCart","productId","clearCart","updateCart"],"mappings":"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"}
1
+ {"version":3,"file":"cart.js","sources":["../../src/mfe-shared/cart.tsx"],"sourcesContent":["/**\r\n * cart.tsx - Shared shopping cart system for micro-frontends\r\n *\r\n * This module provides hooks for managing a shared shopping cart across\r\n * multiple micro-frontends. The cart state is synchronized using the\r\n * mfeBridge communication system and persisted in localStorage.\r\n */\r\n\r\nimport { useEffect, useState, useRef, useCallback, useMemo } from 'react'\r\nimport { mfeBridge } from './mfe-bridge'\r\nimport { isBrowser } from './environment'\r\nimport { ICartItem, CART_CHANNELS } from './cart.types'\r\n\r\n/** LocalStorage key for persisting cart items */\r\nconst CART_STORAGE_KEY = 'mfe_cart_items'\r\n\r\nexport interface IMfeCartStoreConfigs<T = any> {\r\n storageKey: string\r\n idGetter?: (item: T) => string\r\n}\r\n\r\n/**\r\n * Hook to manage cart state across microFE\r\n * This hook will:\r\n * - Initialize cart from localStorage\r\n * - Listen for cart events (add, remove, clear, update)\r\n * - Provide current cart state\r\n */\r\nexport function useMfeCartStore<O = any, T extends ICartItem<O> = ICartItem<O>>(configs?: IMfeCartStoreConfigs<T>) {\r\n // Use provided storage key or default to CART_STORAGE_KEY\r\n const cartStorageKey = useMemo(() => configs?.storageKey || CART_STORAGE_KEY, [configs?.storageKey])\r\n\r\n // Default idGetter uses ProductId, but can be customized\r\n const getItemId = useMemo(() => configs?.idGetter || ((item: T) => item.ProductId), [configs?.idGetter])\r\n\r\n // State to hold cart items\r\n const [items, setItems] = useState<T[]>([])\r\n\r\n // Mark as initialized\r\n const initialized = useRef(false)\r\n\r\n useEffect(() => {\r\n // Skip localStorage operations in non-browser environments\r\n if (!isBrowser()) {\r\n return\r\n }\r\n\r\n // Restore from localStorage if available\r\n const storedItems = localStorage.getItem(cartStorageKey)\r\n if (storedItems) {\r\n try {\r\n const parsedItems = JSON.parse(storedItems)\r\n if (Array.isArray(parsedItems)) {\r\n setItems(parsedItems)\r\n initialized.current = true\r\n }\r\n } catch (e) {\r\n console.error('Failed to parse cart from localStorage:', e)\r\n }\r\n }\r\n\r\n // Subscribe to cart events\r\n const unsubAdd = mfeBridge.subscribe(CART_CHANNELS.ADD, (payload: T) => {\r\n setItems((prev) => {\r\n const itemId = getItemId(payload)\r\n const existingIndex = prev.findIndex((item) => getItemId(item) === itemId)\r\n\r\n let newItems: T[]\r\n if (existingIndex >= 0) {\r\n // Update existing item\r\n newItems = [...prev]\r\n newItems[existingIndex] = payload\r\n } else {\r\n // Add new item\r\n newItems = [...prev, payload]\r\n }\r\n\r\n if (JSON.stringify(newItems) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(newItems) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(newItems))\r\n }\r\n }\r\n return newItems\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n const unsubRemove = mfeBridge.subscribe(CART_CHANNELS.REMOVE, (payload: { id: string }) => {\r\n setItems((prev) => {\r\n const newItems = prev.filter((item) => getItemId(item) !== payload.id)\r\n if (JSON.stringify(newItems) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(newItems) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(newItems))\r\n }\r\n }\r\n return newItems\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n const unsubClear = mfeBridge.subscribe(CART_CHANNELS.CLEAR, () => {\r\n setItems([])\r\n if (isBrowser()) {\r\n localStorage.removeItem(cartStorageKey)\r\n }\r\n })\r\n\r\n const unsubUpdate = mfeBridge.subscribe(CART_CHANNELS.UPDATE, (payload: T[]) => {\r\n setItems((prev) => {\r\n if (JSON.stringify(payload) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(payload) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(payload))\r\n }\r\n }\r\n return payload\r\n }\r\n return prev\r\n })\r\n })\r\n\r\n // Subscribe to init requests from other microFEs\r\n const unsubInitReq = mfeBridge.subscribe(CART_CHANNELS.INIT_REQUEST, () => {\r\n // Use callback to get current state to avoid stale closure\r\n setItems((currentItems) => {\r\n if (currentItems.length > 0) {\r\n mfeBridge.publish(CART_CHANNELS.INIT_RESPONSE, currentItems)\r\n }\r\n return currentItems // No change to state\r\n })\r\n })\r\n\r\n // Subscribe to init responses if state is not available\r\n const unsubInitRes = mfeBridge.subscribe(CART_CHANNELS.INIT_RESPONSE, (payload: T[]) => {\r\n if (!initialized.current && payload && payload.length > 0) {\r\n setItems((prev) => {\r\n if (JSON.stringify(payload) !== JSON.stringify(prev)) {\r\n // Save to localStorage only if value changed\r\n if (isBrowser()) {\r\n const current = localStorage.getItem(cartStorageKey)\r\n if (JSON.stringify(payload) !== current) {\r\n localStorage.setItem(cartStorageKey, JSON.stringify(payload))\r\n }\r\n }\r\n initialized.current = true\r\n return payload\r\n }\r\n return prev\r\n })\r\n }\r\n })\r\n\r\n // When mounted, send init request (only if no state from localStorage)\r\n if (!initialized.current) {\r\n mfeBridge.publish(CART_CHANNELS.INIT_REQUEST, null)\r\n }\r\n\r\n return () => {\r\n unsubAdd()\r\n unsubRemove()\r\n unsubClear()\r\n unsubUpdate()\r\n unsubInitReq()\r\n unsubInitRes()\r\n }\r\n }, [cartStorageKey, getItemId])\r\n\r\n return { items, totalItems: items.length }\r\n}\r\n\r\n/**\r\n * Hook to provide cart actions\r\n * This hook will:\r\n * - Only perform actions, not manage state\r\n * - Use mfeEventBridge to communicate with other microFEs\r\n * - Provide add, remove, clear, and update actions\r\n */\r\nexport function useMfeCartActions<O = any, T extends ICartItem<O> = ICartItem<O>>() {\r\n // Add item to cart\r\n const addToCart = useCallback((item: T) => {\r\n mfeBridge.publish(CART_CHANNELS.ADD, item)\r\n }, [])\r\n\r\n // Remove item from cart\r\n const removeFromCart = useCallback((id: string) => {\r\n mfeBridge.publish(CART_CHANNELS.REMOVE, { id })\r\n }, [])\r\n\r\n // Clear cart\r\n const clearCart = useCallback(() => {\r\n mfeBridge.publish(CART_CHANNELS.CLEAR, null)\r\n }, [])\r\n\r\n // Update entire cart\r\n const updateCart = useCallback((items: T[]) => {\r\n mfeBridge.publish(CART_CHANNELS.UPDATE, items)\r\n }, [])\r\n\r\n return {\r\n addToCart,\r\n removeFromCart,\r\n clearCart,\r\n updateCart\r\n }\r\n}\r\n"],"names":["useMfeCartStore","configs","cartStorageKey","useMemo","storageKey","getItemId","idGetter","item","ProductId","_useState","useState","_useState2","_slicedToArray","items","setItems","initialized","useRef","useEffect","isBrowser","storedItems","localStorage","getItem","parsedItems","JSON","parse","Array","isArray","current","e","console","error","unsubAdd","mfeBridge","subscribe","CART_CHANNELS","ADD","payload","prev","newItems","itemId","existingIndex","findIndex","_toConsumableArray","concat","stringify","setItem","unsubRemove","REMOVE","filter","id","unsubClear","CLEAR","removeItem","unsubUpdate","UPDATE","unsubInitReq","INIT_REQUEST","currentItems","length","publish","INIT_RESPONSE","unsubInitRes","totalItems","useMfeCartActions","addToCart","useCallback","removeFromCart","clearCart","updateCart"],"mappings":"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"}
@@ -6,8 +6,9 @@
6
6
  * mfeBridge communication system and persisted in localStorage.
7
7
  */
8
8
  import { ICartItem } from './cart.types';
9
- export interface IMfeCartStoreConfigs {
9
+ export interface IMfeCartStoreConfigs<T = any> {
10
10
  storageKey: string;
11
+ idGetter?: (item: T) => string;
11
12
  }
12
13
  /**
13
14
  * Hook to manage cart state across microFE
@@ -16,7 +17,7 @@ export interface IMfeCartStoreConfigs {
16
17
  * - Listen for cart events (add, remove, clear, update)
17
18
  * - Provide current cart state
18
19
  */
19
- export declare function useMfeCartStore<O = any, T extends ICartItem<O> = ICartItem<O>>(configs?: IMfeCartStoreConfigs): {
20
+ export declare function useMfeCartStore<O = any, T extends ICartItem<O> = ICartItem<O>>(configs?: IMfeCartStoreConfigs<T>): {
20
21
  items: T[];
21
22
  totalItems: number;
22
23
  };
@@ -29,7 +30,7 @@ export declare function useMfeCartStore<O = any, T extends ICartItem<O> = ICartI
29
30
  */
30
31
  export declare function useMfeCartActions<O = any, T extends ICartItem<O> = ICartItem<O>>(): {
31
32
  addToCart: (item: T) => void;
32
- removeFromCart: (productId: string) => void;
33
+ removeFromCart: (id: string) => void;
33
34
  clearCart: () => void;
34
35
  updateCart: (items: T[]) => void;
35
36
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dinocollab-core",
3
- "version": "2.0.6",
3
+ "version": "2.0.7",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",